From e7de0c5901b85a5241386a33f98c27a4e08d5384 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 2 Sep 2023 17:51:19 +0200 Subject: [PATCH 001/357] gh-108765: Python.h no longer includes (#108775) Python.h no longer includes , and standard header files. * Add include to xxsubtype.c. * Add include to posixmodule.c and semaphore.c. * readline.c includes instead of . * resource.c no longer includes and . --- Doc/whatsnew/3.13.rst | 8 ++++++++ Include/pyport.h | 19 ------------------- ...-09-01-18-42-31.gh-issue-108765.IyYNDu.rst | 6 ++++++ Modules/_multiprocessing/semaphore.c | 4 ++++ Modules/posixmodule.c | 4 ++++ Modules/readline.c | 16 ++++++++-------- Modules/resource.c | 4 ---- Modules/signalmodule.c | 10 +++++----- Modules/timemodule.c | 2 +- Modules/xxsubtype.c | 2 ++ Python/pytime.c | 5 +++++ 11 files changed, 43 insertions(+), 37 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2023-09-01-18-42-31.gh-issue-108765.IyYNDu.rst diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index 401de11b34ec5f..1c91a1dadb899f 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -934,6 +934,14 @@ Porting to Python 3.13 functions: ``close()``, ``getpagesize()``, ``getpid()`` and ``sysconf()``. (Contributed by Victor Stinner in :gh:`108765`.) +* ``Python.h`` no longer includes these standard header files: ````, + ```` and ````. If needed, they should now be + included explicitly. For example, ```` provides the ``clock()`` and + ``gmtime()`` functions, ```` provides the ``select()`` + function, and ```` provides the ``futimes()``, ``gettimeofday()`` + and ``setitimer()`` functions. + (Contributed by Victor Stinner in :gh:`108765`.) + Deprecated ---------- diff --git a/Include/pyport.h b/Include/pyport.h index f2046de2bbcc5a..c4168d10f58151 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -184,25 +184,6 @@ typedef Py_ssize_t Py_ssize_clean_t; # define Py_MEMCPY memcpy #endif -/******************************************** - * WRAPPER FOR and/or * - ********************************************/ - -#ifdef HAVE_SYS_TIME_H -#include -#endif -#include - -/****************************** - * WRAPPER FOR * - ******************************/ - -/* NB caller must include */ - -#ifdef HAVE_SYS_SELECT_H -#include -#endif /* !HAVE_SYS_SELECT_H */ - /******************************* * stat() and fstat() fiddling * *******************************/ diff --git a/Misc/NEWS.d/next/C API/2023-09-01-18-42-31.gh-issue-108765.IyYNDu.rst b/Misc/NEWS.d/next/C API/2023-09-01-18-42-31.gh-issue-108765.IyYNDu.rst new file mode 100644 index 00000000000000..7b33481f225b5a --- /dev/null +++ b/Misc/NEWS.d/next/C API/2023-09-01-18-42-31.gh-issue-108765.IyYNDu.rst @@ -0,0 +1,6 @@ +``Python.h`` no longer includes these standard header files: ````, +```` and ````. If needed, they should now be included +explicitly. For example, ```` provides the ``clock()`` and ``gmtime()`` +functions, ```` provides the ``select()`` function, and +```` provides the ``futimes()``, ``gettimeofday()`` and +``setitimer()`` functions. Patch by Victor Stinner. diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c index d22b8d18e33e42..f8f2afda28d06d 100644 --- a/Modules/_multiprocessing/semaphore.c +++ b/Modules/_multiprocessing/semaphore.c @@ -9,6 +9,10 @@ #include "multiprocessing.h" +#ifdef HAVE_SYS_TIME_H +# include // gettimeofday() +#endif + #ifdef HAVE_MP_SEMAPHORE enum { RECURSIVE_MUTEX, SEMAPHORE }; diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 6e829b200fa46d..b4c502bef50ba9 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -57,6 +57,10 @@ #include // ctermid() #include // system() +#ifdef HAVE_SYS_TIME_H +# include // futimes() +#endif + // SGI apparently needs this forward declaration #ifdef HAVE__GETPTY diff --git a/Modules/readline.c b/Modules/readline.c index 2531b236b6ef17..aeae654162f13f 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -12,14 +12,13 @@ #include "Python.h" #include "pycore_pylifecycle.h" // _Py_SetLocaleFromEnv() -#include -#include -#include +#include // errno +#include // SIGWINCH #include // free() -#ifdef HAVE_SYS_TIME_H -#include +#include // strdup() +#ifdef HAVE_SYS_SELECT_H +# include // select() #endif -#include #if defined(HAVE_SETLOCALE) /* GNU readline() mistakenly sets the LC_CTYPE locale. @@ -27,7 +26,7 @@ * We must save and restore the locale around the rl_initialize() call. */ #define SAVE_LOCALE -#include +# include // setlocale() #endif #ifdef SAVE_LOCALE @@ -1333,7 +1332,8 @@ readline_until_enter_or_signal(const char *prompt, int *signal) int has_input = 0, err = 0; while (!has_input) - { struct timeval timeout = {0, 100000}; /* 0.1 seconds */ + { + struct timeval timeout = {0, 100000}; // 100 ms (0.1 seconds) /* [Bug #1552726] Only limit the pause if an input hook has been defined. */ diff --git a/Modules/resource.c b/Modules/resource.c index f5d9972d9a8ff7..9e302a3a1ed962 100644 --- a/Modules/resource.c +++ b/Modules/resource.c @@ -2,10 +2,6 @@ #include // errno #include #include // getrusage() -#ifdef HAVE_SYS_TIME_H -# include -#endif -#include #include // getpagesize() /* On some systems, these aren't in any header file. diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 3adb2e8dfe58d8..8d6556727b3a5a 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -16,10 +16,10 @@ #include "pycore_signal.h" // _Py_RestoreSignals() #ifndef MS_WINDOWS -# include "posixmodule.h" +# include "posixmodule.h" // _PyLong_FromUid() #endif #ifdef MS_WINDOWS -# include "socketmodule.h" /* needed for SOCKET_T */ +# include "socketmodule.h" // SOCKET_T #endif #ifdef MS_WINDOWS @@ -29,16 +29,16 @@ #endif #ifdef HAVE_SIGNAL_H -# include +# include // sigaction() #endif #ifdef HAVE_SYS_SYSCALL_H -# include +# include // __NR_pidfd_send_signal #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_SYS_TIME_H -# include +# include // setitimer() #endif #if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK) diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 68948b6be1a61a..4e55da71b117ca 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -7,7 +7,7 @@ #include "pycore_runtime.h" // _Py_ID() #include - +#include // clock() #ifdef HAVE_SYS_TIMES_H # include #endif diff --git a/Modules/xxsubtype.c b/Modules/xxsubtype.c index 63b22268c597b6..560f43e5b3a643 100644 --- a/Modules/xxsubtype.c +++ b/Modules/xxsubtype.c @@ -1,5 +1,7 @@ #include "Python.h" + #include // offsetof() +#include // clock() PyDoc_STRVAR(xxsubtype__doc__, diff --git a/Python/pytime.c b/Python/pytime.c index 49cd5f4e8ea617..d1e29e57d362f6 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -1,5 +1,10 @@ #include "Python.h" #include "pycore_time.h" // _PyTime_t + +#include // gmtime_r() +#ifdef HAVE_SYS_TIME_H +# include // gettimeofday() +#endif #ifdef MS_WINDOWS # include // struct timeval #endif From d4e534cbb35678c82b3a1276826af55d7bfc23b6 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 2 Sep 2023 18:09:36 +0200 Subject: [PATCH 002/357] regrtest computes statistics (#108793) test_netrc, test_pep646_syntax and test_xml_etree now return results in the test_main() function. Changes: * Rewrite TestResult as a dataclass with a new State class. * Add test.support.TestStats class and Regrtest.stats_dict attribute. * libregrtest.runtest functions now modify a TestResult instance in-place. * libregrtest summary lists the number of run tests and skipped tests, and denied resources. * Add TestResult.has_meaningful_duration() method. * Compute TestResult duration in the upper function. * Use time.perf_counter() instead of time.monotonic(). * Regrtest: rename 'resource_denieds' attribute to 'resource_denied'. * Rename CHILD_ERROR to MULTIPROCESSING_ERROR. * Use match/case syntadx to have different code depending on the test state. Co-authored-by: Alex Waygood --- Lib/test/libregrtest/main.py | 126 +++++++---- Lib/test/libregrtest/refleak.py | 5 +- Lib/test/libregrtest/runtest.py | 324 ++++++++++++++++------------- Lib/test/libregrtest/runtest_mp.py | 84 ++++---- Lib/test/libregrtest/save_env.py | 8 +- Lib/test/support/__init__.py | 61 ++++-- Lib/test/test_netrc.py | 2 +- Lib/test/test_pep646_syntax.py | 2 +- Lib/test/test_regrtest.py | 206 +++++++++++++----- Lib/test/test_xml_etree.py | 2 +- 10 files changed, 512 insertions(+), 308 deletions(-) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 3d290c849b43ed..6e6423e156781b 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -11,15 +11,14 @@ import unittest from test.libregrtest.cmdline import _parse_args from test.libregrtest.runtest import ( - findtests, split_test_packages, runtest, get_abs_module, is_failed, - PROGRESS_MIN_TIME, - Passed, Failed, EnvChanged, Skipped, ResourceDenied, Interrupted, - ChildError, DidNotRun) + findtests, split_test_packages, runtest, get_abs_module, + PROGRESS_MIN_TIME, State) from test.libregrtest.setup import setup_tests from test.libregrtest.pgo import setup_pgo_tests from test.libregrtest.utils import (removepy, count, format_duration, printlist, get_build_info) from test import support +from test.support import TestStats from test.support import os_helper from test.support import threading_helper @@ -78,13 +77,14 @@ def __init__(self): self.good = [] self.bad = [] self.skipped = [] - self.resource_denieds = [] + self.resource_denied = [] self.environment_changed = [] self.run_no_tests = [] self.need_rerun = [] self.rerun = [] self.first_result = None self.interrupted = False + self.stats_dict: dict[str, TestStats] = {} # used by --slow self.test_times = [] @@ -93,7 +93,7 @@ def __init__(self): self.tracer = None # used to display the progress bar "[ 3/100]" - self.start_time = time.monotonic() + self.start_time = time.perf_counter() self.test_count = '' self.test_count_width = 1 @@ -111,36 +111,41 @@ def __init__(self): def get_executed(self): return (set(self.good) | set(self.bad) | set(self.skipped) - | set(self.resource_denieds) | set(self.environment_changed) + | set(self.resource_denied) | set(self.environment_changed) | set(self.run_no_tests)) def accumulate_result(self, result, rerun=False): - test_name = result.name - - if not isinstance(result, (ChildError, Interrupted)) and not rerun: - self.test_times.append((result.duration_sec, test_name)) - - if isinstance(result, Passed): - self.good.append(test_name) - elif isinstance(result, ResourceDenied): - self.skipped.append(test_name) - self.resource_denieds.append(test_name) - elif isinstance(result, Skipped): - self.skipped.append(test_name) - elif isinstance(result, EnvChanged): - self.environment_changed.append(test_name) - elif isinstance(result, Failed): - if not rerun: - self.bad.append(test_name) - self.need_rerun.append(result) - elif isinstance(result, DidNotRun): - self.run_no_tests.append(test_name) - elif isinstance(result, Interrupted): - self.interrupted = True - else: - raise ValueError("invalid test result: %r" % result) + test_name = result.test_name + + if result.has_meaningful_duration() and not rerun: + self.test_times.append((result.duration, test_name)) - if rerun and not isinstance(result, (Failed, Interrupted)): + match result.state: + case State.PASSED: + self.good.append(test_name) + case State.ENV_CHANGED: + self.environment_changed.append(test_name) + case State.SKIPPED: + self.skipped.append(test_name) + case State.RESOURCE_DENIED: + self.skipped.append(test_name) + self.resource_denied.append(test_name) + case State.INTERRUPTED: + self.interrupted = True + case State.DID_NOT_RUN: + self.run_no_tests.append(test_name) + case _: + if result.is_failed(self.ns.fail_env_changed): + if not rerun: + self.bad.append(test_name) + self.need_rerun.append(result) + else: + raise ValueError(f"invalid test state: {state!r}") + + if result.stats is not None: + self.stats_dict[result.test_name] = result.stats + + if rerun and not(result.is_failed(False) or result.state == State.INTERRUPTED): self.bad.remove(test_name) xml_data = result.xml_data @@ -162,7 +167,7 @@ def log(self, line=''): line = f"load avg: {load_avg:.2f} {line}" # add the timestamp prefix: "0:01:05 " - test_time = time.monotonic() - self.start_time + test_time = time.perf_counter() - self.start_time mins, secs = divmod(int(test_time), 60) hours, mins = divmod(mins, 60) @@ -337,7 +342,7 @@ def rerun_failed_tests(self): rerun_list = list(self.need_rerun) self.need_rerun.clear() for result in rerun_list: - test_name = result.name + test_name = result.test_name self.rerun.append(test_name) errors = result.errors or [] @@ -364,7 +369,7 @@ def rerun_failed_tests(self): self.accumulate_result(result, rerun=True) - if isinstance(result, Interrupted): + if result.state == State.INTERRUPTED: break if self.bad: @@ -461,7 +466,7 @@ def run_tests_sequential(self): previous_test = None for test_index, test_name in enumerate(self.tests, 1): - start_time = time.monotonic() + start_time = time.perf_counter() text = test_name if previous_test: @@ -480,14 +485,14 @@ def run_tests_sequential(self): result = runtest(self.ns, test_name) self.accumulate_result(result) - if isinstance(result, Interrupted): + if result.state == State.INTERRUPTED: break previous_test = str(result) - test_time = time.monotonic() - start_time + test_time = time.perf_counter() - start_time if test_time >= PROGRESS_MIN_TIME: previous_test = "%s in %s" % (previous_test, format_duration(test_time)) - elif isinstance(result, Passed): + elif result.state == State.PASSED: # be quiet: say nothing if the test passed shortly previous_test = None @@ -496,7 +501,7 @@ 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): + if self.ns.failfast and result.is_failed(self.ns.fail_env_changed): break if previous_test: @@ -638,13 +643,48 @@ def finalize(self): coverdir=self.ns.coverdir) print() - duration = time.monotonic() - self.start_time - print("Total duration: %s" % format_duration(duration)) - print("Tests result: %s" % self.get_tests_result()) + self.display_summary() if self.ns.runleaks: os.system("leaks %d" % os.getpid()) + def display_summary(self): + duration = time.perf_counter() - self.start_time + + # Total duration + print("Total duration: %s" % format_duration(duration)) + + # Total tests + total = TestStats() + for stats in self.stats_dict.values(): + total.accumulate(stats) + stats = [f'run={total.tests_run:,}'] + if total.failures: + stats.append(f'failures={total.failures:,}') + if total.skipped: + stats.append(f'skipped={total.skipped:,}') + print(f"Total tests: {' '.join(stats)}") + + # Total test files + report = [f'success={len(self.good)}'] + if self.bad: + report.append(f'failed={len(self.bad)}') + if self.environment_changed: + report.append(f'env_changed={len(self.environment_changed)}') + if self.skipped: + report.append(f'skipped={len(self.skipped)}') + if self.resource_denied: + report.append(f'resource_denied={len(self.resource_denied)}') + if self.rerun: + report.append(f'rerun={len(self.rerun)}') + if self.run_no_tests: + report.append(f'run_no_tests={len(self.run_no_tests)}') + print(f"Total test files: {' '.join(report)}") + + # Result + result = self.get_tests_result() + print(f"Result: {result}") + def save_xml_result(self): if not self.ns.xmlpath and not self.testsuite_xml: return diff --git a/Lib/test/libregrtest/refleak.py b/Lib/test/libregrtest/refleak.py index cd11d385591f80..206802b60ddcd0 100644 --- a/Lib/test/libregrtest/refleak.py +++ b/Lib/test/libregrtest/refleak.py @@ -83,11 +83,12 @@ def get_pooled_int(value): print(("1234567890"*(repcount//10 + 1))[:repcount], file=sys.stderr, flush=True) + results = None dash_R_cleanup(fs, ps, pic, zdc, abcs) support.gc_collect() for i in rep_range: - test_func() + results = test_func() dash_R_cleanup(fs, ps, pic, zdc, abcs) support.gc_collect() @@ -151,7 +152,7 @@ def check_fd_deltas(deltas): print(msg, file=refrep) refrep.flush() failed = True - return failed + return (failed, results) def dash_R_cleanup(fs, ps, pic, zdc, abcs): diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index fd49927679bdea..6fa60697371b72 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -1,3 +1,5 @@ +import dataclasses +import doctest import faulthandler import functools import gc @@ -10,6 +12,7 @@ import unittest from test import support +from test.support import TestStats from test.support import os_helper from test.support import threading_helper from test.libregrtest.cmdline import Namespace @@ -17,108 +20,114 @@ from test.libregrtest.utils import clear_caches, format_duration, print_warning -class TestResult: - def __init__( - self, - name: str, - duration_sec: float = 0.0, - xml_data: list[str] | None = None, - ) -> None: - self.name = name - self.duration_sec = duration_sec - self.xml_data = xml_data - - def __str__(self) -> str: - return f"{self.name} finished" - +# Avoid enum.Enum to reduce the number of imports when tests are run +class State: + PASSED = "PASSED" + FAILED = "FAILED" + SKIPPED = "SKIPPED" + UNCAUGHT_EXC = "UNCAUGHT_EXC" + REFLEAK = "REFLEAK" + ENV_CHANGED = "ENV_CHANGED" + RESOURCE_DENIED = "RESOURCE_DENIED" + INTERRUPTED = "INTERRUPTED" + MULTIPROCESSING_ERROR = "MULTIPROCESSING_ERROR" + DID_NOT_RUN = "DID_NOT_RUN" + TIMEOUT = "TIMEOUT" -class Passed(TestResult): - def __str__(self) -> str: - return f"{self.name} passed" - - -class Failed(TestResult): - def __init__( - self, - name: str, - duration_sec: float = 0.0, - xml_data: list[str] | None = None, - errors: list[tuple[str, str]] | None = None, - failures: list[tuple[str, str]] | None = None, - ) -> None: - super().__init__(name, duration_sec=duration_sec, xml_data=xml_data) - self.errors = errors - self.failures = failures + @staticmethod + def is_failed(state): + return state in { + State.FAILED, + State.UNCAUGHT_EXC, + State.REFLEAK, + State.MULTIPROCESSING_ERROR, + State.TIMEOUT} - def __str__(self) -> str: + @staticmethod + def has_meaningful_duration(state): + # Consider that the duration is meaningless for these cases. + # For example, if a whole test file is skipped, its duration + # is unlikely to be the duration of executing its tests, + # but just the duration to execute code which skips the test. + return state not in { + State.SKIPPED, + State.RESOURCE_DENIED, + State.INTERRUPTED, + State.MULTIPROCESSING_ERROR, + State.DID_NOT_RUN} + + +@dataclasses.dataclass(slots=True) +class TestResult: + test_name: str + state: str | None = None + # Test duration in seconds + duration: float | None = None + xml_data: list[str] | None = None + stats: TestStats | None = None + + # errors and failures copied from support.TestFailedWithDetails + errors: list[tuple[str, str]] | None = None + failures: list[tuple[str, str]] | None = None + + def is_failed(self, fail_env_changed: bool) -> bool: + if self.state == State.ENV_CHANGED: + return fail_env_changed + return State.is_failed(self.state) + + def _format_failed(self): if self.errors and self.failures: le = len(self.errors) lf = len(self.failures) error_s = "error" + ("s" if le > 1 else "") failure_s = "failure" + ("s" if lf > 1 else "") - return f"{self.name} failed ({le} {error_s}, {lf} {failure_s})" + return f"{self.test_name} failed ({le} {error_s}, {lf} {failure_s})" if self.errors: le = len(self.errors) error_s = "error" + ("s" if le > 1 else "") - return f"{self.name} failed ({le} {error_s})" + return f"{self.test_name} failed ({le} {error_s})" if self.failures: lf = len(self.failures) failure_s = "failure" + ("s" if lf > 1 else "") - return f"{self.name} failed ({lf} {failure_s})" - - return f"{self.name} failed" + return f"{self.test_name} failed ({lf} {failure_s})" + return f"{self.test_name} failed" -class UncaughtException(Failed): def __str__(self) -> str: - return f"{self.name} failed (uncaught exception)" - - -class EnvChanged(Failed): - def __str__(self) -> str: - return f"{self.name} failed (env changed)" - - # Convert Passed to EnvChanged - @staticmethod - def from_passed(other): - return EnvChanged(other.name, other.duration_sec, other.xml_data) - - -class RefLeak(Failed): - def __str__(self) -> str: - return f"{self.name} failed (reference leak)" - - -class Skipped(TestResult): - def __str__(self) -> str: - return f"{self.name} skipped" - - -class ResourceDenied(Skipped): - def __str__(self) -> str: - return f"{self.name} skipped (resource denied)" - - -class Interrupted(TestResult): - def __str__(self) -> str: - return f"{self.name} interrupted" - - -class ChildError(Failed): - def __str__(self) -> str: - return f"{self.name} crashed" - - -class DidNotRun(TestResult): - def __str__(self) -> str: - return f"{self.name} ran no tests" - - -class Timeout(Failed): - def __str__(self) -> str: - return f"{self.name} timed out ({format_duration(self.duration_sec)})" + match self.state: + case State.PASSED: + return f"{self.test_name} passed" + case State.FAILED: + return self._format_failed() + case State.SKIPPED: + return f"{self.test_name} skipped" + case State.UNCAUGHT_EXC: + return f"{self.test_name} failed (uncaught exception)" + case State.REFLEAK: + return f"{self.test_name} failed (reference leak)" + case State.ENV_CHANGED: + return f"{self.test_name} failed (env changed)" + case State.RESOURCE_DENIED: + return f"{self.test_name} skipped (resource denied)" + case State.INTERRUPTED: + return f"{self.test_name} interrupted" + case State.MULTIPROCESSING_ERROR: + return f"{self.test_name} process crashed" + case State.DID_NOT_RUN: + return f"{self.test_name} ran no tests" + case State.TIMEOUT: + return f"{self.test_name} timed out ({format_duration(self.duration)})" + case _: + raise ValueError("unknown result state: {state!r}") + + def has_meaningful_duration(self): + return State.has_meaningful_duration(self.state) + + def set_env_changed(self): + if self.state is None or self.state == State.PASSED: + self.state = State.ENV_CHANGED # Minimum duration of a test to display its duration or to mention that @@ -142,12 +151,6 @@ def __str__(self) -> str: FOUND_GARBAGE = [] -def is_failed(result: TestResult, ns: Namespace) -> bool: - if isinstance(result, EnvChanged): - return ns.fail_env_changed - return isinstance(result, Failed) - - def findtestdir(path=None): return path or os.path.dirname(os.path.dirname(__file__)) or os.curdir @@ -194,9 +197,9 @@ def get_abs_module(ns: Namespace, test_name: str) -> str: return 'test.' + test_name -def _runtest(ns: Namespace, test_name: str) -> TestResult: - # Handle faulthandler timeout, capture stdout+stderr, XML serialization - # and measure time. +def _runtest_capture_output_timeout_junit(result: TestResult, ns: Namespace) -> None: + # Capture stdout and stderr, set faulthandler timeout, + # and create JUnit XML report. output_on_failure = ns.verbose3 @@ -206,7 +209,6 @@ def _runtest(ns: Namespace, test_name: str) -> TestResult: if use_timeout: faulthandler.dump_traceback_later(ns.timeout, exit=True) - start_time = time.perf_counter() try: support.set_match_tests(ns.match_tests, ns.ignore_tests) support.junit_xml_list = xml_list = [] if ns.xmlpath else None @@ -231,9 +233,9 @@ def _runtest(ns: Namespace, test_name: str) -> TestResult: # warnings will be written to sys.stderr below. print_warning.orig_stderr = stream - result = _runtest_inner(ns, test_name, - display_failure=False) - if not isinstance(result, Passed): + _runtest_env_changed_exc(result, ns, display_failure=False) + # Ignore output if the test passed successfully + if result.state != State.PASSED: output = stream.getvalue() finally: sys.stdout = orig_stdout @@ -247,18 +249,13 @@ def _runtest(ns: Namespace, test_name: str) -> TestResult: # Tell tests to be moderately quiet support.verbose = ns.verbose - result = _runtest_inner(ns, test_name, - display_failure=not ns.verbose) + _runtest_env_changed_exc(result, ns, + display_failure=not ns.verbose) if xml_list: import xml.etree.ElementTree as ET - result.xml_data = [ - ET.tostring(x).decode('us-ascii') - for x in xml_list - ] - - result.duration_sec = time.perf_counter() - start_time - return result + result.xml_data = [ET.tostring(x).decode('us-ascii') + for x in xml_list] finally: if use_timeout: faulthandler.cancel_dump_traceback_later() @@ -271,19 +268,23 @@ def runtest(ns: Namespace, test_name: str) -> TestResult: ns -- regrtest namespace of options test_name -- the name of the test - Returns a TestResult sub-class depending on the kind of result received. + Returns a TestResult. If ns.xmlpath is not None, xml_data is a list containing each generated testsuite element. """ + start_time = time.perf_counter() + result = TestResult(test_name) try: - return _runtest(ns, test_name) + _runtest_capture_output_timeout_junit(result, ns) except: if not ns.pgo: msg = traceback.format_exc() print(f"test {test_name} crashed -- {msg}", file=sys.stderr, flush=True) - return Failed(test_name) + result.state = State.UNCAUGHT_EXC + result.duration = time.perf_counter() - start_time + return result def _test_module(the_module): @@ -293,18 +294,48 @@ def _test_module(the_module): print(error, file=sys.stderr) if loader.errors: raise Exception("errors while loading tests") - support.run_unittest(tests) + return support.run_unittest(tests) def save_env(ns: Namespace, test_name: str): return saved_test_environment(test_name, ns.verbose, ns.quiet, pgo=ns.pgo) -def _runtest_inner2(ns: Namespace, test_name: str) -> bool: - # Load the test function, run the test function, handle huntrleaks - # to detect leaks. +def regrtest_runner(result, test_func, ns) -> None: + # Run test_func(), collect statistics, and detect reference and memory + # leaks. + + if ns.huntrleaks: + from test.libregrtest.refleak import dash_R + refleak, test_result = dash_R(ns, result.test_name, test_func) + else: + test_result = test_func() + refleak = False + + if refleak: + result.state = State.REFLEAK + + match test_result: + case TestStats(): + stats = test_result + case unittest.TestResult(): + stats = TestStats.from_unittest(test_result) + case doctest.TestResults(): + stats = TestStats.from_doctest(test_result) + case None: + print_warning(f"{result.test_name} test runner returned None: {test_func}") + stats = None + case _: + print_warning(f"Unknown test result type: {type(test_result)}") + stats = None + + result.stats = stats + - abstest = get_abs_module(ns, test_name) +def _load_run_test(result: TestResult, ns: Namespace) -> None: + # Load the test function, run the test function. + + abstest = get_abs_module(ns, result.test_name) # remove the module from sys.module to reload it if it was already imported try: @@ -314,23 +345,15 @@ def _runtest_inner2(ns: Namespace, test_name: str) -> bool: the_module = importlib.import_module(abstest) - if ns.huntrleaks: - from test.libregrtest.refleak import dash_R - # If the test has a test_main, that will run the appropriate # tests. If not, use normal unittest test loading. - test_runner = getattr(the_module, "test_main", None) - if test_runner is None: - test_runner = functools.partial(_test_module, the_module) + test_func = getattr(the_module, "test_main", None) + if test_func is None: + test_func = functools.partial(_test_module, the_module) try: - with save_env(ns, test_name): - if ns.huntrleaks: - # Return True if the test leaked references - refleak = dash_R(ns, test_name, test_runner) - else: - test_runner() - refleak = False + with save_env(ns, result.test_name): + regrtest_runner(result, test_func, ns) finally: # First kill any dangling references to open files etc. # This can also issue some ResourceWarnings which would otherwise get @@ -338,11 +361,11 @@ def _runtest_inner2(ns: Namespace, test_name: str) -> bool: # failures. support.gc_collect() - cleanup_test_droppings(test_name, ns.verbose) + cleanup_test_droppings(result.test_name, ns.verbose) if gc.garbage: support.environment_altered = True - print_warning(f"{test_name} created {len(gc.garbage)} " + print_warning(f"{result.test_name} created {len(gc.garbage)} " f"uncollectable object(s).") # move the uncollectable objects somewhere, @@ -352,12 +375,9 @@ def _runtest_inner2(ns: Namespace, test_name: str) -> bool: support.reap_children() - return refleak - -def _runtest_inner( - ns: Namespace, test_name: str, display_failure: bool = True -) -> TestResult: +def _runtest_env_changed_exc(result: TestResult, ns: Namespace, + display_failure: bool = True) -> None: # Detect environment changes, handle exceptions. # Reset the environment_altered flag to detect if a test altered @@ -367,49 +387,61 @@ def _runtest_inner( if ns.pgo: display_failure = False + test_name = result.test_name try: clear_caches() support.gc_collect() with save_env(ns, test_name): - refleak = _runtest_inner2(ns, test_name) + _load_run_test(result, ns) except support.ResourceDenied as msg: if not ns.quiet and not ns.pgo: print(f"{test_name} skipped -- {msg}", flush=True) - return ResourceDenied(test_name) + result.state = State.RESOURCE_DENIED + return except unittest.SkipTest as msg: if not ns.quiet and not ns.pgo: print(f"{test_name} skipped -- {msg}", flush=True) - return Skipped(test_name) + result.state = State.SKIPPED + return except support.TestFailedWithDetails as exc: msg = f"test {test_name} failed" if display_failure: msg = f"{msg} -- {exc}" print(msg, file=sys.stderr, flush=True) - return Failed(test_name, errors=exc.errors, failures=exc.failures) + result.state = State.FAILED + result.errors = exc.errors + result.failures = exc.failures + result.stats = exc.stats + return except support.TestFailed as exc: msg = f"test {test_name} failed" if display_failure: msg = f"{msg} -- {exc}" print(msg, file=sys.stderr, flush=True) - return Failed(test_name) + result.state = State.FAILED + result.stats = exc.stats + return except support.TestDidNotRun: - return DidNotRun(test_name) + result.state = State.DID_NOT_RUN + return except KeyboardInterrupt: print() - return Interrupted(test_name) + result.state = State.INTERRUPTED + return except: if not ns.pgo: msg = traceback.format_exc() print(f"test {test_name} crashed -- {msg}", file=sys.stderr, flush=True) - return UncaughtException(test_name) + result.state = State.UNCAUGHT_EXC + return - if refleak: - return RefLeak(test_name) if support.environment_altered: - return EnvChanged(test_name) - return Passed(test_name) + result.set_env_changed() + # Don't override the state if it was already set (REFLEAK or ENV_CHANGED) + if result.state is None: + result.state = State.PASSED def cleanup_test_droppings(test_name: str, verbose: int) -> None: diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index 62e6c6df36518c..fb1f80b0c054e3 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -1,3 +1,4 @@ +import dataclasses import faulthandler import json import os.path @@ -13,12 +14,13 @@ from test import support from test.support import os_helper +from test.support import TestStats from test.libregrtest.cmdline import Namespace from test.libregrtest.main import Regrtest from test.libregrtest.runtest import ( - runtest, is_failed, TestResult, Interrupted, Timeout, ChildError, - PROGRESS_MIN_TIME, Passed, EnvChanged) + runtest, TestResult, State, + PROGRESS_MIN_TIME) from test.libregrtest.setup import setup_tests from test.libregrtest.utils import format_duration, print_warning @@ -43,9 +45,9 @@ def must_stop(result: TestResult, ns: Namespace) -> bool: - if isinstance(result, Interrupted): + if result.state == State.INTERRUPTED: return True - if ns.failfast and is_failed(result, ns): + if ns.failfast and result.is_failed(ns.fail_env_changed): return True return False @@ -130,8 +132,8 @@ def stop(self): class MultiprocessResult(NamedTuple): result: TestResult # bpo-45410: stderr is written into stdout to keep messages order - stdout: str - error_msg: str + worker_stdout: str | None = None + err_msg: str | None = None ExcStr = str @@ -209,15 +211,12 @@ def stop(self) -> None: def mp_result_error( self, test_result: TestResult, - stdout: str = '', + stdout: str | None = None, err_msg=None ) -> MultiprocessResult: - test_result.duration_sec = time.monotonic() - self.start_time return MultiprocessResult(test_result, stdout, err_msg) def _run_process(self, test_name: str, tmp_dir: str, stdout_fh: TextIO) -> int: - self.start_time = time.monotonic() - self.current_test_name = test_name try: popen = run_test_in_subprocess(test_name, self.ns, tmp_dir, stdout_fh) @@ -306,38 +305,41 @@ def _runtest(self, test_name: str) -> MultiprocessResult: # gh-101634: Catch UnicodeDecodeError if stdout cannot be # decoded from encoding err_msg = f"Cannot read process stdout: {exc}" - return self.mp_result_error(ChildError(test_name), '', err_msg) + result = TestResult(test_name, state=State.MULTIPROCESSING_ERROR) + return self.mp_result_error(result, err_msg=err_msg) if retcode is None: - return self.mp_result_error(Timeout(test_name), stdout) + result = TestResult(test_name, state=State.TIMEOUT) + return self.mp_result_error(result, stdout) err_msg = None if retcode != 0: err_msg = "Exit code %s" % retcode else: - stdout, _, result = stdout.rpartition("\n") + stdout, _, worker_json = stdout.rpartition("\n") stdout = stdout.rstrip() - if not result: + if not worker_json: err_msg = "Failed to parse worker stdout" else: try: # deserialize run_tests_worker() output - result = json.loads(result, object_hook=decode_test_result) + result = json.loads(worker_json, + object_hook=decode_test_result) except Exception as exc: err_msg = "Failed to parse worker JSON: %s" % exc - if err_msg is not None: - return self.mp_result_error(ChildError(test_name), stdout, err_msg) + if err_msg: + result = TestResult(test_name, state=State.MULTIPROCESSING_ERROR) + return self.mp_result_error(result, stdout, err_msg) if tmp_files: msg = (f'\n\n' f'Warning -- {test_name} leaked temporary files ' f'({len(tmp_files)}): {", ".join(sorted(tmp_files))}') stdout += msg - if isinstance(result, Passed): - result = EnvChanged.from_passed(result) + result.set_env_changed() - return MultiprocessResult(result, stdout, err_msg) + return MultiprocessResult(result, stdout) def run(self) -> None: while not self._stopped: @@ -347,7 +349,9 @@ def run(self) -> None: except StopIteration: break + self.start_time = time.monotonic() mp_result = self._runtest(test_name) + mp_result.result.duration = time.monotonic() - self.start_time self.output.put((False, mp_result)) if must_stop(mp_result.result, self.ns): @@ -473,11 +477,11 @@ def display_result(self, mp_result: MultiprocessResult) -> None: result = mp_result.result text = str(result) - if mp_result.error_msg is not None: - # CHILD_ERROR - text += ' (%s)' % mp_result.error_msg - elif (result.duration_sec >= PROGRESS_MIN_TIME and not self.ns.pgo): - text += ' (%s)' % format_duration(result.duration_sec) + if mp_result.err_msg: + # MULTIPROCESSING_ERROR + text += ' (%s)' % mp_result.err_msg + elif (result.duration >= PROGRESS_MIN_TIME and not self.ns.pgo): + text += ' (%s)' % format_duration(result.duration) running = get_running(self.workers) if running and not self.ns.pgo: text += ' -- running: %s' % ', '.join(running) @@ -489,7 +493,7 @@ def _process_result(self, item: QueueOutput) -> bool: # Thread got an exception format_exc = item[1] print_warning(f"regrtest worker thread failed: {format_exc}") - result = ChildError("") + result = TestResult("", state=State.MULTIPROCESSING_ERROR) self.regrtest.accumulate_result(result) return True @@ -498,8 +502,8 @@ def _process_result(self, item: QueueOutput) -> bool: self.regrtest.accumulate_result(mp_result.result) self.display_result(mp_result) - if mp_result.stdout: - print(mp_result.stdout, flush=True) + if mp_result.worker_stdout: + print(mp_result.worker_stdout, flush=True) if must_stop(mp_result.result, self.ns): return True @@ -541,32 +545,20 @@ class EncodeTestResult(json.JSONEncoder): def default(self, o: Any) -> dict[str, Any]: if isinstance(o, TestResult): - result = vars(o) + result = dataclasses.asdict(o) result["__test_result__"] = o.__class__.__name__ return result return super().default(o) -def decode_test_result(d: dict[str, Any]) -> TestResult | dict[str, Any]: +def decode_test_result(d: dict[str, Any]) -> TestResult | TestStats | dict[str, Any]: """Decode a TestResult (sub)class object from a JSON dict.""" if "__test_result__" not in d: return d - cls_name = d.pop("__test_result__") - for cls in get_all_test_result_classes(): - if cls.__name__ == cls_name: - return cls(**d) - - -def get_all_test_result_classes() -> set[type[TestResult]]: - prev_count = 0 - classes = {TestResult} - while len(classes) > prev_count: - prev_count = len(classes) - to_add = [] - for cls in classes: - to_add.extend(cls.__subclasses__()) - classes.update(to_add) - return classes + d.pop('__test_result__') + if d['stats'] is not None: + d['stats'] = TestStats(**d['stats']) + return TestResult(**d) diff --git a/Lib/test/libregrtest/save_env.py b/Lib/test/libregrtest/save_env.py index c7801b767c590c..164fe9806b5f0d 100644 --- a/Lib/test/libregrtest/save_env.py +++ b/Lib/test/libregrtest/save_env.py @@ -23,7 +23,7 @@ class SkipTestEnvironment(Exception): class saved_test_environment: """Save bits of the test environment and restore them at block exit. - with saved_test_environment(testname, verbose, quiet): + with saved_test_environment(test_name, verbose, quiet): #stuff Unless quiet is True, a warning is printed to stderr if any of @@ -34,8 +34,8 @@ class saved_test_environment: items is also printed. """ - def __init__(self, testname, verbose=0, quiet=False, *, pgo=False): - self.testname = testname + def __init__(self, test_name, verbose=0, quiet=False, *, pgo=False): + self.test_name = test_name self.verbose = verbose self.quiet = quiet self.pgo = pgo @@ -323,7 +323,7 @@ def __exit__(self, exc_type, exc_val, exc_tb): restore(original) if not self.quiet and not self.pgo: print_warning( - f"{name} was modified by {self.testname}\n" + f"{name} was modified by {self.test_name}\n" f" Before: {original}\n" f" After: {current} ") return False diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 16a5056a33aa12..f28a3a2632c1c5 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -4,6 +4,7 @@ raise ImportError('support must be imported from the test package') import contextlib +import dataclasses import functools import getpass import _opcode @@ -118,17 +119,20 @@ class Error(Exception): class TestFailed(Error): """Test failed.""" + def __init__(self, msg, *args, stats=None): + self.msg = msg + self.stats = stats + super().__init__(msg, *args) + + def __str__(self): + return self.msg class TestFailedWithDetails(TestFailed): """Test failed.""" - def __init__(self, msg, errors, failures): - self.msg = msg + def __init__(self, msg, errors, failures, stats): self.errors = errors self.failures = failures - super().__init__(msg, errors, failures) - - def __str__(self): - return self.msg + super().__init__(msg, errors, failures, stats=stats) class TestDidNotRun(Error): """Test did not run any subtests.""" @@ -1105,6 +1109,30 @@ def _filter_suite(suite, pred): newtests.append(test) suite._tests = newtests +@dataclasses.dataclass(slots=True) +class TestStats: + tests_run: int = 0 + failures: int = 0 + skipped: int = 0 + + @staticmethod + def from_unittest(result): + return TestStats(result.testsRun, + len(result.failures), + len(result.skipped)) + + @staticmethod + def from_doctest(results): + return TestStats(results.attempted, + results.failed, + results.skipped) + + def accumulate(self, stats): + self.tests_run += stats.tests_run + self.failures += stats.failures + self.skipped += stats.skipped + + def _run_suite(suite): """Run tests from a unittest.TestSuite-derived class.""" runner = get_test_runner(sys.stdout, @@ -1119,6 +1147,7 @@ def _run_suite(suite): if not result.testsRun and not result.skipped and not result.errors: raise TestDidNotRun if not result.wasSuccessful(): + stats = TestStats.from_unittest(result) if len(result.errors) == 1 and not result.failures: err = result.errors[0][1] elif len(result.failures) == 1 and not result.errors: @@ -1128,7 +1157,8 @@ def _run_suite(suite): if not verbose: err += "; run in verbose mode for details" errors = [(str(tc), exc_str) for tc, exc_str in result.errors] failures = [(str(tc), exc_str) for tc, exc_str in result.failures] - raise TestFailedWithDetails(err, errors, failures) + raise TestFailedWithDetails(err, errors, failures, stats=stats) + return result # By default, don't filter tests @@ -1237,7 +1267,7 @@ def run_unittest(*classes): else: suite.addTest(loader.loadTestsFromTestCase(cls)) _filter_suite(suite, match_test) - _run_suite(suite) + return _run_suite(suite) #======================================================================= # Check for the presence of docstrings. @@ -1277,13 +1307,18 @@ def run_doctest(module, verbosity=None, optionflags=0): else: verbosity = None - f, t = doctest.testmod(module, verbose=verbosity, optionflags=optionflags) - if f: - raise TestFailed("%d of %d doctests failed" % (f, t)) + results = doctest.testmod(module, + verbose=verbosity, + optionflags=optionflags) + if results.failed: + stats = TestStats.from_doctest(results) + raise TestFailed(f"{results.failed} of {results.attempted} " + f"doctests failed", + stats=stats) if verbose: print('doctest (%s) ... %d tests with zero failures' % - (module.__name__, t)) - return f, t + (module.__name__, results.attempted)) + return results #======================================================================= diff --git a/Lib/test/test_netrc.py b/Lib/test/test_netrc.py index 573d636de956d1..b38cb327f68ecc 100644 --- a/Lib/test/test_netrc.py +++ b/Lib/test/test_netrc.py @@ -309,7 +309,7 @@ def test_security(self): ('anonymous', '', 'pass')) def test_main(): - run_unittest(NetrcTestCase) + return run_unittest(NetrcTestCase) if __name__ == "__main__": test_main() diff --git a/Lib/test/test_pep646_syntax.py b/Lib/test/test_pep646_syntax.py index 3ffa82dc55fa23..12a4227e4dc959 100644 --- a/Lib/test/test_pep646_syntax.py +++ b/Lib/test/test_pep646_syntax.py @@ -320,7 +320,7 @@ def test_main(verbose=False): from test import support from test import test_pep646_syntax - support.run_doctest(test_pep646_syntax, verbose) + return support.run_doctest(test_pep646_syntax, verbose) if __name__ == "__main__": test_main(verbose=True) diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 0c1400c8105037..1c02d802c0b061 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -19,7 +19,7 @@ import unittest from test import libregrtest from test import support -from test.support import os_helper +from test.support import os_helper, TestStats from test.libregrtest import utils, setup if not support.has_subprocess_support: @@ -409,7 +409,9 @@ def regex_search(self, regex, output): self.fail("%r not found in %r" % (regex, output)) return match - def check_line(self, output, regex): + def check_line(self, output, regex, full=False): + if full: + regex += '\n' regex = re.compile(r'^' + regex, re.MULTILINE) self.assertRegex(output, regex) @@ -421,21 +423,27 @@ def parse_executed_tests(self, output): def check_executed_tests(self, output, tests, skipped=(), failed=(), env_changed=(), omitted=(), - rerun={}, no_test_ran=(), + rerun={}, run_no_tests=(), + resource_denied=(), randomize=False, interrupted=False, - fail_env_changed=False): + fail_env_changed=False, + *, stats): if isinstance(tests, str): tests = [tests] if isinstance(skipped, str): skipped = [skipped] + if isinstance(resource_denied, str): + resource_denied = [resource_denied] if isinstance(failed, str): failed = [failed] if isinstance(env_changed, str): env_changed = [env_changed] if isinstance(omitted, str): omitted = [omitted] - if isinstance(no_test_ran, str): - no_test_ran = [no_test_ran] + if isinstance(run_no_tests, str): + run_no_tests = [run_no_tests] + if isinstance(stats, int): + stats = TestStats(stats) executed = self.parse_executed_tests(output) if randomize: @@ -479,12 +487,12 @@ def list_regex(line_format, tests): regex = LOG_PREFIX + f"Re-running {name} in verbose mode \\(matching: {match}\\)" self.check_line(output, regex) - if no_test_ran: - regex = list_regex('%s test%s run no tests', no_test_ran) + if run_no_tests: + regex = list_regex('%s test%s run no tests', run_no_tests) self.check_line(output, regex) good = (len(tests) - len(skipped) - len(failed) - - len(omitted) - len(env_changed) - len(no_test_ran)) + - len(omitted) - len(env_changed) - len(run_no_tests)) if good: regex = r'%s test%s OK\.$' % (good, plural(good)) if not skipped and not failed and good > 1: @@ -494,6 +502,33 @@ def list_regex(line_format, tests): if interrupted: self.check_line(output, 'Test suite interrupted by signal SIGINT.') + # Total tests + parts = [f'run={stats.tests_run:,}'] + if stats.failures: + parts.append(f'failures={stats.failures:,}') + if stats.skipped: + parts.append(f'skipped={stats.skipped:,}') + line = fr'Total tests: {" ".join(parts)}' + self.check_line(output, line, full=True) + + # Total test files + report = [f'success={good}'] + if failed: + report.append(f'failed={len(failed)}') + if env_changed: + report.append(f'env_changed={len(env_changed)}') + if skipped: + report.append(f'skipped={len(skipped)}') + if resource_denied: + report.append(f'resource_denied={len(resource_denied)}') + if rerun: + report.append(f'rerun={len(rerun)}') + if run_no_tests: + report.append(f'run_no_tests={len(run_no_tests)}') + line = fr'Total test files: {" ".join(report)}' + self.check_line(output, line, full=True) + + # Result result = [] if failed: result.append('FAILURE') @@ -508,10 +543,8 @@ def list_regex(line_format, tests): result.append('SUCCESS') result = ', '.join(result) if rerun: - self.check_line(output, 'Tests result: FAILURE') result = 'FAILURE then %s' % result - - self.check_line(output, 'Tests result: %s' % result) + self.check_line(output, f'Result: {result}', full=True) def parse_random_seed(self, output): match = self.regex_search(r'Using random seed ([0-9]+)', output) @@ -604,7 +637,8 @@ def setUp(self): def check_output(self, output): self.parse_random_seed(output) - self.check_executed_tests(output, self.tests, randomize=True) + self.check_executed_tests(output, self.tests, + randomize=True, stats=len(self.tests)) def run_tests(self, args): output = self.run_python(args) @@ -718,7 +752,8 @@ def test_failing(self): tests = [test_ok, test_failing] output = self.run_tests(*tests, exitcode=EXITCODE_BAD_TEST) - self.check_executed_tests(output, tests, failed=test_failing) + self.check_executed_tests(output, tests, failed=test_failing, + stats=TestStats(2, 1)) def test_resources(self): # test -u command line option @@ -737,17 +772,21 @@ def test_pass(self): # -u all: 2 resources enabled output = self.run_tests('-u', 'all', *test_names) - self.check_executed_tests(output, test_names) + self.check_executed_tests(output, test_names, stats=2) # -u audio: 1 resource enabled output = self.run_tests('-uaudio', *test_names) self.check_executed_tests(output, test_names, - skipped=tests['network']) + skipped=tests['network'], + resource_denied=tests['network'], + stats=1) # no option: 0 resources enabled output = self.run_tests(*test_names) self.check_executed_tests(output, test_names, - skipped=test_names) + skipped=test_names, + resource_denied=test_names, + stats=0) def test_random(self): # test -r and --randseed command line option @@ -795,7 +834,8 @@ def test_fromfile(self): previous = name output = self.run_tests('--fromfile', filename) - self.check_executed_tests(output, tests) + stats = len(tests) + self.check_executed_tests(output, tests, stats=stats) # test format '[2/7] test_opcodes' with open(filename, "w") as fp: @@ -803,7 +843,7 @@ def test_fromfile(self): print("[%s/%s] %s" % (index, len(tests), name), file=fp) output = self.run_tests('--fromfile', filename) - self.check_executed_tests(output, tests) + self.check_executed_tests(output, tests, stats=stats) # test format 'test_opcodes' with open(filename, "w") as fp: @@ -811,7 +851,7 @@ def test_fromfile(self): print(name, file=fp) output = self.run_tests('--fromfile', filename) - self.check_executed_tests(output, tests) + self.check_executed_tests(output, tests, stats=stats) # test format 'Lib/test/test_opcodes.py' with open(filename, "w") as fp: @@ -819,20 +859,20 @@ def test_fromfile(self): print('Lib/test/%s.py' % name, file=fp) output = self.run_tests('--fromfile', filename) - self.check_executed_tests(output, tests) + self.check_executed_tests(output, tests, stats=stats) def test_interrupted(self): code = TEST_INTERRUPTED test = self.create_test('sigint', code=code) output = self.run_tests(test, exitcode=EXITCODE_INTERRUPTED) self.check_executed_tests(output, test, omitted=test, - interrupted=True) + interrupted=True, stats=0) def test_slowest(self): # test --slowest tests = [self.create_test() for index in range(3)] output = self.run_tests("--slowest", *tests) - self.check_executed_tests(output, tests) + self.check_executed_tests(output, tests, stats=len(tests)) regex = ('10 slowest tests:\n' '(?:- %s: .*\n){%s}' % (self.TESTNAME_REGEX, len(tests))) @@ -851,7 +891,8 @@ def test_slowest_interrupted(self): args = ("--slowest", test) output = self.run_tests(*args, exitcode=EXITCODE_INTERRUPTED) self.check_executed_tests(output, test, - omitted=test, interrupted=True) + omitted=test, interrupted=True, + stats=0) regex = ('10 slowest tests:\n') self.check_line(output, regex) @@ -860,7 +901,7 @@ def test_coverage(self): # test --coverage test = self.create_test('coverage') output = self.run_tests("--coverage", test) - self.check_executed_tests(output, [test]) + self.check_executed_tests(output, [test], stats=1) regex = (r'lines +cov% +module +\(path\)\n' r'(?: *[0-9]+ *[0-9]{1,2}% *[^ ]+ +\([^)]+\)+)+') self.check_line(output, regex) @@ -890,7 +931,8 @@ def test_run(self): """) test = self.create_test('forever', code=code) output = self.run_tests('--forever', test, exitcode=EXITCODE_BAD_TEST) - self.check_executed_tests(output, [test]*3, failed=test) + self.check_executed_tests(output, [test]*3, failed=test, + stats=TestStats(1, 1)) def check_leak(self, code, what): test = self.create_test('huntrleaks', code=code) @@ -900,7 +942,7 @@ def check_leak(self, code, what): output = self.run_tests('--huntrleaks', '6:3:', test, exitcode=EXITCODE_BAD_TEST, stderr=subprocess.STDOUT) - self.check_executed_tests(output, [test], failed=test) + self.check_executed_tests(output, [test], failed=test, stats=1) line = 'beginning 9 repetitions\n123456789\n.........\n' self.check_line(output, re.escape(line)) @@ -982,7 +1024,7 @@ def test_crashed(self): tests = [crash_test] output = self.run_tests("-j2", *tests, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, tests, failed=crash_test, - randomize=True) + randomize=True, stats=0) def parse_methods(self, output): regex = re.compile("^(test[^ ]+).*ok$", flags=re.MULTILINE) @@ -1077,13 +1119,14 @@ def test_env_changed(self): # don't fail by default output = self.run_tests(testname) - self.check_executed_tests(output, [testname], env_changed=testname) + self.check_executed_tests(output, [testname], + env_changed=testname, stats=1) # fail with --fail-env-changed output = self.run_tests("--fail-env-changed", testname, exitcode=EXITCODE_ENV_CHANGED) self.check_executed_tests(output, [testname], env_changed=testname, - fail_env_changed=True) + fail_env_changed=True, stats=1) def test_rerun_fail(self): # FAILURE then FAILURE @@ -1102,7 +1145,9 @@ def test_fail_always(self): output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, [testname], - failed=testname, rerun={testname: "test_fail_always"}) + failed=testname, + rerun={testname: "test_fail_always"}, + stats=TestStats(1, 1)) def test_rerun_success(self): # FAILURE then SUCCESS @@ -1123,7 +1168,8 @@ def test_fail_once(self): output = self.run_tests("-w", testname, exitcode=0) self.check_executed_tests(output, [testname], - rerun={testname: "test_fail_once"}) + rerun={testname: "test_fail_once"}, + stats=1) def test_rerun_setup_class_hook_failure(self): # FAILURE then FAILURE @@ -1143,7 +1189,8 @@ def test_success(self): output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, testname, failed=[testname], - rerun={testname: "ExampleTests"}) + rerun={testname: "ExampleTests"}, + stats=0) def test_rerun_teardown_class_hook_failure(self): # FAILURE then FAILURE @@ -1163,7 +1210,8 @@ def test_success(self): output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, testname, failed=[testname], - rerun={testname: "ExampleTests"}) + rerun={testname: "ExampleTests"}, + stats=1) def test_rerun_setup_module_hook_failure(self): # FAILURE then FAILURE @@ -1182,7 +1230,8 @@ def test_success(self): output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, testname, failed=[testname], - rerun={testname: testname}) + rerun={testname: testname}, + stats=0) def test_rerun_teardown_module_hook_failure(self): # FAILURE then FAILURE @@ -1201,7 +1250,8 @@ def test_success(self): output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, testname, failed=[testname], - rerun={testname: testname}) + rerun={testname: testname}, + stats=1) def test_rerun_setup_hook_failure(self): # FAILURE then FAILURE @@ -1220,7 +1270,8 @@ def test_success(self): output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, testname, failed=[testname], - rerun={testname: "test_success"}) + rerun={testname: "test_success"}, + stats=1) def test_rerun_teardown_hook_failure(self): # FAILURE then FAILURE @@ -1239,7 +1290,8 @@ def test_success(self): output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, testname, failed=[testname], - rerun={testname: "test_success"}) + rerun={testname: "test_success"}, + stats=1) def test_rerun_async_setup_hook_failure(self): # FAILURE then FAILURE @@ -1258,7 +1310,8 @@ async def test_success(self): output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, testname, failed=[testname], - rerun={testname: "test_success"}) + rerun={testname: "test_success"}, + stats=1) def test_rerun_async_teardown_hook_failure(self): # FAILURE then FAILURE @@ -1277,7 +1330,8 @@ async def test_success(self): output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, testname, failed=[testname], - rerun={testname: "test_success"}) + rerun={testname: "test_success"}, + stats=1) def test_no_tests_ran(self): code = textwrap.dedent(""" @@ -1291,7 +1345,9 @@ def test_bug(self): output = self.run_tests(testname, "-m", "nosuchtest", exitcode=EXITCODE_NO_TESTS_RAN) - self.check_executed_tests(output, [testname], no_test_ran=testname) + self.check_executed_tests(output, [testname], + run_no_tests=testname, + stats=0) def test_no_tests_ran_skip(self): code = textwrap.dedent(""" @@ -1304,7 +1360,8 @@ def test_skipped(self): testname = self.create_test(code=code) output = self.run_tests(testname) - self.check_executed_tests(output, [testname]) + self.check_executed_tests(output, [testname], + stats=TestStats(1, skipped=1)) def test_no_tests_ran_multiple_tests_nonexistent(self): code = textwrap.dedent(""" @@ -1320,7 +1377,8 @@ def test_bug(self): output = self.run_tests(testname, testname2, "-m", "nosuchtest", exitcode=EXITCODE_NO_TESTS_RAN) self.check_executed_tests(output, [testname, testname2], - no_test_ran=[testname, testname2]) + run_no_tests=[testname, testname2], + stats=0) def test_no_test_ran_some_test_exist_some_not(self): code = textwrap.dedent(""" @@ -1343,7 +1401,8 @@ def test_other_bug(self): output = self.run_tests(testname, testname2, "-m", "nosuchtest", "-m", "test_other_bug", exitcode=0) self.check_executed_tests(output, [testname, testname2], - no_test_ran=[testname]) + run_no_tests=[testname], + stats=1) @support.cpython_only def test_uncollectable(self): @@ -1370,7 +1429,8 @@ def test_garbage(self): exitcode=EXITCODE_ENV_CHANGED) self.check_executed_tests(output, [testname], env_changed=[testname], - fail_env_changed=True) + fail_env_changed=True, + stats=1) def test_multiprocessing_timeout(self): code = textwrap.dedent(r""" @@ -1396,7 +1456,7 @@ def test_sleep(self): output = self.run_tests("-j2", "--timeout=1.0", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, [testname], - failed=testname) + failed=testname, stats=0) self.assertRegex(output, re.compile('%s timed out' % testname, re.MULTILINE)) @@ -1430,7 +1490,8 @@ def test_unraisable_exc(self): exitcode=EXITCODE_ENV_CHANGED) self.check_executed_tests(output, [testname], env_changed=[testname], - fail_env_changed=True) + fail_env_changed=True, + stats=1) self.assertIn("Warning -- Unraisable exception", output) self.assertIn("Exception: weakref callback bug", output) @@ -1462,7 +1523,8 @@ def test_threading_excepthook(self): exitcode=EXITCODE_ENV_CHANGED) self.check_executed_tests(output, [testname], env_changed=[testname], - fail_env_changed=True) + fail_env_changed=True, + stats=1) self.assertIn("Warning -- Uncaught thread exception", output) self.assertIn("Exception: bug in thread", output) @@ -1503,7 +1565,8 @@ def test_print_warning(self): output = self.run_tests(*cmd, exitcode=EXITCODE_ENV_CHANGED) self.check_executed_tests(output, [testname], env_changed=[testname], - fail_env_changed=True) + fail_env_changed=True, + stats=1) self.assertRegex(output, regex) def test_unicode_guard_env(self): @@ -1550,7 +1613,8 @@ def test_leak_tmp_file(self): self.check_executed_tests(output, testnames, env_changed=testnames, fail_env_changed=True, - randomize=True) + randomize=True, + stats=len(testnames)) for testname in testnames: self.assertIn(f"Warning -- {testname} leaked temporary " f"files (1): mytmpfile", @@ -1589,7 +1653,47 @@ def test_mp_decode_error(self): exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, [testname], failed=[testname], - randomize=True) + randomize=True, + stats=0) + + def test_doctest(self): + code = textwrap.dedent(fr''' + import doctest + import sys + from test import support + + def my_function(): + """ + Pass: + + >>> 1 + 1 + 2 + + Failure: + + >>> 2 + 3 + 23 + >>> 1 + 1 + 11 + + Skipped test (ignored): + + >>> id(1.0) # doctest: +SKIP + 7948648 + """ + + def test_main(): + testmod = sys.modules[__name__] + return support.run_doctest(testmod) + ''') + testname = self.create_test(code=code) + + output = self.run_tests("--fail-env-changed", "-v", "-j1", testname, + exitcode=EXITCODE_BAD_TEST) + self.check_executed_tests(output, [testname], + failed=[testname], + randomize=True, + stats=TestStats(4, 2, 1)) class TestUtils(unittest.TestCase): diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index b9352cb865d027..da2828c3b53af0 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -4250,7 +4250,7 @@ def test_main(module=None): old_factories = None try: - support.run_unittest(*test_classes) + return support.run_unittest(*test_classes) finally: from xml.etree import ElementPath # Restore mapping and path cache From f5ddbeeab7df58d42b870061df13de6364b47d13 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 2 Sep 2023 19:26:20 +0200 Subject: [PATCH 003/357] gh-108822: Add Changelog entry for regrtest statistics (#108821) --- .../next/Tests/2023-09-02-19-06-52.gh-issue-108822.arTbBI.rst | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-02-19-06-52.gh-issue-108822.arTbBI.rst diff --git a/Misc/NEWS.d/next/Tests/2023-09-02-19-06-52.gh-issue-108822.arTbBI.rst b/Misc/NEWS.d/next/Tests/2023-09-02-19-06-52.gh-issue-108822.arTbBI.rst new file mode 100644 index 00000000000000..e1c6df2adcb0ae --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-02-19-06-52.gh-issue-108822.arTbBI.rst @@ -0,0 +1,4 @@ +``regrtest`` now computes statistics on all tests: successes, failures and +skipped. ``test_netrc``, ``test_pep646_syntax`` and ``test_xml_etree`` now +return results in their ``test_main()`` function. Patch by Victor Stinner +and Alex Waygood. From bac1e6d695a11cff270e663197f3cecd001fa556 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 2 Sep 2023 19:54:39 +0200 Subject: [PATCH 004/357] gh-108765: multiprocessing.h includes (#108823) --- Modules/_multiprocessing/multiprocessing.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Modules/_multiprocessing/multiprocessing.h b/Modules/_multiprocessing/multiprocessing.h index 296e0abb29a0f5..099004b437828e 100644 --- a/Modules/_multiprocessing/multiprocessing.h +++ b/Modules/_multiprocessing/multiprocessing.h @@ -10,6 +10,10 @@ #include "pythread.h" #include "pycore_signal.h" // _PyOS_IsMainThread() +#ifndef MS_WINDOWS +# include // sysconf() +#endif + /* * Platform includes and definitions */ From 0e6d582b3b73a88e71cae04327b31a1ee203722c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 2 Sep 2023 19:54:59 +0200 Subject: [PATCH 005/357] gh-63760: Don't declare gethostname() on Solaris (#108817) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since 2005, Solaris defines gethostname(). socketmodule.c no longer has to define gethostname() for Solaris. Oracle Solaris and OpenSolaris have patches to remove the gethostname() definition in Python: * https://github.com/oracle/solaris-userland/blob/master/components/python/python37/patches/15-gethostname.patch * https://github.com/OpenIndiana/oi-userland/blob/oi/hipster/components/python/python37/patches/15-gethostname.patch * https://github.com/omniosorg/omnios-build/blob/master/build/python27/patches/24-gethostname.patch Co-authored-by: Jakub Kulík --- .../next/Build/2023-09-02-18-04-15.gh-issue-63760.r8hJ6q.rst | 3 +++ Modules/socketmodule.c | 5 ----- 2 files changed, 3 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2023-09-02-18-04-15.gh-issue-63760.r8hJ6q.rst diff --git a/Misc/NEWS.d/next/Build/2023-09-02-18-04-15.gh-issue-63760.r8hJ6q.rst b/Misc/NEWS.d/next/Build/2023-09-02-18-04-15.gh-issue-63760.r8hJ6q.rst new file mode 100644 index 00000000000000..9a7249e923e0c7 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2023-09-02-18-04-15.gh-issue-63760.r8hJ6q.rst @@ -0,0 +1,3 @@ +Fix Solaris build: no longer redefine the ``gethostname()`` function. Solaris +defines the function since 2005. Patch by Victor Stinner, original patch by +Jakub Kulík. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 74b1c1c661604f..90592ffc152fc1 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -111,11 +111,6 @@ Local naming conventions: #include "pycore_fileutils.h" // _Py_set_inheritable() #include "pycore_moduleobject.h" // _PyModule_GetState -// gethostname() prototype missing from Solaris standard header files -#ifdef __sun -extern int gethostname(char *, int); -#endif - #ifdef _Py_MEMORY_SANITIZER # include #endif From ecc61a6d76ea329e56f98c4af0f24a17ed3b2d6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Kul=C3=ADk?= Date: Sat, 2 Sep 2023 20:57:47 +0200 Subject: [PATCH 006/357] gh-108765: include in termios.c on Solaris (#108825) --- Modules/termios.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Modules/termios.c b/Modules/termios.c index a0613837ef9795..c779a757e4fa9b 100644 --- a/Modules/termios.c +++ b/Modules/termios.c @@ -27,6 +27,9 @@ #include #include +#if defined(__sun) && defined(__SVR4) +# include // ioctl() +#endif /* HP-UX requires that this be included to pick up MDCD, MCTS, MDSR, * MDTR, MRI, and MRTS (apparently used internally by some things From 6fafa6b919227cab06d0e3d7b20120e72d9b2bfd Mon Sep 17 00:00:00 2001 From: Sam Gross Date: Sat, 2 Sep 2023 21:13:00 +0000 Subject: [PATCH 007/357] gh-108374: Add --disable-gil option to PCbuild/build.bat (#108729) This adds a `--disable-gil` option to PCbuild/build.bat. For now, all this does is define the Py_NOGIL macro. --- PCbuild/build.bat | 3 +++ PCbuild/pyproject.props | 1 + 2 files changed, 4 insertions(+) diff --git a/PCbuild/build.bat b/PCbuild/build.bat index d333ceabd2e53a..e61267b5852a8f 100644 --- a/PCbuild/build.bat +++ b/PCbuild/build.bat @@ -33,6 +33,7 @@ echo. -k Attempt to kill any running Pythons before building (usually done echo. automatically by the pythoncore project) echo. --pgo Build with Profile-Guided Optimization. This flag echo. overrides -c and -d +echo. --disable-gil Enable experimental support for running without the GIL. echo. --test-marker Enable the test marker within the build. echo. --regen Regenerate all opcodes, grammar and tokens. echo. @@ -80,6 +81,7 @@ if "%~1"=="-q" (set verbose=/v:q /nologo /clp:summary) & shift & goto CheckOpts if "%~1"=="-k" (set kill=true) & shift & goto CheckOpts if "%~1"=="--pgo" (set do_pgo=true) & shift & goto CheckOpts if "%~1"=="--pgo-job" (set do_pgo=true) & (set pgo_job=%~2) & shift & shift & goto CheckOpts +if "%~1"=="--disable-gil" (set UseDisableGil=true) & shift & goto CheckOpts if "%~1"=="--test-marker" (set UseTestMarker=true) & shift & goto CheckOpts if "%~1"=="-V" shift & goto Version if "%~1"=="--regen" (set Regen=true) & shift & goto CheckOpts @@ -172,6 +174,7 @@ echo on /p:IncludeExternals=%IncludeExternals%^ /p:IncludeCTypes=%IncludeCTypes%^ /p:IncludeSSL=%IncludeSSL% /p:IncludeTkinter=%IncludeTkinter%^ + /p:DisableGil=%UseDisableGil%^ /p:UseTestMarker=%UseTestMarker% %GITProperty%^ %1 %2 %3 %4 %5 %6 %7 %8 %9 diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index fd928cafd77aaa..9db400eebae388 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -40,6 +40,7 @@ $(PySourcePath)Include;$(PySourcePath)Include\internal;$(PySourcePath)PC;$(IntDir);%(AdditionalIncludeDirectories) WIN32;$(_Py3NamePreprocessorDefinition);$(_PlatformPreprocessorDefinition)$(_DebugPreprocessorDefinition)$(_PydPreprocessorDefinition)%(PreprocessorDefinitions) + Py_NOGIL=1;%(PreprocessorDefinitions) MaxSpeed true From a52213bf830226fd969dc2a2ef8006c89edecc35 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 2 Sep 2023 23:15:54 +0200 Subject: [PATCH 008/357] gh-108765: pystrhex: Replace stdlib.h abs() with Py_ABS() (#108830) --- Python/pystrhex.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Python/pystrhex.c b/Python/pystrhex.c index ce456b79f1655f..38484f5a7d4227 100644 --- a/Python/pystrhex.c +++ b/Python/pystrhex.c @@ -3,7 +3,6 @@ #include "Python.h" #include "pycore_strhex.h" // _Py_strhex_with_sep() #include "pycore_unicodeobject.h" // _PyUnicode_CheckConsistency() -#include // abs() static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen, PyObject* sep, int bytes_per_sep_group, @@ -44,7 +43,7 @@ static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen, bytes_per_sep_group = 0; } - unsigned int abs_bytes_per_sep = abs(bytes_per_sep_group); + unsigned int abs_bytes_per_sep = Py_ABS(bytes_per_sep_group); Py_ssize_t resultlen = 0; if (bytes_per_sep_group && arglen > 0) { /* How many sep characters we'll be inserting. */ From f373c6b9483e12d7f6e03a631601149ed60ab883 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 2 Sep 2023 22:25:13 -0500 Subject: [PATCH 009/357] gh-107208: Fix iter_index() recipe to not swallow exceptions (gh-108835) gh-107208: iter_index now supports "stop" and no longer swallows ValueError --- Doc/library/itertools.rst | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index d0bb4696970198..42243715c2d93b 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -865,26 +865,22 @@ which incur interpreter overhead. # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x return next(filter(pred, iterable), default) - def iter_index(iterable, value, start=0): + def iter_index(iterable, value, start=0, stop=None): "Return indices where a value occurs in a sequence or iterable." # iter_index('AABCADEAF', 'A') --> 0 1 4 7 - try: - seq_index = iterable.index - except AttributeError: + seq_index = getattr(iterable, 'index', None) + if seq_index is None: # Slow path for general iterables - it = islice(iterable, start, None) - i = start - 1 - try: - while True: - yield (i := i + operator.indexOf(it, value) + 1) - except ValueError: - pass + it = islice(iterable, start, stop) + for i, element in enumerate(it, start): + if element is value or element == value: + yield i else: # Fast path for sequences i = start - 1 try: while True: - yield (i := seq_index(value, i+1)) + yield (i := seq_index(value, i+1, stop)) except ValueError: pass @@ -1331,6 +1327,21 @@ The following recipes have a more mathematical flavor: [] >>> list(iter_index(iter('AABCADEAF'), 'A', 10)) [] + >>> list(iter_index('AABCADEAF', 'A', 1, 7)) + [1, 4] + >>> list(iter_index(iter('AABCADEAF'), 'A', 1, 7)) + [1, 4] + >>> # Verify that ValueErrors not swallowed (gh-107208) + >>> def assert_no_value(iterable, forbidden_value): + ... for item in iterable: + ... if item == forbidden_value: + ... raise ValueError + ... yield item + ... + >>> list(iter_index(assert_no_value('AABCADEAF', 'B'), 'A')) + Traceback (most recent call last): + ... + ValueError >>> list(sieve(30)) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] From 9c995abd780f3740dcd23ad85b78f2df5b4cdbaf Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Sun, 3 Sep 2023 11:48:47 +0300 Subject: [PATCH 010/357] gh-102837: improve test coverage for math module (#102523) - input checks for math_1(L989), math_1a(L1023), math_2(L1064,L1071), hypot(L2682), log(L2307), ldexp(L2168), ceil(L1165), floor(L1236,L1239) and dist(L2587,L2588,L2628). - drop inaccessible "if" branch (L3518) in perm_comb_small() - improve fsum coverage for exceptional cases (L1433,L1438,L1451,L1497), ditto fmod(L2378) - rewrite modf to fix inaccessible case(L2229), ditto for pow(L2988) (all line numbers are wrt the main branch at 5e6661bce9) --- Lib/test/test_math.py | 41 +++++++++++++++++++++++++++++++++++++++++ Modules/mathmodule.c | 17 +++++++---------- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 2bda61012164d1..b71d08b1124497 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -235,6 +235,10 @@ def __init__(self, value): def __index__(self): return self.value +class BadDescr: + def __get__(self, obj, objtype=None): + raise ValueError + class MathTests(unittest.TestCase): def ftest(self, name, got, expected, ulp_tol=5, abs_tol=0.0): @@ -324,6 +328,7 @@ def testAtan2(self): self.ftest('atan2(0, 1)', math.atan2(0, 1), 0) self.ftest('atan2(1, 1)', math.atan2(1, 1), math.pi/4) self.ftest('atan2(1, 0)', math.atan2(1, 0), math.pi/2) + self.ftest('atan2(1, -1)', math.atan2(1, -1), 3*math.pi/4) # math.atan2(0, x) self.ftest('atan2(0., -inf)', math.atan2(0., NINF), math.pi) @@ -417,16 +422,22 @@ def __ceil__(self): return 42 class TestNoCeil: pass + class TestBadCeil: + __ceil__ = BadDescr() self.assertEqual(math.ceil(TestCeil()), 42) self.assertEqual(math.ceil(FloatCeil()), 42) self.assertEqual(math.ceil(FloatLike(42.5)), 43) self.assertRaises(TypeError, math.ceil, TestNoCeil()) + self.assertRaises(ValueError, math.ceil, TestBadCeil()) t = TestNoCeil() t.__ceil__ = lambda *args: args self.assertRaises(TypeError, math.ceil, t) self.assertRaises(TypeError, math.ceil, t, 0) + self.assertEqual(math.ceil(FloatLike(+1.0)), +1.0) + self.assertEqual(math.ceil(FloatLike(-1.0)), -1.0) + @requires_IEEE_754 def testCopysign(self): self.assertEqual(math.copysign(1, 42), 1.0) @@ -567,16 +578,22 @@ def __floor__(self): return 42 class TestNoFloor: pass + class TestBadFloor: + __floor__ = BadDescr() self.assertEqual(math.floor(TestFloor()), 42) self.assertEqual(math.floor(FloatFloor()), 42) self.assertEqual(math.floor(FloatLike(41.9)), 41) self.assertRaises(TypeError, math.floor, TestNoFloor()) + self.assertRaises(ValueError, math.floor, TestBadFloor()) t = TestNoFloor() t.__floor__ = lambda *args: args self.assertRaises(TypeError, math.floor, t) self.assertRaises(TypeError, math.floor, t, 0) + self.assertEqual(math.floor(FloatLike(+1.0)), +1.0) + self.assertEqual(math.floor(FloatLike(-1.0)), -1.0) + def testFmod(self): self.assertRaises(TypeError, math.fmod) self.ftest('fmod(10, 1)', math.fmod(10, 1), 0.0) @@ -598,6 +615,7 @@ def testFmod(self): self.assertEqual(math.fmod(-3.0, NINF), -3.0) self.assertEqual(math.fmod(0.0, 3.0), 0.0) self.assertEqual(math.fmod(0.0, NINF), 0.0) + self.assertRaises(ValueError, math.fmod, INF, INF) def testFrexp(self): self.assertRaises(TypeError, math.frexp) @@ -714,6 +732,11 @@ def msum(iterable): s = msum(vals) self.assertEqual(msum(vals), math.fsum(vals)) + self.assertEqual(math.fsum([1.0, math.inf]), math.inf) + self.assertRaises(OverflowError, math.fsum, [1e+308, 1e+308]) + self.assertRaises(ValueError, math.fsum, [math.inf, -math.inf]) + self.assertRaises(TypeError, math.fsum, ['spam']) + def testGcd(self): gcd = math.gcd self.assertEqual(gcd(0, 0), 0) @@ -831,6 +854,8 @@ def testHypot(self): scale = FLOAT_MIN / 2.0 ** exp self.assertEqual(math.hypot(4*scale, 3*scale), 5*scale) + self.assertRaises(TypeError, math.hypot, *([1.0]*18), 'spam') + @requires_IEEE_754 @unittest.skipIf(HAVE_DOUBLE_ROUNDING, "hypot() loses accuracy on machines with double rounding") @@ -966,6 +991,8 @@ class T(tuple): dist((1, 2, 3, 4), (5, 6, 7)) with self.assertRaises(ValueError): # Check dimension agree dist((1, 2, 3), (4, 5, 6, 7)) + with self.assertRaises(TypeError): + dist((1,)*17 + ("spam",), (1,)*18) with self.assertRaises(TypeError): # Rejects invalid types dist("abc", "xyz") int_too_big_for_float = 10 ** (sys.float_info.max_10_exp + 5) @@ -973,6 +1000,10 @@ class T(tuple): dist((1, int_too_big_for_float), (2, 3)) with self.assertRaises((ValueError, OverflowError)): dist((2, 3), (1, int_too_big_for_float)) + with self.assertRaises(TypeError): + dist((1,), 2) + with self.assertRaises(TypeError): + dist([1], 2) # Verify that the one dimensional case is equivalent to abs() for i in range(20): @@ -1111,6 +1142,7 @@ def test_lcm(self): def testLdexp(self): self.assertRaises(TypeError, math.ldexp) + self.assertRaises(TypeError, math.ldexp, 2.0, 1.1) self.ftest('ldexp(0,1)', math.ldexp(0,1), 0) self.ftest('ldexp(1,1)', math.ldexp(1,1), 2) self.ftest('ldexp(1,-1)', math.ldexp(1,-1), 0.5) @@ -1153,6 +1185,7 @@ def testLog(self): 2302.5850929940457) self.assertRaises(ValueError, math.log, -1.5) self.assertRaises(ValueError, math.log, -10**1000) + self.assertRaises(ValueError, math.log, 10, -10) self.assertRaises(ValueError, math.log, NINF) self.assertEqual(math.log(INF), INF) self.assertTrue(math.isnan(math.log(NAN))) @@ -2378,6 +2411,14 @@ def __float__(self): # argument to a float. self.assertFalse(getattr(y, "converted", False)) + def test_input_exceptions(self): + self.assertRaises(TypeError, math.exp, "spam") + self.assertRaises(TypeError, math.erf, "spam") + self.assertRaises(TypeError, math.atan2, "spam", 1.0) + self.assertRaises(TypeError, math.atan2, 1.0, "spam") + self.assertRaises(TypeError, math.atan2, 1.0) + self.assertRaises(TypeError, math.atan2, 1.0, 2.0, 3.0) + # Custom assertions. def assertIsNaN(self, value): diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index d929dcf65a7e32..2d896e7fe333a4 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2195,12 +2195,10 @@ math_modf_impl(PyObject *module, double x) double y; /* some platforms don't do the right thing for NaNs and infinities, so we take care of special cases directly. */ - if (!Py_IS_FINITE(x)) { - if (Py_IS_INFINITY(x)) - return Py_BuildValue("(dd)", copysign(0., x), x); - else if (Py_IS_NAN(x)) - return Py_BuildValue("(dd)", x, x); - } + if (Py_IS_INFINITY(x)) + return Py_BuildValue("(dd)", copysign(0., x), x); + else if (Py_IS_NAN(x)) + return Py_BuildValue("(dd)", x, x); errno = 0; x = modf(x, &y); @@ -2950,7 +2948,8 @@ math_pow_impl(PyObject *module, double x, double y) else /* y < 0. */ r = odd_y ? copysign(0., x) : 0.; } - else if (Py_IS_INFINITY(y)) { + else { + assert(Py_IS_INFINITY(y)); if (fabs(x) == 1.0) r = 1.; else if (y > 0. && fabs(x) > 1.0) @@ -3480,9 +3479,7 @@ static const uint8_t factorial_trailing_zeros[] = { static PyObject * perm_comb_small(unsigned long long n, unsigned long long k, int iscomb) { - if (k == 0) { - return PyLong_FromLong(1); - } + assert(k != 0); /* For small enough n and k the result fits in the 64-bit range and can * be calculated without allocating intermediate PyLong objects. */ From 509bb61977cc8a4487efd3f9cdd63d9f7b86be62 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 3 Sep 2023 15:21:43 +0300 Subject: [PATCH 011/357] Reorder some test's decorators (GH-108804) For example, do not demand the 'cpu' resource if the test cannot be run due to non-working threads. --- Lib/test/test_io.py | 4 ++-- Lib/test/test_site.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 26ae40d93c84eb..6976a64bf77e7d 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -1541,8 +1541,8 @@ def test_read_all(self): self.assertEqual(b"abcdefg", bufio.read()) - @support.requires_resource('cpu') @threading_helper.requires_working_threading() + @support.requires_resource('cpu') def test_threads(self): try: # Write out many bytes with exactly the same number of 0's, @@ -1930,8 +1930,8 @@ def test_truncate_after_write(self): f.truncate() self.assertEqual(f.tell(), buffer_size + 2) - @support.requires_resource('cpu') @threading_helper.requires_working_threading() + @support.requires_resource('cpu') def test_threads(self): try: # Write out many bytes from many threads and test they were diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 9e701fd847acdf..20a96169e8be4e 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -465,10 +465,10 @@ def test_sitecustomize_executed(self): else: self.fail("sitecustomize not imported automatically") - @test.support.requires_resource('network') - @test.support.system_must_validate_cert @unittest.skipUnless(hasattr(urllib.request, "HTTPSHandler"), 'need SSL support to download license') + @test.support.requires_resource('network') + @test.support.system_must_validate_cert def test_license_exists_at_url(self): # This test is a bit fragile since it depends on the format of the # string displayed by license in the absence of a LICENSE file. From 55846099b155833320bc6d64b03d902028bad439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D1=82=D0=B0=D0=BB=D0=B8=D0=B9=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B5=D0=B2?= Date: Sun, 3 Sep 2023 16:35:13 +0300 Subject: [PATCH 012/357] Fix duplicated words 'Be be' (GH-108815) --- Misc/NEWS.d/3.10.0a3.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/3.10.0a3.rst b/Misc/NEWS.d/3.10.0a3.rst index 755109cbd376f4..70d5ce1319c99f 100644 --- a/Misc/NEWS.d/3.10.0a3.rst +++ b/Misc/NEWS.d/3.10.0a3.rst @@ -153,7 +153,7 @@ Allow an unparenthesized walrus in subscript indexes. .. section: Core and Builtins Make sure that the compiler front-end produces a well-formed control flow -graph. Be be more aggressive in the compiler back-end, as it is now safe to +graph. Be more aggressive in the compiler back-end, as it is now safe to do so. .. From 1796c191b43ed0787d83c07be7de8118fb10e8b0 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 3 Sep 2023 17:28:14 +0300 Subject: [PATCH 013/357] gh-108494: Argument Clinic: inline parsing code for positional-only parameters in the limited C API (GH-108622) --- Modules/_io/clinic/bufferedio.c.h | 6 +- Modules/_io/clinic/bytesio.c.h | 3 +- Modules/_io/clinic/fileio.c.h | 3 +- Modules/_io/clinic/winconsoleio.c.h | 3 +- Modules/_multiprocessing/multiprocessing.c | 9 +- Modules/_posixsubprocess.c | 9 +- Modules/_struct.c | 12 +- Modules/clinic/_testclinic_limited.c.h | 22 +- Modules/overlapped.c | 16 +- Modules/resource.c | 9 +- PC/msvcrtmodule.c | 9 +- PC/winreg.c | 18 +- Tools/clinic/clinic.py | 743 ++++++++++++++------- 13 files changed, 555 insertions(+), 307 deletions(-) diff --git a/Modules/_io/clinic/bufferedio.c.h b/Modules/_io/clinic/bufferedio.c.h index b2c52cf2a95a44..7577bdec5c3b20 100644 --- a/Modules/_io/clinic/bufferedio.c.h +++ b/Modules/_io/clinic/bufferedio.c.h @@ -26,7 +26,6 @@ _io__BufferedIOBase_readinto(PyObject *self, PyObject *arg) Py_buffer buffer = {NULL, NULL}; if (PyObject_GetBuffer(arg, &buffer, PyBUF_WRITABLE) < 0) { - PyErr_Clear(); _PyArg_BadArgument("readinto", "argument", "read-write bytes-like object", arg); goto exit; } @@ -63,7 +62,6 @@ _io__BufferedIOBase_readinto1(PyObject *self, PyObject *arg) Py_buffer buffer = {NULL, NULL}; if (PyObject_GetBuffer(arg, &buffer, PyBUF_WRITABLE) < 0) { - PyErr_Clear(); _PyArg_BadArgument("readinto1", "argument", "read-write bytes-like object", arg); goto exit; } @@ -590,7 +588,6 @@ _io__Buffered_readinto(buffered *self, PyObject *arg) Py_buffer buffer = {NULL, NULL}; if (PyObject_GetBuffer(arg, &buffer, PyBUF_WRITABLE) < 0) { - PyErr_Clear(); _PyArg_BadArgument("readinto", "argument", "read-write bytes-like object", arg); goto exit; } @@ -627,7 +624,6 @@ _io__Buffered_readinto1(buffered *self, PyObject *arg) Py_buffer buffer = {NULL, NULL}; if (PyObject_GetBuffer(arg, &buffer, PyBUF_WRITABLE) < 0) { - PyErr_Clear(); _PyArg_BadArgument("readinto1", "argument", "read-write bytes-like object", arg); goto exit; } @@ -1098,4 +1094,4 @@ _io_BufferedRandom___init__(PyObject *self, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=9e09091995ae02b0 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=f940cea085f0bf91 input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/bytesio.c.h b/Modules/_io/clinic/bytesio.c.h index d7364779200827..d42ab48cef2859 100644 --- a/Modules/_io/clinic/bytesio.c.h +++ b/Modules/_io/clinic/bytesio.c.h @@ -328,7 +328,6 @@ _io_BytesIO_readinto(bytesio *self, PyObject *arg) Py_buffer buffer = {NULL, NULL}; if (PyObject_GetBuffer(arg, &buffer, PyBUF_WRITABLE) < 0) { - PyErr_Clear(); _PyArg_BadArgument("readinto", "argument", "read-write bytes-like object", arg); goto exit; } @@ -538,4 +537,4 @@ _io_BytesIO___init__(PyObject *self, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=8ab65edc03edbfe0 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b753fdf1ba36c461 input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/fileio.c.h b/Modules/_io/clinic/fileio.c.h index 29f8cf6aa9a85c..deb99fa9d99bd0 100644 --- a/Modules/_io/clinic/fileio.c.h +++ b/Modules/_io/clinic/fileio.c.h @@ -245,7 +245,6 @@ _io_FileIO_readinto(fileio *self, PyTypeObject *cls, PyObject *const *args, Py_s goto exit; } if (PyObject_GetBuffer(args[0], &buffer, PyBUF_WRITABLE) < 0) { - PyErr_Clear(); _PyArg_BadArgument("readinto", "argument 1", "read-write bytes-like object", args[0]); goto exit; } @@ -536,4 +535,4 @@ _io_FileIO_isatty(fileio *self, PyObject *Py_UNUSED(ignored)) #ifndef _IO_FILEIO_TRUNCATE_METHODDEF #define _IO_FILEIO_TRUNCATE_METHODDEF #endif /* !defined(_IO_FILEIO_TRUNCATE_METHODDEF) */ -/*[clinic end generated code: output=238dd48819076434 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2ce6ce923ccef86e input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/winconsoleio.c.h b/Modules/_io/clinic/winconsoleio.c.h index 0683eecdfebb37..ecc71e552c23f4 100644 --- a/Modules/_io/clinic/winconsoleio.c.h +++ b/Modules/_io/clinic/winconsoleio.c.h @@ -243,7 +243,6 @@ _io__WindowsConsoleIO_readinto(winconsoleio *self, PyTypeObject *cls, PyObject * goto exit; } if (PyObject_GetBuffer(args[0], &buffer, PyBUF_WRITABLE) < 0) { - PyErr_Clear(); _PyArg_BadArgument("readinto", "argument 1", "read-write bytes-like object", args[0]); goto exit; } @@ -465,4 +464,4 @@ _io__WindowsConsoleIO_isatty(winconsoleio *self, PyObject *Py_UNUSED(ignored)) #ifndef _IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF #define _IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF #endif /* !defined(_IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF) */ -/*[clinic end generated code: output=7be51d48ddb7c8c8 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=37febc4c96732b3b input=a9049054013a1b77]*/ diff --git a/Modules/_multiprocessing/multiprocessing.c b/Modules/_multiprocessing/multiprocessing.c index 16b5cb5dd9ec7a..2e6d8eb68c0243 100644 --- a/Modules/_multiprocessing/multiprocessing.c +++ b/Modules/_multiprocessing/multiprocessing.c @@ -14,16 +14,17 @@ class HANDLE_converter(CConverter): type = "HANDLE" format_unit = '"F_HANDLE"' - def parse_arg(self, argname, displayname): - return """ + def parse_arg(self, argname, displayname, *, limited_capi): + return self.format_code(""" {paramname} = PyLong_AsVoidPtr({argname}); if (!{paramname} && PyErr_Occurred()) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name) + """, + argname=argname) [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=3e537d244034affb]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=3cf0318efc6a8772]*/ /*[clinic input] module _multiprocessing diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index ef76d26282e1b3..2898eedc3e3a8f 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -87,15 +87,16 @@ class pid_t_converter(CConverter): type = 'pid_t' format_unit = '" _Py_PARSE_PID "' - def parse_arg(self, argname, displayname): - return """ + def parse_arg(self, argname, displayname, *, limited_capi): + return self.format_code(""" {paramname} = PyLong_AsPid({argname}); if ({paramname} == -1 && PyErr_Occurred()) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name) + """, + argname=argname) [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=5af1c116d56cbb5a]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=c94349aa1aad151d]*/ #include "clinic/_posixsubprocess.c.h" diff --git a/Modules/_struct.c b/Modules/_struct.c index 4ae21cce74f609..be4c23af384bb9 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -110,18 +110,20 @@ class cache_struct_converter(CConverter): c_default = "NULL" broken_limited_capi = True - def parse_arg(self, argname, displayname): - return """ + def parse_arg(self, argname, displayname, *, limited_capi): + assert not limited_capi + return self.format_code(""" if (!{converter}(module, {argname}, &{paramname})) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.name, - converter=self.converter) + """, + argname=argname, + converter=self.converter) def cleanup(self): return "Py_XDECREF(%s);\n" % self.name [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=14e83804f599ed8f]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=c33b27d6b06006c6]*/ static int cache_struct_converter(PyObject *, PyObject *, PyStructObject **); diff --git a/Modules/clinic/_testclinic_limited.c.h b/Modules/clinic/_testclinic_limited.c.h index 93e7d7f98769cc..eff72cee24975c 100644 --- a/Modules/clinic/_testclinic_limited.c.h +++ b/Modules/clinic/_testclinic_limited.c.h @@ -37,7 +37,8 @@ my_int_func(PyObject *module, PyObject *arg_) int arg; int _return_value; - if (!PyArg_Parse(arg_, "i:my_int_func", &arg)) { + arg = PyLong_AsInt(arg_); + if (arg == -1 && PyErr_Occurred()) { goto exit; } _return_value = my_int_func_impl(module, arg); @@ -56,22 +57,31 @@ PyDoc_STRVAR(my_int_sum__doc__, "\n"); #define MY_INT_SUM_METHODDEF \ - {"my_int_sum", (PyCFunction)my_int_sum, METH_VARARGS, my_int_sum__doc__}, + {"my_int_sum", (PyCFunction)(void(*)(void))my_int_sum, METH_FASTCALL, my_int_sum__doc__}, static int my_int_sum_impl(PyObject *module, int x, int y); static PyObject * -my_int_sum(PyObject *module, PyObject *args) +my_int_sum(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; int x; int y; int _return_value; - if (!PyArg_ParseTuple(args, "ii:my_int_sum", - &x, &y)) + if (nargs != 2) { + PyErr_Format(PyExc_TypeError, "my_int_sum expected 2 arguments, got %zd", nargs); goto exit; + } + x = PyLong_AsInt(args[0]); + if (x == -1 && PyErr_Occurred()) { + goto exit; + } + y = PyLong_AsInt(args[1]); + if (y == -1 && PyErr_Occurred()) { + goto exit; + } _return_value = my_int_sum_impl(module, x, y); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; @@ -81,4 +91,4 @@ my_int_sum(PyObject *module, PyObject *args) exit: return return_value; } -/*[clinic end generated code: output=dcd5203d0d29df3a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=5cf64baf978d2288 input=a9049054013a1b77]*/ diff --git a/Modules/overlapped.c b/Modules/overlapped.c index c682e6adccc765..e23db22dadb18b 100644 --- a/Modules/overlapped.c +++ b/Modules/overlapped.c @@ -38,13 +38,14 @@ class pointer_converter(CConverter): format_unit = '"F_POINTER"' - def parse_arg(self, argname, displayname): - return """ + def parse_arg(self, argname, displayname, *, limited_capi): + return self.format_code(""" {paramname} = PyLong_AsVoidPtr({argname}); if (!{paramname} && PyErr_Occurred()) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name) + """, + argname=argname) class OVERLAPPED_converter(pointer_converter): type = 'OVERLAPPED *' @@ -55,13 +56,14 @@ class HANDLE_converter(pointer_converter): class ULONG_PTR_converter(pointer_converter): type = 'ULONG_PTR' - def parse_arg(self, argname, displayname): - return """ + def parse_arg(self, argname, displayname, *, limited_capi): + return self.format_code(""" {paramname} = (uintptr_t)PyLong_AsVoidPtr({argname}); if (!{paramname} && PyErr_Occurred()) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name) + """, + argname=argname) class DWORD_converter(unsigned_long_converter): type = 'DWORD' @@ -69,7 +71,7 @@ class DWORD_converter(unsigned_long_converter): class BOOL_converter(int_converter): type = 'BOOL' [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=8a07ea3018f4cec8]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=436f4440630a304c]*/ /*[clinic input] module _overlapped diff --git a/Modules/resource.c b/Modules/resource.c index 9e302a3a1ed962..d65509ec3436a2 100644 --- a/Modules/resource.c +++ b/Modules/resource.c @@ -23,15 +23,16 @@ class pid_t_converter(CConverter): type = 'pid_t' format_unit = '" _Py_PARSE_PID "' - def parse_arg(self, argname, displayname): - return """ + def parse_arg(self, argname, displayname, *, limited_capi): + return self.format_code(""" {paramname} = PyLong_AsPid({argname}); if ({paramname} == -1 && PyErr_Occurred()) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name) + """, + argname=argname) [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=5af1c116d56cbb5a]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=c94349aa1aad151d]*/ #include "clinic/resource.c.h" diff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c index afc810adcf7499..d7c21766d709a6 100644 --- a/PC/msvcrtmodule.c +++ b/PC/msvcrtmodule.c @@ -38,13 +38,14 @@ class HANDLE_converter(CConverter): type = 'void *' format_unit = '"_Py_PARSE_UINTPTR"' - def parse_arg(self, argname, displayname): - return """ + def parse_arg(self, argname, displayname, *, limited_capi): + return self.format_code(""" {paramname} = PyLong_AsVoidPtr({argname}); if (!{paramname} && PyErr_Occurred()) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name) + """, + argname=argname) class HANDLE_return_converter(CReturnConverter): type = 'void *' @@ -74,7 +75,7 @@ class wchar_t_return_converter(CReturnConverter): data.return_conversion.append( 'return_value = PyUnicode_FromOrdinal(_return_value);\n') [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=1e8e9fa3538ec08f]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=ff031be44ab3250d]*/ /*[clinic input] module msvcrt diff --git a/PC/winreg.c b/PC/winreg.c index 767127d34cab1b..77b80217ac0ab1 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -222,13 +222,15 @@ class HKEY_converter(CConverter): converter = 'clinic_HKEY_converter' broken_limited_capi = True - def parse_arg(self, argname, displayname): - return """ - if (!{converter}(_PyModule_GetState(module), {argname}, &{paramname})) {{{{ - goto exit; - }}}} - """.format(argname=argname, paramname=self.parser_name, - converter=self.converter) + def parse_arg(self, argname, displayname, *, limited_capi): + assert not limited_capi + return self.format_code(""" + if (!{converter}(_PyModule_GetState(module), {argname}, &{paramname})) {{{{ + goto exit; + }}}} + """, + argname=argname, + converter=self.converter) class HKEY_return_converter(CReturnConverter): type = 'HKEY' @@ -250,7 +252,7 @@ class self_return_converter(CReturnConverter): data.return_conversion.append( 'return_value = (PyObject *)_return_value;\n') [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=f8cb7034338aeaba]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=4979f33998ffb6f8]*/ #include "clinic/winreg.c.h" diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index b744ca7e5c8145..eca4747a3e4d57 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -990,6 +990,7 @@ def deprecate_keyword_use( params: dict[int, Parameter], argname_fmt: str | None, *, + fastcall: bool, limited_capi: bool, clinic: Clinic, ) -> str: @@ -1003,26 +1004,30 @@ def deprecate_keyword_use( if p.is_optional(): if argname_fmt: conditions.append(f"nargs < {i+1} && {argname_fmt % i}") - elif func.kind.new_or_init or limited_capi: - conditions.append(f"nargs < {i+1} && PyDict_Contains(kwargs, &_Py_ID({p.name}))") - containscheck = "PyDict_Contains" - clinic.add_include('pycore_runtime.h', '_Py_ID()') - else: + elif fastcall: conditions.append(f"nargs < {i+1} && PySequence_Contains(kwnames, &_Py_ID({p.name}))") containscheck = "PySequence_Contains" clinic.add_include('pycore_runtime.h', '_Py_ID()') + else: + conditions.append(f"nargs < {i+1} && PyDict_Contains(kwargs, &_Py_ID({p.name}))") + containscheck = "PyDict_Contains" + clinic.add_include('pycore_runtime.h', '_Py_ID()') else: conditions = [f"nargs < {i+1}"] condition = ") || (".join(conditions) if len(conditions) > 1: condition = f"(({condition}))" if last_param.is_optional(): - if limited_capi: - condition = f"kwargs && PyDict_Size(kwargs) && {condition}" - elif func.kind.new_or_init: - condition = f"kwargs && PyDict_GET_SIZE(kwargs) && {condition}" + if fastcall: + if limited_capi: + condition = f"kwnames && PyTuple_Size(kwnames) && {condition}" + else: + condition = f"kwnames && PyTuple_GET_SIZE(kwnames) && {condition}" else: - condition = f"kwnames && PyTuple_GET_SIZE(kwnames) && {condition}" + if limited_capi: + condition = f"kwargs && PyDict_Size(kwargs) && {condition}" + else: + condition = f"kwargs && PyDict_GET_SIZE(kwargs) && {condition}" names = [repr(p.name) for p in params.values()] pstr = pprint_words(names) pl = 's' if len(params) != 1 else '' @@ -1193,6 +1198,7 @@ def parser_body( add(field) return linear_format(output(), parser_declarations=declarations) + fastcall = not new_or_init limited_capi = clinic.limited_capi if limited_capi and (requires_defining_class or pseudo_args or (any(p.is_optional() for p in parameters) and @@ -1210,7 +1216,7 @@ def parser_body( parser_prototype = self.PARSER_PROTOTYPE_NOARGS parser_code = [] else: - assert not new_or_init + assert fastcall flags = "METH_METHOD|METH_FASTCALL|METH_KEYWORDS" parser_prototype = self.PARSER_PROTOTYPE_DEF_CLASS @@ -1261,11 +1267,8 @@ def parser_body( {c_basename}({self_type}{self_name}, PyObject *%s) """ % argname) - if limited_capi: - parsearg = None - else: - displayname = parameters[0].get_displayname(0) - parsearg = converters[0].parse_arg(argname, displayname) + displayname = parameters[0].get_displayname(0) + parsearg = converters[0].parse_arg(argname, displayname, limited_capi=limited_capi) if parsearg is None: parsearg = """ if (!PyArg_Parse(%s, "{format_units}:{name}", {parse_arguments})) {{ @@ -1284,27 +1287,8 @@ def parser_body( parser_prototype = self.PARSER_PROTOTYPE_VARARGS parser_definition = parser_body(parser_prototype, ' {option_group_parsing}') - elif (not requires_defining_class and pos_only == len(parameters) and - not pseudo_args and limited_capi): - # positional-only for the limited C API - flags = "METH_VARARGS" - parser_prototype = self.PARSER_PROTOTYPE_VARARGS - if all(isinstance(c, object_converter) and c.format_unit == 'O' for c in converters): - parser_code = [normalize_snippet(""" - if (!PyArg_UnpackTuple(args, "{name}", %d, %d, - {parse_arguments})) - goto exit; - """ % (min_pos, max_pos), indent=4)] - else: - parser_code = [normalize_snippet(""" - if (!PyArg_ParseTuple(args, "{format_units}:{name}", - {parse_arguments})) - goto exit; - """, indent=4)] - parser_definition = parser_body(parser_prototype, *parser_code) - elif not requires_defining_class and pos_only == len(parameters) - pseudo_args: - if not new_or_init: + if fastcall: # positional-only, but no option groups # we only need one call to _PyArg_ParseStack @@ -1318,24 +1302,59 @@ def parser_body( flags = "METH_VARARGS" parser_prototype = self.PARSER_PROTOTYPE_VARARGS - nargs = 'PyTuple_GET_SIZE(args)' - argname_fmt = 'PyTuple_GET_ITEM(args, %d)' + if limited_capi: + nargs = 'PyTuple_Size(args)' + argname_fmt = 'PyTuple_GetItem(args, %d)' + else: + nargs = 'PyTuple_GET_SIZE(args)' + argname_fmt = 'PyTuple_GET_ITEM(args, %d)' left_args = f"{nargs} - {max_pos}" max_args = NO_VARARG if (vararg != NO_VARARG) else max_pos - parser_code = [normalize_snippet(""" - if (!_PyArg_CheckPositional("{name}", %s, %d, %s)) {{ - goto exit; - }} - """ % (nargs, min_pos, max_args), indent=4)] + if limited_capi: + parser_code = [] + if nargs != 'nargs': + parser_code.append(normalize_snippet(f'Py_ssize_t nargs = {nargs};', indent=4)) + nargs = 'nargs' + if min_pos == max_args: + pl = '' if min_pos == 1 else 's' + parser_code.append(normalize_snippet(f""" + if ({nargs} != {min_pos}) {{{{ + PyErr_Format(PyExc_TypeError, "{{name}} expected {min_pos} argument{pl}, got %zd", {nargs}); + goto exit; + }}}} + """, + indent=4)) + else: + if min_pos: + pl = '' if min_pos == 1 else 's' + parser_code.append(normalize_snippet(f""" + if ({nargs} < {min_pos}) {{{{ + PyErr_Format(PyExc_TypeError, "{{name}} expected at least {min_pos} argument{pl}, got %zd", {nargs}); + goto exit; + }}}} + """, + indent=4)) + if max_args != NO_VARARG: + pl = '' if max_args == 1 else 's' + parser_code.append(normalize_snippet(f""" + if ({nargs} > {max_args}) {{{{ + PyErr_Format(PyExc_TypeError, "{{name}} expected at most {max_args} argument{pl}, got %zd", {nargs}); + goto exit; + }}}} + """, + indent=4)) + else: + parser_code = [normalize_snippet(f""" + if (!_PyArg_CheckPositional("{{name}}", {nargs}, {min_pos}, {max_args})) {{{{ + goto exit; + }}}} + """, indent=4)] has_optional = False for i, p in enumerate(parameters): - displayname = p.get_displayname(i+1) - argname = argname_fmt % i - if p.is_vararg(): - if not new_or_init: + if fastcall: parser_code.append(normalize_snippet(""" %s = PyTuple_New(%s); if (!%s) {{ @@ -1361,7 +1380,9 @@ def parser_body( ), indent=4)) continue - parsearg = p.converter.parse_arg(argname, displayname) + displayname = p.get_displayname(i+1) + argname = argname_fmt % i + parsearg = p.converter.parse_arg(argname, displayname, limited_capi=limited_capi) if parsearg is None: parser_code = None break @@ -1378,7 +1399,9 @@ def parser_body( if has_optional: parser_code.append("skip_optional:") else: - if not new_or_init: + if limited_capi: + fastcall = False + if fastcall: parser_code = [normalize_snippet(""" if (!_PyArg_ParseStack(args, nargs, "{format_units}:{name}", {parse_arguments})) {{ @@ -1386,6 +1409,8 @@ def parser_body( }} """, indent=4)] else: + flags = "METH_VARARGS" + parser_prototype = self.PARSER_PROTOTYPE_VARARGS parser_code = [normalize_snippet(""" if (!PyArg_ParseTuple(args, "{format_units}:{name}", {parse_arguments})) {{ @@ -1421,25 +1446,10 @@ def parser_body( nargs = f"Py_MIN(nargs, {max_pos})" if max_pos else "0" if limited_capi: - # positional-or-keyword arguments - flags = "METH_VARARGS|METH_KEYWORDS" - - parser_prototype = self.PARSER_PROTOTYPE_KEYWORD - parser_code = [normalize_snippet(""" - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "{format_units}:{name}", _keywords, - {parse_arguments})) - goto exit; - """, indent=4)] - declarations = "static char *_keywords[] = {{{keywords_c} NULL}};" - if deprecated_positionals or deprecated_keywords: - declarations += "\nPy_ssize_t nargs = PyTuple_Size(args);" - if deprecated_keywords: - code = self.deprecate_keyword_use(f, deprecated_keywords, None, - limited_capi=limited_capi, - clinic=clinic) - parser_code.append(code) + parser_code = None + fastcall = False - elif not new_or_init: + elif fastcall: flags = "METH_FASTCALL|METH_KEYWORDS" parser_prototype = self.PARSER_PROTOTYPE_FASTCALL_KEYWORDS argname_fmt = 'args[%d]' @@ -1477,11 +1487,12 @@ def parser_body( flags = 'METH_METHOD|' + flags parser_prototype = self.PARSER_PROTOTYPE_DEF_CLASS - if not limited_capi: + if parser_code is not None: if deprecated_keywords: code = self.deprecate_keyword_use(f, deprecated_keywords, argname_fmt, - limited_capi=limited_capi, - clinic=clinic) + clinic=clinic, + fastcall=fastcall, + limited_capi=limited_capi) parser_code.append(code) add_label: str | None = None @@ -1490,7 +1501,7 @@ def parser_body( raise ValueError("defining_class should be the first " "parameter (after self)") displayname = p.get_displayname(i+1) - parsearg = p.converter.parse_arg(argname_fmt % i, displayname) + parsearg = p.converter.parse_arg(argname_fmt % i, displayname, limited_capi=limited_capi) if parsearg is None: parser_code = None break @@ -1542,40 +1553,56 @@ def parser_body( }} """ % add_label, indent=4)) - if parser_code is not None: - if add_label: - parser_code.append("%s:" % add_label) + if parser_code is not None: + if add_label: + parser_code.append("%s:" % add_label) + else: + declarations = declare_parser(f, clinic=clinic, + hasformat=True, + limited_capi=limited_capi) + if limited_capi: + # positional-or-keyword arguments + assert not fastcall + flags = "METH_VARARGS|METH_KEYWORDS" + parser_prototype = self.PARSER_PROTOTYPE_KEYWORD + parser_code = [normalize_snippet(""" + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "{format_units}:{name}", _keywords, + {parse_arguments})) + goto exit; + """, indent=4)] + declarations = "static char *_keywords[] = {{{keywords_c} NULL}};" + if deprecated_positionals or deprecated_keywords: + declarations += "\nPy_ssize_t nargs = PyTuple_Size(args);" + + elif fastcall: + parser_code = [normalize_snippet(""" + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser{parse_arguments_comma} + {parse_arguments})) {{ + goto exit; + }} + """, indent=4)] else: - declarations = declare_parser(f, clinic=clinic, - hasformat=True, - limited_capi=clinic.limited_capi) - if not new_or_init: - parser_code = [normalize_snippet(""" - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser{parse_arguments_comma} - {parse_arguments})) {{ - goto exit; - }} - """, indent=4)] - else: - parser_code = [normalize_snippet(""" - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - {parse_arguments})) {{ - goto exit; - }} - """, indent=4)] - if deprecated_positionals or deprecated_keywords: - declarations += "\nPy_ssize_t nargs = PyTuple_GET_SIZE(args);" - if deprecated_keywords: - code = self.deprecate_keyword_use(f, deprecated_keywords, None, - limited_capi=limited_capi, - clinic=clinic) - parser_code.append(code) + parser_code = [normalize_snippet(""" + if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, + {parse_arguments})) {{ + goto exit; + }} + """, indent=4)] + if deprecated_positionals or deprecated_keywords: + declarations += "\nPy_ssize_t nargs = PyTuple_GET_SIZE(args);" + if deprecated_keywords: + code = self.deprecate_keyword_use(f, deprecated_keywords, None, + clinic=clinic, + fastcall=fastcall, + limited_capi=limited_capi) + parser_code.append(code) if deprecated_positionals: code = self.deprecate_positional_use(f, deprecated_positionals) # Insert the deprecation code before parameter parsing. parser_code.insert(0, code) + assert parser_prototype is not None parser_definition = parser_body(parser_prototype, *parser_code, declarations=declarations) @@ -1619,6 +1646,9 @@ def parser_body( if flags in ('METH_NOARGS', 'METH_O', 'METH_VARARGS'): methoddef_cast = "(PyCFunction)" methoddef_cast_end = "" + elif limited_capi: + methoddef_cast = "(PyCFunction)(void(*)(void))" + methoddef_cast_end = "" else: methoddef_cast = "_PyCFunction_CAST(" methoddef_cast_end = ")" @@ -3030,11 +3060,11 @@ def copy( def get_displayname(self, i: int) -> str: if i == 0: - return '"argument"' + return 'argument' if not self.is_positional_only(): - return f'"argument {self.name!r}"' + return f'argument {self.name!r}' else: - return f'"argument {i}"' + return f'argument {i}' def render_docstring(self) -> str: add, out = text_accumulator() @@ -3458,41 +3488,78 @@ def pre_render(self) -> None: """ pass - def parse_arg(self, argname: str, displayname: str) -> str | None: + def bad_argument(self, displayname: str, expected: str, *, limited_capi: bool, expected_literal: bool = True) -> str: + assert '"' not in expected + if limited_capi: + if expected_literal: + return (f'PyErr_Format(PyExc_TypeError, ' + f'"{{{{name}}}}() {displayname} must be {expected}, not %.50s", ' + f'{{argname}} == Py_None ? "None" : Py_TYPE({{argname}})->tp_name);') + else: + return (f'PyErr_Format(PyExc_TypeError, ' + f'"{{{{name}}}}() {displayname} must be %.50s, not %.50s", ' + f'"{expected}", ' + f'{{argname}} == Py_None ? "None" : Py_TYPE({{argname}})->tp_name);') + else: + if expected_literal: + expected = f'"{expected}"' + return f'_PyArg_BadArgument("{{{{name}}}}", "{displayname}", {expected}, {{argname}});' + + def format_code(self, fmt: str, *, + argname: str, + bad_argument: str | None = None, + bad_argument2: str | None = None, + **kwargs: Any) -> str: + if '{bad_argument}' in fmt: + if not bad_argument: + raise TypeError("required 'bad_argument' argument") + fmt = fmt.replace('{bad_argument}', bad_argument) + if '{bad_argument2}' in fmt: + if not bad_argument2: + raise TypeError("required 'bad_argument2' argument") + fmt = fmt.replace('{bad_argument2}', bad_argument2) + return fmt.format(argname=argname, paramname=self.parser_name, **kwargs) + + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'O&': - return """ + return self.format_code(""" if (!{converter}({argname}, &{paramname})) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name, - converter=self.converter) + """, + argname=argname, + converter=self.converter) if self.format_unit == 'O!': cast = '(%s)' % self.type if self.type != 'PyObject *' else '' if self.subclass_of in type_checks: typecheck, typename = type_checks[self.subclass_of] - return """ + return self.format_code(""" if (!{typecheck}({argname})) {{{{ - _PyArg_BadArgument("{{name}}", {displayname}, "{typename}", {argname}); + {bad_argument} goto exit; }}}} {paramname} = {cast}{argname}; - """.format(argname=argname, paramname=self.parser_name, - displayname=displayname, typecheck=typecheck, - typename=typename, cast=cast) - return """ + """, + argname=argname, + bad_argument=self.bad_argument(displayname, typename, limited_capi=limited_capi), + typecheck=typecheck, typename=typename, cast=cast) + return self.format_code(""" if (!PyObject_TypeCheck({argname}, {subclass_of})) {{{{ - _PyArg_BadArgument("{{name}}", {displayname}, ({subclass_of})->tp_name, {argname}); + {bad_argument} goto exit; }}}} {paramname} = {cast}{argname}; - """.format(argname=argname, paramname=self.parser_name, - subclass_of=self.subclass_of, cast=cast, - displayname=displayname) + """, + argname=argname, + bad_argument=self.bad_argument(displayname, '({subclass_of})->tp_name', + expected_literal=False, limited_capi=limited_capi), + subclass_of=self.subclass_of, cast=cast) if self.format_unit == 'O': cast = '(%s)' % self.type if self.type != 'PyObject *' else '' - return """ + return self.format_code(""" {paramname} = {cast}{argname}; - """.format(argname=argname, paramname=self.parser_name, cast=cast) + """, + argname=argname, cast=cast) return None def set_template_dict(self, template_dict: TemplateDict) -> None: @@ -3567,22 +3634,24 @@ def converter_init(self, *, accept: TypeSet = {object}) -> None: self.default = bool(self.default) self.c_default = str(int(self.default)) - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'i': - return """ + return self.format_code(""" {paramname} = PyLong_AsInt({argname}); if ({paramname} == -1 && PyErr_Occurred()) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name) + """, + argname=argname) elif self.format_unit == 'p': - return """ + return self.format_code(""" {paramname} = PyObject_IsTrue({argname}); if ({paramname} < 0) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name) - return super().parse_arg(argname, displayname) + """, + argname=argname) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) class defining_class_converter(CConverter): """ @@ -3618,9 +3687,9 @@ def converter_init(self) -> None: if self.c_default == '"\'"': self.c_default = r"'\''" - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'c': - return """ + return self.format_code(""" if (PyBytes_Check({argname}) && PyBytes_GET_SIZE({argname}) == 1) {{{{ {paramname} = PyBytes_AS_STRING({argname})[0]; }}}} @@ -3628,12 +3697,14 @@ def parse_arg(self, argname: str, displayname: str) -> str | None: {paramname} = PyByteArray_AS_STRING({argname})[0]; }}}} else {{{{ - _PyArg_BadArgument("{{name}}", {displayname}, "a byte string of length 1", {argname}); + {bad_argument} goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name, - displayname=displayname) - return super().parse_arg(argname, displayname) + """, + argname=argname, + bad_argument=self.bad_argument(displayname, 'a byte string of length 1', limited_capi=limited_capi), + ) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) @add_legacy_c_converter('B', bitwise=True) @@ -3647,9 +3718,9 @@ def converter_init(self, *, bitwise: bool = False) -> None: if bitwise: self.format_unit = 'B' - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'b': - return """ + return self.format_code(""" {{{{ long ival = PyLong_AsLong({argname}); if (ival == -1 && PyErr_Occurred()) {{{{ @@ -3669,9 +3740,10 @@ def parse_arg(self, argname: str, displayname: str) -> str | None: {paramname} = (unsigned char) ival; }}}} }}}} - """.format(argname=argname, paramname=self.parser_name) + """, + argname=argname) elif self.format_unit == 'B': - return """ + return self.format_code(""" {{{{ unsigned long ival = PyLong_AsUnsignedLongMask({argname}); if (ival == (unsigned long)-1 && PyErr_Occurred()) {{{{ @@ -3681,8 +3753,9 @@ def parse_arg(self, argname: str, displayname: str) -> str | None: {paramname} = (unsigned char) ival; }}}} }}}} - """.format(argname=argname, paramname=self.parser_name) - return super().parse_arg(argname, displayname) + """, + argname=argname) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) class byte_converter(unsigned_char_converter): pass @@ -3692,9 +3765,9 @@ class short_converter(CConverter): format_unit = 'h' c_ignored_default = "0" - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'h': - return """ + return self.format_code(""" {{{{ long ival = PyLong_AsLong({argname}); if (ival == -1 && PyErr_Occurred()) {{{{ @@ -3714,8 +3787,9 @@ def parse_arg(self, argname: str, displayname: str) -> str | None: {paramname} = (short) ival; }}}} }}}} - """.format(argname=argname, paramname=self.parser_name) - return super().parse_arg(argname, displayname) + """, + argname=argname) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) class unsigned_short_converter(CConverter): type = 'unsigned short' @@ -3730,15 +3804,33 @@ def converter_init(self, *, bitwise: bool = False) -> None: self.add_include('pycore_long.h', '_PyLong_UnsignedShort_Converter()') - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'H': - return """ + return self.format_code(""" {paramname} = (unsigned short)PyLong_AsUnsignedLongMask({argname}); if ({paramname} == (unsigned short)-1 && PyErr_Occurred()) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name) - return super().parse_arg(argname, displayname) + """, + argname=argname) + if not limited_capi: + return super().parse_arg(argname, displayname, limited_capi=limited_capi) + # NOTE: Raises OverflowError for negative integer. + return self.format_code(""" + {{{{ + unsigned long uval = PyLong_AsUnsignedLong({argname}); + if (uval == (unsigned long)-1 && PyErr_Occurred()) {{{{ + goto exit; + }}}} + if (uval > USHRT_MAX) {{{{ + PyErr_SetString(PyExc_OverflowError, + "Python int too large for C unsigned short"); + goto exit; + }}}} + {paramname} = (unsigned short) uval; + }}}} + """, + argname=argname) @add_legacy_c_converter('C', accept={str}) class int_converter(CConverter): @@ -3757,28 +3849,31 @@ def converter_init( if type is not None: self.type = type - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'i': - return """ + return self.format_code(""" {paramname} = PyLong_AsInt({argname}); if ({paramname} == -1 && PyErr_Occurred()) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name) + """, + argname=argname) elif self.format_unit == 'C': - return """ + return self.format_code(""" if (!PyUnicode_Check({argname})) {{{{ - _PyArg_BadArgument("{{name}}", {displayname}, "a unicode character", {argname}); + {bad_argument} goto exit; }}}} if (PyUnicode_GET_LENGTH({argname}) != 1) {{{{ - _PyArg_BadArgument("{{name}}", {displayname}, "a unicode character", {argname}); + {bad_argument} goto exit; }}}} {paramname} = PyUnicode_READ_CHAR({argname}, 0); - """.format(argname=argname, paramname=self.parser_name, - displayname=displayname) - return super().parse_arg(argname, displayname) + """, + argname=argname, + bad_argument=self.bad_argument(displayname, 'a unicode character', limited_capi=limited_capi), + ) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) class unsigned_int_converter(CConverter): type = 'unsigned int' @@ -3793,15 +3888,33 @@ def converter_init(self, *, bitwise: bool = False) -> None: self.add_include('pycore_long.h', '_PyLong_UnsignedInt_Converter()') - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'I': - return """ + return self.format_code(""" {paramname} = (unsigned int)PyLong_AsUnsignedLongMask({argname}); if ({paramname} == (unsigned int)-1 && PyErr_Occurred()) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name) - return super().parse_arg(argname, displayname) + """, + argname=argname) + if not limited_capi: + return super().parse_arg(argname, displayname, limited_capi=limited_capi) + # NOTE: Raises OverflowError for negative integer. + return self.format_code(""" + {{{{ + unsigned long uval = PyLong_AsUnsignedLong({argname}); + if (uval == (unsigned long)-1 && PyErr_Occurred()) {{{{ + goto exit; + }}}} + if (uval > UINT_MAX) {{{{ + PyErr_SetString(PyExc_OverflowError, + "Python int too large for C unsigned int"); + goto exit; + }}}} + {paramname} = (unsigned int) uval; + }}}} + """, + argname=argname) class long_converter(CConverter): type = 'long' @@ -3809,15 +3922,16 @@ class long_converter(CConverter): format_unit = 'l' c_ignored_default = "0" - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'l': - return """ + return self.format_code(""" {paramname} = PyLong_AsLong({argname}); if ({paramname} == -1 && PyErr_Occurred()) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name) - return super().parse_arg(argname, displayname) + """, + argname=argname) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) class unsigned_long_converter(CConverter): type = 'unsigned long' @@ -3832,17 +3946,28 @@ def converter_init(self, *, bitwise: bool = False) -> None: self.add_include('pycore_long.h', '_PyLong_UnsignedLong_Converter()') - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'k': - return """ + return self.format_code(""" if (!PyLong_Check({argname})) {{{{ - _PyArg_BadArgument("{{name}}", {displayname}, "int", {argname}); + {bad_argument} goto exit; }}}} {paramname} = PyLong_AsUnsignedLongMask({argname}); - """.format(argname=argname, paramname=self.parser_name, - displayname=displayname) - return super().parse_arg(argname, displayname) + """, + argname=argname, + bad_argument=self.bad_argument(displayname, 'int', limited_capi=limited_capi), + ) + if not limited_capi: + return super().parse_arg(argname, displayname, limited_capi=limited_capi) + # NOTE: Raises OverflowError for negative integer. + return self.format_code(""" + {paramname} = PyLong_AsUnsignedLong({argname}); + if ({paramname} == (unsigned long)-1 && PyErr_Occurred()) {{{{ + goto exit; + }}}} + """, + argname=argname) class long_long_converter(CConverter): type = 'long long' @@ -3850,15 +3975,16 @@ class long_long_converter(CConverter): format_unit = 'L' c_ignored_default = "0" - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'L': - return """ + return self.format_code(""" {paramname} = PyLong_AsLongLong({argname}); if ({paramname} == -1 && PyErr_Occurred()) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name) - return super().parse_arg(argname, displayname) + """, + argname=argname) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) class unsigned_long_long_converter(CConverter): type = 'unsigned long long' @@ -3873,17 +3999,28 @@ def converter_init(self, *, bitwise: bool = False) -> None: self.add_include('pycore_long.h', '_PyLong_UnsignedLongLong_Converter()') - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'K': - return """ + return self.format_code(""" if (!PyLong_Check({argname})) {{{{ - _PyArg_BadArgument("{{name}}", {displayname}, "int", {argname}); + {bad_argument} goto exit; }}}} {paramname} = PyLong_AsUnsignedLongLongMask({argname}); - """.format(argname=argname, paramname=self.parser_name, - displayname=displayname) - return super().parse_arg(argname, displayname) + """, + argname=argname, + bad_argument=self.bad_argument(displayname, 'int', limited_capi=limited_capi), + ) + if not limited_capi: + return super().parse_arg(argname, displayname, limited_capi=limited_capi) + # NOTE: Raises OverflowError for negative integer. + return self.format_code(""" + {paramname} = PyLong_AsUnsignedLongLong({argname}); + if ({paramname} == (unsigned long long)-1 && PyErr_Occurred()) {{{{ + goto exit; + }}}} + """, + argname=argname) class Py_ssize_t_converter(CConverter): type = 'Py_ssize_t' @@ -3901,12 +4038,16 @@ def converter_init(self, *, accept: TypeSet = {int}) -> None: else: fail(f"Py_ssize_t_converter: illegal 'accept' argument {accept!r}") - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'n': - return """ + if limited_capi: + PyNumber_Index = 'PyNumber_Index' + else: + PyNumber_Index = '_PyNumber_Index' + return self.format_code(""" {{{{ Py_ssize_t ival = -1; - PyObject *iobj = _PyNumber_Index({argname}); + PyObject *iobj = {PyNumber_Index}({argname}); if (iobj != NULL) {{{{ ival = PyLong_AsSsize_t(iobj); Py_DECREF(iobj); @@ -3916,8 +4057,28 @@ def parse_arg(self, argname: str, displayname: str) -> str | None: }}}} {paramname} = ival; }}}} - """.format(argname=argname, paramname=self.parser_name) - return super().parse_arg(argname, displayname) + """, + argname=argname, + PyNumber_Index=PyNumber_Index) + if not limited_capi: + return super().parse_arg(argname, displayname, limited_capi=limited_capi) + return self.format_code(""" + if ({argname} != Py_None) {{{{ + if (PyIndex_Check({argname})) {{{{ + {paramname} = PyNumber_AsSsize_t({argname}, PyExc_OverflowError); + if ({paramname} == -1 && PyErr_Occurred()) {{{{ + goto exit; + }}}} + }}}} + else {{{{ + {bad_argument} + goto exit; + }}}} + }}}} + """, + argname=argname, + bad_argument=self.bad_argument(displayname, 'integer or None', limited_capi=limited_capi), + ) class slice_index_converter(CConverter): @@ -3926,11 +4087,51 @@ class slice_index_converter(CConverter): def converter_init(self, *, accept: TypeSet = {int, NoneType}) -> None: if accept == {int}: self.converter = '_PyEval_SliceIndexNotNone' + self.nullable = False elif accept == {int, NoneType}: self.converter = '_PyEval_SliceIndex' + self.nullable = True else: fail(f"slice_index_converter: illegal 'accept' argument {accept!r}") + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: + if not limited_capi: + return super().parse_arg(argname, displayname, limited_capi=limited_capi) + if self.nullable: + return self.format_code(""" + if (!Py_IsNone({argname})) {{{{ + if (PyIndex_Check({argname})) {{{{ + {paramname} = PyNumber_AsSsize_t({argname}, NULL); + if ({paramname} == -1 && PyErr_Occurred()) {{{{ + return 0; + }}}} + }}}} + else {{{{ + PyErr_SetString(PyExc_TypeError, + "slice indices must be integers or " + "None or have an __index__ method"); + goto exit; + }}}} + }}}} + """, + argname=argname) + else: + return self.format_code(""" + if (PyIndex_Check({argname})) {{{{ + {paramname} = PyNumber_AsSsize_t({argname}, NULL); + if ({paramname} == -1 && PyErr_Occurred()) {{{{ + goto exit; + }}}} + }}}} + else {{{{ + PyErr_SetString(PyExc_TypeError, + "slice indices must be integers or " + "have an __index__ method"); + goto exit; + }}}} + """, + argname=argname) + class size_t_converter(CConverter): type = 'size_t' converter = '_PyLong_Size_t_Converter' @@ -3940,15 +4141,25 @@ def converter_init(self, *, accept: TypeSet = {int, NoneType}) -> None: self.add_include('pycore_long.h', '_PyLong_Size_t_Converter()') - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'n': - return """ + return self.format_code(""" {paramname} = PyNumber_AsSsize_t({argname}, PyExc_OverflowError); if ({paramname} == -1 && PyErr_Occurred()) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name) - return super().parse_arg(argname, displayname) + """, + argname=argname) + if not limited_capi: + return super().parse_arg(argname, displayname, limited_capi=limited_capi) + # NOTE: Raises OverflowError for negative integer. + return self.format_code(""" + {paramname} = PyLong_AsSize_t({argname}); + if ({paramname} == (size_t)-1 && PyErr_Occurred()) {{{{ + goto exit; + }}}} + """, + argname=argname) class fildes_converter(CConverter): @@ -3960,12 +4171,13 @@ def converter_init(self, *, accept: TypeSet = {int, NoneType}) -> None: '_PyLong_FileDescriptor_Converter()') def _parse_arg(self, argname: str, displayname: str) -> str | None: - return """ + return self.format_code(""" {paramname} = PyObject_AsFileDescriptor({argname}); if ({paramname} == -1) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.name) + """, + argname=argname) class float_converter(CConverter): @@ -3974,9 +4186,9 @@ class float_converter(CConverter): format_unit = 'f' c_ignored_default = "0.0" - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'f': - return """ + return self.format_code(""" if (PyFloat_CheckExact({argname})) {{{{ {paramname} = (float) (PyFloat_AS_DOUBLE({argname})); }}}} @@ -3987,8 +4199,9 @@ def parse_arg(self, argname: str, displayname: str) -> str | None: goto exit; }}}} }}}} - """.format(argname=argname, paramname=self.parser_name) - return super().parse_arg(argname, displayname) + """, + argname=argname) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) class double_converter(CConverter): type = 'double' @@ -3996,9 +4209,9 @@ class double_converter(CConverter): format_unit = 'd' c_ignored_default = "0.0" - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'd': - return """ + return self.format_code(""" if (PyFloat_CheckExact({argname})) {{{{ {paramname} = PyFloat_AS_DOUBLE({argname}); }}}} @@ -4009,8 +4222,9 @@ def parse_arg(self, argname: str, displayname: str) -> str | None: goto exit; }}}} }}}} - """.format(argname=argname, paramname=self.parser_name) - return super().parse_arg(argname, displayname) + """, + argname=argname) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) class Py_complex_converter(CConverter): @@ -4019,15 +4233,16 @@ class Py_complex_converter(CConverter): format_unit = 'D' c_ignored_default = "{0.0, 0.0}" - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'D': - return """ + return self.format_code(""" {paramname} = PyComplex_AsCComplex({argname}); if (PyErr_Occurred()) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name) - return super().parse_arg(argname, displayname) + """, + argname=argname) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) class object_converter(CConverter): @@ -4112,11 +4327,11 @@ def post_parsing(self) -> str: else: return "" - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 's': - return """ + return self.format_code(""" if (!PyUnicode_Check({argname})) {{{{ - _PyArg_BadArgument("{{name}}", {displayname}, "str", {argname}); + {bad_argument} goto exit; }}}} Py_ssize_t {length_name}; @@ -4128,10 +4343,12 @@ def parse_arg(self, argname: str, displayname: str) -> str | None: PyErr_SetString(PyExc_ValueError, "embedded null character"); goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name, - displayname=displayname, length_name=self.length_name) + """, + argname=argname, + bad_argument=self.bad_argument(displayname, 'str', limited_capi=limited_capi), + length_name=self.length_name) if self.format_unit == 'z': - return """ + return self.format_code(""" if ({argname} == Py_None) {{{{ {paramname} = NULL; }}}} @@ -4147,12 +4364,14 @@ def parse_arg(self, argname: str, displayname: str) -> str | None: }}}} }}}} else {{{{ - _PyArg_BadArgument("{{name}}", {displayname}, "str or None", {argname}); + {bad_argument} goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name, - displayname=displayname, length_name=self.length_name) - return super().parse_arg(argname, displayname) + """, + argname=argname, + bad_argument=self.bad_argument(displayname, 'str or None', limited_capi=limited_capi), + length_name=self.length_name) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) # # This is the fourth or fifth rewrite of registering all the @@ -4214,51 +4433,57 @@ class PyBytesObject_converter(CConverter): format_unit = 'S' # accept = {bytes} - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'S': - return """ + return self.format_code(""" if (!PyBytes_Check({argname})) {{{{ - _PyArg_BadArgument("{{name}}", {displayname}, "bytes", {argname}); + {bad_argument} goto exit; }}}} {paramname} = ({type}){argname}; - """.format(argname=argname, paramname=self.parser_name, - type=self.type, displayname=displayname) - return super().parse_arg(argname, displayname) + """, + argname=argname, + bad_argument=self.bad_argument(displayname, 'bytes', limited_capi=limited_capi), + type=self.type) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) class PyByteArrayObject_converter(CConverter): type = 'PyByteArrayObject *' format_unit = 'Y' # accept = {bytearray} - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'Y': - return """ + return self.format_code(""" if (!PyByteArray_Check({argname})) {{{{ - _PyArg_BadArgument("{{name}}", {displayname}, "bytearray", {argname}); + {bad_argument} goto exit; }}}} {paramname} = ({type}){argname}; - """.format(argname=argname, paramname=self.parser_name, - type=self.type, displayname=displayname) - return super().parse_arg(argname, displayname) + """, + argname=argname, + bad_argument=self.bad_argument(displayname, 'bytearray', limited_capi=limited_capi), + type=self.type) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) class unicode_converter(CConverter): type = 'PyObject *' default_type = (str, Null, NoneType) format_unit = 'U' - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'U': - return """ + return self.format_code(""" if (!PyUnicode_Check({argname})) {{{{ - _PyArg_BadArgument("{{name}}", {displayname}, "str", {argname}); + {bad_argument} goto exit; }}}} {paramname} = {argname}; - """.format(argname=argname, paramname=self.parser_name, - displayname=displayname) - return super().parse_arg(argname, displayname) + """, + argname=argname, + bad_argument=self.bad_argument(displayname, 'str', limited_capi=limited_capi), + ) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) @add_legacy_c_converter('u') @add_legacy_c_converter('u#', zeroes=True) @@ -4292,25 +4517,26 @@ def cleanup(self) -> str: if self.length: return "" else: - return """\ -PyMem_Free((void *){name}); -""".format(name=self.name) + return f"""PyMem_Free((void *){self.parser_name});\n""" - def parse_arg(self, argname: str, argnum: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if not self.length: if self.accept == {str}: - return """ + return self.format_code(""" if (!PyUnicode_Check({argname})) {{{{ - _PyArg_BadArgument("{{name}}", {argnum}, "str", {argname}); + {bad_argument} goto exit; }}}} {paramname} = PyUnicode_AsWideCharString({argname}, NULL); if ({paramname} == NULL) {{{{ goto exit; }}}} - """.format(argname=argname, paramname=self.name, argnum=argnum) + """, + argname=argname, + bad_argument=self.bad_argument(displayname, 'str', limited_capi=limited_capi), + ) elif self.accept == {str, NoneType}: - return """ + return self.format_code(""" if ({argname} == Py_None) {{{{ {paramname} = NULL; }}}} @@ -4321,11 +4547,14 @@ def parse_arg(self, argname: str, argnum: str) -> str | None: }}}} }}}} else {{{{ - _PyArg_BadArgument("{{name}}", {argnum}, "str or None", {argname}); + {bad_argument} goto exit; }}}} - """.format(argname=argname, paramname=self.name, argnum=argnum) - return super().parse_arg(argname, argnum) + """, + argname=argname, + bad_argument=self.bad_argument(displayname, 'str or None', limited_capi=limited_capi), + ) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) @add_legacy_c_converter('s*', accept={str, buffer}) @add_legacy_c_converter('z*', accept={str, buffer, NoneType}) @@ -4359,20 +4588,22 @@ def cleanup(self) -> str: name = self.name return "".join(["if (", name, ".obj) {\n PyBuffer_Release(&", name, ");\n}\n"]) - def parse_arg(self, argname: str, displayname: str) -> str | None: + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'y*': - return """ + return self.format_code(""" if (PyObject_GetBuffer({argname}, &{paramname}, PyBUF_SIMPLE) != 0) {{{{ goto exit; }}}} if (!PyBuffer_IsContiguous(&{paramname}, 'C')) {{{{ - _PyArg_BadArgument("{{name}}", {displayname}, "contiguous buffer", {argname}); + {bad_argument} goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name, - displayname=displayname) + """, + argname=argname, + bad_argument=self.bad_argument(displayname, 'contiguous buffer', limited_capi=limited_capi), + ) elif self.format_unit == 's*': - return """ + return self.format_code(""" if (PyUnicode_Check({argname})) {{{{ Py_ssize_t len; const char *ptr = PyUnicode_AsUTF8AndSize({argname}, &len); @@ -4386,26 +4617,30 @@ def parse_arg(self, argname: str, displayname: str) -> str | None: goto exit; }}}} if (!PyBuffer_IsContiguous(&{paramname}, 'C')) {{{{ - _PyArg_BadArgument("{{name}}", {displayname}, "contiguous buffer", {argname}); + {bad_argument} goto exit; }}}} }}}} - """.format(argname=argname, paramname=self.parser_name, - displayname=displayname) + """, + argname=argname, + bad_argument=self.bad_argument(displayname, 'contiguous buffer', limited_capi=limited_capi), + ) elif self.format_unit == 'w*': - return """ + return self.format_code(""" if (PyObject_GetBuffer({argname}, &{paramname}, PyBUF_WRITABLE) < 0) {{{{ - PyErr_Clear(); - _PyArg_BadArgument("{{name}}", {displayname}, "read-write bytes-like object", {argname}); + {bad_argument} goto exit; }}}} if (!PyBuffer_IsContiguous(&{paramname}, 'C')) {{{{ - _PyArg_BadArgument("{{name}}", {displayname}, "contiguous buffer", {argname}); + {bad_argument2} goto exit; }}}} - """.format(argname=argname, paramname=self.parser_name, - displayname=displayname) - return super().parse_arg(argname, displayname) + """, + argname=argname, + bad_argument=self.bad_argument(displayname, 'read-write bytes-like object', limited_capi=limited_capi), + bad_argument2=self.bad_argument(displayname, 'contiguous buffer', limited_capi=limited_capi), + ) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) def correct_name_for_self( From 03c4080c71f49df9c219354b7b38b738917fd2ed Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 3 Sep 2023 18:54:27 +0200 Subject: [PATCH 014/357] gh-108765: Python.h no longer includes (#108831) Remove in C files which don't use it; only sre.c and _decimal.c still use it. Remove _PY_PORT_CTYPE_UTF8_ISSUE code from pyport.h: * Code added by commit b5047fd01948ab108edcc1b3c2c901d915814cfd in 2004 for MacOSX and FreeBSD. * Test removed by commit 52ddaefb6bab1a74ecffe8519c02735794ebfbe1 in 2007, since Python str type now uses locale independent functions like Py_ISALPHA() and Py_TOLOWER() and the Unicode database. Modules/_sre/sre.c replaces _PY_PORT_CTYPE_UTF8_ISSUE with new functions: sre_isalnum(), sre_tolower(), sre_toupper(). Remove unused includes: * _localemodule.c: remove . * getargs.c: remove . * dynload_win.c: remove , it no longer calls _getcwd() since commit fb1f68ed7cc1536482d1debd70a53c5442135fe2 (in 2001). --- Doc/whatsnew/3.13.rst | 7 ++++ Include/Python.h | 1 - Include/pyport.h | 38 ------------------- ...-09-02-22-35-55.gh-issue-108765.4TOdBT.rst | 5 +++ Modules/_localemodule.c | 34 ++++++----------- Modules/_sre/sre.c | 38 ++++++++++++++++--- Modules/_struct.c | 1 - Modules/_tkinter.c | 13 +++---- Modules/_zoneinfo.c | 7 ++-- Modules/pyexpat.c | 1 - Modules/timemodule.c | 7 ++-- Objects/abstract.c | 3 +- Objects/floatobject.c | 3 +- Objects/longobject.c | 6 +-- Objects/typeobject.c | 2 - Python/bltinmodule.c | 1 - Python/ceval.c | 4 +- Python/codecs.c | 1 - Python/dynload_win.c | 9 +---- Python/errors.c | 1 - Python/getargs.c | 4 -- Python/mystrtoul.c | 14 +++++-- 22 files changed, 86 insertions(+), 114 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2023-09-02-22-35-55.gh-issue-108765.4TOdBT.rst diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index 1c91a1dadb899f..5d8ecbb193f157 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -942,6 +942,13 @@ Porting to Python 3.13 and ``setitimer()`` functions. (Contributed by Victor Stinner in :gh:`108765`.) +* ``Python.h`` no longer includes the ```` standard header file. If + needed, it should now be included explicitly. For example, it provides + ``isalpha()`` and ``tolower()`` functions which are locale dependent. Python + provides locale independent functions, like :c:func:`!Py_ISALPHA` and + :c:func:`!Py_TOLOWER`. + (Contributed by Victor Stinner in :gh:`108765`.) + Deprecated ---------- diff --git a/Include/Python.h b/Include/Python.h index 4cc72bb23ce7a3..8b28200000ab56 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -17,7 +17,6 @@ // Include standard header files #include // assert() -#include // tolower() #include // uintptr_t #include // INT_MAX #include // HUGE_VAL diff --git a/Include/pyport.h b/Include/pyport.h index c4168d10f58151..4d9b9c026b31d4 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -392,44 +392,6 @@ extern "C" { # define Py_NO_INLINE #endif -/* On 4.4BSD-descendants, ctype functions serves the whole range of - * wchar_t character set rather than single byte code points only. - * This characteristic can break some operations of string object - * including str.upper() and str.split() on UTF-8 locales. This - * workaround was provided by Tim Robbins of FreeBSD project. - */ - -#if defined(__APPLE__) -# define _PY_PORT_CTYPE_UTF8_ISSUE -#endif - -#ifdef _PY_PORT_CTYPE_UTF8_ISSUE -#ifndef __cplusplus - /* The workaround below is unsafe in C++ because - * the defines these symbols as real functions, - * with a slightly different signature. - * See issue #10910 - */ -#include -#include -#undef isalnum -#define isalnum(c) iswalnum(btowc(c)) -#undef isalpha -#define isalpha(c) iswalpha(btowc(c)) -#undef islower -#define islower(c) iswlower(btowc(c)) -#undef isspace -#define isspace(c) iswspace(btowc(c)) -#undef isupper -#define isupper(c) iswupper(btowc(c)) -#undef tolower -#define tolower(c) towlower(btowc(c)) -#undef toupper -#define toupper(c) towupper(btowc(c)) -#endif -#endif - - /* Declarations for symbol visibility. PyAPI_FUNC(type): Declares a public Python API function and return type diff --git a/Misc/NEWS.d/next/C API/2023-09-02-22-35-55.gh-issue-108765.4TOdBT.rst b/Misc/NEWS.d/next/C API/2023-09-02-22-35-55.gh-issue-108765.4TOdBT.rst new file mode 100644 index 00000000000000..c13b6d9db053fc --- /dev/null +++ b/Misc/NEWS.d/next/C API/2023-09-02-22-35-55.gh-issue-108765.4TOdBT.rst @@ -0,0 +1,5 @@ +``Python.h`` no longer includes the ```` standard header file. If +needed, it should now be included explicitly. For example, it provides +``isalpha()`` and ``tolower()`` functions which are locale dependent. Python +provides locale independent functions, like :c:func:`!Py_ISALPHA` and +:c:func:`!Py_TOLOWER`. Patch by Victor Stinner. diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 1847a4811e8ee9..fe8e4c5e30035b 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -10,35 +10,25 @@ This software comes with no warranty. Use at your own risk. ******************************************************************/ #include "Python.h" -#include "pycore_fileutils.h" -#include "pycore_pymem.h" // _PyMem_Strdup - -#include -#include -#include -#include +#include "pycore_fileutils.h" // _Py_GetLocaleconvNumeric() +#include "pycore_pymem.h" // _PyMem_Strdup() +#include // setlocale() +#include // strlen() #ifdef HAVE_ERRNO_H -#include +# include // errno #endif - #ifdef HAVE_LANGINFO_H -#include +# include // nl_langinfo() #endif - #ifdef HAVE_LIBINTL_H -#include -#endif - -#ifdef HAVE_WCHAR_H -#include +# include #endif - -#if defined(MS_WINDOWS) -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include +#ifdef MS_WINDOWS +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include #endif PyDoc_STRVAR(locale__doc__, "Support for POSIX locales."); diff --git a/Modules/_sre/sre.c b/Modules/_sre/sre.c index 3872c3663c7294..07da5da13f70d3 100644 --- a/Modules/_sre/sre.c +++ b/Modules/_sre/sre.c @@ -43,12 +43,40 @@ static const char copyright[] = #include "pycore_long.h" // _PyLong_GetZero() #include "pycore_moduleobject.h" // _PyModule_GetState() +#include "sre.h" // SRE_CODE -#include "sre.h" +#include // tolower(), toupper(), isalnum() #define SRE_CODE_BITS (8 * sizeof(SRE_CODE)) -#include +// On macOS, use the wide character ctype API using btowc() +#if defined(__APPLE__) +# define USE_CTYPE_WINT_T +#endif + +static int sre_isalnum(unsigned int ch) { +#ifdef USE_CTYPE_WINT_T + return (unsigned int)iswalnum(btowc((int)ch)); +#else + return (unsigned int)isalnum((int)ch); +#endif +} + +static unsigned int sre_tolower(unsigned int ch) { +#ifdef USE_CTYPE_WINT_T + return (unsigned int)towlower(btowc((int)ch)); +#else + return (unsigned int)tolower((int)ch); +#endif +} + +static unsigned int sre_toupper(unsigned int ch) { +#ifdef USE_CTYPE_WINT_T + return (unsigned int)towupper(btowc((int)ch)); +#else + return (unsigned int)toupper((int)ch); +#endif +} /* Defining this one controls tracing: * 0 -- disabled @@ -114,17 +142,17 @@ static unsigned int sre_lower_ascii(unsigned int ch) /* locale-specific character predicates */ /* !(c & ~N) == (c < N+1) for any unsigned c, this avoids * warnings when c's type supports only numbers < N+1 */ -#define SRE_LOC_IS_ALNUM(ch) (!((ch) & ~255) ? isalnum((ch)) : 0) +#define SRE_LOC_IS_ALNUM(ch) (!((ch) & ~255) ? sre_isalnum((ch)) : 0) #define SRE_LOC_IS_WORD(ch) (SRE_LOC_IS_ALNUM((ch)) || (ch) == '_') static unsigned int sre_lower_locale(unsigned int ch) { - return ((ch) < 256 ? (unsigned int)tolower((ch)) : ch); + return ((ch) < 256 ? (unsigned int)sre_tolower((ch)) : ch); } static unsigned int sre_upper_locale(unsigned int ch) { - return ((ch) < 256 ? (unsigned int)toupper((ch)) : ch); + return ((ch) < 256 ? (unsigned int)sre_toupper((ch)) : ch); } /* unicode-specific character predicates */ diff --git a/Modules/_struct.c b/Modules/_struct.c index be4c23af384bb9..1f8f9c44dd69aa 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -12,7 +12,6 @@ #include "pycore_long.h" // _PyLong_AsByteArray() #include "pycore_moduleobject.h" // _PyModule_GetState() -#include #include // offsetof() /*[clinic input] diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 663b4117683629..f9a18644945c65 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -26,15 +26,14 @@ Copyright (C) 1994 Steen Lumholt. #endif #include "Python.h" -#include #ifdef MS_WINDOWS # include "pycore_fileutils.h" // _Py_stat() #endif -#include "pycore_long.h" +#include "pycore_long.h" // _PyLong_IsNegative() #ifdef MS_WINDOWS -#include +# include #endif #define CHECK_SIZE(size, elemsize) \ @@ -46,11 +45,11 @@ Copyright (C) 1994 Steen Lumholt. #define TCL_THREADS #ifdef TK_FRAMEWORK -#include -#include +# include +# include #else -#include -#include +# include +# include #endif #include "tkinter.h" diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c index 3f7b2851c5b794..eb4e522465181f 100644 --- a/Modules/_zoneinfo.c +++ b/Modules/_zoneinfo.c @@ -6,11 +6,10 @@ #include "pycore_long.h" // _PyLong_GetOne() #include "pycore_pyerrors.h" // _PyErr_ChainExceptions1() -#include -#include -#include +#include "datetime.h" // PyDateTime_TZInfo -#include "datetime.h" +#include // offsetof() +#include #include "clinic/_zoneinfo.c.h" /*[clinic input] diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index 52dd06cd3c8181..bd24523eac830b 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -7,7 +7,6 @@ #include "pycore_pyhash.h" // _Py_HashSecret #include "pycore_traceback.h" // _PyTraceback_Add() -#include #include // offsetof() #include "expat.h" #include "pyexpat.h" diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 4e55da71b117ca..a2b66520ee885d 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -6,22 +6,21 @@ #include "pycore_namespace.h" // _PyNamespace_New() #include "pycore_runtime.h" // _Py_ID() -#include #include // clock() #ifdef HAVE_SYS_TIMES_H -# include +# include // times() #endif #ifdef HAVE_SYS_TYPES_H # include #endif #if defined(HAVE_SYS_RESOURCE_H) -# include +# include // getrusage(RUSAGE_SELF) #endif #ifdef QUICKWIN # include #endif #if defined(HAVE_PTHREAD_H) -# include +# include // pthread_getcpuclockid() #endif #if defined(_AIX) # include diff --git a/Objects/abstract.c b/Objects/abstract.c index c113364a88a26a..6713926b86d218 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -9,9 +9,8 @@ #include "pycore_pyerrors.h" // _PyErr_Occurred() #include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_unionobject.h" // _PyUnion_Check() -#include -#include // offsetof() +#include // offsetof() /* Shorthands to return certain errors */ diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 1c5078bdda6871..776c7092edd057 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -16,8 +16,7 @@ #include "pycore_pystate.h" // _PyInterpreterState_GET() #include "pycore_structseq.h" // _PyStructSequence_FiniBuiltin() -#include -#include +#include // DBL_MAX #include // strtol() /*[clinic input] diff --git a/Objects/longobject.c b/Objects/longobject.c index d20ef412367bb7..e73de742229005 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -10,10 +10,8 @@ #include "pycore_runtime.h" // _PY_NSMALLPOSINTS #include "pycore_structseq.h" // _PyStructSequence_FiniBuiltin() -#include -#include -#include -#include // abs() +#include // DBL_MANT_DIG +#include // offsetof #include "clinic/longobject.c.h" /*[clinic input] diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 67e059c3f74b77..84c50507691cbe 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -19,8 +19,6 @@ #include "pycore_weakref.h" // _PyWeakref_GET_REF() #include "opcode.h" // MAKE_CELL - -#include #include // ptrdiff_t /*[clinic input] diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 971067e2d4fcc1..8e234e085f16c9 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1,7 +1,6 @@ /* Built-in functions */ #include "Python.h" -#include #include "pycore_ast.h" // _PyAST_Validate() #include "pycore_call.h" // _PyObject_CallNoArgs() #include "pycore_ceval.h" // _PyEval_Vector() diff --git a/Python/ceval.c b/Python/ceval.c index a22852ec13ea99..6f90d8e6fd064b 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -35,9 +35,7 @@ #include "pydtrace.h" #include "setobject.h" - -#include -#include +#include // bool #ifdef Py_DEBUG /* For debugging the interpreter: */ diff --git a/Python/codecs.c b/Python/codecs.c index 87ae896b8e7718..b79bf555f2f22a 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -14,7 +14,6 @@ Copyright (c) Corporation for National Research Initiatives. #include "pycore_pyerrors.h" // _PyErr_FormatNote() #include "pycore_pystate.h" // _PyInterpreterState_GET() #include "pycore_ucnhash.h" // _PyUnicode_Name_CAPI -#include const char *Py_hexdigits = "0123456789abcdef"; diff --git a/Python/dynload_win.c b/Python/dynload_win.c index acab05e2c6def3..f69995b8f9e3a1 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -5,13 +5,8 @@ #include "pycore_fileutils.h" // _Py_add_relfile() #include "pycore_pystate.h" // _PyInterpreterState_GET() -#ifdef HAVE_DIRECT_H -#include -#endif -#include - -#include "importdl.h" -#include "patchlevel.h" +#include "importdl.h" // dl_funcptr +#include "patchlevel.h" // PY_MAJOR_VERSION #include #ifdef _DEBUG diff --git a/Python/errors.c b/Python/errors.c index fb5b3ff2c7ba51..f670b78c1f14ef 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -10,7 +10,6 @@ #include "pycore_sysmodule.h" // _PySys_Audit() #include "pycore_traceback.h" // _PyTraceBack_FromFrame() -#include #ifdef MS_WINDOWS # include # include diff --git a/Python/getargs.c b/Python/getargs.c index fdc144488c9627..cbfe561111176c 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -7,10 +7,6 @@ #include "pycore_pylifecycle.h" // _PyArg_Fini #include "pycore_tuple.h" // _PyTuple_ITEMS() -#include -#include - - #ifdef __cplusplus extern "C" { #endif diff --git a/Python/mystrtoul.c b/Python/mystrtoul.c index e6fe154eed611a..fcd3e27f17f4e9 100644 --- a/Python/mystrtoul.c +++ b/Python/mystrtoul.c @@ -1,16 +1,22 @@ +// strtol() and strtoul(), renamed to avoid conflicts. +// +// API: +// +// - PyOS_strtol(): convert string to C long integer. +// - PyOS_strtoul(): convert string to C unsigned long integer. + #include "Python.h" #include "pycore_long.h" // _PyLong_DigitValue #if defined(__sgi) && !defined(_SGI_MP_SOURCE) -#define _SGI_MP_SOURCE +# define _SGI_MP_SOURCE #endif /* strtol and strtoul, renamed to avoid conflicts */ -#include #ifdef HAVE_ERRNO_H -#include +# include // errno #endif /* Static overflow check values for bases 2 through 36. @@ -75,7 +81,7 @@ static const int digitlimit[] = { 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, /* 20 - 29 */ 13, 12, 12, 12, 12, 12, 12}; /* 30 - 36 */ #else -#error "Need table for SIZEOF_LONG" +# error "Need table for SIZEOF_LONG" #endif /* From 0c369d6cb8c9a73725f5794c84bedf93e46fd27d Mon Sep 17 00:00:00 2001 From: Sangyun_LEE Date: Mon, 4 Sep 2023 06:19:49 +0900 Subject: [PATCH 015/357] Update Lib/test/test_unittest/testmock/testmock.py: fix typo RuntimError to RuntimeError (#108847) --- Lib/test/test_unittest/testmock/testmock.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_unittest/testmock/testmock.py b/Lib/test/test_unittest/testmock/testmock.py index bb09913d70b7ca..d23eb87696f406 100644 --- a/Lib/test/test_unittest/testmock/testmock.py +++ b/Lib/test/test_unittest/testmock/testmock.py @@ -2270,7 +2270,7 @@ def test_misspelled_arguments(self): class Foo(): one = 'one' # patch, patch.object and create_autospec need to check for misspelled - # arguments explicitly and throw a RuntimError if found. + # arguments explicitly and throw a RuntimeError if found. with self.assertRaises(RuntimeError): with patch(f'{__name__}.Something.meth', autospect=True): pass with self.assertRaises(RuntimeError): From c2ec174d243da5d2607dbf06c4451d0093ac40ba Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 3 Sep 2023 23:32:13 +0200 Subject: [PATCH 016/357] gh-108765: Move stat() fiddling from pyport.h to fileutils.h (#108854) --- Include/fileutils.h | 36 ++++++++++++++++++++++++++++++++++++ Include/pyport.h | 37 ------------------------------------- 2 files changed, 36 insertions(+), 37 deletions(-) diff --git a/Include/fileutils.h b/Include/fileutils.h index ba5acc84fcb185..1509198e45f0ca 100644 --- a/Include/fileutils.h +++ b/Include/fileutils.h @@ -1,5 +1,41 @@ #ifndef Py_FILEUTILS_H #define Py_FILEUTILS_H + +/******************************* + * stat() and fstat() fiddling * + *******************************/ + +#ifdef HAVE_SYS_STAT_H +# include // S_ISREG() +#elif defined(HAVE_STAT_H) +# include // S_ISREG() +#endif + +#ifndef S_IFMT + // VisualAge C/C++ Failed to Define MountType Field in sys/stat.h. +# define S_IFMT 0170000 +#endif +#ifndef S_IFLNK + // Windows doesn't define S_IFLNK, but posixmodule.c maps + // IO_REPARSE_TAG_SYMLINK to S_IFLNK. +# define S_IFLNK 0120000 +#endif +#ifndef S_ISREG +# define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) +#endif +#ifndef S_ISDIR +# define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR) +#endif +#ifndef S_ISCHR +# define S_ISCHR(x) (((x) & S_IFMT) == S_IFCHR) +#endif +#ifndef S_ISLNK +# define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK) +#endif + + +// Move this down here since some C++ #include's don't like to be included +// inside an extern "C". #ifdef __cplusplus extern "C" { #endif diff --git a/Include/pyport.h b/Include/pyport.h index 4d9b9c026b31d4..4a21a446b3d904 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -184,43 +184,6 @@ typedef Py_ssize_t Py_ssize_clean_t; # define Py_MEMCPY memcpy #endif -/******************************* - * stat() and fstat() fiddling * - *******************************/ - -#ifdef HAVE_SYS_STAT_H -#include -#elif defined(HAVE_STAT_H) -#include -#endif - -#ifndef S_IFMT -/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */ -#define S_IFMT 0170000 -#endif - -#ifndef S_IFLNK -/* Windows doesn't define S_IFLNK but posixmodule.c maps - * IO_REPARSE_TAG_SYMLINK to S_IFLNK */ -# define S_IFLNK 0120000 -#endif - -#ifndef S_ISREG -#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) -#endif - -#ifndef S_ISDIR -#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR) -#endif - -#ifndef S_ISCHR -#define S_ISCHR(x) (((x) & S_IFMT) == S_IFCHR) -#endif - -#ifndef S_ISLNK -#define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK) -#endif - #ifdef __cplusplus /* Move this down here since some C++ #include's don't like to be included inside an extern "C" */ From 31c2945f143c6b80c837fcf09a5cfb85fea9ea4c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 3 Sep 2023 23:37:15 +0200 Subject: [PATCH 017/357] gh-108834: regrtest reruns failed tests in subprocesses (#108839) When using --rerun option, regrtest now re-runs failed tests in verbose mode in fresh worker processes to have more deterministic behavior. So it can write its final report even if a test killed a worker progress. Add --fail-rerun option to regrtest: exit with non-zero exit code if a test failed pass passed when re-run in verbose mode (in a fresh process). That's now more useful since tests can pass when re-run in a fresh worker progress, whereas they failed when run after other tests when tests are run sequentially. Rename --verbose2 option (-w) to --rerun. Keep --verbose2 as a deprecated alias. Changes: * Fix and enhance statistics in regrtest summary. Add "(filtered)" when --match and/or --ignore options are used. * Add RunTests class. * Add TestResult.get_rerun_match_tests() method * Rewrite code to serialize/deserialize worker arguments as JSON using a new WorkerJob class. * Fix stats when a test is run with --forever --rerun. * If failed test names cannot be parsed, log a warning and don't filter tests. * test_regrtest.test_rerun_success() now uses a marker file, since the test is re-run in a separated process. * Add tests on normalize_test_name() function. * Add test_success() and test_skip() tests to test_regrtest. --- Lib/test/bisect_cmd.py | 7 +- Lib/test/libregrtest/cmdline.py | 11 +- Lib/test/libregrtest/main.py | 548 +++++++++--------- Lib/test/libregrtest/runtest.py | 234 +++++--- Lib/test/libregrtest/runtest_mp.py | 179 ++++-- Lib/test/libregrtest/utils.py | 2 +- Lib/test/support/__init__.py | 1 - Lib/test/support/testresult.py | 3 + Lib/test/test_regrtest.py | 305 +++++++--- ...-09-03-02-01-55.gh-issue-108834.iAwXzj.rst | 6 + ...-09-03-06-17-12.gh-issue-108834.fjV-CJ.rst | 2 + ...-09-03-20-15-49.gh-issue-108834.Osvmhf.rst | 3 + 12 files changed, 821 insertions(+), 480 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-03-02-01-55.gh-issue-108834.iAwXzj.rst create mode 100644 Misc/NEWS.d/next/Tests/2023-09-03-06-17-12.gh-issue-108834.fjV-CJ.rst create mode 100644 Misc/NEWS.d/next/Tests/2023-09-03-20-15-49.gh-issue-108834.Osvmhf.rst diff --git a/Lib/test/bisect_cmd.py b/Lib/test/bisect_cmd.py index 0bdd7a43c03f7b..5cb804bd469dc3 100755 --- a/Lib/test/bisect_cmd.py +++ b/Lib/test/bisect_cmd.py @@ -109,9 +109,10 @@ def parse_args(): def main(): args = parse_args() - if '-w' in args.test_args or '--verbose2' in args.test_args: - print("WARNING: -w/--verbose2 option should not be used to bisect!") - print() + for opt in ('-w', '--rerun', '--verbose2'): + if opt in args.test_args: + print(f"WARNING: {opt} option should not be used to bisect!") + print() if args.input: with open(args.input) as fp: diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index ebe57920d9185c..251fcacb1d14f7 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -156,7 +156,7 @@ def __init__(self, **kwargs) -> None: self.coverdir = 'coverage' self.runleaks = False self.huntrleaks = False - self.verbose2 = False + self.rerun = False self.verbose3 = False self.print_slow = False self.random_seed = None @@ -213,8 +213,10 @@ def _create_parser(): group = parser.add_argument_group('Verbosity') group.add_argument('-v', '--verbose', action='count', help='run tests in verbose mode with output to stdout') - group.add_argument('-w', '--verbose2', action='store_true', + group.add_argument('-w', '--rerun', action='store_true', help='re-run failed tests in verbose mode') + group.add_argument('--verbose2', action='store_true', dest='rerun', + help='deprecated alias to --rerun') group.add_argument('-W', '--verbose3', action='store_true', help='display test output on failure') group.add_argument('-q', '--quiet', action='store_true', @@ -309,6 +311,9 @@ def _create_parser(): group.add_argument('--fail-env-changed', action='store_true', help='if a test file alters the environment, mark ' 'the test as failed') + group.add_argument('--fail-rerun', action='store_true', + help='if a test failed and then passed when re-run, ' + 'mark the tests as failed') group.add_argument('--junit-xml', dest='xmlpath', metavar='FILENAME', help='writes JUnit-style XML results to the specified ' @@ -380,7 +385,7 @@ def _parse_args(args, **kwargs): ns.python = shlex.split(ns.python) if ns.failfast and not (ns.verbose or ns.verbose3): parser.error("-G/--failfast needs either -v or -W") - if ns.pgo and (ns.verbose or ns.verbose2 or ns.verbose3): + if ns.pgo and (ns.verbose or ns.rerun or ns.verbose3): parser.error("--pgo/-v don't go together!") if ns.pgo_extended: ns.pgo = True # pgo_extended implies pgo diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 6e6423e156781b..77a4090a826e06 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -11,11 +11,11 @@ import unittest from test.libregrtest.cmdline import _parse_args from test.libregrtest.runtest import ( - findtests, split_test_packages, runtest, get_abs_module, - PROGRESS_MIN_TIME, State) + findtests, split_test_packages, runtest, abs_module_name, + PROGRESS_MIN_TIME, State, MatchTestsDict, RunTests) from test.libregrtest.setup import setup_tests from test.libregrtest.pgo import setup_pgo_tests -from test.libregrtest.utils import (removepy, count, format_duration, +from test.libregrtest.utils import (strip_py_suffix, count, format_duration, printlist, get_build_info) from test import support from test.support import TestStats @@ -28,14 +28,6 @@ # Must be smaller than buildbot "1200 seconds without output" limit. EXIT_TIMEOUT = 120.0 -# gh-90681: When rerunning tests, we might need to rerun the whole -# class or module suite if some its life-cycle hooks fail. -# Test level hooks are not affected. -_TEST_LIFECYCLE_HOOKS = frozenset(( - 'setUpClass', 'tearDownClass', - 'setUpModule', 'tearDownModule', -)) - EXITCODE_BAD_TEST = 2 EXITCODE_INTERRUPTED = 130 EXITCODE_ENV_CHANGED = 3 @@ -72,19 +64,22 @@ def __init__(self): # tests self.tests = [] self.selected = [] + self.all_runtests: list[RunTests] = [] # test results - self.good = [] - self.bad = [] - self.skipped = [] - self.resource_denied = [] - self.environment_changed = [] - self.run_no_tests = [] - self.need_rerun = [] - self.rerun = [] - self.first_result = None + self.good: list[str] = [] + self.bad: list[str] = [] + self.rerun_bad: list[str] = [] + self.skipped: list[str] = [] + self.resource_denied: list[str] = [] + self.environment_changed: list[str] = [] + self.run_no_tests: list[str] = [] + self.rerun: list[str] = [] + + self.need_rerun: list[TestResult] = [] + self.first_state: str | None = None self.interrupted = False - self.stats_dict: dict[str, TestStats] = {} + self.total_stats = TestStats() # used by --slow self.test_times = [] @@ -94,7 +89,7 @@ def __init__(self): # used to display the progress bar "[ 3/100]" self.start_time = time.perf_counter() - self.test_count = '' + self.test_count_text = '' self.test_count_width = 1 # used by --single @@ -107,7 +102,6 @@ def __init__(self): # 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) @@ -115,11 +109,9 @@ def get_executed(self): | set(self.run_no_tests)) def accumulate_result(self, result, rerun=False): + fail_env_changed = self.ns.fail_env_changed test_name = result.test_name - if result.has_meaningful_duration() and not rerun: - self.test_times.append((result.duration, test_name)) - match result.state: case State.PASSED: self.good.append(test_name) @@ -128,25 +120,24 @@ def accumulate_result(self, result, rerun=False): case State.SKIPPED: self.skipped.append(test_name) case State.RESOURCE_DENIED: - self.skipped.append(test_name) self.resource_denied.append(test_name) case State.INTERRUPTED: self.interrupted = True case State.DID_NOT_RUN: self.run_no_tests.append(test_name) case _: - if result.is_failed(self.ns.fail_env_changed): - if not rerun: - self.bad.append(test_name) - self.need_rerun.append(result) + if result.is_failed(fail_env_changed): + self.bad.append(test_name) + self.need_rerun.append(result) else: - raise ValueError(f"invalid test state: {state!r}") + raise ValueError(f"invalid test state: {result.state!r}") + if result.has_meaningful_duration() and not rerun: + self.test_times.append((result.duration, test_name)) if result.stats is not None: - self.stats_dict[result.test_name] = result.stats - - if rerun and not(result.is_failed(False) or result.state == State.INTERRUPTED): - self.bad.remove(test_name) + self.total_stats.accumulate(result.stats) + if rerun: + self.rerun.append(test_name) xml_data = result.xml_data if xml_data: @@ -180,13 +171,15 @@ def log(self, line=''): print(line, flush=True) def display_progress(self, test_index, text): - if self.ns.quiet: + quiet = self.ns.quiet + pgo = self.ns.pgo + if quiet: return # "[ 51/405/1] test_tcl passed" - line = f"{test_index:{self.test_count_width}}{self.test_count}" + line = f"{test_index:{self.test_count_width}}{self.test_count_text}" fails = len(self.bad) + len(self.environment_changed) - if fails and not self.ns.pgo: + if fails and not pgo: line = f"{line}/{fails}" self.log(f"[{line}] {text}") @@ -196,15 +189,7 @@ 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) + strip_py_suffix(ns.args) if ns.huntrleaks: warmup, repetitions, _ = ns.huntrleaks @@ -221,9 +206,18 @@ def parse_args(self, kwargs): self.ns = ns def find_tests(self, tests): + ns = self.ns + single = ns.single + fromfile = ns.fromfile + pgo = ns.pgo + exclude = ns.exclude + test_dir = ns.testdir + starting_test = ns.start + randomize = ns.randomize + self.tests = tests - if self.ns.single: + if single: self.next_single_filename = os.path.join(self.tmp_dir, 'pynexttest') try: with open(self.next_single_filename, 'r') as fp: @@ -232,12 +226,12 @@ def find_tests(self, tests): except OSError: pass - if self.ns.fromfile: + if fromfile: self.tests = [] # regex to match 'test_builtin' in line: # '0:00:00 [ 4/400] test_builtin -- test_dict took 1 sec' regex = re.compile(r'\btest_[a-zA-Z0-9_]+\b') - with open(os.path.join(os_helper.SAVEDCWD, self.ns.fromfile)) as fp: + with open(os.path.join(os_helper.SAVEDCWD, fromfile)) as fp: for line in fp: line = line.split('#', 1)[0] line = line.strip() @@ -245,22 +239,22 @@ def find_tests(self, tests): if match is not None: self.tests.append(match.group()) - removepy(self.tests) + strip_py_suffix(self.tests) - if self.ns.pgo: + if pgo: # add default PGO tests if no tests are specified - setup_pgo_tests(self.ns) + setup_pgo_tests(ns) - exclude = set() - if self.ns.exclude: - for arg in self.ns.args: - exclude.add(arg) - self.ns.args = [] + exclude_tests = set() + if exclude: + for arg in ns.args: + exclude_tests.add(arg) + ns.args = [] - alltests = findtests(testdir=self.ns.testdir, exclude=exclude) + alltests = findtests(testdir=test_dir, exclude=exclude_tests) - if not self.ns.fromfile: - self.selected = self.tests or self.ns.args + if not fromfile: + self.selected = self.tests or ns.args if self.selected: self.selected = split_test_packages(self.selected) else: @@ -268,7 +262,7 @@ def find_tests(self, tests): else: self.selected = self.tests - if self.ns.single: + if single: self.selected = self.selected[:1] try: pos = alltests.index(self.selected[0]) @@ -277,17 +271,17 @@ def find_tests(self, tests): pass # Remove all the selected tests that precede start if it's set. - if self.ns.start: + if starting_test: try: - del self.selected[:self.selected.index(self.ns.start)] + del self.selected[:self.selected.index(starting_test)] except ValueError: - print("Couldn't find starting test (%s), using all tests" - % self.ns.start, file=sys.stderr) + print(f"Cannot find starting test: {starting_test}") + sys.exit(1) - if self.ns.randomize: - if self.ns.random_seed is None: - self.ns.random_seed = random.randrange(10000000) - random.seed(self.ns.random_seed) + if randomize: + if ns.random_seed is None: + ns.random_seed = random.randrange(10000000) + random.seed(ns.random_seed) random.shuffle(self.selected) def list_tests(self): @@ -305,25 +299,63 @@ def _list_cases(self, suite): print(test.id()) def list_cases(self): + ns = self.ns + test_dir = ns.testdir support.verbose = False - support.set_match_tests(self.ns.match_tests, self.ns.ignore_tests) + support.set_match_tests(ns.match_tests, ns.ignore_tests) + skipped = [] for test_name in self.selected: - abstest = get_abs_module(self.ns, test_name) + module_name = abs_module_name(test_name, test_dir) try: - suite = unittest.defaultTestLoader.loadTestsFromName(abstest) + suite = unittest.defaultTestLoader.loadTestsFromName(module_name) self._list_cases(suite) except unittest.SkipTest: - self.skipped.append(test_name) + skipped.append(test_name) - if self.skipped: - print(file=sys.stderr) - print(count(len(self.skipped), "test"), "skipped:", file=sys.stderr) - printlist(self.skipped, file=sys.stderr) + if skipped: + sys.stdout.flush() + stderr = sys.stderr + print(file=stderr) + print(count(len(skipped), "test"), "skipped:", file=stderr) + printlist(skipped, file=stderr) - def rerun_failed_tests(self): - self.log() + def get_rerun_match(self, rerun_list) -> MatchTestsDict: + rerun_match_tests = {} + for result in rerun_list: + match_tests = result.get_rerun_match_tests() + # ignore empty match list + if match_tests: + rerun_match_tests[result.test_name] = match_tests + return rerun_match_tests + + def _rerun_failed_tests(self, need_rerun): + # Configure the runner to re-run tests + ns = self.ns + ns.verbose = True + ns.failfast = False + ns.verbose3 = False + ns.forever = False + if ns.use_mp is None: + ns.use_mp = 1 + + # Get tests to re-run + tests = [result.test_name for result in need_rerun] + match_tests = self.get_rerun_match(need_rerun) + self.set_tests(tests) + + # Clear previously failed tests + self.rerun_bad.extend(self.bad) + self.bad.clear() + self.need_rerun.clear() + + # Re-run failed tests + self.log(f"Re-running {len(tests)} failed tests in verbose mode in subprocesses") + runtests = RunTests(tests, match_tests=match_tests, rerun=True) + self.all_runtests.append(runtests) + self._run_tests_mp(runtests) + def rerun_failed_tests(self, need_rerun): if self.ns.python: # Temp patch for https://github.com/python/cpython/issues/94052 self.log( @@ -332,45 +364,10 @@ def rerun_failed_tests(self): ) return - self.ns.verbose = True - self.ns.failfast = False - self.ns.verbose3 = False - - self.first_result = self.get_tests_result() - - self.log("Re-running failed tests in verbose mode") - rerun_list = list(self.need_rerun) - self.need_rerun.clear() - for result in rerun_list: - test_name = result.test_name - self.rerun.append(test_name) + self.first_state = self.get_tests_state() - errors = result.errors or [] - failures = result.failures or [] - error_names = [ - self.normalize_test_name(test_full_name, is_error=True) - for (test_full_name, *_) in errors] - failure_names = [ - self.normalize_test_name(test_full_name) - for (test_full_name, *_) in failures] - self.ns.verbose = True - orig_match_tests = self.ns.match_tests - if errors or failures: - if self.ns.match_tests is None: - self.ns.match_tests = [] - self.ns.match_tests.extend(error_names) - self.ns.match_tests.extend(failure_names) - matching = "matching: " + ", ".join(self.ns.match_tests) - self.log(f"Re-running {test_name} in verbose mode ({matching})") - else: - self.log(f"Re-running {test_name} in verbose mode") - result = runtest(self.ns, test_name) - self.ns.match_tests = orig_match_tests - - self.accumulate_result(result, rerun=True) - - if result.state == State.INTERRUPTED: - break + print() + self._rerun_failed_tests(need_rerun) if self.bad: print(count(len(self.bad), 'test'), "failed again:") @@ -378,28 +375,17 @@ def rerun_failed_tests(self): self.display_result() - def normalize_test_name(self, test_full_name, *, is_error=False): - short_name = test_full_name.split(" ")[0] - if is_error and short_name in _TEST_LIFECYCLE_HOOKS: - # This means that we have a failure in a life-cycle hook, - # we need to rerun the whole module or class suite. - # Basically the error looks like this: - # ERROR: setUpClass (test.test_reg_ex.RegTest) - # or - # ERROR: setUpModule (test.test_reg_ex) - # So, we need to parse the class / module name. - lpar = test_full_name.index('(') - rpar = test_full_name.index(')') - return test_full_name[lpar + 1: rpar].split('.')[-1] - return short_name - def display_result(self): + pgo = self.ns.pgo + quiet = self.ns.quiet + print_slow = self.ns.print_slow + # If running the test suite for PGO then no one cares about results. - if self.ns.pgo: + if pgo: return print() - print("== Tests result: %s ==" % self.get_tests_result()) + print("== Tests result: %s ==" % self.get_tests_state()) if self.interrupted: print("Test suite interrupted by signal SIGINT.") @@ -410,7 +396,7 @@ def display_result(self): print(count(len(omitted), "test"), "omitted:") printlist(omitted) - if self.good and not self.ns.quiet: + if self.good and not quiet: print() if (not self.bad and not self.skipped @@ -419,7 +405,7 @@ def display_result(self): print("All", end=' ') print(count(len(self.good), "test"), "OK.") - if self.ns.print_slow: + if print_slow: self.test_times.sort(reverse=True) print() print("10 slowest tests:") @@ -437,11 +423,16 @@ def display_result(self): count(len(self.environment_changed), "test"))) printlist(self.environment_changed) - if self.skipped and not self.ns.quiet: + if self.skipped and not quiet: print() print(count(len(self.skipped), "test"), "skipped:") printlist(self.skipped) + if self.resource_denied and not quiet: + print() + print(count(len(self.resource_denied), "test"), "skipped (resource denied):") + printlist(self.resource_denied) + if self.rerun: print() print("%s:" % count(len(self.rerun), "re-run test")) @@ -452,40 +443,58 @@ def display_result(self): print(count(len(self.run_no_tests), "test"), "run no tests:") printlist(self.run_no_tests) - def run_tests_sequential(self): - if self.ns.trace: + def run_test(self, test_index, test_name, previous_test, save_modules): + text = test_name + if previous_test: + text = '%s -- %s' % (text, previous_test) + self.display_progress(test_index, text) + + if self.tracer: + # If we're tracing code coverage, then we don't exit with status + # if on a false return value from main. + cmd = ('result = runtest(self.ns, test_name); ' + 'self.accumulate_result(result)') + ns = dict(locals()) + self.tracer.runctx(cmd, globals=globals(), locals=ns) + result = ns['result'] + else: + result = runtest(self.ns, test_name) + self.accumulate_result(result) + + # Unload the newly imported modules (best effort finalization) + for module in sys.modules.keys(): + if module not in save_modules and module.startswith("test."): + support.unload(module) + + return result + + def run_tests_sequentially(self, runtests): + ns = self.ns + coverage = ns.trace + fail_fast = ns.failfast + fail_env_changed = ns.fail_env_changed + timeout = ns.timeout + + if coverage: import trace self.tracer = trace.Trace(trace=False, count=True) save_modules = sys.modules.keys() msg = "Run tests sequentially" - if self.ns.timeout: - msg += " (timeout: %s)" % format_duration(self.ns.timeout) + if timeout: + msg += " (timeout: %s)" % format_duration(timeout) self.log(msg) previous_test = None - for test_index, test_name in enumerate(self.tests, 1): + tests_iter = runtests.iter_tests() + for test_index, test_name in enumerate(tests_iter, 1): start_time = time.perf_counter() - text = test_name - if previous_test: - text = '%s -- %s' % (text, previous_test) - self.display_progress(test_index, text) - - if self.tracer: - # If we're tracing code coverage, then we don't exit with status - # if on a false return value from main. - cmd = ('result = runtest(self.ns, test_name); ' - 'self.accumulate_result(result)') - ns = dict(locals()) - self.tracer.runctx(cmd, globals=globals(), locals=ns) - result = ns['result'] - else: - result = runtest(self.ns, test_name) - self.accumulate_result(result) + result = self.run_test(test_index, test_name, + previous_test, save_modules) - if result.state == State.INTERRUPTED: + if result.must_stop(fail_fast, fail_env_changed): break previous_test = str(result) @@ -496,26 +505,9 @@ def run_tests_sequential(self): # be quiet: say nothing if the test passed shortly previous_test = None - # Unload the newly imported modules (best effort finalization) - for module in sys.modules.keys(): - if module not in save_modules and module.startswith("test."): - support.unload(module) - - if self.ns.failfast and result.is_failed(self.ns.fail_env_changed): - break - if previous_test: print(previous_test) - def _test_forever(self, tests): - while True: - for test_name in tests: - yield test_name - if self.bad: - return - if self.ns.fail_env_changed and self.environment_changed: - return - def display_header(self): # Print basic platform information print("==", platform.python_implementation(), *sys.version.split()) @@ -560,11 +552,13 @@ def no_tests_run(self): return not any((self.good, self.bad, self.skipped, self.interrupted, self.environment_changed)) - def get_tests_result(self): + def get_tests_state(self): + fail_env_changed = self.ns.fail_env_changed + result = [] if self.bad: result.append("FAILURE") - elif self.ns.fail_env_changed and self.environment_changed: + elif fail_env_changed and self.environment_changed: result.append("ENV CHANGED") elif self.no_tests_run(): result.append("NO TESTS RAN") @@ -576,10 +570,40 @@ def get_tests_result(self): result.append("SUCCESS") result = ', '.join(result) - if self.first_result: - result = '%s then %s' % (self.first_result, result) + if self.first_state: + result = '%s then %s' % (self.first_state, result) return result + def _run_tests_mp(self, runtests: RunTests) -> None: + from test.libregrtest.runtest_mp import run_tests_multiprocess + # If we're on windows and this is the parent runner (not a worker), + # track the load average. + if sys.platform == 'win32': + from test.libregrtest.win_utils import WindowsLoadTracker + + try: + self.win_load_tracker = WindowsLoadTracker() + except PermissionError as error: + # Standard accounts may not have access to the performance + # counters. + print(f'Failed to create WindowsLoadTracker: {error}') + + try: + run_tests_multiprocess(self, runtests) + finally: + if self.win_load_tracker is not None: + self.win_load_tracker.close() + self.win_load_tracker = None + + def set_tests(self, tests): + self.tests = tests + if self.ns.forever: + self.test_count_text = '' + self.test_count_width = 3 + else: + self.test_count_text = '/{}'.format(len(self.tests)) + self.test_count_width = len(self.test_count_text) - 1 + def run_tests(self): # For a partial run, we do not need to clutter the output. if (self.ns.header @@ -597,37 +621,14 @@ def run_tests(self): if self.ns.randomize: print("Using random seed", self.ns.random_seed) - if self.ns.forever: - self.tests = self._test_forever(list(self.selected)) - self.test_count = '' - self.test_count_width = 3 - else: - self.tests = iter(self.selected) - self.test_count = '/{}'.format(len(self.selected)) - self.test_count_width = len(self.test_count) - 1 - + tests = self.selected + self.set_tests(tests) + runtests = RunTests(tests, forever=self.ns.forever) + self.all_runtests.append(runtests) if self.ns.use_mp: - from test.libregrtest.runtest_mp import run_tests_multiprocess - # If we're on windows and this is the parent runner (not a worker), - # track the load average. - if sys.platform == 'win32' and self.worker_test_name is None: - from test.libregrtest.win_utils import WindowsLoadTracker - - try: - self.win_load_tracker = WindowsLoadTracker() - except PermissionError as error: - # Standard accounts may not have access to the performance - # counters. - print(f'Failed to create WindowsLoadTracker: {error}') - - try: - run_tests_multiprocess(self) - finally: - if self.win_load_tracker is not None: - self.win_load_tracker.close() - self.win_load_tracker = None + self._run_tests_mp(runtests) else: - self.run_tests_sequential() + self.run_tests_sequentially(runtests) def finalize(self): if self.next_single_filename: @@ -642,23 +643,29 @@ def finalize(self): r.write_results(show_missing=True, summary=True, coverdir=self.ns.coverdir) - print() - self.display_summary() - if self.ns.runleaks: os.system("leaks %d" % os.getpid()) + self.save_xml_result() + def display_summary(self): duration = time.perf_counter() - self.start_time + first_runtests = self.all_runtests[0] + # the second runtests (re-run failed tests) disables forever, + # use the first runtests + forever = first_runtests.forever + filtered = bool(self.ns.match_tests) or bool(self.ns.ignore_tests) # Total duration + print() print("Total duration: %s" % format_duration(duration)) # Total tests - total = TestStats() - for stats in self.stats_dict.values(): - total.accumulate(stats) - stats = [f'run={total.tests_run:,}'] + total = self.total_stats + text = f'run={total.tests_run:,}' + if filtered: + text = f"{text} (filtered)" + stats = [text] if total.failures: stats.append(f'failures={total.failures:,}') if total.skipped: @@ -666,23 +673,31 @@ def display_summary(self): print(f"Total tests: {' '.join(stats)}") # Total test files - report = [f'success={len(self.good)}'] - if self.bad: - report.append(f'failed={len(self.bad)}') - if self.environment_changed: - report.append(f'env_changed={len(self.environment_changed)}') - if self.skipped: - report.append(f'skipped={len(self.skipped)}') - if self.resource_denied: - report.append(f'resource_denied={len(self.resource_denied)}') - if self.rerun: - report.append(f'rerun={len(self.rerun)}') - if self.run_no_tests: - report.append(f'run_no_tests={len(self.run_no_tests)}') + all_tests = [self.good, self.bad, self.rerun, + self.skipped, + self.environment_changed, self.run_no_tests] + run = sum(map(len, all_tests)) + text = f'run={run}' + if not forever: + ntest = len(first_runtests.tests) + text = f"{text}/{ntest}" + if filtered: + text = f"{text} (filtered)" + report = [text] + for name, tests in ( + ('failed', self.bad), + ('env_changed', self.environment_changed), + ('skipped', self.skipped), + ('resource_denied', self.resource_denied), + ('rerun', self.rerun), + ('run_no_tests', self.run_no_tests), + ): + if tests: + report.append(f'{name}={len(tests)}') print(f"Total test files: {' '.join(report)}") # Result - result = self.get_tests_result() + result = self.get_tests_state() print(f"Result: {result}") def save_xml_result(self): @@ -742,6 +757,9 @@ def set_temp_dir(self): self.tmp_dir = os.path.abspath(self.tmp_dir) + def is_worker(self): + return (self.ns.worker_args is not None) + def create_temp_dir(self): os.makedirs(self.tmp_dir, exist_ok=True) @@ -754,7 +772,8 @@ def create_temp_dir(self): nounce = random.randint(0, 1_000_000) else: nounce = os.getpid() - if self.worker_test_name is not None: + + if self.is_worker(): test_cwd = 'test_python_worker_{}'.format(nounce) else: test_cwd = 'test_python_{}'.format(nounce) @@ -817,48 +836,53 @@ def getloadavg(self): return None + def get_exitcode(self): + exitcode = 0 + if self.bad: + exitcode = EXITCODE_BAD_TEST + elif self.interrupted: + exitcode = EXITCODE_INTERRUPTED + elif self.ns.fail_env_changed and self.environment_changed: + exitcode = EXITCODE_ENV_CHANGED + elif self.no_tests_run(): + exitcode = EXITCODE_NO_TESTS_RAN + elif self.rerun and self.ns.fail_rerun: + exitcode = EXITCODE_BAD_TEST + return exitcode + + def action_run_tests(self): + self.run_tests() + self.display_result() + + need_rerun = self.need_rerun + if self.ns.rerun and need_rerun: + self.rerun_failed_tests(need_rerun) + + self.display_summary() + self.finalize() + def _main(self, tests, kwargs): - if self.worker_test_name is not None: + if self.is_worker(): from test.libregrtest.runtest_mp import run_tests_worker - run_tests_worker(self.ns, self.worker_test_name) + run_tests_worker(self.ns.worker_args) + return if self.ns.wait: input("Press any key to continue...") - support.PGO = self.ns.pgo - support.PGO_EXTENDED = self.ns.pgo_extended - setup_tests(self.ns) - self.find_tests(tests) + exitcode = 0 if self.ns.list_tests: self.list_tests() - sys.exit(0) - - if self.ns.list_cases: + elif self.ns.list_cases: self.list_cases() - sys.exit(0) - - self.run_tests() - self.display_result() - - if self.ns.verbose2 and self.bad: - self.rerun_failed_tests() - - self.finalize() - - self.save_xml_result() + else: + self.action_run_tests() + exitcode = self.get_exitcode() - if self.bad: - sys.exit(EXITCODE_BAD_TEST) - if self.interrupted: - sys.exit(EXITCODE_INTERRUPTED) - if self.ns.fail_env_changed and self.environment_changed: - sys.exit(EXITCODE_ENV_CHANGED) - if self.no_tests_run(): - sys.exit(EXITCODE_NO_TESTS_RAN) - sys.exit(0) + sys.exit(exitcode) def main(tests=None, **kwargs): diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index 6fa60697371b72..6e3fab1a88318f 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -1,7 +1,6 @@ import dataclasses import doctest import faulthandler -import functools import gc import importlib import io @@ -20,6 +19,10 @@ from test.libregrtest.utils import clear_caches, format_duration, print_warning +MatchTests = list[str] +MatchTestsDict = dict[str, MatchTests] + + # Avoid enum.Enum to reduce the number of imports when tests are run class State: PASSED = "PASSED" @@ -56,6 +59,41 @@ def has_meaningful_duration(state): State.MULTIPROCESSING_ERROR, State.DID_NOT_RUN} + @staticmethod + def must_stop(state): + return state in { + State.INTERRUPTED, + State.MULTIPROCESSING_ERROR} + + +# gh-90681: When rerunning tests, we might need to rerun the whole +# class or module suite if some its life-cycle hooks fail. +# Test level hooks are not affected. +_TEST_LIFECYCLE_HOOKS = frozenset(( + 'setUpClass', 'tearDownClass', + 'setUpModule', 'tearDownModule', +)) + +def normalize_test_name(test_full_name, *, is_error=False): + short_name = test_full_name.split(" ")[0] + if is_error and short_name in _TEST_LIFECYCLE_HOOKS: + if test_full_name.startswith(('setUpModule (', 'tearDownModule (')): + # if setUpModule() or tearDownModule() failed, don't filter + # tests with the test file name, don't use use filters. + return None + + # This means that we have a failure in a life-cycle hook, + # we need to rerun the whole module or class suite. + # Basically the error looks like this: + # ERROR: setUpClass (test.test_reg_ex.RegTest) + # or + # ERROR: setUpModule (test.test_reg_ex) + # So, we need to parse the class / module name. + lpar = test_full_name.index('(') + rpar = test_full_name.index(')') + return test_full_name[lpar + 1: rpar].split('.')[-1] + return short_name + @dataclasses.dataclass(slots=True) class TestResult: @@ -129,6 +167,58 @@ def set_env_changed(self): if self.state is None or self.state == State.PASSED: self.state = State.ENV_CHANGED + def must_stop(self, fail_fast: bool, fail_env_changed: bool) -> bool: + if State.must_stop(self.state): + return True + if fail_fast and self.is_failed(fail_env_changed): + return True + return False + + def get_rerun_match_tests(self): + match_tests = [] + + errors = self.errors or [] + failures = self.failures or [] + for error_list, is_error in ( + (errors, True), + (failures, False), + ): + for full_name, *_ in error_list: + match_name = normalize_test_name(full_name, is_error=is_error) + if match_name is None: + # 'setUpModule (test.test_sys)': don't filter tests + return None + if not match_name: + error_type = "ERROR" if is_error else "FAIL" + print_warning(f"rerun failed to parse {error_type} test name: " + f"{full_name!r}: don't filter tests") + return None + match_tests.append(match_name) + + return match_tests + + +@dataclasses.dataclass(slots=True, frozen=True) +class RunTests: + tests: list[str] + match_tests: MatchTestsDict | None = None + rerun: bool = False + forever: bool = False + + def get_match_tests(self, test_name) -> MatchTests | None: + if self.match_tests is not None: + return self.match_tests.get(test_name, None) + else: + return None + + def iter_tests(self): + tests = tuple(self.tests) + if self.forever: + while True: + yield from tests + else: + yield from tests + # Minimum duration of a test to display its duration or to mention that # the test is running in background @@ -147,9 +237,6 @@ def set_env_changed(self): "test_multiprocessing_spawn", } -# Storage of uncollectable objects -FOUND_GARBAGE = [] - def findtestdir(path=None): return path or os.path.dirname(os.path.dirname(__file__)) or os.curdir @@ -189,31 +276,41 @@ def split_test_packages(tests, *, testdir=None, exclude=(), return splitted -def get_abs_module(ns: Namespace, test_name: str) -> str: - if test_name.startswith('test.') or ns.testdir: +def abs_module_name(test_name: str, test_dir: str | None) -> str: + if test_name.startswith('test.') or test_dir: return test_name else: # Import it from the test package return 'test.' + test_name -def _runtest_capture_output_timeout_junit(result: TestResult, ns: Namespace) -> None: +def setup_support(ns: Namespace): + support.PGO = ns.pgo + support.PGO_EXTENDED = ns.pgo_extended + support.set_match_tests(ns.match_tests, ns.ignore_tests) + support.failfast = ns.failfast + support.verbose = ns.verbose + if ns.xmlpath: + support.junit_xml_list = [] + else: + support.junit_xml_list = None + + +def _runtest(result: TestResult, ns: Namespace) -> None: # Capture stdout and stderr, set faulthandler timeout, # and create JUnit XML report. - + verbose = ns.verbose output_on_failure = ns.verbose3 + timeout = ns.timeout use_timeout = ( - ns.timeout is not None and threading_helper.can_start_thread + timeout is not None and threading_helper.can_start_thread ) if use_timeout: - faulthandler.dump_traceback_later(ns.timeout, exit=True) + faulthandler.dump_traceback_later(timeout, exit=True) try: - support.set_match_tests(ns.match_tests, ns.ignore_tests) - support.junit_xml_list = xml_list = [] if ns.xmlpath else None - if ns.failfast: - support.failfast = True + setup_support(ns) if output_on_failure: support.verbose = True @@ -247,11 +344,10 @@ def _runtest_capture_output_timeout_junit(result: TestResult, ns: Namespace) -> sys.stderr.flush() else: # Tell tests to be moderately quiet - support.verbose = ns.verbose - - _runtest_env_changed_exc(result, ns, - display_failure=not ns.verbose) + support.verbose = verbose + _runtest_env_changed_exc(result, ns, display_failure=not verbose) + xml_list = support.junit_xml_list if xml_list: import xml.etree.ElementTree as ET result.xml_data = [ET.tostring(x).decode('us-ascii') @@ -276,7 +372,7 @@ def runtest(ns: Namespace, test_name: str) -> TestResult: start_time = time.perf_counter() result = TestResult(test_name) try: - _runtest_capture_output_timeout_junit(result, ns) + _runtest(result, ns) except: if not ns.pgo: msg = traceback.format_exc() @@ -287,9 +383,9 @@ def runtest(ns: Namespace, test_name: str) -> TestResult: return result -def _test_module(the_module): +def run_unittest(test_mod): loader = unittest.TestLoader() - tests = loader.loadTestsFromModule(the_module) + tests = loader.loadTestsFromModule(test_mod) for error in loader.errors: print(error, file=sys.stderr) if loader.errors: @@ -304,7 +400,6 @@ def save_env(ns: Namespace, test_name: str): def regrtest_runner(result, test_func, ns) -> None: # Run test_func(), collect statistics, and detect reference and memory # leaks. - if ns.huntrleaks: from test.libregrtest.refleak import dash_R refleak, test_result = dash_R(ns, result.test_name, test_func) @@ -332,24 +427,27 @@ def regrtest_runner(result, test_func, ns) -> None: result.stats = stats +# Storage of uncollectable objects +FOUND_GARBAGE = [] + + def _load_run_test(result: TestResult, ns: Namespace) -> None: # Load the test function, run the test function. + module_name = abs_module_name(result.test_name, ns.testdir) - abstest = get_abs_module(ns, result.test_name) - - # remove the module from sys.module to reload it if it was already imported - try: - del sys.modules[abstest] - except KeyError: - pass + # Remove the module from sys.module to reload it if it was already imported + sys.modules.pop(module_name, None) - the_module = importlib.import_module(abstest) + test_mod = importlib.import_module(module_name) # If the test has a test_main, that will run the appropriate - # tests. If not, use normal unittest test loading. - test_func = getattr(the_module, "test_main", None) - if test_func is None: - test_func = functools.partial(_test_module, the_module) + # tests. If not, use normal unittest test runner. + test_main = getattr(test_mod, "test_main", None) + if test_main is not None: + test_func = test_main + else: + def test_func(): + return run_unittest(test_mod) try: with save_env(ns, result.test_name): @@ -361,12 +459,12 @@ def _load_run_test(result: TestResult, ns: Namespace) -> None: # failures. support.gc_collect() - cleanup_test_droppings(result.test_name, ns.verbose) + remove_testfn(result.test_name, ns.verbose) if gc.garbage: support.environment_altered = True print_warning(f"{result.test_name} created {len(gc.garbage)} " - f"uncollectable object(s).") + f"uncollectable object(s)") # move the uncollectable objects somewhere, # so we don't see them again @@ -444,35 +542,37 @@ def _runtest_env_changed_exc(result: TestResult, ns: Namespace, result.state = State.PASSED -def cleanup_test_droppings(test_name: str, verbose: int) -> None: - # Try to clean up junk commonly left behind. While tests shouldn't leave - # any files or directories behind, when a test fails that can be tedious - # for it to arrange. The consequences can be especially nasty on Windows, - # since if a test leaves a file open, it cannot be deleted by name (while - # there's nothing we can do about that here either, we can display the - # name of the offending test, which is a real help). - for name in (os_helper.TESTFN,): - if not os.path.exists(name): - continue +def remove_testfn(test_name: str, verbose: int) -> None: + # Try to clean up os_helper.TESTFN if left behind. + # + # While tests shouldn't leave any files or directories behind, when a test + # fails that can be tedious for it to arrange. The consequences can be + # especially nasty on Windows, since if a test leaves a file open, it + # cannot be deleted by name (while there's nothing we can do about that + # here either, we can display the name of the offending test, which is a + # real help). + name = os_helper.TESTFN + if not os.path.exists(name): + return - if os.path.isdir(name): - import shutil - kind, nuker = "directory", shutil.rmtree - elif os.path.isfile(name): - kind, nuker = "file", os.unlink - else: - raise RuntimeError(f"os.path says {name!r} exists but is neither " - f"directory nor file") - - if verbose: - print_warning(f"{test_name} left behind {kind} {name!r}") - support.environment_altered = True - - try: - import stat - # fix possible permissions problems that might prevent cleanup - os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) - nuker(name) - except Exception as exc: - print_warning(f"{test_name} left behind {kind} {name!r} " - f"and it couldn't be removed: {exc}") + if os.path.isdir(name): + import shutil + kind, nuker = "directory", shutil.rmtree + elif os.path.isfile(name): + kind, nuker = "file", os.unlink + else: + raise RuntimeError(f"os.path says {name!r} exists but is neither " + f"directory nor file") + + if verbose: + print_warning(f"{test_name} left behind {kind} {name!r}") + support.environment_altered = True + + try: + import stat + # fix possible permissions problems that might prevent cleanup + os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) + nuker(name) + except Exception as exc: + print_warning(f"{test_name} left behind {kind} {name!r} " + f"and it couldn't be removed: {exc}") diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index fb1f80b0c054e3..60089554cab5dd 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -19,8 +19,8 @@ from test.libregrtest.cmdline import Namespace from test.libregrtest.main import Regrtest from test.libregrtest.runtest import ( - runtest, TestResult, State, - PROGRESS_MIN_TIME) + runtest, TestResult, State, PROGRESS_MIN_TIME, + MatchTests, RunTests) from test.libregrtest.setup import setup_tests from test.libregrtest.utils import format_duration, print_warning @@ -44,26 +44,54 @@ USE_PROCESS_GROUP = (hasattr(os, "setsid") and hasattr(os, "killpg")) -def must_stop(result: TestResult, ns: Namespace) -> bool: - if result.state == State.INTERRUPTED: - return True - if ns.failfast and result.is_failed(ns.fail_env_changed): - return True - return False +@dataclasses.dataclass(slots=True) +class WorkerJob: + test_name: str + namespace: Namespace + rerun: bool = False + match_tests: MatchTests | None = None -def parse_worker_args(worker_args) -> tuple[Namespace, str]: - ns_dict, test_name = json.loads(worker_args) - ns = Namespace(**ns_dict) - return (ns, test_name) +class _EncodeWorkerJob(json.JSONEncoder): + def default(self, o: Any) -> dict[str, Any]: + match o: + case WorkerJob(): + result = dataclasses.asdict(o) + result["__worker_job__"] = True + return result + case Namespace(): + result = vars(o) + result["__namespace__"] = True + return result + case _: + return super().default(o) + + +def _decode_worker_job(d: dict[str, Any]) -> WorkerJob | dict[str, Any]: + if "__worker_job__" in d: + d.pop('__worker_job__') + return WorkerJob(**d) + if "__namespace__" in d: + d.pop('__namespace__') + return Namespace(**d) + else: + return d + + +def _parse_worker_args(worker_json: str) -> tuple[Namespace, str]: + return json.loads(worker_json, + object_hook=_decode_worker_job) -def run_test_in_subprocess(testname: str, ns: Namespace, tmp_dir: str, stdout_fh: TextIO) -> subprocess.Popen: - ns_dict = vars(ns) - worker_args = (ns_dict, testname) - worker_args = json.dumps(worker_args) - if ns.python is not None: - executable = ns.python +def run_test_in_subprocess(worker_job: WorkerJob, + output_file: TextIO, + tmp_dir: str | None = None) -> subprocess.Popen: + ns = worker_job.namespace + python = ns.python + worker_args = json.dumps(worker_job, cls=_EncodeWorkerJob) + + if python is not None: + executable = python else: executable = [sys.executable] cmd = [*executable, *support.args_from_interpreter_flags(), @@ -82,9 +110,9 @@ def run_test_in_subprocess(testname: str, ns: Namespace, tmp_dir: str, stdout_fh # sysconfig.is_python_build() is true. See issue 15300. kw = dict( env=env, - stdout=stdout_fh, + stdout=output_file, # bpo-45410: Write stderr into stdout to keep messages order - stderr=stdout_fh, + stderr=output_file, text=True, close_fds=(os.name != 'nt'), cwd=os_helper.SAVEDCWD, @@ -94,11 +122,27 @@ def run_test_in_subprocess(testname: str, ns: Namespace, tmp_dir: str, stdout_fh return subprocess.Popen(cmd, **kw) -def run_tests_worker(ns: Namespace, test_name: str) -> NoReturn: +def run_tests_worker(worker_json: str) -> NoReturn: + worker_job = _parse_worker_args(worker_json) + ns = worker_job.namespace + test_name = worker_job.test_name + rerun = worker_job.rerun + match_tests = worker_job.match_tests + setup_tests(ns) - result = runtest(ns, test_name) + if rerun: + if match_tests: + matching = "matching: " + ", ".join(match_tests) + print(f"Re-running {test_name} in verbose mode ({matching})", flush=True) + else: + print(f"Re-running {test_name} in verbose mode", flush=True) + ns.verbose = True + if match_tests is not None: + ns.match_tests = match_tests + + result = runtest(ns, test_name) print() # Force a newline (just in case) # Serialize TestResult as dict in JSON @@ -148,11 +192,13 @@ class TestWorkerProcess(threading.Thread): def __init__(self, worker_id: int, runner: "MultiprocessTestRunner") -> None: super().__init__() self.worker_id = worker_id + self.runtests = runner.runtests self.pending = runner.pending self.output = runner.output self.ns = runner.ns self.timeout = runner.worker_timeout self.regrtest = runner.regrtest + self.rerun = runner.rerun self.current_test_name = None self.start_time = None self._popen = None @@ -216,10 +262,11 @@ def mp_result_error( ) -> MultiprocessResult: return MultiprocessResult(test_result, stdout, err_msg) - def _run_process(self, test_name: str, tmp_dir: str, stdout_fh: TextIO) -> int: - self.current_test_name = test_name + def _run_process(self, worker_job, output_file: TextIO, + tmp_dir: str | None = None) -> int: + self.current_test_name = worker_job.test_name try: - popen = run_test_in_subprocess(test_name, self.ns, tmp_dir, stdout_fh) + popen = run_test_in_subprocess(worker_job, output_file, tmp_dir) self._killed = False self._popen = popen @@ -277,9 +324,15 @@ def _runtest(self, test_name: str) -> MultiprocessResult: else: encoding = sys.stdout.encoding + match_tests = self.runtests.get_match_tests(test_name) + # gh-94026: Write stdout+stderr to a tempfile as workaround for # non-blocking pipes on Emscripten with NodeJS. - with tempfile.TemporaryFile('w+', encoding=encoding) as stdout_fh: + with tempfile.TemporaryFile('w+', encoding=encoding) as stdout_file: + worker_job = WorkerJob(test_name, + namespace=self.ns, + rerun=self.rerun, + match_tests=match_tests) # gh-93353: Check for leaked temporary files in the parent process, # since the deletion of temporary files can happen late during # Python finalization: too late for libregrtest. @@ -290,17 +343,17 @@ def _runtest(self, test_name: str) -> MultiprocessResult: tmp_dir = tempfile.mkdtemp(prefix="test_python_") tmp_dir = os.path.abspath(tmp_dir) try: - retcode = self._run_process(test_name, tmp_dir, stdout_fh) + retcode = self._run_process(worker_job, stdout_file, tmp_dir) finally: tmp_files = os.listdir(tmp_dir) os_helper.rmtree(tmp_dir) else: - retcode = self._run_process(test_name, None, stdout_fh) + retcode = self._run_process(worker_job, stdout_file) tmp_files = () - stdout_fh.seek(0) + stdout_file.seek(0) try: - stdout = stdout_fh.read().strip() + stdout = stdout_file.read().strip() except Exception as exc: # gh-101634: Catch UnicodeDecodeError if stdout cannot be # decoded from encoding @@ -342,6 +395,8 @@ def _runtest(self, test_name: str) -> MultiprocessResult: return MultiprocessResult(result, stdout) def run(self) -> None: + fail_fast = self.ns.failfast + fail_env_changed = self.ns.fail_env_changed while not self._stopped: try: try: @@ -354,7 +409,7 @@ def run(self) -> None: mp_result.result.duration = time.monotonic() - self.start_time self.output.put((False, mp_result)) - if must_stop(mp_result.result, self.ns): + if mp_result.result.must_stop(fail_fast, fail_env_changed): break except ExitThread: break @@ -410,29 +465,36 @@ def get_running(workers: list[TestWorkerProcess]) -> list[TestWorkerProcess]: class MultiprocessTestRunner: - def __init__(self, regrtest: Regrtest) -> None: + def __init__(self, regrtest: Regrtest, runtests: RunTests) -> None: + ns = regrtest.ns + timeout = ns.timeout + self.regrtest = regrtest + self.runtests = runtests + self.rerun = runtests.rerun self.log = self.regrtest.log - self.ns = regrtest.ns + self.ns = ns self.output: queue.Queue[QueueOutput] = queue.Queue() - self.pending = MultiprocessIterator(self.regrtest.tests) - if self.ns.timeout is not None: + tests_iter = runtests.iter_tests() + self.pending = MultiprocessIterator(tests_iter) + if timeout is not None: # Rely on faulthandler to kill a worker process. This timouet is # when faulthandler fails to kill a worker process. Give a maximum # of 5 minutes to faulthandler to kill the worker. - self.worker_timeout = min(self.ns.timeout * 1.5, - self.ns.timeout + 5 * 60) + self.worker_timeout = min(timeout * 1.5, timeout + 5 * 60) else: self.worker_timeout = None self.workers = None def start_workers(self) -> None: + use_mp = self.ns.use_mp + timeout = self.ns.timeout self.workers = [TestWorkerProcess(index, self) - for index in range(1, self.ns.use_mp + 1)] + for index in range(1, use_mp + 1)] msg = f"Run tests in parallel using {len(self.workers)} child processes" - if self.ns.timeout: + if timeout: msg += (" (timeout: %s, worker timeout: %s)" - % (format_duration(self.ns.timeout), + % (format_duration(timeout), format_duration(self.worker_timeout))) self.log(msg) for worker in self.workers: @@ -446,6 +508,7 @@ def stop_workers(self) -> None: worker.wait_stopped(start_time) def _get_result(self) -> QueueOutput | None: + pgo = self.ns.pgo use_faulthandler = (self.ns.timeout is not None) timeout = PROGRESS_UPDATE @@ -464,7 +527,7 @@ def _get_result(self) -> QueueOutput | None: # display progress running = get_running(self.workers) - if running and not self.ns.pgo: + if running and not pgo: self.log('running: %s' % ', '.join(running)) # all worker threads are done: consume pending results @@ -475,42 +538,46 @@ def _get_result(self) -> QueueOutput | None: def display_result(self, mp_result: MultiprocessResult) -> None: result = mp_result.result + pgo = self.ns.pgo text = str(result) if mp_result.err_msg: # MULTIPROCESSING_ERROR text += ' (%s)' % mp_result.err_msg - elif (result.duration >= PROGRESS_MIN_TIME and not self.ns.pgo): + elif (result.duration >= PROGRESS_MIN_TIME and not pgo): text += ' (%s)' % format_duration(result.duration) running = get_running(self.workers) - if running and not self.ns.pgo: + if running and not pgo: text += ' -- running: %s' % ', '.join(running) self.regrtest.display_progress(self.test_index, text) def _process_result(self, item: QueueOutput) -> bool: """Returns True if test runner must stop.""" + rerun = self.runtests.rerun if item[0]: # Thread got an exception format_exc = item[1] print_warning(f"regrtest worker thread failed: {format_exc}") result = TestResult("", state=State.MULTIPROCESSING_ERROR) - self.regrtest.accumulate_result(result) - return True + self.regrtest.accumulate_result(result, rerun=rerun) + return result self.test_index += 1 mp_result = item[1] - self.regrtest.accumulate_result(mp_result.result) + result = mp_result.result + self.regrtest.accumulate_result(result, rerun=rerun) self.display_result(mp_result) if mp_result.worker_stdout: print(mp_result.worker_stdout, flush=True) - if must_stop(mp_result.result, self.ns): - return True - - return False + return result def run_tests(self) -> None: + fail_fast = self.ns.failfast + fail_env_changed = self.ns.fail_env_changed + timeout = self.ns.timeout + self.start_workers() self.test_index = 0 @@ -520,14 +587,14 @@ def run_tests(self) -> None: if item is None: break - stop = self._process_result(item) - if stop: + result = self._process_result(item) + if result.must_stop(fail_fast, fail_env_changed): break except KeyboardInterrupt: print() self.regrtest.interrupted = True finally: - if self.ns.timeout is not None: + if timeout is not None: faulthandler.cancel_dump_traceback_later() # Always ensure that all worker processes are no longer @@ -536,8 +603,8 @@ def run_tests(self) -> None: self.stop_workers() -def run_tests_multiprocess(regrtest: Regrtest) -> None: - MultiprocessTestRunner(regrtest).run_tests() +def run_tests_multiprocess(regrtest: Regrtest, runtests: RunTests) -> None: + MultiprocessTestRunner(regrtest, runtests).run_tests() class EncodeTestResult(json.JSONEncoder): @@ -552,7 +619,7 @@ def default(self, o: Any) -> dict[str, Any]: return super().default(o) -def decode_test_result(d: dict[str, Any]) -> TestResult | TestStats | dict[str, Any]: +def decode_test_result(d: dict[str, Any]) -> TestResult | dict[str, Any]: """Decode a TestResult (sub)class object from a JSON dict.""" if "__test_result__" not in d: diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 89a149ec5d6b36..9a60a3d40b4c2c 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -31,7 +31,7 @@ def format_duration(seconds): return ' '.join(parts) -def removepy(names): +def strip_py_suffix(names: list[str]): if not names: return for idx, name in enumerate(names): diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index f28a3a2632c1c5..7bac1160fd8e0a 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -1189,7 +1189,6 @@ def _is_full_match_test(pattern): def set_match_tests(accept_patterns=None, ignore_patterns=None): global _match_test_func, _accept_test_patterns, _ignore_test_patterns - if accept_patterns is None: accept_patterns = () if ignore_patterns is None: diff --git a/Lib/test/support/testresult.py b/Lib/test/support/testresult.py index 14474be222dc4b..de23fdd59ded95 100644 --- a/Lib/test/support/testresult.py +++ b/Lib/test/support/testresult.py @@ -8,6 +8,7 @@ import time import traceback import unittest +from test import support class RegressionTestResult(unittest.TextTestResult): USE_XML = False @@ -112,6 +113,8 @@ def addExpectedFailure(self, test, err): def addFailure(self, test, err): self._add_result(test, True, failure=self.__makeErrorDict(*err)) super().addFailure(test, err) + if support.failfast: + self.stop() def addSkip(self, test, reason): self._add_result(test, skipped=reason) diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 1c02d802c0b061..eb321c4ca05f1a 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -5,6 +5,7 @@ """ import contextlib +import dataclasses import glob import io import locale @@ -21,6 +22,7 @@ from test import support from test.support import os_helper, TestStats from test.libregrtest import utils, setup +from test.libregrtest.runtest import normalize_test_name if not support.has_subprocess_support: raise unittest.SkipTest("test module requires subprocess") @@ -96,11 +98,11 @@ def test_verbose(self): ns = libregrtest._parse_args([]) self.assertEqual(ns.verbose, 0) - def test_verbose2(self): - for opt in '-w', '--verbose2': + def test_rerun(self): + for opt in '-w', '--rerun', '--verbose2': with self.subTest(opt=opt): ns = libregrtest._parse_args([opt]) - self.assertTrue(ns.verbose2) + self.assertTrue(ns.rerun) def test_verbose3(self): for opt in '-W', '--verbose3': @@ -362,6 +364,13 @@ def test_unknown_option(self): 'unrecognized arguments: --unknown-option') +@dataclasses.dataclass(slots=True) +class Rerun: + name: str + match: str | None + success: bool + + class BaseTestCase(unittest.TestCase): TEST_UNIQUE_ID = 1 TESTNAME_PREFIX = 'test_regrtest_' @@ -423,11 +432,11 @@ def parse_executed_tests(self, output): def check_executed_tests(self, output, tests, skipped=(), failed=(), env_changed=(), omitted=(), - rerun={}, run_no_tests=(), + rerun=None, run_no_tests=(), resource_denied=(), randomize=False, interrupted=False, fail_env_changed=False, - *, stats): + *, stats, forever=False, filtered=False): if isinstance(tests, str): tests = [tests] if isinstance(skipped, str): @@ -445,11 +454,20 @@ def check_executed_tests(self, output, tests, skipped=(), failed=(), if isinstance(stats, int): stats = TestStats(stats) + rerun_failed = [] + if rerun is not None: + failed = [rerun.name] + if not rerun.success: + rerun_failed.append(rerun.name) + executed = self.parse_executed_tests(output) + total_tests = list(tests) + if rerun is not None: + total_tests.append(rerun.name) if randomize: - self.assertEqual(set(executed), set(tests), output) + self.assertEqual(set(executed), set(total_tests), output) else: - self.assertEqual(executed, tests, output) + self.assertEqual(executed, total_tests, output) def plural(count): return 's' if count != 1 else '' @@ -465,6 +483,10 @@ def list_regex(line_format, tests): regex = list_regex('%s test%s skipped', skipped) self.check_line(output, regex) + if resource_denied: + regex = list_regex(r'%s test%s skipped \(resource denied\)', resource_denied) + self.check_line(output, regex) + if failed: regex = list_regex('%s test%s failed', failed) self.check_line(output, regex) @@ -478,32 +500,36 @@ def list_regex(line_format, tests): regex = list_regex('%s test%s omitted', omitted) self.check_line(output, regex) - if rerun: - regex = list_regex('%s re-run test%s', rerun.keys()) + if rerun is not None: + regex = list_regex('%s re-run test%s', [rerun.name]) self.check_line(output, regex) - regex = LOG_PREFIX + r"Re-running failed tests in verbose mode" + regex = LOG_PREFIX + fr"Re-running 1 failed tests in verbose mode" + self.check_line(output, regex) + regex = fr"Re-running {rerun.name} in verbose mode" + if rerun.match: + regex = fr"{regex} \(matching: {rerun.match}\)" self.check_line(output, regex) - for name, match in rerun.items(): - regex = LOG_PREFIX + f"Re-running {name} in verbose mode \\(matching: {match}\\)" - self.check_line(output, regex) if run_no_tests: regex = list_regex('%s test%s run no tests', run_no_tests) self.check_line(output, regex) - good = (len(tests) - len(skipped) - len(failed) + good = (len(tests) - len(skipped) - len(resource_denied) - len(failed) - len(omitted) - len(env_changed) - len(run_no_tests)) if good: - regex = r'%s test%s OK\.$' % (good, plural(good)) - if not skipped and not failed and good > 1: + regex = r'%s test%s OK\.' % (good, plural(good)) + if not skipped and not failed and (rerun is None or rerun.success) and good > 1: regex = 'All %s' % regex - self.check_line(output, regex) + self.check_line(output, regex, full=True) if interrupted: self.check_line(output, 'Test suite interrupted by signal SIGINT.') # Total tests - parts = [f'run={stats.tests_run:,}'] + text = f'run={stats.tests_run:,}' + if filtered: + text = fr'{text} \(filtered\)' + parts = [text] if stats.failures: parts.append(f'failures={stats.failures:,}') if stats.skipped: @@ -512,39 +538,52 @@ def list_regex(line_format, tests): self.check_line(output, line, full=True) # Total test files - report = [f'success={good}'] - if failed: - report.append(f'failed={len(failed)}') - if env_changed: - report.append(f'env_changed={len(env_changed)}') - if skipped: - report.append(f'skipped={len(skipped)}') - if resource_denied: - report.append(f'resource_denied={len(resource_denied)}') - if rerun: - report.append(f'rerun={len(rerun)}') - if run_no_tests: - report.append(f'run_no_tests={len(run_no_tests)}') + run = len(total_tests) - len(resource_denied) + if rerun is not None: + total_failed = len(rerun_failed) + total_rerun = 1 + else: + total_failed = len(failed) + total_rerun = 0 + if interrupted: + run = 0 + text = f'run={run}' + if not forever: + text = f'{text}/{len(tests)}' + if filtered: + text = fr'{text} \(filtered\)' + report = [text] + for name, ntest in ( + ('failed', total_failed), + ('env_changed', len(env_changed)), + ('skipped', len(skipped)), + ('resource_denied', len(resource_denied)), + ('rerun', total_rerun), + ('run_no_tests', len(run_no_tests)), + ): + if ntest: + report.append(f'{name}={ntest}') line = fr'Total test files: {" ".join(report)}' self.check_line(output, line, full=True) # Result - result = [] + state = [] if failed: - result.append('FAILURE') + state.append('FAILURE') elif fail_env_changed and env_changed: - result.append('ENV CHANGED') + state.append('ENV CHANGED') if interrupted: - result.append('INTERRUPTED') - if not any((good, result, failed, interrupted, skipped, + state.append('INTERRUPTED') + if not any((good, failed, interrupted, skipped, env_changed, fail_env_changed)): - result.append("NO TESTS RAN") - elif not result: - result.append('SUCCESS') - result = ', '.join(result) - if rerun: - result = 'FAILURE then %s' % result - self.check_line(output, f'Result: {result}', full=True) + state.append("NO TESTS RAN") + elif not state: + state.append('SUCCESS') + state = ', '.join(state) + if rerun is not None: + new_state = 'SUCCESS' if rerun.success else 'FAILURE' + state = 'FAILURE then ' + new_state + self.check_line(output, f'Result: {state}', full=True) def parse_random_seed(self, output): match = self.regex_search(r'Using random seed ([0-9]+)', output) @@ -563,13 +602,13 @@ def run_command(self, args, input=None, exitcode=0, **kw): stdout=subprocess.PIPE, **kw) if proc.returncode != exitcode: - msg = ("Command %s failed with exit code %s\n" + msg = ("Command %s failed with exit code %s, but exit code %s expected!\n" "\n" "stdout:\n" "---\n" "%s\n" "---\n" - % (str(args), proc.returncode, proc.stdout)) + % (str(args), proc.returncode, exitcode, proc.stdout)) if proc.stderr: msg += ("\n" "stderr:\n" @@ -738,6 +777,40 @@ def run_tests(self, *testargs, **kw): cmdargs = ['-m', 'test', '--testdir=%s' % self.tmptestdir, *testargs] return self.run_python(cmdargs, **kw) + def test_success(self): + code = textwrap.dedent(""" + import unittest + + class PassingTests(unittest.TestCase): + def test_test1(self): + pass + + def test_test2(self): + pass + + def test_test3(self): + pass + """) + tests = [self.create_test(f'ok{i}', code=code) for i in range(1, 6)] + + output = self.run_tests(*tests) + self.check_executed_tests(output, tests, + stats=3 * len(tests)) + + def test_skip(self): + code = textwrap.dedent(""" + import unittest + raise unittest.SkipTest("nope") + """) + test_ok = self.create_test('ok') + test_skip = self.create_test('skip', code=code) + tests = [test_ok, test_skip] + + output = self.run_tests(*tests) + self.check_executed_tests(output, tests, + skipped=[test_skip], + stats=1) + def test_failing_test(self): # test a failing test code = textwrap.dedent(""" @@ -777,14 +850,12 @@ def test_pass(self): # -u audio: 1 resource enabled output = self.run_tests('-uaudio', *test_names) self.check_executed_tests(output, test_names, - skipped=tests['network'], resource_denied=tests['network'], stats=1) # no option: 0 resources enabled - output = self.run_tests(*test_names) + output = self.run_tests(*test_names, exitcode=EXITCODE_NO_TESTS_RAN) self.check_executed_tests(output, test_names, - skipped=test_names, resource_denied=test_names, stats=0) @@ -930,9 +1001,21 @@ def test_run(self): builtins.__dict__['RUN'] = 1 """) test = self.create_test('forever', code=code) + + # --forever output = self.run_tests('--forever', test, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, [test]*3, failed=test, - stats=TestStats(1, 1)) + stats=TestStats(3, 1), + forever=True) + + # --forever --rerun + output = self.run_tests('--forever', '--rerun', test, exitcode=0) + self.check_executed_tests(output, [test]*3, + rerun=Rerun(test, + match='test_run', + success=True), + stats=TestStats(4, 1), + forever=True) def check_leak(self, code, what): test = self.create_test('huntrleaks', code=code) @@ -1143,33 +1226,55 @@ def test_fail_always(self): """) testname = self.create_test(code=code) - output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + output = self.run_tests("--rerun", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, [testname], - failed=testname, - rerun={testname: "test_fail_always"}, - stats=TestStats(1, 1)) + rerun=Rerun(testname, + "test_fail_always", + success=False), + stats=TestStats(3, 2)) def test_rerun_success(self): # FAILURE then SUCCESS - code = textwrap.dedent(""" - import builtins + marker_filename = os.path.abspath("regrtest_marker_filename") + self.addCleanup(os_helper.unlink, marker_filename) + self.assertFalse(os.path.exists(marker_filename)) + + code = textwrap.dedent(f""" + import os.path import unittest + marker_filename = {marker_filename!r} + class Tests(unittest.TestCase): def test_succeed(self): return def test_fail_once(self): - if not hasattr(builtins, '_test_failed'): - builtins._test_failed = True + if not os.path.exists(marker_filename): + open(marker_filename, "w").close() self.fail("bug") """) testname = self.create_test(code=code) - output = self.run_tests("-w", testname, exitcode=0) + # FAILURE then SUCCESS => exit code 0 + output = self.run_tests("--rerun", testname, exitcode=0) self.check_executed_tests(output, [testname], - rerun={testname: "test_fail_once"}, - stats=1) + rerun=Rerun(testname, + match="test_fail_once", + success=True), + stats=TestStats(3, 1)) + os_helper.unlink(marker_filename) + + # with --fail-rerun, exit code EXITCODE_BAD_TEST + # on "FAILURE then SUCCESS" state. + output = self.run_tests("--rerun", "--fail-rerun", testname, + exitcode=EXITCODE_BAD_TEST) + self.check_executed_tests(output, [testname], + rerun=Rerun(testname, + match="test_fail_once", + success=True), + stats=TestStats(3, 1)) + os_helper.unlink(marker_filename) def test_rerun_setup_class_hook_failure(self): # FAILURE then FAILURE @@ -1186,10 +1291,12 @@ def test_success(self): """) testname = self.create_test(code=code) - output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + output = self.run_tests("--rerun", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, testname, failed=[testname], - rerun={testname: "ExampleTests"}, + rerun=Rerun(testname, + match="ExampleTests", + success=False), stats=0) def test_rerun_teardown_class_hook_failure(self): @@ -1207,11 +1314,13 @@ def test_success(self): """) testname = self.create_test(code=code) - output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + output = self.run_tests("--rerun", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, testname, failed=[testname], - rerun={testname: "ExampleTests"}, - stats=1) + rerun=Rerun(testname, + match="ExampleTests", + success=False), + stats=2) def test_rerun_setup_module_hook_failure(self): # FAILURE then FAILURE @@ -1227,10 +1336,12 @@ def test_success(self): """) testname = self.create_test(code=code) - output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + output = self.run_tests("--rerun", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, testname, failed=[testname], - rerun={testname: testname}, + rerun=Rerun(testname, + match=None, + success=False), stats=0) def test_rerun_teardown_module_hook_failure(self): @@ -1247,11 +1358,13 @@ def test_success(self): """) testname = self.create_test(code=code) - output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) - self.check_executed_tests(output, testname, + output = self.run_tests("--rerun", testname, exitcode=EXITCODE_BAD_TEST) + self.check_executed_tests(output, [testname], failed=[testname], - rerun={testname: testname}, - stats=1) + rerun=Rerun(testname, + match=None, + success=False), + stats=2) def test_rerun_setup_hook_failure(self): # FAILURE then FAILURE @@ -1267,11 +1380,13 @@ def test_success(self): """) testname = self.create_test(code=code) - output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + output = self.run_tests("--rerun", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, testname, failed=[testname], - rerun={testname: "test_success"}, - stats=1) + rerun=Rerun(testname, + match="test_success", + success=False), + stats=2) def test_rerun_teardown_hook_failure(self): # FAILURE then FAILURE @@ -1287,11 +1402,13 @@ def test_success(self): """) testname = self.create_test(code=code) - output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + output = self.run_tests("--rerun", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, testname, failed=[testname], - rerun={testname: "test_success"}, - stats=1) + rerun=Rerun(testname, + match="test_success", + success=False), + stats=2) def test_rerun_async_setup_hook_failure(self): # FAILURE then FAILURE @@ -1307,11 +1424,12 @@ async def test_success(self): """) testname = self.create_test(code=code) - output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + output = self.run_tests("--rerun", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, testname, - failed=[testname], - rerun={testname: "test_success"}, - stats=1) + rerun=Rerun(testname, + match="test_success", + success=False), + stats=2) def test_rerun_async_teardown_hook_failure(self): # FAILURE then FAILURE @@ -1327,11 +1445,13 @@ async def test_success(self): """) testname = self.create_test(code=code) - output = self.run_tests("-w", testname, exitcode=EXITCODE_BAD_TEST) + output = self.run_tests("--rerun", testname, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, testname, failed=[testname], - rerun={testname: "test_success"}, - stats=1) + rerun=Rerun(testname, + match="test_success", + success=False), + stats=2) def test_no_tests_ran(self): code = textwrap.dedent(""" @@ -1347,7 +1467,7 @@ def test_bug(self): exitcode=EXITCODE_NO_TESTS_RAN) self.check_executed_tests(output, [testname], run_no_tests=testname, - stats=0) + stats=0, filtered=True) def test_no_tests_ran_skip(self): code = textwrap.dedent(""" @@ -1378,7 +1498,7 @@ def test_bug(self): exitcode=EXITCODE_NO_TESTS_RAN) self.check_executed_tests(output, [testname, testname2], run_no_tests=[testname, testname2], - stats=0) + stats=0, filtered=True) def test_no_test_ran_some_test_exist_some_not(self): code = textwrap.dedent(""" @@ -1402,7 +1522,7 @@ def test_other_bug(self): "-m", "test_other_bug", exitcode=0) self.check_executed_tests(output, [testname, testname2], run_no_tests=[testname], - stats=1) + stats=1, filtered=True) @support.cpython_only def test_uncollectable(self): @@ -1719,6 +1839,17 @@ def test_format_duration(self): self.assertEqual(utils.format_duration(3 * 3600 + 1), '3 hour 1 sec') + def test_normalize_test_name(self): + normalize = normalize_test_name + self.assertEqual(normalize('test_access (test.test_os.FileTests.test_access)'), + 'test_access') + self.assertEqual(normalize('setUpClass (test.test_os.ChownFileTests)', is_error=True), + 'ChownFileTests') + self.assertEqual(normalize('test_success (test.test_bug.ExampleTests.test_success)', is_error=True), + 'test_success') + self.assertIsNone(normalize('setUpModule (test.test_x)', is_error=True)) + self.assertIsNone(normalize('tearDownModule (test.test_module)', is_error=True)) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Tests/2023-09-03-02-01-55.gh-issue-108834.iAwXzj.rst b/Misc/NEWS.d/next/Tests/2023-09-03-02-01-55.gh-issue-108834.iAwXzj.rst new file mode 100644 index 00000000000000..43b9948db0075c --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-03-02-01-55.gh-issue-108834.iAwXzj.rst @@ -0,0 +1,6 @@ +When regrtest reruns failed tests in verbose mode (``./python -m test +--rerun``), tests are now rerun in fresh worker processes rather than being +executed in the main process. If a test does crash or is killed by a timeout, +the main process can detect and handle the killed worker process. Tests are +rerun in parallel if the ``-jN`` option is used to run tests in parallel. +Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2023-09-03-06-17-12.gh-issue-108834.fjV-CJ.rst b/Misc/NEWS.d/next/Tests/2023-09-03-06-17-12.gh-issue-108834.fjV-CJ.rst new file mode 100644 index 00000000000000..734cc66aebee15 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-03-06-17-12.gh-issue-108834.fjV-CJ.rst @@ -0,0 +1,2 @@ +Rename regrtest ``--verbose2`` option (``-w``) to ``--rerun``. Keep +``--verbose2`` as a deprecated alias. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2023-09-03-20-15-49.gh-issue-108834.Osvmhf.rst b/Misc/NEWS.d/next/Tests/2023-09-03-20-15-49.gh-issue-108834.Osvmhf.rst new file mode 100644 index 00000000000000..098861ffa30374 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-03-20-15-49.gh-issue-108834.Osvmhf.rst @@ -0,0 +1,3 @@ +Add ``--fail-rerun option`` option to regrtest: if a test failed when then +passed when rerun in verbose mode, exit the process with exit code 2 +(error), instead of exit code 0 (success). Patch by Victor Stinner. From 44fc378b598eb675a847d1b7c46c8f6e81313c04 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 4 Sep 2023 01:04:05 +0200 Subject: [PATCH 018/357] gh-108765: Move export code from pyport.h to exports.h (#108855) There is no API change, since pyport.h includes exports.h. --- Include/exports.h | 72 +++++++++++++++++++++++++++++++++++++++++++++++ Include/pyport.h | 71 ---------------------------------------------- 2 files changed, 72 insertions(+), 71 deletions(-) diff --git a/Include/exports.h b/Include/exports.h index 59373c39ff757c..ce601216f17156 100644 --- a/Include/exports.h +++ b/Include/exports.h @@ -1,6 +1,29 @@ #ifndef Py_EXPORTS_H #define Py_EXPORTS_H +/* Declarations for symbol visibility. + + PyAPI_FUNC(type): Declares a public Python API function and return type + PyAPI_DATA(type): Declares public Python data and its type + PyMODINIT_FUNC: A Python module init function. If these functions are + inside the Python core, they are private to the core. + If in an extension module, it may be declared with + external linkage depending on the platform. + + As a number of platforms support/require "__declspec(dllimport/dllexport)", + we support a HAVE_DECLSPEC_DLL macro to save duplication. +*/ + +/* + All windows ports, except cygwin, are handled in PC/pyconfig.h. + + Cygwin is the only other autoconf platform requiring special + linkage handling and it uses __declspec(). +*/ +#if defined(__CYGWIN__) +# define HAVE_DECLSPEC_DLL +#endif + #if defined(_WIN32) || defined(__CYGWIN__) #if defined(Py_ENABLE_SHARED) #define Py_IMPORTED_SYMBOL __declspec(dllimport) @@ -33,4 +56,53 @@ #endif #endif +/* only get special linkage if built as shared or platform is Cygwin */ +#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__) +# if defined(HAVE_DECLSPEC_DLL) +# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) +# define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE +# define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE + /* module init functions inside the core need no external linkage */ + /* except for Cygwin to handle embedding */ +# if defined(__CYGWIN__) +# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* +# else /* __CYGWIN__ */ +# define PyMODINIT_FUNC PyObject* +# endif /* __CYGWIN__ */ +# else /* Py_BUILD_CORE */ + /* Building an extension module, or an embedded situation */ + /* public Python functions and data are imported */ + /* Under Cygwin, auto-import functions to prevent compilation */ + /* failures similar to those described at the bottom of 4.1: */ + /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ +# if !defined(__CYGWIN__) +# define PyAPI_FUNC(RTYPE) Py_IMPORTED_SYMBOL RTYPE +# endif /* !__CYGWIN__ */ +# define PyAPI_DATA(RTYPE) extern Py_IMPORTED_SYMBOL RTYPE + /* module init functions outside the core must be exported */ +# if defined(__cplusplus) +# define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject* +# else /* __cplusplus */ +# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* +# endif /* __cplusplus */ +# endif /* Py_BUILD_CORE */ +# endif /* HAVE_DECLSPEC_DLL */ +#endif /* Py_ENABLE_SHARED */ + +/* If no external linkage macros defined by now, create defaults */ +#ifndef PyAPI_FUNC +# define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE +#endif +#ifndef PyAPI_DATA +# define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE +#endif +#ifndef PyMODINIT_FUNC +# if defined(__cplusplus) +# define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject* +# else /* __cplusplus */ +# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* +# endif /* __cplusplus */ +#endif + + #endif /* Py_EXPORTS_H */ diff --git a/Include/pyport.h b/Include/pyport.h index 4a21a446b3d904..4b6858bf527df1 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -355,79 +355,8 @@ extern "C" { # define Py_NO_INLINE #endif -/* Declarations for symbol visibility. - - PyAPI_FUNC(type): Declares a public Python API function and return type - PyAPI_DATA(type): Declares public Python data and its type - PyMODINIT_FUNC: A Python module init function. If these functions are - inside the Python core, they are private to the core. - If in an extension module, it may be declared with - external linkage depending on the platform. - - As a number of platforms support/require "__declspec(dllimport/dllexport)", - we support a HAVE_DECLSPEC_DLL macro to save duplication. -*/ - -/* - All windows ports, except cygwin, are handled in PC/pyconfig.h. - - Cygwin is the only other autoconf platform requiring special - linkage handling and it uses __declspec(). -*/ -#if defined(__CYGWIN__) -# define HAVE_DECLSPEC_DLL -#endif - #include "exports.h" -/* only get special linkage if built as shared or platform is Cygwin */ -#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__) -# if defined(HAVE_DECLSPEC_DLL) -# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) -# define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE -# define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE - /* module init functions inside the core need no external linkage */ - /* except for Cygwin to handle embedding */ -# if defined(__CYGWIN__) -# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* -# else /* __CYGWIN__ */ -# define PyMODINIT_FUNC PyObject* -# endif /* __CYGWIN__ */ -# else /* Py_BUILD_CORE */ - /* Building an extension module, or an embedded situation */ - /* public Python functions and data are imported */ - /* Under Cygwin, auto-import functions to prevent compilation */ - /* failures similar to those described at the bottom of 4.1: */ - /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ -# if !defined(__CYGWIN__) -# define PyAPI_FUNC(RTYPE) Py_IMPORTED_SYMBOL RTYPE -# endif /* !__CYGWIN__ */ -# define PyAPI_DATA(RTYPE) extern Py_IMPORTED_SYMBOL RTYPE - /* module init functions outside the core must be exported */ -# if defined(__cplusplus) -# define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject* -# else /* __cplusplus */ -# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* -# endif /* __cplusplus */ -# endif /* Py_BUILD_CORE */ -# endif /* HAVE_DECLSPEC_DLL */ -#endif /* Py_ENABLE_SHARED */ - -/* If no external linkage macros defined by now, create defaults */ -#ifndef PyAPI_FUNC -# define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE -#endif -#ifndef PyAPI_DATA -# define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE -#endif -#ifndef PyMODINIT_FUNC -# if defined(__cplusplus) -# define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject* -# else /* __cplusplus */ -# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* -# endif /* __cplusplus */ -#endif - /* limits.h constants that may be missing */ #ifndef INT_MAX From 5a79d2ae572fed03eb9b9554b2760a34e75191a7 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 4 Sep 2023 11:21:47 +0200 Subject: [PATCH 019/357] =?UTF-8?q?Revert=20"gh-46376:=20Return=20existing?= =?UTF-8?q?=20pointer=20when=20possible=20in=20ctypes=20(#1=E2=80=A6=20(#1?= =?UTF-8?q?08688)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 08447b5deb47e2a0df87fa0a0576d300e5c909b4. Revert also _ctypes.c changes of the PyDict_ContainsString() change, commit 67266266469fe0e817736227f39537182534c1a5. --- Lib/test/test_ctypes/test_keeprefs.py | 27 -------------- ...3-07-24-01-21-16.gh-issue-46376.w-xuDL.rst | 1 - Modules/_ctypes/_ctypes.c | 35 ------------------- 3 files changed, 63 deletions(-) delete mode 100644 Misc/NEWS.d/next/Library/2023-07-24-01-21-16.gh-issue-46376.w-xuDL.rst diff --git a/Lib/test/test_ctypes/test_keeprefs.py b/Lib/test/test_ctypes/test_keeprefs.py index c6fe1de62eae7c..23b03b64b4a716 100644 --- a/Lib/test/test_ctypes/test_keeprefs.py +++ b/Lib/test/test_ctypes/test_keeprefs.py @@ -98,33 +98,6 @@ def test_p_cint(self): x = pointer(i) self.assertEqual(x._objects, {'1': i}) - def test_pp_ownership(self): - d = c_int(123) - n = c_int(456) - - p = pointer(d) - pp = pointer(p) - - self.assertIs(pp._objects['1'], p) - self.assertIs(pp._objects['0']['1'], d) - - pp.contents.contents = n - - self.assertIs(pp._objects['1'], p) - self.assertIs(pp._objects['0']['1'], n) - - self.assertIs(p._objects['1'], n) - self.assertEqual(len(p._objects), 1) - - del d - del p - - self.assertIs(pp._objects['0']['1'], n) - self.assertEqual(len(pp._objects), 2) - - del n - - self.assertEqual(len(pp._objects), 2) class PointerToStructure(unittest.TestCase): def test(self): diff --git a/Misc/NEWS.d/next/Library/2023-07-24-01-21-16.gh-issue-46376.w-xuDL.rst b/Misc/NEWS.d/next/Library/2023-07-24-01-21-16.gh-issue-46376.w-xuDL.rst deleted file mode 100644 index 8e8f0245b4539b..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-07-24-01-21-16.gh-issue-46376.w-xuDL.rst +++ /dev/null @@ -1 +0,0 @@ -Prevent memory leak and use-after-free when using pointers to pointers with ctypes diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index ed9efcad9ab0c8..3af3a80bfb5e95 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -5148,41 +5148,6 @@ Pointer_get_contents(CDataObject *self, void *closure) stgdict = PyObject_stgdict((PyObject *)self); assert(stgdict); /* Cannot be NULL for pointer instances */ - - PyObject *keep = GetKeepedObjects(self); - if (keep != NULL) { - // check if it's a pointer to a pointer: - // pointers will have '0' key in the _objects - int ptr_probe = PyDict_ContainsString(keep, "0"); - if (ptr_probe < 0) { - return NULL; - } - if (ptr_probe) { - PyObject *item; - if (PyDict_GetItemStringRef(keep, "1", &item) < 0) { - return NULL; - } - if (item == NULL) { - PyErr_SetString(PyExc_ValueError, - "Unexpected NULL pointer in _objects"); - return NULL; - } -#ifndef NDEBUG - CDataObject *ptr2ptr = (CDataObject *)item; - // Don't construct a new object, - // return existing one instead to preserve refcount. - // Double-check that we are returning the same thing. - assert( - *(void**) self->b_ptr == ptr2ptr->b_ptr || - *(void**) self->b_value.c == ptr2ptr->b_ptr || - *(void**) self->b_ptr == ptr2ptr->b_value.c || - *(void**) self->b_value.c == ptr2ptr->b_value.c - ); -#endif - return item; - } - } - return PyCData_FromBaseObj(stgdict->proto, (PyObject *)self, 0, *(void **)self->b_ptr); From 76f3c043b6c5971d5a13fc6decf87a80ddf7ef95 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 4 Sep 2023 12:41:13 +0300 Subject: [PATCH 020/357] gh-89392: Remove test_main() in test_netrc (GH-108860) --- Lib/test/test_netrc.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_netrc.py b/Lib/test/test_netrc.py index b38cb327f68ecc..81e11a293cc4c8 100644 --- a/Lib/test/test_netrc.py +++ b/Lib/test/test_netrc.py @@ -1,5 +1,5 @@ import netrc, os, unittest, sys, textwrap -from test.support import os_helper, run_unittest +from test.support import os_helper try: import pwd @@ -308,8 +308,6 @@ def test_security(self): self.assertEqual(nrc.hosts['foo.domain.com'], ('anonymous', '', 'pass')) -def test_main(): - return run_unittest(NetrcTestCase) if __name__ == "__main__": - test_main() + unittest.main() From d0b22f6bd84239e50b43709f98f2bb950222cfe5 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 4 Sep 2023 12:41:58 +0300 Subject: [PATCH 021/357] gh-89392: Make test_pep646_syntax discoverable (GH-108861) --- Lib/test/test_pep646_syntax.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_pep646_syntax.py b/Lib/test/test_pep646_syntax.py index 12a4227e4dc959..def313da89acbd 100644 --- a/Lib/test/test_pep646_syntax.py +++ b/Lib/test/test_pep646_syntax.py @@ -1,3 +1,5 @@ +import doctest + doctests = """ Setup @@ -317,10 +319,10 @@ __test__ = {'doctests' : doctests} -def test_main(verbose=False): - from test import support - from test import test_pep646_syntax - return support.run_doctest(test_pep646_syntax, verbose) +def load_tests(loader, tests, pattern): + tests.addTest(doctest.DocTestSuite()) + return tests + if __name__ == "__main__": - test_main(verbose=True) + unittest.main() From 074ac1f72e392a576516639f650bac0519d1cb52 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 4 Sep 2023 13:04:32 +0300 Subject: [PATCH 022/357] bpo-45229: Make ElementTree tests discoverable (GH-108859) --- Lib/test/test_xml_etree.py | 66 ++++++++++-------------------------- Lib/test/test_xml_etree_c.py | 31 ++++++++++------- 2 files changed, 35 insertions(+), 62 deletions(-) diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index da2828c3b53af0..6d413aa68a338d 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -365,6 +365,7 @@ def test_path_cache(self): from xml.etree import ElementPath elem = ET.XML(SAMPLE_XML) + ElementPath._cache.clear() for i in range(10): ET.ElementTree(elem).find('./'+str(i)) cache_len_10 = len(ElementPath._cache) for i in range(10): ET.ElementTree(elem).find('./'+str(i)) @@ -3926,8 +3927,9 @@ def test_issue14818(self): # -------------------------------------------------------------------- class NoAcceleratorTest(unittest.TestCase): - def setUp(self): - if not pyET: + @classmethod + def setUpClass(cls): + if ET is not pyET: raise unittest.SkipTest('only for the Python version') # Test that the C accelerator was not imported for pyET @@ -4192,8 +4194,7 @@ def get_option(config, option_name, default=None): # -------------------------------------------------------------------- - -def test_main(module=None): +def setUpModule(module=None): # When invoked without a module, runs the Python ET tests by loading pyET. # Otherwise, uses the given module as the ET. global pyET @@ -4205,63 +4206,30 @@ def test_main(module=None): global ET ET = module - test_classes = [ - ModuleTest, - ElementSlicingTest, - BasicElementTest, - BadElementTest, - BadElementPathTest, - ElementTreeTest, - IOTest, - ParseErrorTest, - XIncludeTest, - ElementTreeTypeTest, - ElementFindTest, - ElementIterTest, - TreeBuilderTest, - XMLParserTest, - XMLPullParserTest, - BugsTest, - KeywordArgsTest, - BoolTest, - C14NTest, - ] - - # These tests will only run for the pure-Python version that doesn't import - # _elementtree. We can't use skipUnless here, because pyET is filled in only - # after the module is loaded. - if pyET is not ET: - test_classes.extend([ - NoAcceleratorTest, - ]) + # don't interfere with subsequent tests + def cleanup(): + global ET, pyET + ET = pyET = None + unittest.addModuleCleanup(cleanup) # Provide default namespace mapping and path cache. from xml.etree import ElementPath nsmap = ET.register_namespace._namespace_map # Copy the default namespace mapping nsmap_copy = nsmap.copy() + unittest.addModuleCleanup(nsmap.update, nsmap_copy) + unittest.addModuleCleanup(nsmap.clear) + # Copy the path cache (should be empty) path_cache = ElementPath._cache + unittest.addModuleCleanup(setattr, ElementPath, "_cache", path_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: - return support.run_unittest(*test_classes) - finally: - from xml.etree import ElementPath - # Restore mapping and path cache - 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 + unittest.addModuleCleanup(ET._set_factories, *old_factories) if __name__ == '__main__': - test_main() + unittest.main() diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py index fd27b575ec8dc9..3a0fc572f457ff 100644 --- a/Lib/test/test_xml_etree_c.py +++ b/Lib/test/test_xml_etree_c.py @@ -254,20 +254,25 @@ def test_element_with_children(self): self.check_sizeof(e, self.elementsize + self.extra + struct.calcsize('8P')) -def test_main(): - from test import test_xml_etree - - # Run the tests specific to the C implementation - support.run_unittest( - MiscTests, - TestAliasWorking, - TestAcceleratorImported, - SizeofTest, - ) - # Run the same test suite as the Python module - test_xml_etree.test_main(module=cET) +def install_tests(): + # Test classes should have __module__ referring to this module. + from test import test_xml_etree + for name, base in vars(test_xml_etree).items(): + if isinstance(base, type) and issubclass(base, unittest.TestCase): + class Temp(base): + pass + Temp.__name__ = Temp.__qualname__ = name + Temp.__module__ = __name__ + assert name not in globals() + globals()[name] = Temp + +install_tests() + +def setUpModule(): + from test import test_xml_etree + test_xml_etree.setUpModule(module=cET) if __name__ == '__main__': - test_main() + unittest.main() From 5a3672cb39544de72963cccde9799313bab14d07 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Mon, 4 Sep 2023 11:36:57 +0100 Subject: [PATCH 023/357] GH-108614: Remove `TIER_ONE` and `TIER_TWO` from `_PUSH_FRAME` (GH-108725) --- Include/internal/pycore_opcode_metadata.h | 6 ++-- Python/bytecodes.c | 20 +++++++----- Python/executor.c | 1 - Python/executor_cases.c.h | 20 +++++++----- Python/generated_cases.c.h | 40 +++++++++++++---------- 5 files changed, 47 insertions(+), 40 deletions(-) diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index aaf3541e095468..fa4cbd9ed31c01 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1421,9 +1421,9 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[OPCODE_METADATA_SIZE] = { [_CHECK_FUNCTION_EXACT_ARGS] = { true, INSTR_FMT_IBC0, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, [_CHECK_STACK_SPACE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, [_INIT_CALL_PY_EXACT_ARGS] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, - [_PUSH_FRAME] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG }, - [CALL_BOUND_METHOD_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, - [CALL_PY_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, + [_PUSH_FRAME] = { true, INSTR_FMT_IX, 0 }, + [CALL_BOUND_METHOD_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, + [CALL_PY_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, [CALL_PY_WITH_DEFAULTS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, [CALL_NO_KW_TYPE_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, [CALL_NO_KW_STR_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 7f398391c5dc34..fae1da31875d66 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -2974,6 +2974,7 @@ dummy_func( PyFunctionObject *func = (PyFunctionObject *)callable; PyCodeObject *code = (PyCodeObject *)func->func_code; DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize), CALL); + DEOPT_IF(tstate->py_recursion_remaining <= 1, CALL); } op(_INIT_CALL_PY_EXACT_ARGS, (callable, self_or_null, args[oparg] -- new_frame: _PyInterpreterFrame*)) { @@ -2998,18 +2999,19 @@ dummy_func( // Eventually this should be the only occurrence of this code. frame->return_offset = 0; assert(tstate->interp->eval_frame == NULL); - _PyFrame_SetStackPointer(frame, stack_pointer); + STORE_SP(); new_frame->previous = frame; CALL_STAT_INC(inlined_py_calls); frame = tstate->current_frame = new_frame; - #if TIER_ONE - goto start_frame; - #endif - #if TIER_TWO - ERROR_IF(_Py_EnterRecursivePy(tstate), exit_unwind); - stack_pointer = _PyFrame_GetStackPointer(frame); - ip_offset = (_Py_CODEUNIT *)_PyFrame_GetCode(frame)->co_code_adaptive; - #endif + tstate->py_recursion_remaining--; + LOAD_SP(); + LOAD_IP(); +#if LLTRACE && TIER_ONE + lltrace = maybe_lltrace_resume_frame(frame, &entry_frame, GLOBALS()); + if (lltrace < 0) { + goto exit_unwind; + } +#endif } macro(CALL_BOUND_METHOD_EXACT_ARGS) = diff --git a/Python/executor.c b/Python/executor.c index 9b3262ed4165f1..ac9104223da8ff 100644 --- a/Python/executor.c +++ b/Python/executor.c @@ -109,7 +109,6 @@ _PyUopExecute(_PyExecutorObject *executor, _PyInterpreterFrame *frame, PyObject pop_2_error: STACK_SHRINK(1); pop_1_error: -pop_1_exit_unwind: STACK_SHRINK(1); error: // On ERROR_IF we return NULL as the frame. diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index e63a36d61579a4..0d5606f5a44efe 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -2245,6 +2245,7 @@ PyFunctionObject *func = (PyFunctionObject *)callable; PyCodeObject *code = (PyCodeObject *)func->func_code; DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize), CALL); + DEOPT_IF(tstate->py_recursion_remaining <= 1, CALL); break; } @@ -2281,18 +2282,19 @@ // Eventually this should be the only occurrence of this code. frame->return_offset = 0; assert(tstate->interp->eval_frame == NULL); - _PyFrame_SetStackPointer(frame, stack_pointer); + STORE_SP(); new_frame->previous = frame; CALL_STAT_INC(inlined_py_calls); frame = tstate->current_frame = new_frame; - #if TIER_ONE - goto start_frame; - #endif - #if TIER_TWO - if (_Py_EnterRecursivePy(tstate)) goto pop_1_exit_unwind; - stack_pointer = _PyFrame_GetStackPointer(frame); - ip_offset = (_Py_CODEUNIT *)_PyFrame_GetCode(frame)->co_code_adaptive; - #endif + tstate->py_recursion_remaining--; + LOAD_SP(); + LOAD_IP(); +#if LLTRACE && TIER_ONE + lltrace = maybe_lltrace_resume_frame(frame, &entry_frame, GLOBALS()); + if (lltrace < 0) { + goto exit_unwind; + } +#endif break; } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index a7bf20b9d1c7f6..34cea84245f591 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -3843,6 +3843,7 @@ PyFunctionObject *func = (PyFunctionObject *)callable; PyCodeObject *code = (PyCodeObject *)func->func_code; DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize), CALL); + DEOPT_IF(tstate->py_recursion_remaining <= 1, CALL); } // _INIT_CALL_PY_EXACT_ARGS args = stack_pointer - oparg; @@ -3878,18 +3879,19 @@ // Eventually this should be the only occurrence of this code. frame->return_offset = 0; assert(tstate->interp->eval_frame == NULL); - _PyFrame_SetStackPointer(frame, stack_pointer); + STORE_SP(); new_frame->previous = frame; CALL_STAT_INC(inlined_py_calls); frame = tstate->current_frame = new_frame; - #if TIER_ONE - goto start_frame; - #endif - #if TIER_TWO - if (_Py_EnterRecursivePy(tstate)) goto pop_1_exit_unwind; - stack_pointer = _PyFrame_GetStackPointer(frame); - ip_offset = (_Py_CODEUNIT *)_PyFrame_GetCode(frame)->co_code_adaptive; - #endif + tstate->py_recursion_remaining--; + LOAD_SP(); + LOAD_IP(); + #if LLTRACE && TIER_ONE + lltrace = maybe_lltrace_resume_frame(frame, &entry_frame, GLOBALS()); + if (lltrace < 0) { + goto exit_unwind; + } + #endif } DISPATCH(); } @@ -3920,6 +3922,7 @@ PyFunctionObject *func = (PyFunctionObject *)callable; PyCodeObject *code = (PyCodeObject *)func->func_code; DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize), CALL); + DEOPT_IF(tstate->py_recursion_remaining <= 1, CALL); } // _INIT_CALL_PY_EXACT_ARGS args = stack_pointer - oparg; @@ -3955,18 +3958,19 @@ // Eventually this should be the only occurrence of this code. frame->return_offset = 0; assert(tstate->interp->eval_frame == NULL); - _PyFrame_SetStackPointer(frame, stack_pointer); + STORE_SP(); new_frame->previous = frame; CALL_STAT_INC(inlined_py_calls); frame = tstate->current_frame = new_frame; - #if TIER_ONE - goto start_frame; - #endif - #if TIER_TWO - if (_Py_EnterRecursivePy(tstate)) goto pop_1_exit_unwind; - stack_pointer = _PyFrame_GetStackPointer(frame); - ip_offset = (_Py_CODEUNIT *)_PyFrame_GetCode(frame)->co_code_adaptive; - #endif + tstate->py_recursion_remaining--; + LOAD_SP(); + LOAD_IP(); + #if LLTRACE && TIER_ONE + lltrace = maybe_lltrace_resume_frame(frame, &entry_frame, GLOBALS()); + if (lltrace < 0) { + goto exit_unwind; + } + #endif } DISPATCH(); } From f3b6608ba2b1db6ac449f656bf439bda8d66eb9f Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 4 Sep 2023 15:24:03 +0300 Subject: [PATCH 024/357] gh-89392: Fix running test_pep646_syntax as script (GH-108875) --- Lib/test/test_pep646_syntax.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_pep646_syntax.py b/Lib/test/test_pep646_syntax.py index def313da89acbd..aac089b190bc11 100644 --- a/Lib/test/test_pep646_syntax.py +++ b/Lib/test/test_pep646_syntax.py @@ -1,4 +1,5 @@ import doctest +import unittest doctests = """ From 40e52c94a27e4cd94b48e8a705914823cbb6afed Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Mon, 4 Sep 2023 15:46:00 +0200 Subject: [PATCH 025/357] gh-107902: Don't test setting suid/sgid on systems that don't support them (GH-108368) --- Lib/test/test_tarfile.py | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 0d6ca4315cfda4..67009a3d2e9c24 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -3808,34 +3808,43 @@ def test_modes(self): arc.add('read_group_only', mode='?---r-----') arc.add('no_bits', mode='?---------') arc.add('dir/', mode='?---rwsrwt') + arc.add('dir_all_bits/', mode='?rwsrwsrwt') - # On some systems, setting the sticky bit is a no-op. - # Check if that's the case. + # On some systems, setting the uid, gid, and/or sticky bit is a no-ops. + # Check which bits we can set, so we can compare tarfile machinery to + # a simple chmod. tmp_filename = os.path.join(TEMPDIR, "tmp.file") with open(tmp_filename, 'w'): pass - os.chmod(tmp_filename, os.stat(tmp_filename).st_mode | stat.S_ISVTX) - have_sticky_files = (os.stat(tmp_filename).st_mode & stat.S_ISVTX) + new_mode = (os.stat(tmp_filename).st_mode + | stat.S_ISVTX | stat.S_ISGID | stat.S_ISUID) + os.chmod(tmp_filename, new_mode) + got_mode = os.stat(tmp_filename).st_mode + _t_file = 't' if (got_mode & stat.S_ISVTX) else 'x' + _suid_file = 's' if (got_mode & stat.S_ISUID) else 'x' + _sgid_file = 's' if (got_mode & stat.S_ISGID) else 'x' os.unlink(tmp_filename) os.mkdir(tmp_filename) - os.chmod(tmp_filename, os.stat(tmp_filename).st_mode | stat.S_ISVTX) - have_sticky_dirs = (os.stat(tmp_filename).st_mode & stat.S_ISVTX) + new_mode = (os.stat(tmp_filename).st_mode + | stat.S_ISVTX | stat.S_ISGID | stat.S_ISUID) + os.chmod(tmp_filename, new_mode) + got_mode = os.stat(tmp_filename).st_mode + _t_dir = 't' if (got_mode & stat.S_ISVTX) else 'x' + _suid_dir = 's' if (got_mode & stat.S_ISUID) else 'x' + _sgid_dir = 's' if (got_mode & stat.S_ISGID) else 'x' os.rmdir(tmp_filename) with self.check_context(arc.open(), 'fully_trusted'): - if have_sticky_files: - self.expect_file('all_bits', mode='?rwsrwsrwt') - else: - self.expect_file('all_bits', mode='?rwsrwsrwx') + self.expect_file('all_bits', + mode=f'?rw{_suid_file}rw{_sgid_file}rw{_t_file}') self.expect_file('perm_bits', mode='?rwxrwxrwx') self.expect_file('exec_group_other', mode='?rw-rwxrwx') self.expect_file('read_group_only', mode='?---r-----') self.expect_file('no_bits', mode='?---------') - if have_sticky_dirs: - self.expect_file('dir/', mode='?---rwsrwt') - else: - self.expect_file('dir/', mode='?---rwsrwx') + self.expect_file('dir/', mode=f'?---rw{_sgid_dir}rw{_t_dir}') + self.expect_file('dir_all_bits/', + mode=f'?rw{_suid_dir}rw{_sgid_dir}rw{_t_dir}') with self.check_context(arc.open(), 'tar'): self.expect_file('all_bits', mode='?rwxr-xr-x') @@ -3844,6 +3853,7 @@ def test_modes(self): self.expect_file('read_group_only', mode='?---r-----') self.expect_file('no_bits', mode='?---------') self.expect_file('dir/', mode='?---r-xr-x') + self.expect_file('dir_all_bits/', mode='?rwxr-xr-x') with self.check_context(arc.open(), 'data'): normal_dir_mode = stat.filemode(stat.S_IMODE( @@ -3854,6 +3864,7 @@ def test_modes(self): self.expect_file('read_group_only', mode='?rw-r-----') self.expect_file('no_bits', mode='?rw-------') self.expect_file('dir/', mode=normal_dir_mode) + self.expect_file('dir_all_bits/', mode=normal_dir_mode) def test_pipe(self): # Test handling of a special file From 6ead5bd6ae20b902e6c11a3c0acede22632dc0d5 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Mon, 4 Sep 2023 21:31:58 +0300 Subject: [PATCH 026/357] Disable `differing_test_runners` health check (#108886) --- .github/workflows/build.yml | 2 +- Lib/test/support/hypothesis_helper.py | 5 ++++- Tools/requirements-hypothesis.txt | 4 ++++ 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 Tools/requirements-hypothesis.txt diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d37eb4447ad11a..bb568f8d3a1a12 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -431,7 +431,7 @@ jobs: VENV_PYTHON=$VENV_LOC/bin/python echo "HYPOVENV=${VENV_LOC}" >> $GITHUB_ENV echo "VENV_PYTHON=${VENV_PYTHON}" >> $GITHUB_ENV - ./python -m venv $VENV_LOC && $VENV_PYTHON -m pip install -U hypothesis + ./python -m venv $VENV_LOC && $VENV_PYTHON -m pip install -r ${GITHUB_WORKSPACE}/Tools/requirements-hypothesis.txt - name: 'Restore Hypothesis database' id: cache-hypothesis-database uses: actions/cache@v3 diff --git a/Lib/test/support/hypothesis_helper.py b/Lib/test/support/hypothesis_helper.py index da16eb50c25958..db93eea5e912e0 100644 --- a/Lib/test/support/hypothesis_helper.py +++ b/Lib/test/support/hypothesis_helper.py @@ -10,7 +10,10 @@ hypothesis.settings.register_profile( "slow-is-ok", deadline=None, - suppress_health_check=[hypothesis.HealthCheck.too_slow], + suppress_health_check=[ + hypothesis.HealthCheck.too_slow, + hypothesis.HealthCheck.differing_executors, + ], ) hypothesis.settings.load_profile("slow-is-ok") diff --git a/Tools/requirements-hypothesis.txt b/Tools/requirements-hypothesis.txt new file mode 100644 index 00000000000000..9db2b74c87cfb0 --- /dev/null +++ b/Tools/requirements-hypothesis.txt @@ -0,0 +1,4 @@ +# Requirements file for hypothesis that +# we use to run our property-based tests in CI. + +hypothesis==6.84.0 From 572678e1f864cb042df6962848a436d84ef7a8a4 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 4 Sep 2023 14:36:16 -0600 Subject: [PATCH 027/357] CI: Bump GitHub Actions (#108879) --- .github/workflows/build.yml | 20 +++++++++---------- .github/workflows/build_msi.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/mypy.yml | 2 +- .github/workflows/reusable-docs.yml | 6 +++--- .github/workflows/verify-ensurepip-wheels.yml | 2 +- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bb568f8d3a1a12..668ae499f06f17 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,7 +42,7 @@ jobs: run_hypothesis: ${{ steps.check.outputs.run_hypothesis }} config_hash: ${{ steps.config_hash.outputs.hash }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Check for source changes id: check run: | @@ -111,13 +111,13 @@ jobs: needs: check_source if: needs.check_source.outputs.run_tests == 'true' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Restore config.cache uses: actions/cache@v3 with: path: config.cache key: ${{ github.job }}-${{ runner.os }}-${{ needs.check_source.outputs.config_hash }} - - uses: actions/setup-python@v3 + - uses: actions/setup-python@v4 - name: Install Dependencies run: sudo ./.github/workflows/posix-deps-apt.sh - name: Add ccache to PATH @@ -174,7 +174,7 @@ jobs: env: IncludeUwp: 'true' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build CPython run: .\PCbuild\build.bat -e -d -p Win32 - name: Display build info @@ -191,7 +191,7 @@ jobs: env: IncludeUwp: 'true' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Register MSVC problem matcher run: echo "::add-matcher::.github/problem-matchers/msvc.json" - name: Build CPython @@ -213,7 +213,7 @@ jobs: HOMEBREW_NO_INSTALL_CLEANUP: 1 PYTHONSTRICTEXTENSIONBUILD: 1 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Restore config.cache uses: actions/cache@v3 with: @@ -247,7 +247,7 @@ jobs: OPENSSL_VER: 1.1.1v PYTHONSTRICTEXTENSIONBUILD: 1 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Register gcc problem matcher run: echo "::add-matcher::.github/problem-matchers/gcc.json" - name: Install Dependencies @@ -320,7 +320,7 @@ jobs: OPENSSL_DIR: ${{ github.workspace }}/multissl/openssl/${{ matrix.openssl_ver }} LD_LIBRARY_PATH: ${{ github.workspace }}/multissl/openssl/${{ matrix.openssl_ver }}/lib steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Restore config.cache uses: actions/cache@v3 with: @@ -368,7 +368,7 @@ jobs: OPENSSL_VER: 1.1.1v PYTHONSTRICTEXTENSIONBUILD: 1 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Register gcc problem matcher run: echo "::add-matcher::.github/problem-matchers/gcc.json" - name: Install Dependencies @@ -478,7 +478,7 @@ jobs: PYTHONSTRICTEXTENSIONBUILD: 1 ASAN_OPTIONS: detect_leaks=0:allocator_may_return_null=1:handle_segv=0 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Restore config.cache uses: actions/cache@v3 with: diff --git a/.github/workflows/build_msi.yml b/.github/workflows/build_msi.yml index 22f613a88aa11e..29282dffa37ec0 100644 --- a/.github/workflows/build_msi.yml +++ b/.github/workflows/build_msi.yml @@ -33,6 +33,6 @@ jobs: matrix: type: [x86, x64, arm64] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build CPython installer run: .\Tools\msi\build.bat --doc -${{ matrix.type }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4481ea80bfd936..27b04ba1d412e3 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -15,7 +15,7 @@ jobs: timeout-minutes: 10 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: python-version: "3.x" diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index 82714c20e968a9..fef7b02f47cdb7 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -39,7 +39,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: python-version: "3.11" diff --git a/.github/workflows/reusable-docs.yml b/.github/workflows/reusable-docs.yml index 6150b1a7d416a3..51efa54e8d1b3d 100644 --- a/.github/workflows/reusable-docs.yml +++ b/.github/workflows/reusable-docs.yml @@ -23,7 +23,7 @@ jobs: refspec_pr: '+${{ github.event.pull_request.head.sha }}:remotes/origin/${{ github.event.pull_request.head.ref }}' steps: - name: 'Check out latest PR branch commit' - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} # Adapted from https://github.com/actions/checkout/issues/520#issuecomment-1167205721 @@ -70,7 +70,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 60 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: 'Set up Python' uses: actions/setup-python@v4 with: @@ -88,7 +88,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 60 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/cache@v3 with: path: ~/.cache/pip diff --git a/.github/workflows/verify-ensurepip-wheels.yml b/.github/workflows/verify-ensurepip-wheels.yml index 17d841f1f1c54a..4a545037bf6e2b 100644 --- a/.github/workflows/verify-ensurepip-wheels.yml +++ b/.github/workflows/verify-ensurepip-wheels.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: python-version: '3' From 7855d325e638a4b7f7b40f2c35dc80de82d8fe70 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 4 Sep 2023 15:02:25 -0600 Subject: [PATCH 028/357] Link to PEP sections in What's New in 3.12 (#108878) --- Doc/whatsnew/3.12.rst | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index fb31a07930da25..62e470aa1b7b4c 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -67,7 +67,7 @@ Summary -- Release highlights New grammar features: -* :pep:`701`: Syntactic formalization of f-strings +* :ref:`whatsnew312-pep701` Interpreter improvements: @@ -75,13 +75,13 @@ Interpreter improvements: New typing features: -* :pep:`688`: Making the buffer protocol accessible in Python +* :ref:`whatsnew312-pep688` * :ref:`whatsnew312-pep692` * :ref:`whatsnew312-pep695` -* :pep:`698`: Override Decorator for Static Typing +* :ref:`whatsnew312-pep698` Important deprecations, removals or restrictions: @@ -267,6 +267,8 @@ Inlining does result in a few visible behavior changes: Contributed by Carl Meyer and Vladimir Matveev in :pep:`709`. +.. _whatsnew312-pep688: + PEP 688: Making the buffer protocol accessible in Python -------------------------------------------------------- @@ -340,6 +342,8 @@ See :pep:`692` for more details. (Contributed by Franek Magiera in :gh:`103629`.) +.. _whatsnew312-pep698: + PEP 698: Override Decorator for Static Typing --------------------------------------------- From 6304d983a0656c1841769bf36e5b42819508d21c Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Mon, 4 Sep 2023 14:44:40 -0700 Subject: [PATCH 029/357] gh-108463: Make expressions/statements work as expected in pdb (#108464) --- Doc/library/pdb.rst | 4 ++ Doc/whatsnew/3.13.rst | 4 ++ Lib/pdb.py | 3 ++ Lib/test/test_pdb.py | 40 +++++++++++++++++++ ...-08-25-00-14-34.gh-issue-108463.mQApp_.rst | 1 + 5 files changed, 52 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2023-08-25-00-14-34.gh-issue-108463.mQApp_.rst diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index 3aaac15ee5780c..002eeef4c09b5d 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -252,6 +252,10 @@ change a variable or call a function. When an exception occurs in such a statement, the exception name is printed but the debugger's state is not changed. +.. versionchanged:: 3.13 + Expressions/Statements whose prefix is a pdb command are now correctly + identified and executed. + The debugger supports :ref:`aliases `. Aliases can have parameters which allows one a certain level of adaptability to the context under examination. diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index 5d8ecbb193f157..de23172ac7a43b 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -173,6 +173,10 @@ pdb the new ``exceptions [exc_number]`` command for Pdb. (Contributed by Matthias Bussonnier in :gh:`106676`.) +* Expressions/Statements whose prefix is a pdb command are now correctly + identified and executed. + (Contributed by Tian Gao in :gh:`108464`.) + sqlite3 ------- diff --git a/Lib/pdb.py b/Lib/pdb.py index 90f26a2eb99848..b603aca8c04ee3 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -237,6 +237,9 @@ def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None, pass self.allow_kbdint = False self.nosigint = nosigint + # Consider these characters as part of the command so when the users type + # c.a or c['a'], it won't be recognized as a c(ontinue) command + self.identchars = cmd.Cmd.identchars + '=.[](),"\'+-*/%@&|<>~^' # Read ~/.pdbrc and ./.pdbrc self.rcLines = [] diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 734b5c83cdff7d..a9edd1a4d83cd9 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -1957,6 +1957,46 @@ def test_pdb_multiline_statement(): (Pdb) c """ +def test_pdb_show_attribute_and_item(): + """Test for multiline statement + + >>> def test_function(): + ... n = lambda x: x + ... c = {"a": 1} + ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() + ... pass + + >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE + ... 'c["a"]', + ... 'c.get("a")', + ... 'n(1)', + ... 'j=1', + ... 'j+1', + ... 'r"a"', + ... 'next(iter([1]))', + ... 'list((0, 1))', + ... 'c' + ... ]): + ... test_function() + > (5)test_function() + -> pass + (Pdb) c["a"] + 1 + (Pdb) c.get("a") + 1 + (Pdb) n(1) + 1 + (Pdb) j=1 + (Pdb) j+1 + 2 + (Pdb) r"a" + 'a' + (Pdb) next(iter([1])) + 1 + (Pdb) list((0, 1)) + [0, 1] + (Pdb) c + """ def test_pdb_issue_20766(): """Test for reference leaks when the SIGINT handler is set. diff --git a/Misc/NEWS.d/next/Library/2023-08-25-00-14-34.gh-issue-108463.mQApp_.rst b/Misc/NEWS.d/next/Library/2023-08-25-00-14-34.gh-issue-108463.mQApp_.rst new file mode 100644 index 00000000000000..a5ab8e2f9d4b59 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-08-25-00-14-34.gh-issue-108463.mQApp_.rst @@ -0,0 +1 @@ +Make expressions/statements work as expected in pdb From 676593859e75d4c3543d143092b77f55389006e4 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 5 Sep 2023 01:54:55 +0200 Subject: [PATCH 030/357] gh-106320: Remove private _PyErr_WriteUnraisableMsg() (#108863) Move the private _PyErr_WriteUnraisableMsg() functions to the internal C API (pycore_pyerrors.h). Move write_unraisable_exc() from _testcapi to _testinternalcapi. --- Include/cpython/pyerrors.h | 4 --- Include/internal/pycore_pyerrors.h | 5 ++++ Lib/test/audit-tests.py | 2 +- Lib/test/test_sys.py | 4 +-- Modules/_ctypes/_ctypes.c | 1 + Modules/_ctypes/callbacks.c | 6 ++--- Modules/_lsprof.c | 2 ++ Modules/_testcapi/clinic/exceptions.c.h | 34 +------------------------ Modules/_testcapi/exceptions.c | 31 ---------------------- Modules/_testinternalcapi.c | 33 +++++++++++++++++++++++- Modules/_threadmodule.c | 1 + Modules/atexitmodule.c | 3 ++- Modules/clinic/_testinternalcapi.c.h | 34 ++++++++++++++++++++++++- Modules/getpath.c | 1 + Python/compile.c | 1 + Python/perf_trampoline.c | 1 + 16 files changed, 86 insertions(+), 77 deletions(-) diff --git a/Include/cpython/pyerrors.h b/Include/cpython/pyerrors.h index 9633a5407f28a6..da96eec4b35aab 100644 --- a/Include/cpython/pyerrors.h +++ b/Include/cpython/pyerrors.h @@ -116,10 +116,6 @@ PyAPI_FUNC(PyObject *) PyErr_ProgramTextObject( PyObject *filename, int lineno); -PyAPI_FUNC(void) _PyErr_WriteUnraisableMsg( - const char *err_msg, - PyObject *obj); - PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalErrorFunc( const char *func, const char *message); diff --git a/Include/internal/pycore_pyerrors.h b/Include/internal/pycore_pyerrors.h index 0f16fb894d17e1..184eb35e52b47b 100644 --- a/Include/internal/pycore_pyerrors.h +++ b/Include/internal/pycore_pyerrors.h @@ -170,6 +170,11 @@ Py_DEPRECATED(3.12) extern void _PyErr_ChainExceptions(PyObject *, PyObject *, P // Export for '_zoneinfo' shared extension PyAPI_FUNC(void) _PyErr_ChainExceptions1(PyObject *); +// Export for '_lsprof' shared extension +PyAPI_FUNC(void) _PyErr_WriteUnraisableMsg( + const char *err_msg, + PyObject *obj); + #ifdef __cplusplus } #endif diff --git a/Lib/test/audit-tests.py b/Lib/test/audit-tests.py index ad8f72f556331d..f14c2635d39390 100644 --- a/Lib/test/audit-tests.py +++ b/Lib/test/audit-tests.py @@ -289,7 +289,7 @@ def hook(event, args): def test_unraisablehook(): - from _testcapi import write_unraisable_exc + from _testinternalcapi import write_unraisable_exc def unraisablehook(hookargs): pass diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index d8b684c8a008f0..e8a99244a3a28d 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -1199,11 +1199,11 @@ class MyType: @test.support.cpython_only class UnraisableHookTest(unittest.TestCase): def write_unraisable_exc(self, exc, err_msg, obj): - import _testcapi + import _testinternalcapi import types err_msg2 = f"Exception ignored {err_msg}" try: - _testcapi.write_unraisable_exc(exc, err_msg, obj) + _testinternalcapi.write_unraisable_exc(exc, err_msg, obj) return types.SimpleNamespace(exc_type=type(exc), exc_value=exc, exc_traceback=exc.__traceback__, diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 3af3a80bfb5e95..184af2132c2707 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -110,6 +110,7 @@ bytes(cdata) #include "pycore_call.h" // _PyObject_CallNoArgs() #include "pycore_ceval.h" // _Py_EnterRecursiveCall() +#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() #include diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index 0d8ecce009a67a..1bd8fec97179e9 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -8,9 +8,9 @@ # include #endif -#include "pycore_call.h" // _PyObject_CallNoArgs() -#include "pycore_runtime.h" // _PyRuntime -#include "pycore_global_objects.h" // _Py_ID() +#include "pycore_call.h" // _PyObject_CallNoArgs() +#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() +#include "pycore_runtime.h" // _Py_ID() #include diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index e7dcb6e1713212..d23a756ace887d 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -5,7 +5,9 @@ #include "Python.h" #include "pycore_call.h" // _PyObject_CallNoArgs() #include "pycore_ceval.h" // _PyEval_SetProfile() +#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() #include "pycore_pystate.h" // _PyThreadState_GET() + #include "rotatingtree.h" /************************************************************/ diff --git a/Modules/_testcapi/clinic/exceptions.c.h b/Modules/_testcapi/clinic/exceptions.c.h index 01881534329c9d..39b5f8b91a00db 100644 --- a/Modules/_testcapi/clinic/exceptions.c.h +++ b/Modules/_testcapi/clinic/exceptions.c.h @@ -394,38 +394,6 @@ PyDoc_STRVAR(_testcapi_set_exception__doc__, #define _TESTCAPI_SET_EXCEPTION_METHODDEF \ {"set_exception", (PyCFunction)_testcapi_set_exception, METH_O, _testcapi_set_exception__doc__}, -PyDoc_STRVAR(_testcapi_write_unraisable_exc__doc__, -"write_unraisable_exc($module, exception, err_msg, obj, /)\n" -"--\n" -"\n"); - -#define _TESTCAPI_WRITE_UNRAISABLE_EXC_METHODDEF \ - {"write_unraisable_exc", _PyCFunction_CAST(_testcapi_write_unraisable_exc), METH_FASTCALL, _testcapi_write_unraisable_exc__doc__}, - -static PyObject * -_testcapi_write_unraisable_exc_impl(PyObject *module, PyObject *exc, - PyObject *err_msg, PyObject *obj); - -static PyObject * -_testcapi_write_unraisable_exc(PyObject *module, PyObject *const *args, Py_ssize_t nargs) -{ - PyObject *return_value = NULL; - PyObject *exc; - PyObject *err_msg; - PyObject *obj; - - if (!_PyArg_CheckPositional("write_unraisable_exc", nargs, 3, 3)) { - goto exit; - } - exc = args[0]; - err_msg = args[1]; - obj = args[2]; - return_value = _testcapi_write_unraisable_exc_impl(module, exc, err_msg, obj); - -exit: - return return_value; -} - PyDoc_STRVAR(_testcapi_traceback_print__doc__, "traceback_print($module, traceback, file, /)\n" "--\n" @@ -487,4 +455,4 @@ _testcapi_unstable_exc_prep_reraise_star(PyObject *module, PyObject *const *args exit: return return_value; } -/*[clinic end generated code: output=8f273949da28ffb5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ff19512450b3bbdb input=a9049054013a1b77]*/ diff --git a/Modules/_testcapi/exceptions.c b/Modules/_testcapi/exceptions.c index 025b42db247e81..b1388d75711774 100644 --- a/Modules/_testcapi/exceptions.c +++ b/Modules/_testcapi/exceptions.c @@ -278,36 +278,6 @@ _testcapi_set_exception(PyObject *module, PyObject *new_exc) return exc; } -/*[clinic input] -_testcapi.write_unraisable_exc - exception as exc: object - err_msg: object - obj: object - / -[clinic start generated code]*/ - -static PyObject * -_testcapi_write_unraisable_exc_impl(PyObject *module, PyObject *exc, - PyObject *err_msg, PyObject *obj) -/*[clinic end generated code: output=39827c5e0a8c2092 input=582498da5b2ee6cf]*/ -{ - - 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_WriteUnraisableMsg(err_msg_utf8, obj); - Py_RETURN_NONE; -} - /*[clinic input] _testcapi.traceback_print traceback: object @@ -384,7 +354,6 @@ static PyMethodDef test_methods[] = { _TESTCAPI_SET_EXC_INFO_METHODDEF _TESTCAPI_SET_EXCEPTION_METHODDEF _TESTCAPI_TRACEBACK_PRINT_METHODDEF - _TESTCAPI_WRITE_UNRAISABLE_EXC_METHODDEF _TESTCAPI_UNSTABLE_EXC_PREP_RERAISE_STAR_METHODDEF {NULL}, }; diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 96d568294a9710..b6792e38fa98c2 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -26,7 +26,6 @@ #include "pycore_object.h" // _PyObject_IsFreed() #include "pycore_pathconfig.h" // _PyPathConfig_ClearGlobal() #include "pycore_pyerrors.h" // _PyErr_ChainExceptions1() -#include "pycore_pyerrors.h" // _Py_UTF8_Edit_Cost() #include "pycore_pystate.h" // _PyThreadState_GET() #include "interpreteridobject.h" // PyInterpreterID_LookUp() @@ -1448,6 +1447,37 @@ run_in_subinterp_with_config(PyObject *self, PyObject *args, PyObject *kwargs) } +/*[clinic input] +_testinternalcapi.write_unraisable_exc + exception as exc: object + err_msg: object + obj: object + / +[clinic start generated code]*/ + +static PyObject * +_testinternalcapi_write_unraisable_exc_impl(PyObject *module, PyObject *exc, + PyObject *err_msg, PyObject *obj) +/*[clinic end generated code: output=a0f063cdd04aad83 input=274381b1a3fa5cd6]*/ +{ + + 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_WriteUnraisableMsg(err_msg_utf8, obj); + Py_RETURN_NONE; +} + + static PyMethodDef module_functions[] = { {"get_configs", get_configs, METH_NOARGS}, {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, @@ -1503,6 +1533,7 @@ static PyMethodDef module_functions[] = { {"run_in_subinterp_with_config", _PyCFunction_CAST(run_in_subinterp_with_config), METH_VARARGS | METH_KEYWORDS}, + _TESTINTERNALCAPI_WRITE_UNRAISABLE_EXC_METHODDEF {NULL, NULL} /* sentinel */ }; diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 2cf866c5a11416..49f34fcb9feb70 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -7,6 +7,7 @@ #include "pycore_dict.h" // _PyDict_Pop() #include "pycore_interp.h" // _PyInterpreterState.threads.count #include "pycore_moduleobject.h" // _PyModule_GetState() +#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() #include "pycore_pylifecycle.h" #include "pycore_pystate.h" // _PyThreadState_SetCurrent() #include "pycore_sysmodule.h" // _PySys_GetAttr() diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index cec177cfc2f9c8..57e2ea67450453 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -7,9 +7,10 @@ */ #include "Python.h" -#include "pycore_atexit.h" +#include "pycore_atexit.h" // export _Py_AtExit() #include "pycore_initconfig.h" // _PyStatus_NO_MEMORY #include "pycore_interp.h" // PyInterpreterState.atexit +#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() #include "pycore_pystate.h" // _PyInterpreterState_GET /* ===================================================================== */ diff --git a/Modules/clinic/_testinternalcapi.c.h b/Modules/clinic/_testinternalcapi.c.h index 28761387023508..38a3579d7dec77 100644 --- a/Modules/clinic/_testinternalcapi.c.h +++ b/Modules/clinic/_testinternalcapi.c.h @@ -264,4 +264,36 @@ _testinternalcapi_assemble_code_object(PyObject *module, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=cba1c94ff4015b82 input=a9049054013a1b77]*/ + +PyDoc_STRVAR(_testinternalcapi_write_unraisable_exc__doc__, +"write_unraisable_exc($module, exception, err_msg, obj, /)\n" +"--\n" +"\n"); + +#define _TESTINTERNALCAPI_WRITE_UNRAISABLE_EXC_METHODDEF \ + {"write_unraisable_exc", _PyCFunction_CAST(_testinternalcapi_write_unraisable_exc), METH_FASTCALL, _testinternalcapi_write_unraisable_exc__doc__}, + +static PyObject * +_testinternalcapi_write_unraisable_exc_impl(PyObject *module, PyObject *exc, + PyObject *err_msg, PyObject *obj); + +static PyObject * +_testinternalcapi_write_unraisable_exc(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *exc; + PyObject *err_msg; + PyObject *obj; + + if (!_PyArg_CheckPositional("write_unraisable_exc", nargs, 3, 3)) { + goto exit; + } + exc = args[0]; + err_msg = args[1]; + obj = args[2]; + return_value = _testinternalcapi_write_unraisable_exc_impl(module, exc, err_msg, obj); + +exit: + return return_value; +} +/*[clinic end generated code: output=c7156622e80df1ce input=a9049054013a1b77]*/ diff --git a/Modules/getpath.c b/Modules/getpath.c index 71e23e1edaf11c..3b926cac0d3f24 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -4,6 +4,7 @@ #include "pycore_fileutils.h" // _Py_abspath() #include "pycore_initconfig.h" // _PyStatus_EXCEPTION() #include "pycore_pathconfig.h" // _PyPathConfig_ReadGlobal() +#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() #include "pycore_pymem.h" // _PyMem_RawWcsdup() #include "marshal.h" // PyMarshal_ReadObjectFromString diff --git a/Python/compile.c b/Python/compile.c index 50e29b4607f7ce..ae9edc90ea4367 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -34,6 +34,7 @@ #include "pycore_flowgraph.h" #include "pycore_intrinsics.h" #include "pycore_long.h" // _PyLong_GetZero() +#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() #include "pycore_pystate.h" // _Py_GetConfig() #include "pycore_setobject.h" // _PySet_NextEntry() #include "pycore_symtable.h" // PySTEntryObject, _PyFuture_FromAST() diff --git a/Python/perf_trampoline.c b/Python/perf_trampoline.c index 10675bf9f8292a..0f1af30226d9fb 100644 --- a/Python/perf_trampoline.c +++ b/Python/perf_trampoline.c @@ -133,6 +133,7 @@ any DWARF information available for them). #include "pycore_ceval.h" #include "pycore_frame.h" #include "pycore_interp.h" +#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() #ifdef PY_HAVE_PERF_TRAMPOLINE From 1170d5a292b46f754cd29c245a040f1602f70301 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 5 Sep 2023 03:09:42 +0200 Subject: [PATCH 031/357] gh-108834: regrtest --fail-rerun exits with code 5 (#108896) When the --fail-rerun option is used and a test fails and then pass, regrtest now uses exit code 5 ("rerun) instead of 2 ("bad test"). --- Lib/test/libregrtest/main.py | 5 +++-- Lib/test/test_regrtest.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 77a4090a826e06..ab03647ca5802f 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -29,9 +29,10 @@ EXIT_TIMEOUT = 120.0 EXITCODE_BAD_TEST = 2 -EXITCODE_INTERRUPTED = 130 EXITCODE_ENV_CHANGED = 3 EXITCODE_NO_TESTS_RAN = 4 +EXITCODE_RERUN_FAIL = 5 +EXITCODE_INTERRUPTED = 130 class Regrtest: @@ -847,7 +848,7 @@ def get_exitcode(self): elif self.no_tests_run(): exitcode = EXITCODE_NO_TESTS_RAN elif self.rerun and self.ns.fail_rerun: - exitcode = EXITCODE_BAD_TEST + exitcode = EXITCODE_RERUN_FAIL return exitcode def action_run_tests(self): diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index eb321c4ca05f1a..c5fb3dc9a11950 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -34,6 +34,7 @@ EXITCODE_BAD_TEST = 2 EXITCODE_ENV_CHANGED = 3 EXITCODE_NO_TESTS_RAN = 4 +EXITCODE_RERUN_FAIL = 5 EXITCODE_INTERRUPTED = 130 TEST_INTERRUPTED = textwrap.dedent(""" @@ -1265,10 +1266,10 @@ def test_fail_once(self): stats=TestStats(3, 1)) os_helper.unlink(marker_filename) - # with --fail-rerun, exit code EXITCODE_BAD_TEST + # with --fail-rerun, exit code EXITCODE_RERUN_FAIL # on "FAILURE then SUCCESS" state. output = self.run_tests("--rerun", "--fail-rerun", testname, - exitcode=EXITCODE_BAD_TEST) + exitcode=EXITCODE_RERUN_FAIL) self.check_executed_tests(output, [testname], rerun=Rerun(testname, match="test_fail_once", From 04a0830b00879efe057e3dfe75e9aa9c0caf1a26 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 5 Sep 2023 08:36:43 +0300 Subject: [PATCH 032/357] gh-89392: Remove support of test_main() in libregrtest (GH-108876) --- Lib/test/libregrtest/runtest.py | 13 +++++-------- Lib/test/test_regrtest.py | 8 ++++---- .../2023-09-04-15-18-14.gh-issue-89392.8A4T5p.rst | 2 ++ 3 files changed, 11 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-04-15-18-14.gh-issue-89392.8A4T5p.rst diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index 6e3fab1a88318f..9cb71fbfb1d178 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -440,14 +440,11 @@ def _load_run_test(result: TestResult, ns: Namespace) -> None: test_mod = importlib.import_module(module_name) - # If the test has a test_main, that will run the appropriate - # tests. If not, use normal unittest test runner. - test_main = getattr(test_mod, "test_main", None) - if test_main is not None: - test_func = test_main - else: - def test_func(): - return run_unittest(test_mod) + if hasattr(test_mod, "test_main"): + # https://github.com/python/cpython/issues/89392 + raise Exception("Module {result.test_name} defines test_main() which is no longer supported by regrtest") + def test_func(): + return run_unittest(test_mod) try: with save_env(ns, result.test_name): diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index c5fb3dc9a11950..aff5404408f8d0 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -1803,9 +1803,9 @@ def my_function(): 7948648 """ - def test_main(): - testmod = sys.modules[__name__] - return support.run_doctest(testmod) + def load_tests(loader, tests, pattern): + tests.addTest(doctest.DocTestSuite()) + return tests ''') testname = self.create_test(code=code) @@ -1814,7 +1814,7 @@ def test_main(): self.check_executed_tests(output, [testname], failed=[testname], randomize=True, - stats=TestStats(4, 2, 1)) + stats=TestStats(1, 1, 0)) class TestUtils(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Tests/2023-09-04-15-18-14.gh-issue-89392.8A4T5p.rst b/Misc/NEWS.d/next/Tests/2023-09-04-15-18-14.gh-issue-89392.8A4T5p.rst new file mode 100644 index 00000000000000..e1dea8e78cdd4e --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-04-15-18-14.gh-issue-89392.8A4T5p.rst @@ -0,0 +1,2 @@ +Removed support of ``test_main()`` function in tests. They now always use +normal unittest test runner. From 5a2a04615171899885b977d77dc379bd78bac87f Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Tue, 5 Sep 2023 08:03:53 +0100 Subject: [PATCH 033/357] GH-108390: Prevent non-local events being set with `sys.monitoring.set_local_events()` (GH-108420) --- Include/cpython/code.h | 17 ++- Include/internal/pycore_instruments.h | 2 +- Include/internal/pycore_interp.h | 2 +- Lib/test/test_monitoring.py | 30 +++- ...-08-13-17-18-22.gh-issue-108390.TkBccC.rst | 4 + Python/ceval.c | 32 +++-- Python/instrumentation.c | 130 +++++++++++------- 7 files changed, 143 insertions(+), 74 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-08-13-17-18-22.gh-issue-108390.TkBccC.rst diff --git a/Include/cpython/code.h b/Include/cpython/code.h index 24c5ec23590c94..45b09a1265df80 100644 --- a/Include/cpython/code.h +++ b/Include/cpython/code.h @@ -8,16 +8,21 @@ extern "C" { #endif - +/* Count of all local monitoring events */ +#define _PY_MONITORING_LOCAL_EVENTS 10 /* Count of all "real" monitoring events (not derived from other events) */ #define _PY_MONITORING_UNGROUPED_EVENTS 15 /* Count of all monitoring events */ #define _PY_MONITORING_EVENTS 17 -/* Table of which tools are active for each monitored event. */ -typedef struct _Py_Monitors { +/* Tables of which tools are active for each monitored event. */ +typedef struct _Py_LocalMonitors { + uint8_t tools[_PY_MONITORING_LOCAL_EVENTS]; +} _Py_LocalMonitors; + +typedef struct _Py_GlobalMonitors { uint8_t tools[_PY_MONITORING_UNGROUPED_EVENTS]; -} _Py_Monitors; +} _Py_GlobalMonitors; /* Each instruction in a code object is a fixed-width value, * currently 2 bytes: 1-byte opcode + 1-byte oparg. The EXTENDED_ARG @@ -88,9 +93,9 @@ typedef struct { */ typedef struct { /* Monitoring specific to this code object */ - _Py_Monitors local_monitors; + _Py_LocalMonitors local_monitors; /* Monitoring that is active on this code object */ - _Py_Monitors active_monitors; + _Py_LocalMonitors active_monitors; /* The tools that are to be notified for events for the matching code unit */ uint8_t *tools; /* Information to support line events */ diff --git a/Include/internal/pycore_instruments.h b/Include/internal/pycore_instruments.h index 43214aef7f7a1b..fad475c3dafb99 100644 --- a/Include/internal/pycore_instruments.h +++ b/Include/internal/pycore_instruments.h @@ -29,7 +29,7 @@ extern "C" { #define PY_MONITORING_EVENT_STOP_ITERATION 9 #define PY_MONITORING_IS_INSTRUMENTED_EVENT(ev) \ - ((ev) <= PY_MONITORING_EVENT_STOP_ITERATION) + ((ev) < _PY_MONITORING_LOCAL_EVENTS) /* Other events, mainly exceptions */ diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index f171c546efd53c..e0b7a325929257 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -187,7 +187,7 @@ struct _is { uint16_t optimizer_resume_threshold; uint16_t optimizer_backedge_threshold; - _Py_Monitors monitors; + _Py_GlobalMonitors monitors; bool f_opcode_trace_set; bool sys_profile_initialized; bool sys_trace_initialized; diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py index 845185be737eb2..95fe8d03b0b29a 100644 --- a/Lib/test/test_monitoring.py +++ b/Lib/test/test_monitoring.py @@ -1218,9 +1218,11 @@ def test_instruction_then_line(self): self.check_events(self.func2, recorders = recorders, must_include = self.MUST_INCLUDE_CI) +LOCAL_RECORDERS = CallRecorder, LineRecorder, CReturnRecorder, CRaiseRecorder + class TestLocalEvents(MonitoringTestBase, unittest.TestCase): - def check_events(self, func, expected, tool=TEST_TOOL, recorders=(ExceptionRecorder,)): + def check_events(self, func, expected, tool=TEST_TOOL, recorders=()): try: self.assertEqual(sys.monitoring._all_events(), {}) event_list = [] @@ -1248,7 +1250,7 @@ def func1(): line2 = 2 line3 = 3 - self.check_events(func1, recorders = MANY_RECORDERS, expected = [ + self.check_events(func1, recorders = LOCAL_RECORDERS, expected = [ ('line', 'func1', 1), ('line', 'func1', 2), ('line', 'func1', 3)]) @@ -1260,7 +1262,7 @@ def func2(): [].append(2) line3 = 3 - self.check_events(func2, recorders = MANY_RECORDERS, expected = [ + self.check_events(func2, recorders = LOCAL_RECORDERS, expected = [ ('line', 'func2', 1), ('line', 'func2', 2), ('call', 'append', [2]), @@ -1277,15 +1279,17 @@ def func3(): line = 5 line = 6 - self.check_events(func3, recorders = MANY_RECORDERS, expected = [ + self.check_events(func3, recorders = LOCAL_RECORDERS, expected = [ ('line', 'func3', 1), ('line', 'func3', 2), ('line', 'func3', 3), - ('raise', KeyError), ('line', 'func3', 4), ('line', 'func3', 5), ('line', 'func3', 6)]) + def test_set_non_local_event(self): + with self.assertRaises(ValueError): + sys.monitoring.set_local_events(TEST_TOOL, just_call.__code__, E.RAISE) def line_from_offset(code, offset): for start, end, line in code.co_lines(): @@ -1698,3 +1702,19 @@ def run(): self.assertEqual(caught, "inner") finally: sys.monitoring.set_events(TEST_TOOL, 0) + + def test_108390(self): + + class Foo: + def __init__(self, set_event): + if set_event: + sys.monitoring.set_events(TEST_TOOL, E.PY_RESUME) + + def make_foo_optimized_then_set_event(): + for i in range(100): + Foo(i == 99) + + try: + make_foo_optimized_then_set_event() + finally: + sys.monitoring.set_events(TEST_TOOL, 0) diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-08-13-17-18-22.gh-issue-108390.TkBccC.rst b/Misc/NEWS.d/next/Core and Builtins/2023-08-13-17-18-22.gh-issue-108390.TkBccC.rst new file mode 100644 index 00000000000000..3ed596007b56f7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-08-13-17-18-22.gh-issue-108390.TkBccC.rst @@ -0,0 +1,4 @@ +Raise an exception when setting a non-local event (``RAISE``, ``EXCEPTION_HANDLED``, +etc.) in ``sys.monitoring.set_local_events``. + +Fixes crash when tracing in recursive calls to Python classes. diff --git a/Python/ceval.c b/Python/ceval.c index 6f90d8e6fd064b..b02bf60315b7e1 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1978,28 +1978,30 @@ do_monitor_exc(PyThreadState *tstate, _PyInterpreterFrame *frame, return err; } -static inline int -no_tools_for_event(PyThreadState *tstate, _PyInterpreterFrame *frame, int event) +static inline bool +no_tools_for_global_event(PyThreadState *tstate, int event) { + return tstate->interp->monitors.tools[event] == 0; +} + +static inline bool +no_tools_for_local_event(PyThreadState *tstate, _PyInterpreterFrame *frame, int event) +{ + assert(event < _PY_MONITORING_LOCAL_EVENTS); _PyCoMonitoringData *data = _PyFrame_GetCode(frame)->_co_monitoring; if (data) { - if (data->active_monitors.tools[event] == 0) { - return 1; - } + return data->active_monitors.tools[event] == 0; } else { - if (tstate->interp->monitors.tools[event] == 0) { - return 1; - } + return no_tools_for_global_event(tstate, event); } - return 0; } static void monitor_raise(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *instr) { - if (no_tools_for_event(tstate, frame, PY_MONITORING_EVENT_RAISE)) { + if (no_tools_for_global_event(tstate, PY_MONITORING_EVENT_RAISE)) { return; } do_monitor_exc(tstate, frame, instr, PY_MONITORING_EVENT_RAISE); @@ -2009,7 +2011,7 @@ static void monitor_reraise(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *instr) { - if (no_tools_for_event(tstate, frame, PY_MONITORING_EVENT_RERAISE)) { + if (no_tools_for_global_event(tstate, PY_MONITORING_EVENT_RERAISE)) { return; } do_monitor_exc(tstate, frame, instr, PY_MONITORING_EVENT_RERAISE); @@ -2019,7 +2021,7 @@ static int monitor_stop_iteration(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *instr) { - if (no_tools_for_event(tstate, frame, PY_MONITORING_EVENT_STOP_ITERATION)) { + if (no_tools_for_local_event(tstate, frame, PY_MONITORING_EVENT_STOP_ITERATION)) { return 0; } return do_monitor_exc(tstate, frame, instr, PY_MONITORING_EVENT_STOP_ITERATION); @@ -2030,7 +2032,7 @@ monitor_unwind(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *instr) { - if (no_tools_for_event(tstate, frame, PY_MONITORING_EVENT_PY_UNWIND)) { + if (no_tools_for_global_event(tstate, PY_MONITORING_EVENT_PY_UNWIND)) { return; } do_monitor_exc(tstate, frame, instr, PY_MONITORING_EVENT_PY_UNWIND); @@ -2042,7 +2044,7 @@ monitor_handled(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *exc) { - if (no_tools_for_event(tstate, frame, PY_MONITORING_EVENT_EXCEPTION_HANDLED)) { + if (no_tools_for_global_event(tstate, PY_MONITORING_EVENT_EXCEPTION_HANDLED)) { return 0; } return _Py_call_instrumentation_arg(tstate, PY_MONITORING_EVENT_EXCEPTION_HANDLED, frame, instr, exc); @@ -2053,7 +2055,7 @@ monitor_throw(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *instr) { - if (no_tools_for_event(tstate, frame, PY_MONITORING_EVENT_PY_THROW)) { + if (no_tools_for_global_event(tstate, PY_MONITORING_EVENT_PY_THROW)) { return; } do_monitor_exc(tstate, frame, instr, PY_MONITORING_EVENT_PY_THROW); diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 36459687be7936..9065043f55d8a7 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -138,9 +138,9 @@ is_instrumented(int opcode) #ifndef NDEBUG static inline bool -monitors_equals(_Py_Monitors a, _Py_Monitors b) +monitors_equals(_Py_LocalMonitors a, _Py_LocalMonitors b) { - for (int i = 0; i < _PY_MONITORING_UNGROUPED_EVENTS; i++) { + for (int i = 0; i < _PY_MONITORING_LOCAL_EVENTS; i++) { if (a.tools[i] != b.tools[i]) { return false; } @@ -149,42 +149,47 @@ monitors_equals(_Py_Monitors a, _Py_Monitors b) } #endif -static inline _Py_Monitors -monitors_sub(_Py_Monitors a, _Py_Monitors b) +static inline _Py_LocalMonitors +monitors_sub(_Py_LocalMonitors a, _Py_LocalMonitors b) { - _Py_Monitors res; - for (int i = 0; i < _PY_MONITORING_UNGROUPED_EVENTS; i++) { + _Py_LocalMonitors res; + for (int i = 0; i < _PY_MONITORING_LOCAL_EVENTS; i++) { res.tools[i] = a.tools[i] & ~b.tools[i]; } return res; } #ifndef NDEBUG -static inline _Py_Monitors -monitors_and(_Py_Monitors a, _Py_Monitors b) +static inline _Py_LocalMonitors +monitors_and(_Py_LocalMonitors a, _Py_LocalMonitors b) { - _Py_Monitors res; - for (int i = 0; i < _PY_MONITORING_UNGROUPED_EVENTS; i++) { + _Py_LocalMonitors res; + for (int i = 0; i < _PY_MONITORING_LOCAL_EVENTS; i++) { res.tools[i] = a.tools[i] & b.tools[i]; } return res; } #endif -static inline _Py_Monitors -monitors_or(_Py_Monitors a, _Py_Monitors b) +/* The union of the *local* events in a and b. + * Global events like RAISE are ignored. + * Used for instrumentation, as only local + * events get instrumented. + */ +static inline _Py_LocalMonitors +local_union(_Py_GlobalMonitors a, _Py_LocalMonitors b) { - _Py_Monitors res; - for (int i = 0; i < _PY_MONITORING_UNGROUPED_EVENTS; i++) { + _Py_LocalMonitors res; + for (int i = 0; i < _PY_MONITORING_LOCAL_EVENTS; i++) { res.tools[i] = a.tools[i] | b.tools[i]; } return res; } static inline bool -monitors_are_empty(_Py_Monitors m) +monitors_are_empty(_Py_LocalMonitors m) { - for (int i = 0; i < _PY_MONITORING_UNGROUPED_EVENTS; i++) { + for (int i = 0; i < _PY_MONITORING_LOCAL_EVENTS; i++) { if (m.tools[i]) { return false; } @@ -193,9 +198,9 @@ monitors_are_empty(_Py_Monitors m) } static inline bool -multiple_tools(_Py_Monitors *m) +multiple_tools(_Py_LocalMonitors *m) { - for (int i = 0; i < _PY_MONITORING_UNGROUPED_EVENTS; i++) { + for (int i = 0; i < _PY_MONITORING_LOCAL_EVENTS; i++) { if (_Py_popcount32(m->tools[i]) > 1) { return true; } @@ -204,7 +209,19 @@ multiple_tools(_Py_Monitors *m) } static inline _PyMonitoringEventSet -get_events(_Py_Monitors *m, int tool_id) +get_local_events(_Py_LocalMonitors *m, int tool_id) +{ + _PyMonitoringEventSet result = 0; + for (int e = 0; e < _PY_MONITORING_LOCAL_EVENTS; e++) { + if ((m->tools[e] >> tool_id) & 1) { + result |= (1 << e); + } + } + return result; +} + +static inline _PyMonitoringEventSet +get_events(_Py_GlobalMonitors *m, int tool_id) { _PyMonitoringEventSet result = 0; for (int e = 0; e < _PY_MONITORING_UNGROUPED_EVENTS; e++) { @@ -457,10 +474,10 @@ sanity_check_instrumentation(PyCodeObject *code) if (data == NULL) { return; } - _Py_Monitors active_monitors = _PyInterpreterState_GET()->monitors; + _Py_GlobalMonitors active_monitors = _PyInterpreterState_GET()->monitors; if (code->_co_monitoring) { _Py_Monitors local_monitors = code->_co_monitoring->local_monitors; - active_monitors = monitors_or(active_monitors, local_monitors); + active_monitors = local_union(active_monitors, local_monitors); } assert(monitors_equals( code->_co_monitoring->active_monitors, @@ -909,7 +926,7 @@ is_version_up_to_date(PyCodeObject *code, PyInterpreterState *interp) static bool instrumentation_cross_checks(PyInterpreterState *interp, PyCodeObject *code) { - _Py_Monitors expected = monitors_or( + _Py_LocalMonitors expected = local_union( interp->monitors, code->_co_monitoring->local_monitors); return monitors_equals(code->_co_monitoring->active_monitors, expected); @@ -938,12 +955,7 @@ get_tools_for_instruction(PyCodeObject *code, PyInterpreterState *interp, int i, } } else { - if (code->_co_monitoring) { - tools = code->_co_monitoring->active_monitors.tools[event]; - } - else { - tools = interp->monitors.tools[event]; - } + tools = interp->monitors.tools[event]; } return tools; } @@ -1471,7 +1483,7 @@ initialize_lines(PyCodeObject *code) } static void -initialize_line_tools(PyCodeObject *code, _Py_Monitors *all_events) +initialize_line_tools(PyCodeObject *code, _Py_LocalMonitors *all_events) { uint8_t *line_tools = code->_co_monitoring->line_tools; assert(line_tools != NULL); @@ -1491,8 +1503,8 @@ allocate_instrumentation_data(PyCodeObject *code) PyErr_NoMemory(); return -1; } - code->_co_monitoring->local_monitors = (_Py_Monitors){ 0 }; - code->_co_monitoring->active_monitors = (_Py_Monitors){ 0 }; + code->_co_monitoring->local_monitors = (_Py_LocalMonitors){ 0 }; + code->_co_monitoring->active_monitors = (_Py_LocalMonitors){ 0 }; code->_co_monitoring->tools = NULL; code->_co_monitoring->lines = NULL; code->_co_monitoring->line_tools = NULL; @@ -1509,7 +1521,7 @@ update_instrumentation_data(PyCodeObject *code, PyInterpreterState *interp) if (allocate_instrumentation_data(code)) { return -1; } - _Py_Monitors all_events = monitors_or( + _Py_LocalMonitors all_events = local_union( interp->monitors, code->_co_monitoring->local_monitors); bool multitools = multiple_tools(&all_events); @@ -1577,14 +1589,23 @@ _Py_Instrument(PyCodeObject *code, PyInterpreterState *interp) return 0; } int code_len = (int)Py_SIZE(code); + /* code->_co_firsttraceable >= code_len indicates + * that no instrumentation can be inserted. + * Exit early to avoid creating instrumentation + * data for potential statically allocated code + * objects. + * See https://github.com/python/cpython/issues/108390 */ + if (code->_co_firsttraceable >= code_len) { + return 0; + } if (update_instrumentation_data(code, interp)) { return -1; } - _Py_Monitors active_events = monitors_or( + _Py_LocalMonitors active_events = local_union( interp->monitors, code->_co_monitoring->local_monitors); - _Py_Monitors new_events; - _Py_Monitors removed_events; + _Py_LocalMonitors new_events; + _Py_LocalMonitors removed_events; bool restarted = interp->last_restart_version > code->_co_instrumentation_version; if (restarted) { @@ -1725,10 +1746,22 @@ instrument_all_executing_code_objects(PyInterpreterState *interp) { } static void -set_events(_Py_Monitors *m, int tool_id, _PyMonitoringEventSet events) +set_events(_Py_GlobalMonitors *m, int tool_id, _PyMonitoringEventSet events) { assert(0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS); for (int e = 0; e < _PY_MONITORING_UNGROUPED_EVENTS; e++) { + uint8_t *tools = &m->tools[e]; + int active = (events >> e) & 1; + *tools &= ~(1 << tool_id); + *tools |= (active << tool_id); + } +} + +static void +set_local_events(_Py_LocalMonitors *m, int tool_id, _PyMonitoringEventSet events) +{ + assert(0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS); + for (int e = 0; e < _PY_MONITORING_LOCAL_EVENTS; e++) { uint8_t *tools = &m->tools[e]; int val = (events >> e) & 1; *tools &= ~(1 << tool_id); @@ -1771,19 +1804,23 @@ _PyMonitoring_SetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEvent { assert(0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS); PyInterpreterState *interp = _PyInterpreterState_GET(); - assert(events < (1 << _PY_MONITORING_UNGROUPED_EVENTS)); + assert(events < (1 << _PY_MONITORING_LOCAL_EVENTS)); + if (code->_co_firsttraceable >= Py_SIZE(code)) { + PyErr_Format(PyExc_SystemError, "cannot instrument shim code object '%U'", code->co_name); + return -1; + } if (check_tool(interp, tool_id)) { return -1; } if (allocate_instrumentation_data(code)) { return -1; } - _Py_Monitors *local = &code->_co_monitoring->local_monitors; - uint32_t existing_events = get_events(local, tool_id); + _Py_LocalMonitors *local = &code->_co_monitoring->local_monitors; + uint32_t existing_events = get_local_events(local, tool_id); if (existing_events == events) { return 0; } - set_events(local, tool_id, events); + set_local_events(local, tool_id, events); if (is_version_up_to_date(code, interp)) { /* Force instrumentation update */ code->_co_instrumentation_version = UINT64_MAX; @@ -1942,7 +1979,7 @@ monitoring_get_events_impl(PyObject *module, int tool_id) if (check_valid_tool(tool_id)) { return -1; } - _Py_Monitors *m = &_PyInterpreterState_GET()->monitors; + _Py_GlobalMonitors *m = &_PyInterpreterState_GET()->monitors; _PyMonitoringEventSet event_set = get_events(m, tool_id); return event_set; } @@ -2005,7 +2042,7 @@ monitoring_get_local_events_impl(PyObject *module, int tool_id, _PyMonitoringEventSet event_set = 0; _PyCoMonitoringData *data = ((PyCodeObject *)code)->_co_monitoring; if (data != NULL) { - for (int e = 0; e < _PY_MONITORING_UNGROUPED_EVENTS; e++) { + for (int e = 0; e < _PY_MONITORING_LOCAL_EVENTS; e++) { if ((data->local_monitors.tools[e] >> tool_id) & 1) { event_set |= (1 << e); } @@ -2039,15 +2076,16 @@ monitoring_set_local_events_impl(PyObject *module, int tool_id, if (check_valid_tool(tool_id)) { return NULL; } - if (event_set < 0 || event_set >= (1 << _PY_MONITORING_EVENTS)) { - PyErr_Format(PyExc_ValueError, "invalid event set 0x%x", event_set); - return NULL; - } if ((event_set & C_RETURN_EVENTS) && (event_set & C_CALL_EVENTS) != C_CALL_EVENTS) { PyErr_Format(PyExc_ValueError, "cannot set C_RETURN or C_RAISE events independently"); return NULL; } event_set &= ~C_RETURN_EVENTS; + if (event_set < 0 || event_set >= (1 << _PY_MONITORING_LOCAL_EVENTS)) { + PyErr_Format(PyExc_ValueError, "invalid local event set 0x%x", event_set); + return NULL; + } + if (_PyMonitoring_SetLocalEvents((PyCodeObject*)code, tool_id, event_set)) { return NULL; } From 24e989211a50d36d7d291e43418b99d8b5ec5692 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Tue, 5 Sep 2023 09:01:30 +0100 Subject: [PATCH 034/357] Improve the GitHub issue forms (#108881) --- .github/ISSUE_TEMPLATE/bug.yml | 48 +++++++++++------------------- .github/ISSUE_TEMPLATE/crash.yml | 45 +++++++++------------------- .github/ISSUE_TEMPLATE/feature.yml | 26 ++++++++-------- 3 files changed, 44 insertions(+), 75 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 05f4f317ccc97e..21a375361bf58e 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -9,20 +9,26 @@ body: For help or advice on using Python, try one of the following options instead of opening a GitHub issue: - - Posting on [Discourse](https://discuss.python.org/c/users/7) + - Asking on [Discourse](https://discuss.python.org/c/users/7) or [Stack Overflow](https://stackoverflow.com) - Reading the [Python tutorial](https://docs.python.org/3/tutorial/) - Emailing [python-list](https://mail.python.org/mailman/listinfo/python-list) - - type: checkboxes + + Make sure to also search the [CPython issue tracker](https://github.com/python/cpython/issues?q=is%3Aissue+sort%3Acreated-desc) to check that the bug has not already been reported. + - type: textarea attributes: - label: Checklist - description: A bug in a third-party project (for example, `pip` or `requests`) should be reported to that project's issue tracker, not CPython - options: - - label: I am confident this is a bug in CPython, not a bug in a third-party project - required: false - - label: | - I have searched the [CPython issue tracker](https://github.com/python/cpython/issues?q=is%3Aissue+sort%3Acreated-desc), - and am confident this bug has not been reported before - required: false + label: "Bug description:" + description: > + Give a clear and concise description of what happened. + Include a [minimal, reproducible example](https://stackoverflow.com/help/minimal-reproducible-example) if possible. + [Copy and paste code where possible rather than using screenshots](https://meta.stackoverflow.com/a/285557/13990016), + and put any code blocks inside triple backticks. + + value: | + ```python + # Add a code block here, if required + ``` + validations: + required: true - type: dropdown attributes: label: "CPython versions tested on:" @@ -47,23 +53,3 @@ body: - Other validations: required: false - - type: input - attributes: - label: "Output from running 'python -VV' on the command line:" - description: If you tested with multiple operating systems or architectures, feel free to provide details in the main bug description. - validations: - required: false - - type: textarea - attributes: - label: "A clear and concise description of the bug:" - description: > - Tell us what happened. - Include a [minimal, reproducible example](https://stackoverflow.com/help/minimal-reproducible-example) if possible. - Put any code blocks inside triple backticks. - - value: | - ```python - # Add a code block here, if required - ``` - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/crash.yml b/.github/ISSUE_TEMPLATE/crash.yml index 1ea84b893697a6..c14d7cf2599d4c 100644 --- a/.github/ISSUE_TEMPLATE/crash.yml +++ b/.github/ISSUE_TEMPLATE/crash.yml @@ -8,6 +8,20 @@ body: This form is for hard crashes of the Python interpreter, segmentation faults, failed C-level assertions, and similar. Unexpected exceptions raised from Python functions in the standard library count as bugs rather than crashes. The CPython interpreter is written in a different programming language, C. A "CPython crash" is when Python itself fails, leading to a traceback in the C stack. + - type: textarea + attributes: + label: What happened? + description: > + Include a [minimal, reproducible example](https://stackoverflow.com/help/minimal-reproducible-example) if possible. + [Copy and paste code where possible rather than using screenshots](https://meta.stackoverflow.com/a/285557/13990016), + and put any code blocks inside triple backticks. + + value: | + ```python + # Add a code block here, if required + ``` + validations: + required: true - type: dropdown attributes: label: "CPython versions tested on:" @@ -38,34 +52,3 @@ body: description: If you tested with multiple operating systems or architectures, feel free to provide details in the main bug description. validations: required: false - - type: textarea - attributes: - label: What happened? - description: > - Include a [minimal, reproducible example](https://stackoverflow.com/help/minimal-reproducible-example) if possible. - Put any code blocks inside triple backticks. - - value: | - ```python - # Add a code block here, if required - ``` - validations: - required: true - - type: textarea - attributes: - label: Error messages - description: > - Enter any error messages caused by the crash, including a core dump if there is one. - Feel free to leave this bit blank if it isn't relevant. - placeholder: | - Error messages should be formatted like this: - -
- Error messages/core dump - - ``` - # paste errors here, if you have any - ``` -
- validations: - required: false diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml index 0200e623d2a3b0..4361ab2bf827fb 100644 --- a/.github/ISSUE_TEMPLATE/feature.yml +++ b/.github/ISSUE_TEMPLATE/feature.yml @@ -10,6 +10,19 @@ body: You'll need to demonstrate widespread support for your idea among the community. Major feature proposals should generally be discussed on [Discourse](https://discuss.python.org/c/ideas/6) before opening a GitHub issue. Wait until it's clear that most people support your idea before filling in this form. + - type: textarea + attributes: + label: "Proposal:" + description: > + Explain your proposal, why it should be implemented, and how it would be used. + Add examples, if applicable. + Put any code blocks inside triple backticks. + value: | + ```python + # Add a code block here, if required + ``` + validations: + required: true - type: dropdown attributes: label: Has this already been discussed elsewhere? @@ -25,16 +38,3 @@ body: label: "Links to previous discussion of this feature:" validations: required: false - - type: textarea - attributes: - label: "Proposal:" - description: > - Explain your proposal, why it should be implemented, and how it would be used. - Add examples, if applicable. - Put any code blocks inside triple backticks. - value: | - ```python - # Add a code block here, if required - ``` - validations: - required: true From 230649f5383ac28793c499ea334b16ff671c3d02 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Tue, 5 Sep 2023 10:25:08 +0200 Subject: [PATCH 035/357] gh-108294: Add error handling for time.sleep audit event (GH-108363) I've also cleaned the tests up a bit to make this easier to test. --- Lib/test/audit-tests.py | 23 ++++++++++++--------- Lib/test/test_audit.py | 46 ++++++++++++++++++++++------------------- Modules/timemodule.c | 4 +++- 3 files changed, 41 insertions(+), 32 deletions(-) diff --git a/Lib/test/audit-tests.py b/Lib/test/audit-tests.py index f14c2635d39390..f0cedde308d53b 100644 --- a/Lib/test/audit-tests.py +++ b/Lib/test/audit-tests.py @@ -186,7 +186,7 @@ class C(A): ) -def test_open(): +def test_open(testfn): # SSLContext.load_dh_params uses _Py_fopen_obj rather than normal open() try: import ssl @@ -199,11 +199,11 @@ def test_open(): # All of them should fail with TestHook(raise_on_events={"open"}) as hook: for fn, *args in [ - (open, sys.argv[2], "r"), + (open, testfn, "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]), + (open, testfn, "w", -1, None, None, None, False, lambda *a: 1), + (load_dh_params, testfn), ]: if not fn: continue @@ -216,11 +216,11 @@ def test_open(): [ i for i in [ - (sys.argv[2], "r"), + (testfn, "r"), (sys.executable, "r"), (3, "w"), - (sys.argv[2], "w"), - (sys.argv[2], "rb") if load_dh_params else None, + (testfn, "w"), + (testfn, "rb") if load_dh_params else None, ] if i is not None ], @@ -517,12 +517,15 @@ def test_not_in_gc(): assert hook not in o -def test_time(): +def test_time(mode): import time def hook(event, args): if event.startswith("time."): - print(event, *args) + if mode == 'print': + print(event, *args) + elif mode == 'fail': + raise AssertionError('hook failed') sys.addaudithook(hook) time.sleep(0) @@ -549,4 +552,4 @@ def hook(event, args): suppress_msvcrt_asserts() test = sys.argv[1] - globals()[test]() + globals()[test](*sys.argv[2:]) diff --git a/Lib/test/test_audit.py b/Lib/test/test_audit.py index 3a15835917cc32..47e5832d311bd1 100644 --- a/Lib/test/test_audit.py +++ b/Lib/test/test_audit.py @@ -19,7 +19,7 @@ class AuditTest(unittest.TestCase): maxDiff = None @support.requires_subprocess() - def do_test(self, *args): + def run_test_in_subprocess(self, *args): with subprocess.Popen( [sys.executable, "-X utf8", AUDIT_TESTS_PY, *args], encoding="utf-8", @@ -27,27 +27,26 @@ def do_test(self, *args): 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)) + return p, p.stdout.read(), p.stderr.read() - @support.requires_subprocess() - def run_python(self, *args): + def do_test(self, *args): + proc, stdout, stderr = self.run_test_in_subprocess(*args) + + sys.stdout.write(stdout) + sys.stderr.write(stderr) + if proc.returncode: + self.fail(stderr) + + def run_python(self, *args, expect_stderr=False): events = [] - 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.stderr.writelines(p.stderr) - return ( - p.returncode, - [line.strip().partition(" ") for line in p.stdout], - "".join(p.stderr), - ) + proc, stdout, stderr = self.run_test_in_subprocess(*args) + if not expect_stderr or support.verbose: + sys.stderr.write(stderr) + return ( + proc.returncode, + [line.strip().partition(" ") for line in stdout.splitlines()], + stderr, + ) def test_basic(self): self.do_test("test_basic") @@ -257,7 +256,7 @@ def test_not_in_gc(self): self.fail(stderr) def test_time(self): - returncode, events, stderr = self.run_python("test_time") + returncode, events, stderr = self.run_python("test_time", "print") if returncode: self.fail(stderr) @@ -271,6 +270,11 @@ def test_time(self): self.assertEqual(actual, expected) + def test_time_fail(self): + returncode, events, stderr = self.run_python("test_time", "fail", + expect_stderr=True) + self.assertNotEqual(returncode, 0) + self.assertIn('hook failed', stderr.splitlines()[-1]) def test_sys_monitoring_register_callback(self): returncode, events, stderr = self.run_python("test_sys_monitoring_register_callback") diff --git a/Modules/timemodule.c b/Modules/timemodule.c index a2b66520ee885d..6a872a285d289b 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -413,7 +413,9 @@ Return the clk_id of a thread's CPU time clock."); static PyObject * time_sleep(PyObject *self, PyObject *timeout_obj) { - PySys_Audit("time.sleep", "O", timeout_obj); + if (PySys_Audit("time.sleep", "O", timeout_obj) < 0) { + return NULL; + } _PyTime_t timeout; if (_PyTime_FromSecondsObject(&timeout, timeout_obj, _PyTime_ROUND_TIMEOUT)) From b4c8cce9a7a9f3953eedffa277a3fe071731856d Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Tue, 5 Sep 2023 11:45:54 +0300 Subject: [PATCH 036/357] gh-108840: Remove unused `TestEnumTypeSubclassing` from `test_enum` (#108841) --- Lib/test/test_enum.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 11a5b425efff9a..a838b93341a608 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -4688,8 +4688,6 @@ def _generate_next_value_(name, start, count, last): self.assertEqual(Huh.TWO.value, (2, 2)) self.assertEqual(Huh.THREE.value, (3, 3, 3)) -class TestEnumTypeSubclassing(unittest.TestCase): - pass expected_help_output_with_docs = """\ Help on class Color in module %s: From 8b515f60ee1dec65cb3d64f1cc1d4b32aa2f4184 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Tue, 5 Sep 2023 12:35:52 +0100 Subject: [PATCH 037/357] GH-103082: Document PEP-669: Low Impact Monitoring for CPython (GH-107772) --- Doc/library/python.rst | 1 + Doc/library/sys.monitoring.rst | 300 +++++++++++++++++++++++++++++++++ Doc/library/sys.rst | 7 + Doc/whatsnew/3.12.rst | 15 ++ 4 files changed, 323 insertions(+) create mode 100644 Doc/library/sys.monitoring.rst diff --git a/Doc/library/python.rst b/Doc/library/python.rst index f39613f572884f..610435999d9f48 100644 --- a/Doc/library/python.rst +++ b/Doc/library/python.rst @@ -12,6 +12,7 @@ overview: .. toctree:: sys.rst + sys.monitoring.rst sysconfig.rst builtins.rst __main__.rst diff --git a/Doc/library/sys.monitoring.rst b/Doc/library/sys.monitoring.rst new file mode 100644 index 00000000000000..7b02b95fd766a7 --- /dev/null +++ b/Doc/library/sys.monitoring.rst @@ -0,0 +1,300 @@ +:mod:`sys.monitoring` --- Execution event monitoring +==================================================== + +.. module:: sys.monitoring + :synopsis: Access and control event monitoring + +----------------- + +.. note:: + + ``sys.monitoring`` is a namespace within the ``sys`` module, + not an independent module, so there is no need to + ``import sys.monitoring``, simply ``import sys`` and then use + ``sys.monitoring``. + + +This namespace provides access to the functions and constants necessary to +activate and control event monitoring. + +As programs execute, events occur that might be of interest to tools that +monitor execution. The :mod:`!sys.monitoring` namespace provides means to +receive callbacks when events of interest occur. + +The monitoring API consists of three components: + +* Tool identifiers +* Events +* Callbacks + +Tool identifiers +---------------- + +A tool identifier is an integer and associated name. +Tool identifiers are used to discourage tools from interfering with each +other and to allow multiple tools to operate at the same time. +Currently tools are completely independent and cannot be used to +monitor each other. This restriction may be lifted in the future. + +Before registering or activating events, a tool should choose an identifier. +Identifiers are integers in the range 0 to 5. + +Registering and using tools +''''''''''''''''''''''''''' + +.. function:: use_tool_id(id: int, name: str) -> None + + Must be called before ``id`` can be used. + ``id`` must be in the range 0 to 5 inclusive. + Raises a ``ValueError`` if ``id`` is in use. + +.. function:: free_tool_id(id: int) -> None + + Should be called once a tool no longer requires ``id``. + +.. function:: get_tool(id: int) -> str | None + + Returns the name of the tool if ``id`` is in use, + otherwise it returns ``None``. + ``id`` must be in the range 0 to 5 inclusive. + +All IDs are treated the same by the VM with regard to events, but the +following IDs are pre-defined to make co-operation of tools easier:: + + sys.monitoring.DEBUGGER_ID = 0 + sys.monitoring.COVERAGE_ID = 1 + sys.monitoring.PROFILER_ID = 2 + sys.monitoring.OPTIMIZER_ID = 5 + +There is no obligation to set an ID, nor is there anything preventing a tool +from using an ID even it is already in use. +However, tools are encouraged to use a unique ID and respect other tools. + +Events +------ + +The following events are supported: + +BRANCH + A conditional branch is taken (or not). +CALL + A call in Python code (event occurs before the call). +C_RAISE + Exception raised from any callable, except Python functions (event occurs after the exit). +C_RETURN + Return from any callable, except Python functions (event occurs after the return). +EXCEPTION_HANDLED + An exception is handled. +INSTRUCTION + A VM instruction is about to be executed. +JUMP + An unconditional jump in the control flow graph is made. +LINE + An instruction is about to be executed that has a different line number from the preceding instruction. +PY_RESUME + Resumption of a Python function (for generator and coroutine functions), except for throw() calls. +PY_RETURN + Return from a Python function (occurs immediately before the return, the callee's frame will be on the stack). +PY_START + Start of a Python function (occurs immediately after the call, the callee's frame will be on the stack) +PY_THROW + A Python function is resumed by a throw() call. +PY_UNWIND + Exit from a Python function during exception unwinding. +PY_YIELD + Yield from a Python function (occurs immediately before the yield, the callee's frame will be on the stack). +RAISE + An exception is raised, except those that cause a ``STOP_ITERATION`` event. +RERAISE + An exception is re-raised, for example at the end of a ``finally`` block. +STOP_ITERATION + An artificial ``StopIteration`` is raised; see `the STOP_ITERATION event`_. + +More events may be added in the future. + +These events are attributes of the :mod:`!sys.monitoring.events` namespace. +Each event is represented as a power-of-2 integer constant. +To define a set of events, simply bitwise or the individual events together. +For example, to specify both ``PY_RETURN`` and ``PY_START`` events, use the +expression ``PY_RETURN | PY_START``. + +Events are divided into three groups: + +Local events +'''''''''''' + +Local events are associated with normal execution of the program and happen +at clearly defined locations. All local events can be disabled. +The local events are: + +* PY_START +* PY_RESUME +* PY_RETURN +* PY_YIELD +* CALL +* LINE +* INSTRUCTION +* JUMP +* BRANCH +* STOP_ITERATION + +Ancillary events +'''''''''''''''' + +Ancillary events can be monitored like other events, but are controlled +by another event: + +* C_RAISE +* C_RETURN + +The ``C_RETURN`` and ``C_RAISE`` events are are controlled by the ``CALL`` +event. ``C_RETURN`` and ``C_RAISE`` events will only be seen if the +corresponding ``CALL`` event is being monitored. + +Other events +'''''''''''' + +Other events are not necessarily tied to a specific location in the +program and cannot be individually disabled. + +The other events that can be monitored are: + +* PY_THROW +* PY_UNWIND +* RAISE +* EXCEPTION_HANDLED + + +The STOP_ITERATION event +'''''''''''''''''''''''' + +:pep:`PEP 380 <380#use-of-stopiteration-to-return-values>` +specifies that a ``StopIteration`` exception is raised when returning a value +from a generator or coroutine. However, this is a very inefficient way to +return a value, so some Python implementations, notably CPython 3.12+, do not +raise an exception unless it would be visible to other code. + +To allow tools to monitor for real exceptions without slowing down generators +and coroutines, the ``STOP_ITERATION`` event is provided. +``STOP_ITERATION`` can be locally disabled, unlike ``RAISE``. + + +Turning events on and off +------------------------- + +In order to monitor an event, it must be turned on and a callback registered. +Events can be turned on or off by setting the events either globally or +for a particular code object. + + +Setting events globally +''''''''''''''''''''''' + +Events can be controlled globally by modifying the set of events being monitored. + +.. function:: get_events(tool_id: int) -> int + + Returns the ``int`` representing all the active events. + +.. function:: set_events(tool_id: int, event_set: int) + + Activates all events which are set in ``event_set``. + Raises a ``ValueError`` if ``tool_id`` is not in use. + +No events are active by default. + +Per code object events +'''''''''''''''''''''' + +Events can also be controlled on a per code object basis. + +.. function:: get_local_events(tool_id: int, code: CodeType) -> int + + Returns all the local events for ``code`` + +.. function:: set_local_events(tool_id: int, code: CodeType, event_set: int) + + Activates all the local events for ``code`` which are set in ``event_set``. + Raises a ``ValueError`` if ``tool_id`` is not in use. + +Local events add to global events, but do not mask them. +In other words, all global events will trigger for a code object, +regardless of the local events. + + +Disabling events +'''''''''''''''' + +Local events can be disabled for a specific code location by returning +``sys.monitoring.DISABLE`` from a callback function. This does not change +which events are set, or any other code locations for the same event. + +Disabling events for specific locations is very important for high +performance monitoring. For example, a program can be run under a +debugger with no overhead if the debugger disables all monitoring +except for a few breakpoints. + + +Registering callback functions +------------------------------ + +To register a callable for events call + +.. function:: register_callback(tool_id: int, event: int, func: Callable | None) -> Callable | None + + Registers the callable ``func`` for the ``event`` with the given ``tool_id`` + + If another callback was registered for the given ``tool_id`` and ``event``, + it is unregistered and returned. + Otherwise ``register_callback`` returns ``None``. + + +Functions can be unregistered by calling +``sys.monitoring.register_callback(tool_id, event, None)``. + +Callback functions can be registered and unregistered at any time. + +Registering or unregistering a callback function will generate a ``sys.audit`` event. + + +Callback function arguments +''''''''''''''''''''''''''' + +When an active event occurs, the registered callback function is called. +Different events will provide the callback function with different arguments, as follows: + +* ``PY_START`` and ``PY_RESUME``:: + + func(code: CodeType, instruction_offset: int) -> DISABLE | Any + +* ``PY_RETURN`` and ``PY_YIELD``: + + ``func(code: CodeType, instruction_offset: int, retval: object) -> DISABLE | Any`` + +* ``CALL``, ``C_RAISE`` and ``C_RETURN``: + + ``func(code: CodeType, instruction_offset: int, callable: object, arg0: object | MISSING) -> DISABLE | Any`` + + If there are no arguments, ``arg0`` is set to ``MISSING``. + +* ``RAISE``, ``RERAISE``, ``EXCEPTION_HANDLED``, ``PY_UNWIND``, ``PY_THROW`` and ``STOP_ITERATION``: + + ``func(code: CodeType, instruction_offset: int, exception: BaseException) -> DISABLE | Any`` + +* ``LINE``: + + ``func(code: CodeType, line_number: int) -> DISABLE | Any`` + +* ``BRANCH`` and ``JUMP``: + + ``func(code: CodeType, instruction_offset: int, destination_offset: int) -> DISABLE | Any`` + + Note that the ``destination_offset`` is where the code will next execute. + For an untaken branch this will be the offset of the instruction following + the branch. + +* ``INSTRUCTION``: + + ``func(code: CodeType, instruction_offset: int) -> DISABLE | Any`` + + diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index e99ab90bd18e4d..ba8d80bccbd894 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1953,6 +1953,13 @@ always available. .. availability:: Windows. +.. data:: monitoring + :noindex: + + Namespace containing functions and constants for register callbacks + and controlling monitoring events. + See :mod:`sys.monitoring` for details. + .. data:: _xoptions A dictionary of the various implementation-specific flags passed through diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 62e470aa1b7b4c..acdfe9e8b19a4f 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -73,6 +73,8 @@ Interpreter improvements: * :ref:`whatsnew312-pep684` +* :ref:`whatsnew312-pep669` + New typing features: * :ref:`whatsnew312-pep688` @@ -312,6 +314,19 @@ A Python API is anticipated for 3.13. (See :pep:`554`.) (Contributed by Eric Snow in :gh:`104210`, etc.) +.. _whatsnew312-pep669: + +PEP 669: Low impact monitoring for CPython +------------------------------------------ + +CPython 3.12 now supports the ability to monitor calls, +returns, lines, exceptions and other events using instrumentation. +This means that you only pay for what you use, providing support +for near-zero overhead debuggers and coverage tools. + +See :mod:`sys.monitoring` for details. + + New Features Related to Type Hints ================================== From 420c63621918d65ba362686b29495868f087281a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 5 Sep 2023 15:00:28 +0300 Subject: [PATCH 038/357] Add missed "f" in an f-string (GH-108906) --- Lib/test/libregrtest/runtest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index 9cb71fbfb1d178..16ae04191da768 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -442,7 +442,7 @@ def _load_run_test(result: TestResult, ns: Namespace) -> None: if hasattr(test_mod, "test_main"): # https://github.com/python/cpython/issues/89392 - raise Exception("Module {result.test_name} defines test_main() which is no longer supported by regrtest") + raise Exception(f"Module {result.test_name} defines test_main() which is no longer supported by regrtest") def test_func(): return run_unittest(test_mod) From eaabaac7c099884f92428a7bb04ffa1f1d6080dd Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 5 Sep 2023 16:46:17 +0300 Subject: [PATCH 039/357] gh-89392: Use normal unittest runner in test_type_cache (GH-108911) --- Lib/test/test_type_cache.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_type_cache.py b/Lib/test/test_type_cache.py index 24f83cd3e172c7..72587ecc11b6f3 100644 --- a/Lib/test/test_type_cache.py +++ b/Lib/test/test_type_cache.py @@ -58,4 +58,4 @@ class C: if __name__ == "__main__": - support.run_unittest(TypeCacheTests) + unittest.main() From f980cc19b9cafc09ef21e906871f810a1c89e62f Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 5 Sep 2023 17:35:28 +0300 Subject: [PATCH 040/357] gh-89392: Use unittest test runner for doctests in test_getopt (GH-108916) --- Lib/test/test_getopt.py | 71 +++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/Lib/test/test_getopt.py b/Lib/test/test_getopt.py index c96a33b77fe272..c8b3442de4aa77 100644 --- a/Lib/test/test_getopt.py +++ b/Lib/test/test_getopt.py @@ -1,8 +1,8 @@ # test_getopt.py # David Goodger 2000-08-19 -from test.support import verbose, run_doctest from test.support.os_helper import EnvironmentVarGuard +import doctest import unittest import getopt @@ -134,48 +134,49 @@ def test_gnu_getopt(self): self.assertEqual(opts, [('-a', '')]) self.assertEqual(args, ['arg1', '-b', '1', '--alpha', '--beta=2']) - def test_libref_examples(self): - s = """ - Examples from the Library Reference: Doc/lib/libgetopt.tex + def test_issue4629(self): + longopts, shortopts = getopt.getopt(['--help='], '', ['help=']) + self.assertEqual(longopts, [('--help', '')]) + longopts, shortopts = getopt.getopt(['--help=x'], '', ['help=']) + self.assertEqual(longopts, [('--help', 'x')]) + self.assertRaises(getopt.GetoptError, getopt.getopt, ['--help='], '', ['help']) - An example using only Unix style options: +def test_libref_examples(): + """ + Examples from the Library Reference: Doc/lib/libgetopt.tex + An example using only Unix style options: - >>> import getopt - >>> args = '-a -b -cfoo -d bar a1 a2'.split() - >>> args - ['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2'] - >>> optlist, args = getopt.getopt(args, 'abc:d:') - >>> optlist - [('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')] - >>> args - ['a1', 'a2'] - Using long option names is equally easy: + >>> import getopt + >>> args = '-a -b -cfoo -d bar a1 a2'.split() + >>> args + ['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2'] + >>> optlist, args = getopt.getopt(args, 'abc:d:') + >>> optlist + [('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')] + >>> args + ['a1', 'a2'] + Using long option names is equally easy: - >>> s = '--condition=foo --testing --output-file abc.def -x a1 a2' - >>> args = s.split() - >>> args - ['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2'] - >>> optlist, args = getopt.getopt(args, 'x', [ - ... 'condition=', 'output-file=', 'testing']) - >>> optlist - [('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')] - >>> args - ['a1', 'a2'] - """ - import types - m = types.ModuleType("libreftest", s) - run_doctest(m, verbose) + >>> s = '--condition=foo --testing --output-file abc.def -x a1 a2' + >>> args = s.split() + >>> args + ['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2'] + >>> optlist, args = getopt.getopt(args, 'x', [ + ... 'condition=', 'output-file=', 'testing']) + >>> optlist + [('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')] + >>> args + ['a1', 'a2'] + """ + +def load_tests(loader, tests, pattern): + tests.addTest(doctest.DocTestSuite()) + return tests - def test_issue4629(self): - longopts, shortopts = getopt.getopt(['--help='], '', ['help=']) - self.assertEqual(longopts, [('--help', '')]) - longopts, shortopts = getopt.getopt(['--help=x'], '', ['help=']) - self.assertEqual(longopts, [('--help', 'x')]) - self.assertRaises(getopt.GetoptError, getopt.getopt, ['--help='], '', ['help']) if __name__ == "__main__": unittest.main() From 1e0d62793a84001e92f1c80b511d3a212b435acc Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 5 Sep 2023 17:56:30 +0300 Subject: [PATCH 041/357] gh-108416: Mark slow but not CPU bound test methods with requires_resource('walltime') (GH-108480) --- Lib/test/_test_multiprocessing.py | 3 +++ Lib/test/libregrtest/cmdline.py | 4 +++- Lib/test/test_concurrent_futures/executor.py | 1 + Lib/test/test_concurrent_futures/test_wait.py | 3 +++ Lib/test/test_eintr.py | 1 + Lib/test/test_faulthandler.py | 1 + Lib/test/test_httplib.py | 1 + Lib/test/test_imaplib.py | 5 ++++- Lib/test/test_io.py | 6 ++++++ Lib/test/test_logging.py | 1 + Lib/test/test_poll.py | 3 ++- Lib/test/test_signal.py | 1 + Lib/test/test_smtpnet.py | 1 + Lib/test/test_ssl.py | 2 ++ Lib/test/test_subprocess.py | 2 ++ Lib/test/test_urllib2net.py | 5 +++++ Lib/test/test_urllibnet.py | 2 ++ Lib/test/test_xmlrpc.py | 9 +++++++++ 18 files changed, 48 insertions(+), 3 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index bcbb4c2929d69e..2636a9cf7f5bee 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -675,6 +675,7 @@ def test_close(self): close_queue(q) + @support.requires_resource('walltime') def test_many_processes(self): if self.TYPE == 'threads': self.skipTest('test not appropriate for {}'.format(self.TYPE)) @@ -4991,6 +4992,7 @@ def test_wait_slow(self): def test_wait_socket_slow(self): self.test_wait_socket(True) + @support.requires_resource('walltime') def test_wait_timeout(self): from multiprocessing.connection import wait @@ -5019,6 +5021,7 @@ def signal_and_sleep(cls, sem, period): sem.release() time.sleep(period) + @support.requires_resource('walltime') def test_wait_integer(self): from multiprocessing.connection import wait diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index 251fcacb1d14f7..d1a590d8c1a5b3 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -107,6 +107,8 @@ cpu - Used for certain CPU-heavy tests. + walltime - Long running but not CPU-bound tests. + subprocess Run all tests for the subprocess module. urlfetch - It is okay to download files required on testing. @@ -129,7 +131,7 @@ ALL_RESOURCES = ('audio', 'curses', 'largefile', 'network', - 'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui') + 'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui', 'walltime') # Other resources excluded from --use=all: # diff --git a/Lib/test/test_concurrent_futures/executor.py b/Lib/test/test_concurrent_futures/executor.py index 36278bdd501971..1e7d4344740943 100644 --- a/Lib/test/test_concurrent_futures/executor.py +++ b/Lib/test/test_concurrent_futures/executor.py @@ -53,6 +53,7 @@ def test_map_exception(self): self.assertEqual(i.__next__(), (0, 1)) self.assertRaises(ZeroDivisionError, i.__next__) + @support.requires_resource('walltime') def test_map_timeout(self): results = [] try: diff --git a/Lib/test/test_concurrent_futures/test_wait.py b/Lib/test/test_concurrent_futures/test_wait.py index e4bea8b05aced6..3f64ca173c02f6 100644 --- a/Lib/test/test_concurrent_futures/test_wait.py +++ b/Lib/test/test_concurrent_futures/test_wait.py @@ -3,6 +3,7 @@ import time import unittest from concurrent import futures +from test import support from .util import ( CANCELLED_FUTURE, CANCELLED_AND_NOTIFIED_FUTURE, EXCEPTION_FUTURE, @@ -53,6 +54,7 @@ def test_first_completed_some_already_completed(self): finished) self.assertEqual(set([future1]), pending) + @support.requires_resource('walltime') def test_first_exception(self): future1 = self.executor.submit(mul, 2, 21) future2 = self.executor.submit(sleep_and_raise, 1.5) @@ -110,6 +112,7 @@ def test_all_completed(self): future2]), finished) self.assertEqual(set(), pending) + @support.requires_resource('walltime') def test_timeout(self): future1 = self.executor.submit(mul, 6, 7) future2 = self.executor.submit(time.sleep, 6) diff --git a/Lib/test/test_eintr.py b/Lib/test/test_eintr.py index 528147802ba47e..49b15f1a2dba92 100644 --- a/Lib/test/test_eintr.py +++ b/Lib/test/test_eintr.py @@ -9,6 +9,7 @@ class EINTRTests(unittest.TestCase): @unittest.skipUnless(hasattr(signal, "setitimer"), "requires setitimer()") + @support.requires_resource('walltime') def test_all(self): # Run the tester in a sub-process, to make sure there is only one # thread (for reliable signal delivery). diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py index 907c2cda86cbae..3c1e8c150ae711 100644 --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -683,6 +683,7 @@ def test_dump_traceback_later_fd(self): with tempfile.TemporaryFile('wb+') as fp: self.check_dump_traceback_later(fd=fp.fileno()) + @support.requires_resource('walltime') def test_dump_traceback_later_twice(self): self.check_dump_traceback_later(loops=2) diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index fe8105ee2bb3fa..676725c46ec694 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -1954,6 +1954,7 @@ def test_networked_good_cert(self): h.close() self.assertIn('nginx', server_string) + @support.requires_resource('walltime') def test_networked_bad_cert(self): # We feed a "CA" cert that is unrelated to the server's cert import ssl diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py index 2b2f1f76d26db3..89cdca499f92a9 100644 --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -10,7 +10,7 @@ import threading import socket -from test.support import verbose, run_with_tz, run_with_locale, cpython_only +from test.support import verbose, run_with_tz, run_with_locale, cpython_only, requires_resource from test.support import hashlib_helper from test.support import threading_helper import unittest @@ -456,6 +456,7 @@ def test_simple_with_statement(self): with self.imap_class(*server.server_address): pass + @requires_resource('walltime') def test_imaplib_timeout_test(self): _, server = self._setup(SimpleIMAPHandler) addr = server.server_address[1] @@ -549,6 +550,7 @@ class NewIMAPSSLTests(NewIMAPTestsMixin, unittest.TestCase): imap_class = IMAP4_SSL server_class = SecureTCPServer + @requires_resource('walltime') def test_ssl_raises(self): ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) self.assertEqual(ssl_context.verify_mode, ssl.CERT_REQUIRED) @@ -563,6 +565,7 @@ def test_ssl_raises(self): ssl_context=ssl_context) client.shutdown() + @requires_resource('walltime') def test_ssl_verified(self): ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) ssl_context.load_verify_locations(CAFILE) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 6976a64bf77e7d..022cf21a4709a2 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -4468,10 +4468,12 @@ def run(): self.assertFalse(err.strip('.!')) @threading_helper.requires_working_threading() + @support.requires_resource('walltime') def test_daemon_threads_shutdown_stdout_deadlock(self): self.check_daemon_threads_shutdown_deadlock('stdout') @threading_helper.requires_working_threading() + @support.requires_resource('walltime') def test_daemon_threads_shutdown_stderr_deadlock(self): self.check_daemon_threads_shutdown_deadlock('stderr') @@ -4645,11 +4647,13 @@ def alarm_handler(sig, frame): os.close(r) @requires_alarm + @support.requires_resource('walltime') def test_interrupted_read_retry_buffered(self): self.check_interrupted_read_retry(lambda x: x.decode('latin1'), mode="rb") @requires_alarm + @support.requires_resource('walltime') def test_interrupted_read_retry_text(self): self.check_interrupted_read_retry(lambda x: x, mode="r", encoding="latin1") @@ -4723,10 +4727,12 @@ def alarm2(sig, frame): raise @requires_alarm + @support.requires_resource('walltime') def test_interrupted_write_retry_buffered(self): self.check_interrupted_write_retry(b"x", mode="wb") @requires_alarm + @support.requires_resource('walltime') def test_interrupted_write_retry_text(self): self.check_interrupted_write_retry("x", mode="w", encoding="latin1") diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index c2e8ff5d463607..2305e5162f901e 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -680,6 +680,7 @@ def test_path_objects(self): support.is_emscripten, "Emscripten cannot fstat unlinked files." ) @threading_helper.requires_working_threading() + @support.requires_resource('walltime') def test_race(self): # Issue #14632 refers. def remove_loop(fname, tries): diff --git a/Lib/test/test_poll.py b/Lib/test/test_poll.py index 02165a0244ddf4..1847ae95db9292 100644 --- a/Lib/test/test_poll.py +++ b/Lib/test/test_poll.py @@ -8,7 +8,7 @@ import time import unittest from test.support import ( - cpython_only, requires_subprocess, requires_working_socket + cpython_only, requires_subprocess, requires_working_socket, requires_resource ) from test.support import threading_helper from test.support.os_helper import TESTFN @@ -124,6 +124,7 @@ def fileno(self): # select(), modified to use poll() instead. @requires_subprocess() + @requires_resource('walltime') def test_poll2(self): cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 1; done' proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index 25afd6aabe0751..2a1a1ee22f43da 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -745,6 +745,7 @@ def test_siginterrupt_on(self): interrupted = self.readpipe_interrupted(True) self.assertTrue(interrupted) + @support.requires_resource('walltime') def test_siginterrupt_off(self): # If a signal handler is installed and siginterrupt is called with # a false value for the second argument, when that signal arrives, it diff --git a/Lib/test/test_smtpnet.py b/Lib/test/test_smtpnet.py index 72f51cd8d81f59..2e0dc1aa276f35 100644 --- a/Lib/test/test_smtpnet.py +++ b/Lib/test/test_smtpnet.py @@ -61,6 +61,7 @@ def test_connect_default_port(self): server.ehlo() server.quit() + @support.requires_resource('walltime') def test_connect_using_sslcontext(self): context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) context.check_hostname = False diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 4e49dc5640d3f5..2c32fec5104c23 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -2182,6 +2182,7 @@ def test_timeout_connect_ex(self): self.assertIn(rc, (errno.EAGAIN, errno.EWOULDBLOCK)) @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'Needs IPv6') + @support.requires_resource('walltime') def test_get_server_certificate_ipv6(self): with socket_helper.transient_internet('ipv6.google.com'): _test_get_server_certificate(self, 'ipv6.google.com', 443) @@ -2740,6 +2741,7 @@ def try_protocol_combo(server_protocol, client_protocol, expect_success, class ThreadedTests(unittest.TestCase): + @support.requires_resource('walltime') def test_echo(self): """Basic test of an SSL client connecting to a server""" if support.verbose: diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 0b9e9e16f55d7e..d95ef72b0da47a 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -269,6 +269,7 @@ def test_check_output_stdin_with_input_arg(self): self.assertIn('stdin', c.exception.args[0]) self.assertIn('input', c.exception.args[0]) + @support.requires_resource('walltime') def test_check_output_timeout(self): # check_output() function with timeout arg with self.assertRaises(subprocess.TimeoutExpired) as c: @@ -1643,6 +1644,7 @@ def test_check_output_stdin_with_input_arg(self): self.assertIn('stdin', c.exception.args[0]) self.assertIn('input', c.exception.args[0]) + @support.requires_resource('walltime') def test_check_output_timeout(self): with self.assertRaises(subprocess.TimeoutExpired) as c: cp = self.run_python(( diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py index d8d882b2d33589..f0874d8d3ce463 100644 --- a/Lib/test/test_urllib2net.py +++ b/Lib/test/test_urllib2net.py @@ -133,6 +133,7 @@ def setUp(self): # XXX The rest of these tests aren't very good -- they don't check much. # They do sometimes catch some major disasters, though. + @support.requires_resource('walltime') def test_ftp(self): # Testing the same URL twice exercises the caching in CacheFTPHandler urls = [ @@ -196,6 +197,7 @@ def test_urlwithfrag(self): self.assertEqual(res.geturl(), "http://www.pythontest.net/index.html#frag") + @support.requires_resource('walltime') def test_redirect_url_withfrag(self): redirect_url_with_frag = "http://www.pythontest.net/redir/with_frag/" with socket_helper.transient_internet(redirect_url_with_frag): @@ -334,6 +336,7 @@ def test_http_timeout(self): FTP_HOST = 'ftp://www.pythontest.net/' + @support.requires_resource('walltime') def test_ftp_basic(self): self.assertIsNone(socket.getdefaulttimeout()) with socket_helper.transient_internet(self.FTP_HOST, timeout=None): @@ -352,6 +355,7 @@ def test_ftp_default_timeout(self): socket.setdefaulttimeout(None) self.assertEqual(u.fp.fp.raw._sock.gettimeout(), 60) + @support.requires_resource('walltime') def test_ftp_no_timeout(self): self.assertIsNone(socket.getdefaulttimeout()) with socket_helper.transient_internet(self.FTP_HOST): @@ -363,6 +367,7 @@ def test_ftp_no_timeout(self): socket.setdefaulttimeout(None) self.assertIsNone(u.fp.fp.raw._sock.gettimeout()) + @support.requires_resource('walltime') def test_ftp_timeout(self): with socket_helper.transient_internet(self.FTP_HOST): u = _urlopen_with_retry(self.FTP_HOST, timeout=60) diff --git a/Lib/test/test_urllibnet.py b/Lib/test/test_urllibnet.py index 773101ce41f602..49a3b5afdebb2f 100644 --- a/Lib/test/test_urllibnet.py +++ b/Lib/test/test_urllibnet.py @@ -109,6 +109,7 @@ def test_getcode(self): open_url.close() self.assertEqual(code, 404) + @support.requires_resource('walltime') def test_bad_address(self): # Make sure proper exception is raised when connecting to a bogus # address. @@ -191,6 +192,7 @@ def test_header(self): logo = "http://www.pythontest.net/" + @support.requires_resource('walltime') def test_data_header(self): with self.urlretrieve(self.logo) as (file_location, fileheaders): datevalue = fileheaders.get('Date') diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index edc741dbc60088..6c4b8384a3202e 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -1037,38 +1037,47 @@ def test_path2(self): self.assertEqual(p.add(6,8), 6+8) self.assertRaises(xmlrpclib.Fault, p.pow, 6, 8) + @support.requires_resource('walltime') def test_path3(self): p = xmlrpclib.ServerProxy(URL+"/is/broken") self.assertRaises(xmlrpclib.Fault, p.add, 6, 8) + @support.requires_resource('walltime') def test_invalid_path(self): p = xmlrpclib.ServerProxy(URL+"/invalid") self.assertRaises(xmlrpclib.Fault, p.add, 6, 8) + @support.requires_resource('walltime') def test_path_query_fragment(self): p = xmlrpclib.ServerProxy(URL+"/foo?k=v#frag") self.assertEqual(p.test(), "/foo?k=v#frag") + @support.requires_resource('walltime') def test_path_fragment(self): p = xmlrpclib.ServerProxy(URL+"/foo#frag") self.assertEqual(p.test(), "/foo#frag") + @support.requires_resource('walltime') def test_path_query(self): p = xmlrpclib.ServerProxy(URL+"/foo?k=v") self.assertEqual(p.test(), "/foo?k=v") + @support.requires_resource('walltime') def test_empty_path(self): p = xmlrpclib.ServerProxy(URL) self.assertEqual(p.test(), "/RPC2") + @support.requires_resource('walltime') def test_root_path(self): p = xmlrpclib.ServerProxy(URL + "/") self.assertEqual(p.test(), "/") + @support.requires_resource('walltime') def test_empty_path_query(self): p = xmlrpclib.ServerProxy(URL + "?k=v") self.assertEqual(p.test(), "?k=v") + @support.requires_resource('walltime') def test_empty_path_fragment(self): p = xmlrpclib.ServerProxy(URL + "#frag") self.assertEqual(p.test(), "#frag") From ad1d6a1c20c7bd3e880c9af7251e6f39ff0e62a9 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Tue, 5 Sep 2023 18:11:12 +0300 Subject: [PATCH 042/357] gh-108903: Remove unneeded `lambda`s from `asyncio` (GH-108904) --- Doc/library/asyncio-protocol.rst | 4 ++-- Lib/asyncio/sslproto.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst index 7bc906eaafc1f2..9781bda8b27df0 100644 --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -746,7 +746,7 @@ received data, and close the connection:: loop = asyncio.get_running_loop() server = await loop.create_server( - lambda: EchoServerProtocol(), + EchoServerProtocol, '127.0.0.1', 8888) async with server: @@ -850,7 +850,7 @@ method, sends back received data:: # One protocol instance will be created to serve all # client requests. transport, protocol = await loop.create_datagram_endpoint( - lambda: EchoServerProtocol(), + EchoServerProtocol, local_addr=('127.0.0.1', 9999)) try: diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index 488e17d8bccd5b..3eb65a8a08b5a0 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -539,7 +539,7 @@ def _start_handshake(self): # start handshake timeout count down self._handshake_timeout_handle = \ self._loop.call_later(self._ssl_handshake_timeout, - lambda: self._check_handshake_timeout()) + self._check_handshake_timeout) self._do_handshake() @@ -619,7 +619,7 @@ def _start_shutdown(self): self._set_state(SSLProtocolState.FLUSHING) self._shutdown_timeout_handle = self._loop.call_later( self._ssl_shutdown_timeout, - lambda: self._check_shutdown_timeout() + self._check_shutdown_timeout ) self._do_flush() @@ -758,7 +758,7 @@ def _do_read__buffered(self): else: break else: - self._loop.call_soon(lambda: self._do_read()) + self._loop.call_soon(self._do_read) except SSLAgainErrors: pass if offset > 0: From deea7c82682848b2a0db971a4dcc3a32c73a9f8c Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Tue, 5 Sep 2023 11:03:06 -0500 Subject: [PATCH 043/357] gh-107565: Update Windows build to use OpenSSL 3.0.10 (GH-108928) Also clean up some intermediate NEWS entries about previous versions. --- .../Security/2023-06-01-03-24-58.gh-issue-103142.GLWDMX.rst | 2 -- .../Windows/2023-07-11-20-48-17.gh-issue-99079.CIMftz.rst | 1 - .../Windows/2023-09-05-10-08-47.gh-issue-107565.CIMftz.rst | 1 + .../next/macOS/2023-05-30-23-30-46.gh-issue-103142.55lMXQ.rst | 1 - PCbuild/get_externals.bat | 4 ++-- PCbuild/python.props | 4 ++-- 6 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 Misc/NEWS.d/next/Security/2023-06-01-03-24-58.gh-issue-103142.GLWDMX.rst delete mode 100644 Misc/NEWS.d/next/Windows/2023-07-11-20-48-17.gh-issue-99079.CIMftz.rst create mode 100644 Misc/NEWS.d/next/Windows/2023-09-05-10-08-47.gh-issue-107565.CIMftz.rst delete mode 100644 Misc/NEWS.d/next/macOS/2023-05-30-23-30-46.gh-issue-103142.55lMXQ.rst diff --git a/Misc/NEWS.d/next/Security/2023-06-01-03-24-58.gh-issue-103142.GLWDMX.rst b/Misc/NEWS.d/next/Security/2023-06-01-03-24-58.gh-issue-103142.GLWDMX.rst deleted file mode 100644 index 7e0836879e4f81..00000000000000 --- a/Misc/NEWS.d/next/Security/2023-06-01-03-24-58.gh-issue-103142.GLWDMX.rst +++ /dev/null @@ -1,2 +0,0 @@ -The version of OpenSSL used in our binary builds has been upgraded to 1.1.1u -to address several CVEs. diff --git a/Misc/NEWS.d/next/Windows/2023-07-11-20-48-17.gh-issue-99079.CIMftz.rst b/Misc/NEWS.d/next/Windows/2023-07-11-20-48-17.gh-issue-99079.CIMftz.rst deleted file mode 100644 index 11f411be0f17c5..00000000000000 --- a/Misc/NEWS.d/next/Windows/2023-07-11-20-48-17.gh-issue-99079.CIMftz.rst +++ /dev/null @@ -1 +0,0 @@ -Update Windows build to use OpenSSL 3.0.9 diff --git a/Misc/NEWS.d/next/Windows/2023-09-05-10-08-47.gh-issue-107565.CIMftz.rst b/Misc/NEWS.d/next/Windows/2023-09-05-10-08-47.gh-issue-107565.CIMftz.rst new file mode 100644 index 00000000000000..024a58299caed9 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2023-09-05-10-08-47.gh-issue-107565.CIMftz.rst @@ -0,0 +1 @@ +Update Windows build to use OpenSSL 3.0.10. diff --git a/Misc/NEWS.d/next/macOS/2023-05-30-23-30-46.gh-issue-103142.55lMXQ.rst b/Misc/NEWS.d/next/macOS/2023-05-30-23-30-46.gh-issue-103142.55lMXQ.rst deleted file mode 100644 index 1afd949d6a9f03..00000000000000 --- a/Misc/NEWS.d/next/macOS/2023-05-30-23-30-46.gh-issue-103142.55lMXQ.rst +++ /dev/null @@ -1 +0,0 @@ -Update macOS installer to use OpenSSL 1.1.1u. diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index 257b360ba3506f..1d3abcc3def1fa 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.8 if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi-3.4.4 -if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-3.0.9 +if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-3.0.10 set libraries=%libraries% sqlite-3.42.0.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.13.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tk-8.6.13.0 @@ -76,7 +76,7 @@ echo.Fetching external binaries... set binaries= if NOT "%IncludeLibffi%"=="false" set binaries=%binaries% libffi-3.4.4 -if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-3.0.9 +if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-3.0.10 if NOT "%IncludeTkinter%"=="false" set binaries=%binaries% tcltk-8.6.13.0 if NOT "%IncludeSSLSrc%"=="false" set binaries=%binaries% nasm-2.11.06 diff --git a/PCbuild/python.props b/PCbuild/python.props index d3586235c82652..94faa8221eac5a 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -74,8 +74,8 @@ $(ExternalsDir)libffi-3.4.4\ $(libffiDir)$(ArchName)\ $(libffiOutDir)include - $(ExternalsDir)openssl-3.0.9\ - $(ExternalsDir)openssl-bin-3.0.9\$(ArchName)\ + $(ExternalsDir)openssl-3.0.10\ + $(ExternalsDir)openssl-bin-3.0.10\$(ArchName)\ $(opensslOutDir)include $(ExternalsDir)\nasm-2.11.06\ $(ExternalsDir)\zlib-1.2.13\ From 3f89b257639dd817a32079da2ae2c4436b8e82eb Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Tue, 5 Sep 2023 21:57:48 +0300 Subject: [PATCH 044/357] gh-108927: Fix test_import + test_importlib + test_unittest problem (#108929) --- Lib/test/test_unittest/test_discovery.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_unittest/test_discovery.py b/Lib/test/test_unittest/test_discovery.py index 946fa1258ea25e..004898ed431834 100644 --- a/Lib/test/test_unittest/test_discovery.py +++ b/Lib/test/test_unittest/test_discovery.py @@ -6,7 +6,6 @@ import pickle from test import support from test.support import import_helper -import test.test_importlib.util import unittest import unittest.mock @@ -826,6 +825,8 @@ def restore(): 'as dotted module names') def test_discovery_failed_discovery(self): + from test.test_importlib import util + loader = unittest.TestLoader() package = types.ModuleType('package') @@ -837,7 +838,7 @@ def _import(packagename, *args, **kwargs): # Since loader.discover() can modify sys.path, restore it when done. with import_helper.DirsOnSysPath(): # Make sure to remove 'package' from sys.modules when done. - with test.test_importlib.util.uncache('package'): + with util.uncache('package'): with self.assertRaises(TypeError) as cm: loader.discover('package') self.assertEqual(str(cm.exception), From 9bf350b0662fcf1a8b43b9293e6c8ecf3c711561 Mon Sep 17 00:00:00 2001 From: wim glenn Date: Tue, 5 Sep 2023 14:22:27 -0500 Subject: [PATCH 045/357] gh-107755: Document the correct default value of slice step (GH-107756) Document the correct default value of slice step. --- Doc/library/functions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 88a7fdfe6f0d50..d9974c6350fed1 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1631,7 +1631,7 @@ are always available. They are listed here in alphabetical order. .. class:: slice(stop) - slice(start, stop, step=1) + slice(start, stop, step=None) Return a :term:`slice` object representing the set of indices specified by ``range(start, stop, step)``. The *start* and *step* arguments default to From 2c4c26c4ce4bb94200ff3c9b5a0f4c75eed96f31 Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Wed, 6 Sep 2023 06:01:23 +1000 Subject: [PATCH 046/357] gh-108469: Update ast.unparse for unescaped quote support from PEP701 [3.12] (#108553) Co-authored-by: sunmy2019 <59365878+sunmy2019@users.noreply.github.com> --- Lib/ast.py | 31 ++++++------------- Lib/test/test_tokenize.py | 2 +- Lib/test/test_unparse.py | 23 ++++++++++---- ...-09-03-04-37-52.gh-issue-108469.kusj40.rst | 3 ++ 4 files changed, 31 insertions(+), 28 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-03-04-37-52.gh-issue-108469.kusj40.rst diff --git a/Lib/ast.py b/Lib/ast.py index 45b95963f81885..17ec7ff6f8bc12 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -1225,17 +1225,7 @@ def _write_str_avoiding_backslashes(self, string, *, quote_types=_ALL_QUOTES): def visit_JoinedStr(self, node): self.write("f") - if self._avoid_backslashes: - with self.buffered() as buffer: - self._write_fstring_inner(node) - return self._write_str_avoiding_backslashes("".join(buffer)) - - # If we don't need to avoid backslashes globally (i.e., we only need - # to avoid them inside FormattedValues), it's cosmetically preferred - # to use escaped whitespace. That is, it's preferred to use backslashes - # for cases like: f"{x}\n". To accomplish this, we keep track of what - # in our buffer corresponds to FormattedValues and what corresponds to - # Constant parts of the f-string, and allow escapes accordingly. + fstring_parts = [] for value in node.values: with self.buffered() as buffer: @@ -1247,11 +1237,14 @@ def visit_JoinedStr(self, node): new_fstring_parts = [] quote_types = list(_ALL_QUOTES) for value, is_constant in fstring_parts: - value, quote_types = self._str_literal_helper( - value, - quote_types=quote_types, - escape_special_whitespace=is_constant, - ) + if is_constant: + value, quote_types = self._str_literal_helper( + value, + quote_types=quote_types, + escape_special_whitespace=True, + ) + elif "\n" in value: + quote_types = [q for q in quote_types if q in _MULTI_QUOTES] new_fstring_parts.append(value) value = "".join(new_fstring_parts) @@ -1273,16 +1266,12 @@ def _write_fstring_inner(self, node): def visit_FormattedValue(self, node): def unparse_inner(inner): - unparser = type(self)(_avoid_backslashes=True) + unparser = type(self)() unparser.set_precedence(_Precedence.TEST.next(), inner) return unparser.visit(inner) with self.delimit("{", "}"): expr = unparse_inner(node.value) - if "\\" in expr: - raise ValueError( - "Unable to avoid backslash in f-string expression part" - ) if expr.startswith("{"): # Separate pair of opening brackets as "{ {" self.write(" ") diff --git a/Lib/test/test_tokenize.py b/Lib/test/test_tokenize.py index 7863e27fccd972..dbefee655c377c 100644 --- a/Lib/test/test_tokenize.py +++ b/Lib/test/test_tokenize.py @@ -1860,7 +1860,7 @@ def test_random_files(self): testfiles.remove(os.path.join(tempdir, "test_unicode_identifiers.py")) - # TODO: Remove this once we can unparse PEP 701 syntax + # TODO: Remove this once we can untokenize PEP 701 syntax testfiles.remove(os.path.join(tempdir, "test_fstring.py")) for f in ('buffer', 'builtin', 'fileio', 'inspect', 'os', 'platform', 'sys'): diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index b3efb61e83049e..38c59e6d430b58 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -197,6 +197,10 @@ def test_fstrings_complicated(self): self.check_ast_roundtrip('''f"a\\r\\nb"''') self.check_ast_roundtrip('''f"\\u2028{'x'}"''') + def test_fstrings_pep701(self): + self.check_ast_roundtrip('f" something { my_dict["key"] } something else "') + self.check_ast_roundtrip('f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}"') + def test_strings(self): self.check_ast_roundtrip("u'foo'") self.check_ast_roundtrip("r'foo'") @@ -378,8 +382,15 @@ def test_invalid_fstring_value(self): ) ) - def test_invalid_fstring_backslash(self): - self.check_invalid(ast.FormattedValue(value=ast.Constant(value="\\\\"))) + def test_fstring_backslash(self): + # valid since Python 3.12 + self.assertEqual(ast.unparse( + ast.FormattedValue( + value=ast.Constant(value="\\\\"), + conversion=-1, + format_spec=None, + ) + ), "{'\\\\\\\\'}") def test_invalid_yield_from(self): self.check_invalid(ast.YieldFrom(value=None)) @@ -502,11 +513,11 @@ def test_class_bases_and_keywords(self): self.check_src_roundtrip("class X(*args, **kwargs):\n pass") def test_fstrings(self): - self.check_src_roundtrip('''f\'\'\'-{f"""*{f"+{f'.{x}.'}+"}*"""}-\'\'\'''') - self.check_src_roundtrip('''f"\\u2028{'x'}"''') + self.check_src_roundtrip("f'-{f'*{f'+{f'.{x}.'}+'}*'}-'") + self.check_src_roundtrip("f'\\u2028{'x'}'") self.check_src_roundtrip(r"f'{x}\n'") - self.check_src_roundtrip('''f''\'{"""\n"""}\\n''\'''') - self.check_src_roundtrip('''f''\'{f"""{x}\n"""}\\n''\'''') + self.check_src_roundtrip("f'{'\\n'}\\n'") + self.check_src_roundtrip("f'{f'{x}\\n'}\\n'") def test_docstrings(self): docstrings = ( diff --git a/Misc/NEWS.d/next/Library/2023-09-03-04-37-52.gh-issue-108469.kusj40.rst b/Misc/NEWS.d/next/Library/2023-09-03-04-37-52.gh-issue-108469.kusj40.rst new file mode 100644 index 00000000000000..ac0f682963daec --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-03-04-37-52.gh-issue-108469.kusj40.rst @@ -0,0 +1,3 @@ +:func:`ast.unparse` now supports new :term:`f-string` syntax introduced in +Python 3.12. Note that the :term:`f-string` quotes are reselected for simplicity +under the new syntax. (Patch by Steven Sun) From b87263be9b82f778317c2bdf45ecd2ff23d0ba1b Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 5 Sep 2023 13:58:39 -0700 Subject: [PATCH 047/357] gh-106581: Support multiple uops pushing new values (#108895) Also avoid the need for the awkward .clone() call in the argument to mgr.adjust_inverse() and mgr.adjust(). --- Lib/test/test_generated_cases.py | 30 +++++++++++++ Tools/cases_generator/stacking.py | 70 +++++++++++++++++++++++-------- 2 files changed, 83 insertions(+), 17 deletions(-) diff --git a/Lib/test/test_generated_cases.py b/Lib/test/test_generated_cases.py index 54378fced54699..ed56f95af99417 100644 --- a/Lib/test/test_generated_cases.py +++ b/Lib/test/test_generated_cases.py @@ -532,6 +532,36 @@ def test_macro_cond_effect(self): """ self.run_cases_test(input, output) + def test_macro_push_push(self): + input = """ + op(A, (-- val1)) { + val1 = spam(); + } + op(B, (-- val2)) { + val2 = spam(); + } + macro(M) = A + B; + """ + output = """ + TARGET(M) { + PyObject *val1; + PyObject *val2; + // A + { + val1 = spam(); + } + // B + { + val2 = spam(); + } + STACK_GROW(2); + stack_pointer[-2] = val1; + stack_pointer[-1] = val2; + DISPATCH(); + } + """ + self.run_cases_test(input, output) + if __name__ == "__main__": unittest.main() diff --git a/Tools/cases_generator/stacking.py b/Tools/cases_generator/stacking.py index dcdfc7ec054248..3021324e909100 100644 --- a/Tools/cases_generator/stacking.py +++ b/Tools/cases_generator/stacking.py @@ -261,15 +261,19 @@ def adjust_higher(self, eff: StackEffect) -> None: self.final_offset.higher(eff) def adjust(self, offset: StackOffset) -> None: - for down in offset.deep: + deep = list(offset.deep) + high = list(offset.high) + for down in deep: self.adjust_deeper(down) - for up in offset.high: + for up in high: self.adjust_higher(up) def adjust_inverse(self, offset: StackOffset) -> None: - for down in offset.deep: + deep = list(offset.deep) + high = list(offset.high) + for down in deep: self.adjust_higher(down) - for up in offset.high: + for up in high: self.adjust_deeper(up) def collect_vars(self) -> dict[str, StackEffect]: @@ -426,15 +430,26 @@ def write_components( ) if mgr.instr.name in ("_PUSH_FRAME", "_POP_FRAME"): - # Adjust stack to min_offset (input effects materialized) + # Adjust stack to min_offset. + # This means that all input effects of this instruction + # are materialized, but not its output effects. + # That's as intended, since these two are so special. out.stack_adjust(mgr.min_offset.deep, mgr.min_offset.high) - # Use clone() since adjust_inverse() mutates final_offset - mgr.adjust_inverse(mgr.final_offset.clone()) + # However, for tier 2, pretend the stack is at final offset. + mgr.adjust_inverse(mgr.final_offset) + if tier == TIER_ONE: + # TODO: Check in analyzer that _{PUSH,POP}_FRAME is last. + assert ( + mgr is managers[-1] + ), f"Expected {mgr.instr.name!r} to be the last uop" + assert_no_pokes(managers) if mgr.instr.name == "SAVE_CURRENT_IP": next_instr_is_set = True if cache_offset: out.emit(f"next_instr += {cache_offset};") + if tier == TIER_ONE: + assert_no_pokes(managers) if len(parts) == 1: mgr.instr.write_body(out, 0, mgr.active_caches, tier) @@ -443,19 +458,41 @@ def write_components( mgr.instr.write_body(out, -4, mgr.active_caches, tier) if mgr is managers[-1] and not next_instr_is_set: - # TODO: Explain why this adjustment is needed. + # Adjust the stack to its final depth, *then* write the + # pokes for all preceding uops. + # Note that for array output effects we may still write + # past the stack top. out.stack_adjust(mgr.final_offset.deep, mgr.final_offset.high) - # Use clone() since adjust_inverse() mutates final_offset - mgr.adjust_inverse(mgr.final_offset.clone()) + write_all_pokes(mgr.final_offset, managers, out) + return next_instr_is_set + + +def assert_no_pokes(managers: list[EffectManager]) -> None: + for mgr in managers: for poke in mgr.pokes: if not poke.effect.size and poke.effect.name not in mgr.instr.unmoved_names: - out.assign( - poke.as_stack_effect(), - poke.effect, - ) + assert ( + poke.effect.name == UNUSED + ), f"Unexpected poke of {poke.effect.name} in {mgr.instr.name!r}" - return next_instr_is_set + +def write_all_pokes( + offset: StackOffset, managers: list[EffectManager], out: Formatter +) -> None: + # Emit all remaining pushes (pokes) + for m in managers: + m.adjust_inverse(offset) + write_pokes(m, out) + + +def write_pokes(mgr: EffectManager, out: Formatter) -> None: + for poke in mgr.pokes: + if not poke.effect.size and poke.effect.name not in mgr.instr.unmoved_names: + out.assign( + poke.as_stack_effect(), + poke.effect, + ) def write_single_instr_for_abstract_interp(instr: Instruction, out: Formatter) -> None: @@ -478,8 +515,7 @@ def _write_components_for_abstract_interp( for mgr in managers: if mgr is managers[-1]: out.stack_adjust(mgr.final_offset.deep, mgr.final_offset.high) - # Use clone() since adjust_inverse() mutates final_offset - mgr.adjust_inverse(mgr.final_offset.clone()) + mgr.adjust_inverse(mgr.final_offset) # NULL out the output stack effects for poke in mgr.pokes: if not poke.effect.size and poke.effect.name not in mgr.instr.unmoved_names: From cd2ef21b076b494224985e266c5f5f8b37c66618 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 5 Sep 2023 23:59:40 +0200 Subject: [PATCH 048/357] gh-108962: Skip test_tempfile.test_flags() if not supported (#108964) Skip test_tempfile.test_flags() if chflags() fails with "OSError: [Errno 45] Operation not supported" (ex: on FreeBSD 13). --- Lib/test/test_tempfile.py | 18 +++++++++++++++++- ...3-09-05-23-00-09.gh-issue-108962.R4NwuU.rst | 3 +++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-05-23-00-09.gh-issue-108962.R4NwuU.rst diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index db08fb1c7f2a42..1673507e2f7c91 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -1834,9 +1834,25 @@ def test_modes(self): d.cleanup() self.assertFalse(os.path.exists(d.name)) - @unittest.skipUnless(hasattr(os, 'chflags'), 'requires os.lchflags') + @unittest.skipUnless(hasattr(os, 'chflags'), 'requires os.chflags') def test_flags(self): flags = stat.UF_IMMUTABLE | stat.UF_NOUNLINK + + # skip the test if these flags are not supported (ex: FreeBSD 13) + filename = os_helper.TESTFN + try: + open(filename, "w").close() + try: + os.chflags(filename, flags) + except OSError as exc: + # "OSError: [Errno 45] Operation not supported" + self.skipTest(f"chflags() doesn't support " + f"UF_IMMUTABLE|UF_NOUNLINK: {exc}") + else: + os.chflags(filename, 0) + finally: + os_helper.unlink(filename) + d = self.do_create(recurse=3, dirs=2, files=2) with d: # Change files and directories flags recursively. diff --git a/Misc/NEWS.d/next/Tests/2023-09-05-23-00-09.gh-issue-108962.R4NwuU.rst b/Misc/NEWS.d/next/Tests/2023-09-05-23-00-09.gh-issue-108962.R4NwuU.rst new file mode 100644 index 00000000000000..380fb20b8881b2 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-05-23-00-09.gh-issue-108962.R4NwuU.rst @@ -0,0 +1,3 @@ +Skip ``test_tempfile.test_flags()`` if ``chflags()`` fails with "OSError: +[Errno 45] Operation not supported" (ex: on FreeBSD 13). Patch by Victor +Stinner. From 6f8411cfd68134ccae01b0b4cb332578008a69e3 Mon Sep 17 00:00:00 2001 From: nabin2004 <107109731+nabin2004@users.noreply.github.com> Date: Wed, 6 Sep 2023 06:12:59 +0545 Subject: [PATCH 049/357] gh-108857: improve markup in inspect.Signature.replace() docs (#108862) --- Doc/library/inspect.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 7884308a333020..603ac3263bb9ec 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -730,7 +730,7 @@ function. .. method:: Signature.replace(*[, parameters][, return_annotation]) - Create a new Signature instance based on the instance replace was invoked + Create a new Signature instance based on the instance :meth:`replace` was invoked on. It is possible to pass different ``parameters`` and/or ``return_annotation`` to override the corresponding properties of the base signature. To remove return_annotation from the copied Signature, pass in From 65a2bce70421197605feeed3351a4577462aae06 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Wed, 6 Sep 2023 11:52:53 +0300 Subject: [PATCH 050/357] gh-108717: Speedup `os.DirEntry.is_junction` function (#108718) --- Modules/clinic/posixmodule.c.h | 14 +++++--------- Modules/posixmodule.c | 6 ++---- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 854fd6cf5ec353..c3e7f86b3e33f1 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -10695,22 +10695,18 @@ PyDoc_STRVAR(os_DirEntry_is_junction__doc__, "Return True if the entry is a junction; cached per entry."); #define OS_DIRENTRY_IS_JUNCTION_METHODDEF \ - {"is_junction", _PyCFunction_CAST(os_DirEntry_is_junction), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_junction__doc__}, + {"is_junction", (PyCFunction)os_DirEntry_is_junction, METH_NOARGS, os_DirEntry_is_junction__doc__}, static int -os_DirEntry_is_junction_impl(DirEntry *self, PyTypeObject *defining_class); +os_DirEntry_is_junction_impl(DirEntry *self); static PyObject * -os_DirEntry_is_junction(DirEntry *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +os_DirEntry_is_junction(DirEntry *self, PyObject *Py_UNUSED(ignored)) { PyObject *return_value = NULL; int _return_value; - if (nargs) { - PyErr_SetString(PyExc_TypeError, "is_junction() takes no arguments"); - goto exit; - } - _return_value = os_DirEntry_is_junction_impl(self, defining_class); + _return_value = os_DirEntry_is_junction_impl(self); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; } @@ -11992,4 +11988,4 @@ os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t na #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */ -/*[clinic end generated code: output=30c63cb556431cea input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1dd5aa7495cd6e3a input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index b4c502bef50ba9..c4340397fbe577 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -14576,15 +14576,13 @@ os_DirEntry_is_symlink_impl(DirEntry *self, PyTypeObject *defining_class) /*[clinic input] os.DirEntry.is_junction -> bool - defining_class: defining_class - / Return True if the entry is a junction; cached per entry. [clinic start generated code]*/ static int -os_DirEntry_is_junction_impl(DirEntry *self, PyTypeObject *defining_class) -/*[clinic end generated code: output=7061a07b0ef2cd1f input=475cd36fb7d4723f]*/ +os_DirEntry_is_junction_impl(DirEntry *self) +/*[clinic end generated code: output=97f64d5d99eeccb5 input=4fc8e701eea118a1]*/ { #ifdef MS_WINDOWS return self->win32_lstat.st_reparse_tag == IO_REPARSE_TAG_MOUNT_POINT; From 44892b1c521c593a0ca23614ae27e96f846dd37c Mon Sep 17 00:00:00 2001 From: KH Date: Wed, 6 Sep 2023 18:06:41 +0900 Subject: [PATCH 051/357] Fix a typo in umarshal.py (#108803) Co-authored-by: Kumar Aditya --- Tools/build/umarshal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/build/umarshal.py b/Tools/build/umarshal.py index e05d93cf23c921..8198a1780b8dad 100644 --- a/Tools/build/umarshal.py +++ b/Tools/build/umarshal.py @@ -1,4 +1,4 @@ -# Implementat marshal.loads() in pure Python +# Implementation of marshal.loads() in pure Python import ast From 5f3433f210d25d366fcebfb40adf444c8f46cd59 Mon Sep 17 00:00:00 2001 From: Matthias Bussonnier Date: Wed, 6 Sep 2023 11:41:56 +0200 Subject: [PATCH 052/357] gh-106670: Fix Pdb handling of chained Exceptions with no stacks. (#108865) --- Lib/pdb.py | 29 ++++++++++-- Lib/test/test_pdb.py | 109 +++++++++++++++++++++++++++++++++---------- 2 files changed, 108 insertions(+), 30 deletions(-) diff --git a/Lib/pdb.py b/Lib/pdb.py index b603aca8c04ee3..c31f608e6d9da5 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -494,6 +494,8 @@ def interaction(self, frame, tb_or_exc): Pdb._previous_sigint_handler = None _chained_exceptions, tb = self._get_tb_and_exceptions(tb_or_exc) + if isinstance(tb_or_exc, BaseException): + assert tb is not None, "main exception must have a traceback" with self._hold_exceptions(_chained_exceptions): if self.setup(frame, tb): # no interaction desired at this time (happens if .pdbrc contains @@ -1169,7 +1171,12 @@ def do_exceptions(self, arg): rep = repr(exc) if len(rep) > 80: rep = rep[:77] + "..." - self.message(f"{prompt} {ix:>3} {rep}") + indicator = ( + " -" + if self._chained_exceptions[ix].__traceback__ is None + else f"{ix:>3}" + ) + self.message(f"{prompt} {indicator} {rep}") else: try: number = int(arg) @@ -1177,6 +1184,10 @@ def do_exceptions(self, arg): self.error("Argument must be an integer") return if 0 <= number < len(self._chained_exceptions): + if self._chained_exceptions[number].__traceback__ is None: + self.error("This exception does not have a traceback, cannot jump to it") + return + self._chained_exception_index = number self.setup(None, self._chained_exceptions[number].__traceback__) self.print_stack_entry(self.stack[self.curindex]) @@ -2010,19 +2021,27 @@ def post_mortem(t=None): If `t` is an exception object, the `exceptions` command makes it possible to list and inspect its chained exceptions (if any). """ + return _post_mortem(t, Pdb()) + + +def _post_mortem(t, pdb_instance): + """ + Private version of post_mortem, which allow to pass a pdb instance + for testing purposes. + """ # handling the default if t is None: exc = sys.exception() if exc is not None: t = exc.__traceback__ - if t is None: + if t is None or (isinstance(t, BaseException) and t.__traceback__ is None): raise ValueError("A valid traceback must be passed if no " "exception is being handled") - p = Pdb() - p.reset() - p.interaction(None, t) + pdb_instance.reset() + pdb_instance.interaction(None, t) + def pm(): """Enter post-mortem debugging of the traceback found in sys.last_exc.""" diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index a9edd1a4d83cd9..f6bed84808ed7f 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -848,9 +848,7 @@ def test_post_mortem_chained(): ... try: ... test_function_reraise() ... except Exception as e: - ... # same as pdb.post_mortem(e), but with custom pdb instance. - ... instance.reset() - ... instance.interaction(None, e) + ... pdb._post_mortem(e, instance) >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE ... 'exceptions', @@ -907,11 +905,18 @@ def test_post_mortem_chained(): def test_post_mortem_cause_no_context(): """Test post mortem traceback debugging of chained exception + >>> def make_exc_with_stack(type_, *content, from_=None): + ... try: + ... raise type_(*content) from from_ + ... except Exception as out: + ... return out + ... + >>> def main(): ... try: ... raise ValueError('Context Not Shown') ... except Exception as e1: - ... raise ValueError("With Cause") from TypeError('The Cause') + ... raise ValueError("With Cause") from make_exc_with_stack(TypeError,'The Cause') >>> def test_function(): ... import pdb; @@ -919,12 +924,11 @@ def test_post_mortem_cause_no_context(): ... try: ... main() ... except Exception as e: - ... # same as pdb.post_mortem(e), but with custom pdb instance. - ... instance.reset() - ... instance.interaction(None, e) + ... pdb._post_mortem(e, instance) >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE ... 'exceptions', + ... 'exceptions 0', ... 'exceptions 1', ... 'up', ... 'down', @@ -934,20 +938,23 @@ def test_post_mortem_cause_no_context(): ... test_function() ... except ValueError: ... print('Ok.') - > (5)main() - -> raise ValueError("With Cause") from TypeError('The Cause') + > (5)main() + -> raise ValueError("With Cause") from make_exc_with_stack(TypeError,'The Cause') (Pdb) exceptions - 0 TypeError('The Cause') - > 1 ValueError('With Cause') + 0 TypeError('The Cause') + > 1 ValueError('With Cause') + (Pdb) exceptions 0 + > (3)make_exc_with_stack() + -> raise type_(*content) from from_ (Pdb) exceptions 1 - > (5)main() - -> raise ValueError("With Cause") from TypeError('The Cause') + > (5)main() + -> raise ValueError("With Cause") from make_exc_with_stack(TypeError,'The Cause') (Pdb) up - > (5)test_function() + > (5)test_function() -> main() (Pdb) down - > (5)main() - -> raise ValueError("With Cause") from TypeError('The Cause') + > (5)main() + -> raise ValueError("With Cause") from make_exc_with_stack(TypeError,'The Cause') (Pdb) exit""" @@ -971,9 +978,7 @@ def test_post_mortem_context_of_the_cause(): ... try: ... main() ... except Exception as e: - ... # same as pdb.post_mortem(e), but with custom pdb instance. - ... instance.reset() - ... instance.interaction(None, e) + ... pdb._post_mortem(e, instance) >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE ... 'exceptions', @@ -1046,9 +1051,7 @@ def test_post_mortem_from_none(): ... try: ... main() ... except Exception as e: - ... # same as pdb.post_mortem(e), but with custom pdb instance. - ... instance.reset() - ... instance.interaction(None, e) + ... pdb._post_mortem(e, instance) >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE ... 'exceptions', @@ -1066,6 +1069,64 @@ def test_post_mortem_from_none(): """ +def test_post_mortem_from_no_stack(): + """Test post mortem traceback debugging of chained exception + + especially when one exception has no stack. + + >>> def main(): + ... raise Exception() from Exception() + + + >>> def test_function(): + ... import pdb; + ... instance = pdb.Pdb(nosigint=True, readrc=False) + ... try: + ... main() + ... except Exception as e: + ... pdb._post_mortem(e, instance) + + >>> with PdbTestInput( # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE + ... ["exceptions", + ... "exceptions 0", + ... "exit"], + ... ): + ... try: + ... test_function() + ... except ValueError: + ... print('Correctly reraised.') + > (2)main() + -> raise Exception() from Exception() + (Pdb) exceptions + - Exception() + > 1 Exception() + (Pdb) exceptions 0 + *** This exception does not have a traceback, cannot jump to it + (Pdb) exit + """ + + +def test_post_mortem_single_no_stack(): + """Test post mortem called when origin exception has no stack + + + >>> def test_function(): + ... import pdb; + ... instance = pdb.Pdb(nosigint=True, readrc=False) + ... import sys + ... sys.last_exc = Exception() + ... pdb._post_mortem(sys.last_exc, instance) + + >>> with PdbTestInput( # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE + ... [] + ... ): + ... try: + ... test_function() + ... except ValueError as e: + ... print(e) + A valid traceback must be passed if no exception is being handled + """ + def test_post_mortem_complex(): """Test post mortem traceback debugging of chained exception @@ -1130,9 +1191,7 @@ def test_post_mortem_complex(): ... try: ... main() ... except Exception as e: - ... # same as pdb.post_mortem(e), but with custom pdb instance. - ... instance.reset() - ... instance.interaction(None, e) + ... pdb._post_mortem(e, instance) >>> with PdbTestInput( # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE ... ["exceptions", From 39376cb93d40b8fe588be0c1987272b0f8c49e26 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Wed, 6 Sep 2023 12:54:59 +0100 Subject: [PATCH 053/357] gh-108991: replace _PyFrame_GetState by two simpler functions (#108992) --- Objects/frameobject.c | 51 +++++++++++++++++-------------------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 28f5a5a1222806..7017cc6c0e295f 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -591,39 +591,28 @@ first_line_not_before(int *lines, int len, int line) return result; } -static PyFrameState -_PyFrame_GetState(PyFrameObject *frame) +static bool +frame_is_cleared(PyFrameObject *frame) { assert(!_PyFrame_IsIncomplete(frame->f_frame)); if (frame->f_frame->stacktop == 0) { - return FRAME_CLEARED; + return true; } - switch(frame->f_frame->owner) { - case FRAME_OWNED_BY_GENERATOR: - { - PyGenObject *gen = _PyFrame_GetGenerator(frame->f_frame); - return gen->gi_frame_state; - } - case FRAME_OWNED_BY_THREAD: - { - if (_PyInterpreterFrame_LASTI(frame->f_frame) < 0) { - return FRAME_CREATED; - } - switch (frame->f_frame->prev_instr->op.code) - { - case COPY_FREE_VARS: - case MAKE_CELL: - case RETURN_GENERATOR: - /* Frame not fully initialized */ - return FRAME_CREATED; - default: - return FRAME_EXECUTING; - } - } - case FRAME_OWNED_BY_FRAME_OBJECT: - return FRAME_COMPLETED; + if (frame->f_frame->owner == FRAME_OWNED_BY_GENERATOR) { + PyGenObject *gen = _PyFrame_GetGenerator(frame->f_frame); + return gen->gi_frame_state == FRAME_CLEARED; + } + return false; +} + +static bool frame_is_suspended(PyFrameObject *frame) +{ + assert(!_PyFrame_IsIncomplete(frame->f_frame)); + if (frame->f_frame->owner == FRAME_OWNED_BY_GENERATOR) { + PyGenObject *gen = _PyFrame_GetGenerator(frame->f_frame); + return gen->gi_frame_state == FRAME_SUSPENDED; } - Py_UNREACHABLE(); + return false; } /* Setter for f_lineno - you can set f_lineno from within a trace function in @@ -655,7 +644,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore return -1; } - PyFrameState state = _PyFrame_GetState(f); + bool is_suspended = frame_is_suspended(f); /* * This code preserves the historical restrictions on * setting the line number of a frame. @@ -811,7 +800,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore } assert(unbound == 0); } - if (state == FRAME_SUSPENDED) { + if (is_suspended) { /* Account for value popped by yield */ start_stack = pop_value(start_stack); } @@ -1455,7 +1444,7 @@ void PyFrame_LocalsToFast(PyFrameObject *f, int clear) { assert(!_PyFrame_IsIncomplete(f->f_frame)); - if (f && f->f_fast_as_locals && _PyFrame_GetState(f) != FRAME_CLEARED) { + if (f && f->f_fast_as_locals && !frame_is_cleared(f)) { _PyFrame_LocalsToFast(f->f_frame, clear); f->f_fast_as_locals = 0; } From 1fb20d42c58924e2e941622b3539645c7b843e0e Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Wed, 6 Sep 2023 16:41:38 +0300 Subject: [PATCH 054/357] gh-108983: Add more PEP 526 tests to `test_grammar` (#108984) --- Lib/test/test_grammar.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py index 8507a07e498532..7c15a23a69163b 100644 --- a/Lib/test/test_grammar.py +++ b/Lib/test/test_grammar.py @@ -350,6 +350,11 @@ def test_var_annot_syntax_errors(self): check_syntax_error(self, "x: int: str") check_syntax_error(self, "def f():\n" " nonlocal x: int\n") + check_syntax_error(self, "def f():\n" + " global x: int\n") + check_syntax_error(self, "x: int = y = 1") + check_syntax_error(self, "z = w: int = 1") + check_syntax_error(self, "x: int = y: int = 1") # AST pass check_syntax_error(self, "[x, 0]: int\n") check_syntax_error(self, "f(): int\n") @@ -363,6 +368,12 @@ def test_var_annot_syntax_errors(self): check_syntax_error(self, "def f():\n" " global x\n" " x: int\n") + check_syntax_error(self, "def f():\n" + " x: int\n" + " nonlocal x\n") + check_syntax_error(self, "def f():\n" + " nonlocal x\n" + " x: int\n") def test_var_annot_basic_semantics(self): # execution order From 14d6e197cc56e5256d501839a4e66e3864ab15f0 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 6 Sep 2023 15:54:16 +0200 Subject: [PATCH 055/357] gh-108303: Create Lib/test/test_dataclasses/ directory (#108978) Move test_dataclasses.py and its "dataclass_*.py" modules into the new Lib/test/test_dataclasses/ subdirectory. --- .../__init__.py} | 10 +++++----- Lib/test/{ => test_dataclasses}/dataclass_module_1.py | 0 .../{ => test_dataclasses}/dataclass_module_1_str.py | 0 Lib/test/{ => test_dataclasses}/dataclass_module_2.py | 0 .../{ => test_dataclasses}/dataclass_module_2_str.py | 0 Lib/test/{ => test_dataclasses}/dataclass_textanno.py | 0 Makefile.pre.in | 1 + 7 files changed, 6 insertions(+), 5 deletions(-) rename Lib/test/{test_dataclasses.py => test_dataclasses/__init__.py} (99%) rename Lib/test/{ => test_dataclasses}/dataclass_module_1.py (100%) rename Lib/test/{ => test_dataclasses}/dataclass_module_1_str.py (100%) rename Lib/test/{ => test_dataclasses}/dataclass_module_2.py (100%) rename Lib/test/{ => test_dataclasses}/dataclass_module_2_str.py (100%) rename Lib/test/{ => test_dataclasses}/dataclass_textanno.py (100%) diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses/__init__.py similarity index 99% rename from Lib/test/test_dataclasses.py rename to Lib/test/test_dataclasses/__init__.py index bd8d82438414e6..7c07dfc77de208 100644 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses/__init__.py @@ -3684,10 +3684,10 @@ class C: self.assertEqual(C(10).x, 10) def test_classvar_module_level_import(self): - from test import dataclass_module_1 - from test import dataclass_module_1_str - from test import dataclass_module_2 - from test import dataclass_module_2_str + from test.test_dataclasses import dataclass_module_1 + from test.test_dataclasses import dataclass_module_1_str + from test.test_dataclasses import dataclass_module_2 + from test.test_dataclasses import dataclass_module_2_str for m in (dataclass_module_1, dataclass_module_1_str, dataclass_module_2, dataclass_module_2_str, @@ -3725,7 +3725,7 @@ def test_classvar_module_level_import(self): self.assertNotIn('not_iv4', c.__dict__) def test_text_annotations(self): - from test import dataclass_textanno + from test.test_dataclasses import dataclass_textanno self.assertEqual( get_type_hints(dataclass_textanno.Bar), diff --git a/Lib/test/dataclass_module_1.py b/Lib/test/test_dataclasses/dataclass_module_1.py similarity index 100% rename from Lib/test/dataclass_module_1.py rename to Lib/test/test_dataclasses/dataclass_module_1.py diff --git a/Lib/test/dataclass_module_1_str.py b/Lib/test/test_dataclasses/dataclass_module_1_str.py similarity index 100% rename from Lib/test/dataclass_module_1_str.py rename to Lib/test/test_dataclasses/dataclass_module_1_str.py diff --git a/Lib/test/dataclass_module_2.py b/Lib/test/test_dataclasses/dataclass_module_2.py similarity index 100% rename from Lib/test/dataclass_module_2.py rename to Lib/test/test_dataclasses/dataclass_module_2.py diff --git a/Lib/test/dataclass_module_2_str.py b/Lib/test/test_dataclasses/dataclass_module_2_str.py similarity index 100% rename from Lib/test/dataclass_module_2_str.py rename to Lib/test/test_dataclasses/dataclass_module_2_str.py diff --git a/Lib/test/dataclass_textanno.py b/Lib/test/test_dataclasses/dataclass_textanno.py similarity index 100% rename from Lib/test/dataclass_textanno.py rename to Lib/test/test_dataclasses/dataclass_textanno.py diff --git a/Makefile.pre.in b/Makefile.pre.in index 7b67738f4341a2..eb8f8c4fb943c0 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -2156,6 +2156,7 @@ TESTSUBDIRS= idlelib/idle_test \ test/test_capi \ test/test_cppext \ test/test_ctypes \ + test/test_dataclasses \ test/test_email \ test/test_email/data \ test/test_import \ From b298b395e8ab1725c4f0dd736155b8c818664d42 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 6 Sep 2023 15:56:08 +0200 Subject: [PATCH 056/357] gh-108765: Cleanup #include in Python/*.c files (#108977) Mention one symbol imported by each #include. --- Include/internal/pycore_uops.h | 2 ++ Python/intrinsics.c | 8 ++++---- Python/legacy_tracing.c | 9 +++++---- Python/optimizer.c | 6 +++--- Python/pathconfig.c | 10 ++++++---- Python/perf_trampoline.c | 2 +- Python/pylifecycle.c | 5 +++-- Python/pystate.c | 6 +++--- Python/pystrtod.c | 3 ++- Python/pythonrun.c | 10 +++++----- Python/specialize.c | 6 +++--- Python/suggestions.c | 7 +++---- Python/symtable.c | 2 +- Python/sysmodule.c | 16 +++++++++------- Python/thread.c | 2 +- Python/thread_pthread_stubs.h | 2 +- Python/traceback.c | 4 ++-- Python/tracemalloc.c | 5 +++-- 18 files changed, 57 insertions(+), 48 deletions(-) diff --git a/Include/internal/pycore_uops.h b/Include/internal/pycore_uops.h index 254eeca2361bea..249f5c010e0092 100644 --- a/Include/internal/pycore_uops.h +++ b/Include/internal/pycore_uops.h @@ -8,6 +8,8 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +#include "pycore_frame.h" // _PyInterpreterFrame + #define _Py_UOP_MAX_TRACE_LENGTH 64 typedef struct { diff --git a/Python/intrinsics.c b/Python/intrinsics.c index 8e59c63aea39ff..bbd79ec473f470 100644 --- a/Python/intrinsics.c +++ b/Python/intrinsics.c @@ -5,11 +5,11 @@ #include "pycore_frame.h" #include "pycore_function.h" #include "pycore_global_objects.h" -#include "pycore_intrinsics.h" -#include "pycore_pyerrors.h" -#include "pycore_runtime.h" +#include "pycore_intrinsics.h" // INTRINSIC_PRINT +#include "pycore_pyerrors.h" // _PyErr_SetString() +#include "pycore_runtime.h" // _Py_ID() #include "pycore_sysmodule.h" // _PySys_GetAttr() -#include "pycore_typevarobject.h" +#include "pycore_typevarobject.h" // _Py_make_typevar() /******** Unary functions ********/ diff --git a/Python/legacy_tracing.c b/Python/legacy_tracing.c index 17a13b1361f992..9258091afc7c49 100644 --- a/Python/legacy_tracing.c +++ b/Python/legacy_tracing.c @@ -2,12 +2,13 @@ * Provides callables to forward PEP 669 events to legacy events. */ -#include #include "Python.h" -#include "opcode.h" -#include "pycore_ceval.h" +#include "pycore_ceval.h" // export _PyEval_SetProfile() #include "pycore_object.h" -#include "pycore_sysmodule.h" +#include "pycore_sysmodule.h" // _PySys_Audit() + +#include "opcode.h" +#include typedef struct _PyLegacyEventHandler { PyObject_HEAD diff --git a/Python/optimizer.c b/Python/optimizer.c index 7472f52c50b766..8aaf9f9fd7cb14 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -1,9 +1,9 @@ #include "Python.h" #include "opcode.h" #include "pycore_interp.h" -#include "pycore_opcode_metadata.h" -#include "pycore_opcode_utils.h" -#include "pycore_optimizer.h" +#include "pycore_opcode_metadata.h" // _PyOpcode_OpName() +#include "pycore_opcode_utils.h" // MAX_REAL_OPCODE +#include "pycore_optimizer.h" // _Py_uop_analyze_and_optimize() #include "pycore_pystate.h" // _PyInterpreterState_GET() #include "pycore_uops.h" #include "cpython/optimizer.h" diff --git a/Python/pathconfig.c b/Python/pathconfig.c index afffa134e893ba..0ac64ec8110259 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -1,13 +1,15 @@ /* Path configuration like module_search_path (sys.path) */ #include "Python.h" -#include "marshal.h" // PyMarshal_ReadObjectFromString -#include "osdefs.h" // DELIM -#include "pycore_initconfig.h" -#include "pycore_fileutils.h" +#include "pycore_initconfig.h" // _PyStatus_OK() +#include "pycore_fileutils.h" // _Py_wgetcwd() #include "pycore_pathconfig.h" #include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() #include + +#include "marshal.h" // PyMarshal_ReadObjectFromString +#include "osdefs.h" // DELIM + #ifdef MS_WINDOWS # include // GetFullPathNameW(), MAX_PATH # include diff --git a/Python/perf_trampoline.c b/Python/perf_trampoline.c index 0f1af30226d9fb..209a23b6c1cbc7 100644 --- a/Python/perf_trampoline.c +++ b/Python/perf_trampoline.c @@ -130,7 +130,7 @@ any DWARF information available for them). */ #include "Python.h" -#include "pycore_ceval.h" +#include "pycore_ceval.h" // _PyPerf_Callbacks #include "pycore_frame.h" #include "pycore_interp.h" #include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 64c74f433f222c..92eef6d50712bb 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -17,7 +17,7 @@ #include "pycore_list.h" // _PyList_Fini() #include "pycore_long.h" // _PyLong_InitTypes() #include "pycore_object.h" // _PyDebug_PrintTotalRefs() -#include "pycore_pathconfig.h" // _PyConfig_WritePathConfig() +#include "pycore_pathconfig.h" // _PyPathConfig_UpdateGlobal() #include "pycore_pyerrors.h" // _PyErr_Occurred() #include "pycore_pylifecycle.h" // _PyErr_Print() #include "pycore_pymem.h" // _PyObject_DebugMallocStats() @@ -32,13 +32,14 @@ #include "pycore_typevarobject.h" // _Py_clear_generic_types() #include "pycore_unicodeobject.h" // _PyUnicode_InitTypes() #include "pycore_weakref.h" // _PyWeakref_GET_REF() + #include "opcode.h" #include // setlocale() #include // getenv() #if defined(__APPLE__) -#include +# include #endif #ifdef HAVE_SIGNAL_H diff --git a/Python/pystate.c b/Python/pystate.c index 46ea2c4f678db8..b2b9b9f8776c33 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -6,10 +6,10 @@ #include "pycore_code.h" // stats #include "pycore_dtoa.h" // _dtoa_state_INIT() #include "pycore_frame.h" -#include "pycore_initconfig.h" +#include "pycore_initconfig.h" // _PyStatus_OK() #include "pycore_object.h" // _PyType_InitCache() -#include "pycore_pyerrors.h" -#include "pycore_pylifecycle.h" +#include "pycore_pyerrors.h" // _PyErr_Clear() +#include "pycore_pylifecycle.h" // _PyAST_Fini() #include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() #include "pycore_pystate.h" #include "pycore_runtime_init.h" // _PyRuntimeState_INIT diff --git a/Python/pystrtod.c b/Python/pystrtod.c index 9bb060e3d11979..16bf06f0e6cca2 100644 --- a/Python/pystrtod.c +++ b/Python/pystrtod.c @@ -3,7 +3,8 @@ #include #include "pycore_dtoa.h" // _Py_dg_strtod() #include "pycore_pymath.h" // _PY_SHORT_FLOAT_REPR -#include + +#include // localeconv() /* Case-insensitive string match used for nan and inf detection; t should be lower-case. Returns 1 for a successful match, 0 otherwise. */ diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 231ac78146a0e6..ddd8951cedb1f1 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -12,16 +12,16 @@ #include "Python.h" -#include "pycore_ast.h" // PyAST_mod2obj -#include "pycore_ceval.h" // _Py_EnterRecursiveCall +#include "pycore_ast.h" // PyAST_mod2obj() +#include "pycore_ceval.h" // _Py_EnterRecursiveCall() #include "pycore_compile.h" // _PyAST_Compile() #include "pycore_interp.h" // PyInterpreterState.importlib #include "pycore_object.h" // _PyDebug_PrintTotalRefs() #include "pycore_parser.h" // _PyParser_ASTFromString() -#include "pycore_pyerrors.h" // _PyErr_GetRaisedException, _Py_Offer_Suggestions -#include "pycore_pylifecycle.h" // _Py_UnhandledKeyboardInterrupt +#include "pycore_pyerrors.h" // _PyErr_GetRaisedException() +#include "pycore_pylifecycle.h" // _Py_FdIsInteractive() #include "pycore_pystate.h" // _PyInterpreterState_GET() -#include "pycore_pythonrun.h" // define _PyRun_InteractiveLoopObject() +#include "pycore_pythonrun.h" // export _PyRun_InteractiveLoopObject() #include "pycore_sysmodule.h" // _PySys_Audit() #include "pycore_traceback.h" // _PyTraceBack_Print_Indented() diff --git a/Python/specialize.c b/Python/specialize.c index a794f146c188ec..aa40b3343f3add 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -4,14 +4,14 @@ #include "pycore_code.h" #include "pycore_descrobject.h" // _PyMethodWrapper_Type -#include "pycore_dict.h" +#include "pycore_dict.h" // DICT_KEYS_UNICODE #include "pycore_function.h" // _PyFunction_GetVersionForCurrentState() -#include "pycore_global_strings.h" // _Py_ID() -#include "pycore_long.h" +#include "pycore_long.h" // _PyLong_IsNonNegativeCompact() #include "pycore_moduleobject.h" #include "pycore_object.h" #include "pycore_opcode_metadata.h" // _PyOpcode_Caches #include "pycore_pylifecycle.h" // _PyOS_URandomNonblock() +#include "pycore_runtime.h" // _Py_ID() #include // rand() diff --git a/Python/suggestions.c b/Python/suggestions.c index 12097f793e3575..9247da4c7037a2 100644 --- a/Python/suggestions.c +++ b/Python/suggestions.c @@ -1,10 +1,9 @@ #include "Python.h" +#include "pycore_code.h" // _PyCode_GetVarnames() #include "pycore_frame.h" -#include "pycore_runtime.h" // _PyRuntime -#include "pycore_global_objects.h" // _Py_ID() +#include "pycore_pyerrors.h" // export _Py_UTF8_Edit_Cost() +#include "pycore_runtime.h" // _Py_ID() -#include "pycore_pyerrors.h" -#include "pycore_code.h" // _PyCode_GetVarnames() #include "stdlib_module_names.h" // _Py_stdlib_module_names #define MAX_CANDIDATE_ITEMS 750 diff --git a/Python/symtable.c b/Python/symtable.c index e9adbd5d29b1f9..f157d4c170314a 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -1,5 +1,5 @@ #include "Python.h" -#include "pycore_ast.h" // identifier, stmt_ty +#include "pycore_ast.h" // stmt_ty #include "pycore_parser.h" // _PyParser_ASTFromString() #include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_symtable.h" // PySTEntryObject diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 0ec763c7aa7cf8..3835f760072ef9 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -23,7 +23,7 @@ Data members: #include "pycore_long.h" // _PY_LONG_MAX_STR_DIGITS_THRESHOLD #include "pycore_modsupport.h" // _PyModule_CreateInitialized() #include "pycore_namespace.h" // _PyNamespace_New() -#include "pycore_object.h" // _PyObject_IS_GC(), _PyObject_DebugTypeStats() +#include "pycore_object.h" // _PyObject_DebugTypeStats() #include "pycore_pathconfig.h" // _PyPathConfig_ComputeSysPath0() #include "pycore_pyerrors.h" // _PyErr_GetRaisedException() #include "pycore_pylifecycle.h" // _PyErr_WriteUnraisableDefaultHook() @@ -31,18 +31,19 @@ Data members: #include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() #include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_structseq.h" // _PyStructSequence_InitBuiltinWithFlags() -#include "pycore_sysmodule.h" // Define _PySys_GetSizeOf() +#include "pycore_sysmodule.h" // export _PySys_GetSizeOf() #include "pycore_tuple.h" // _PyTuple_FromArray() #include "frameobject.h" // PyFrame_FastToLocalsWithError() -#include "pydtrace.h" +#include "pydtrace.h" // PyDTrace_AUDIT() #include "osdefs.h" // DELIM #include "stdlib_module_names.h" // _Py_stdlib_module_names + #include #ifdef MS_WINDOWS -#define WIN32_LEAN_AND_MEAN -#include +# define WIN32_LEAN_AND_MEAN +# include #endif /* MS_WINDOWS */ #ifdef MS_COREDLL @@ -52,11 +53,11 @@ extern const char *PyWin_DLLVersionString; #endif #ifdef __EMSCRIPTEN__ -#include +# include #endif #ifdef HAVE_FCNTL_H -#include +# include #endif /*[clinic input] @@ -66,6 +67,7 @@ module sys #include "clinic/sysmodule.c.h" + PyObject * _PySys_GetAttr(PyThreadState *tstate, PyObject *name) { diff --git a/Python/thread.c b/Python/thread.c index 7fc53f9b61360b..1ac2db2937e373 100644 --- a/Python/thread.c +++ b/Python/thread.c @@ -11,7 +11,7 @@ #include "pycore_pythread.h" #ifndef DONT_HAVE_STDIO_H -#include +# include #endif #include diff --git a/Python/thread_pthread_stubs.h b/Python/thread_pthread_stubs.h index 56e5b6141924b4..48bad36ec449ab 100644 --- a/Python/thread_pthread_stubs.h +++ b/Python/thread_pthread_stubs.h @@ -40,7 +40,7 @@ pthread_cond_init(pthread_cond_t *restrict cond, return 0; } -PyAPI_FUNC(int)pthread_cond_destroy(pthread_cond_t *cond) +PyAPI_FUNC(int) pthread_cond_destroy(pthread_cond_t *cond) { return 0; } diff --git a/Python/traceback.c b/Python/traceback.c index 657ddab1cbf615..2fcfa7ca56c140 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -3,9 +3,9 @@ #include "Python.h" -#include "pycore_ast.h" // asdl_seq_* +#include "pycore_ast.h" // asdl_seq_GET() #include "pycore_call.h" // _PyObject_CallMethodFormat() -#include "pycore_compile.h" // _PyAST_Optimize +#include "pycore_compile.h" // _PyAST_Optimize() #include "pycore_fileutils.h" // _Py_BEGIN_SUPPRESS_IPH #include "pycore_frame.h" // _PyFrame_GetCode() #include "pycore_interp.h" // PyInterpreterState.gc diff --git a/Python/tracemalloc.c b/Python/tracemalloc.c index 7d294ea5fe744c..19b64c619feb6a 100644 --- a/Python/tracemalloc.c +++ b/Python/tracemalloc.c @@ -2,11 +2,12 @@ #include "pycore_fileutils.h" // _Py_write_noraise() #include "pycore_gc.h" // PyGC_Head #include "pycore_hashtable.h" // _Py_hashtable_t -#include "pycore_object.h" // _PyType_PreHeaderSize +#include "pycore_object.h" // _PyType_PreHeaderSize() #include "pycore_pymem.h" // _Py_tracemalloc_config #include "pycore_runtime.h" // _Py_ID() -#include "pycore_traceback.h" +#include "pycore_traceback.h" // _Py_DumpASCII() #include + #include "frameobject.h" // _PyInterpreterFrame_GetLine #include // malloc() From a8cae4071c795e55be46e339eda37e241fa0d7f8 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 6 Sep 2023 15:57:01 +0200 Subject: [PATCH 057/357] gh-107219: Fix concurrent.futures terminate_broken() (#108974) Fix a race condition in _ExecutorManagerThread.terminate_broken(): ignore the InvalidStateError on future.set_exception(). It can happen if the future is cancelled before the caller. Moreover, test_crash_big_data() now waits explicitly until the executor completes. --- Lib/concurrent/futures/process.py | 9 ++++++++- Lib/test/test_concurrent_futures/test_deadlock.py | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 301207f59de37a..9933d3d0e040ea 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -489,7 +489,14 @@ def terminate_broken(self, cause): # Mark pending tasks as failed. for work_id, work_item in self.pending_work_items.items(): - work_item.future.set_exception(bpe) + try: + work_item.future.set_exception(bpe) + except _base.InvalidStateError as exc: + # set_exception() fails if the future is cancelled: ignore it. + # Trying to check if the future is cancelled before calling + # set_exception() would leave a race condition if the future is + # cancelled betwen the check and set_exception(). + pass # Delete references to object. See issue16284 del work_item self.pending_work_items.clear() diff --git a/Lib/test/test_concurrent_futures/test_deadlock.py b/Lib/test/test_concurrent_futures/test_deadlock.py index 6b78b360d15627..baac2b51e0d4e2 100644 --- a/Lib/test/test_concurrent_futures/test_deadlock.py +++ b/Lib/test/test_concurrent_futures/test_deadlock.py @@ -239,6 +239,8 @@ def test_crash_big_data(self): with self.assertRaises(BrokenProcessPool): list(executor.map(_crash_with_data, [data] * 10)) + executor.shutdown(wait=True) + create_executor_tests(globals(), ExecutorDeadlockTest, executor_mixins=(ProcessPoolForkMixin, From fbce43a251488f666be9794c908a6613bf8ae260 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 6 Sep 2023 16:34:35 +0200 Subject: [PATCH 058/357] gh-91960: Skip test_gdb if gdb cannot retrive Python frames (#108999) Skip test_gdb if gdb is unable to retrieve Python frame objects: if a frame is "". When Python is built with "clang -Og", gdb can fail to retrive the 'frame' parameter of _PyEval_EvalFrameDefault(). In this case, tests like py_bt() are likely to fail. Without getting access to Python frames, python-gdb.py is mostly clueless on retrieving the Python traceback. Moreover, test_gdb is no longer skipped on macOS if Python is built with Clang. --- Lib/test/test_gdb.py | 7 +++---- .../Tests/2023-09-06-15-36-51.gh-issue-91960.P3nD5v.rst | 7 +++++++ 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-06-15-36-51.gh-issue-91960.P3nD5v.rst diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index c05a2d387c429c..ca50574e46660d 100644 --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -55,10 +55,6 @@ def get_gdb_version(): if not sysconfig.is_python_build(): raise unittest.SkipTest("test_gdb only works on source builds at the moment.") -if 'Clang' in platform.python_compiler() and sys.platform == 'darwin': - 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") @@ -247,6 +243,9 @@ def get_stack_trace(self, source=None, script=None, for pattern in ( '(frame information optimized out)', 'Unable to read information on python frame', + # gh-91960: On Python built with "clang -Og", gdb gets + # "frame=" for _PyEval_EvalFrameDefault() parameter + '(unable to read python frame information)', ): if pattern in out: raise unittest.SkipTest(f"{pattern!r} found in gdb output") diff --git a/Misc/NEWS.d/next/Tests/2023-09-06-15-36-51.gh-issue-91960.P3nD5v.rst b/Misc/NEWS.d/next/Tests/2023-09-06-15-36-51.gh-issue-91960.P3nD5v.rst new file mode 100644 index 00000000000000..46472abf9802bc --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-06-15-36-51.gh-issue-91960.P3nD5v.rst @@ -0,0 +1,7 @@ +Skip ``test_gdb`` if gdb is unable to retrieve Python frame objects: if a +frame is ````. When Python is built with "clang -Og", gdb can +fail to retrive the *frame* parameter of ``_PyEval_EvalFrameDefault()``. In +this case, tests like ``py_bt()`` are likely to fail. Without getting access +to Python frames, ``python-gdb.py`` is mostly clueless on retrieving the +Python traceback. Moreover, ``test_gdb`` is no longer skipped on macOS if +Python is built with Clang. Patch by Victor Stinner. From f8a047941f2e4a1848700c21d58a08c9ec6a9c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Wed, 6 Sep 2023 16:49:44 +0200 Subject: [PATCH 059/357] gh-109002: Ensure only one wheel for each vendored package (#109003) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Output with one wheel: ``` ❯ GITHUB_ACTIONS=true ./Tools/build/verify_ensurepip_wheels.py Verifying checksum for /Volumes/RAMDisk/cpython/Lib/ensurepip/_bundled/pip-23.2.1-py3-none-any.whl. Expected digest: 7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be Actual digest: 7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be ::notice file=/Volumes/RAMDisk/cpython/Lib/ensurepip/_bundled/pip-23.2.1-py3-none-any.whl::Successfully verified the checksum of the pip wheel. ``` Output with two wheels: ``` ❯ GITHUB_ACTIONS=true ./Tools/build/verify_ensurepip_wheels.py ::error file=/Volumes/RAMDisk/cpython/Lib/ensurepip/_bundled/pip-22.0.4-py3-none-any.whl::Found more than one wheel for package pip. ::error file=/Volumes/RAMDisk/cpython/Lib/ensurepip/_bundled/pip-23.2.1-py3-none-any.whl::Found more than one wheel for package pip. ``` Output without wheels: ``` ❯ GITHUB_ACTIONS=true ./Tools/build/verify_ensurepip_wheels.py ::error file=::Could not find a pip wheel on disk. ``` --- Tools/build/verify_ensurepip_wheels.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Tools/build/verify_ensurepip_wheels.py b/Tools/build/verify_ensurepip_wheels.py index 09fd5d9e3103ac..29897425da6c03 100755 --- a/Tools/build/verify_ensurepip_wheels.py +++ b/Tools/build/verify_ensurepip_wheels.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python3 +#!/usr/bin/env python3 """ Compare checksums for wheels in :mod:`ensurepip` against the Cheeseshop. @@ -35,11 +35,17 @@ def print_error(file_path: str, message: str) -> None: def verify_wheel(package_name: str) -> bool: # Find the package on disk - package_path = next(WHEEL_DIR.glob(f"{package_name}*.whl"), None) - if not package_path: - print_error("", f"Could not find a {package_name} wheel on disk.") + package_paths = list(WHEEL_DIR.glob(f"{package_name}*.whl")) + if len(package_paths) != 1: + if package_paths: + for p in package_paths: + print_error(p, f"Found more than one wheel for package {package_name}.") + else: + print_error("", f"Could not find a {package_name} wheel on disk.") return False + package_path = package_paths[0] + print(f"Verifying checksum for {package_path}.") # Find the version of the package used by ensurepip From 2cd170db40ffba357848672ff3d2f8c1e0e74f2c Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Wed, 6 Sep 2023 10:57:40 -0400 Subject: [PATCH 060/357] gh-91960: Add FreeBSD build and test using Cirrus-CI (#91961) Cirrus-CI is a hosted CI service that supports FreeBSD, Linux, macOS, and Windows. Add a .cirrus.yml configuration file to provide CI coverage on pull requests for FreeBSD 13.2. Co-authored-by: Victor Stinner --- .cirrus.yml | 23 +++++++++++++++++++ ...3-09-05-21-42-54.gh-issue-91960.abClTs.rst | 1 + 2 files changed, 24 insertions(+) create mode 100644 .cirrus.yml create mode 100644 Misc/NEWS.d/next/Tests/2023-09-05-21-42-54.gh-issue-91960.abClTs.rst diff --git a/.cirrus.yml b/.cirrus.yml new file mode 100644 index 00000000000000..823b1f921d66d1 --- /dev/null +++ b/.cirrus.yml @@ -0,0 +1,23 @@ +freebsd_task: + freebsd_instance: + matrix: + - image: freebsd-13-2-release-amd64 + # Turn off TCP and UDP blackhole. It is not enabled by default in FreeBSD, + # but it is in the FreeBSD GCE images as used by Cirrus-CI. It causes even + # local local connections to fail with ETIMEDOUT instead of ECONNREFUSED. + # For more information see https://reviews.freebsd.org/D41751 and + # https://github.com/cirruslabs/cirrus-ci-docs/issues/483. + sysctl_script: + - sysctl net.inet.tcp.blackhole=0 + - sysctl net.inet.udp.blackhole=0 + build_script: + - mkdir build + - cd build + - ../configure --with-pydebug + - make -j$(sysctl -n hw.ncpu) + pythoninfo_script: + - cd build && make pythoninfo + test_script: + - cd build + # dtrace fails to build on FreeBSD - see gh-73263 + - make buildbottest TESTOPTS="-j0 -x test_dtrace --timeout=600" diff --git a/Misc/NEWS.d/next/Tests/2023-09-05-21-42-54.gh-issue-91960.abClTs.rst b/Misc/NEWS.d/next/Tests/2023-09-05-21-42-54.gh-issue-91960.abClTs.rst new file mode 100644 index 00000000000000..f63e0874499193 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-05-21-42-54.gh-issue-91960.abClTs.rst @@ -0,0 +1 @@ +FreeBSD 13.2 CI coverage for pull requests is now provided by Cirrus-CI (a hosted CI service that supports Linux, macOS, Windows, and FreeBSD). From 8ff11425783806f8cb78e99f667546b1f7f3428e Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 6 Sep 2023 17:34:31 +0200 Subject: [PATCH 061/357] gh-108851: Fix tomllib recursion tests (#108853) * Add get_recursion_available() and get_recursion_depth() functions to the test.support module. * Change infinite_recursion() default max_depth from 75 to 100. * Fix test_tomllib recursion tests for WASI buildbots: reduce the recursion limit and compute the maximum nested array/dict depending on the current available recursion limit. * test.pythoninfo logs sys.getrecursionlimit(). * Enhance test_sys tests on sys.getrecursionlimit() and sys.setrecursionlimit(). --- Lib/test/pythoninfo.py | 1 + Lib/test/support/__init__.py | 43 ++++++++++- Lib/test/test_support.py | 77 +++++++++++++++++++ Lib/test/test_sys.py | 65 ++++++++-------- Lib/test/test_tomllib/test_misc.py | 27 +++++-- ...-09-03-21-18-35.gh-issue-108851.CCuHyI.rst | 2 + ...-09-03-21-41-10.gh-issue-108851.xFTYOE.rst | 3 + 7 files changed, 177 insertions(+), 41 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-03-21-18-35.gh-issue-108851.CCuHyI.rst create mode 100644 Misc/NEWS.d/next/Tests/2023-09-03-21-41-10.gh-issue-108851.xFTYOE.rst diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index 53af21db0755b1..46522b50dd1e98 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -112,6 +112,7 @@ def collect_sys(info_add): call_func(info_add, 'sys.androidapilevel', sys, 'getandroidapilevel') call_func(info_add, 'sys.windowsversion', sys, 'getwindowsversion') + call_func(info_add, 'sys.getrecursionlimit', sys, 'getrecursionlimit') encoding = sys.getfilesystemencoding() if hasattr(sys, 'getfilesystemencodeerrors'): diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 7bac1160fd8e0a..d39f529499ca50 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -2241,6 +2241,39 @@ def check_disallow_instantiation(testcase, tp, *args, **kwds): msg = f"cannot create '{re.escape(qualname)}' instances" testcase.assertRaisesRegex(TypeError, msg, tp, *args, **kwds) +def get_recursion_depth(): + """Get the recursion depth of the caller function. + + In the __main__ module, at the module level, it should be 1. + """ + try: + import _testinternalcapi + depth = _testinternalcapi.get_recursion_depth() + except (ImportError, RecursionError) as exc: + # sys._getframe() + frame.f_back implementation. + try: + depth = 0 + frame = sys._getframe() + while frame is not None: + depth += 1 + frame = frame.f_back + finally: + # Break any reference cycles. + frame = None + + # Ignore get_recursion_depth() frame. + return max(depth - 1, 1) + +def get_recursion_available(): + """Get the number of available frames before RecursionError. + + It depends on the current recursion depth of the caller function and + sys.getrecursionlimit(). + """ + limit = sys.getrecursionlimit() + depth = get_recursion_depth() + return limit - depth + @contextlib.contextmanager def set_recursion_limit(limit): """Temporarily change the recursion limit.""" @@ -2251,14 +2284,18 @@ def set_recursion_limit(limit): finally: sys.setrecursionlimit(original_limit) -def infinite_recursion(max_depth=75): +def infinite_recursion(max_depth=100): """Set a lower limit for tests that interact with infinite recursions (e.g test_ast.ASTHelpers_Test.test_recursion_direct) since on some debug windows builds, due to not enough functions being inlined the stack size might not handle the default recursion limit (1000). See bpo-11105 for details.""" - return set_recursion_limit(max_depth) - + if max_depth < 3: + raise ValueError("max_depth must be at least 3, got {max_depth}") + depth = get_recursion_depth() + depth = max(depth - 1, 1) # Ignore infinite_recursion() frame. + limit = depth + max_depth + return set_recursion_limit(limit) def ignore_deprecations_from(module: str, *, like: str) -> object: token = object() diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index 86d26b7e8df4d0..64280739f00946 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -685,6 +685,83 @@ def test_has_strftime_extensions(self): else: self.assertTrue(support.has_strftime_extensions) + def test_get_recursion_depth(self): + # test support.get_recursion_depth() + code = textwrap.dedent(""" + from test import support + import sys + + def check(cond): + if not cond: + raise AssertionError("test failed") + + # depth 1 + check(support.get_recursion_depth() == 1) + + # depth 2 + def test_func(): + check(support.get_recursion_depth() == 2) + test_func() + + def test_recursive(depth, limit): + if depth >= limit: + # cannot call get_recursion_depth() at this depth, + # it can raise RecursionError + return + get_depth = support.get_recursion_depth() + print(f"test_recursive: {depth}/{limit}: " + f"get_recursion_depth() says {get_depth}") + check(get_depth == depth) + test_recursive(depth + 1, limit) + + # depth up to 25 + with support.infinite_recursion(max_depth=25): + limit = sys.getrecursionlimit() + print(f"test with sys.getrecursionlimit()={limit}") + test_recursive(2, limit) + + # depth up to 500 + with support.infinite_recursion(max_depth=500): + limit = sys.getrecursionlimit() + print(f"test with sys.getrecursionlimit()={limit}") + test_recursive(2, limit) + """) + script_helper.assert_python_ok("-c", code) + + def test_recursion(self): + # Test infinite_recursion() and get_recursion_available() functions. + def recursive_function(depth): + if depth: + recursive_function(depth - 1) + + for max_depth in (5, 25, 250): + with support.infinite_recursion(max_depth): + available = support.get_recursion_available() + + # Recursion up to 'available' additional frames should be OK. + recursive_function(available) + + # Recursion up to 'available+1' additional frames must raise + # RecursionError. Avoid self.assertRaises(RecursionError) which + # can consume more than 3 frames and so raises RecursionError. + try: + recursive_function(available + 1) + except RecursionError: + pass + else: + self.fail("RecursionError was not raised") + + # Test the bare minimumum: max_depth=3 + with support.infinite_recursion(3): + try: + recursive_function(3) + except RecursionError: + pass + else: + self.fail("RecursionError was not raised") + + #self.assertEqual(available, 2) + # XXX -follows a list of untested API # make_legacy_pyc # is_resource_enabled diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index e8a99244a3a28d..e4a341bd3e3db8 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -279,20 +279,29 @@ def test_switchinterval(self): finally: sys.setswitchinterval(orig) - def test_recursionlimit(self): + def test_getrecursionlimit(self): + limit = sys.getrecursionlimit() + self.assertIsInstance(limit, int) + self.assertGreater(limit, 1) + self.assertRaises(TypeError, sys.getrecursionlimit, 42) - oldlimit = sys.getrecursionlimit() - self.assertRaises(TypeError, sys.setrecursionlimit) - self.assertRaises(ValueError, sys.setrecursionlimit, -42) - sys.setrecursionlimit(10000) - self.assertEqual(sys.getrecursionlimit(), 10000) - sys.setrecursionlimit(oldlimit) + + def test_setrecursionlimit(self): + old_limit = sys.getrecursionlimit() + try: + sys.setrecursionlimit(10_005) + self.assertEqual(sys.getrecursionlimit(), 10_005) + + self.assertRaises(TypeError, sys.setrecursionlimit) + self.assertRaises(ValueError, sys.setrecursionlimit, -42) + finally: + sys.setrecursionlimit(old_limit) def test_recursionlimit_recovery(self): if hasattr(sys, 'gettrace') and sys.gettrace(): self.skipTest('fatal error if run with a trace function') - oldlimit = sys.getrecursionlimit() + old_limit = sys.getrecursionlimit() def f(): f() try: @@ -311,35 +320,31 @@ def f(): with self.assertRaises(RecursionError): f() finally: - sys.setrecursionlimit(oldlimit) + sys.setrecursionlimit(old_limit) @test.support.cpython_only - def test_setrecursionlimit_recursion_depth(self): + def test_setrecursionlimit_to_depth(self): # Issue #25274: Setting a low recursion limit must be blocked if the # current recursion depth is already higher than limit. - from _testinternalcapi import get_recursion_depth - - def set_recursion_limit_at_depth(depth, limit): - recursion_depth = get_recursion_depth() - if recursion_depth >= depth: - with self.assertRaises(RecursionError) as cm: - sys.setrecursionlimit(limit) - self.assertRegex(str(cm.exception), - "cannot set the recursion limit to [0-9]+ " - "at the recursion depth [0-9]+: " - "the limit is too low") - else: - set_recursion_limit_at_depth(depth, limit) - - oldlimit = sys.getrecursionlimit() + old_limit = sys.getrecursionlimit() try: - sys.setrecursionlimit(1000) - - for limit in (10, 25, 50, 75, 100, 150, 200): - set_recursion_limit_at_depth(limit, limit) + depth = support.get_recursion_depth() + with self.subTest(limit=sys.getrecursionlimit(), depth=depth): + # depth + 1 is OK + sys.setrecursionlimit(depth + 1) + + # reset the limit to be able to call self.assertRaises() + # context manager + sys.setrecursionlimit(old_limit) + with self.assertRaises(RecursionError) as cm: + sys.setrecursionlimit(depth) + self.assertRegex(str(cm.exception), + "cannot set the recursion limit to [0-9]+ " + "at the recursion depth [0-9]+: " + "the limit is too low") finally: - sys.setrecursionlimit(oldlimit) + sys.setrecursionlimit(old_limit) def test_getwindowsversion(self): # Raise SkipTest if sys doesn't have getwindowsversion attribute diff --git a/Lib/test/test_tomllib/test_misc.py b/Lib/test/test_tomllib/test_misc.py index a477a219fd9ebd..9e677a337a2835 100644 --- a/Lib/test/test_tomllib/test_misc.py +++ b/Lib/test/test_tomllib/test_misc.py @@ -9,6 +9,7 @@ import sys import tempfile import unittest +from test import support from . import tomllib @@ -92,13 +93,23 @@ def test_deepcopy(self): self.assertEqual(obj_copy, expected_obj) def test_inline_array_recursion_limit(self): - # 465 with default recursion limit - nest_count = int(sys.getrecursionlimit() * 0.465) - recursive_array_toml = "arr = " + nest_count * "[" + nest_count * "]" - tomllib.loads(recursive_array_toml) + with support.infinite_recursion(max_depth=100): + available = support.get_recursion_available() + nest_count = (available // 2) - 2 + # Add details if the test fails + with self.subTest(limit=sys.getrecursionlimit(), + available=available, + nest_count=nest_count): + recursive_array_toml = "arr = " + nest_count * "[" + nest_count * "]" + tomllib.loads(recursive_array_toml) def test_inline_table_recursion_limit(self): - # 310 with default recursion limit - nest_count = int(sys.getrecursionlimit() * 0.31) - recursive_table_toml = nest_count * "key = {" + nest_count * "}" - tomllib.loads(recursive_table_toml) + with support.infinite_recursion(max_depth=100): + available = support.get_recursion_available() + nest_count = (available // 3) - 1 + # Add details if the test fails + with self.subTest(limit=sys.getrecursionlimit(), + available=available, + nest_count=nest_count): + recursive_table_toml = nest_count * "key = {" + nest_count * "}" + tomllib.loads(recursive_table_toml) diff --git a/Misc/NEWS.d/next/Tests/2023-09-03-21-18-35.gh-issue-108851.CCuHyI.rst b/Misc/NEWS.d/next/Tests/2023-09-03-21-18-35.gh-issue-108851.CCuHyI.rst new file mode 100644 index 00000000000000..7a5b3052af22f2 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-03-21-18-35.gh-issue-108851.CCuHyI.rst @@ -0,0 +1,2 @@ +Add ``get_recursion_available()`` and ``get_recursion_depth()`` functions to +the :mod:`test.support` module. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2023-09-03-21-41-10.gh-issue-108851.xFTYOE.rst b/Misc/NEWS.d/next/Tests/2023-09-03-21-41-10.gh-issue-108851.xFTYOE.rst new file mode 100644 index 00000000000000..b35aaebb410afb --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-03-21-41-10.gh-issue-108851.xFTYOE.rst @@ -0,0 +1,3 @@ +Fix ``test_tomllib`` recursion tests for WASI buildbots: reduce the recursion +limit and compute the maximum nested array/dict depending on the current +available recursion limit. Patch by Victor Stinner. From a0773b89dfe5cd2190d539905dd89e7f6455668e Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 6 Sep 2023 17:54:59 +0200 Subject: [PATCH 062/357] gh-108753: Enhance pystats (#108754) Statistics gathering is now off by default. Use the "-X pystats" command line option or set the new PYTHONSTATS environment variable to 1 to turn statistics gathering on at Python startup. Statistics are no longer dumped at exit if statistics gathering was off or statistics have been cleared. Changes: * Add PYTHONSTATS environment variable. * sys._stats_dump() now returns False if statistics are not dumped because they are all equal to zero. * Add PyConfig._pystats member. * Add tests on sys functions and on setting PyConfig._pystats to 1. * Add Include/cpython/pystats.h and Include/internal/pycore_pystats.h header files. * Rename '_py_stats' variable to '_Py_stats'. * Exclude Include/cpython/pystats.h from the Py_LIMITED_API. * Move pystats.h include from object.h to Python.h. * Add _Py_StatsOn() and _Py_StatsOff() functions. Remove '_py_stats_struct' variable from the API: make it static in specialize.c. * Document API in Include/pystats.h and Include/cpython/pystats.h. * Complete pystats documentation in Doc/using/configure.rst. * Don't write "all zeros" stats: if _stats_off() and _stats_clear() or _stats_dump() were called. * _PyEval_Fini() now always call _Py_PrintSpecializationStats() which does nothing if stats are all zeros. Co-authored-by: Michael Droettboom --- Doc/using/configure.rst | 61 +++++++++++++- Include/cpython/initconfig.h | 5 ++ Include/cpython/pystats.h | 120 ++++++++++++++++++++++++++++ Include/internal/pycore_code.h | 18 ++--- Include/internal/pycore_pystats.h | 21 +++++ Include/pystats.h | 124 +++-------------------------- Lib/test/test_embed.py | 9 +++ Lib/test/test_sys.py | 9 +++ Makefile.pre.in | 2 + Modules/gcmodule.c | 10 +-- PCbuild/pythoncore.vcxproj | 2 + PCbuild/pythoncore.vcxproj.filters | 6 ++ Programs/_testembed.c | 7 ++ Python/ceval_gil.c | 5 +- Python/ceval_macros.h | 2 +- Python/clinic/sysmodule.c.h | 24 ++++-- Python/initconfig.c | 34 +++++++- Python/specialize.c | 98 +++++++++++++++-------- Python/sysmodule.c | 28 ++++--- 19 files changed, 402 insertions(+), 183 deletions(-) create mode 100644 Include/cpython/pystats.h create mode 100644 Include/internal/pycore_pystats.h diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index fe35372603fdd8..ad58255c33b33b 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -192,14 +192,69 @@ General Options .. cmdoption:: --enable-pystats - Turn on internal statistics gathering. + Turn on internal Python performance statistics gathering. + + By default, statistics gathering is off. Use ``python3 -X pystats`` command + or set ``PYTHONSTATS=1`` environment variable to turn on statistics + gathering at Python startup. + + At Python exit, dump statistics if statistics gathering was on and not + cleared. + + Effects: + + * Add :option:`-X pystats <-X>` command line option. + * Add :envvar:`!PYTHONSTATS` environment variable. + * Define the ``Py_STATS`` macro. + * Add functions to the :mod:`sys` module: + + * :func:`!sys._stats_on`: Turns on statistics gathering. + * :func:`!sys._stats_off`: Turns off statistics gathering. + * :func:`!sys._stats_clear`: Clears the statistics. + * :func:`!sys._stats_dump`: Dump statistics to file, and clears the statistics. The statistics will be dumped to a arbitrary (probably unique) file in - ``/tmp/py_stats/``, or ``C:\temp\py_stats\`` on Windows. If that directory - does not exist, results will be printed on stdout. + ``/tmp/py_stats/`` (Unix) or ``C:\temp\py_stats\`` (Windows). If that + directory does not exist, results will be printed on stderr. Use ``Tools/scripts/summarize_stats.py`` to read the stats. + Statistics: + + * Opcode: + + * Specialization: success, failure, hit, deferred, miss, deopt, failures; + * Execution count; + * Pair count. + + * Call: + + * Inlined Python calls; + * PyEval calls; + * Frames pushed; + * Frame object created; + * Eval calls: vector, generator, legacy, function VECTORCALL, build class, + slot, function "ex", API, method. + + * Object: + + * incref and decref; + * interpreter incref and decref; + * allocations: all, 512 bytes, 4 kiB, big; + * free; + * to/from free lists; + * dictionary materialized/dematerialized; + * type cache; + * optimization attemps; + * optimization traces created/executed; + * uops executed. + + * Garbage collector: + + * Garbage collections; + * Objects visited; + * Objects collected. + .. versionadded:: 3.11 .. cmdoption:: --disable-gil diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index 7fb7a9868be926..ee130467824daa 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -215,6 +215,11 @@ typedef struct PyConfig { // If non-zero, we believe we're running from a source tree. int _is_python_build; + +#ifdef Py_STATS + // If non-zero, turns on statistics gathering. + int _pystats; +#endif } PyConfig; PyAPI_FUNC(void) PyConfig_InitPythonConfig(PyConfig *config); diff --git a/Include/cpython/pystats.h b/Include/cpython/pystats.h new file mode 100644 index 00000000000000..150e16faa96ca1 --- /dev/null +++ b/Include/cpython/pystats.h @@ -0,0 +1,120 @@ +// Statistics on Python performance. +// +// API: +// +// - _Py_INCREF_STAT_INC() and _Py_DECREF_STAT_INC() used by Py_INCREF() +// and Py_DECREF(). +// - _Py_stats variable +// +// Functions of the sys module: +// +// - sys._stats_on() +// - sys._stats_off() +// - sys._stats_clear() +// - sys._stats_dump() +// +// Python must be built with ./configure --enable-pystats to define the +// Py_STATS macro. +// +// Define _PY_INTERPRETER macro to increment interpreter_increfs and +// interpreter_decrefs. Otherwise, increment increfs and decrefs. + +#ifndef Py_CPYTHON_PYSTATS_H +# error "this header file must not be included directly" +#endif + +#define SPECIALIZATION_FAILURE_KINDS 36 + +/* Stats for determining who is calling PyEval_EvalFrame */ +#define EVAL_CALL_TOTAL 0 +#define EVAL_CALL_VECTOR 1 +#define EVAL_CALL_GENERATOR 2 +#define EVAL_CALL_LEGACY 3 +#define EVAL_CALL_FUNCTION_VECTORCALL 4 +#define EVAL_CALL_BUILD_CLASS 5 +#define EVAL_CALL_SLOT 6 +#define EVAL_CALL_FUNCTION_EX 7 +#define EVAL_CALL_API 8 +#define EVAL_CALL_METHOD 9 + +#define EVAL_CALL_KINDS 10 + +typedef struct _specialization_stats { + uint64_t success; + uint64_t failure; + uint64_t hit; + uint64_t deferred; + uint64_t miss; + uint64_t deopt; + uint64_t failure_kinds[SPECIALIZATION_FAILURE_KINDS]; +} SpecializationStats; + +typedef struct _opcode_stats { + SpecializationStats specialization; + uint64_t execution_count; + uint64_t pair_count[256]; +} OpcodeStats; + +typedef struct _call_stats { + uint64_t inlined_py_calls; + uint64_t pyeval_calls; + uint64_t frames_pushed; + uint64_t frame_objects_created; + uint64_t eval_calls[EVAL_CALL_KINDS]; +} CallStats; + +typedef struct _object_stats { + uint64_t increfs; + uint64_t decrefs; + uint64_t interpreter_increfs; + uint64_t interpreter_decrefs; + uint64_t allocations; + uint64_t allocations512; + uint64_t allocations4k; + uint64_t allocations_big; + uint64_t frees; + uint64_t to_freelist; + uint64_t from_freelist; + uint64_t new_values; + uint64_t dict_materialized_on_request; + uint64_t dict_materialized_new_key; + uint64_t dict_materialized_too_big; + uint64_t dict_materialized_str_subclass; + uint64_t dict_dematerialized; + uint64_t type_cache_hits; + uint64_t type_cache_misses; + uint64_t type_cache_dunder_hits; + uint64_t type_cache_dunder_misses; + uint64_t type_cache_collisions; + uint64_t optimization_attempts; + uint64_t optimization_traces_created; + uint64_t optimization_traces_executed; + uint64_t optimization_uops_executed; + /* Temporary value used during GC */ + uint64_t object_visits; +} ObjectStats; + +typedef struct _gc_stats { + uint64_t collections; + uint64_t object_visits; + uint64_t objects_collected; +} GCStats; + +typedef struct _stats { + OpcodeStats opcode_stats[256]; + CallStats call_stats; + ObjectStats object_stats; + GCStats *gc_stats; +} PyStats; + + +// Export for shared extensions like 'math' +PyAPI_DATA(PyStats*) _Py_stats; + +#ifdef _PY_INTERPRETER +# define _Py_INCREF_STAT_INC() do { if (_Py_stats) _Py_stats->object_stats.interpreter_increfs++; } while (0) +# define _Py_DECREF_STAT_INC() do { if (_Py_stats) _Py_stats->object_stats.interpreter_decrefs++; } while (0) +#else +# define _Py_INCREF_STAT_INC() do { if (_Py_stats) _Py_stats->object_stats.increfs++; } while (0) +# define _Py_DECREF_STAT_INC() do { if (_Py_stats) _Py_stats->object_stats.decrefs++; } while (0) +#endif diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index f5127a81144353..7c6629074758da 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -268,17 +268,17 @@ extern int _PyStaticCode_Init(PyCodeObject *co); #ifdef Py_STATS -#define STAT_INC(opname, name) do { if (_py_stats) _py_stats->opcode_stats[opname].specialization.name++; } while (0) -#define STAT_DEC(opname, name) do { if (_py_stats) _py_stats->opcode_stats[opname].specialization.name--; } while (0) -#define OPCODE_EXE_INC(opname) do { if (_py_stats) _py_stats->opcode_stats[opname].execution_count++; } while (0) -#define CALL_STAT_INC(name) do { if (_py_stats) _py_stats->call_stats.name++; } while (0) -#define OBJECT_STAT_INC(name) do { if (_py_stats) _py_stats->object_stats.name++; } while (0) +#define STAT_INC(opname, name) do { if (_Py_stats) _Py_stats->opcode_stats[opname].specialization.name++; } while (0) +#define STAT_DEC(opname, name) do { if (_Py_stats) _Py_stats->opcode_stats[opname].specialization.name--; } while (0) +#define OPCODE_EXE_INC(opname) do { if (_Py_stats) _Py_stats->opcode_stats[opname].execution_count++; } while (0) +#define CALL_STAT_INC(name) do { if (_Py_stats) _Py_stats->call_stats.name++; } while (0) +#define OBJECT_STAT_INC(name) do { if (_Py_stats) _Py_stats->object_stats.name++; } while (0) #define OBJECT_STAT_INC_COND(name, cond) \ - do { if (_py_stats && cond) _py_stats->object_stats.name++; } while (0) -#define EVAL_CALL_STAT_INC(name) do { if (_py_stats) _py_stats->call_stats.eval_calls[name]++; } while (0) + do { if (_Py_stats && cond) _Py_stats->object_stats.name++; } while (0) +#define EVAL_CALL_STAT_INC(name) do { if (_Py_stats) _Py_stats->call_stats.eval_calls[name]++; } while (0) #define EVAL_CALL_STAT_INC_IF_FUNCTION(name, callable) \ - do { if (_py_stats && PyFunction_Check(callable)) _py_stats->call_stats.eval_calls[name]++; } while (0) -#define GC_STAT_ADD(gen, name, n) do { if (_py_stats) _py_stats->gc_stats[(gen)].name += (n); } while (0) + do { if (_Py_stats && PyFunction_Check(callable)) _Py_stats->call_stats.eval_calls[name]++; } while (0) +#define GC_STAT_ADD(gen, name, n) do { if (_Py_stats) _Py_stats->gc_stats[(gen)].name += (n); } while (0) // Export for '_opcode' shared extension PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void); diff --git a/Include/internal/pycore_pystats.h b/Include/internal/pycore_pystats.h new file mode 100644 index 00000000000000..f8af398a560586 --- /dev/null +++ b/Include/internal/pycore_pystats.h @@ -0,0 +1,21 @@ +#ifndef Py_INTERNAL_PYSTATS_H +#define Py_INTERNAL_PYSTATS_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#ifdef Py_STATS +extern void _Py_StatsOn(void); +extern void _Py_StatsOff(void); +extern void _Py_StatsClear(void); +extern int _Py_PrintSpecializationStats(int to_file); +#endif + +#ifdef __cplusplus +} +#endif +#endif // !Py_INTERNAL_PYSTATS_H diff --git a/Include/pystats.h b/Include/pystats.h index b1957596745f00..acfa32201711e0 100644 --- a/Include/pystats.h +++ b/Include/pystats.h @@ -1,4 +1,9 @@ - +// Statistics on Python performance (public API). +// +// Define _Py_INCREF_STAT_INC() and _Py_DECREF_STAT_INC() used by Py_INCREF() +// and Py_DECREF(). +// +// See Include/cpython/pystats.h for the full API. #ifndef Py_PYSTATS_H #define Py_PYSTATS_H @@ -6,119 +11,16 @@ extern "C" { #endif -#ifdef Py_STATS - -#define SPECIALIZATION_FAILURE_KINDS 36 - -/* Stats for determining who is calling PyEval_EvalFrame */ -#define EVAL_CALL_TOTAL 0 -#define EVAL_CALL_VECTOR 1 -#define EVAL_CALL_GENERATOR 2 -#define EVAL_CALL_LEGACY 3 -#define EVAL_CALL_FUNCTION_VECTORCALL 4 -#define EVAL_CALL_BUILD_CLASS 5 -#define EVAL_CALL_SLOT 6 -#define EVAL_CALL_FUNCTION_EX 7 -#define EVAL_CALL_API 8 -#define EVAL_CALL_METHOD 9 - -#define EVAL_CALL_KINDS 10 - -typedef struct _specialization_stats { - uint64_t success; - uint64_t failure; - uint64_t hit; - uint64_t deferred; - uint64_t miss; - uint64_t deopt; - uint64_t failure_kinds[SPECIALIZATION_FAILURE_KINDS]; -} SpecializationStats; - -typedef struct _opcode_stats { - SpecializationStats specialization; - uint64_t execution_count; - uint64_t pair_count[256]; -} OpcodeStats; - -typedef struct _call_stats { - uint64_t inlined_py_calls; - uint64_t pyeval_calls; - uint64_t frames_pushed; - uint64_t frame_objects_created; - uint64_t eval_calls[EVAL_CALL_KINDS]; -} CallStats; - -typedef struct _object_stats { - uint64_t increfs; - uint64_t decrefs; - uint64_t interpreter_increfs; - uint64_t interpreter_decrefs; - uint64_t allocations; - uint64_t allocations512; - uint64_t allocations4k; - uint64_t allocations_big; - uint64_t frees; - uint64_t to_freelist; - uint64_t from_freelist; - uint64_t new_values; - uint64_t dict_materialized_on_request; - uint64_t dict_materialized_new_key; - uint64_t dict_materialized_too_big; - uint64_t dict_materialized_str_subclass; - uint64_t dict_dematerialized; - uint64_t type_cache_hits; - uint64_t type_cache_misses; - uint64_t type_cache_dunder_hits; - uint64_t type_cache_dunder_misses; - uint64_t type_cache_collisions; - uint64_t optimization_attempts; - uint64_t optimization_traces_created; - uint64_t optimization_traces_executed; - uint64_t optimization_uops_executed; - /* Temporary value used during GC */ - uint64_t object_visits; -} ObjectStats; - -typedef struct _gc_stats { - uint64_t collections; - uint64_t object_visits; - uint64_t objects_collected; -} GCStats; - -typedef struct _stats { - OpcodeStats opcode_stats[256]; - CallStats call_stats; - ObjectStats object_stats; - GCStats *gc_stats; -} PyStats; - - -PyAPI_DATA(PyStats) _py_stats_struct; -PyAPI_DATA(PyStats *) _py_stats; - -extern void _Py_StatsClear(void); -extern void _Py_PrintSpecializationStats(int to_file); - -#ifdef _PY_INTERPRETER - -#define _Py_INCREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.interpreter_increfs++; } while (0) -#define _Py_DECREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.interpreter_decrefs++; } while (0) - +#if defined(Py_STATS) && !defined(Py_LIMITED_API) +# define Py_CPYTHON_PYSTATS_H +# include "cpython/pystats.h" +# undef Py_CPYTHON_PYSTATS_H #else - -#define _Py_INCREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.increfs++; } while (0) -#define _Py_DECREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.decrefs++; } while (0) - -#endif - -#else - -#define _Py_INCREF_STAT_INC() ((void)0) -#define _Py_DECREF_STAT_INC() ((void)0) - +# define _Py_INCREF_STAT_INC() ((void)0) +# define _Py_DECREF_STAT_INC() ((void)0) #endif // !Py_STATS #ifdef __cplusplus } #endif -#endif /* !Py_PYSTATs_H */ +#endif // !Py_PYSTATS_H diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 50c9f61017e022..7f1a4e665f3b5d 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -26,6 +26,7 @@ PYMEM_ALLOCATOR_NOT_SET = 0 PYMEM_ALLOCATOR_DEBUG = 2 PYMEM_ALLOCATOR_MALLOC = 3 +Py_STATS = hasattr(sys, '_stats_on') # _PyCoreConfig_InitCompatConfig() API_COMPAT = 1 @@ -512,6 +513,8 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'safe_path': 0, '_is_python_build': IGNORE_CONFIG, } + if Py_STATS: + CONFIG_COMPAT['_pystats'] = 0 if MS_WINDOWS: CONFIG_COMPAT.update({ 'legacy_windows_stdio': 0, @@ -895,6 +898,8 @@ def test_init_from_config(self): 'check_hash_pycs_mode': 'always', 'pathconfig_warnings': 0, } + if Py_STATS: + config['_pystats'] = 1 self.check_all_configs("test_init_from_config", config, preconfig, api=API_COMPAT) @@ -927,6 +932,8 @@ def test_init_compat_env(self): 'safe_path': 1, 'int_max_str_digits': 4567, } + if Py_STATS: + config['_pystats'] = 1 self.check_all_configs("test_init_compat_env", config, preconfig, api=API_COMPAT) @@ -960,6 +967,8 @@ def test_init_python_env(self): 'safe_path': 1, 'int_max_str_digits': 4567, } + if Py_STATS: + config['_pystats'] = 1 self.check_all_configs("test_init_python_env", config, preconfig, api=API_PYTHON) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index e4a341bd3e3db8..f4948ceec66226 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -1200,6 +1200,15 @@ class MyType: get_objects = sys.getobjects(3, MyType) self.assertEqual(len(get_objects), 3) + @unittest.skipUnless(hasattr(sys, '_stats_on'), 'need Py_STATS build') + def test_pystats(self): + # Call the functions, just check that they don't crash + # Cannot save/restore state. + sys._stats_on() + sys._stats_off() + sys._stats_clear() + sys._stats_dump() + @test.support.cpython_only class UnraisableHookTest(unittest.TestCase): diff --git a/Makefile.pre.in b/Makefile.pre.in index eb8f8c4fb943c0..cf77cbd13ad4d9 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1724,6 +1724,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/pylifecycle.h \ $(srcdir)/Include/cpython/pymem.h \ $(srcdir)/Include/cpython/pystate.h \ + $(srcdir)/Include/cpython/pystats.h \ $(srcdir)/Include/cpython/pythonrun.h \ $(srcdir)/Include/cpython/pythread.h \ $(srcdir)/Include/cpython/setobject.h \ @@ -1798,6 +1799,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_pymem.h \ $(srcdir)/Include/internal/pycore_pymem_init.h \ $(srcdir)/Include/internal/pycore_pystate.h \ + $(srcdir)/Include/internal/pycore_pystats.h \ $(srcdir)/Include/internal/pycore_pythonrun.h \ $(srcdir)/Include/internal/pycore_pythread.h \ $(srcdir)/Include/internal/pycore_range.h \ diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 35a35091bf4511..632cabdf4bcfbd 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1200,8 +1200,8 @@ gc_collect_main(PyThreadState *tstate, int generation, { GC_STAT_ADD(generation, collections, 1); #ifdef Py_STATS - if (_py_stats) { - _py_stats->object_stats.object_visits = 0; + if (_Py_stats) { + _Py_stats->object_stats.object_visits = 0; } #endif int i; @@ -1362,10 +1362,10 @@ gc_collect_main(PyThreadState *tstate, int generation, GC_STAT_ADD(generation, objects_collected, m); #ifdef Py_STATS - if (_py_stats) { + if (_Py_stats) { GC_STAT_ADD(generation, object_visits, - _py_stats->object_stats.object_visits); - _py_stats->object_stats.object_visits = 0; + _Py_stats->object_stats.object_visits); + _Py_stats->object_stats.object_visits = 0; } #endif diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 4cd095b28e510f..04752a8029acc2 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -176,6 +176,7 @@ + @@ -261,6 +262,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index af1669209a9049..4ad02778466925 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -492,6 +492,9 @@ Include\cpython + + Include\cpython + Include\cpython @@ -693,6 +696,9 @@ Include\internal + + Include\internal + Include\internal diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 7ee64b22925f0c..bc991020d0fa77 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -708,6 +708,10 @@ static int test_init_from_config(void) config.pathconfig_warnings = 0; config.safe_path = 1; +#ifdef Py_STATS + putenv("PYTHONSTATS="); + config._pystats = 1; +#endif putenv("PYTHONINTMAXSTRDIGITS=6666"); config.int_max_str_digits = 31337; @@ -778,6 +782,9 @@ static void set_most_env_vars(void) putenv("PYTHONPLATLIBDIR=env_platlibdir"); putenv("PYTHONSAFEPATH=1"); putenv("PYTHONINTMAXSTRDIGITS=4567"); +#ifdef Py_STATS + putenv("PYTHONSTATS=1"); +#endif } diff --git a/Python/ceval_gil.c b/Python/ceval_gil.c index 7c9ad07cc7207b..e53ffa76b1164b 100644 --- a/Python/ceval_gil.c +++ b/Python/ceval_gil.c @@ -2,11 +2,12 @@ #include "Python.h" #include "pycore_atomic.h" // _Py_atomic_int #include "pycore_ceval.h" // _PyEval_SignalReceived() -#include "pycore_pyerrors.h" // _PyErr_GetRaisedException() -#include "pycore_pylifecycle.h" // _PyErr_Print() #include "pycore_initconfig.h" // _PyStatus_OK() #include "pycore_interp.h" // _Py_RunGC() +#include "pycore_pyerrors.h" // _PyErr_GetRaisedException() +#include "pycore_pylifecycle.h" // _PyErr_Print() #include "pycore_pymem.h" // _PyMem_IsPtrFreed() +#include "pycore_pystats.h" // _Py_PrintSpecializationStats() /* Notes about the implementation: diff --git a/Python/ceval_macros.h b/Python/ceval_macros.h index 4b7c4448e0ea25..81fbb7982ad11c 100644 --- a/Python/ceval_macros.h +++ b/Python/ceval_macros.h @@ -64,7 +64,7 @@ do { \ frame->prev_instr = next_instr++; \ OPCODE_EXE_INC(op); \ - if (_py_stats) _py_stats->opcode_stats[lastopcode].pair_count[op]++; \ + if (_Py_stats) _Py_stats->opcode_stats[lastopcode].pair_count[op]++; \ lastopcode = op; \ } while (0) #else diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index a4b39873735fd9..30691c3d08ae67 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -1120,7 +1120,7 @@ PyDoc_STRVAR(sys__stats_on__doc__, "_stats_on($module, /)\n" "--\n" "\n" -"Turns on stats gathering (stats gathering is on by default)."); +"Turns on stats gathering (stats gathering is off by default)."); #define SYS__STATS_ON_METHODDEF \ {"_stats_on", (PyCFunction)sys__stats_on, METH_NOARGS, sys__stats_on__doc__}, @@ -1142,7 +1142,7 @@ PyDoc_STRVAR(sys__stats_off__doc__, "_stats_off($module, /)\n" "--\n" "\n" -"Turns off stats gathering (stats gathering is on by default)."); +"Turns off stats gathering (stats gathering is off by default)."); #define SYS__STATS_OFF_METHODDEF \ {"_stats_off", (PyCFunction)sys__stats_off, METH_NOARGS, sys__stats_off__doc__}, @@ -1186,18 +1186,30 @@ PyDoc_STRVAR(sys__stats_dump__doc__, "_stats_dump($module, /)\n" "--\n" "\n" -"Dump stats to file, and clears the stats."); +"Dump stats to file, and clears the stats.\n" +"\n" +"Return False if no statistics were not dumped because stats gathering was off."); #define SYS__STATS_DUMP_METHODDEF \ {"_stats_dump", (PyCFunction)sys__stats_dump, METH_NOARGS, sys__stats_dump__doc__}, -static PyObject * +static int sys__stats_dump_impl(PyObject *module); static PyObject * sys__stats_dump(PyObject *module, PyObject *Py_UNUSED(ignored)) { - return sys__stats_dump_impl(module); + PyObject *return_value = NULL; + int _return_value; + + _return_value = sys__stats_dump_impl(module); + if ((_return_value == -1) && PyErr_Occurred()) { + goto exit; + } + return_value = PyBool_FromLong((long)_return_value); + +exit: + return return_value; } #endif /* defined(Py_STATS) */ @@ -1411,4 +1423,4 @@ sys__getframemodulename(PyObject *module, PyObject *const *args, Py_ssize_t narg #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=6619682ea70e7375 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=549bb1f92a15f916 input=a9049054013a1b77]*/ diff --git a/Python/initconfig.c b/Python/initconfig.c index f9c5c64f9c8759..a0467f51d4834e 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -9,6 +9,7 @@ #include "pycore_pylifecycle.h" // _Py_PreInitializeFromConfig() #include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() #include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_pystats.h" // _Py_StatsOn() #include "osdefs.h" // DELIM @@ -186,7 +187,11 @@ static const char usage_envvars[] = "PYTHONSAFEPATH : don't prepend a potentially unsafe path to sys.path (-P)\n" "PYTHONUNBUFFERED : disable stdout/stderr buffering (-u)\n" "PYTHONVERBOSE : trace import statements (-v)\n" -"PYTHONWARNINGS=arg : warning control (-W arg)\n"; +"PYTHONWARNINGS=arg : warning control (-W arg)\n" +#ifdef Py_STATS +"PYTHONSTATS : turns on statistics gathering\n" +#endif +; #if defined(MS_WINDOWS) # define PYTHONHOMEHELP "\\python{major}{minor}" @@ -630,6 +635,9 @@ config_check_consistency(const PyConfig *config) assert(config->int_max_str_digits >= 0); // config->use_frozen_modules is initialized later // by _PyConfig_InitImportConfig(). +#ifdef Py_STATS + assert(config->_pystats >= 0); +#endif return 1; } #endif @@ -951,6 +959,9 @@ _PyConfig_Copy(PyConfig *config, const PyConfig *config2) COPY_WSTRLIST(orig_argv); COPY_ATTR(_is_python_build); COPY_ATTR(int_max_str_digits); +#ifdef Py_STATS + COPY_ATTR(_pystats); +#endif #undef COPY_ATTR #undef COPY_WSTR_ATTR @@ -1058,6 +1069,9 @@ _PyConfig_AsDict(const PyConfig *config) SET_ITEM_INT(safe_path); SET_ITEM_INT(_is_python_build); SET_ITEM_INT(int_max_str_digits); +#ifdef Py_STATS + SET_ITEM_INT(_pystats); +#endif return dict; @@ -1365,6 +1379,9 @@ _PyConfig_FromDict(PyConfig *config, PyObject *dict) GET_UINT(safe_path); GET_UINT(_is_python_build); GET_INT(int_max_str_digits); +#ifdef Py_STATS + GET_UINT(_pystats); +#endif #undef CHECK_VALUE #undef GET_UINT @@ -2116,7 +2133,13 @@ config_read(PyConfig *config, int compute_path_config) #ifdef Py_STATS if (config_get_xoption(config, L"pystats")) { - _py_stats = &_py_stats_struct; + config->_pystats = 1; + } + else if (config_get_env(config, "PYTHONSTATS")) { + config->_pystats = 1; + } + if (config->_pystats < 0) { + config->_pystats = 0; } #endif @@ -2254,6 +2277,13 @@ _PyConfig_Write(const PyConfig *config, _PyRuntimeState *runtime) { return _PyStatus_NO_MEMORY(); } + +#ifdef Py_STATS + if (config->_pystats) { + _Py_StatsOn(); + } +#endif + return _PyStatus_OK(); } diff --git a/Python/specialize.c b/Python/specialize.c index aa40b3343f3add..e072167ff38ce9 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -13,17 +13,17 @@ #include "pycore_pylifecycle.h" // _PyOS_URandomNonblock() #include "pycore_runtime.h" // _Py_ID() - #include // rand() + /* For guidance on adding or extending families of instructions see * ./adaptive.md */ #ifdef Py_STATS GCStats _py_gc_stats[NUM_GENERATIONS] = { 0 }; -PyStats _py_stats_struct = { .gc_stats = &_py_gc_stats[0] }; -PyStats *_py_stats = NULL; +static PyStats _Py_stats_struct = { .gc_stats = _py_gc_stats }; +PyStats *_Py_stats = NULL; #define ADD_STAT_TO_DICT(res, field) \ do { \ @@ -83,7 +83,7 @@ add_stat_dict( int opcode, const char *name) { - SpecializationStats *stats = &_py_stats_struct.opcode_stats[opcode].specialization; + SpecializationStats *stats = &_Py_stats_struct.opcode_stats[opcode].specialization; PyObject *d = stats_to_dict(stats); if (d == NULL) { return -1; @@ -93,7 +93,6 @@ add_stat_dict( return err; } -#ifdef Py_STATS PyObject* _Py_GetSpecializationStats(void) { PyObject *stats = PyDict_New(); @@ -120,7 +119,6 @@ _Py_GetSpecializationStats(void) { } return stats; } -#endif #define PRINT_STAT(i, field) \ @@ -218,26 +216,65 @@ print_gc_stats(FILE *out, GCStats *stats) } static void -print_stats(FILE *out, PyStats *stats) { +print_stats(FILE *out, PyStats *stats) +{ print_spec_stats(out, stats->opcode_stats); print_call_stats(out, &stats->call_stats); print_object_stats(out, &stats->object_stats); print_gc_stats(out, stats->gc_stats); } +void +_Py_StatsOn(void) +{ + _Py_stats = &_Py_stats_struct; +} + +void +_Py_StatsOff(void) +{ + _Py_stats = NULL; +} + void _Py_StatsClear(void) { - for (int i = 0; i < NUM_GENERATIONS; i++) { - _py_gc_stats[i] = (GCStats) { 0 }; + memset(&_py_gc_stats, 0, sizeof(_py_gc_stats)); + memset(&_Py_stats_struct, 0, sizeof(_Py_stats_struct)); + _Py_stats_struct.gc_stats = _py_gc_stats; +} + +static int +mem_is_zero(unsigned char *ptr, size_t size) +{ + for (size_t i=0; i < size; i++) { + if (*ptr != 0) { + return 0; + } + ptr++; } - _py_stats_struct = (PyStats) { 0 }; - _py_stats_struct.gc_stats = _py_gc_stats; + return 1; } -void +int _Py_PrintSpecializationStats(int to_file) { + PyStats *stats = &_Py_stats_struct; +#define MEM_IS_ZERO(DATA) mem_is_zero((unsigned char*)DATA, sizeof(*(DATA))) + int is_zero = ( + MEM_IS_ZERO(stats->gc_stats) // is a pointer + && MEM_IS_ZERO(&stats->opcode_stats) + && MEM_IS_ZERO(&stats->call_stats) + && MEM_IS_ZERO(&stats->object_stats) + ); +#undef MEM_IS_ZERO + if (is_zero) { + // gh-108753: -X pystats command line was used, but then _stats_off() + // and _stats_clear() have been called: in this case, avoid printing + // useless "all zeros" statistics. + return 0; + } + FILE *out = stderr; if (to_file) { /* Write to a file instead of stderr. */ @@ -268,26 +305,25 @@ _Py_PrintSpecializationStats(int to_file) else { fprintf(out, "Specialization stats:\n"); } - print_stats(out, &_py_stats_struct); + print_stats(out, stats); if (out != stderr) { fclose(out); } + return 1; } -#ifdef Py_STATS - #define SPECIALIZATION_FAIL(opcode, kind) \ do { \ - if (_py_stats) { \ - _py_stats->opcode_stats[opcode].specialization.failure_kinds[kind]++; \ + if (_Py_stats) { \ + _Py_stats->opcode_stats[opcode].specialization.failure_kinds[kind]++; \ } \ } while (0) -#endif -#endif +#endif // Py_STATS + #ifndef SPECIALIZATION_FAIL -#define SPECIALIZATION_FAIL(opcode, kind) ((void)0) +# define SPECIALIZATION_FAIL(opcode, kind) ((void)0) #endif // Initialize warmup counters and insert superinstructions. This cannot fail. @@ -1067,7 +1103,7 @@ load_attr_fail_kind(DescriptorClassification kind) } Py_UNREACHABLE(); } -#endif +#endif // Py_STATS static int specialize_class_load_attr(PyObject *owner, _Py_CODEUNIT *instr, @@ -1306,7 +1342,7 @@ binary_subscr_fail_kind(PyTypeObject *container_type, PyObject *sub) } return SPEC_FAIL_OTHER; } -#endif +#endif // Py_STATS static int function_kind(PyCodeObject *code) { @@ -1545,7 +1581,7 @@ _Py_Specialize_StoreSubscr(PyObject *container, PyObject *sub, _Py_CODEUNIT *ins } goto fail; } -#endif +#endif // Py_STATS SPECIALIZATION_FAIL(STORE_SUBSCR, SPEC_FAIL_OTHER); fail: STAT_INC(STORE_SUBSCR, failure); @@ -1690,7 +1726,7 @@ meth_descr_call_fail_kind(int ml_flags) return SPEC_FAIL_CALL_BAD_CALL_FLAGS; } } -#endif +#endif // Py_STATS static int specialize_method_descriptor(PyMethodDescrObject *descr, _Py_CODEUNIT *instr, @@ -1871,7 +1907,7 @@ call_fail_kind(PyObject *callable) } return SPEC_FAIL_OTHER; } -#endif +#endif // Py_STATS /* TODO: @@ -1995,7 +2031,7 @@ binary_op_fail_kind(int oparg, PyObject *lhs, PyObject *rhs) } Py_UNREACHABLE(); } -#endif +#endif // Py_STATS void _Py_Specialize_BinaryOp(PyObject *lhs, PyObject *rhs, _Py_CODEUNIT *instr, @@ -2102,7 +2138,7 @@ compare_op_fail_kind(PyObject *lhs, PyObject *rhs) } return SPEC_FAIL_OTHER; } -#endif +#endif // Py_STATS void _Py_Specialize_CompareOp(PyObject *lhs, PyObject *rhs, _Py_CODEUNIT *instr, @@ -2165,7 +2201,7 @@ unpack_sequence_fail_kind(PyObject *seq) } return SPEC_FAIL_OTHER; } -#endif +#endif // Py_STATS void _Py_Specialize_UnpackSequence(PyObject *seq, _Py_CODEUNIT *instr, int oparg) @@ -2206,7 +2242,6 @@ _Py_Specialize_UnpackSequence(PyObject *seq, _Py_CODEUNIT *instr, int oparg) } #ifdef Py_STATS - int _PySpecialization_ClassifyIterator(PyObject *iter) { @@ -2277,8 +2312,7 @@ int } return SPEC_FAIL_OTHER; } - -#endif +#endif // Py_STATS void _Py_Specialize_ForIter(PyObject *iter, _Py_CODEUNIT *instr, int oparg) @@ -2431,7 +2465,7 @@ _Py_Specialize_ToBool(PyObject *value, _Py_CODEUNIT *instr) goto failure; } SPECIALIZATION_FAIL(TO_BOOL, SPEC_FAIL_OTHER); -#endif +#endif // Py_STATS failure: STAT_INC(TO_BOOL, failure); instr->op.code = TO_BOOL; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 3835f760072ef9..fed12812a77089 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -30,6 +30,7 @@ Data members: #include "pycore_pymath.h" // _PY_SHORT_FLOAT_REPR #include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() #include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_pystats.h" // _Py_PrintSpecializationStats() #include "pycore_structseq.h" // _PyStructSequence_InitBuiltinWithFlags() #include "pycore_sysmodule.h" // export _PySys_GetSizeOf() #include "pycore_tuple.h" // _PyTuple_FromArray() @@ -2106,32 +2107,33 @@ sys_is_finalizing_impl(PyObject *module) return PyBool_FromLong(Py_IsFinalizing()); } + #ifdef Py_STATS /*[clinic input] sys._stats_on -Turns on stats gathering (stats gathering is on by default). +Turns on stats gathering (stats gathering is off by default). [clinic start generated code]*/ static PyObject * sys__stats_on_impl(PyObject *module) -/*[clinic end generated code: output=aca53eafcbb4d9fe input=8ddc6df94e484f3a]*/ +/*[clinic end generated code: output=aca53eafcbb4d9fe input=43b5bfe145299e55]*/ { - _py_stats = &_py_stats_struct; + _Py_StatsOn(); Py_RETURN_NONE; } /*[clinic input] sys._stats_off -Turns off stats gathering (stats gathering is on by default). +Turns off stats gathering (stats gathering is off by default). [clinic start generated code]*/ static PyObject * sys__stats_off_impl(PyObject *module) -/*[clinic end generated code: output=1534c1ee63812214 input=b3e50e71ecf29f66]*/ +/*[clinic end generated code: output=1534c1ee63812214 input=d1a84c60c56cbce2]*/ { - _py_stats = NULL; + _Py_StatsOff(); Py_RETURN_NONE; } @@ -2150,21 +2152,23 @@ sys__stats_clear_impl(PyObject *module) } /*[clinic input] -sys._stats_dump +sys._stats_dump -> bool Dump stats to file, and clears the stats. + +Return False if no statistics were not dumped because stats gathering was off. [clinic start generated code]*/ -static PyObject * +static int sys__stats_dump_impl(PyObject *module) -/*[clinic end generated code: output=79f796fb2b4ddf05 input=92346f16d64f6f95]*/ +/*[clinic end generated code: output=6e346b4ba0de4489 input=31a489e39418b2a5]*/ { - _Py_PrintSpecializationStats(1); + int res = _Py_PrintSpecializationStats(1); _Py_StatsClear(); - Py_RETURN_NONE; + return res; } +#endif // Py_STATS -#endif #ifdef ANDROID_API_LEVEL /*[clinic input] From db1ee6a19ab62191c16ecb732cb4dcaede98a902 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 6 Sep 2023 20:09:21 +0200 Subject: [PATCH 063/357] gh-108740: Fix "make regen-all" race condition (#108741) Fix a race condition in "make regen-all". The deepfreeze.c source and files generated by Argument Clinic are now generated or updated before generating "global objects". Previously, some identifiers may miss depending on the order in which these files were generated. * "make regen-global-objects": Make sure that deepfreeze.c is generated and up to date, and always run "make clinic". * "make clinic" no longer runs generate_global_objects.py script. * "make regen-deepfreeze" now only updates deepfreeze.c (C file). It doesn't build deepfreeze.o (object) anymore. * Remove misleading messages in "make regen-global-objects" and "make clinic". They are now outdated, these commands are now safe to use. * Document generates files in Doc/using/configure.rst. Co-authored-by: Erlend E. Aasland --- Doc/using/configure.rst | 23 +++++++++++++++++++ Makefile.pre.in | 19 +++++++-------- ...-09-01-01-39-26.gh-issue-108740.JHExAQ.rst | 4 ++++ Tools/build/freeze_modules.py | 2 +- 4 files changed, 38 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2023-09-01-01-39-26.gh-issue-108740.JHExAQ.rst diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index ad58255c33b33b..ba1898e35b5fbc 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -60,6 +60,29 @@ See also :pep:`7` "Style Guide for C Code" and :pep:`11` "CPython platform support". +Generated files +=============== + +To reduce build dependencies, Python source code contains multiple generated +files. Commands to regenerate all generated files:: + + make regen-all + make regen-stdlib-module-names + make regen-limited-abi + make regen-configure + +The ``Makefile.pre.in`` file documents generated files, their inputs, and tools used +to regenerate them. Search for ``regen-*`` make targets. + +The ``make regen-configure`` command runs `tiran/cpython_autoconf +`_ container for reproducible build; +see container ``entry.sh`` script. The container is optional, the following +command can be run locally, the generated files depend on autoconf and aclocal +versions:: + + autoreconf -ivf -Werror + + .. _configure-options: Configure Options diff --git a/Makefile.pre.in b/Makefile.pre.in index cf77cbd13ad4d9..aa3eaabc7559f6 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -490,6 +490,7 @@ OBJECT_OBJS= \ Objects/weakrefobject.o \ @PERF_TRAMPOLINE_OBJ@ +DEEPFREEZE_C = Python/deepfreeze/deepfreeze.c DEEPFREEZE_OBJS = Python/deepfreeze/deepfreeze.o ########################################################################## @@ -777,7 +778,6 @@ coverage-report: regen-token regen-frozen .PHONY: clinic clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c $(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --exclude Lib/test/clinic.test.c --srcdir $(srcdir) - $(PYTHON_FOR_REGEN) $(srcdir)/Tools/build/generate_global_objects.py .PHONY: clinic-tests clinic-tests: check-clean-src $(srcdir)/Lib/test/clinic.test.c @@ -1252,12 +1252,12 @@ regen-frozen: Tools/build/freeze_modules.py $(FROZEN_FILES_IN) # Deepfreeze targets .PHONY: regen-deepfreeze -regen-deepfreeze: $(DEEPFREEZE_OBJS) +regen-deepfreeze: $(DEEPFREEZE_C) DEEPFREEZE_DEPS=$(srcdir)/Tools/build/deepfreeze.py Include/internal/pycore_global_strings.h $(FREEZE_MODULE_DEPS) $(FROZEN_FILES_OUT) # BEGIN: deepfreeze modules -Python/deepfreeze/deepfreeze.c: $(DEEPFREEZE_DEPS) +$(DEEPFREEZE_C): $(DEEPFREEZE_DEPS) $(PYTHON_FOR_FREEZE) $(srcdir)/Tools/build/deepfreeze.py \ Python/frozen_modules/importlib._bootstrap.h:importlib._bootstrap \ Python/frozen_modules/importlib._bootstrap_external.h:importlib._bootstrap_external \ @@ -1284,8 +1284,6 @@ Python/deepfreeze/deepfreeze.c: $(DEEPFREEZE_DEPS) Python/frozen_modules/frozen_only.h:frozen_only \ -o Python/deepfreeze/deepfreeze.c # END: deepfreeze modules - @echo "Note: Deepfreeze may have added some global objects," - @echo " so run 'make regen-global-objects' if necessary." # We keep this renamed target around for folks with muscle memory. .PHONY: regen-importlib @@ -1294,11 +1292,12 @@ regen-importlib: regen-frozen ############################################################################ # Global objects +# Dependencies which can add and/or remove _Py_ID() identifiers: +# - deepfreeze.c +# - "make clinic" .PHONY: regen-global-objects -regen-global-objects: $(srcdir)/Tools/build/generate_global_objects.py +regen-global-objects: $(srcdir)/Tools/build/generate_global_objects.py $(DEEPFREEZE_C) clinic $(PYTHON_FOR_REGEN) $(srcdir)/Tools/build/generate_global_objects.py - @echo "Note: Global objects can be added or removed by other tools (e.g. deepfreeze), " - @echo " so be sure to re-run regen-global-objects after those tools." ############################################################################ # ABI @@ -1320,9 +1319,10 @@ regen-limited-abi: all ############################################################################ # Regenerate all generated files +# "clinic" is regenerated implicitly via "regen-global-objects". .PHONY: regen-all regen-all: regen-cases regen-typeslots \ - regen-token regen-ast regen-keyword regen-sre regen-frozen clinic \ + regen-token regen-ast regen-keyword regen-sre regen-frozen \ regen-pegen-metaparser regen-pegen regen-test-frozenmain \ regen-test-levenshtein regen-global-objects @echo @@ -2597,6 +2597,7 @@ recheck: autoconf: (cd $(srcdir); autoreconf -ivf -Werror) +# See https://github.com/tiran/cpython_autoconf container .PHONY: regen-configure regen-configure: @if command -v podman >/dev/null; then RUNTIME="podman"; else RUNTIME="docker"; fi; \ diff --git a/Misc/NEWS.d/next/Build/2023-09-01-01-39-26.gh-issue-108740.JHExAQ.rst b/Misc/NEWS.d/next/Build/2023-09-01-01-39-26.gh-issue-108740.JHExAQ.rst new file mode 100644 index 00000000000000..190d50387f339e --- /dev/null +++ b/Misc/NEWS.d/next/Build/2023-09-01-01-39-26.gh-issue-108740.JHExAQ.rst @@ -0,0 +1,4 @@ +Fix a race condition in ``make regen-all``. The ``deepfreeze.c`` source and +files generated by Argument Clinic are now generated or updated before +generating "global objects". Previously, some identifiers may miss depending +on the order in which these files were generated. Patch by Victor Stinner. diff --git a/Tools/build/freeze_modules.py b/Tools/build/freeze_modules.py index ee4dd2f8682ba4..12200979fa4bc7 100644 --- a/Tools/build/freeze_modules.py +++ b/Tools/build/freeze_modules.py @@ -585,7 +585,7 @@ def regen_makefile(modules): pyfiles = [] frozenfiles = [] rules = [''] - deepfreezerules = ["Python/deepfreeze/deepfreeze.c: $(DEEPFREEZE_DEPS)", + deepfreezerules = ["$(DEEPFREEZE_C): $(DEEPFREEZE_DEPS)", "\t$(PYTHON_FOR_FREEZE) $(srcdir)/Tools/build/deepfreeze.py \\"] for src in _iter_sources(modules): frozen_header = relpath_for_posix_display(src.frozenfile, ROOT_DIR) From bf414b7fcb7c8ba780a5e1d9f320ecef0c7f9488 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 6 Sep 2023 22:02:01 +0300 Subject: [PATCH 064/357] C API tests: use special markers to test that output parameters were set (GH-109014) --- Modules/_testcapi/abstract.c | 8 +++---- Modules/_testcapi/code.c | 4 +++- Modules/_testcapi/dict.c | 8 ++++--- Modules/_testcapi/exceptions.c | 11 ++++++---- Modules/_testcapi/unicode.c | 38 +++++++++++++++++++++------------- Modules/_testcapi/util.h | 7 +++++++ Modules/_testcapimodule.c | 14 +++++++++---- 7 files changed, 60 insertions(+), 30 deletions(-) diff --git a/Modules/_testcapi/abstract.c b/Modules/_testcapi/abstract.c index 91a1ee3aaafc02..bde0d2848954ed 100644 --- a/Modules/_testcapi/abstract.c +++ b/Modules/_testcapi/abstract.c @@ -32,7 +32,7 @@ object_getattrstring(PyObject *self, PyObject *args) static PyObject * object_getoptionalattr(PyObject *self, PyObject *args) { - PyObject *obj, *attr_name, *value; + PyObject *obj, *attr_name, *value = UNINITIALIZED_PTR; if (!PyArg_ParseTuple(args, "OO", &obj, &attr_name)) { return NULL; } @@ -57,7 +57,7 @@ object_getoptionalattr(PyObject *self, PyObject *args) static PyObject * object_getoptionalattrstring(PyObject *self, PyObject *args) { - PyObject *obj, *value; + PyObject *obj, *value = UNINITIALIZED_PTR; const char *attr_name; Py_ssize_t size; if (!PyArg_ParseTuple(args, "Oz#", &obj, &attr_name, &size)) { @@ -207,7 +207,7 @@ mapping_getitemstring(PyObject *self, PyObject *args) static PyObject * mapping_getoptionalitem(PyObject *self, PyObject *args) { - PyObject *obj, *attr_name, *value; + PyObject *obj, *attr_name, *value = UNINITIALIZED_PTR; if (!PyArg_ParseTuple(args, "OO", &obj, &attr_name)) { return NULL; } @@ -232,7 +232,7 @@ mapping_getoptionalitem(PyObject *self, PyObject *args) static PyObject * mapping_getoptionalitemstring(PyObject *self, PyObject *args) { - PyObject *obj, *value; + PyObject *obj, *value = UNINITIALIZED_PTR; const char *attr_name; Py_ssize_t size; if (!PyArg_ParseTuple(args, "Oz#", &obj, &attr_name, &size)) { diff --git a/Modules/_testcapi/code.c b/Modules/_testcapi/code.c index 691dd5fe043811..c0193489b6f340 100644 --- a/Modules/_testcapi/code.c +++ b/Modules/_testcapi/code.c @@ -1,4 +1,5 @@ #include "parts.h" +#include "util.h" static Py_ssize_t get_code_extra_index(PyInterpreterState* interp) { @@ -75,7 +76,7 @@ test_code_extra(PyObject* self, PyObject *Py_UNUSED(callable)) } // Check the value is initially NULL - void *extra; + void *extra = UNINITIALIZED_PTR; int res = PyUnstable_Code_GetExtra(test_func_code, code_extra_index, &extra); if (res < 0) { goto finally; @@ -88,6 +89,7 @@ test_code_extra(PyObject* self, PyObject *Py_UNUSED(callable)) goto finally; } // Assert it was set correctly + extra = UNINITIALIZED_PTR; res = PyUnstable_Code_GetExtra(test_func_code, code_extra_index, &extra); if (res < 0) { goto finally; diff --git a/Modules/_testcapi/dict.c b/Modules/_testcapi/dict.c index 6720f0437401ef..810989fbed85f9 100644 --- a/Modules/_testcapi/dict.c +++ b/Modules/_testcapi/dict.c @@ -139,7 +139,7 @@ dict_getitemwitherror(PyObject *self, PyObject *args) static PyObject * dict_getitemref(PyObject *self, PyObject *args) { - PyObject *obj, *attr_name, *value; + PyObject *obj, *attr_name, *value = UNINITIALIZED_PTR; if (!PyArg_ParseTuple(args, "OO", &obj, &attr_name)) { return NULL; } @@ -164,7 +164,7 @@ dict_getitemref(PyObject *self, PyObject *args) static PyObject * dict_getitemstringref(PyObject *self, PyObject *args) { - PyObject *obj, *value; + PyObject *obj, *value = UNINITIALIZED_PTR; const char *attr_name; Py_ssize_t size; if (!PyArg_ParseTuple(args, "Oz#", &obj, &attr_name, &size)) { @@ -276,7 +276,7 @@ dict_items(PyObject *self, PyObject *obj) static PyObject * dict_next(PyObject *self, PyObject *args) { - PyObject *mapping, *key, *value; + PyObject *mapping, *key = UNINITIALIZED_PTR, *value = UNINITIALIZED_PTR; Py_ssize_t pos; if (!PyArg_ParseTuple(args, "On", &mapping, &pos)) { return NULL; @@ -286,6 +286,8 @@ dict_next(PyObject *self, PyObject *args) if (rc != 0) { return Py_BuildValue("inOO", rc, pos, key, value); } + assert(key == UNINITIALIZED_PTR); + assert(value == UNINITIALIZED_PTR); if (PyErr_Occurred()) { return NULL; } diff --git a/Modules/_testcapi/exceptions.c b/Modules/_testcapi/exceptions.c index b1388d75711774..b54ce0cbb0dd20 100644 --- a/Modules/_testcapi/exceptions.c +++ b/Modules/_testcapi/exceptions.c @@ -120,12 +120,15 @@ _testcapi_exc_set_object_fetch_impl(PyObject *module, PyObject *exc, PyObject *obj) /*[clinic end generated code: output=7a5ff5f6d3cf687f input=77ec686f1f95fa38]*/ { - PyObject *type; - PyObject *value; - PyObject *tb; + PyObject *type = UNINITIALIZED_PTR; + PyObject *value = UNINITIALIZED_PTR; + PyObject *tb = UNINITIALIZED_PTR; PyErr_SetObject(exc, obj); PyErr_Fetch(&type, &value, &tb); + assert(type != UNINITIALIZED_PTR); + assert(value != UNINITIALIZED_PTR); + assert(tb != UNINITIALIZED_PTR); Py_XDECREF(type); Py_XDECREF(tb); return value; @@ -244,7 +247,7 @@ _testcapi_set_exc_info_impl(PyObject *module, PyObject *new_type, PyObject *new_value, PyObject *new_tb) /*[clinic end generated code: output=b55fa35dec31300e input=ea9f19e0f55fe5b3]*/ { - PyObject *type, *value, *tb; + PyObject *type = UNINITIALIZED_PTR, *value = UNINITIALIZED_PTR, *tb = UNINITIALIZED_PTR; PyErr_GetExcInfo(&type, &value, &tb); Py_INCREF(new_type); diff --git a/Modules/_testcapi/unicode.c b/Modules/_testcapi/unicode.c index f2cf9a744007d9..232b2ad543fca0 100644 --- a/Modules/_testcapi/unicode.c +++ b/Modules/_testcapi/unicode.c @@ -490,7 +490,7 @@ static PyObject * unicode_aswidecharstring(PyObject *self, PyObject *args) { PyObject *unicode, *result; - Py_ssize_t size = 100; + Py_ssize_t size = UNINITIALIZED_SIZE; wchar_t *buffer; if (!PyArg_ParseTuple(args, "O", &unicode)) @@ -498,8 +498,10 @@ unicode_aswidecharstring(PyObject *self, PyObject *args) NULLABLE(unicode); buffer = PyUnicode_AsWideCharString(unicode, &size); - if (buffer == NULL) + if (buffer == NULL) { + assert(size == UNINITIALIZED_SIZE); return NULL; + } result = PyUnicode_FromWideChar(buffer, size + 1); PyMem_Free(buffer); @@ -624,15 +626,17 @@ unicode_asutf8andsize(PyObject *self, PyObject *args) PyObject *unicode; Py_ssize_t buflen; const char *s; - Py_ssize_t size = -100; + Py_ssize_t size = UNINITIALIZED_SIZE; if (!PyArg_ParseTuple(args, "On", &unicode, &buflen)) return NULL; NULLABLE(unicode); s = PyUnicode_AsUTF8AndSize(unicode, &size); - if (s == NULL) + if (s == NULL) { + assert(size == UNINITIALIZED_SIZE); return NULL; + } return Py_BuildValue("(y#n)", s, buflen, size); } @@ -726,7 +730,7 @@ unicode_decodeutf7stateful(PyObject *self, PyObject *args) const char *data; Py_ssize_t size; const char *errors = NULL; - Py_ssize_t consumed; + Py_ssize_t consumed = UNINITIALIZED_SIZE; PyObject *result; if (!PyArg_ParseTuple(args, "y#|z", &data, &size, &errors)) @@ -734,6 +738,7 @@ unicode_decodeutf7stateful(PyObject *self, PyObject *args) result = PyUnicode_DecodeUTF7Stateful(data, size, errors, &consumed); if (!result) { + assert(consumed == UNINITIALIZED_SIZE); return NULL; } return Py_BuildValue("(Nn)", result, consumed); @@ -760,7 +765,7 @@ unicode_decodeutf8stateful(PyObject *self, PyObject *args) const char *data; Py_ssize_t size; const char *errors = NULL; - Py_ssize_t consumed = 123456789; + Py_ssize_t consumed = UNINITIALIZED_SIZE; PyObject *result; if (!PyArg_ParseTuple(args, "y#|z", &data, &size, &errors)) @@ -768,6 +773,7 @@ unicode_decodeutf8stateful(PyObject *self, PyObject *args) result = PyUnicode_DecodeUTF8Stateful(data, size, errors, &consumed); if (!result) { + assert(consumed == UNINITIALIZED_SIZE); return NULL; } return Py_BuildValue("(Nn)", result, consumed); @@ -788,7 +794,7 @@ unicode_decodeutf32(PyObject *self, PyObject *args) const char *data; Py_ssize_t size; const char *errors = NULL; - int byteorder; + int byteorder = UNINITIALIZED_INT; PyObject *result; if (!PyArg_ParseTuple(args, "iy#|z", &byteorder, &data, &size, &errors)) @@ -808,8 +814,8 @@ unicode_decodeutf32stateful(PyObject *self, PyObject *args) const char *data; Py_ssize_t size; const char *errors = NULL; - int byteorder; - Py_ssize_t consumed; + int byteorder = UNINITIALIZED_INT; + Py_ssize_t consumed = UNINITIALIZED_SIZE; PyObject *result; if (!PyArg_ParseTuple(args, "iy#|z", &byteorder, &data, &size, &errors)) @@ -817,6 +823,7 @@ unicode_decodeutf32stateful(PyObject *self, PyObject *args) result = PyUnicode_DecodeUTF32Stateful(data, size, errors, &byteorder, &consumed); if (!result) { + assert(consumed == UNINITIALIZED_SIZE); return NULL; } return Py_BuildValue("(iNn)", byteorder, result, consumed); @@ -837,7 +844,7 @@ unicode_decodeutf16(PyObject *self, PyObject *args) const char *data; Py_ssize_t size; const char *errors = NULL; - int byteorder = 0; + int byteorder = UNINITIALIZED_INT; PyObject *result; if (!PyArg_ParseTuple(args, "iy#|z", &byteorder, &data, &size, &errors)) @@ -857,8 +864,8 @@ unicode_decodeutf16stateful(PyObject *self, PyObject *args) const char *data; Py_ssize_t size; const char *errors = NULL; - int byteorder; - Py_ssize_t consumed; + int byteorder = UNINITIALIZED_INT; + Py_ssize_t consumed = UNINITIALIZED_SIZE; PyObject *result; if (!PyArg_ParseTuple(args, "iy#|z", &byteorder, &data, &size, &errors)) @@ -866,6 +873,7 @@ unicode_decodeutf16stateful(PyObject *self, PyObject *args) result = PyUnicode_DecodeUTF16Stateful(data, size, errors, &byteorder, &consumed); if (!result) { + assert(consumed == UNINITIALIZED_SIZE); return NULL; } return Py_BuildValue("(iNn)", byteorder, result, consumed); @@ -1019,7 +1027,7 @@ unicode_decodembcsstateful(PyObject *self, PyObject *args) const char *data; Py_ssize_t size; const char *errors = NULL; - Py_ssize_t consumed; + Py_ssize_t consumed = UNINITIALIZED_SIZE; PyObject *result; if (!PyArg_ParseTuple(args, "y#|z", &data, &size, &errors)) @@ -1027,6 +1035,7 @@ unicode_decodembcsstateful(PyObject *self, PyObject *args) result = PyUnicode_DecodeMBCSStateful(data, size, errors, &consumed); if (!result) { + assert(consumed == UNINITIALIZED_SIZE); return NULL; } return Py_BuildValue("(Nn)", result, consumed); @@ -1040,7 +1049,7 @@ unicode_decodecodepagestateful(PyObject *self, PyObject *args) const char *data; Py_ssize_t size; const char *errors = NULL; - Py_ssize_t consumed; + Py_ssize_t consumed = UNINITIALIZED_SIZE; PyObject *result; if (!PyArg_ParseTuple(args, "iy#|z", &code_page, &data, &size, &errors)) @@ -1048,6 +1057,7 @@ unicode_decodecodepagestateful(PyObject *self, PyObject *args) result = PyUnicode_DecodeCodePageStateful(code_page, data, size, errors, &consumed); if (!result) { + assert(consumed == UNINITIALIZED_SIZE); return NULL; } return Py_BuildValue("(Nn)", result, consumed); diff --git a/Modules/_testcapi/util.h b/Modules/_testcapi/util.h index 05ccb12a4444f8..4cf7e226382bfc 100644 --- a/Modules/_testcapi/util.h +++ b/Modules/_testcapi/util.h @@ -23,3 +23,10 @@ assert(!PyErr_Occurred()); \ return PyLong_FromSsize_t(_ret); \ } while (0) + +/* Marker to check that pointer value was set. */ +#define UNINITIALIZED_PTR ((void *)"uninitialized") +/* Marker to check that Py_ssize_t value was set. */ +#define UNINITIALIZED_SIZE ((Py_ssize_t)236892191) +/* Marker to check that integer value was set. */ +#define UNINITIALIZED_INT (63256717) diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index ab33702cdfd872..5ff5172f4f30eb 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -217,10 +217,13 @@ test_dict_inner(int count) Py_DECREF(v); } + k = v = UNINITIALIZED_PTR; while (PyDict_Next(dict, &pos, &k, &v)) { PyObject *o; iterations++; + assert(k != UNINITIALIZED_PTR); + assert(v != UNINITIALIZED_PTR); i = PyLong_AS_LONG(v) + 1; o = PyLong_FromLong(i); if (o == NULL) @@ -230,7 +233,10 @@ test_dict_inner(int count) return -1; } Py_DECREF(o); + k = v = UNINITIALIZED_PTR; } + assert(k == UNINITIALIZED_PTR); + assert(v == UNINITIALIZED_PTR); Py_DECREF(dict); @@ -3118,7 +3124,7 @@ test_weakref_capi(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) assert(Py_REFCNT(obj) == refcnt); // test PyWeakref_GetRef(), reference is alive - PyObject *ref = Py_True; // marker to check that value was set + PyObject *ref = UNINITIALIZED_PTR; assert(PyWeakref_GetRef(weakref, &ref) == 1); assert(ref == obj); assert(Py_REFCNT(obj) == (refcnt + 1)); @@ -3140,7 +3146,7 @@ test_weakref_capi(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) assert(PyWeakref_GET_OBJECT(weakref) == Py_None); // test PyWeakref_GetRef(), reference is dead - ref = Py_True; + ref = UNINITIALIZED_PTR; assert(PyWeakref_GetRef(weakref, &ref) == 0); assert(ref == NULL); @@ -3152,7 +3158,7 @@ test_weakref_capi(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) // test PyWeakref_GetRef(), invalid type assert(!PyErr_Occurred()); - ref = Py_True; + ref = UNINITIALIZED_PTR; assert(PyWeakref_GetRef(invalid_weakref, &ref) == -1); assert(PyErr_ExceptionMatches(PyExc_TypeError)); PyErr_Clear(); @@ -3164,7 +3170,7 @@ test_weakref_capi(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) PyErr_Clear(); // test PyWeakref_GetRef(NULL) - ref = Py_True; // marker to check that value was set + ref = UNINITIALIZED_PTR; assert(PyWeakref_GetRef(NULL, &ref) == -1); assert(PyErr_ExceptionMatches(PyExc_SystemError)); assert(ref == NULL); From 3a08db8d137a552aebf678bcd2e7444ab72e62c5 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 6 Sep 2023 22:47:38 +0300 Subject: [PATCH 065/357] gh-106307: Fix PyMapping_GetOptionalItemString() (GH-108797) The resulting pointer was not set to NULL if the creation of a temporary string object was failed. The tests were also missed due to oversight. --- Lib/test/test_capi/test_abstract.py | 37 +++++++++++++++++++++++++++++ Objects/abstract.c | 2 ++ 2 files changed, 39 insertions(+) diff --git a/Lib/test/test_capi/test_abstract.py b/Lib/test/test_capi/test_abstract.py index 3f51e5b28104d9..671f62b977d2aa 100644 --- a/Lib/test/test_capi/test_abstract.py +++ b/Lib/test/test_capi/test_abstract.py @@ -265,6 +265,43 @@ def test_mapping_getitemstring(self): self.assertRaises(TypeError, getitemstring, [], b'a') self.assertRaises(SystemError, getitemstring, NULL, b'a') + def test_mapping_getoptionalitem(self): + getitem = _testcapi.mapping_getoptionalitem + dct = {'a': 1, '\U0001f40d': 2} + self.assertEqual(getitem(dct, 'a'), 1) + self.assertEqual(getitem(dct, 'b'), KeyError) + self.assertEqual(getitem(dct, '\U0001f40d'), 2) + + dct2 = ProxyGetItem(dct) + self.assertEqual(getitem(dct2, 'a'), 1) + self.assertEqual(getitem(dct2, 'b'), KeyError) + + self.assertEqual(getitem(['a', 'b', 'c'], 1), 'b') + + self.assertRaises(TypeError, getitem, 42, 'a') + self.assertRaises(TypeError, getitem, {}, []) # unhashable + self.assertRaises(IndexError, getitem, [], 1) + self.assertRaises(TypeError, getitem, [], 'a') + # CRASHES getitem({}, NULL) + # CRASHES getitem(NULL, 'a') + + def test_mapping_getoptionalitemstring(self): + getitemstring = _testcapi.mapping_getoptionalitemstring + dct = {'a': 1, '\U0001f40d': 2} + self.assertEqual(getitemstring(dct, b'a'), 1) + self.assertEqual(getitemstring(dct, b'b'), KeyError) + self.assertEqual(getitemstring(dct, '\U0001f40d'.encode()), 2) + + dct2 = ProxyGetItem(dct) + self.assertEqual(getitemstring(dct2, b'a'), 1) + self.assertEqual(getitemstring(dct2, b'b'), KeyError) + + self.assertRaises(TypeError, getitemstring, 42, b'a') + self.assertRaises(UnicodeDecodeError, getitemstring, {}, b'\xff') + self.assertRaises(SystemError, getitemstring, {}, NULL) + self.assertRaises(TypeError, getitemstring, [], b'a') + # CRASHES getitemstring(NULL, b'a') + def test_mapping_haskey(self): haskey = _testcapi.mapping_haskey dct = {'a': 1, '\U0001f40d': 2} diff --git a/Objects/abstract.c b/Objects/abstract.c index 6713926b86d218..b57190d2521e11 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2393,11 +2393,13 @@ int PyMapping_GetOptionalItemString(PyObject *obj, const char *key, PyObject **result) { if (key == NULL) { + *result = NULL; null_error(); return -1; } PyObject *okey = PyUnicode_FromString(key); if (okey == NULL) { + *result = NULL; return -1; } int rc = PyMapping_GetOptionalItem(obj, okey, result); From f9bd6e49ae58e0ba2934f29dd0f3299ba844cc8d Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Thu, 7 Sep 2023 06:28:00 +1000 Subject: [PATCH 066/357] GH-90690: Mention removal of ``PRECALL`` in What's New (#103910) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Hugo van Kemenade --- Doc/whatsnew/3.12.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index acdfe9e8b19a4f..3afcd1355db47c 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -997,6 +997,9 @@ CPython bytecode changes * Remove the :opcode:`!JUMP_IF_FALSE_OR_POP` and :opcode:`!JUMP_IF_TRUE_OR_POP` instructions. (Contributed by Irit Katriel in :gh:`102859`.) +* Removed the :opcode:`!PRECALL` instruction. (Contributed by Mark Shannon in + :gh:`92925`.) + * Add the :opcode:`LOAD_FAST_AND_CLEAR` instruction as part of the implementation of :pep:`709`. (Contributed by Carl Meyer in :gh:`101441`.) From 9f0c0a46f00d687e921990ee83894b2f4ce8a6e7 Mon Sep 17 00:00:00 2001 From: Shahriar Heidrich Date: Wed, 6 Sep 2023 22:53:32 +0200 Subject: [PATCH 067/357] gh-107732: Mention dir support in importlib.resources docs (#107734) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Hugo van Kemenade --- Doc/library/importlib.resources.rst | 13 ++++++++----- Doc/whatsnew/3.12.rst | 6 ++++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Doc/library/importlib.resources.rst b/Doc/library/importlib.resources.rst index 76faf731144779..3de97e80311a17 100644 --- a/Doc/library/importlib.resources.rst +++ b/Doc/library/importlib.resources.rst @@ -82,15 +82,18 @@ for example, a package and its resources can be imported from a zip file using .. function:: as_file(traversable) Given a :class:`~importlib.resources.abc.Traversable` object representing - a file, typically from :func:`importlib.resources.files`, return - a context manager for use in a :keyword:`with` statement. + a file or directory, typically from :func:`importlib.resources.files`, + return a context manager for use in a :keyword:`with` statement. The context manager provides a :class:`pathlib.Path` object. - Exiting the context manager cleans up any temporary file created when the - resource was extracted from e.g. a zip file. + Exiting the context manager cleans up any temporary file or directory + created when the resource was extracted from e.g. a zip file. Use ``as_file`` when the Traversable methods - (``read_text``, etc) are insufficient and an actual file on + (``read_text``, etc) are insufficient and an actual file or directory on the file system is required. .. versionadded:: 3.9 + + .. versionchanged:: 3.12 + Added support for ``traversable`` representing a directory. diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 3afcd1355db47c..bdccbe1012c9e2 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -630,6 +630,12 @@ fractions * Objects of type :class:`fractions.Fraction` now support float-style formatting. (Contributed by Mark Dickinson in :gh:`100161`.) +importlib.resources +------------------- + +* :func:`importlib.resources.as_file` now supports resource directories. + (Contributed by Jason R. Coombs in :gh:`97930`.) + inspect ------- From 6f3c138dfa868b32d3288898923bbfa388f2fa5d Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 6 Sep 2023 23:55:42 +0300 Subject: [PATCH 068/357] gh-108751: Add copy.replace() function (GH-108752) It creates a modified copy of an object by calling the object's __replace__() method. It is a generalization of dataclasses.replace(), named tuple's _replace() method and replace() methods in various classes, and supports all these stdlib classes. --- Doc/library/collections.rst | 2 + Doc/library/copy.rst | 30 +++- Doc/library/dataclasses.rst | 2 + Doc/library/datetime.rst | 9 ++ Doc/library/inspect.rst | 11 +- Doc/library/types.rst | 2 + Doc/whatsnew/3.13.rst | 12 ++ Lib/_pydatetime.py | 6 + Lib/collections/__init__.py | 1 + Lib/copy.py | 13 ++ Lib/dataclasses.py | 9 +- Lib/inspect.py | 4 + Lib/test/datetimetester.py | 137 +++++++++++------- Lib/test/test_code.py | 7 + Lib/test/test_copy.py | 66 ++++++++- Lib/test/test_inspect.py | 65 ++++++++- ...-09-01-13-14-08.gh-issue-108751.2itqwe.rst | 2 + Modules/_datetimemodule.c | 6 + Objects/codeobject.c | 1 + 19 files changed, 314 insertions(+), 71 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-01-13-14-08.gh-issue-108751.2itqwe.rst diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index b8b231bb15b1b0..03cb1dca8f816c 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -979,6 +979,8 @@ field names, the method and attribute names start with an underscore. >>> for partnum, record in inventory.items(): ... inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now()) + Named tuples are also supported by generic function :func:`copy.replace`. + .. attribute:: somenamedtuple._fields Tuple of strings listing the field names. Useful for introspection diff --git a/Doc/library/copy.rst b/Doc/library/copy.rst index 8f32477ed508c3..cc4ca034d07a00 100644 --- a/Doc/library/copy.rst +++ b/Doc/library/copy.rst @@ -17,14 +17,22 @@ operations (explained below). Interface summary: -.. function:: copy(x) +.. function:: copy(obj) - Return a shallow copy of *x*. + Return a shallow copy of *obj*. -.. function:: deepcopy(x[, memo]) +.. function:: deepcopy(obj[, memo]) - Return a deep copy of *x*. + Return a deep copy of *obj*. + + +.. function:: replace(obj, /, **changes) + + Creates a new object of the same type as *obj*, replacing fields with values + from *changes*. + + .. versionadded:: 3.13 .. exception:: Error @@ -89,6 +97,20 @@ with the component as first argument and the memo dictionary as second argument. The memo dictionary should be treated as an opaque object. +.. index:: + single: __replace__() (replace protocol) + +Function :func:`replace` is more limited than :func:`copy` and :func:`deepcopy`, +and only supports named tuples created by :func:`~collections.namedtuple`, +:mod:`dataclasses`, and other classes which define method :meth:`!__replace__`. + + .. method:: __replace__(self, /, **changes) + :noindex: + +:meth:`!__replace__` should create a new object of the same type, +replacing fields with values from *changes*. + + .. seealso:: Module :mod:`pickle` diff --git a/Doc/library/dataclasses.rst b/Doc/library/dataclasses.rst index d68748767c5e37..d78a6071a50e4b 100644 --- a/Doc/library/dataclasses.rst +++ b/Doc/library/dataclasses.rst @@ -456,6 +456,8 @@ Module contents ``replace()`` (or similarly named) method which handles instance copying. + Dataclass instances are also supported by generic function :func:`copy.replace`. + .. function:: is_dataclass(obj) Return ``True`` if its parameter is a dataclass or an instance of one, diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index 04cc75562937e0..0b9d42f32e3bd6 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -652,6 +652,9 @@ Instance methods: >>> d.replace(day=26) datetime.date(2002, 12, 26) + :class:`date` objects are also supported by generic function + :func:`copy.replace`. + .. method:: date.timetuple() @@ -1251,6 +1254,9 @@ Instance methods: ``tzinfo=None`` can be specified to create a naive datetime from an aware datetime with no conversion of date and time data. + :class:`datetime` objects are also supported by generic function + :func:`copy.replace`. + .. versionadded:: 3.6 Added the ``fold`` argument. @@ -1827,6 +1833,9 @@ Instance methods: ``tzinfo=None`` can be specified to create a naive :class:`.time` from an aware :class:`.time`, without conversion of the time data. + :class:`time` objects are also supported by generic function + :func:`copy.replace`. + .. versionadded:: 3.6 Added the ``fold`` argument. diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 603ac3263bb9ec..fe0ed135029f0f 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -689,8 +689,8 @@ function. The optional *return_annotation* argument, can be an arbitrary Python object, is the "return" annotation of the callable. - Signature objects are *immutable*. Use :meth:`Signature.replace` to make a - modified copy. + Signature objects are *immutable*. Use :meth:`Signature.replace` or + :func:`copy.replace` to make a modified copy. .. versionchanged:: 3.5 Signature objects are picklable and :term:`hashable`. @@ -746,6 +746,9 @@ function. >>> str(new_sig) "(a, b) -> 'new return anno'" + Signature objects are also supported by generic function + :func:`copy.replace`. + .. classmethod:: Signature.from_callable(obj, *, follow_wrapped=True, globalns=None, localns=None) Return a :class:`Signature` (or its subclass) object for a given callable @@ -769,7 +772,7 @@ function. .. class:: Parameter(name, kind, *, default=Parameter.empty, annotation=Parameter.empty) Parameter objects are *immutable*. Instead of modifying a Parameter object, - you can use :meth:`Parameter.replace` to create a modified copy. + you can use :meth:`Parameter.replace` or :func:`copy.replace` to create a modified copy. .. versionchanged:: 3.5 Parameter objects are picklable and :term:`hashable`. @@ -892,6 +895,8 @@ function. >>> str(param.replace(default=Parameter.empty, annotation='spam')) "foo:'spam'" + Parameter objects are also supported by generic function :func:`copy.replace`. + .. versionchanged:: 3.4 In Python 3.3 Parameter objects were allowed to have ``name`` set to ``None`` if their ``kind`` was set to ``POSITIONAL_ONLY``. diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 8cbe17df16f107..82300afef0641e 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -200,6 +200,8 @@ Standard names are defined for the following types: Return a copy of the code object with new values for the specified fields. + Code objects are also supported by generic function :func:`copy.replace`. + .. versionadded:: 3.8 .. data:: CellType diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index de23172ac7a43b..8c6467562aeb62 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -115,6 +115,18 @@ array It can be used instead of ``'u'`` type code, which is deprecated. (Contributed by Inada Naoki in :gh:`80480`.) +copy +---- + +* Add :func:`copy.replace` function which allows to create a modified copy of + an object, which is especially usefule for immutable objects. + It supports named tuples created with the factory function + :func:`collections.namedtuple`, :class:`~dataclasses.dataclass` instances, + various :mod:`datetime` objects, :class:`~inspect.Signature` objects, + :class:`~inspect.Parameter` objects, :ref:`code object `, and + any user classes which define the :meth:`!__replace__` method. + (Contributed by Serhiy Storchaka in :gh:`108751`.) + dbm --- diff --git a/Lib/_pydatetime.py b/Lib/_pydatetime.py index 549fcda19dccf2..df616bbaf8388d 100644 --- a/Lib/_pydatetime.py +++ b/Lib/_pydatetime.py @@ -1112,6 +1112,8 @@ def replace(self, year=None, month=None, day=None): day = self._day return type(self)(year, month, day) + __replace__ = replace + # Comparisons of date objects with other. def __eq__(self, other): @@ -1637,6 +1639,8 @@ def replace(self, hour=None, minute=None, second=None, microsecond=None, fold = self._fold return type(self)(hour, minute, second, microsecond, tzinfo, fold=fold) + __replace__ = replace + # Pickle support. def _getstate(self, protocol=3): @@ -1983,6 +1987,8 @@ def replace(self, year=None, month=None, day=None, hour=None, return type(self)(year, month, day, hour, minute, second, microsecond, tzinfo, fold=fold) + __replace__ = replace + def _local_timezone(self): if self.tzinfo is None: ts = self._mktime() diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 8652dc8a4ec450..a461550ea40da7 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -495,6 +495,7 @@ def __getnewargs__(self): '_field_defaults': field_defaults, '__new__': __new__, '_make': _make, + '__replace__': _replace, '_replace': _replace, '__repr__': __repr__, '_asdict': _asdict, diff --git a/Lib/copy.py b/Lib/copy.py index da2908ef623d8c..6d7bb9a111b5b4 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -290,3 +290,16 @@ def _reconstruct(x, memo, func, args, return y del types, weakref + + +def replace(obj, /, **changes): + """Return a new object replacing specified fields with new values. + + This is especially useful for immutable objects, like named tuples or + frozen dataclasses. + """ + cls = obj.__class__ + func = getattr(cls, '__replace__', None) + if func is None: + raise TypeError(f"replace() does not support {cls.__name__} objects") + return func(obj, **changes) diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 21f3fa5c213f1f..84f8d68ce092a4 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -1073,6 +1073,7 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen, globals, slots, )) + _set_new_attribute(cls, '__replace__', _replace) # Get the fields as a list, and include only real fields. This is # used in all of the following methods. @@ -1546,13 +1547,15 @@ class C: c1 = replace(c, x=3) assert c1.x == 3 and c1.y == 2 """ + if not _is_dataclass_instance(obj): + raise TypeError("replace() should be called on dataclass instances") + return _replace(obj, **changes) + +def _replace(obj, /, **changes): # We're going to mutate 'changes', but that's okay because it's a # new dict, even if called with 'replace(obj, **my_changes)'. - if not _is_dataclass_instance(obj): - raise TypeError("replace() should be called on dataclass instances") - # It's an error to have init=False fields in 'changes'. # If a field is not in 'changes', read its value from the provided obj. diff --git a/Lib/inspect.py b/Lib/inspect.py index c8211833dd0831..aaa22bef896602 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -2870,6 +2870,8 @@ def __str__(self): return formatted + __replace__ = replace + def __repr__(self): return '<{} "{}">'.format(self.__class__.__name__, self) @@ -3130,6 +3132,8 @@ def replace(self, *, parameters=_void, return_annotation=_void): return type(self)(parameters, return_annotation=return_annotation) + __replace__ = replace + def _hash_basis(self): params = tuple(param for param in self.parameters.values() if param.kind != _KEYWORD_ONLY) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 55e061950ff280..8bda17358db87f 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -1699,22 +1699,23 @@ def test_replace(self): cls = self.theclass args = [1, 2, 3] base = cls(*args) - self.assertEqual(base, base.replace()) + self.assertEqual(base.replace(), base) + self.assertEqual(copy.replace(base), base) - i = 0 - for name, newval in (("year", 2), - ("month", 3), - ("day", 4)): + changes = (("year", 2), + ("month", 3), + ("day", 4)) + for i, (name, newval) in enumerate(changes): newargs = args[:] newargs[i] = newval expected = cls(*newargs) - got = base.replace(**{name: newval}) - self.assertEqual(expected, got) - i += 1 + self.assertEqual(base.replace(**{name: newval}), expected) + self.assertEqual(copy.replace(base, **{name: newval}), expected) # Out of bounds. base = cls(2000, 2, 29) self.assertRaises(ValueError, base.replace, year=2001) + self.assertRaises(ValueError, copy.replace, base, year=2001) def test_subclass_replace(self): class DateSubclass(self.theclass): @@ -1722,6 +1723,7 @@ class DateSubclass(self.theclass): dt = DateSubclass(2012, 1, 1) self.assertIs(type(dt.replace(year=2013)), DateSubclass) + self.assertIs(type(copy.replace(dt, year=2013)), DateSubclass) def test_subclass_date(self): @@ -2856,26 +2858,27 @@ def test_replace(self): cls = self.theclass args = [1, 2, 3, 4, 5, 6, 7] base = cls(*args) - self.assertEqual(base, base.replace()) - - i = 0 - for name, newval in (("year", 2), - ("month", 3), - ("day", 4), - ("hour", 5), - ("minute", 6), - ("second", 7), - ("microsecond", 8)): + self.assertEqual(base.replace(), base) + self.assertEqual(copy.replace(base), base) + + changes = (("year", 2), + ("month", 3), + ("day", 4), + ("hour", 5), + ("minute", 6), + ("second", 7), + ("microsecond", 8)) + for i, (name, newval) in enumerate(changes): newargs = args[:] newargs[i] = newval expected = cls(*newargs) - got = base.replace(**{name: newval}) - self.assertEqual(expected, got) - i += 1 + self.assertEqual(base.replace(**{name: newval}), expected) + self.assertEqual(copy.replace(base, **{name: newval}), expected) # Out of bounds. base = cls(2000, 2, 29) self.assertRaises(ValueError, base.replace, year=2001) + self.assertRaises(ValueError, copy.replace, base, year=2001) @support.run_with_tz('EDT4') def test_astimezone(self): @@ -3671,19 +3674,19 @@ def test_replace(self): cls = self.theclass args = [1, 2, 3, 4] base = cls(*args) - self.assertEqual(base, base.replace()) - - i = 0 - for name, newval in (("hour", 5), - ("minute", 6), - ("second", 7), - ("microsecond", 8)): + self.assertEqual(base.replace(), base) + self.assertEqual(copy.replace(base), base) + + changes = (("hour", 5), + ("minute", 6), + ("second", 7), + ("microsecond", 8)) + for i, (name, newval) in enumerate(changes): newargs = args[:] newargs[i] = newval expected = cls(*newargs) - got = base.replace(**{name: newval}) - self.assertEqual(expected, got) - i += 1 + self.assertEqual(base.replace(**{name: newval}), expected) + self.assertEqual(copy.replace(base, **{name: newval}), expected) # Out of bounds. base = cls(1) @@ -3691,6 +3694,10 @@ def test_replace(self): self.assertRaises(ValueError, base.replace, minute=-1) self.assertRaises(ValueError, base.replace, second=100) self.assertRaises(ValueError, base.replace, microsecond=1000000) + self.assertRaises(ValueError, copy.replace, base, hour=24) + self.assertRaises(ValueError, copy.replace, base, minute=-1) + self.assertRaises(ValueError, copy.replace, base, second=100) + self.assertRaises(ValueError, copy.replace, base, microsecond=1000000) def test_subclass_replace(self): class TimeSubclass(self.theclass): @@ -3698,6 +3705,7 @@ class TimeSubclass(self.theclass): ctime = TimeSubclass(12, 30) self.assertIs(type(ctime.replace(hour=10)), TimeSubclass) + self.assertIs(type(copy.replace(ctime, hour=10)), TimeSubclass) def test_subclass_time(self): @@ -4085,31 +4093,37 @@ def test_replace(self): zm200 = FixedOffset(timedelta(minutes=-200), "-200") args = [1, 2, 3, 4, z100] base = cls(*args) - self.assertEqual(base, base.replace()) - - i = 0 - for name, newval in (("hour", 5), - ("minute", 6), - ("second", 7), - ("microsecond", 8), - ("tzinfo", zm200)): + self.assertEqual(base.replace(), base) + self.assertEqual(copy.replace(base), base) + + changes = (("hour", 5), + ("minute", 6), + ("second", 7), + ("microsecond", 8), + ("tzinfo", zm200)) + for i, (name, newval) in enumerate(changes): newargs = args[:] newargs[i] = newval expected = cls(*newargs) - got = base.replace(**{name: newval}) - self.assertEqual(expected, got) - i += 1 + self.assertEqual(base.replace(**{name: newval}), expected) + self.assertEqual(copy.replace(base, **{name: newval}), expected) # Ensure we can get rid of a tzinfo. self.assertEqual(base.tzname(), "+100") base2 = base.replace(tzinfo=None) self.assertIsNone(base2.tzinfo) self.assertIsNone(base2.tzname()) + base22 = copy.replace(base, tzinfo=None) + self.assertIsNone(base22.tzinfo) + self.assertIsNone(base22.tzname()) # Ensure we can add one. base3 = base2.replace(tzinfo=z100) self.assertEqual(base, base3) self.assertIs(base.tzinfo, base3.tzinfo) + base32 = copy.replace(base22, tzinfo=z100) + self.assertEqual(base, base32) + self.assertIs(base.tzinfo, base32.tzinfo) # Out of bounds. base = cls(1) @@ -4117,6 +4131,10 @@ def test_replace(self): self.assertRaises(ValueError, base.replace, minute=-1) self.assertRaises(ValueError, base.replace, second=100) self.assertRaises(ValueError, base.replace, microsecond=1000000) + self.assertRaises(ValueError, copy.replace, base, hour=24) + self.assertRaises(ValueError, copy.replace, base, minute=-1) + self.assertRaises(ValueError, copy.replace, base, second=100) + self.assertRaises(ValueError, copy.replace, base, microsecond=1000000) def test_mixed_compare(self): t1 = self.theclass(1, 2, 3) @@ -4885,38 +4903,45 @@ def test_replace(self): zm200 = FixedOffset(timedelta(minutes=-200), "-200") args = [1, 2, 3, 4, 5, 6, 7, z100] base = cls(*args) - self.assertEqual(base, base.replace()) - - i = 0 - for name, newval in (("year", 2), - ("month", 3), - ("day", 4), - ("hour", 5), - ("minute", 6), - ("second", 7), - ("microsecond", 8), - ("tzinfo", zm200)): + self.assertEqual(base.replace(), base) + self.assertEqual(copy.replace(base), base) + + changes = (("year", 2), + ("month", 3), + ("day", 4), + ("hour", 5), + ("minute", 6), + ("second", 7), + ("microsecond", 8), + ("tzinfo", zm200)) + for i, (name, newval) in enumerate(changes): newargs = args[:] newargs[i] = newval expected = cls(*newargs) - got = base.replace(**{name: newval}) - self.assertEqual(expected, got) - i += 1 + self.assertEqual(base.replace(**{name: newval}), expected) + self.assertEqual(copy.replace(base, **{name: newval}), expected) # Ensure we can get rid of a tzinfo. self.assertEqual(base.tzname(), "+100") base2 = base.replace(tzinfo=None) self.assertIsNone(base2.tzinfo) self.assertIsNone(base2.tzname()) + base22 = copy.replace(base, tzinfo=None) + self.assertIsNone(base22.tzinfo) + self.assertIsNone(base22.tzname()) # Ensure we can add one. base3 = base2.replace(tzinfo=z100) self.assertEqual(base, base3) self.assertIs(base.tzinfo, base3.tzinfo) + base32 = copy.replace(base22, tzinfo=z100) + self.assertEqual(base, base32) + self.assertIs(base.tzinfo, base32.tzinfo) # Out of bounds. base = cls(2000, 2, 29) self.assertRaises(ValueError, base.replace, year=2001) + self.assertRaises(ValueError, copy.replace, base, year=2001) def test_more_astimezone(self): # The inherited test_astimezone covered some trivial and error cases. diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index e056c16466e8c4..812c0682569207 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -125,6 +125,7 @@ """ +import copy import inspect import sys import threading @@ -280,11 +281,17 @@ def func2(): with self.subTest(attr=attr, value=value): new_code = code.replace(**{attr: value}) self.assertEqual(getattr(new_code, attr), value) + new_code = copy.replace(code, **{attr: value}) + self.assertEqual(getattr(new_code, attr), value) new_code = code.replace(co_varnames=code2.co_varnames, co_nlocals=code2.co_nlocals) self.assertEqual(new_code.co_varnames, code2.co_varnames) self.assertEqual(new_code.co_nlocals, code2.co_nlocals) + new_code = copy.replace(code, co_varnames=code2.co_varnames, + co_nlocals=code2.co_nlocals) + self.assertEqual(new_code.co_varnames, code2.co_varnames) + self.assertEqual(new_code.co_nlocals, code2.co_nlocals) def test_nlocals_mismatch(self): def func(): diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py index 826e46824e004c..c66c6eeb00811e 100644 --- a/Lib/test/test_copy.py +++ b/Lib/test/test_copy.py @@ -4,7 +4,7 @@ import copyreg import weakref import abc -from operator import le, lt, ge, gt, eq, ne +from operator import le, lt, ge, gt, eq, ne, attrgetter import unittest from test import support @@ -899,7 +899,71 @@ def m(self): g.b() +class TestReplace(unittest.TestCase): + + def test_unsupported(self): + self.assertRaises(TypeError, copy.replace, 1) + self.assertRaises(TypeError, copy.replace, []) + self.assertRaises(TypeError, copy.replace, {}) + def f(): pass + self.assertRaises(TypeError, copy.replace, f) + class A: pass + self.assertRaises(TypeError, copy.replace, A) + self.assertRaises(TypeError, copy.replace, A()) + + def test_replace_method(self): + class A: + def __new__(cls, x, y=0): + self = object.__new__(cls) + self.x = x + self.y = y + return self + + def __init__(self, *args, **kwargs): + self.z = self.x + self.y + + def __replace__(self, **changes): + x = changes.get('x', self.x) + y = changes.get('y', self.y) + return type(self)(x, y) + + attrs = attrgetter('x', 'y', 'z') + a = A(11, 22) + self.assertEqual(attrs(copy.replace(a)), (11, 22, 33)) + self.assertEqual(attrs(copy.replace(a, x=1)), (1, 22, 23)) + self.assertEqual(attrs(copy.replace(a, y=2)), (11, 2, 13)) + self.assertEqual(attrs(copy.replace(a, x=1, y=2)), (1, 2, 3)) + + def test_namedtuple(self): + from collections import namedtuple + Point = namedtuple('Point', 'x y', defaults=(0,)) + p = Point(11, 22) + self.assertEqual(copy.replace(p), (11, 22)) + self.assertEqual(copy.replace(p, x=1), (1, 22)) + self.assertEqual(copy.replace(p, y=2), (11, 2)) + self.assertEqual(copy.replace(p, x=1, y=2), (1, 2)) + with self.assertRaisesRegex(ValueError, 'unexpected field name'): + copy.replace(p, x=1, error=2) + + def test_dataclass(self): + from dataclasses import dataclass + @dataclass + class C: + x: int + y: int = 0 + + attrs = attrgetter('x', 'y') + c = C(11, 22) + self.assertEqual(attrs(copy.replace(c)), (11, 22)) + self.assertEqual(attrs(copy.replace(c, x=1)), (1, 22)) + self.assertEqual(attrs(copy.replace(c, y=2)), (11, 2)) + self.assertEqual(attrs(copy.replace(c, x=1, y=2)), (1, 2)) + with self.assertRaisesRegex(TypeError, 'unexpected keyword argument'): + copy.replace(c, x=1, error=2) + + def global_foo(x, y): return x+y + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 78ef817906b2aa..2fb356a0529ab0 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -1,6 +1,7 @@ import asyncio import builtins import collections +import copy import datetime import functools import importlib @@ -3830,6 +3831,28 @@ def test(a_po, /, *, b, **kwargs): P('bar', P.VAR_POSITIONAL)])), '(foo, /, *bar)') + def test_signature_replace_parameters(self): + def test(a, b) -> 42: + pass + + sig = inspect.signature(test) + parameters = sig.parameters + sig = sig.replace(parameters=list(parameters.values())[1:]) + self.assertEqual(list(sig.parameters), ['b']) + self.assertEqual(sig.parameters['b'], parameters['b']) + self.assertEqual(sig.return_annotation, 42) + sig = sig.replace(parameters=()) + self.assertEqual(dict(sig.parameters), {}) + + sig = inspect.signature(test) + parameters = sig.parameters + sig = copy.replace(sig, parameters=list(parameters.values())[1:]) + self.assertEqual(list(sig.parameters), ['b']) + self.assertEqual(sig.parameters['b'], parameters['b']) + self.assertEqual(sig.return_annotation, 42) + sig = copy.replace(sig, parameters=()) + self.assertEqual(dict(sig.parameters), {}) + def test_signature_replace_anno(self): def test() -> 42: pass @@ -3843,6 +3866,15 @@ def test() -> 42: self.assertEqual(sig.return_annotation, 42) self.assertEqual(sig, inspect.signature(test)) + sig = inspect.signature(test) + sig = copy.replace(sig, return_annotation=None) + self.assertIs(sig.return_annotation, None) + sig = copy.replace(sig, return_annotation=sig.empty) + self.assertIs(sig.return_annotation, sig.empty) + sig = copy.replace(sig, return_annotation=42) + self.assertEqual(sig.return_annotation, 42) + self.assertEqual(sig, inspect.signature(test)) + def test_signature_replaced(self): def test(): pass @@ -4187,41 +4219,66 @@ def test_signature_parameter_replace(self): p = inspect.Parameter('foo', default=42, kind=inspect.Parameter.KEYWORD_ONLY) - self.assertIsNot(p, p.replace()) - self.assertEqual(p, p.replace()) + self.assertIsNot(p.replace(), p) + self.assertEqual(p.replace(), p) + self.assertIsNot(copy.replace(p), p) + self.assertEqual(copy.replace(p), p) p2 = p.replace(annotation=1) self.assertEqual(p2.annotation, 1) p2 = p2.replace(annotation=p2.empty) - self.assertEqual(p, p2) + self.assertEqual(p2, p) + p3 = copy.replace(p, annotation=1) + self.assertEqual(p3.annotation, 1) + p3 = copy.replace(p3, annotation=p3.empty) + self.assertEqual(p3, p) p2 = p2.replace(name='bar') self.assertEqual(p2.name, 'bar') self.assertNotEqual(p2, p) + p3 = copy.replace(p3, name='bar') + self.assertEqual(p3.name, 'bar') + self.assertNotEqual(p3, p) with self.assertRaisesRegex(ValueError, 'name is a required attribute'): p2 = p2.replace(name=p2.empty) + with self.assertRaisesRegex(ValueError, + 'name is a required attribute'): + p3 = copy.replace(p3, name=p3.empty) p2 = p2.replace(name='foo', default=None) self.assertIs(p2.default, None) self.assertNotEqual(p2, p) + p3 = copy.replace(p3, name='foo', default=None) + self.assertIs(p3.default, None) + self.assertNotEqual(p3, p) p2 = p2.replace(name='foo', default=p2.empty) self.assertIs(p2.default, p2.empty) - + p3 = copy.replace(p3, name='foo', default=p3.empty) + self.assertIs(p3.default, p3.empty) p2 = p2.replace(default=42, kind=p2.POSITIONAL_OR_KEYWORD) self.assertEqual(p2.kind, p2.POSITIONAL_OR_KEYWORD) self.assertNotEqual(p2, p) + p3 = copy.replace(p3, default=42, kind=p3.POSITIONAL_OR_KEYWORD) + self.assertEqual(p3.kind, p3.POSITIONAL_OR_KEYWORD) + self.assertNotEqual(p3, p) with self.assertRaisesRegex(ValueError, "value " "is not a valid Parameter.kind"): p2 = p2.replace(kind=p2.empty) + with self.assertRaisesRegex(ValueError, + "value " + "is not a valid Parameter.kind"): + p3 = copy.replace(p3, kind=p3.empty) p2 = p2.replace(kind=p2.KEYWORD_ONLY) self.assertEqual(p2, p) + p3 = copy.replace(p3, kind=p3.KEYWORD_ONLY) + self.assertEqual(p3, p) def test_signature_parameter_positional_only(self): with self.assertRaisesRegex(TypeError, 'name must be a str'): diff --git a/Misc/NEWS.d/next/Library/2023-09-01-13-14-08.gh-issue-108751.2itqwe.rst b/Misc/NEWS.d/next/Library/2023-09-01-13-14-08.gh-issue-108751.2itqwe.rst new file mode 100644 index 00000000000000..7bc21fe6c81760 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-01-13-14-08.gh-issue-108751.2itqwe.rst @@ -0,0 +1,2 @@ +Add :func:`copy.replace` function which allows to create a modified copy of +an object. It supports named tuples, dataclasses, and many other objects. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 191db3f84088d5..0d356779cfe192 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -3590,6 +3590,8 @@ static PyMethodDef date_methods[] = { {"replace", _PyCFunction_CAST(date_replace), METH_VARARGS | METH_KEYWORDS, PyDoc_STR("Return date with new specified fields.")}, + {"__replace__", _PyCFunction_CAST(date_replace), METH_VARARGS | METH_KEYWORDS}, + {"__reduce__", (PyCFunction)date_reduce, METH_NOARGS, PyDoc_STR("__reduce__() -> (cls, state)")}, @@ -4719,6 +4721,8 @@ static PyMethodDef time_methods[] = { {"replace", _PyCFunction_CAST(time_replace), METH_VARARGS | METH_KEYWORDS, PyDoc_STR("Return time with new specified fields.")}, + {"__replace__", _PyCFunction_CAST(time_replace), METH_VARARGS | METH_KEYWORDS}, + {"fromisoformat", (PyCFunction)time_fromisoformat, METH_O | METH_CLASS, PyDoc_STR("string -> time from a string in ISO 8601 format")}, @@ -6579,6 +6583,8 @@ static PyMethodDef datetime_methods[] = { {"replace", _PyCFunction_CAST(datetime_replace), METH_VARARGS | METH_KEYWORDS, PyDoc_STR("Return datetime with new specified fields.")}, + {"__replace__", _PyCFunction_CAST(datetime_replace), METH_VARARGS | METH_KEYWORDS}, + {"astimezone", _PyCFunction_CAST(datetime_astimezone), METH_VARARGS | METH_KEYWORDS, PyDoc_STR("tz -> convert to local time in new timezone tz\n")}, diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 70a0c2ebd66b24..58306075cad48b 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -2145,6 +2145,7 @@ static struct PyMethodDef code_methods[] = { {"co_positions", (PyCFunction)code_positionsiterator, METH_NOARGS}, CODE_REPLACE_METHODDEF CODE__VARNAME_FROM_OPARG_METHODDEF + {"__replace__", _PyCFunction_CAST(code_replace), METH_FASTCALL|METH_KEYWORDS}, {NULL, NULL} /* sentinel */ }; From 6971e40c2e02181e486b52f4f6bf98709d35443c Mon Sep 17 00:00:00 2001 From: Brandt Bucher Date: Wed, 6 Sep 2023 13:59:50 -0700 Subject: [PATCH 069/357] GH-104584: Restore frame->stacktop on optimizer error (GH-108953) --- .../2023-09-05-11-31-27.gh-issue-104584.IRSXA2.rst | 2 ++ Python/optimizer.c | 1 + 2 files changed, 3 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-05-11-31-27.gh-issue-104584.IRSXA2.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-05-11-31-27.gh-issue-104584.IRSXA2.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-05-11-31-27.gh-issue-104584.IRSXA2.rst new file mode 100644 index 00000000000000..7f556bf8c31c11 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-05-11-31-27.gh-issue-104584.IRSXA2.rst @@ -0,0 +1,2 @@ +Fix a crash when running with :envvar:`PYTHONUOPS` or :option:`-X uops <-X>` +enabled and an error occurs during optimization. diff --git a/Python/optimizer.c b/Python/optimizer.c index 8aaf9f9fd7cb14..c6d0f9e5bf22d7 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -169,6 +169,7 @@ _PyOptimizer_BackEdge(_PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNI if (err <= 0) { assert(executor == NULL); if (err < 0) { + _PyFrame_SetStackPointer(frame, stack_pointer); return NULL; } goto jump_to_destination; From f0f96a9f40762499811681d405b6f922b6ed7a55 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Wed, 6 Sep 2023 22:19:54 +0100 Subject: [PATCH 070/357] GH-108202: Document ``calendar``'s command-line interface (#109020) Co-authored-by: Hugo van Kemenade --- Doc/library/calendar.rst | 143 +++++++++++++++++++++++++++++++++++++++ Lib/calendar.py | 2 +- 2 files changed, 144 insertions(+), 1 deletion(-) diff --git a/Doc/library/calendar.rst b/Doc/library/calendar.rst index 1868eb1cd359c4..157a7537f97dc6 100644 --- a/Doc/library/calendar.rst +++ b/Doc/library/calendar.rst @@ -489,3 +489,146 @@ The :mod:`calendar` module defines the following exceptions: Module :mod:`time` Low-level time related functions. + + +.. _calendar-cli: + +Command-Line Usage +------------------ + +.. versionadded:: 2.5 + +The :mod:`calendar` module can be executed as a script from the command line +to interactively print a calendar. + +.. code-block:: shell + + python -m calendar [-h] [-L LOCALE] [-e ENCODING] [-t {text,html}] + [-w WIDTH] [-l LINES] [-s SPACING] [-m MONTHS] [-c CSS] + [year] [month] + + +For example, to print a calendar for the year 2000: + +.. code-block:: console + + $ python -m calendar 2000 + 2000 + + January February March + Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su + 1 2 1 2 3 4 5 6 1 2 3 4 5 + 3 4 5 6 7 8 9 7 8 9 10 11 12 13 6 7 8 9 10 11 12 + 10 11 12 13 14 15 16 14 15 16 17 18 19 20 13 14 15 16 17 18 19 + 17 18 19 20 21 22 23 21 22 23 24 25 26 27 20 21 22 23 24 25 26 + 24 25 26 27 28 29 30 28 29 27 28 29 30 31 + 31 + + April May June + Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su + 1 2 1 2 3 4 5 6 7 1 2 3 4 + 3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11 + 10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18 + 17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25 + 24 25 26 27 28 29 30 29 30 31 26 27 28 29 30 + + July August September + Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su + 1 2 1 2 3 4 5 6 1 2 3 + 3 4 5 6 7 8 9 7 8 9 10 11 12 13 4 5 6 7 8 9 10 + 10 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 17 + 17 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 24 + 24 25 26 27 28 29 30 28 29 30 31 25 26 27 28 29 30 + 31 + + October November December + Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su + 1 1 2 3 4 5 1 2 3 + 2 3 4 5 6 7 8 6 7 8 9 10 11 12 4 5 6 7 8 9 10 + 9 10 11 12 13 14 15 13 14 15 16 17 18 19 11 12 13 14 15 16 17 + 16 17 18 19 20 21 22 20 21 22 23 24 25 26 18 19 20 21 22 23 24 + 23 24 25 26 27 28 29 27 28 29 30 25 26 27 28 29 30 31 + 30 31 + + +The following options are accepted: + +.. program:: calendar + + +.. option:: --help, -h + + Show the help message and exit. + + +.. option:: --locale LOCALE, -L LOCALE + + The locale to use for month and weekday names. + Defaults to English. + + +.. option:: --encoding ENCODING, -e ENCODING + + The encoding to use for output. + :option:`--encoding` is required if :option:`--locale` is set. + + +.. option:: --type {text,html}, -t {text,html} + + Print the calendar to the terminal as text, + or as an HTML document. + + +.. option:: year + + The year to print the calendar for. + Must be a number between 1 and 9999. + Defaults to the current year. + + +.. option:: month + + The month of the specified :option:`year` to print the calendar for. + Must be a number between 1 and 12, + and may only be used in text mode. + Defaults to printing a calendar for the full year. + + +*Text-mode options:* + +.. option:: --width WIDTH, -w WIDTH + + The width of the date column in terminal columns. + The date is printed centred in the column. + Any value lower than 2 is ignored. + Defaults to 2. + + +.. option:: --lines LINES, -l LINES + + The number of lines for each week in terminal rows. + The date is printed top-aligned. + Any value lower than 1 is ignored. + Defaults to 1. + + +.. option:: --spacing SPACING, -s SPACING + + The space between months in columns. + Any value lower than 2 is ignored. + Defaults to 6. + + +.. option:: --months MONTHS, -m MONTHS + + The number of months printed per row. + Defaults to 3. + + +*HTML-mode options:* + +.. option:: --css CSS, -c CSS + + The path of a CSS stylesheet to use for the calendar. + This must either be relative to the generated HTML, + or an absolute HTTP or ``file:///`` URL. diff --git a/Lib/calendar.py b/Lib/calendar.py index e43ba4a078bcac..2a4deb70a0111f 100644 --- a/Lib/calendar.py +++ b/Lib/calendar.py @@ -721,7 +721,7 @@ def main(args=None): parser.add_argument( "-L", "--locale", default=None, - help="locale to be used from month and weekday names" + help="locale to use for month and weekday names" ) parser.add_argument( "-e", "--encoding", From 60a9eea3f56c002356998f5532b3ad870a1ffa8e Mon Sep 17 00:00:00 2001 From: Mikhail Samylov Date: Thu, 7 Sep 2023 00:29:46 +0300 Subject: [PATCH 071/357] Docs: Fix typo in datetime.tzinfo docstring (#107257) Co-authored-by: Paul Ganssle <1377457+pganssle@users.noreply.github.com> Co-authored-by: Hugo van Kemenade --- Lib/_pydatetime.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/_pydatetime.py b/Lib/_pydatetime.py index df616bbaf8388d..4ffef65c577e1f 100644 --- a/Lib/_pydatetime.py +++ b/Lib/_pydatetime.py @@ -1238,7 +1238,7 @@ def __reduce__(self): class tzinfo: """Abstract base class for time zone info classes. - Subclasses must override the name(), utcoffset() and dst() methods. + Subclasses must override the tzname(), utcoffset() and dst() methods. """ __slots__ = () From a52a3509770f29f940cda9307704908949912276 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 7 Sep 2023 01:58:03 +0200 Subject: [PATCH 072/357] gh-109015: Add test.support.socket_helper.tcp_blackhole() (#109016) Skip test_asyncio, test_imaplib and test_socket tests if FreeBSD TCP blackhole is enabled (net.inet.tcp.blackhole=2). --- Lib/test/support/socket_helper.py | 60 +++++++++++++++++++ Lib/test/test_asyncio/test_events.py | 3 + Lib/test/test_asyncio/test_sock_lowlevel.py | 4 ++ Lib/test/test_asyncio/test_sslproto.py | 3 + Lib/test/test_imaplib.py | 1 + Lib/test/test_socket.py | 2 + ...-09-06-18-27-53.gh-issue-109015.1dS1AQ.rst | 6 ++ 7 files changed, 79 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-06-18-27-53.gh-issue-109015.1dS1AQ.rst diff --git a/Lib/test/support/socket_helper.py b/Lib/test/support/socket_helper.py index 45f6d65c355dd4..87941ee1791b4e 100644 --- a/Lib/test/support/socket_helper.py +++ b/Lib/test/support/socket_helper.py @@ -3,6 +3,7 @@ import os.path import socket import sys +import subprocess import tempfile import unittest @@ -277,3 +278,62 @@ def create_unix_domain_name(): """ return tempfile.mktemp(prefix="test_python_", suffix='.sock', dir=os.path.curdir) + + +# consider that sysctl values should not change while tests are running +_sysctl_cache = {} + +def _get_sysctl(name): + """Get a sysctl value as an integer.""" + try: + return _sysctl_cache[name] + except KeyError: + pass + + # At least Linux and FreeBSD support the "-n" option + cmd = ['sysctl', '-n', name] + proc = subprocess.run(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True) + if proc.returncode: + support.print_warning(f'{' '.join(cmd)!r} command failed with ' + f'exit code {proc.returncode}') + # cache the error to only log the warning once + _sysctl_cache[name] = None + return None + output = proc.stdout + + # Parse '0\n' to get '0' + try: + value = int(output.strip()) + except Exception as exc: + support.print_warning(f'Failed to parse {' '.join(cmd)!r} ' + f'command output {output!r}: {exc!r}') + # cache the error to only log the warning once + _sysctl_cache[name] = None + return None + + _sysctl_cache[name] = value + return value + + +def tcp_blackhole(): + if not sys.platform.startswith('freebsd'): + return False + + # gh-109015: test if FreeBSD TCP blackhole is enabled + value = _get_sysctl('net.inet.tcp.blackhole') + if value is None: + # don't skip if we fail to get the sysctl value + return False + return (value != 0) + + +def skip_if_tcp_blackhole(test): + """Decorator skipping test if TCP blackhole is enabled.""" + skip_if = unittest.skipIf( + tcp_blackhole(), + "TCP blackhole is enabled (sysctl net.inet.tcp.blackhole)" + ) + return skip_if(test) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index b9069056c3a436..30cc8fd80bfe94 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -671,6 +671,7 @@ def test_create_connection_local_addr(self): self.assertEqual(port, expected) tr.close() + @socket_helper.skip_if_tcp_blackhole def test_create_connection_local_addr_skip_different_family(self): # See https://github.com/python/cpython/issues/86508 port1 = socket_helper.find_unused_port() @@ -692,6 +693,7 @@ async def getaddrinfo(host, port, *args, **kwargs): with self.assertRaises(OSError): self.loop.run_until_complete(f) + @socket_helper.skip_if_tcp_blackhole def test_create_connection_local_addr_nomatch_family(self): # See https://github.com/python/cpython/issues/86508 port1 = socket_helper.find_unused_port() @@ -1271,6 +1273,7 @@ def connection_made(self, transport): server.close() + @socket_helper.skip_if_tcp_blackhole def test_server_close(self): f = self.loop.create_server(MyProto, '0.0.0.0', 0) server = self.loop.run_until_complete(f) diff --git a/Lib/test/test_asyncio/test_sock_lowlevel.py b/Lib/test/test_asyncio/test_sock_lowlevel.py index b829fd4cc69fff..075113cbe8e4a6 100644 --- a/Lib/test/test_asyncio/test_sock_lowlevel.py +++ b/Lib/test/test_asyncio/test_sock_lowlevel.py @@ -10,6 +10,10 @@ from test import support from test.support import socket_helper +if socket_helper.tcp_blackhole(): + raise unittest.SkipTest('Not relevant to ProactorEventLoop') + + def tearDownModule(): asyncio.set_event_loop_policy(None) diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 52a45f1c7c6e96..37d015339761c6 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -5,6 +5,7 @@ import unittest import weakref from test import support +from test.support import socket_helper from unittest import mock try: import ssl @@ -350,6 +351,7 @@ async def client(addr): support.gc_collect() self.assertIsNone(client_context()) + @socket_helper.skip_if_tcp_blackhole def test_start_tls_client_buf_proto_1(self): HELLO_MSG = b'1' * self.PAYLOAD_SIZE @@ -502,6 +504,7 @@ async def client(addr): asyncio.wait_for(client(srv.addr), timeout=support.SHORT_TIMEOUT)) + @socket_helper.skip_if_tcp_blackhole def test_start_tls_server_1(self): HELLO_MSG = b'1' * self.PAYLOAD_SIZE ANSWER = b'answer' diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py index 89cdca499f92a9..a1eaf2169fe227 100644 --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -74,6 +74,7 @@ def test_that_Time2Internaldate_returns_a_result(self): for t in self.timevalues(): imaplib.Time2Internaldate(t) + @socket_helper.skip_if_tcp_blackhole def test_imap4_host_default_value(self): # Check whether the IMAP4_PORT is truly unavailable. with socket.socket() as s: diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 0eaf64257c3b81..f35618e0281e70 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -5288,6 +5288,7 @@ def mocked_socket_module(self): finally: socket.socket = old_socket + @socket_helper.skip_if_tcp_blackhole def test_connect(self): port = socket_helper.find_unused_port() cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -5296,6 +5297,7 @@ def test_connect(self): cli.connect((HOST, port)) self.assertEqual(cm.exception.errno, errno.ECONNREFUSED) + @socket_helper.skip_if_tcp_blackhole def test_create_connection(self): # Issue #9792: errors raised by create_connection() should have # a proper errno attribute. diff --git a/Misc/NEWS.d/next/Tests/2023-09-06-18-27-53.gh-issue-109015.1dS1AQ.rst b/Misc/NEWS.d/next/Tests/2023-09-06-18-27-53.gh-issue-109015.1dS1AQ.rst new file mode 100644 index 00000000000000..cb641be9312e1a --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-06-18-27-53.gh-issue-109015.1dS1AQ.rst @@ -0,0 +1,6 @@ +Fix test_asyncio, test_imaplib and test_socket tests on FreeBSD if the TCP +blackhole is enabled (``sysctl net.inet.tcp.blackhole``). Skip the few tests +which failed with ``ETIMEDOUT`` which such non standard configuration. +Currently, the `FreeBSD GCP image enables TCP and UDP blackhole +`_ (``sysctl net.inet.tcp.blackhole=2`` +and ``sysctl net.inet.udp.blackhole=1``). Patch by Victor Stinner. From 19eddb515a8cf87df7aaa347379b3e56c324385b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 7 Sep 2023 02:09:06 +0200 Subject: [PATCH 073/357] gh-107211: No longer export internal _PyLong_FromUid() (#109037) No longer export _PyLong_FromUid() and _Py_Sigset_Converter() internal C API function. --- Modules/posixmodule.h | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/Modules/posixmodule.h b/Modules/posixmodule.h index 5452ffbf17acfc..8827ce153fed8c 100644 --- a/Modules/posixmodule.h +++ b/Modules/posixmodule.h @@ -2,31 +2,37 @@ #ifndef Py_POSIXMODULE_H #define Py_POSIXMODULE_H +#ifndef Py_LIMITED_API #ifdef __cplusplus extern "C" { #endif #ifdef HAVE_SYS_TYPES_H -#include +# include // uid_t #endif -#ifndef Py_LIMITED_API #ifndef MS_WINDOWS -PyAPI_FUNC(PyObject *) _PyLong_FromUid(uid_t); -PyAPI_FUNC(PyObject *) _PyLong_FromGid(gid_t); +extern PyObject* _PyLong_FromUid(uid_t); + +// Export for 'grp' shared extension +PyAPI_FUNC(PyObject*) _PyLong_FromGid(gid_t); + +// Export for '_posixsubprocess' shared extension PyAPI_FUNC(int) _Py_Uid_Converter(PyObject *, uid_t *); + +// Export for 'grp' shared extension PyAPI_FUNC(int) _Py_Gid_Converter(PyObject *, gid_t *); -#endif /* MS_WINDOWS */ +#endif // !MS_WINDOWS -#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGWAIT) || \ - defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT) -# define HAVE_SIGSET_T +#if (defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGWAIT) \ + || defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)) +# define HAVE_SIGSET_T #endif -PyAPI_FUNC(int) _Py_Sigset_Converter(PyObject *, void *); -#endif /* Py_LIMITED_API */ +extern int _Py_Sigset_Converter(PyObject *, void *); #ifdef __cplusplus } #endif -#endif /* !Py_POSIXMODULE_H */ +#endif // !Py_LIMITED_API +#endif // !Py_POSIXMODULE_H From 3bfa24e29f286cbc1f42bdb4d2b1c0c9d643c8d6 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Thu, 7 Sep 2023 09:53:54 +0900 Subject: [PATCH 074/357] gh-107265: Remove all ENTER_EXECUTOR when execute _Py_Instrument (gh-108539) --- Include/internal/pycore_code.h | 3 +++ Lib/test/test_monitoring.py | 28 ++++++++++++++++++++++ Objects/codeobject.c | 17 ++++++++++++++ Python/instrumentation.c | 43 +++++++++------------------------- 4 files changed, 59 insertions(+), 32 deletions(-) diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 7c6629074758da..b3f480c7204172 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -233,6 +233,9 @@ extern void _PyLineTable_InitAddressRange( extern int _PyLineTable_NextAddressRange(PyCodeAddressRange *range); extern int _PyLineTable_PreviousAddressRange(PyCodeAddressRange *range); +/** API for executors */ +extern void _PyCode_Clear_Executors(PyCodeObject *code); + #define ENABLE_SPECIALIZATION 1 /* Specialization functions */ diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py index 95fe8d03b0b29a..8a7d300b734dcc 100644 --- a/Lib/test/test_monitoring.py +++ b/Lib/test/test_monitoring.py @@ -1718,3 +1718,31 @@ def make_foo_optimized_then_set_event(): make_foo_optimized_then_set_event() finally: sys.monitoring.set_events(TEST_TOOL, 0) + + +class TestOptimizer(MonitoringTestBase, unittest.TestCase): + + def setUp(self): + import _testinternalcapi + self.old_opt = _testinternalcapi.get_optimizer() + opt = _testinternalcapi.get_counter_optimizer() + _testinternalcapi.set_optimizer(opt) + super(TestOptimizer, self).setUp() + + def tearDown(self): + import _testinternalcapi + super(TestOptimizer, self).tearDown() + _testinternalcapi.set_optimizer(self.old_opt) + + def test_for_loop(self): + def test_func(x): + i = 0 + while i < x: + i += 1 + + code = test_func.__code__ + sys.monitoring.set_local_events(TEST_TOOL, code, E.PY_START) + self.assertEqual(sys.monitoring.get_local_events(TEST_TOOL, code), E.PY_START) + test_func(1000) + sys.monitoring.set_local_events(TEST_TOOL, code, 0) + self.assertEqual(sys.monitoring.get_local_events(TEST_TOOL, code), 0) diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 58306075cad48b..1443027ff293ac 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1479,6 +1479,23 @@ clear_executors(PyCodeObject *co) co->co_executors = NULL; } +void +_PyCode_Clear_Executors(PyCodeObject *code) { + int code_len = (int)Py_SIZE(code); + for (int i = 0; i < code_len; i += _PyInstruction_GetLength(code, i)) { + _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; + uint8_t opcode = instr->op.code; + uint8_t oparg = instr->op.arg; + if (opcode == ENTER_EXECUTOR) { + _PyExecutorObject *exec = code->co_executors->executors[oparg]; + assert(exec->vm_data.opcode != ENTER_EXECUTOR); + instr->op.code = exec->vm_data.opcode; + instr->op.arg = exec->vm_data.oparg; + } + } + clear_executors(code); +} + static void deopt_code(PyCodeObject *code, _Py_CODEUNIT *instructions) { diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 9065043f55d8a7..acc3278d50a60a 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -3,6 +3,7 @@ #include "opcode_ids.h" #include "pycore_call.h" +#include "pycore_code.h" // _PyCode_Clear_Executors() #include "pycore_frame.h" #include "pycore_interp.h" #include "pycore_long.h" @@ -583,13 +584,7 @@ de_instrument(PyCodeObject *code, int i, int event) _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; uint8_t *opcode_ptr = &instr->op.code; int opcode = *opcode_ptr; - if (opcode == ENTER_EXECUTOR) { - int oparg = instr->op.arg; - _PyExecutorObject *exec = code->co_executors->executors[oparg]; - opcode_ptr = &exec->vm_data.opcode; - opcode = *opcode_ptr; - assert(opcode != ENTER_EXECUTOR); - } + assert(opcode != ENTER_EXECUTOR); if (opcode == INSTRUMENTED_LINE) { opcode_ptr = &code->_co_monitoring->lines[i].original_opcode; opcode = *opcode_ptr; @@ -734,22 +729,7 @@ remove_tools(PyCodeObject * code, int offset, int event, int tools) assert(event != PY_MONITORING_EVENT_LINE); assert(event != PY_MONITORING_EVENT_INSTRUCTION); assert(PY_MONITORING_IS_INSTRUMENTED_EVENT(event)); - #ifndef NDEBUG - _Py_CODEUNIT co_instr = _PyCode_CODE(code)[offset]; - uint8_t opcode = co_instr.op.code; - uint8_t oparg = co_instr.op.arg; - if (opcode == ENTER_EXECUTOR) { - _PyExecutorObject *exec = code->co_executors->executors[oparg]; - assert(exec->vm_data.opcode != ENTER_EXECUTOR); - opcode = _PyOpcode_Deopt[exec->vm_data.opcode]; - opcode = exec->vm_data.oparg; - } - else { - opcode = _Py_GetBaseOpcode(code, offset); - } - assert(opcode != ENTER_EXECUTOR); - assert(opcode_has_event(opcode)); - #endif + assert(opcode_has_event(_Py_GetBaseOpcode(code, offset))); _PyCoMonitoringData *monitoring = code->_co_monitoring; if (monitoring && monitoring->tools) { monitoring->tools[offset] &= ~tools; @@ -1315,16 +1295,10 @@ initialize_tools(PyCodeObject *code) for (int i = 0; i < code_len; i++) { _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; int opcode = instr->op.code; - int oparg = instr->op.arg; - if (opcode == ENTER_EXECUTOR) { - _PyExecutorObject *exec = code->co_executors->executors[oparg]; - opcode = exec->vm_data.opcode; - oparg = exec->vm_data.oparg; - } - else if (opcode == INSTRUMENTED_LINE) { + assert(opcode != ENTER_EXECUTOR); + if (opcode == INSTRUMENTED_LINE) { opcode = code->_co_monitoring->lines[i].original_opcode; } - assert(opcode != ENTER_EXECUTOR); bool instrumented = is_instrumented(opcode); if (instrumented) { opcode = DE_INSTRUMENT[opcode]; @@ -1335,7 +1309,7 @@ initialize_tools(PyCodeObject *code) if (instrumented) { int8_t event; if (opcode == RESUME) { - event = oparg != 0; + event = instr->op.arg != 0; } else { event = EVENT_FOR_OPCODE[opcode]; @@ -1588,6 +1562,9 @@ _Py_Instrument(PyCodeObject *code, PyInterpreterState *interp) ); return 0; } + if (code->co_executors != NULL) { + _PyCode_Clear_Executors(code); + } int code_len = (int)Py_SIZE(code); /* code->_co_firsttraceable >= code_len indicates * that no instrumentation can be inserted. @@ -1629,7 +1606,9 @@ _Py_Instrument(PyCodeObject *code, PyInterpreterState *interp) for (int i = code->_co_firsttraceable; i < code_len; i+= _PyInstruction_GetLength(code, i)) { _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; CHECK(instr->op.code != 0); + assert(instr->op.code != ENTER_EXECUTOR); int base_opcode = _Py_GetBaseOpcode(code, i); + assert(base_opcode != ENTER_EXECUTOR); if (opcode_has_event(base_opcode)) { int8_t event; if (base_opcode == RESUME) { From f42edf1e7be5018a8988a219a168e231cbaa25e5 Mon Sep 17 00:00:00 2001 From: Anders Kaseorg Date: Wed, 6 Sep 2023 19:42:58 -0700 Subject: [PATCH 075/357] gh-109045: Remove remaining LIMITED_API_AVAILABLE checks in tests (#109046) Commit 13a00078b81776b23b0b6add69b848382240d1f2 (#108663) made all Python builds compatible with the Limited API, and removed the LIMITED_API_AVAILABLE flag. However, some tests were still checking for that flag, so they were now being incorrectly skipped. Remove these checks to let these tests run again. Signed-off-by: Anders Kaseorg --- Lib/test/support/__init__.py | 3 +-- Modules/_testcapi/heaptype_relative.c | 4 ---- Modules/_testcapi/vectorcall_limited.c | 6 ------ Modules/_testcapimodule.c | 6 ------ 4 files changed, 1 insertion(+), 18 deletions(-) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index d39f529499ca50..38ad965e155302 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -1090,8 +1090,7 @@ def requires_limited_api(test): import _testcapi except ImportError: return unittest.skip('needs _testcapi module')(test) - return unittest.skipUnless( - _testcapi.LIMITED_API_AVAILABLE, 'needs Limited API support')(test) + return test def requires_specialization(test): return unittest.skipUnless( diff --git a/Modules/_testcapi/heaptype_relative.c b/Modules/_testcapi/heaptype_relative.c index c247ca33b33708..53dd01d1ed4f80 100644 --- a/Modules/_testcapi/heaptype_relative.c +++ b/Modules/_testcapi/heaptype_relative.c @@ -3,8 +3,6 @@ #include // max_align_t #include // memset -#ifdef LIMITED_API_AVAILABLE - static PyType_Slot empty_slots[] = { {0, NULL}, }; @@ -339,5 +337,3 @@ _PyTestCapi_Init_HeaptypeRelative(PyObject *m) { return 0; } - -#endif // LIMITED_API_AVAILABLE diff --git a/Modules/_testcapi/vectorcall_limited.c b/Modules/_testcapi/vectorcall_limited.c index a96925e840121a..e981c8625c2fb2 100644 --- a/Modules/_testcapi/vectorcall_limited.c +++ b/Modules/_testcapi/vectorcall_limited.c @@ -1,10 +1,6 @@ #define Py_LIMITED_API 0x030c0000 // 3.12 #include "parts.h" -#ifdef LIMITED_API_AVAILABLE - - - /* Test Vectorcall in the limited API */ static PyObject * @@ -175,5 +171,3 @@ _PyTestCapi_Init_VectorcallLimited(PyObject *m) { return 0; } - -#endif // LIMITED_API_AVAILABLE diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 5ff5172f4f30eb..9bd963baf066a4 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -3996,18 +3996,12 @@ PyInit__testcapi(void) if (_PyTestCapi_Init_PyAtomic(m) < 0) { return NULL; } - -#ifndef LIMITED_API_AVAILABLE - PyModule_AddObjectRef(m, "LIMITED_API_AVAILABLE", Py_False); -#else - PyModule_AddObjectRef(m, "LIMITED_API_AVAILABLE", Py_True); if (_PyTestCapi_Init_VectorcallLimited(m) < 0) { return NULL; } if (_PyTestCapi_Init_HeaptypeRelative(m) < 0) { return NULL; } -#endif PyState_AddModule(m, &_testcapimodule); return m; From fd5989bda119f8c0f8571aad88d8e9be3be678a4 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 7 Sep 2023 04:47:57 +0200 Subject: [PATCH 076/357] gh-108753: _Py_PrintSpecializationStats() uses Py_hexdigits (#109040) --- Python/specialize.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Python/specialize.c b/Python/specialize.c index e072167ff38ce9..8b4aac2f890930 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -290,8 +290,8 @@ _Py_PrintSpecializationStats(int to_file) char hex_name[41]; _PyOS_URandomNonblock(rand, 20); for (int i = 0; i < 20; i++) { - hex_name[2*i] = "0123456789abcdef"[rand[i]&15]; - hex_name[2*i+1] = "0123456789abcdef"[(rand[i]>>4)&15]; + hex_name[2*i] = Py_hexdigits[rand[i]&15]; + hex_name[2*i+1] = Py_hexdigits[(rand[i]>>4)&15]; } hex_name[40] = '\0'; char buf[64]; From e7d5433f944a5725aa82595f9251abfc8a63d333 Mon Sep 17 00:00:00 2001 From: Daniel Weiss <134341009+justdan6@users.noreply.github.com> Date: Wed, 6 Sep 2023 23:33:51 -0600 Subject: [PATCH 077/357] gh-108915: Removes extra backslashes in str.split docstring (#109044) --- Objects/clinic/unicodeobject.c.h | 6 +++--- Objects/unicodeobject.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Objects/clinic/unicodeobject.c.h b/Objects/clinic/unicodeobject.c.h index cfee9b8aa1fa8c..42b8a3c69cad8a 100644 --- a/Objects/clinic/unicodeobject.c.h +++ b/Objects/clinic/unicodeobject.c.h @@ -950,7 +950,7 @@ PyDoc_STRVAR(unicode_split__doc__, " The separator used to split the string.\n" "\n" " When set to None (the default value), will split on any whitespace\n" -" character (including \\\\n \\\\r \\\\t \\\\f and spaces) and will discard\n" +" character (including \\n \\r \\t \\f and spaces) and will discard\n" " empty strings from the result.\n" " maxsplit\n" " Maximum number of splits (starting from the left).\n" @@ -1074,7 +1074,7 @@ PyDoc_STRVAR(unicode_rsplit__doc__, " The separator used to split the string.\n" "\n" " When set to None (the default value), will split on any whitespace\n" -" character (including \\\\n \\\\r \\\\t \\\\f and spaces) and will discard\n" +" character (including \\n \\r \\t \\f and spaces) and will discard\n" " empty strings from the result.\n" " maxsplit\n" " Maximum number of splits (starting from the left).\n" @@ -1504,4 +1504,4 @@ unicode_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=8d08dfbb814c4393 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=4acdcfdc93f2a0f6 input=a9049054013a1b77]*/ diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 045b48c526a958..4b87bf8e37aa94 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -12402,7 +12402,7 @@ str.split as unicode_split The separator used to split the string. When set to None (the default value), will split on any whitespace - character (including \\n \\r \\t \\f and spaces) and will discard + character (including \n \r \t \f and spaces) and will discard empty strings from the result. maxsplit: Py_ssize_t = -1 Maximum number of splits (starting from the left). @@ -12418,7 +12418,7 @@ the regular expression module. static PyObject * unicode_split_impl(PyObject *self, PyObject *sep, Py_ssize_t maxsplit) -/*[clinic end generated code: output=3a65b1db356948dc input=906d953b44efc43b]*/ +/*[clinic end generated code: output=3a65b1db356948dc input=07b9040d98c5fe8d]*/ { if (sep == Py_None) return split(self, NULL, maxsplit); From babdced23fc299b7607ac76abfdd7a81050f8359 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 7 Sep 2023 07:43:32 +0200 Subject: [PATCH 078/357] test.pythoninfo logs freedesktop_os_release() (#109057) --- Lib/test/pythoninfo.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index 46522b50dd1e98..c628833478044e 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -164,6 +164,26 @@ def collect_platform(info_add): if libc_ver: info_add('platform.libc_ver', libc_ver) + try: + os_release = platform.freedesktop_os_release() + except OSError: + pass + else: + for key in ( + 'ID', + 'NAME', + 'PRETTY_NAME' + 'VARIANT', + 'VARIANT_ID', + 'VERSION', + 'VERSION_CODENAME', + 'VERSION_ID', + ): + if key not in os_release: + continue + info_add(f'platform.freedesktop_os_release[{key}]', + os_release[key]) + def collect_locale(info_add): import locale @@ -920,7 +940,6 @@ def dump_info(info, file=None): for key, value in infos: value = value.replace("\n", " ") print("%s: %s" % (key, value)) - print() def main(): @@ -929,6 +948,7 @@ def main(): dump_info(info) if error: + print() print("Collection failed: exit with error", file=sys.stderr) sys.exit(1) From 3e53ac99038920550358c1ea0212c3907a8cb385 Mon Sep 17 00:00:00 2001 From: Ijtaba Hussain Date: Thu, 7 Sep 2023 12:41:38 +0500 Subject: [PATCH 079/357] gh-103186: Suppress and assert expected RuntimeWarnings in test_sys_settrace (GH-103244) Caused as a result of frame manipulation where locals are never assigned / initialised. --- Lib/test/test_sys_settrace.py | 74 +++++++++++-------- ...-04-05-06-45-20.gh-issue-103186.640Eg-.rst | 1 + 2 files changed, 43 insertions(+), 32 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-04-05-06-45-20.gh-issue-103186.640Eg-.rst diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 7d38addaee413e..53ec4eaea64b10 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -8,6 +8,7 @@ from functools import wraps import asyncio from test.support import import_helper +import contextlib support.requires_working_socket(module=True) @@ -1922,6 +1923,8 @@ def no_jump_without_trace_function(): class JumpTestCase(unittest.TestCase): + unbound_locals = r"assigning None to [0-9]+ unbound local" + def setUp(self): self.addCleanup(sys.settrace, sys.gettrace()) sys.settrace(None) @@ -1933,33 +1936,39 @@ def compare_jump_output(self, expected, received): "Received: " + repr(received)) def run_test(self, func, jumpFrom, jumpTo, expected, error=None, - event='line', decorated=False): + event='line', decorated=False, warning=None): tracer = JumpTracer(func, jumpFrom, jumpTo, event, decorated) sys.settrace(tracer.trace) output = [] - if error is None: + + with contextlib.ExitStack() as stack: + if error is not None: + stack.enter_context(self.assertRaisesRegex(*error)) + if warning is not None: + stack.enter_context(self.assertWarnsRegex(*warning)) func(output) - else: - with self.assertRaisesRegex(*error): - func(output) + sys.settrace(None) self.compare_jump_output(expected, output) def run_async_test(self, func, jumpFrom, jumpTo, expected, error=None, - event='line', decorated=False): + event='line', decorated=False, warning=None): tracer = JumpTracer(func, jumpFrom, jumpTo, event, decorated) sys.settrace(tracer.trace) output = [] - if error is None: + + with contextlib.ExitStack() as stack: + if error is not None: + stack.enter_context(self.assertRaisesRegex(*error)) + if warning is not None: + stack.enter_context(self.assertWarnsRegex(*warning)) asyncio.run(func(output)) - else: - with self.assertRaisesRegex(*error): - asyncio.run(func(output)) + sys.settrace(None) asyncio.set_event_loop_policy(None) self.compare_jump_output(expected, output) - def jump_test(jumpFrom, jumpTo, expected, error=None, event='line'): + def jump_test(jumpFrom, jumpTo, expected, error=None, event='line', warning=None): """Decorator that creates a test that makes a jump from one place to another in the following code. """ @@ -1967,11 +1976,11 @@ def decorator(func): @wraps(func) def test(self): self.run_test(func, jumpFrom, jumpTo, expected, - error=error, event=event, decorated=True) + error=error, event=event, decorated=True, warning=warning) return test return decorator - def async_jump_test(jumpFrom, jumpTo, expected, error=None, event='line'): + def async_jump_test(jumpFrom, jumpTo, expected, error=None, event='line', warning=None): """Decorator that creates a test that makes a jump from one place to another in the following asynchronous code. """ @@ -1979,7 +1988,7 @@ def decorator(func): @wraps(func) def test(self): self.run_async_test(func, jumpFrom, jumpTo, expected, - error=error, event=event, decorated=True) + error=error, event=event, decorated=True, warning=warning) return test return decorator @@ -1996,7 +2005,7 @@ def test_jump_simple_backwards(output): output.append(1) output.append(2) - @jump_test(3, 5, [2, 5]) + @jump_test(3, 5, [2, 5], warning=(RuntimeWarning, unbound_locals)) def test_jump_out_of_block_forwards(output): for i in 1, 2: output.append(2) @@ -2210,7 +2219,7 @@ def test_jump_within_except_block(output): output.append(6) output.append(7) - @jump_test(6, 1, [1, 5, 1, 5]) + @jump_test(6, 1, [1, 5, 1, 5], warning=(RuntimeWarning, unbound_locals)) def test_jump_over_try_except(output): output.append(1) try: @@ -2306,7 +2315,7 @@ def test_jump_out_of_complex_nested_blocks(output): output.append(11) output.append(12) - @jump_test(3, 5, [1, 2, 5]) + @jump_test(3, 5, [1, 2, 5], warning=(RuntimeWarning, unbound_locals)) def test_jump_out_of_with_assignment(output): output.append(1) with tracecontext(output, 2) \ @@ -2314,7 +2323,7 @@ def test_jump_out_of_with_assignment(output): output.append(4) output.append(5) - @async_jump_test(3, 5, [1, 2, 5]) + @async_jump_test(3, 5, [1, 2, 5], warning=(RuntimeWarning, unbound_locals)) async def test_jump_out_of_async_with_assignment(output): output.append(1) async with asynctracecontext(output, 2) \ @@ -2350,7 +2359,7 @@ def test_jump_over_break_in_try_finally_block(output): break output.append(13) - @jump_test(1, 7, [7, 8]) + @jump_test(1, 7, [7, 8], warning=(RuntimeWarning, unbound_locals)) def test_jump_over_for_block_before_else(output): output.append(1) if not output: # always false @@ -2361,7 +2370,7 @@ def test_jump_over_for_block_before_else(output): output.append(7) output.append(8) - @async_jump_test(1, 7, [7, 8]) + @async_jump_test(1, 7, [7, 8], warning=(RuntimeWarning, unbound_locals)) async def test_jump_over_async_for_block_before_else(output): output.append(1) if not output: # always false @@ -2436,6 +2445,7 @@ def test_no_jump_backwards_into_for_block(output): output.append(2) output.append(3) + @async_jump_test(3, 2, [2, 2], (ValueError, "can't jump into the body of a for loop")) async def test_no_jump_backwards_into_async_for_block(output): async for i in asynciter([1, 2]): @@ -2501,7 +2511,7 @@ def test_jump_backwards_into_try_except_block(output): output.append(6) # 'except' with a variable creates an implicit finally block - @jump_test(5, 7, [4, 7, 8]) + @jump_test(5, 7, [4, 7, 8], warning=(RuntimeWarning, unbound_locals)) def test_jump_between_except_blocks_2(output): try: 1/0 @@ -2664,7 +2674,7 @@ def test_large_function(self): output.append(x) # line 1007 return""" % ('\n' * 1000,), d) f = d['f'] - self.run_test(f, 2, 1007, [0]) + self.run_test(f, 2, 1007, [0], warning=(RuntimeWarning, self.unbound_locals)) def test_jump_to_firstlineno(self): # This tests that PDB can jump back to the first line in a @@ -2714,7 +2724,7 @@ def gen(): next(gen()) output.append(5) - @jump_test(2, 3, [1, 3]) + @jump_test(2, 3, [1, 3], warning=(RuntimeWarning, unbound_locals)) def test_jump_forward_over_listcomp(output): output.append(1) x = [i for i in range(10)] @@ -2722,13 +2732,13 @@ def test_jump_forward_over_listcomp(output): # checking for segfaults. # See https://github.com/python/cpython/issues/92311 - @jump_test(3, 1, []) + @jump_test(3, 1, [], warning=(RuntimeWarning, unbound_locals)) def test_jump_backward_over_listcomp(output): a = 1 x = [i for i in range(10)] c = 3 - @jump_test(8, 2, [2, 7, 2]) + @jump_test(8, 2, [2, 7, 2], warning=(RuntimeWarning, unbound_locals)) def test_jump_backward_over_listcomp_v2(output): flag = False output.append(2) @@ -2739,19 +2749,19 @@ def test_jump_backward_over_listcomp_v2(output): output.append(7) output.append(8) - @async_jump_test(2, 3, [1, 3]) + @async_jump_test(2, 3, [1, 3], warning=(RuntimeWarning, unbound_locals)) async def test_jump_forward_over_async_listcomp(output): output.append(1) x = [i async for i in asynciter(range(10))] output.append(3) - @async_jump_test(3, 1, []) + @async_jump_test(3, 1, [], warning=(RuntimeWarning, unbound_locals)) async def test_jump_backward_over_async_listcomp(output): a = 1 x = [i async for i in asynciter(range(10))] c = 3 - @async_jump_test(8, 2, [2, 7, 2]) + @async_jump_test(8, 2, [2, 7, 2], warning=(RuntimeWarning, unbound_locals)) async def test_jump_backward_over_async_listcomp_v2(output): flag = False output.append(2) @@ -2820,13 +2830,13 @@ def test_jump_with_null_on_stack_load_attr(output): ) output.append(15) - @jump_test(2, 3, [1, 3]) + @jump_test(2, 3, [1, 3], warning=(RuntimeWarning, unbound_locals)) def test_jump_extended_args_unpack_ex_simple(output): output.append(1) _, *_, _ = output.append(2) or "Spam" output.append(3) - @jump_test(3, 4, [1, 4, 4, 5]) + @jump_test(3, 4, [1, 4, 4, 5], warning=(RuntimeWarning, unbound_locals)) def test_jump_extended_args_unpack_ex_tricky(output): output.append(1) ( @@ -2848,9 +2858,9 @@ def test_jump_extended_args_for_iter(self): namespace = {} exec("\n".join(source), namespace) f = namespace["f"] - self.run_test(f, 2, 100_000, [1, 100_000]) + self.run_test(f, 2, 100_000, [1, 100_000], warning=(RuntimeWarning, self.unbound_locals)) - @jump_test(2, 3, [1, 3]) + @jump_test(2, 3, [1, 3], warning=(RuntimeWarning, unbound_locals)) def test_jump_or_pop(output): output.append(1) _ = output.append(2) and "Spam" diff --git a/Misc/NEWS.d/next/Tests/2023-04-05-06-45-20.gh-issue-103186.640Eg-.rst b/Misc/NEWS.d/next/Tests/2023-04-05-06-45-20.gh-issue-103186.640Eg-.rst new file mode 100644 index 00000000000000..2f596aa5f47bda --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-04-05-06-45-20.gh-issue-103186.640Eg-.rst @@ -0,0 +1 @@ +Suppress and assert expected RuntimeWarnings in test_sys_settrace.py From e183a71eef1ec3ac86bb4d81a158c21d6f1a783b Mon Sep 17 00:00:00 2001 From: Karthikeyan Singaravelan Date: Thu, 7 Sep 2023 14:49:13 +0530 Subject: [PATCH 080/357] bpo-38157: Add example about per file output for mock_open. (#16090) Co-authored-by: Stanley <46876382+slateny@users.noreply.github.com> Co-authored-by: Jelle Zijlstra Co-authored-by: Hugo van Kemenade --- Doc/library/unittest.mock-examples.rst | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Doc/library/unittest.mock-examples.rst b/Doc/library/unittest.mock-examples.rst index 744fc9de63cd16..34f343ebacdbb7 100644 --- a/Doc/library/unittest.mock-examples.rst +++ b/Doc/library/unittest.mock-examples.rst @@ -360,6 +360,30 @@ of arbitrary attributes as well as the getting of them then you can use *spec_set* instead of *spec*. +Using side_effect to return per file content +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:func:`mock_open` is used to patch :func:`open` method. :attr:`~Mock.side_effect` +can be used to return a new Mock object per call. This can be used to return different +contents per file stored in a dictionary:: + + DEFAULT = "default" + data_dict = {"file1": "data1", + "file2": "data2"} + + def open_side_effect(name): + return mock_open(read_data=data_dict.get(name, DEFAULT))() + + with patch("builtins.open", side_effect=open_side_effect): + with open("file1") as file1: + assert file1.read() == "data1" + + with open("file2") as file2: + assert file2.read() == "data2" + + with open("file3") as file2: + assert file2.read() == "default" + Patch Decorators ---------------- From 6b15ff52351787644115a4dd9d5d6717d66b9806 Mon Sep 17 00:00:00 2001 From: Ori Hoch Date: Thu, 7 Sep 2023 13:33:02 +0300 Subject: [PATCH 081/357] socket documentation fix - rename triple to 3-tuple (#24722) Co-authored-by: Hugo van Kemenade --- Doc/library/socket.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 4f220e8a098979..83957c87990440 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -979,7 +979,7 @@ The :mod:`socket` module also offers various network-related services: .. function:: gethostbyname_ex(hostname) Translate a host name to IPv4 address format, extended interface. Return a - triple ``(hostname, aliaslist, ipaddrlist)`` where *hostname* is the host's + 3-tuple ``(hostname, aliaslist, ipaddrlist)`` where *hostname* is the host's primary host name, *aliaslist* is a (possibly empty) list of alternative host names for the same address, and *ipaddrlist* is a list of IPv4 addresses for the same interface on the same host (often but not @@ -1007,7 +1007,7 @@ The :mod:`socket` module also offers various network-related services: .. function:: gethostbyaddr(ip_address) - Return a triple ``(hostname, aliaslist, ipaddrlist)`` where *hostname* is the + Return a 3-tuple ``(hostname, aliaslist, ipaddrlist)`` where *hostname* is the primary host name responding to the given *ip_address*, *aliaslist* is a (possibly empty) list of alternative host names for the same address, and *ipaddrlist* is a list of IPv4/v6 addresses for the same interface on the same From 1294fcede09af6c781553b7a3a6ff612c7dfa431 Mon Sep 17 00:00:00 2001 From: Colin Watson Date: Thu, 7 Sep 2023 14:14:27 +0100 Subject: [PATCH 082/357] GH-90915: Document that SystemExit doesn't trigger sys.excepthook (#31357) Co-authored-by: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> Co-authored-by: Hugo van Kemenade --- Doc/library/sys.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index ba8d80bccbd894..c116f4b9b00825 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -378,7 +378,7 @@ always available. This function prints out a given traceback and exception to ``sys.stderr``. - When an exception is raised and uncaught, the interpreter calls + When an exception other than :exc:`SystemExit` is raised and uncaught, the interpreter calls ``sys.excepthook`` with three arguments, the exception class, exception instance, and a traceback object. In an interactive session this happens just before control is returned to the prompt; in a Python program this happens just From e4bb0026b9a21d066e7a5c4716ea4d755b95d2d5 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 7 Sep 2023 16:30:41 +0300 Subject: [PATCH 083/357] gh-103186: Remove debug print in test_sys_settrace (GH-109077) --- Lib/test/test_sys_settrace.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 53ec4eaea64b10..2888f0b870672d 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -1654,7 +1654,6 @@ def error_once(frame, event, arg): except Exception as ex: count = 0 tb = ex.__traceback__ - print(tb) while tb: if tb.tb_frame.f_code.co_name == "test_settrace_error": count += 1 From d485551c9d1792ff3539eef1d6374bd4c01dcd5d Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 7 Sep 2023 16:34:44 +0300 Subject: [PATCH 084/357] gh-103186: Suppress RuntimeWarning about unclosed async iterator in test_sys_settrace (GH-109075) --- Lib/test/test_sys_settrace.py | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 2888f0b870672d..232900876392ff 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -41,6 +41,20 @@ async def asynciter(iterable): for x in iterable: yield x +def clean_asynciter(test): + @wraps(test) + async def wrapper(*args, **kwargs): + cleanups = [] + def wrapped_asynciter(iterable): + it = asynciter(iterable) + cleanups.append(it.aclose) + return it + try: + return await test(*args, **kwargs, asynciter=wrapped_asynciter) + finally: + while cleanups: + await cleanups.pop()() + return wrapper # A very basic example. If this fails, we're in deep trouble. def basic(): @@ -1936,7 +1950,11 @@ def compare_jump_output(self, expected, received): def run_test(self, func, jumpFrom, jumpTo, expected, error=None, event='line', decorated=False, warning=None): - tracer = JumpTracer(func, jumpFrom, jumpTo, event, decorated) + wrapped = func + while hasattr(wrapped, '__wrapped__'): + wrapped = wrapped.__wrapped__ + + tracer = JumpTracer(wrapped, jumpFrom, jumpTo, event, decorated) sys.settrace(tracer.trace) output = [] @@ -1952,7 +1970,11 @@ def run_test(self, func, jumpFrom, jumpTo, expected, error=None, def run_async_test(self, func, jumpFrom, jumpTo, expected, error=None, event='line', decorated=False, warning=None): - tracer = JumpTracer(func, jumpFrom, jumpTo, event, decorated) + wrapped = func + while hasattr(wrapped, '__wrapped__'): + wrapped = wrapped.__wrapped__ + + tracer = JumpTracer(wrapped, jumpFrom, jumpTo, event, decorated) sys.settrace(tracer.trace) output = [] @@ -2023,7 +2045,8 @@ def test_jump_out_of_block_backwards(output): output.append(7) @async_jump_test(4, 5, [3, 5]) - async def test_jump_out_of_async_for_block_forwards(output): + @clean_asynciter + async def test_jump_out_of_async_for_block_forwards(output, asynciter): for i in [1]: async for i in asynciter([1, 2]): output.append(3) @@ -2031,7 +2054,8 @@ async def test_jump_out_of_async_for_block_forwards(output): output.append(5) @async_jump_test(5, 2, [2, 4, 2, 4, 5, 6]) - async def test_jump_out_of_async_for_block_backwards(output): + @clean_asynciter + async def test_jump_out_of_async_for_block_backwards(output, asynciter): for i in [1]: output.append(2) async for i in asynciter([1]): From 0858328ca2457ae95715eb93e347d5c0547bec6f Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Thu, 7 Sep 2023 14:39:03 +0100 Subject: [PATCH 085/357] GH-108614: Add `RESUME_CHECK` instruction (GH-108630) --- Include/internal/pycore_opcode_metadata.h | 10 +- Include/opcode_ids.h | 283 ++++++++--------- Lib/_opcode_metadata.py | 286 ++++++++--------- Lib/test/test_dis.py | 290 +++++++++--------- ...-08-26-10-36-45.gh-issue-108614.wl5l-W.rst | 2 + Objects/genobject.c | 6 +- Programs/test_frozenmain.h | 22 +- Python/abstract_interp_cases.c.h | 2 +- Python/bytecodes.c | 29 +- Python/ceval_macros.h | 2 + Python/emscripten_signal.c | 8 +- Python/executor_cases.c.h | 25 +- Python/generated_cases.c.h | 28 +- Python/opcode_targets.h | 4 +- Tools/cases_generator/instructions.py | 1 + Tools/cases_generator/parsing.py | 3 +- 16 files changed, 519 insertions(+), 482 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-08-26-10-36-45.gh-issue-108614.wl5l-W.rst diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index fa4cbd9ed31c01..fb5c0465a10021 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -82,6 +82,8 @@ int _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 0; case RESUME: return 0; + case RESUME_CHECK: + return 0; case INSTRUMENTED_RESUME: return 0; case LOAD_CLOSURE: @@ -614,6 +616,8 @@ int _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 0; case RESUME: return 0; + case RESUME_CHECK: + return 0; case INSTRUMENTED_RESUME: return 0; case LOAD_CLOSURE: @@ -1207,6 +1211,7 @@ extern const struct opcode_metadata _PyOpcode_opcode_metadata[OPCODE_METADATA_SI const struct opcode_metadata _PyOpcode_opcode_metadata[OPCODE_METADATA_SIZE] = { [NOP] = { true, INSTR_FMT_IX, 0 }, [RESUME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG }, + [RESUME_CHECK] = { true, INSTR_FMT_IX, HAS_DEOPT_FLAG }, [INSTRUMENTED_RESUME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG }, [LOAD_CLOSURE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG }, [LOAD_FAST_CHECK] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_ERROR_FLAG }, @@ -1477,7 +1482,7 @@ extern const struct opcode_macro_expansion _PyOpcode_macro_expansion[OPCODE_MACR #ifdef NEED_OPCODE_METADATA const struct opcode_macro_expansion _PyOpcode_macro_expansion[OPCODE_MACRO_EXPANSION_SIZE] = { [NOP] = { .nuops = 1, .uops = { { NOP, 0, 0 } } }, - [RESUME] = { .nuops = 1, .uops = { { RESUME, 0, 0 } } }, + [RESUME_CHECK] = { .nuops = 1, .uops = { { RESUME_CHECK, 0, 0 } } }, [LOAD_FAST_CHECK] = { .nuops = 1, .uops = { { LOAD_FAST_CHECK, 0, 0 } } }, [LOAD_FAST] = { .nuops = 1, .uops = { { LOAD_FAST, 0, 0 } } }, [LOAD_FAST_AND_CLEAR] = { .nuops = 1, .uops = { { LOAD_FAST_AND_CLEAR, 0, 0 } } }, @@ -1716,6 +1721,7 @@ const char *const _PyOpcode_OpName[268] = { [POP_TOP] = "POP_TOP", [PUSH_EXC_INFO] = "PUSH_EXC_INFO", [PUSH_NULL] = "PUSH_NULL", + [RESUME_CHECK] = "RESUME_CHECK", [RETURN_GENERATOR] = "RETURN_GENERATOR", [RETURN_VALUE] = "RETURN_VALUE", [SETUP_ANNOTATIONS] = "SETUP_ANNOTATIONS", @@ -2077,6 +2083,7 @@ const uint8_t _PyOpcode_Deopt[256] = { [RERAISE] = RERAISE, [RESERVED] = RESERVED, [RESUME] = RESUME, + [RESUME_CHECK] = RESUME, [RETURN_CONST] = RETURN_CONST, [RETURN_GENERATOR] = RETURN_GENERATOR, [RETURN_VALUE] = RETURN_VALUE, @@ -2122,7 +2129,6 @@ const uint8_t _PyOpcode_Deopt[256] = { #endif // NEED_OPCODE_METADATA #define EXTRA_CASES \ - case 188: \ case 189: \ case 190: \ case 191: \ diff --git a/Include/opcode_ids.h b/Include/opcode_ids.h index cd43716415d1db..eabdf4bc020ef7 100644 --- a/Include/opcode_ids.h +++ b/Include/opcode_ids.h @@ -57,148 +57,149 @@ extern "C" { #define POP_TOP 44 #define PUSH_EXC_INFO 45 #define PUSH_NULL 46 -#define RETURN_GENERATOR 47 -#define RETURN_VALUE 48 -#define SETUP_ANNOTATIONS 49 -#define STORE_ATTR_INSTANCE_VALUE 50 -#define STORE_ATTR_SLOT 51 -#define STORE_SLICE 52 -#define STORE_SUBSCR 53 -#define STORE_SUBSCR_DICT 54 -#define STORE_SUBSCR_LIST_INT 55 -#define TO_BOOL 56 -#define TO_BOOL_ALWAYS_TRUE 57 -#define TO_BOOL_BOOL 58 -#define TO_BOOL_INT 59 -#define TO_BOOL_LIST 60 -#define TO_BOOL_NONE 61 -#define TO_BOOL_STR 62 -#define UNARY_INVERT 63 -#define UNARY_NEGATIVE 64 -#define UNARY_NOT 65 -#define WITH_EXCEPT_START 66 -#define HAVE_ARGUMENT 67 -#define BINARY_OP 67 -#define BUILD_CONST_KEY_MAP 68 -#define BUILD_LIST 69 -#define BUILD_MAP 70 -#define BUILD_SET 71 -#define BUILD_SLICE 72 -#define BUILD_STRING 73 -#define BUILD_TUPLE 74 -#define CALL 75 -#define CALL_BOUND_METHOD_EXACT_ARGS 76 -#define CALL_BUILTIN_CLASS 77 -#define CALL_BUILTIN_FAST_WITH_KEYWORDS 78 -#define CALL_FUNCTION_EX 79 -#define CALL_INTRINSIC_1 80 -#define CALL_INTRINSIC_2 81 -#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 82 -#define CALL_NO_KW_ALLOC_AND_ENTER_INIT 83 -#define CALL_NO_KW_BUILTIN_FAST 84 -#define CALL_NO_KW_BUILTIN_O 85 -#define CALL_NO_KW_ISINSTANCE 86 -#define CALL_NO_KW_LEN 87 -#define CALL_NO_KW_LIST_APPEND 88 -#define CALL_NO_KW_METHOD_DESCRIPTOR_FAST 89 -#define CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS 90 -#define CALL_NO_KW_METHOD_DESCRIPTOR_O 91 -#define CALL_NO_KW_STR_1 92 -#define CALL_NO_KW_TUPLE_1 93 -#define CALL_NO_KW_TYPE_1 94 -#define CALL_PY_EXACT_ARGS 95 -#define CALL_PY_WITH_DEFAULTS 96 -#define COMPARE_OP 97 -#define COMPARE_OP_FLOAT 98 -#define COMPARE_OP_INT 99 -#define COMPARE_OP_STR 100 -#define CONTAINS_OP 101 -#define CONVERT_VALUE 102 -#define COPY 103 -#define COPY_FREE_VARS 104 -#define DELETE_ATTR 105 -#define DELETE_DEREF 106 -#define DELETE_FAST 107 -#define DELETE_GLOBAL 108 -#define DELETE_NAME 109 -#define DICT_MERGE 110 -#define DICT_UPDATE 111 -#define ENTER_EXECUTOR 112 -#define EXTENDED_ARG 113 -#define FOR_ITER 114 -#define FOR_ITER_GEN 115 -#define FOR_ITER_LIST 116 -#define FOR_ITER_RANGE 117 -#define FOR_ITER_TUPLE 118 -#define GET_AWAITABLE 119 -#define IMPORT_FROM 120 -#define IMPORT_NAME 121 -#define IS_OP 122 -#define JUMP_BACKWARD 123 -#define JUMP_BACKWARD_NO_INTERRUPT 124 -#define JUMP_FORWARD 125 -#define KW_NAMES 126 -#define LIST_APPEND 127 -#define LIST_EXTEND 128 -#define LOAD_ATTR 129 -#define LOAD_ATTR_CLASS 130 -#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 131 -#define LOAD_ATTR_INSTANCE_VALUE 132 -#define LOAD_ATTR_METHOD_LAZY_DICT 133 -#define LOAD_ATTR_METHOD_NO_DICT 134 -#define LOAD_ATTR_METHOD_WITH_VALUES 135 -#define LOAD_ATTR_MODULE 136 -#define LOAD_ATTR_NONDESCRIPTOR_NO_DICT 137 -#define LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 138 -#define LOAD_ATTR_PROPERTY 139 -#define LOAD_ATTR_SLOT 140 -#define LOAD_ATTR_WITH_HINT 141 -#define LOAD_CONST 142 -#define LOAD_DEREF 143 -#define LOAD_FAST 144 -#define LOAD_FAST_AND_CLEAR 145 -#define LOAD_FAST_CHECK 146 -#define LOAD_FAST_LOAD_FAST 147 -#define LOAD_FROM_DICT_OR_DEREF 148 -#define LOAD_FROM_DICT_OR_GLOBALS 149 -#define LOAD_GLOBAL 150 -#define LOAD_GLOBAL_BUILTIN 151 -#define LOAD_GLOBAL_MODULE 152 -#define LOAD_NAME 153 -#define LOAD_SUPER_ATTR 154 -#define LOAD_SUPER_ATTR_ATTR 155 -#define LOAD_SUPER_ATTR_METHOD 156 -#define MAKE_CELL 157 -#define MAP_ADD 158 -#define MATCH_CLASS 159 -#define POP_JUMP_IF_FALSE 160 -#define POP_JUMP_IF_NONE 161 -#define POP_JUMP_IF_NOT_NONE 162 -#define POP_JUMP_IF_TRUE 163 -#define RAISE_VARARGS 164 -#define RERAISE 165 +#define RESUME_CHECK 47 +#define RETURN_GENERATOR 48 +#define RETURN_VALUE 49 +#define SETUP_ANNOTATIONS 50 +#define STORE_ATTR_INSTANCE_VALUE 51 +#define STORE_ATTR_SLOT 52 +#define STORE_SLICE 53 +#define STORE_SUBSCR 54 +#define STORE_SUBSCR_DICT 55 +#define STORE_SUBSCR_LIST_INT 56 +#define TO_BOOL 57 +#define TO_BOOL_ALWAYS_TRUE 58 +#define TO_BOOL_BOOL 59 +#define TO_BOOL_INT 60 +#define TO_BOOL_LIST 61 +#define TO_BOOL_NONE 62 +#define TO_BOOL_STR 63 +#define UNARY_INVERT 64 +#define UNARY_NEGATIVE 65 +#define UNARY_NOT 66 +#define WITH_EXCEPT_START 67 +#define HAVE_ARGUMENT 68 +#define BINARY_OP 68 +#define BUILD_CONST_KEY_MAP 69 +#define BUILD_LIST 70 +#define BUILD_MAP 71 +#define BUILD_SET 72 +#define BUILD_SLICE 73 +#define BUILD_STRING 74 +#define BUILD_TUPLE 75 +#define CALL 76 +#define CALL_BOUND_METHOD_EXACT_ARGS 77 +#define CALL_BUILTIN_CLASS 78 +#define CALL_BUILTIN_FAST_WITH_KEYWORDS 79 +#define CALL_FUNCTION_EX 80 +#define CALL_INTRINSIC_1 81 +#define CALL_INTRINSIC_2 82 +#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 83 +#define CALL_NO_KW_ALLOC_AND_ENTER_INIT 84 +#define CALL_NO_KW_BUILTIN_FAST 85 +#define CALL_NO_KW_BUILTIN_O 86 +#define CALL_NO_KW_ISINSTANCE 87 +#define CALL_NO_KW_LEN 88 +#define CALL_NO_KW_LIST_APPEND 89 +#define CALL_NO_KW_METHOD_DESCRIPTOR_FAST 90 +#define CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS 91 +#define CALL_NO_KW_METHOD_DESCRIPTOR_O 92 +#define CALL_NO_KW_STR_1 93 +#define CALL_NO_KW_TUPLE_1 94 +#define CALL_NO_KW_TYPE_1 95 +#define CALL_PY_EXACT_ARGS 96 +#define CALL_PY_WITH_DEFAULTS 97 +#define COMPARE_OP 98 +#define COMPARE_OP_FLOAT 99 +#define COMPARE_OP_INT 100 +#define COMPARE_OP_STR 101 +#define CONTAINS_OP 102 +#define CONVERT_VALUE 103 +#define COPY 104 +#define COPY_FREE_VARS 105 +#define DELETE_ATTR 106 +#define DELETE_DEREF 107 +#define DELETE_FAST 108 +#define DELETE_GLOBAL 109 +#define DELETE_NAME 110 +#define DICT_MERGE 111 +#define DICT_UPDATE 112 +#define ENTER_EXECUTOR 113 +#define EXTENDED_ARG 114 +#define FOR_ITER 115 +#define FOR_ITER_GEN 116 +#define FOR_ITER_LIST 117 +#define FOR_ITER_RANGE 118 +#define FOR_ITER_TUPLE 119 +#define GET_AWAITABLE 120 +#define IMPORT_FROM 121 +#define IMPORT_NAME 122 +#define IS_OP 123 +#define JUMP_BACKWARD 124 +#define JUMP_BACKWARD_NO_INTERRUPT 125 +#define JUMP_FORWARD 126 +#define KW_NAMES 127 +#define LIST_APPEND 128 +#define LIST_EXTEND 129 +#define LOAD_ATTR 130 +#define LOAD_ATTR_CLASS 131 +#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 132 +#define LOAD_ATTR_INSTANCE_VALUE 133 +#define LOAD_ATTR_METHOD_LAZY_DICT 134 +#define LOAD_ATTR_METHOD_NO_DICT 135 +#define LOAD_ATTR_METHOD_WITH_VALUES 136 +#define LOAD_ATTR_MODULE 137 +#define LOAD_ATTR_NONDESCRIPTOR_NO_DICT 138 +#define LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 139 +#define LOAD_ATTR_PROPERTY 140 +#define LOAD_ATTR_SLOT 141 +#define LOAD_ATTR_WITH_HINT 142 +#define LOAD_CONST 143 +#define LOAD_DEREF 144 +#define LOAD_FAST 145 +#define LOAD_FAST_AND_CLEAR 146 +#define LOAD_FAST_CHECK 147 +#define LOAD_FAST_LOAD_FAST 148 +#define LOAD_FROM_DICT_OR_DEREF 149 +#define LOAD_FROM_DICT_OR_GLOBALS 150 +#define LOAD_GLOBAL 151 +#define LOAD_GLOBAL_BUILTIN 152 +#define LOAD_GLOBAL_MODULE 153 +#define LOAD_NAME 154 +#define LOAD_SUPER_ATTR 155 +#define LOAD_SUPER_ATTR_ATTR 156 +#define LOAD_SUPER_ATTR_METHOD 157 +#define MAKE_CELL 158 +#define MAP_ADD 159 +#define MATCH_CLASS 160 +#define POP_JUMP_IF_FALSE 161 +#define POP_JUMP_IF_NONE 162 +#define POP_JUMP_IF_NOT_NONE 163 +#define POP_JUMP_IF_TRUE 164 +#define RAISE_VARARGS 165 #define RESUME 166 -#define RETURN_CONST 167 -#define SEND 168 -#define SEND_GEN 169 -#define SET_ADD 170 -#define SET_FUNCTION_ATTRIBUTE 171 -#define SET_UPDATE 172 -#define STORE_ATTR 173 -#define STORE_ATTR_WITH_HINT 174 -#define STORE_DEREF 175 -#define STORE_FAST 176 -#define STORE_FAST_LOAD_FAST 177 -#define STORE_FAST_STORE_FAST 178 -#define STORE_GLOBAL 179 -#define STORE_NAME 180 -#define SWAP 181 -#define UNPACK_EX 182 -#define UNPACK_SEQUENCE 183 -#define UNPACK_SEQUENCE_LIST 184 -#define UNPACK_SEQUENCE_TUPLE 185 -#define UNPACK_SEQUENCE_TWO_TUPLE 186 -#define YIELD_VALUE 187 +#define RERAISE 167 +#define RETURN_CONST 168 +#define SEND 169 +#define SEND_GEN 170 +#define SET_ADD 171 +#define SET_FUNCTION_ATTRIBUTE 172 +#define SET_UPDATE 173 +#define STORE_ATTR 174 +#define STORE_ATTR_WITH_HINT 175 +#define STORE_DEREF 176 +#define STORE_FAST 177 +#define STORE_FAST_LOAD_FAST 178 +#define STORE_FAST_STORE_FAST 179 +#define STORE_GLOBAL 180 +#define STORE_NAME 181 +#define SWAP 182 +#define UNPACK_EX 183 +#define UNPACK_SEQUENCE 184 +#define UNPACK_SEQUENCE_LIST 185 +#define UNPACK_SEQUENCE_TUPLE 186 +#define UNPACK_SEQUENCE_TWO_TUPLE 187 +#define YIELD_VALUE 188 #define MIN_INSTRUMENTED_OPCODE 237 #define INSTRUMENTED_RESUME 237 #define INSTRUMENTED_END_FOR 238 diff --git a/Lib/_opcode_metadata.py b/Lib/_opcode_metadata.py index b02aa771c347e7..20975ffb4c5321 100644 --- a/Lib/_opcode_metadata.py +++ b/Lib/_opcode_metadata.py @@ -4,6 +4,9 @@ # Do not edit! _specializations = { + "RESUME": [ + "RESUME_CHECK", + ], "TO_BOOL": [ "TO_BOOL_ALWAYS_TRUE", "TO_BOOL_BOOL", @@ -117,62 +120,63 @@ 'BINARY_SUBSCR_LIST_INT': 15, 'BINARY_SUBSCR_STR_INT': 16, 'BINARY_SUBSCR_TUPLE_INT': 18, - 'STORE_ATTR_INSTANCE_VALUE': 50, - 'STORE_ATTR_SLOT': 51, - 'STORE_SUBSCR_DICT': 54, - 'STORE_SUBSCR_LIST_INT': 55, - 'TO_BOOL_ALWAYS_TRUE': 57, - 'TO_BOOL_BOOL': 58, - 'TO_BOOL_INT': 59, - 'TO_BOOL_LIST': 60, - 'TO_BOOL_NONE': 61, - 'TO_BOOL_STR': 62, - 'CALL_BOUND_METHOD_EXACT_ARGS': 76, - 'CALL_BUILTIN_CLASS': 77, - 'CALL_BUILTIN_FAST_WITH_KEYWORDS': 78, - 'CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS': 82, - 'CALL_NO_KW_ALLOC_AND_ENTER_INIT': 83, - 'CALL_NO_KW_BUILTIN_FAST': 84, - 'CALL_NO_KW_BUILTIN_O': 85, - 'CALL_NO_KW_ISINSTANCE': 86, - 'CALL_NO_KW_LEN': 87, - 'CALL_NO_KW_LIST_APPEND': 88, - 'CALL_NO_KW_METHOD_DESCRIPTOR_FAST': 89, - 'CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS': 90, - 'CALL_NO_KW_METHOD_DESCRIPTOR_O': 91, - 'CALL_NO_KW_STR_1': 92, - 'CALL_NO_KW_TUPLE_1': 93, - 'CALL_NO_KW_TYPE_1': 94, - 'CALL_PY_EXACT_ARGS': 95, - 'CALL_PY_WITH_DEFAULTS': 96, - 'COMPARE_OP_FLOAT': 98, - 'COMPARE_OP_INT': 99, - 'COMPARE_OP_STR': 100, - 'FOR_ITER_GEN': 115, - 'FOR_ITER_LIST': 116, - 'FOR_ITER_RANGE': 117, - 'FOR_ITER_TUPLE': 118, - 'LOAD_ATTR_CLASS': 130, - 'LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN': 131, - 'LOAD_ATTR_INSTANCE_VALUE': 132, - 'LOAD_ATTR_METHOD_LAZY_DICT': 133, - 'LOAD_ATTR_METHOD_NO_DICT': 134, - 'LOAD_ATTR_METHOD_WITH_VALUES': 135, - 'LOAD_ATTR_MODULE': 136, - 'LOAD_ATTR_NONDESCRIPTOR_NO_DICT': 137, - 'LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES': 138, - 'LOAD_ATTR_PROPERTY': 139, - 'LOAD_ATTR_SLOT': 140, - 'LOAD_ATTR_WITH_HINT': 141, - 'LOAD_GLOBAL_BUILTIN': 151, - 'LOAD_GLOBAL_MODULE': 152, - 'LOAD_SUPER_ATTR_ATTR': 155, - 'LOAD_SUPER_ATTR_METHOD': 156, - 'SEND_GEN': 169, - 'STORE_ATTR_WITH_HINT': 174, - 'UNPACK_SEQUENCE_LIST': 184, - 'UNPACK_SEQUENCE_TUPLE': 185, - 'UNPACK_SEQUENCE_TWO_TUPLE': 186, + 'RESUME_CHECK': 47, + 'STORE_ATTR_INSTANCE_VALUE': 51, + 'STORE_ATTR_SLOT': 52, + 'STORE_SUBSCR_DICT': 55, + 'STORE_SUBSCR_LIST_INT': 56, + 'TO_BOOL_ALWAYS_TRUE': 58, + 'TO_BOOL_BOOL': 59, + 'TO_BOOL_INT': 60, + 'TO_BOOL_LIST': 61, + 'TO_BOOL_NONE': 62, + 'TO_BOOL_STR': 63, + 'CALL_BOUND_METHOD_EXACT_ARGS': 77, + 'CALL_BUILTIN_CLASS': 78, + 'CALL_BUILTIN_FAST_WITH_KEYWORDS': 79, + 'CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS': 83, + 'CALL_NO_KW_ALLOC_AND_ENTER_INIT': 84, + 'CALL_NO_KW_BUILTIN_FAST': 85, + 'CALL_NO_KW_BUILTIN_O': 86, + 'CALL_NO_KW_ISINSTANCE': 87, + 'CALL_NO_KW_LEN': 88, + 'CALL_NO_KW_LIST_APPEND': 89, + 'CALL_NO_KW_METHOD_DESCRIPTOR_FAST': 90, + 'CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS': 91, + 'CALL_NO_KW_METHOD_DESCRIPTOR_O': 92, + 'CALL_NO_KW_STR_1': 93, + 'CALL_NO_KW_TUPLE_1': 94, + 'CALL_NO_KW_TYPE_1': 95, + 'CALL_PY_EXACT_ARGS': 96, + 'CALL_PY_WITH_DEFAULTS': 97, + 'COMPARE_OP_FLOAT': 99, + 'COMPARE_OP_INT': 100, + 'COMPARE_OP_STR': 101, + 'FOR_ITER_GEN': 116, + 'FOR_ITER_LIST': 117, + 'FOR_ITER_RANGE': 118, + 'FOR_ITER_TUPLE': 119, + 'LOAD_ATTR_CLASS': 131, + 'LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN': 132, + 'LOAD_ATTR_INSTANCE_VALUE': 133, + 'LOAD_ATTR_METHOD_LAZY_DICT': 134, + 'LOAD_ATTR_METHOD_NO_DICT': 135, + 'LOAD_ATTR_METHOD_WITH_VALUES': 136, + 'LOAD_ATTR_MODULE': 137, + 'LOAD_ATTR_NONDESCRIPTOR_NO_DICT': 138, + 'LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES': 139, + 'LOAD_ATTR_PROPERTY': 140, + 'LOAD_ATTR_SLOT': 141, + 'LOAD_ATTR_WITH_HINT': 142, + 'LOAD_GLOBAL_BUILTIN': 152, + 'LOAD_GLOBAL_MODULE': 153, + 'LOAD_SUPER_ATTR_ATTR': 156, + 'LOAD_SUPER_ATTR_METHOD': 157, + 'SEND_GEN': 170, + 'STORE_ATTR_WITH_HINT': 175, + 'UNPACK_SEQUENCE_LIST': 185, + 'UNPACK_SEQUENCE_TUPLE': 186, + 'UNPACK_SEQUENCE_TWO_TUPLE': 187, } opmap = { @@ -210,91 +214,91 @@ 'POP_TOP': 44, 'PUSH_EXC_INFO': 45, 'PUSH_NULL': 46, - 'RETURN_GENERATOR': 47, - 'RETURN_VALUE': 48, - 'SETUP_ANNOTATIONS': 49, - 'STORE_SLICE': 52, - 'STORE_SUBSCR': 53, - 'TO_BOOL': 56, - 'UNARY_INVERT': 63, - 'UNARY_NEGATIVE': 64, - 'UNARY_NOT': 65, - 'WITH_EXCEPT_START': 66, - 'BINARY_OP': 67, - 'BUILD_CONST_KEY_MAP': 68, - 'BUILD_LIST': 69, - 'BUILD_MAP': 70, - 'BUILD_SET': 71, - 'BUILD_SLICE': 72, - 'BUILD_STRING': 73, - 'BUILD_TUPLE': 74, - 'CALL': 75, - 'CALL_FUNCTION_EX': 79, - 'CALL_INTRINSIC_1': 80, - 'CALL_INTRINSIC_2': 81, - 'COMPARE_OP': 97, - 'CONTAINS_OP': 101, - 'CONVERT_VALUE': 102, - 'COPY': 103, - 'COPY_FREE_VARS': 104, - 'DELETE_ATTR': 105, - 'DELETE_DEREF': 106, - 'DELETE_FAST': 107, - 'DELETE_GLOBAL': 108, - 'DELETE_NAME': 109, - 'DICT_MERGE': 110, - 'DICT_UPDATE': 111, - 'ENTER_EXECUTOR': 112, - 'EXTENDED_ARG': 113, - 'FOR_ITER': 114, - 'GET_AWAITABLE': 119, - 'IMPORT_FROM': 120, - 'IMPORT_NAME': 121, - 'IS_OP': 122, - 'JUMP_BACKWARD': 123, - 'JUMP_BACKWARD_NO_INTERRUPT': 124, - 'JUMP_FORWARD': 125, - 'KW_NAMES': 126, - 'LIST_APPEND': 127, - 'LIST_EXTEND': 128, - 'LOAD_ATTR': 129, - 'LOAD_CONST': 142, - 'LOAD_DEREF': 143, - 'LOAD_FAST': 144, - 'LOAD_FAST_AND_CLEAR': 145, - 'LOAD_FAST_CHECK': 146, - 'LOAD_FAST_LOAD_FAST': 147, - 'LOAD_FROM_DICT_OR_DEREF': 148, - 'LOAD_FROM_DICT_OR_GLOBALS': 149, - 'LOAD_GLOBAL': 150, - 'LOAD_NAME': 153, - 'LOAD_SUPER_ATTR': 154, - 'MAKE_CELL': 157, - 'MAP_ADD': 158, - 'MATCH_CLASS': 159, - 'POP_JUMP_IF_FALSE': 160, - 'POP_JUMP_IF_NONE': 161, - 'POP_JUMP_IF_NOT_NONE': 162, - 'POP_JUMP_IF_TRUE': 163, - 'RAISE_VARARGS': 164, - 'RERAISE': 165, + 'RETURN_GENERATOR': 48, + 'RETURN_VALUE': 49, + 'SETUP_ANNOTATIONS': 50, + 'STORE_SLICE': 53, + 'STORE_SUBSCR': 54, + 'TO_BOOL': 57, + 'UNARY_INVERT': 64, + 'UNARY_NEGATIVE': 65, + 'UNARY_NOT': 66, + 'WITH_EXCEPT_START': 67, + 'BINARY_OP': 68, + 'BUILD_CONST_KEY_MAP': 69, + 'BUILD_LIST': 70, + 'BUILD_MAP': 71, + 'BUILD_SET': 72, + 'BUILD_SLICE': 73, + 'BUILD_STRING': 74, + 'BUILD_TUPLE': 75, + 'CALL': 76, + 'CALL_FUNCTION_EX': 80, + 'CALL_INTRINSIC_1': 81, + 'CALL_INTRINSIC_2': 82, + 'COMPARE_OP': 98, + 'CONTAINS_OP': 102, + 'CONVERT_VALUE': 103, + 'COPY': 104, + 'COPY_FREE_VARS': 105, + 'DELETE_ATTR': 106, + 'DELETE_DEREF': 107, + 'DELETE_FAST': 108, + 'DELETE_GLOBAL': 109, + 'DELETE_NAME': 110, + 'DICT_MERGE': 111, + 'DICT_UPDATE': 112, + 'ENTER_EXECUTOR': 113, + 'EXTENDED_ARG': 114, + 'FOR_ITER': 115, + 'GET_AWAITABLE': 120, + 'IMPORT_FROM': 121, + 'IMPORT_NAME': 122, + 'IS_OP': 123, + 'JUMP_BACKWARD': 124, + 'JUMP_BACKWARD_NO_INTERRUPT': 125, + 'JUMP_FORWARD': 126, + 'KW_NAMES': 127, + 'LIST_APPEND': 128, + 'LIST_EXTEND': 129, + 'LOAD_ATTR': 130, + 'LOAD_CONST': 143, + 'LOAD_DEREF': 144, + 'LOAD_FAST': 145, + 'LOAD_FAST_AND_CLEAR': 146, + 'LOAD_FAST_CHECK': 147, + 'LOAD_FAST_LOAD_FAST': 148, + 'LOAD_FROM_DICT_OR_DEREF': 149, + 'LOAD_FROM_DICT_OR_GLOBALS': 150, + 'LOAD_GLOBAL': 151, + 'LOAD_NAME': 154, + 'LOAD_SUPER_ATTR': 155, + 'MAKE_CELL': 158, + 'MAP_ADD': 159, + 'MATCH_CLASS': 160, + 'POP_JUMP_IF_FALSE': 161, + 'POP_JUMP_IF_NONE': 162, + 'POP_JUMP_IF_NOT_NONE': 163, + 'POP_JUMP_IF_TRUE': 164, + 'RAISE_VARARGS': 165, 'RESUME': 166, - 'RETURN_CONST': 167, - 'SEND': 168, - 'SET_ADD': 170, - 'SET_FUNCTION_ATTRIBUTE': 171, - 'SET_UPDATE': 172, - 'STORE_ATTR': 173, - 'STORE_DEREF': 175, - 'STORE_FAST': 176, - 'STORE_FAST_LOAD_FAST': 177, - 'STORE_FAST_STORE_FAST': 178, - 'STORE_GLOBAL': 179, - 'STORE_NAME': 180, - 'SWAP': 181, - 'UNPACK_EX': 182, - 'UNPACK_SEQUENCE': 183, - 'YIELD_VALUE': 187, + 'RERAISE': 167, + 'RETURN_CONST': 168, + 'SEND': 169, + 'SET_ADD': 171, + 'SET_FUNCTION_ATTRIBUTE': 172, + 'SET_UPDATE': 173, + 'STORE_ATTR': 174, + 'STORE_DEREF': 176, + 'STORE_FAST': 177, + 'STORE_FAST_LOAD_FAST': 178, + 'STORE_FAST_STORE_FAST': 179, + 'STORE_GLOBAL': 180, + 'STORE_NAME': 181, + 'SWAP': 182, + 'UNPACK_EX': 183, + 'UNPACK_SEQUENCE': 184, + 'YIELD_VALUE': 188, 'INSTRUMENTED_RESUME': 237, 'INSTRUMENTED_END_FOR': 238, 'INSTRUMENTED_END_SEND': 239, @@ -327,4 +331,4 @@ 'STORE_FAST_MAYBE_NULL': 267, } MIN_INSTRUMENTED_OPCODE = 237 -HAVE_ARGUMENT = 67 +HAVE_ARGUMENT = 68 diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index dacd6f6da2c5a9..eae1918efc3506 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -788,7 +788,7 @@ def load_test(x, y=0): return a, b dis_load_test_quickened_code = """\ -%3d 0 RESUME 0 +%3d 0 RESUME_CHECK 0 %3d 2 LOAD_FAST_LOAD_FAST 1 (x, y) 4 STORE_FAST_STORE_FAST 50 (b, a) @@ -805,7 +805,7 @@ def loop_test(): load_test(i) dis_loop_test_quickened_code = """\ -%3d RESUME 0 +%3d RESUME_CHECK 0 %3d BUILD_LIST 0 LOAD_CONST 1 ((1, 2, 3)) @@ -1197,7 +1197,7 @@ def test_super_instructions(self): @requires_specialization def test_binary_specialize(self): binary_op_quicken = """\ - 0 0 RESUME 0 + 0 0 RESUME_CHECK 0 1 2 LOAD_NAME 0 (a) 4 LOAD_NAME 1 (b) @@ -1215,7 +1215,7 @@ def test_binary_specialize(self): self.do_disassembly_compare(got, binary_op_quicken % "BINARY_OP_ADD_UNICODE 0 (+)", True) binary_subscr_quicken = """\ - 0 0 RESUME 0 + 0 0 RESUME_CHECK 0 1 2 LOAD_NAME 0 (a) 4 LOAD_CONST 0 (0) @@ -1236,7 +1236,7 @@ def test_binary_specialize(self): @requires_specialization def test_load_attr_specialize(self): load_attr_quicken = """\ - 0 0 RESUME 0 + 0 0 RESUME_CHECK 0 1 2 LOAD_CONST 0 ('a') 4 LOAD_ATTR_SLOT 0 (__class__) @@ -1251,7 +1251,7 @@ def test_load_attr_specialize(self): @requires_specialization def test_call_specialize(self): call_quicken = """\ - 0 RESUME 0 + 0 RESUME_CHECK 0 1 LOAD_NAME 0 (str) PUSH_NULL @@ -1640,197 +1640,197 @@ def _prepare_test_cases(): Instruction = dis.Instruction expected_opinfo_outer = [ - Instruction(opname='MAKE_CELL', opcode=157, arg=0, argval='a', argrepr='a', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='MAKE_CELL', opcode=157, arg=1, argval='b', argrepr='b', offset=2, start_offset=2, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='MAKE_CELL', opcode=158, arg=0, argval='a', argrepr='a', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='MAKE_CELL', opcode=158, arg=1, argval='b', argrepr='b', offset=2, start_offset=2, starts_line=False, line_number=None, is_jump_target=False, positions=None), Instruction(opname='RESUME', opcode=166, arg=0, argval=0, argrepr='', offset=4, start_offset=4, starts_line=True, line_number=1, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=5, argval=(3, 4), argrepr='(3, 4)', offset=6, start_offset=6, starts_line=True, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=0, argval='a', argrepr='a', offset=8, start_offset=8, starts_line=False, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=1, argval='b', argrepr='b', offset=10, start_offset=10, starts_line=False, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='BUILD_TUPLE', opcode=74, arg=2, argval=2, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=1, argval=code_object_f, argrepr=repr(code_object_f), offset=14, start_offset=14, starts_line=False, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=5, argval=(3, 4), argrepr='(3, 4)', offset=6, start_offset=6, starts_line=True, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='a', argrepr='a', offset=8, start_offset=8, starts_line=False, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=1, argval='b', argrepr='b', offset=10, start_offset=10, starts_line=False, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='BUILD_TUPLE', opcode=75, arg=2, argval=2, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=1, argval=code_object_f, argrepr=repr(code_object_f), offset=14, start_offset=14, starts_line=False, line_number=2, is_jump_target=False, positions=None), Instruction(opname='MAKE_FUNCTION', opcode=38, arg=None, argval=None, argrepr='', offset=16, start_offset=16, starts_line=False, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=171, arg=8, argval=8, argrepr='closure', offset=18, start_offset=18, starts_line=False, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=171, arg=1, argval=1, argrepr='defaults', offset=20, start_offset=20, starts_line=False, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=176, arg=2, argval='f', argrepr='f', offset=22, start_offset=22, starts_line=False, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=150, arg=1, argval='print', argrepr='print + NULL', offset=24, start_offset=24, starts_line=True, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=143, arg=0, argval='a', argrepr='a', offset=34, start_offset=34, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=143, arg=1, argval='b', argrepr='b', offset=36, start_offset=36, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=2, argval='', argrepr="''", offset=38, start_offset=38, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=3, argval=1, argrepr='1', offset=40, start_offset=40, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='BUILD_LIST', opcode=69, arg=0, argval=0, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='BUILD_MAP', opcode=70, arg=0, argval=0, argrepr='', offset=44, start_offset=44, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=4, argval='Hello world!', argrepr="'Hello world!'", offset=46, start_offset=46, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=75, arg=7, argval=7, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=172, arg=8, argval=8, argrepr='closure', offset=18, start_offset=18, starts_line=False, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=172, arg=1, argval=1, argrepr='defaults', offset=20, start_offset=20, starts_line=False, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=177, arg=2, argval='f', argrepr='f', offset=22, start_offset=22, starts_line=False, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=1, argval='print', argrepr='print + NULL', offset=24, start_offset=24, starts_line=True, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=144, arg=0, argval='a', argrepr='a', offset=34, start_offset=34, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=144, arg=1, argval='b', argrepr='b', offset=36, start_offset=36, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=2, argval='', argrepr="''", offset=38, start_offset=38, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=3, argval=1, argrepr='1', offset=40, start_offset=40, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='BUILD_LIST', opcode=70, arg=0, argval=0, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='BUILD_MAP', opcode=71, arg=0, argval=0, argrepr='', offset=44, start_offset=44, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=4, argval='Hello world!', argrepr="'Hello world!'", offset=46, start_offset=46, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=7, argval=7, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=7, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=2, argval='f', argrepr='f', offset=58, start_offset=58, starts_line=True, line_number=8, is_jump_target=False, positions=None), - Instruction(opname='RETURN_VALUE', opcode=48, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=8, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=2, argval='f', argrepr='f', offset=58, start_offset=58, starts_line=True, line_number=8, is_jump_target=False, positions=None), + Instruction(opname='RETURN_VALUE', opcode=49, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=8, is_jump_target=False, positions=None), ] expected_opinfo_f = [ - Instruction(opname='COPY_FREE_VARS', opcode=104, arg=2, argval=2, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='MAKE_CELL', opcode=157, arg=0, argval='c', argrepr='c', offset=2, start_offset=2, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='MAKE_CELL', opcode=157, arg=1, argval='d', argrepr='d', offset=4, start_offset=4, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='COPY_FREE_VARS', opcode=105, arg=2, argval=2, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='MAKE_CELL', opcode=158, arg=0, argval='c', argrepr='c', offset=2, start_offset=2, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='MAKE_CELL', opcode=158, arg=1, argval='d', argrepr='d', offset=4, start_offset=4, starts_line=False, line_number=None, is_jump_target=False, positions=None), Instruction(opname='RESUME', opcode=166, arg=0, argval=0, argrepr='', offset=6, start_offset=6, starts_line=True, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=2, argval=(5, 6), argrepr='(5, 6)', offset=8, start_offset=8, starts_line=True, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=3, argval='a', argrepr='a', offset=10, start_offset=10, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=4, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=0, argval='c', argrepr='c', offset=14, start_offset=14, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=1, argval='d', argrepr='d', offset=16, start_offset=16, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='BUILD_TUPLE', opcode=74, arg=4, argval=4, argrepr='', offset=18, start_offset=18, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=1, argval=code_object_inner, argrepr=repr(code_object_inner), offset=20, start_offset=20, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=2, argval=(5, 6), argrepr='(5, 6)', offset=8, start_offset=8, starts_line=True, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=3, argval='a', argrepr='a', offset=10, start_offset=10, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=4, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='c', argrepr='c', offset=14, start_offset=14, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=1, argval='d', argrepr='d', offset=16, start_offset=16, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='BUILD_TUPLE', opcode=75, arg=4, argval=4, argrepr='', offset=18, start_offset=18, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=1, argval=code_object_inner, argrepr=repr(code_object_inner), offset=20, start_offset=20, starts_line=False, line_number=3, is_jump_target=False, positions=None), Instruction(opname='MAKE_FUNCTION', opcode=38, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=171, arg=8, argval=8, argrepr='closure', offset=24, start_offset=24, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=171, arg=1, argval=1, argrepr='defaults', offset=26, start_offset=26, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=176, arg=2, argval='inner', argrepr='inner', offset=28, start_offset=28, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=150, arg=1, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=143, arg=3, argval='a', argrepr='a', offset=40, start_offset=40, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=143, arg=4, argval='b', argrepr='b', offset=42, start_offset=42, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=143, arg=0, argval='c', argrepr='c', offset=44, start_offset=44, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=143, arg=1, argval='d', argrepr='d', offset=46, start_offset=46, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=75, arg=4, argval=4, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=172, arg=8, argval=8, argrepr='closure', offset=24, start_offset=24, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=172, arg=1, argval=1, argrepr='defaults', offset=26, start_offset=26, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=177, arg=2, argval='inner', argrepr='inner', offset=28, start_offset=28, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=1, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=144, arg=3, argval='a', argrepr='a', offset=40, start_offset=40, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=144, arg=4, argval='b', argrepr='b', offset=42, start_offset=42, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=144, arg=0, argval='c', argrepr='c', offset=44, start_offset=44, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=144, arg=1, argval='d', argrepr='d', offset=46, start_offset=46, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=4, argval=4, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=5, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=2, argval='inner', argrepr='inner', offset=58, start_offset=58, starts_line=True, line_number=6, is_jump_target=False, positions=None), - Instruction(opname='RETURN_VALUE', opcode=48, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=6, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=2, argval='inner', argrepr='inner', offset=58, start_offset=58, starts_line=True, line_number=6, is_jump_target=False, positions=None), + Instruction(opname='RETURN_VALUE', opcode=49, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=6, is_jump_target=False, positions=None), ] expected_opinfo_inner = [ - Instruction(opname='COPY_FREE_VARS', opcode=104, arg=4, argval=4, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='COPY_FREE_VARS', opcode=105, arg=4, argval=4, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), Instruction(opname='RESUME', opcode=166, arg=0, argval=0, argrepr='', offset=2, start_offset=2, starts_line=True, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=150, arg=1, argval='print', argrepr='print + NULL', offset=4, start_offset=4, starts_line=True, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=143, arg=2, argval='a', argrepr='a', offset=14, start_offset=14, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=143, arg=3, argval='b', argrepr='b', offset=16, start_offset=16, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=143, arg=4, argval='c', argrepr='c', offset=18, start_offset=18, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=143, arg=5, argval='d', argrepr='d', offset=20, start_offset=20, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST_LOAD_FAST', opcode=147, arg=1, argval=('e', 'f'), argrepr='e, f', offset=22, start_offset=22, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=75, arg=6, argval=6, argrepr='', offset=24, start_offset=24, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=1, argval='print', argrepr='print + NULL', offset=4, start_offset=4, starts_line=True, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=144, arg=2, argval='a', argrepr='a', offset=14, start_offset=14, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=144, arg=3, argval='b', argrepr='b', offset=16, start_offset=16, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=144, arg=4, argval='c', argrepr='c', offset=18, start_offset=18, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=144, arg=5, argval='d', argrepr='d', offset=20, start_offset=20, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST_LOAD_FAST', opcode=148, arg=1, argval=('e', 'f'), argrepr='e, f', offset=22, start_offset=22, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=6, argval=6, argrepr='', offset=24, start_offset=24, starts_line=False, line_number=4, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=32, start_offset=32, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='RETURN_CONST', opcode=167, arg=0, argval=None, argrepr='None', offset=34, start_offset=34, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='RETURN_CONST', opcode=168, arg=0, argval=None, argrepr='None', offset=34, start_offset=34, starts_line=False, line_number=4, is_jump_target=False, positions=None), ] expected_opinfo_jumpy = [ Instruction(opname='RESUME', opcode=166, arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=1, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=150, arg=1, argval='range', argrepr='range + NULL', offset=2, start_offset=2, starts_line=True, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=1, argval=10, argrepr='10', offset=12, start_offset=12, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=75, arg=1, argval=1, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=1, argval='range', argrepr='range + NULL', offset=2, start_offset=2, starts_line=True, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=1, argval=10, argrepr='10', offset=12, start_offset=12, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=3, is_jump_target=False, positions=None), Instruction(opname='GET_ITER', opcode=31, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='FOR_ITER', opcode=114, arg=28, argval=84, argrepr='to 84', offset=24, start_offset=24, starts_line=False, line_number=3, is_jump_target=True, positions=None), - Instruction(opname='STORE_FAST', opcode=176, arg=0, argval='i', argrepr='i', offset=28, start_offset=28, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=150, arg=3, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=0, argval='i', argrepr='i', offset=40, start_offset=40, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=75, arg=1, argval=1, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='FOR_ITER', opcode=115, arg=28, argval=84, argrepr='to 84', offset=24, start_offset=24, starts_line=False, line_number=3, is_jump_target=True, positions=None), + Instruction(opname='STORE_FAST', opcode=177, arg=0, argval='i', argrepr='i', offset=28, start_offset=28, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=40, start_offset=40, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=4, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=50, start_offset=50, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=0, argval='i', argrepr='i', offset=52, start_offset=52, starts_line=True, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=2, argval=4, argrepr='4', offset=54, start_offset=54, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=97, arg=18, argval='<', argrepr='bool(<)', offset=56, start_offset=56, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=160, arg=2, argval=66, argrepr='to 66', offset=60, start_offset=60, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=123, arg=21, argval=24, argrepr='to 24', offset=62, start_offset=62, starts_line=True, line_number=6, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=0, argval='i', argrepr='i', offset=66, start_offset=66, starts_line=True, line_number=7, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=3, argval=6, argrepr='6', offset=68, start_offset=68, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=97, arg=148, argval='>', argrepr='bool(>)', offset=70, start_offset=70, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_TRUE', opcode=163, arg=2, argval=80, argrepr='to 80', offset=74, start_offset=74, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=123, arg=28, argval=24, argrepr='to 24', offset=76, start_offset=76, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=52, start_offset=52, starts_line=True, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=2, argval=4, argrepr='4', offset=54, start_offset=54, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=98, arg=18, argval='<', argrepr='bool(<)', offset=56, start_offset=56, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=2, argval=66, argrepr='to 66', offset=60, start_offset=60, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=124, arg=21, argval=24, argrepr='to 24', offset=62, start_offset=62, starts_line=True, line_number=6, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=66, start_offset=66, starts_line=True, line_number=7, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=3, argval=6, argrepr='6', offset=68, start_offset=68, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=98, arg=148, argval='>', argrepr='bool(>)', offset=70, start_offset=70, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=164, arg=2, argval=80, argrepr='to 80', offset=74, start_offset=74, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=124, arg=28, argval=24, argrepr='to 24', offset=76, start_offset=76, starts_line=False, line_number=7, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=80, start_offset=80, starts_line=True, line_number=8, is_jump_target=True, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=125, arg=12, argval=108, argrepr='to 108', offset=82, start_offset=82, starts_line=False, line_number=8, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=126, arg=12, argval=108, argrepr='to 108', offset=82, start_offset=82, starts_line=False, line_number=8, is_jump_target=False, positions=None), Instruction(opname='END_FOR', opcode=24, arg=None, argval=None, argrepr='', offset=84, start_offset=84, starts_line=True, line_number=3, is_jump_target=True, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=150, arg=3, argval='print', argrepr='print + NULL', offset=86, start_offset=86, starts_line=True, line_number=10, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=96, start_offset=96, starts_line=False, line_number=10, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=75, arg=1, argval=1, argrepr='', offset=98, start_offset=98, starts_line=False, line_number=10, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=86, start_offset=86, starts_line=True, line_number=10, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=96, start_offset=96, starts_line=False, line_number=10, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=98, start_offset=98, starts_line=False, line_number=10, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=106, start_offset=106, starts_line=False, line_number=10, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST_CHECK', opcode=146, arg=0, argval='i', argrepr='i', offset=108, start_offset=108, starts_line=True, line_number=11, is_jump_target=True, positions=None), - Instruction(opname='TO_BOOL', opcode=56, arg=None, argval=None, argrepr='', offset=110, start_offset=110, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=160, arg=37, argval=194, argrepr='to 194', offset=118, start_offset=118, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=150, arg=3, argval='print', argrepr='print + NULL', offset=120, start_offset=120, starts_line=True, line_number=12, is_jump_target=True, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=0, argval='i', argrepr='i', offset=130, start_offset=130, starts_line=False, line_number=12, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=75, arg=1, argval=1, argrepr='', offset=132, start_offset=132, starts_line=False, line_number=12, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST_CHECK', opcode=147, arg=0, argval='i', argrepr='i', offset=108, start_offset=108, starts_line=True, line_number=11, is_jump_target=True, positions=None), + Instruction(opname='TO_BOOL', opcode=57, arg=None, argval=None, argrepr='', offset=110, start_offset=110, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=37, argval=194, argrepr='to 194', offset=118, start_offset=118, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=120, start_offset=120, starts_line=True, line_number=12, is_jump_target=True, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=130, start_offset=130, starts_line=False, line_number=12, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=132, start_offset=132, starts_line=False, line_number=12, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=140, start_offset=140, starts_line=False, line_number=12, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=0, argval='i', argrepr='i', offset=142, start_offset=142, starts_line=True, line_number=13, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=5, argval=1, argrepr='1', offset=144, start_offset=144, starts_line=False, line_number=13, is_jump_target=False, positions=None), - Instruction(opname='BINARY_OP', opcode=67, arg=23, argval=23, argrepr='-=', offset=146, start_offset=146, starts_line=False, line_number=13, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=176, arg=0, argval='i', argrepr='i', offset=150, start_offset=150, starts_line=False, line_number=13, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=0, argval='i', argrepr='i', offset=152, start_offset=152, starts_line=True, line_number=14, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=3, argval=6, argrepr='6', offset=154, start_offset=154, starts_line=False, line_number=14, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=97, arg=148, argval='>', argrepr='bool(>)', offset=156, start_offset=156, starts_line=False, line_number=14, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=160, arg=2, argval=166, argrepr='to 166', offset=160, start_offset=160, starts_line=False, line_number=14, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=123, arg=29, argval=108, argrepr='to 108', offset=162, start_offset=162, starts_line=True, line_number=15, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=0, argval='i', argrepr='i', offset=166, start_offset=166, starts_line=True, line_number=16, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=2, argval=4, argrepr='4', offset=168, start_offset=168, starts_line=False, line_number=16, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=97, arg=18, argval='<', argrepr='bool(<)', offset=170, start_offset=170, starts_line=False, line_number=16, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=160, arg=1, argval=178, argrepr='to 178', offset=174, start_offset=174, starts_line=False, line_number=16, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=125, arg=19, argval=216, argrepr='to 216', offset=176, start_offset=176, starts_line=True, line_number=17, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=0, argval='i', argrepr='i', offset=178, start_offset=178, starts_line=True, line_number=11, is_jump_target=True, positions=None), - Instruction(opname='TO_BOOL', opcode=56, arg=None, argval=None, argrepr='', offset=180, start_offset=180, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=160, arg=2, argval=194, argrepr='to 194', offset=188, start_offset=188, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=123, arg=37, argval=120, argrepr='to 120', offset=190, start_offset=190, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=150, arg=3, argval='print', argrepr='print + NULL', offset=194, start_offset=194, starts_line=True, line_number=19, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=204, start_offset=204, starts_line=False, line_number=19, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=75, arg=1, argval=1, argrepr='', offset=206, start_offset=206, starts_line=False, line_number=19, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=142, start_offset=142, starts_line=True, line_number=13, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=5, argval=1, argrepr='1', offset=144, start_offset=144, starts_line=False, line_number=13, is_jump_target=False, positions=None), + Instruction(opname='BINARY_OP', opcode=68, arg=23, argval=23, argrepr='-=', offset=146, start_offset=146, starts_line=False, line_number=13, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=177, arg=0, argval='i', argrepr='i', offset=150, start_offset=150, starts_line=False, line_number=13, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=152, start_offset=152, starts_line=True, line_number=14, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=3, argval=6, argrepr='6', offset=154, start_offset=154, starts_line=False, line_number=14, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=98, arg=148, argval='>', argrepr='bool(>)', offset=156, start_offset=156, starts_line=False, line_number=14, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=2, argval=166, argrepr='to 166', offset=160, start_offset=160, starts_line=False, line_number=14, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=124, arg=29, argval=108, argrepr='to 108', offset=162, start_offset=162, starts_line=True, line_number=15, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=166, start_offset=166, starts_line=True, line_number=16, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=2, argval=4, argrepr='4', offset=168, start_offset=168, starts_line=False, line_number=16, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=98, arg=18, argval='<', argrepr='bool(<)', offset=170, start_offset=170, starts_line=False, line_number=16, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=1, argval=178, argrepr='to 178', offset=174, start_offset=174, starts_line=False, line_number=16, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=126, arg=19, argval=216, argrepr='to 216', offset=176, start_offset=176, starts_line=True, line_number=17, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=178, start_offset=178, starts_line=True, line_number=11, is_jump_target=True, positions=None), + Instruction(opname='TO_BOOL', opcode=57, arg=None, argval=None, argrepr='', offset=180, start_offset=180, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=2, argval=194, argrepr='to 194', offset=188, start_offset=188, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=124, arg=37, argval=120, argrepr='to 120', offset=190, start_offset=190, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=194, start_offset=194, starts_line=True, line_number=19, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=204, start_offset=204, starts_line=False, line_number=19, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=206, start_offset=206, starts_line=False, line_number=19, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=214, start_offset=214, starts_line=False, line_number=19, is_jump_target=False, positions=None), Instruction(opname='NOP', opcode=42, arg=None, argval=None, argrepr='', offset=216, start_offset=216, starts_line=True, line_number=20, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=5, argval=1, argrepr='1', offset=218, start_offset=218, starts_line=True, line_number=21, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=7, argval=0, argrepr='0', offset=220, start_offset=220, starts_line=False, line_number=21, is_jump_target=False, positions=None), - Instruction(opname='BINARY_OP', opcode=67, arg=11, argval=11, argrepr='/', offset=222, start_offset=222, starts_line=False, line_number=21, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=5, argval=1, argrepr='1', offset=218, start_offset=218, starts_line=True, line_number=21, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=7, argval=0, argrepr='0', offset=220, start_offset=220, starts_line=False, line_number=21, is_jump_target=False, positions=None), + Instruction(opname='BINARY_OP', opcode=68, arg=11, argval=11, argrepr='/', offset=222, start_offset=222, starts_line=False, line_number=21, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=226, start_offset=226, starts_line=False, line_number=21, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=144, arg=0, argval='i', argrepr='i', offset=228, start_offset=228, starts_line=True, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=228, start_offset=228, starts_line=True, line_number=25, is_jump_target=False, positions=None), Instruction(opname='BEFORE_WITH', opcode=2, arg=None, argval=None, argrepr='', offset=230, start_offset=230, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=176, arg=1, argval='dodgy', argrepr='dodgy', offset=232, start_offset=232, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=150, arg=3, argval='print', argrepr='print + NULL', offset=234, start_offset=234, starts_line=True, line_number=26, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=8, argval='Never reach this', argrepr="'Never reach this'", offset=244, start_offset=244, starts_line=False, line_number=26, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=75, arg=1, argval=1, argrepr='', offset=246, start_offset=246, starts_line=False, line_number=26, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=177, arg=1, argval='dodgy', argrepr='dodgy', offset=232, start_offset=232, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=234, start_offset=234, starts_line=True, line_number=26, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=8, argval='Never reach this', argrepr="'Never reach this'", offset=244, start_offset=244, starts_line=False, line_number=26, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=246, start_offset=246, starts_line=False, line_number=26, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=254, start_offset=254, starts_line=False, line_number=26, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=0, argval=None, argrepr='None', offset=256, start_offset=256, starts_line=True, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=0, argval=None, argrepr='None', offset=258, start_offset=258, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=0, argval=None, argrepr='None', offset=260, start_offset=260, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=75, arg=2, argval=2, argrepr='', offset=262, start_offset=262, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=0, argval=None, argrepr='None', offset=256, start_offset=256, starts_line=True, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=0, argval=None, argrepr='None', offset=258, start_offset=258, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=0, argval=None, argrepr='None', offset=260, start_offset=260, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=2, argval=2, argrepr='', offset=262, start_offset=262, starts_line=False, line_number=25, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=270, start_offset=270, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=150, arg=3, argval='print', argrepr='print + NULL', offset=272, start_offset=272, starts_line=True, line_number=28, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=282, start_offset=282, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=75, arg=1, argval=1, argrepr='', offset=284, start_offset=284, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=272, start_offset=272, starts_line=True, line_number=28, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=282, start_offset=282, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=284, start_offset=284, starts_line=False, line_number=28, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=292, start_offset=292, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='RETURN_CONST', opcode=167, arg=0, argval=None, argrepr='None', offset=294, start_offset=294, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='RETURN_CONST', opcode=168, arg=0, argval=None, argrepr='None', offset=294, start_offset=294, starts_line=False, line_number=28, is_jump_target=False, positions=None), Instruction(opname='PUSH_EXC_INFO', opcode=45, arg=None, argval=None, argrepr='', offset=296, start_offset=296, starts_line=True, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='WITH_EXCEPT_START', opcode=66, arg=None, argval=None, argrepr='', offset=298, start_offset=298, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='TO_BOOL', opcode=56, arg=None, argval=None, argrepr='', offset=300, start_offset=300, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_TRUE', opcode=163, arg=1, argval=312, argrepr='to 312', offset=308, start_offset=308, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=165, arg=2, argval=2, argrepr='', offset=310, start_offset=310, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='WITH_EXCEPT_START', opcode=67, arg=None, argval=None, argrepr='', offset=298, start_offset=298, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='TO_BOOL', opcode=57, arg=None, argval=None, argrepr='', offset=300, start_offset=300, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=164, arg=1, argval=312, argrepr='to 312', offset=308, start_offset=308, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=167, arg=2, argval=2, argrepr='', offset=310, start_offset=310, starts_line=False, line_number=25, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=312, start_offset=312, starts_line=False, line_number=25, is_jump_target=True, positions=None), Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=314, start_offset=314, starts_line=False, line_number=25, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=316, start_offset=316, starts_line=False, line_number=25, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=318, start_offset=318, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=123, arg=26, argval=272, argrepr='to 272', offset=320, start_offset=320, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=103, arg=3, argval=3, argrepr='', offset=324, start_offset=324, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=124, arg=26, argval=272, argrepr='to 272', offset=320, start_offset=320, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=104, arg=3, argval=3, argrepr='', offset=324, start_offset=324, starts_line=True, line_number=None, is_jump_target=False, positions=None), Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=326, start_offset=326, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=165, arg=1, argval=1, argrepr='', offset=328, start_offset=328, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=167, arg=1, argval=1, argrepr='', offset=328, start_offset=328, starts_line=False, line_number=None, is_jump_target=False, positions=None), Instruction(opname='PUSH_EXC_INFO', opcode=45, arg=None, argval=None, argrepr='', offset=330, start_offset=330, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=150, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=332, start_offset=332, starts_line=True, line_number=22, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=332, start_offset=332, starts_line=True, line_number=22, is_jump_target=False, positions=None), Instruction(opname='CHECK_EXC_MATCH', opcode=20, arg=None, argval=None, argrepr='', offset=342, start_offset=342, starts_line=False, line_number=22, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=160, arg=15, argval=376, argrepr='to 376', offset=344, start_offset=344, starts_line=False, line_number=22, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=15, argval=376, argrepr='to 376', offset=344, start_offset=344, starts_line=False, line_number=22, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=346, start_offset=346, starts_line=False, line_number=22, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=150, arg=3, argval='print', argrepr='print + NULL', offset=348, start_offset=348, starts_line=True, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=358, start_offset=358, starts_line=False, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=75, arg=1, argval=1, argrepr='', offset=360, start_offset=360, starts_line=False, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=348, start_offset=348, starts_line=True, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=358, start_offset=358, starts_line=False, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=360, start_offset=360, starts_line=False, line_number=23, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=368, start_offset=368, starts_line=False, line_number=23, is_jump_target=False, positions=None), Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=370, start_offset=370, starts_line=False, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=123, arg=52, argval=272, argrepr='to 272', offset=372, start_offset=372, starts_line=False, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=165, arg=0, argval=0, argrepr='', offset=376, start_offset=376, starts_line=True, line_number=22, is_jump_target=True, positions=None), - Instruction(opname='COPY', opcode=103, arg=3, argval=3, argrepr='', offset=378, start_offset=378, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=124, arg=52, argval=272, argrepr='to 272', offset=372, start_offset=372, starts_line=False, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=167, arg=0, argval=0, argrepr='', offset=376, start_offset=376, starts_line=True, line_number=22, is_jump_target=True, positions=None), + Instruction(opname='COPY', opcode=104, arg=3, argval=3, argrepr='', offset=378, start_offset=378, starts_line=True, line_number=None, is_jump_target=False, positions=None), Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=380, start_offset=380, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=165, arg=1, argval=1, argrepr='', offset=382, start_offset=382, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=167, arg=1, argval=1, argrepr='', offset=382, start_offset=382, starts_line=False, line_number=None, is_jump_target=False, positions=None), Instruction(opname='PUSH_EXC_INFO', opcode=45, arg=None, argval=None, argrepr='', offset=384, start_offset=384, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=150, arg=3, argval='print', argrepr='print + NULL', offset=386, start_offset=386, starts_line=True, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=142, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=396, start_offset=396, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=75, arg=1, argval=1, argrepr='', offset=398, start_offset=398, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=386, start_offset=386, starts_line=True, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=396, start_offset=396, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=398, start_offset=398, starts_line=False, line_number=28, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=406, start_offset=406, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=165, arg=0, argval=0, argrepr='', offset=408, start_offset=408, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=103, arg=3, argval=3, argrepr='', offset=410, start_offset=410, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=167, arg=0, argval=0, argrepr='', offset=408, start_offset=408, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=104, arg=3, argval=3, argrepr='', offset=410, start_offset=410, starts_line=False, line_number=28, is_jump_target=False, positions=None), Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=412, start_offset=412, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=165, arg=1, argval=1, argrepr='', offset=414, start_offset=414, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=167, arg=1, argval=1, argrepr='', offset=414, start_offset=414, starts_line=False, line_number=28, is_jump_target=False, positions=None), ] # One last piece of inspect fodder to check the default line number handling def simple(): pass expected_opinfo_simple = [ Instruction(opname='RESUME', opcode=166, arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=simple.__code__.co_firstlineno, is_jump_target=False, positions=None), - Instruction(opname='RETURN_CONST', opcode=167, arg=0, argval=None, argrepr='None', offset=2, start_offset=2, starts_line=False, line_number=simple.__code__.co_firstlineno, is_jump_target=False), + Instruction(opname='RETURN_CONST', opcode=168, arg=0, argval=None, argrepr='None', offset=2, start_offset=2, starts_line=False, line_number=simple.__code__.co_firstlineno, is_jump_target=False), ] diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-08-26-10-36-45.gh-issue-108614.wl5l-W.rst b/Misc/NEWS.d/next/Core and Builtins/2023-08-26-10-36-45.gh-issue-108614.wl5l-W.rst new file mode 100644 index 00000000000000..ace670c9ba7fdf --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-08-26-10-36-45.gh-issue-108614.wl5l-W.rst @@ -0,0 +1,2 @@ +Add RESUME_CHECK instruction, to avoid having to handle instrumentation, +signals, and contexts switches in the tier 2 execution engine. diff --git a/Objects/genobject.c b/Objects/genobject.c index 10c55efb1b1e9b..40033d10bea9ee 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -333,7 +333,11 @@ gen_close_iter(PyObject *yf) static inline bool is_resume(_Py_CODEUNIT *instr) { - return instr->op.code == RESUME || instr->op.code == INSTRUMENTED_RESUME; + return ( + instr->op.code == RESUME || + instr->op.code == RESUME_CHECK || + instr->op.code == INSTRUMENTED_RESUME + ); } static inline bool diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h index 3fd6cdade69f9e..7590e87ab1eadd 100644 --- a/Programs/test_frozenmain.h +++ b/Programs/test_frozenmain.h @@ -1,17 +1,17 @@ // Auto-generated by Programs/freeze_test_frozenmain.py unsigned char M_test_frozenmain[] = { 227,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0, - 0,0,0,0,0,243,164,0,0,0,166,0,142,0,142,1, - 121,0,180,0,142,0,142,1,121,1,180,1,153,2,46,0, - 142,2,75,1,0,0,0,0,0,0,44,0,153,2,46,0, - 142,3,153,0,129,6,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,75,2,0,0,0,0,0,0, - 44,0,153,1,129,8,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,46,0,75,0,0,0,0,0, - 0,0,142,4,12,0,0,0,180,5,142,5,31,0,114,20, - 0,0,180,6,153,2,46,0,142,6,153,6,27,0,142,7, - 153,5,153,6,12,0,0,0,27,0,73,4,75,1,0,0, - 0,0,0,0,44,0,123,22,0,0,24,0,167,1,41,8, + 0,0,0,0,0,243,164,0,0,0,166,0,143,0,143,1, + 122,0,181,0,143,0,143,1,122,1,181,1,154,2,46,0, + 143,2,76,1,0,0,0,0,0,0,44,0,154,2,46,0, + 143,3,154,0,130,6,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,76,2,0,0,0,0,0,0, + 44,0,154,1,130,8,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,46,0,76,0,0,0,0,0, + 0,0,143,4,12,0,0,0,181,5,143,5,31,0,115,20, + 0,0,181,6,154,2,46,0,143,6,154,6,27,0,143,7, + 154,5,154,6,12,0,0,0,27,0,74,4,76,1,0,0, + 0,0,0,0,44,0,124,22,0,0,24,0,168,1,41,8, 233,0,0,0,0,78,122,18,70,114,111,122,101,110,32,72, 101,108,108,111,32,87,111,114,108,100,122,8,115,121,115,46, 97,114,103,118,218,6,99,111,110,102,105,103,41,5,218,12, diff --git a/Python/abstract_interp_cases.c.h b/Python/abstract_interp_cases.c.h index 07e8a711575c5b..11fbf4443dda16 100644 --- a/Python/abstract_interp_cases.c.h +++ b/Python/abstract_interp_cases.c.h @@ -7,7 +7,7 @@ break; } - case RESUME: { + case RESUME_CHECK: { break; } diff --git a/Python/bytecodes.c b/Python/bytecodes.c index fae1da31875d66..8820b52774671b 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -132,24 +132,37 @@ dummy_func( inst(NOP, (--)) { } + family(RESUME, 0) = { + RESUME_CHECK, + }; + inst(RESUME, (--)) { + TIER_ONE_ONLY assert(frame == tstate->current_frame); - /* Possibly combine this with eval breaker */ if (_PyFrame_GetCode(frame)->_co_instrumentation_version != tstate->interp->monitoring_version) { int err = _Py_Instrument(_PyFrame_GetCode(frame), tstate->interp); ERROR_IF(err, error); - #if TIER_ONE next_instr--; - #endif - #if TIER_TWO - goto deoptimize; - #endif } - else if (oparg < 2) { - CHECK_EVAL_BREAKER(); + else { + if (oparg < 2) { + CHECK_EVAL_BREAKER(); + } + next_instr[-1].op.code = RESUME_CHECK; } } + inst(RESUME_CHECK, (--)) { +#if defined(__EMSCRIPTEN__) + DEOPT_IF(emscripten_signal_clock == 0, RESUME); + emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; +#endif + /* Possibly combine these two checks */ + DEOPT_IF(_PyFrame_GetCode(frame)->_co_instrumentation_version + != tstate->interp->monitoring_version, RESUME); + DEOPT_IF(_Py_atomic_load_relaxed_int32(&tstate->interp->ceval.eval_breaker), RESUME); + } + inst(INSTRUMENTED_RESUME, (--)) { /* Possible performance enhancement: * We need to check the eval breaker anyway, can we diff --git a/Python/ceval_macros.h b/Python/ceval_macros.h index 81fbb7982ad11c..f5d915554d56e7 100644 --- a/Python/ceval_macros.h +++ b/Python/ceval_macros.h @@ -374,6 +374,8 @@ static inline void _Py_LeaveRecursiveCallPy(PyThreadState *tstate) { tstate->py_recursion_remaining++; } +/* Marker to specify tier 1 only instructions */ +#define TIER_ONE_ONLY /* Implementation of "macros" that modify the instruction pointer, * stack pointer, or frame pointer. diff --git a/Python/emscripten_signal.c b/Python/emscripten_signal.c index d617ddfeb37c5a..1a196385b8ce34 100644 --- a/Python/emscripten_signal.c +++ b/Python/emscripten_signal.c @@ -38,19 +38,17 @@ _Py_CheckEmscriptenSignals(void) } } - #define PY_EMSCRIPTEN_SIGNAL_INTERVAL 50 static int emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; void _Py_CheckEmscriptenSignalsPeriodically(void) { - if (!Py_EMSCRIPTEN_SIGNAL_HANDLING) { - return; - } - emscripten_signal_clock--; if (emscripten_signal_clock == 0) { emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; _Py_CheckEmscriptenSignals(); } + else if (Py_EMSCRIPTEN_SIGNAL_HANDLING) { + emscripten_signal_clock--; + } } diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 0d5606f5a44efe..f4c526a5a8c0a2 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -7,22 +7,15 @@ break; } - case RESUME: { - assert(frame == tstate->current_frame); - /* Possibly combine this with eval breaker */ - if (_PyFrame_GetCode(frame)->_co_instrumentation_version != tstate->interp->monitoring_version) { - int err = _Py_Instrument(_PyFrame_GetCode(frame), tstate->interp); - if (err) goto error; - #if TIER_ONE - next_instr--; - #endif - #if TIER_TWO - goto deoptimize; - #endif - } - else if (oparg < 2) { - CHECK_EVAL_BREAKER(); - } + case RESUME_CHECK: { +#if defined(__EMSCRIPTEN__) + DEOPT_IF(emscripten_signal_clock == 0, RESUME); + emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; +#endif + /* Possibly combine these two checks */ + DEOPT_IF(_PyFrame_GetCode(frame)->_co_instrumentation_version + != tstate->interp->monitoring_version, RESUME); + DEOPT_IF(_Py_atomic_load_relaxed_int32(&tstate->interp->ceval.eval_breaker), RESUME); break; } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 34cea84245f591..84f83db128ea50 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -8,24 +8,36 @@ } TARGET(RESUME) { + PREDICTED(RESUME); + static_assert(0 == 0, "incorrect cache size"); + TIER_ONE_ONLY assert(frame == tstate->current_frame); - /* Possibly combine this with eval breaker */ if (_PyFrame_GetCode(frame)->_co_instrumentation_version != tstate->interp->monitoring_version) { int err = _Py_Instrument(_PyFrame_GetCode(frame), tstate->interp); if (err) goto error; - #if TIER_ONE next_instr--; - #endif - #if TIER_TWO - goto deoptimize; - #endif } - else if (oparg < 2) { - CHECK_EVAL_BREAKER(); + else { + if (oparg < 2) { + CHECK_EVAL_BREAKER(); + } + next_instr[-1].op.code = RESUME_CHECK; } DISPATCH(); } + TARGET(RESUME_CHECK) { +#if defined(__EMSCRIPTEN__) + DEOPT_IF(emscripten_signal_clock == 0, RESUME); + emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; +#endif + /* Possibly combine these two checks */ + DEOPT_IF(_PyFrame_GetCode(frame)->_co_instrumentation_version + != tstate->interp->monitoring_version, RESUME); + DEOPT_IF(_Py_atomic_load_relaxed_int32(&tstate->interp->ceval.eval_breaker), RESUME); + DISPATCH(); + } + TARGET(INSTRUMENTED_RESUME) { /* Possible performance enhancement: * We need to check the eval breaker anyway, can we diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index 305eb0bfe2a7c4..413bb884dcf752 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -46,6 +46,7 @@ static void *opcode_targets[256] = { &&TARGET_POP_TOP, &&TARGET_PUSH_EXC_INFO, &&TARGET_PUSH_NULL, + &&TARGET_RESUME_CHECK, &&TARGET_RETURN_GENERATOR, &&TARGET_RETURN_VALUE, &&TARGET_SETUP_ANNOTATIONS, @@ -164,8 +165,8 @@ static void *opcode_targets[256] = { &&TARGET_POP_JUMP_IF_NOT_NONE, &&TARGET_POP_JUMP_IF_TRUE, &&TARGET_RAISE_VARARGS, - &&TARGET_RERAISE, &&TARGET_RESUME, + &&TARGET_RERAISE, &&TARGET_RETURN_CONST, &&TARGET_SEND, &&TARGET_SEND_GEN, @@ -235,7 +236,6 @@ static void *opcode_targets[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, &&TARGET_INSTRUMENTED_RESUME, &&TARGET_INSTRUMENTED_END_FOR, &&TARGET_INSTRUMENTED_END_SEND, diff --git a/Tools/cases_generator/instructions.py b/Tools/cases_generator/instructions.py index 9143ae0db7be81..145c1ade839b82 100644 --- a/Tools/cases_generator/instructions.py +++ b/Tools/cases_generator/instructions.py @@ -37,6 +37,7 @@ class ActiveCacheEffect: "import_from", "import_name", "_PyObject_CallNoArgs", # Proxy for BEFORE_WITH + "TIER_ONE_ONLY", ) diff --git a/Tools/cases_generator/parsing.py b/Tools/cases_generator/parsing.py index 25de3a5adc2cf9..25be5ca3e0da5d 100644 --- a/Tools/cases_generator/parsing.py +++ b/Tools/cases_generator/parsing.py @@ -362,7 +362,8 @@ def family_def(self) -> Family | None: if tkn := self.expect(lx.IDENTIFIER): if self.expect(lx.COMMA): if not (size := self.expect(lx.IDENTIFIER)): - raise self.make_syntax_error("Expected identifier") + if not (size := self.expect(lx.NUMBER)): + raise self.make_syntax_error("Expected identifier or number") if self.expect(lx.RPAREN): if self.expect(lx.EQUALS): if not self.expect(lx.LBRACE): From 891236f48263e2d4c650b7a127fc9bffb8327807 Mon Sep 17 00:00:00 2001 From: Stanley <46876382+slateny@users.noreply.github.com> Date: Thu, 7 Sep 2023 06:52:58 -0700 Subject: [PATCH 086/357] gh-71770: Add more details on behavior of configparser's default_section (#31562) Co-authored-by: Hugo van Kemenade --- Doc/library/configparser.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Doc/library/configparser.rst b/Doc/library/configparser.rst index a7f75fd6e84f4c..bb282428c5fffc 100644 --- a/Doc/library/configparser.rst +++ b/Doc/library/configparser.rst @@ -935,8 +935,10 @@ ConfigParser Objects When *default_section* is given, it specifies the name for the special section holding default values for other sections and interpolation purposes - (normally named ``"DEFAULT"``). This value can be retrieved and changed on - runtime using the ``default_section`` instance attribute. + (normally named ``"DEFAULT"``). This value can be retrieved and changed at + runtime using the ``default_section`` instance attribute. This won't + re-evaluate an already parsed config file, but will be used when writing + parsed settings to a new config file. Interpolation behaviour may be customized by providing a custom handler through the *interpolation* argument. ``None`` can be used to turn off From ac31f714c3e55a7951a9f3f9c823740c20c5d595 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Thu, 7 Sep 2023 16:53:33 +0300 Subject: [PATCH 087/357] gh-107544: Add docs about `json.dumps(..., default=)` (#108259) --- Doc/library/json.rst | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 6c3059381776c9..b337b5f9960e8e 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -54,12 +54,23 @@ Compact encoding:: Pretty printing:: >>> import json - >>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)) + >>> print(json.dumps({'6': 7, '4': 5}, sort_keys=True, indent=4)) { "4": 5, "6": 7 } +Specializing JSON object encoding:: + + >>> import json + >>> def custom_json(obj): + ... if isinstance(obj, complex): + ... return {'__complex__': True, 'real': obj.real, 'imag': obj.imag} + ... raise TypeError(f'Cannot serialize object of {type(obj)}') + ... + >>> json.dumps(1 + 2j, default=custom_json) + '{"__complex__": true, "real": 1.0, "imag": 2.0}' + Decoding JSON:: >>> import json From b2729e93e9d73503b1fda4ea4fecd77c58909091 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 7 Sep 2023 17:00:13 +0300 Subject: [PATCH 088/357] gh-88943: Improve syntax error for non-ASCII character that follows a numerical literal (GH-109081) It now points on the invalid non-ASCII character, not on the valid numerical literal. --- Lib/test/test_grammar.py | 4 ++++ .../2023-09-07-16-05-36.gh-issue-88943.rH_X3W.rst | 3 +++ Parser/tokenizer.c | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-07-16-05-36.gh-issue-88943.rH_X3W.rst diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py index 7c15a23a69163b..8501006b799262 100644 --- a/Lib/test/test_grammar.py +++ b/Lib/test/test_grammar.py @@ -236,6 +236,10 @@ def check(test, error=False): check(f"[{num}for x in ()]") check(f"{num}spam", error=True) + # gh-88943: Invalid non-ASCII character following a numerical literal. + with self.assertRaisesRegex(SyntaxError, r"invalid character '⁄' \(U\+2044\)"): + compile(f"{num}⁄7", "", "eval") + with self.assertWarnsRegex(SyntaxWarning, r'invalid \w+ literal'): compile(f"{num}is x", "", "eval") with warnings.catch_warnings(): diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-07-16-05-36.gh-issue-88943.rH_X3W.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-07-16-05-36.gh-issue-88943.rH_X3W.rst new file mode 100644 index 00000000000000..a99830fe4227c9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-07-16-05-36.gh-issue-88943.rH_X3W.rst @@ -0,0 +1,3 @@ +Improve syntax error for non-ASCII character that follows a numerical +literal. It now points on the invalid non-ASCII character, not on the valid +numerical literal. diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 6ec24895785568..46b7159ff0516b 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -1642,7 +1642,7 @@ verify_end_of_number(struct tok_state *tok, int c, const char *kind) { tok_nextc(tok); } else /* In future releases, only error will remain. */ - if (is_potential_identifier_char(c)) { + if (c < 128 && is_potential_identifier_char(c)) { tok_backup(tok, c); syntaxerror(tok, "invalid %s literal", kind); return 0; From b72251de930c8ec6893f1b3f6fdf1640cc17dfed Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Thu, 7 Sep 2023 15:20:33 +0100 Subject: [PATCH 089/357] gh-102823: Document return type of floor division on floats (#102824) Co-authored-by: Hugo van Kemenade --- Doc/library/stdtypes.rst | 8 +++++--- .../2023-03-19-09-39-31.gh-issue-102823.OzsOz0.rst | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2023-03-19-09-39-31.gh-issue-102823.OzsOz0.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 6c07ee585480e9..652ed147af8422 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -282,7 +282,7 @@ the operations, see :ref:`operator-summary`): +---------------------+---------------------------------+---------+--------------------+ | ``x / y`` | quotient of *x* and *y* | | | +---------------------+---------------------------------+---------+--------------------+ -| ``x // y`` | floored quotient of *x* and | \(1) | | +| ``x // y`` | floored quotient of *x* and | \(1)\(2)| | | | *y* | | | +---------------------+---------------------------------+---------+--------------------+ | ``x % y`` | remainder of ``x / y`` | \(2) | | @@ -319,8 +319,10 @@ the operations, see :ref:`operator-summary`): Notes: (1) - Also referred to as integer division. The resultant value is a whole - integer, though the result's type is not necessarily int. The result is + Also referred to as integer division. For operands of type :class:`int`, + the result has type :class:`int`. For operands of type :class:`float`, + the result has type :class:`float`. In general, the result is a whole + integer, though the result's type is not necessarily :class:`int`. The result is always rounded towards minus infinity: ``1//2`` is ``0``, ``(-1)//2`` is ``-1``, ``1//(-2)`` is ``-1``, and ``(-1)//(-2)`` is ``0``. diff --git a/Misc/NEWS.d/next/Documentation/2023-03-19-09-39-31.gh-issue-102823.OzsOz0.rst b/Misc/NEWS.d/next/Documentation/2023-03-19-09-39-31.gh-issue-102823.OzsOz0.rst new file mode 100644 index 00000000000000..1e32f3c89231c8 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2023-03-19-09-39-31.gh-issue-102823.OzsOz0.rst @@ -0,0 +1,2 @@ +Document the return type of ``x // y`` when ``x`` and ``y`` have type +:class:`float`. From f2584eade378910b9ea18072bb1dab3dd58e23bb Mon Sep 17 00:00:00 2001 From: Carl Meyer Date: Thu, 7 Sep 2023 08:56:43 -0600 Subject: [PATCH 090/357] gh-108732: include comprehension locals in frame.f_locals (#109026) Co-authored-by: Radislav Chugunov <52372310+chgnrdv@users.noreply.github.com> Co-authored-by: Jelle Zijlstra --- Lib/test/test_listcomps.py | 7 +++++++ .../2023-09-06-13-28-42.gh-issue-108732.I6DkEQ.rst | 2 ++ Objects/frameobject.c | 14 ++++++++++---- 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-06-13-28-42.gh-issue-108732.I6DkEQ.rst diff --git a/Lib/test/test_listcomps.py b/Lib/test/test_listcomps.py index bedd99b4a44fcb..c1089574d71b02 100644 --- a/Lib/test/test_listcomps.py +++ b/Lib/test/test_listcomps.py @@ -596,6 +596,13 @@ def test_exception_in_post_comp_call(self): """ self._check_in_scopes(code, {"value": [1, None]}) + def test_frame_locals(self): + code = """ + val = [sys._getframe().f_locals for a in [0]][0]["a"] + """ + import sys + self._check_in_scopes(code, {"val": 0}, ns={"sys": sys}) + __test__ = {'doctests' : doctests} diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-06-13-28-42.gh-issue-108732.I6DkEQ.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-06-13-28-42.gh-issue-108732.I6DkEQ.rst new file mode 100644 index 00000000000000..94a143b86b6708 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-06-13-28-42.gh-issue-108732.I6DkEQ.rst @@ -0,0 +1,2 @@ +Make iteration variables of module- and class-scoped comprehensions visible +to pdb and other tools that use ``frame.f_locals`` again. diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 7017cc6c0e295f..53764a41ca010a 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -25,10 +25,16 @@ static PyMemberDef frame_memberlist[] = { static PyObject * frame_getlocals(PyFrameObject *f, void *closure) { - if (PyFrame_FastToLocalsWithError(f) < 0) + if (f == NULL) { + PyErr_BadInternalCall(); return NULL; - PyObject *locals = f->f_frame->f_locals; - return Py_NewRef(locals); + } + assert(!_PyFrame_IsIncomplete(f->f_frame)); + PyObject *locals = _PyFrame_GetLocals(f->f_frame, 1); + if (locals) { + f->f_fast_as_locals = 1; + } + return locals; } int @@ -1342,11 +1348,11 @@ PyFrame_GetVarString(PyFrameObject *frame, const char *name) int PyFrame_FastToLocalsWithError(PyFrameObject *f) { - assert(!_PyFrame_IsIncomplete(f->f_frame)); if (f == NULL) { PyErr_BadInternalCall(); return -1; } + assert(!_PyFrame_IsIncomplete(f->f_frame)); int err = _PyFrame_FastToLocalsWithError(f->f_frame); if (err == 0) { f->f_fast_as_locals = 1; From 403ab1306a6e9860197bce57eadcb83418966f21 Mon Sep 17 00:00:00 2001 From: Christoph Anton Mitterer Date: Thu, 7 Sep 2023 17:50:10 +0200 Subject: [PATCH 091/357] gh-107924: re-order os.sendfile() flag documentation (#107926) Co-authored-by: Hugo van Kemenade --- Doc/library/os.rst | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 4f4d8c99023529..c67b966f777db8 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1618,25 +1618,6 @@ or `the MSDN `_ on Windo Parameters *out* and *in* was renamed to *out_fd* and *in_fd*. -.. function:: set_blocking(fd, blocking, /) - - Set the blocking mode of the specified file descriptor. Set the - :data:`O_NONBLOCK` flag if blocking is ``False``, clear the flag otherwise. - - See also :func:`get_blocking` and :meth:`socket.socket.setblocking`. - - .. availability:: Unix, Windows. - - The function is limited on Emscripten and WASI, see - :ref:`wasm-availability` for more information. - - On Windows, this function is limited to pipes. - - .. versionadded:: 3.5 - - .. versionchanged:: 3.12 - Added support for pipes on Windows. - .. data:: SF_NODISKIO SF_MNOWAIT SF_SYNC @@ -1658,6 +1639,26 @@ or `the MSDN `_ on Windo .. versionadded:: 3.11 +.. function:: set_blocking(fd, blocking, /) + + Set the blocking mode of the specified file descriptor. Set the + :data:`O_NONBLOCK` flag if blocking is ``False``, clear the flag otherwise. + + See also :func:`get_blocking` and :meth:`socket.socket.setblocking`. + + .. availability:: Unix, Windows. + + The function is limited on Emscripten and WASI, see + :ref:`wasm-availability` for more information. + + On Windows, this function is limited to pipes. + + .. versionadded:: 3.5 + + .. versionchanged:: 3.12 + Added support for pipes on Windows. + + .. function:: splice(src, dst, count, offset_src=None, offset_dst=None) Transfer *count* bytes from file descriptor *src*, starting from offset From 96396962ce7a83c09bac5061121c779ca6b25ef5 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Thu, 7 Sep 2023 18:23:11 +0100 Subject: [PATCH 092/357] gh-109094: remove unnecessary updates of frame->prev_instr in instrumentation functions (#109076) --- Lib/test/test_sys_settrace.py | 9 +++++++++ Python/instrumentation.c | 8 ++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 232900876392ff..369a276ac33a12 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -317,6 +317,13 @@ def generator_example(): [(5, 'line'), (5, 'return')]) +def lineno_matches_lasti(frame): + last_line = None + for start, end, line in frame.f_code.co_lines(): + if start <= frame.f_lasti < end: + last_line = line + return last_line == frame.f_lineno + class Tracer: def __init__(self, trace_line_events=None, trace_opcode_events=None): self.trace_line_events = trace_line_events @@ -330,6 +337,7 @@ def _reconfigure_frame(self, frame): frame.f_trace_opcodes = self.trace_opcode_events def trace(self, frame, event, arg): + assert lineno_matches_lasti(frame) self._reconfigure_frame(frame) self.events.append((frame.f_lineno, event)) return self.trace @@ -1890,6 +1898,7 @@ def __init__(self, function, jumpFrom, jumpTo, event='line', def trace(self, frame, event, arg): if self.done: return + assert lineno_matches_lasti(frame) # frame.f_code.co_firstlineno is the first line of the decorator when # 'function' is decorated and the decorator may be written using # multiple physical lines when it is too long. Use the first line diff --git a/Python/instrumentation.c b/Python/instrumentation.c index acc3278d50a60a..74c3adf0c1f475 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -1057,8 +1057,6 @@ _Py_call_instrumentation_jump( assert(event == PY_MONITORING_EVENT_JUMP || event == PY_MONITORING_EVENT_BRANCH); assert(frame->prev_instr == instr); - /* Event should occur after the jump */ - frame->prev_instr = target; PyCodeObject *code = _PyFrame_GetCode(frame); int to = (int)(target - _PyCode_CODE(code)); PyObject *to_obj = PyLong_FromLong(to * (int)sizeof(_Py_CODEUNIT)); @@ -1071,12 +1069,10 @@ _Py_call_instrumentation_jump( if (err) { return NULL; } - if (frame->prev_instr != target) { + if (frame->prev_instr != instr) { /* The callback has caused a jump (by setting the line number) */ return frame->prev_instr; } - /* Reset prev_instr for INSTRUMENTED_LINE */ - frame->prev_instr = instr; return target; } @@ -1125,7 +1121,7 @@ _Py_Instrumentation_GetLine(PyCodeObject *code, int index) int _Py_call_instrumentation_line(PyThreadState *tstate, _PyInterpreterFrame* frame, _Py_CODEUNIT *instr, _Py_CODEUNIT *prev) { - frame->prev_instr = instr; + assert(frame->prev_instr == instr); PyCodeObject *code = _PyFrame_GetCode(frame); assert(is_version_up_to_date(code, tstate->interp)); assert(instrumentation_cross_checks(tstate->interp, code)); From f9f085c326cdaa34ebb3ca018228a63825b12122 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 7 Sep 2023 20:53:38 +0300 Subject: [PATCH 093/357] gh-103186: Make test_generated_cases less noisy by default (GH-109100) Print additional details only when tests are run with -vv. --- Lib/test/test_generated_cases.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_generated_cases.py b/Lib/test/test_generated_cases.py index ed56f95af99417..be3dfd204ee143 100644 --- a/Lib/test/test_generated_cases.py +++ b/Lib/test/test_generated_cases.py @@ -1,7 +1,9 @@ +import contextlib import tempfile import unittest import os +from test import support from test import test_tools test_tools.skip_if_missing('cases_generator') @@ -12,6 +14,12 @@ from parsing import StackEffect +def handle_stderr(): + if support.verbose > 1: + return contextlib.nullcontext() + else: + return support.captured_stderr() + class TestEffects(unittest.TestCase): def test_effect_sizes(self): input_effects = [ @@ -81,11 +89,12 @@ def run_cases_test(self, input: str, expected: str): temp_input.flush() a = generate_cases.Generator([self.temp_input_filename]) - a.parse() - a.analyze() - if a.errors: - raise RuntimeError(f"Found {a.errors} errors") - a.write_instructions(self.temp_output_filename, False) + with handle_stderr(): + a.parse() + a.analyze() + if a.errors: + raise RuntimeError(f"Found {a.errors} errors") + a.write_instructions(self.temp_output_filename, False) with open(self.temp_output_filename) as temp_output: lines = temp_output.readlines() From 1829a3c9a3712b6a68a3a449e4a08787c73da51d Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Thu, 7 Sep 2023 14:13:32 -0400 Subject: [PATCH 094/357] gh-75743: Restore test_timeout.testConnectTimeout() (#109087) This un-skips this test now that pythontest.net implements appropriate firewall rules for it. --- Lib/test/test_timeout.py | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/Lib/test/test_timeout.py b/Lib/test/test_timeout.py index 30e843a423a777..35ff56f1a5ee09 100644 --- a/Lib/test/test_timeout.py +++ b/Lib/test/test_timeout.py @@ -148,13 +148,12 @@ def setUp(self): def tearDown(self): self.sock.close() - @unittest.skipIf(True, 'need to replace these hosts; see bpo-35518') def testConnectTimeout(self): # Testing connect timeout is tricky: we need to have IP connectivity # to a host that silently drops our packets. We can't simulate this # from Python because it's a function of the underlying TCP/IP stack. - # So, the following Snakebite host has been defined: - blackhole = resolve_address('blackhole.snakebite.net', 56666) + # So, the following port on the pythontest.net host has been defined: + blackhole = resolve_address('pythontest.net', 56666) # Blackhole has been configured to silently drop any incoming packets. # No RSTs (for TCP) or ICMP UNREACH (for UDP/ICMP) will be sent back @@ -166,7 +165,7 @@ def testConnectTimeout(self): # to firewalling or general network configuration. In order to improve # our confidence in testing the blackhole, a corresponding 'whitehole' # has also been set up using one port higher: - whitehole = resolve_address('whitehole.snakebite.net', 56667) + whitehole = resolve_address('pythontest.net', 56667) # This address has been configured to immediately drop any incoming # packets as well, but it does it respectfully with regards to the @@ -180,20 +179,15 @@ def testConnectTimeout(self): # timeframe). # For the records, the whitehole/blackhole configuration has been set - # up using the 'pf' firewall (available on BSDs), using the following: + # up using the 'iptables' firewall, using the following rules: # - # ext_if="bge0" - # - # blackhole_ip="35.8.247.6" - # whitehole_ip="35.8.247.6" - # blackhole_port="56666" - # whitehole_port="56667" - # - # block return in log quick on $ext_if proto { tcp udp } \ - # from any to $whitehole_ip port $whitehole_port - # block drop in log quick on $ext_if proto { tcp udp } \ - # from any to $blackhole_ip port $blackhole_port + # -A INPUT -p tcp --destination-port 56666 -j DROP + # -A INPUT -p udp --destination-port 56666 -j DROP + # -A INPUT -p tcp --destination-port 56667 -j REJECT + # -A INPUT -p udp --destination-port 56667 -j REJECT # + # See https://github.com/python/psf-salt/blob/main/pillar/base/firewall/snakebite.sls + # for the current configuration. skip = True sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) From 7e1a7abb9831965cdec477e62dbe4f8415b8a582 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 7 Sep 2023 21:28:18 +0300 Subject: [PATCH 095/357] gh-68403: Fix test_coverage in test_trace (GH-108910) Its behavior no longer affected by test running options such as -m. --- Lib/test/test_trace.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_trace.py b/Lib/test/test_trace.py index d1ef005a4314ed..c1e289bcaff9e5 100644 --- a/Lib/test/test_trace.py +++ b/Lib/test/test_trace.py @@ -360,9 +360,14 @@ def tearDown(self): rmtree(TESTFN) unlink(TESTFN) - def _coverage(self, tracer, - cmd='import test.support, test.test_pprint;' - 'test.support.run_unittest(test.test_pprint.QueryTestCase)'): + DEFAULT_SCRIPT = '''if True: + import unittest + from test.test_pprint import QueryTestCase + loader = unittest.TestLoader() + tests = loader.loadTestsFromTestCase(QueryTestCase) + tests(unittest.TestResult()) + ''' + def _coverage(self, tracer, cmd=DEFAULT_SCRIPT): tracer.run(cmd) r = tracer.results() r.write_results(show_missing=True, summary=True, coverdir=TESTFN) From 74fc96bc60f5c02bde50ff2f3516add99483e402 Mon Sep 17 00:00:00 2001 From: Shantanu <12621235+hauntsaninja@users.noreply.github.com> Date: Thu, 7 Sep 2023 11:34:18 -0700 Subject: [PATCH 096/357] Add version directives to ast docs (#108788) --- Doc/library/ast.rst | 46 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 8f5148feb809a3..10b3e2dae472e1 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -650,10 +650,10 @@ Expressions .. class:: NamedExpr(target, value) - A named expression. This AST node is produced by the assignment expressions - operator (also known as the walrus operator). As opposed to the :class:`Assign` - node in which the first argument can be multiple nodes, in this case both - ``target`` and ``value`` must be single nodes. + A named expression. This AST node is produced by the assignment expressions + operator (also known as the walrus operator). As opposed to the :class:`Assign` + node in which the first argument can be multiple nodes, in this case both + ``target`` and ``value`` must be single nodes. .. doctest:: @@ -663,6 +663,7 @@ Expressions target=Name(id='x', ctx=Store()), value=Constant(value=4))) + .. versionadded:: 3.8 Subscripting ~~~~~~~~~~~~ @@ -1036,6 +1037,7 @@ Statements value=Name(id='int', ctx=Load()))], type_ignores=[]) + .. versionadded:: 3.12 Other statements which are only applicable inside functions or loops are described in other sections. @@ -1318,6 +1320,7 @@ Control flow finalbody=[])], type_ignores=[]) + .. versionadded:: 3.11 .. class:: ExceptHandler(type, name, body) @@ -1407,6 +1410,8 @@ Pattern matching that is being matched against the cases) and ``cases`` contains an iterable of :class:`match_case` nodes with the different cases. + .. versionadded:: 3.10 + .. class:: match_case(pattern, guard, body) A single case pattern in a ``match`` statement. ``pattern`` contains the @@ -1458,6 +1463,8 @@ Pattern matching value=Constant(value=Ellipsis))])])], type_ignores=[]) + .. versionadded:: 3.10 + .. class:: MatchValue(value) A match literal or value pattern that compares by equality. ``value`` is @@ -1485,6 +1492,8 @@ Pattern matching value=Constant(value=Ellipsis))])])], type_ignores=[]) + .. versionadded:: 3.10 + .. class:: MatchSingleton(value) A match literal pattern that compares by identity. ``value`` is the @@ -1510,6 +1519,8 @@ Pattern matching value=Constant(value=Ellipsis))])])], type_ignores=[]) + .. versionadded:: 3.10 + .. class:: MatchSequence(patterns) A match sequence pattern. ``patterns`` contains the patterns to be matched @@ -1541,6 +1552,8 @@ Pattern matching value=Constant(value=Ellipsis))])])], type_ignores=[]) + .. versionadded:: 3.10 + .. class:: MatchStar(name) Matches the rest of the sequence in a variable length match sequence pattern. @@ -1581,6 +1594,8 @@ Pattern matching value=Constant(value=Ellipsis))])])], type_ignores=[]) + .. versionadded:: 3.10 + .. class:: MatchMapping(keys, patterns, rest) A match mapping pattern. ``keys`` is a sequence of expression nodes. @@ -1627,6 +1642,8 @@ Pattern matching value=Constant(value=Ellipsis))])])], type_ignores=[]) + .. versionadded:: 3.10 + .. class:: MatchClass(cls, patterns, kwd_attrs, kwd_patterns) A match class pattern. ``cls`` is an expression giving the nominal class to @@ -1691,6 +1708,8 @@ Pattern matching value=Constant(value=Ellipsis))])])], type_ignores=[]) + .. versionadded:: 3.10 + .. class:: MatchAs(pattern, name) A match "as-pattern", capture pattern or wildcard pattern. ``pattern`` @@ -1732,6 +1751,8 @@ Pattern matching value=Constant(value=Ellipsis))])])], type_ignores=[]) + .. versionadded:: 3.10 + .. class:: MatchOr(patterns) A match "or-pattern". An or-pattern matches each of its subpatterns in turn @@ -1764,6 +1785,8 @@ Pattern matching value=Constant(value=Ellipsis))])])], type_ignores=[]) + .. versionadded:: 3.10 + .. _ast-type-params: Type parameters @@ -1795,6 +1818,8 @@ aliases. ctx=Load()))], type_ignores=[]) + .. versionadded:: 3.12 + .. class:: ParamSpec(name) A :class:`typing.ParamSpec`. ``name`` is the name of the parameter specification. @@ -1818,6 +1843,8 @@ aliases. ctx=Load()))], type_ignores=[]) + .. versionadded:: 3.12 + .. class:: TypeVarTuple(name) A :class:`typing.TypeVarTuple`. ``name`` is the name of the type variable tuple. @@ -1842,6 +1869,8 @@ aliases. ctx=Load()))], type_ignores=[]) + .. versionadded:: 3.12 + Function and class definitions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1861,6 +1890,9 @@ Function and class definitions ``type_comment`` is an optional string with the type annotation as a comment. + .. versionchanged:: 3.12 + Added ``type_params``. + .. class:: Lambda(args, body) @@ -2059,6 +2091,9 @@ Function and class definitions type_params=[])], type_ignores=[]) + .. versionchanged:: 3.12 + Added ``type_params``. + Async and await ^^^^^^^^^^^^^^^ @@ -2067,6 +2102,9 @@ Async and await An ``async def`` function definition. Has the same fields as :class:`FunctionDef`. + .. versionchanged:: 3.12 + Added ``type_params``. + .. class:: Await(value) From b9831e5c98de280870b6d932033b868ef56fa2fa Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 7 Sep 2023 23:08:55 +0300 Subject: [PATCH 097/357] Use unittest test runner for doctests in test_statistics (GH-108921) --- Lib/test/test_statistics.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 23a3973305303d..f9b0ac2ad7b116 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -698,14 +698,6 @@ def test_check_all(self): 'missing name "%s" in __all__' % name) -class DocTests(unittest.TestCase): - @unittest.skipIf(sys.flags.optimize >= 2, - "Docstrings are omitted with -OO and above") - def test_doc_tests(self): - failed, tried = doctest.testmod(statistics, optionflags=doctest.ELLIPSIS) - self.assertGreater(tried, 0) - self.assertEqual(failed, 0) - class StatisticsErrorTest(unittest.TestCase): def test_has_exception(self): errmsg = ( @@ -3145,6 +3137,7 @@ def tearDown(self): def load_tests(loader, tests, ignore): """Used for doctest/unittest integration.""" tests.addTests(doctest.DocTestSuite()) + tests.addTests(doctest.DocTestSuite(statistics)) return tests From c74e440168fab9bf91346471087a394af13fa2db Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Thu, 7 Sep 2023 18:19:03 -0700 Subject: [PATCH 098/357] gh-109022: [Enum] require `names=()` to create empty enum type (GH-109048) add guard so that ``Enum('bar')`` raises a TypeError instead of creating a new enum class called `bar`. To create the new but empty class, use: huh = Enum('bar', names=()) --- Lib/enum.py | 5 +++++ Lib/test/test_enum.py | 11 +++++++---- .../2023-09-06-19-33-41.gh-issue-108682.35Xnc5.rst | 2 ++ 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-06-19-33-41.gh-issue-108682.35Xnc5.rst diff --git a/Lib/enum.py b/Lib/enum.py index 4b99e7bda2cca5..994a7b9c73f9a7 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -730,6 +730,11 @@ def __call__(cls, value, names=None, *values, module=None, qualname=None, type=N value = (value, names) + values return cls.__new__(cls, value) # otherwise, functional API: we're creating a new Enum type + if names is None and type is None: + # no body? no data-type? possibly wrong usage + raise TypeError( + f"{cls} has no members; specify `names=()` if you meant to create a new, empty, enum" + ) return cls._create_( class_name=value, names=names, diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index a838b93341a608..8c1f285f7b3bc2 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -316,6 +316,7 @@ def __str__(self): return self.name.title() def __format__(self, spec): return ''.join(reversed(self.name)) + self.NewBaseEnum = NewBaseEnum class NewSubEnum(NewBaseEnum): first = auto() self.NewSubEnum = NewSubEnum @@ -382,10 +383,8 @@ def __str__(self): return self.name.title() def __format__(self, spec): return ''.join(reversed(self.name)) - NewBaseEnum = self.enum_type('NewBaseEnum', dict(__format__=__format__, __str__=__str__)) - class NewSubEnum(NewBaseEnum): - first = auto() - self.NewSubEnum = NewBaseEnum('NewSubEnum', 'first') + self.NewBaseEnum = self.enum_type('NewBaseEnum', dict(__format__=__format__, __str__=__str__)) + self.NewSubEnum = self.NewBaseEnum('NewSubEnum', 'first') # def _generate_next_value_(name, start, last, values): pass @@ -601,6 +600,10 @@ class SubEnum(SuperEnum): self.assertTrue('description' not in dir(SubEnum)) self.assertTrue('description' in dir(SubEnum.sample), dir(SubEnum.sample)) + def test_empty_enum_has_no_values(self): + with self.assertRaisesRegex(TypeError, "<.... 'NewBaseEnum'> has no members"): + self.NewBaseEnum(7) + def test_enum_in_enum_out(self): Main = self.MainEnum self.assertIs(Main(Main.first), Main.first) diff --git a/Misc/NEWS.d/next/Library/2023-09-06-19-33-41.gh-issue-108682.35Xnc5.rst b/Misc/NEWS.d/next/Library/2023-09-06-19-33-41.gh-issue-108682.35Xnc5.rst new file mode 100644 index 00000000000000..8c13d43ee9744b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-06-19-33-41.gh-issue-108682.35Xnc5.rst @@ -0,0 +1,2 @@ +Enum: require ``names=()`` or ``type=...`` to create an empty enum using +the functional syntax. From 00cf626cd41f806062c22a913b647b4efa84c476 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Thu, 7 Sep 2023 22:37:29 -0700 Subject: [PATCH 099/357] Update `CODEOWNERS` for `Tools/wasm/` (#109119) --- .github/CODEOWNERS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 578cd71a7bd211..81c580eb778625 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -179,3 +179,6 @@ Doc/c-api/stable.rst @encukou /Tools/clinic/** @erlend-aasland @AlexWaygood /Lib/test/test_clinic.py @erlend-aasland @AlexWaygood Doc/howto/clinic.rst @erlend-aasland + +# WebAssembly +/Tools/wasm/ @brettcannon From 15d4c9fabce67b8a1b5bd9dec9612014ec18291a Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Fri, 8 Sep 2023 10:34:40 +0100 Subject: [PATCH 100/357] GH-108716: Turn off deep-freezing of code objects. (GH-108722) --- Include/cpython/import.h | 1 - Include/internal/pycore_code.h | 2 - Include/internal/pycore_interp.h | 1 + Lib/test/test_ctypes/test_values.py | 1 - Makefile.pre.in | 1 - ...-08-28-03-38-28.gh-issue-108716.HJBPwt.rst | 2 + Objects/codeobject.c | 7 ++- Objects/funcobject.c | 9 +-- Programs/_bootstrap_python.c | 2 - Programs/_freeze_module.c | 2 - Python/frozen.c | 58 +++++++++---------- Python/import.c | 13 +---- Python/pylifecycle.c | 6 -- Python/pystate.c | 1 + Tools/build/freeze_modules.py | 30 +++------- 15 files changed, 50 insertions(+), 86 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-08-28-03-38-28.gh-issue-108716.HJBPwt.rst diff --git a/Include/cpython/import.h b/Include/cpython/import.h index cdfdd15bfa48d2..7daf0b84fcf71b 100644 --- a/Include/cpython/import.h +++ b/Include/cpython/import.h @@ -17,7 +17,6 @@ struct _frozen { const unsigned char *code; int size; int is_package; - PyObject *(*get_code)(void); }; /* Embedding apps may change this pointer to point to their favorite diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index b3f480c7204172..257b0583edae11 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -465,8 +465,6 @@ adaptive_counter_backoff(uint16_t counter) { return adaptive_counter_bits(value, backoff); } -extern uint32_t _Py_next_func_version; - /* Comparison bit masks. */ diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index e0b7a325929257..ba5764e943e676 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -186,6 +186,7 @@ struct _is { _PyOptimizerObject *optimizer; uint16_t optimizer_resume_threshold; uint16_t optimizer_backedge_threshold; + uint32_t next_func_version; _Py_GlobalMonitors monitors; bool f_opcode_trace_set; diff --git a/Lib/test/test_ctypes/test_values.py b/Lib/test/test_ctypes/test_values.py index 9f8b69409cb880..d0b4803dff8529 100644 --- a/Lib/test/test_ctypes/test_values.py +++ b/Lib/test/test_ctypes/test_values.py @@ -58,7 +58,6 @@ class struct_frozen(Structure): ("code", POINTER(c_ubyte)), ("size", c_int), ("is_package", c_int), - ("get_code", POINTER(c_ubyte)), # Function ptr ] FrozenTable = POINTER(struct_frozen) diff --git a/Makefile.pre.in b/Makefile.pre.in index aa3eaabc7559f6..19a802997838a4 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -505,7 +505,6 @@ LIBRARY_OBJS_OMIT_FROZEN= \ LIBRARY_OBJS= \ $(LIBRARY_OBJS_OMIT_FROZEN) \ - $(DEEPFREEZE_OBJS) \ Modules/getpath.o \ Python/frozen.o diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-08-28-03-38-28.gh-issue-108716.HJBPwt.rst b/Misc/NEWS.d/next/Core and Builtins/2023-08-28-03-38-28.gh-issue-108716.HJBPwt.rst new file mode 100644 index 00000000000000..f63eb8689d63a3 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-08-28-03-38-28.gh-issue-108716.HJBPwt.rst @@ -0,0 +1,2 @@ +Turn off deep-freezing of code objects. Modules are still frozen, so that a +file system search is not needed for common modules. diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 1443027ff293ac..d00bd0422f004d 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -427,9 +427,10 @@ init_code(PyCodeObject *co, struct _PyCodeConstructor *con) co->co_framesize = nlocalsplus + con->stacksize + FRAME_SPECIALS_SIZE; co->co_ncellvars = ncellvars; co->co_nfreevars = nfreevars; - co->co_version = _Py_next_func_version; - if (_Py_next_func_version != 0) { - _Py_next_func_version++; + PyInterpreterState *interp = _PyInterpreterState_GET(); + co->co_version = interp->next_func_version; + if (interp->next_func_version != 0) { + interp->next_func_version++; } co->_co_monitoring = NULL; co->_co_instrumentation_version = 0; diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 648b660859c04d..231a9c141d0c0b 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -3,7 +3,6 @@ #include "Python.h" #include "pycore_ceval.h" // _PyEval_BuiltinsFromGlobals() -#include "pycore_code.h" // _Py_next_func_version #include "pycore_object.h" // _PyObject_GC_UNTRACK() #include "pycore_pyerrors.h" // _PyErr_Occurred() @@ -252,11 +251,9 @@ When the function version is 0, the `CALL` bytecode is not specialized. Code object versions -------------------- -So where to code objects get their `co_version`? There is a single -static global counter, `_Py_next_func_version`. This is initialized in -the generated (!) file `Python/deepfreeze/deepfreeze.c`, to 1 plus the -number of deep-frozen function objects in that file. -(In `_bootstrap_python.c` and `freeze_module.c` it is initialized to 1.) +So where to code objects get their `co_version`? +There is a per-interpreter counter, `next_func_version`. +This is initialized to 1 when the interpreter is created. Code objects get a new `co_version` allocated from this counter upon creation. Since code objects are nominally immutable, `co_version` can diff --git a/Programs/_bootstrap_python.c b/Programs/_bootstrap_python.c index 6c388fc7033dd0..34f79191b4e8d7 100644 --- a/Programs/_bootstrap_python.c +++ b/Programs/_bootstrap_python.c @@ -15,8 +15,6 @@ #include "Python/frozen_modules/zipimport.h" /* End includes */ -uint32_t _Py_next_func_version = 1; - /* Empty initializer for deepfrozen modules */ int _Py_Deepfreeze_Init(void) { diff --git a/Programs/_freeze_module.c b/Programs/_freeze_module.c index f6c46fa629efba..3de6c6816c1e61 100644 --- a/Programs/_freeze_module.c +++ b/Programs/_freeze_module.c @@ -22,8 +22,6 @@ # include #endif -uint32_t _Py_next_func_version = 1; - /* Empty initializer for deepfrozen modules */ int _Py_Deepfreeze_Init(void) { diff --git a/Python/frozen.c b/Python/frozen.c index 6b977710e6e342..0fb38a11902f35 100644 --- a/Python/frozen.c +++ b/Python/frozen.c @@ -101,46 +101,46 @@ extern PyObject *_Py_get_frozen_only_toplevel(void); /* End extern declarations */ static const struct _frozen bootstrap_modules[] = { - {"_frozen_importlib", _Py_M__importlib__bootstrap, (int)sizeof(_Py_M__importlib__bootstrap), false, GET_CODE(importlib__bootstrap)}, - {"_frozen_importlib_external", _Py_M__importlib__bootstrap_external, (int)sizeof(_Py_M__importlib__bootstrap_external), false, GET_CODE(importlib__bootstrap_external)}, - {"zipimport", _Py_M__zipimport, (int)sizeof(_Py_M__zipimport), false, GET_CODE(zipimport)}, + {"_frozen_importlib", _Py_M__importlib__bootstrap, (int)sizeof(_Py_M__importlib__bootstrap), false}, + {"_frozen_importlib_external", _Py_M__importlib__bootstrap_external, (int)sizeof(_Py_M__importlib__bootstrap_external), false}, + {"zipimport", _Py_M__zipimport, (int)sizeof(_Py_M__zipimport), false}, {0, 0, 0} /* bootstrap sentinel */ }; static const struct _frozen stdlib_modules[] = { /* stdlib - startup, without site (python -S) */ - {"abc", _Py_M__abc, (int)sizeof(_Py_M__abc), false, GET_CODE(abc)}, - {"codecs", _Py_M__codecs, (int)sizeof(_Py_M__codecs), false, GET_CODE(codecs)}, - {"io", _Py_M__io, (int)sizeof(_Py_M__io), false, GET_CODE(io)}, + {"abc", _Py_M__abc, (int)sizeof(_Py_M__abc), false}, + {"codecs", _Py_M__codecs, (int)sizeof(_Py_M__codecs), false}, + {"io", _Py_M__io, (int)sizeof(_Py_M__io), false}, /* stdlib - startup, with site */ - {"_collections_abc", _Py_M___collections_abc, (int)sizeof(_Py_M___collections_abc), false, GET_CODE(_collections_abc)}, - {"_sitebuiltins", _Py_M___sitebuiltins, (int)sizeof(_Py_M___sitebuiltins), false, GET_CODE(_sitebuiltins)}, - {"genericpath", _Py_M__genericpath, (int)sizeof(_Py_M__genericpath), false, GET_CODE(genericpath)}, - {"ntpath", _Py_M__ntpath, (int)sizeof(_Py_M__ntpath), false, GET_CODE(ntpath)}, - {"posixpath", _Py_M__posixpath, (int)sizeof(_Py_M__posixpath), false, GET_CODE(posixpath)}, - {"os.path", _Py_M__posixpath, (int)sizeof(_Py_M__posixpath), false, GET_CODE(posixpath)}, - {"os", _Py_M__os, (int)sizeof(_Py_M__os), false, GET_CODE(os)}, - {"site", _Py_M__site, (int)sizeof(_Py_M__site), false, GET_CODE(site)}, - {"stat", _Py_M__stat, (int)sizeof(_Py_M__stat), false, GET_CODE(stat)}, + {"_collections_abc", _Py_M___collections_abc, (int)sizeof(_Py_M___collections_abc), false}, + {"_sitebuiltins", _Py_M___sitebuiltins, (int)sizeof(_Py_M___sitebuiltins), false}, + {"genericpath", _Py_M__genericpath, (int)sizeof(_Py_M__genericpath), false}, + {"ntpath", _Py_M__ntpath, (int)sizeof(_Py_M__ntpath), false}, + {"posixpath", _Py_M__posixpath, (int)sizeof(_Py_M__posixpath), false}, + {"os.path", _Py_M__posixpath, (int)sizeof(_Py_M__posixpath), false}, + {"os", _Py_M__os, (int)sizeof(_Py_M__os), false}, + {"site", _Py_M__site, (int)sizeof(_Py_M__site), false}, + {"stat", _Py_M__stat, (int)sizeof(_Py_M__stat), false}, /* runpy - run module with -m */ - {"importlib.util", _Py_M__importlib_util, (int)sizeof(_Py_M__importlib_util), false, GET_CODE(importlib_util)}, - {"importlib.machinery", _Py_M__importlib_machinery, (int)sizeof(_Py_M__importlib_machinery), false, GET_CODE(importlib_machinery)}, - {"runpy", _Py_M__runpy, (int)sizeof(_Py_M__runpy), false, GET_CODE(runpy)}, + {"importlib.util", _Py_M__importlib_util, (int)sizeof(_Py_M__importlib_util), false}, + {"importlib.machinery", _Py_M__importlib_machinery, (int)sizeof(_Py_M__importlib_machinery), false}, + {"runpy", _Py_M__runpy, (int)sizeof(_Py_M__runpy), false}, {0, 0, 0} /* stdlib sentinel */ }; static const struct _frozen test_modules[] = { - {"__hello__", _Py_M____hello__, (int)sizeof(_Py_M____hello__), false, GET_CODE(__hello__)}, - {"__hello_alias__", _Py_M____hello__, (int)sizeof(_Py_M____hello__), false, GET_CODE(__hello__)}, - {"__phello_alias__", _Py_M____hello__, (int)sizeof(_Py_M____hello__), true, GET_CODE(__hello__)}, - {"__phello_alias__.spam", _Py_M____hello__, (int)sizeof(_Py_M____hello__), false, GET_CODE(__hello__)}, - {"__phello__", _Py_M____phello__, (int)sizeof(_Py_M____phello__), true, GET_CODE(__phello__)}, - {"__phello__.__init__", _Py_M____phello__, (int)sizeof(_Py_M____phello__), false, GET_CODE(__phello__)}, - {"__phello__.ham", _Py_M____phello___ham, (int)sizeof(_Py_M____phello___ham), true, GET_CODE(__phello___ham)}, - {"__phello__.ham.__init__", _Py_M____phello___ham, (int)sizeof(_Py_M____phello___ham), false, GET_CODE(__phello___ham)}, - {"__phello__.ham.eggs", _Py_M____phello___ham_eggs, (int)sizeof(_Py_M____phello___ham_eggs), false, GET_CODE(__phello___ham_eggs)}, - {"__phello__.spam", _Py_M____phello___spam, (int)sizeof(_Py_M____phello___spam), false, GET_CODE(__phello___spam)}, - {"__hello_only__", _Py_M__frozen_only, (int)sizeof(_Py_M__frozen_only), false, GET_CODE(frozen_only)}, + {"__hello__", _Py_M____hello__, (int)sizeof(_Py_M____hello__), false}, + {"__hello_alias__", _Py_M____hello__, (int)sizeof(_Py_M____hello__), false}, + {"__phello_alias__", _Py_M____hello__, (int)sizeof(_Py_M____hello__), true}, + {"__phello_alias__.spam", _Py_M____hello__, (int)sizeof(_Py_M____hello__), false}, + {"__phello__", _Py_M____phello__, (int)sizeof(_Py_M____phello__), true}, + {"__phello__.__init__", _Py_M____phello__, (int)sizeof(_Py_M____phello__), false}, + {"__phello__.ham", _Py_M____phello___ham, (int)sizeof(_Py_M____phello___ham), true}, + {"__phello__.ham.__init__", _Py_M____phello___ham, (int)sizeof(_Py_M____phello___ham), false}, + {"__phello__.ham.eggs", _Py_M____phello___ham_eggs, (int)sizeof(_Py_M____phello___ham_eggs), false}, + {"__phello__.spam", _Py_M____phello___spam, (int)sizeof(_Py_M____phello___spam), false}, + {"__hello_only__", _Py_M__frozen_only, (int)sizeof(_Py_M__frozen_only), false}, {0, 0, 0} /* test sentinel */ }; const struct _frozen *_PyImport_FrozenBootstrap = bootstrap_modules; diff --git a/Python/import.c b/Python/import.c index 48090d05240188..126eb5e162a9e1 100644 --- a/Python/import.c +++ b/Python/import.c @@ -2006,7 +2006,6 @@ look_up_frozen(const char *name) struct frozen_info { PyObject *nameobj; const char *data; - PyObject *(*get_code)(void); Py_ssize_t size; bool is_package; bool is_alias; @@ -2040,7 +2039,6 @@ find_frozen(PyObject *nameobj, struct frozen_info *info) if (info != NULL) { info->nameobj = nameobj; // borrowed info->data = (const char *)p->code; - info->get_code = p->get_code; info->size = p->size; info->is_package = p->is_package; if (p->size < 0) { @@ -2052,10 +2050,6 @@ find_frozen(PyObject *nameobj, struct frozen_info *info) info->is_alias = resolve_module_alias(name, _PyImport_FrozenAliases, &info->origname); } - if (p->code == NULL && p->size == 0 && p->get_code != NULL) { - /* It is only deepfrozen. */ - return FROZEN_OKAY; - } if (p->code == NULL) { /* It is frozen but marked as un-importable. */ return FROZEN_EXCLUDED; @@ -2070,11 +2064,6 @@ find_frozen(PyObject *nameobj, struct frozen_info *info) static PyObject * unmarshal_frozen_code(PyInterpreterState *interp, struct frozen_info *info) { - if (info->get_code && _Py_IsMainInterpreter(interp)) { - PyObject *code = info->get_code(); - assert(code != NULL); - return code; - } PyObject *co = PyMarshal_ReadObjectFromString(info->data, info->size); if (co == NULL) { /* Does not contain executable code. */ @@ -3567,7 +3556,7 @@ _imp_get_frozen_object_impl(PyObject *module, PyObject *name, if (info.nameobj == NULL) { info.nameobj = name; } - if (info.size == 0 && info.get_code == NULL) { + if (info.size == 0) { /* Does not contain executable code. */ set_frozen_error(FROZEN_INVALID, name); return NULL; diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 92eef6d50712bb..480001538540bb 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -832,11 +832,6 @@ pycore_interp_init(PyThreadState *tstate) if (_PyStatus_EXCEPTION(status)) { return status; } - // Intern strings in deep-frozen modules first so that others - // can use it instead of creating a heap allocated string. - if (_Py_Deepfreeze_Init() < 0) { - return _PyStatus_ERR("failed to initialize deep-frozen modules"); - } status = pycore_init_types(interp); if (_PyStatus_EXCEPTION(status)) { @@ -1743,7 +1738,6 @@ finalize_interp_clear(PyThreadState *tstate) _Py_HashRandomization_Fini(); _PyArg_Fini(); _Py_ClearFileSystemEncoding(); - _Py_Deepfreeze_Fini(); _PyPerfTrampoline_Fini(); } diff --git a/Python/pystate.c b/Python/pystate.c index b2b9b9f8776c33..ed14f82688f401 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -697,6 +697,7 @@ init_interpreter(PyInterpreterState *interp, interp->optimizer = &_PyOptimizer_Default; interp->optimizer_backedge_threshold = _PyOptimizer_Default.backedge_threshold; interp->optimizer_resume_threshold = _PyOptimizer_Default.backedge_threshold; + interp->next_func_version = 1; if (interp != &runtime->_main_interpreter) { /* Fix the self-referential, statically initialized fields. */ interp->dtoa = (struct _dtoa_state)_dtoa_state_INIT(interp); diff --git a/Tools/build/freeze_modules.py b/Tools/build/freeze_modules.py index 12200979fa4bc7..a07f4d9786ea65 100644 --- a/Tools/build/freeze_modules.py +++ b/Tools/build/freeze_modules.py @@ -467,15 +467,14 @@ def replace_block(lines, start_marker, end_marker, replacements, file): return lines[:start_pos + 1] + replacements + lines[end_pos:] -def regen_frozen(modules, frozen_modules: bool): +def regen_frozen(modules): headerlines = [] parentdir = os.path.dirname(FROZEN_FILE) - if frozen_modules: - for src in _iter_sources(modules): - # Adding a comment to separate sections here doesn't add much, - # so we don't. - header = relpath_for_posix_display(src.frozenfile, parentdir) - headerlines.append(f'#include "{header}"') + for src in _iter_sources(modules): + # Adding a comment to separate sections here doesn't add much, + # so we don't. + header = relpath_for_posix_display(src.frozenfile, parentdir) + headerlines.append(f'#include "{header}"') externlines = [] bootstraplines = [] @@ -504,14 +503,9 @@ def regen_frozen(modules, frozen_modules: bool): get_code_name = "_Py_get_%s_toplevel" % code_name externlines.append("extern PyObject *%s(void);" % get_code_name) - symbol = mod.symbol pkg = 'true' if mod.ispkg else 'false' - if not frozen_modules: - line = ('{"%s", NULL, 0, %s, GET_CODE(%s)},' - ) % (mod.name, pkg, code_name) - else: - line = ('{"%s", %s, (int)sizeof(%s), %s, GET_CODE(%s)},' - ) % (mod.name, symbol, symbol, pkg, code_name) + size = f"(int)sizeof({mod.symbol})" + line = f'{{"{mod.name}", {mod.symbol}, {size}, {pkg}}},' lines.append(line) if mod.isalias: @@ -718,20 +712,14 @@ def regen_pcbuild(modules): ####################################### # the script -parser = argparse.ArgumentParser() -parser.add_argument("--frozen-modules", action="store_true", - help="Use both frozen and deepfrozen modules. (default: uses only deepfrozen modules)") - def main(): - args = parser.parse_args() - frozen_modules: bool = args.frozen_modules # Expand the raw specs, preserving order. modules = list(parse_frozen_specs()) # Regen build-related files. regen_makefile(modules) regen_pcbuild(modules) - regen_frozen(modules, frozen_modules) + regen_frozen(modules) if __name__ == '__main__': From b0edf3b98e4b3e68a13776e034b9dd86ad7e529d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 8 Sep 2023 11:48:28 +0200 Subject: [PATCH 101/357] GH-91079: Rename C_RECURSION_LIMIT to Py_C_RECURSION_LIMIT (#108507) Symbols of the C API should be prefixed by "Py_" to avoid conflict with existing names in 3rd party C extensions on "#include ". test.pythoninfo now logs Py_C_RECURSION_LIMIT constant and other _testcapi and _testinternalcapi constants. --- Include/cpython/pystate.h | 19 +++++++++---------- Lib/test/list_tests.py | 4 ++-- Lib/test/mapping_tests.py | 4 ++-- Lib/test/pythoninfo.py | 23 +++++++++++++++++++++++ Lib/test/support/__init__.py | 4 ++-- Lib/test/test_compile.py | 12 ++++++------ Lib/test/test_dict.py | 4 ++-- Lib/test/test_dictviews.py | 4 ++-- Lib/test/test_exception_group.py | 4 ++-- Modules/_testcapimodule.c | 1 + Modules/_testinternalcapi.c | 5 +++++ Parser/asdl_c.py | 4 ++-- Python/Python-ast.c | 4 ++-- Python/ast.c | 4 ++-- Python/ast_opt.c | 4 ++-- Python/pystate.c | 2 +- Python/symtable.c | 4 ++-- 17 files changed, 67 insertions(+), 39 deletions(-) diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index fc5f58db86dbe8..e1a15cddd3d723 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -194,18 +194,17 @@ struct _ts { }; -/* WASI has limited call stack. Python's recursion limit depends on code - layout, optimization, and WASI runtime. Wasmtime can handle about 700 - recursions, sometimes less. 500 is a more conservative limit. */ -#ifndef C_RECURSION_LIMIT -# ifdef __wasi__ -# define C_RECURSION_LIMIT 500 -# else - // This value is duplicated in Lib/test/support/__init__.py -# define C_RECURSION_LIMIT 1500 -# endif +#ifdef __wasi__ + // WASI has limited call stack. Python's recursion limit depends on code + // layout, optimization, and WASI runtime. Wasmtime can handle about 700 + // recursions, sometimes less. 500 is a more conservative limit. +# define Py_C_RECURSION_LIMIT 500 +#else + // This value is duplicated in Lib/test/support/__init__.py +# define Py_C_RECURSION_LIMIT 1500 #endif + /* other API */ /* Similar to PyThreadState_Get(), but don't issue a fatal error diff --git a/Lib/test/list_tests.py b/Lib/test/list_tests.py index b1ef332522d2ce..d9ab21d4941cdb 100644 --- a/Lib/test/list_tests.py +++ b/Lib/test/list_tests.py @@ -6,7 +6,7 @@ from functools import cmp_to_key from test import seq_tests -from test.support import ALWAYS_EQ, NEVER_EQ, C_RECURSION_LIMIT +from test.support import ALWAYS_EQ, NEVER_EQ, Py_C_RECURSION_LIMIT class CommonTest(seq_tests.CommonTest): @@ -61,7 +61,7 @@ def test_repr(self): def test_repr_deep(self): a = self.type2test([]) - for i in range(C_RECURSION_LIMIT + 1): + for i in range(Py_C_RECURSION_LIMIT + 1): a = self.type2test([a]) self.assertRaises(RecursionError, repr, a) diff --git a/Lib/test/mapping_tests.py b/Lib/test/mapping_tests.py index 5492bbf86d1f87..b3e4192e65d957 100644 --- a/Lib/test/mapping_tests.py +++ b/Lib/test/mapping_tests.py @@ -2,7 +2,7 @@ import unittest import collections import sys -from test.support import C_RECURSION_LIMIT +from test.support import Py_C_RECURSION_LIMIT class BasicTestMappingProtocol(unittest.TestCase): @@ -625,7 +625,7 @@ def __repr__(self): def test_repr_deep(self): d = self._empty_mapping() - for i in range(C_RECURSION_LIMIT + 1): + for i in range(Py_C_RECURSION_LIMIT + 1): d0 = d d = self._empty_mapping() d[1] = d0 diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index c628833478044e..b25def78e42be4 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -665,6 +665,22 @@ def collect_decimal(info_add): def collect_testcapi(info_add): + try: + import _testcapi + except ImportError: + return + + for name in ( + 'LONG_MAX', # always 32-bit on Windows, 64-bit on 64-bit Unix + 'PY_SSIZE_T_MAX', + 'Py_C_RECURSION_LIMIT', + 'SIZEOF_TIME_T', # 32-bit or 64-bit depending on the platform + 'SIZEOF_WCHAR_T', # 16-bit or 32-bit depending on the platform + ): + copy_attr(info_add, f'_testcapi.{name}', _testcapi, name) + + +def collect_testinternalcapi(info_add): try: import _testinternalcapi except ImportError: @@ -672,6 +688,12 @@ def collect_testcapi(info_add): call_func(info_add, 'pymem.allocator', _testinternalcapi, 'pymem_getallocatorsname') + for name in ( + 'SIZEOF_PYGC_HEAD', + 'SIZEOF_PYOBJECT', + ): + copy_attr(info_add, f'_testinternalcapi.{name}', _testinternalcapi, name) + def collect_resource(info_add): try: @@ -907,6 +929,7 @@ def collect_info(info): collect_sys, collect_sysconfig, collect_testcapi, + collect_testinternalcapi, collect_time, collect_tkinter, collect_windows, diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 38ad965e155302..84b74ee2c298e9 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -60,7 +60,7 @@ "run_with_tz", "PGO", "missing_compiler_executable", "ALWAYS_EQ", "NEVER_EQ", "LARGEST", "SMALLEST", "LOOPBACK_TIMEOUT", "INTERNET_TIMEOUT", "SHORT_TIMEOUT", "LONG_TIMEOUT", - "Py_DEBUG", "EXCEEDS_RECURSION_LIMIT", "C_RECURSION_LIMIT", + "Py_DEBUG", "EXCEEDS_RECURSION_LIMIT", "Py_C_RECURSION_LIMIT", "skip_on_s390x", ] @@ -2531,7 +2531,7 @@ def adjust_int_max_str_digits(max_digits): EXCEEDS_RECURSION_LIMIT = 5000 # The default C recursion limit (from Include/cpython/pystate.h). -C_RECURSION_LIMIT = 1500 +Py_C_RECURSION_LIMIT = 1500 #Windows doesn't have os.uname() but it doesn't support s390x. skip_on_s390x = unittest.skipIf(hasattr(os, 'uname') and os.uname().machine == 's390x', diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index de513daf825d81..28b2c4686bbc89 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -11,7 +11,7 @@ import warnings from test import support from test.support import (script_helper, requires_debug_ranges, - requires_specialization, C_RECURSION_LIMIT) + requires_specialization, Py_C_RECURSION_LIMIT) from test.support.os_helper import FakePath class TestSpecifics(unittest.TestCase): @@ -111,7 +111,7 @@ def __getitem__(self, key): @unittest.skipIf(support.is_wasi, "exhausts limited stack on WASI") def test_extended_arg(self): - repeat = int(C_RECURSION_LIMIT * 0.9) + repeat = int(Py_C_RECURSION_LIMIT * 0.9) longexpr = 'x = x or ' + '-x' * repeat g = {} code = textwrap.dedent(''' @@ -557,12 +557,12 @@ def test_yet_more_evil_still_undecodable(self): @support.cpython_only @unittest.skipIf(support.is_wasi, "exhausts limited stack on WASI") def test_compiler_recursion_limit(self): - # Expected limit is C_RECURSION_LIMIT * 2 + # Expected limit is Py_C_RECURSION_LIMIT * 2 # Duplicating the limit here is a little ugly. # Perhaps it should be exposed somewhere... - fail_depth = C_RECURSION_LIMIT * 2 + 1 - crash_depth = C_RECURSION_LIMIT * 100 - success_depth = int(C_RECURSION_LIMIT * 1.8) + fail_depth = Py_C_RECURSION_LIMIT * 2 + 1 + crash_depth = Py_C_RECURSION_LIMIT * 100 + success_depth = int(Py_C_RECURSION_LIMIT * 1.8) def check_limit(prefix, repeated, mode="single"): expect_ok = prefix + repeated * success_depth diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index eab64b4f9106c1..620d0ca4f4c2da 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -8,7 +8,7 @@ import unittest import weakref from test import support -from test.support import import_helper, C_RECURSION_LIMIT +from test.support import import_helper, Py_C_RECURSION_LIMIT class DictTest(unittest.TestCase): @@ -596,7 +596,7 @@ def __repr__(self): def test_repr_deep(self): d = {} - for i in range(C_RECURSION_LIMIT + 1): + for i in range(Py_C_RECURSION_LIMIT + 1): d = {1: d} self.assertRaises(RecursionError, repr, d) diff --git a/Lib/test/test_dictviews.py b/Lib/test/test_dictviews.py index 2bd9d6eef8cfc6..34918585513846 100644 --- a/Lib/test/test_dictviews.py +++ b/Lib/test/test_dictviews.py @@ -3,7 +3,7 @@ import pickle import sys import unittest -from test.support import C_RECURSION_LIMIT +from test.support import Py_C_RECURSION_LIMIT class DictSetTest(unittest.TestCase): @@ -280,7 +280,7 @@ def test_recursive_repr(self): def test_deeply_nested_repr(self): d = {} - for i in range(C_RECURSION_LIMIT//2 + 100): + for i in range(Py_C_RECURSION_LIMIT//2 + 100): d = {42: d.values()} self.assertRaises(RecursionError, repr, d) diff --git a/Lib/test/test_exception_group.py b/Lib/test/test_exception_group.py index a02d54da35e948..20122679223843 100644 --- a/Lib/test/test_exception_group.py +++ b/Lib/test/test_exception_group.py @@ -1,7 +1,7 @@ import collections.abc import types import unittest -from test.support import C_RECURSION_LIMIT +from test.support import Py_C_RECURSION_LIMIT class TestExceptionGroupTypeHierarchy(unittest.TestCase): def test_exception_group_types(self): @@ -460,7 +460,7 @@ def test_basics_split_by_predicate__match(self): class DeepRecursionInSplitAndSubgroup(unittest.TestCase): def make_deep_eg(self): e = TypeError(1) - for i in range(C_RECURSION_LIMIT + 1): + for i in range(Py_C_RECURSION_LIMIT + 1): e = ExceptionGroup('eg', [e]) return e diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 9bd963baf066a4..85d8401435e1b5 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -3922,6 +3922,7 @@ PyInit__testcapi(void) PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type); PyModule_AddIntConstant(m, "the_number_three", 3); + PyModule_AddIntMacro(m, Py_C_RECURSION_LIMIT); TestError = PyErr_NewException("_testcapi.error", NULL, NULL); Py_INCREF(TestError); diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index b6792e38fa98c2..922672d1a9f915 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -1552,6 +1552,11 @@ module_exec(PyObject *module) return 1; } + if (PyModule_Add(module, "SIZEOF_PYOBJECT", + PyLong_FromSsize_t(sizeof(PyObject))) < 0) { + return 1; + } + if (PyModule_Add(module, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t))) < 0) { return 1; diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index ca259c8cd1f3ba..f61099b97055ad 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1401,8 +1401,8 @@ class PartingShots(StaticVisitor): if (!tstate) { return 0; } - state->recursion_limit = C_RECURSION_LIMIT * COMPILER_STACK_FRAME_SCALE; - int recursion_depth = C_RECURSION_LIMIT - tstate->c_recursion_remaining; + state->recursion_limit = Py_C_RECURSION_LIMIT * COMPILER_STACK_FRAME_SCALE; + int recursion_depth = Py_C_RECURSION_LIMIT - tstate->c_recursion_remaining; starting_recursion_depth = recursion_depth * COMPILER_STACK_FRAME_SCALE; state->recursion_depth = starting_recursion_depth; diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 77b23f7c5edf23..a197d44868b5aa 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -13081,8 +13081,8 @@ PyObject* PyAST_mod2obj(mod_ty t) if (!tstate) { return 0; } - state->recursion_limit = C_RECURSION_LIMIT * COMPILER_STACK_FRAME_SCALE; - int recursion_depth = C_RECURSION_LIMIT - tstate->c_recursion_remaining; + state->recursion_limit = Py_C_RECURSION_LIMIT * COMPILER_STACK_FRAME_SCALE; + int recursion_depth = Py_C_RECURSION_LIMIT - tstate->c_recursion_remaining; starting_recursion_depth = recursion_depth * COMPILER_STACK_FRAME_SCALE; state->recursion_depth = starting_recursion_depth; diff --git a/Python/ast.c b/Python/ast.c index 74c97f948d15e6..21cb38f8cbfb65 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -1046,10 +1046,10 @@ _PyAST_Validate(mod_ty mod) return 0; } /* Be careful here to prevent overflow. */ - int recursion_depth = C_RECURSION_LIMIT - tstate->c_recursion_remaining; + int recursion_depth = Py_C_RECURSION_LIMIT - tstate->c_recursion_remaining; starting_recursion_depth = recursion_depth * COMPILER_STACK_FRAME_SCALE; state.recursion_depth = starting_recursion_depth; - state.recursion_limit = C_RECURSION_LIMIT * COMPILER_STACK_FRAME_SCALE; + state.recursion_limit = Py_C_RECURSION_LIMIT * COMPILER_STACK_FRAME_SCALE; switch (mod->kind) { case Module_kind: diff --git a/Python/ast_opt.c b/Python/ast_opt.c index 82e7559e5b629a..41f48eba08afc4 100644 --- a/Python/ast_opt.c +++ b/Python/ast_opt.c @@ -1130,10 +1130,10 @@ _PyAST_Optimize(mod_ty mod, PyArena *arena, int optimize, int ff_features) return 0; } /* Be careful here to prevent overflow. */ - int recursion_depth = C_RECURSION_LIMIT - tstate->c_recursion_remaining; + int recursion_depth = Py_C_RECURSION_LIMIT - tstate->c_recursion_remaining; starting_recursion_depth = recursion_depth * COMPILER_STACK_FRAME_SCALE; state.recursion_depth = starting_recursion_depth; - state.recursion_limit = C_RECURSION_LIMIT * COMPILER_STACK_FRAME_SCALE; + state.recursion_limit = Py_C_RECURSION_LIMIT * COMPILER_STACK_FRAME_SCALE; int ret = astfold_mod(mod, arena, &state); assert(ret || PyErr_Occurred()); diff --git a/Python/pystate.c b/Python/pystate.c index ed14f82688f401..89275fd7e025ca 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1334,7 +1334,7 @@ init_threadstate(PyThreadState *tstate, tstate->py_recursion_limit = interp->ceval.recursion_limit, tstate->py_recursion_remaining = interp->ceval.recursion_limit, - tstate->c_recursion_remaining = C_RECURSION_LIMIT; + tstate->c_recursion_remaining = Py_C_RECURSION_LIMIT; tstate->exc_info = &tstate->exc_state; diff --git a/Python/symtable.c b/Python/symtable.c index f157d4c170314a..217e6f59a61484 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -312,10 +312,10 @@ _PySymtable_Build(mod_ty mod, PyObject *filename, PyFutureFeatures *future) return NULL; } /* Be careful here to prevent overflow. */ - int recursion_depth = C_RECURSION_LIMIT - tstate->c_recursion_remaining; + int recursion_depth = Py_C_RECURSION_LIMIT - tstate->c_recursion_remaining; starting_recursion_depth = recursion_depth * COMPILER_STACK_FRAME_SCALE; st->recursion_depth = starting_recursion_depth; - st->recursion_limit = C_RECURSION_LIMIT * COMPILER_STACK_FRAME_SCALE; + st->recursion_limit = Py_C_RECURSION_LIMIT * COMPILER_STACK_FRAME_SCALE; /* Make the initial symbol information gathering pass */ if (!symtable_enter_block(st, &_Py_ID(top), ModuleBlock, (void *)mod, 0, 0, 0, 0)) { From f63d37877ad166041489a968233b57540f8456e8 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 8 Sep 2023 11:50:46 +0200 Subject: [PATCH 102/357] gh-104690: thread_run() checks for tstate dangling pointer (#109056) thread_run() of _threadmodule.c now calls _PyThreadState_CheckConsistency() to check if tstate is a dangling pointer when Python is built in debug mode. Rename ceval_gil.c is_tstate_valid() to _PyThreadState_CheckConsistency() to reuse it in _threadmodule.c. --- Include/internal/pycore_pystate.h | 4 ++++ Modules/_threadmodule.c | 7 +++++-- Python/ceval_gil.c | 26 ++++++++------------------ Python/pystate.c | 18 ++++++++++++++++++ 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index a30036aeb57e05..9c0e42e7bad06c 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -67,6 +67,10 @@ _Py_ThreadCanHandleSignals(PyInterpreterState *interp) extern _Py_thread_local PyThreadState *_Py_tss_tstate; #endif +#ifndef NDEBUG +extern int _PyThreadState_CheckConsistency(PyThreadState *tstate); +#endif + // Export for most shared extensions, used via _PyThreadState_GET() static // inline function. PyAPI_FUNC(PyThreadState *) _PyThreadState_GetCurrent(void); diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 49f34fcb9feb70..05bb49756c9303 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -1074,9 +1074,12 @@ static void thread_run(void *boot_raw) { struct bootstate *boot = (struct bootstate *) boot_raw; - PyThreadState *tstate; + PyThreadState *tstate = boot->tstate; + + // gh-104690: If Python is being finalized and PyInterpreterState_Delete() + // was called, tstate becomes a dangling pointer. + assert(_PyThreadState_CheckConsistency(tstate)); - tstate = boot->tstate; _PyThreadState_Bind(tstate); PyEval_AcquireThread(tstate); tstate->interp->threads.count++; diff --git a/Python/ceval_gil.c b/Python/ceval_gil.c index e53ffa76b1164b..cef5317b46bf8e 100644 --- a/Python/ceval_gil.c +++ b/Python/ceval_gil.c @@ -163,16 +163,6 @@ UNSIGNAL_ASYNC_EXC(PyInterpreterState *interp) COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); } -#ifndef NDEBUG -/* Ensure that tstate is valid */ -static int -is_tstate_valid(PyThreadState *tstate) -{ - assert(!_PyMem_IsPtrFreed(tstate)); - assert(!_PyMem_IsPtrFreed(tstate->interp)); - return 1; -} -#endif /* * Implementation of the Global Interpreter Lock (GIL). @@ -325,7 +315,7 @@ drop_gil(struct _ceval_state *ceval, PyThreadState *tstate) /* Not switched yet => wait */ if (((PyThreadState*)_Py_atomic_load_relaxed(&gil->last_holder)) == tstate) { - assert(is_tstate_valid(tstate)); + assert(_PyThreadState_CheckConsistency(tstate)); RESET_GIL_DROP_REQUEST(tstate->interp); /* NOTE: if COND_WAIT does not atomically start waiting when releasing the mutex, another thread can run through, take @@ -386,7 +376,7 @@ take_gil(PyThreadState *tstate) PyThread_exit_thread(); } - assert(is_tstate_valid(tstate)); + assert(_PyThreadState_CheckConsistency(tstate)); PyInterpreterState *interp = tstate->interp; struct _ceval_state *ceval = &interp->ceval; struct _gil_runtime_state *gil = ceval->gil; @@ -427,7 +417,7 @@ take_gil(PyThreadState *tstate) } PyThread_exit_thread(); } - assert(is_tstate_valid(tstate)); + assert(_PyThreadState_CheckConsistency(tstate)); SET_GIL_DROP_REQUEST(interp); drop_requested = 1; @@ -466,7 +456,7 @@ take_gil(PyThreadState *tstate) drop_gil(ceval, tstate); PyThread_exit_thread(); } - assert(is_tstate_valid(tstate)); + assert(_PyThreadState_CheckConsistency(tstate)); if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) { RESET_GIL_DROP_REQUEST(interp); @@ -679,7 +669,7 @@ PyEval_AcquireThread(PyThreadState *tstate) void PyEval_ReleaseThread(PyThreadState *tstate) { - assert(is_tstate_valid(tstate)); + assert(_PyThreadState_CheckConsistency(tstate)); PyThreadState *new_tstate = _PyThreadState_SwapNoGIL(NULL); if (new_tstate != tstate) { @@ -877,7 +867,7 @@ Py_AddPendingCall(int (*func)(void *), void *arg) static int handle_signals(PyThreadState *tstate) { - assert(is_tstate_valid(tstate)); + assert(_PyThreadState_CheckConsistency(tstate)); if (!_Py_ThreadCanHandleSignals(tstate->interp)) { return 0; } @@ -983,7 +973,7 @@ void _Py_FinishPendingCalls(PyThreadState *tstate) { assert(PyGILState_Check()); - assert(is_tstate_valid(tstate)); + assert(_PyThreadState_CheckConsistency(tstate)); if (make_pending_calls(tstate->interp) < 0) { PyObject *exc = _PyErr_GetRaisedException(tstate); @@ -1024,7 +1014,7 @@ Py_MakePendingCalls(void) assert(PyGILState_Check()); PyThreadState *tstate = _PyThreadState_GET(); - assert(is_tstate_valid(tstate)); + assert(_PyThreadState_CheckConsistency(tstate)); /* Only execute pending calls on the main thread. */ if (!_Py_IsMainThread() || !_Py_IsMainInterpreter(tstate->interp)) { diff --git a/Python/pystate.c b/Python/pystate.c index 89275fd7e025ca..09c3538ad7b872 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -2890,6 +2890,24 @@ _PyThreadState_PopFrame(PyThreadState *tstate, _PyInterpreterFrame * frame) } +#ifndef NDEBUG +// Check that a Python thread state valid. In practice, this function is used +// on a Python debug build to check if 'tstate' is a dangling pointer, if the +// PyThreadState memory has been freed. +// +// Usage: +// +// assert(_PyThreadState_CheckConsistency(tstate)); +int +_PyThreadState_CheckConsistency(PyThreadState *tstate) +{ + assert(!_PyMem_IsPtrFreed(tstate)); + assert(!_PyMem_IsPtrFreed(tstate->interp)); + return 1; +} +#endif + + #ifdef __cplusplus } #endif From aa51182320f3c391195eb7d5bd970867e63bd978 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Fri, 8 Sep 2023 09:30:28 -0600 Subject: [PATCH 103/357] gh-109140: Rename duplicated tests in `test_binascii` (#109141) --- Lib/test/test_binascii.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py index eb831b1a06fcb8..3d3e0746e9bfdf 100644 --- a/Lib/test/test_binascii.py +++ b/Lib/test/test_binascii.py @@ -233,7 +233,7 @@ def test_uu(self): binary=hypothesis.strategies.binary(), backtick=hypothesis.strategies.booleans(), ) - def test_hex_roundtrip(self, binary, backtick): + def test_b2a_roundtrip(self, binary, backtick): converted = binascii.b2a_uu(self.type2test(binary), backtick=backtick) restored = binascii.a2b_uu(self.type2test(converted)) self.assertConversion(binary, converted, restored, backtick=backtick) From 6275c67ea68645e5b296a80ea63b90707a0be792 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Fri, 8 Sep 2023 17:18:35 +0100 Subject: [PATCH 104/357] gh-106922: Fix error location for constructs with spaces and parentheses (#108959) --- Lib/test/test_traceback.py | 36 +++++++++++++++++++ Lib/traceback.py | 16 +++++++-- ...-09-05-20-52-17.gh-issue-108959.6z45Sy.rst | 2 ++ Python/traceback.c | 17 +++++++++ 4 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-05-20-52-17.gh-issue-108959.6z45Sy.rst diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 316ade2171e94f..be81082bb19472 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -596,6 +596,24 @@ def f_with_binary_operator(): result_lines = self.get_exception(f_with_binary_operator) self.assertEqual(result_lines, expected_error.splitlines()) + def test_caret_for_binary_operators_with_spaces_and_parenthesis(self): + def f_with_binary_operator(): + a = 1 + b = "" + return ( a ) + b + + lineno_f = f_with_binary_operator.__code__.co_firstlineno + expected_error = ( + 'Traceback (most recent call last):\n' + f' File "{__file__}", line {self.callable_line}, in get_exception\n' + ' callable()\n' + f' File "{__file__}", line {lineno_f+3}, in f_with_binary_operator\n' + ' return ( a ) + b\n' + ' ~~~~~~~~~~^~~\n' + ) + result_lines = self.get_exception(f_with_binary_operator) + self.assertEqual(result_lines, expected_error.splitlines()) + def test_caret_for_subscript(self): def f_with_subscript(): some_dict = {'x': {'y': None}} @@ -630,6 +648,24 @@ def f_with_subscript(): result_lines = self.get_exception(f_with_subscript) self.assertEqual(result_lines, expected_error.splitlines()) + def test_caret_for_subscript_with_spaces_and_parenthesis(self): + def f_with_binary_operator(): + a = [] + b = c = 1 + return b [ a ] + c + + lineno_f = f_with_binary_operator.__code__.co_firstlineno + expected_error = ( + 'Traceback (most recent call last):\n' + f' File "{__file__}", line {self.callable_line}, in get_exception\n' + ' callable()\n' + f' File "{__file__}", line {lineno_f+3}, in f_with_binary_operator\n' + ' return b [ a ] + c\n' + ' ~~~~~~^^^^^^^^^\n' + ) + result_lines = self.get_exception(f_with_binary_operator) + self.assertEqual(result_lines, expected_error.splitlines()) + def test_traceback_specialization_with_syntax_error(self): bytecode = compile("1 / 0 / 1 / 2\n", TESTFN, "exec") diff --git a/Lib/traceback.py b/Lib/traceback.py index 354754b9560a19..67941ff45988c2 100644 --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -608,11 +608,21 @@ def _extract_caret_anchors_from_line_segment(segment): and not operator_str[operator_offset + 1].isspace() ): right_anchor += 1 + + while left_anchor < len(segment) and ((ch := segment[left_anchor]).isspace() or ch in ")#"): + left_anchor += 1 + right_anchor += 1 return _Anchors(normalize(left_anchor), normalize(right_anchor)) case ast.Subscript(): - subscript_start = normalize(expr.value.end_col_offset) - subscript_end = normalize(expr.slice.end_col_offset + 1) - return _Anchors(subscript_start, subscript_end) + left_anchor = normalize(expr.value.end_col_offset) + right_anchor = normalize(expr.slice.end_col_offset + 1) + while left_anchor < len(segment) and ((ch := segment[left_anchor]).isspace() or ch != "["): + left_anchor += 1 + while right_anchor < len(segment) and ((ch := segment[right_anchor]).isspace() or ch != "]"): + right_anchor += 1 + if right_anchor < len(segment): + right_anchor += 1 + return _Anchors(left_anchor, right_anchor) return None diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-05-20-52-17.gh-issue-108959.6z45Sy.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-05-20-52-17.gh-issue-108959.6z45Sy.rst new file mode 100644 index 00000000000000..792bbc454f2b27 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-05-20-52-17.gh-issue-108959.6z45Sy.rst @@ -0,0 +1,2 @@ +Fix caret placement for error locations for subscript and binary operations +that involve non-semantic parentheses and spaces. Patch by Pablo Galindo diff --git a/Python/traceback.c b/Python/traceback.c index 2fcfa7ca56c140..a75b7833af4e05 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -616,6 +616,11 @@ extract_anchors_from_expr(const char *segment_str, expr_ty expr, Py_ssize_t *lef ++*right_anchor; } + // Keep going if the current char is not ')' + if (i+1 < right->col_offset && (segment_str[i] == ')')) { + continue; + } + // Set the error characters *primary_error_char = "~"; *secondary_error_char = "^"; @@ -626,6 +631,18 @@ extract_anchors_from_expr(const char *segment_str, expr_ty expr, Py_ssize_t *lef case Subscript_kind: { *left_anchor = expr->v.Subscript.value->end_col_offset; *right_anchor = expr->v.Subscript.slice->end_col_offset + 1; + Py_ssize_t str_len = strlen(segment_str); + + // Move right_anchor and left_anchor forward to the first non-whitespace character that is not ']' and '[' + while (*left_anchor < str_len && (IS_WHITESPACE(segment_str[*left_anchor]) || segment_str[*left_anchor] != '[')) { + ++*left_anchor; + } + while (*right_anchor < str_len && (IS_WHITESPACE(segment_str[*right_anchor]) || segment_str[*right_anchor] != ']')) { + ++*right_anchor; + } + if (*right_anchor < str_len){ + *right_anchor += 1; + } // Set the error characters *primary_error_char = "~"; From 52beebc856fedf507ac0eb9e45c2e2c9fed1e5b8 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 8 Sep 2023 12:23:58 -0400 Subject: [PATCH 105/357] gh-109136: Fix summarize_stats.py tool (#109137) --- Tools/scripts/summarize_stats.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/scripts/summarize_stats.py b/Tools/scripts/summarize_stats.py index 2d198506fb5c6c..55b67643977a00 100644 --- a/Tools/scripts/summarize_stats.py +++ b/Tools/scripts/summarize_stats.py @@ -430,7 +430,7 @@ def emit_comparative_specialization_overview(base_opcode_stats, base_total, head ) def get_stats_defines(): - stats_path = os.path.join(os.path.dirname(__file__), "../../Include/pystats.h") + stats_path = os.path.join(os.path.dirname(__file__), "../../Include/cpython/pystats.h") with open(stats_path) as stats_src: defines = parse_kinds(stats_src, prefix="EVAL_CALL") return defines From ccd48623d4860e730a16f3f252d67bfea8c1e905 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Fri, 8 Sep 2023 21:57:58 +0530 Subject: [PATCH 106/357] GH-109067: fix randomly failing `test_async_gen_asyncio_gc_aclose_09` test (#109142) Use `asyncio.sleep(0)` instead of short sleeps. --- Lib/test/test_asyncgen.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py index 4f00558770dafd..a49630112af510 100644 --- a/Lib/test/test_asyncgen.py +++ b/Lib/test/test_asyncgen.py @@ -1058,8 +1058,7 @@ async def gen(): while True: yield 1 finally: - await asyncio.sleep(0.01) - await asyncio.sleep(0.01) + await asyncio.sleep(0) DONE = 1 async def run(): @@ -1069,7 +1068,10 @@ async def run(): del g gc_collect() # For PyPy or other GCs. - await asyncio.sleep(0.1) + # Starts running the aclose task + await asyncio.sleep(0) + # For asyncio.sleep(0) in finally block + await asyncio.sleep(0) self.loop.run_until_complete(run()) self.assertEqual(DONE, 1) From 501f2dc527010a4fe17026b3f352d72b01228b6f Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Fri, 8 Sep 2023 17:54:45 +0100 Subject: [PATCH 107/357] GH-108614: Unbreak emscripten build (GH-109132) --- Include/internal/pycore_emscripten_signal.h | 1 + Python/bytecodes.c | 4 ++-- Python/emscripten_signal.c | 8 ++++---- Python/executor_cases.c.h | 4 ++-- Python/generated_cases.c.h | 4 ++-- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Include/internal/pycore_emscripten_signal.h b/Include/internal/pycore_emscripten_signal.h index d1bcb9a92c7726..754193e21dec5a 100644 --- a/Include/internal/pycore_emscripten_signal.h +++ b/Include/internal/pycore_emscripten_signal.h @@ -18,6 +18,7 @@ _Py_CheckEmscriptenSignalsPeriodically(void); #define _Py_CHECK_EMSCRIPTEN_SIGNALS_PERIODICALLY() _Py_CheckEmscriptenSignalsPeriodically() extern int Py_EMSCRIPTEN_SIGNAL_HANDLING; +extern int _Py_emscripten_signal_clock; #else diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 8820b52774671b..21069204cf8693 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -154,8 +154,8 @@ dummy_func( inst(RESUME_CHECK, (--)) { #if defined(__EMSCRIPTEN__) - DEOPT_IF(emscripten_signal_clock == 0, RESUME); - emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; + DEOPT_IF(_Py_emscripten_signal_clock == 0, RESUME); + _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; #endif /* Possibly combine these two checks */ DEOPT_IF(_PyFrame_GetCode(frame)->_co_instrumentation_version diff --git a/Python/emscripten_signal.c b/Python/emscripten_signal.c index 1a196385b8ce34..561b5b73cd6b70 100644 --- a/Python/emscripten_signal.c +++ b/Python/emscripten_signal.c @@ -39,16 +39,16 @@ _Py_CheckEmscriptenSignals(void) } #define PY_EMSCRIPTEN_SIGNAL_INTERVAL 50 -static int emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; +int _Py_emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; void _Py_CheckEmscriptenSignalsPeriodically(void) { - if (emscripten_signal_clock == 0) { - emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; + if (_Py_emscripten_signal_clock == 0) { + _Py_emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; _Py_CheckEmscriptenSignals(); } else if (Py_EMSCRIPTEN_SIGNAL_HANDLING) { - emscripten_signal_clock--; + _Py_emscripten_signal_clock--; } } diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index f4c526a5a8c0a2..fa7cb88e4a1e1f 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -9,8 +9,8 @@ case RESUME_CHECK: { #if defined(__EMSCRIPTEN__) - DEOPT_IF(emscripten_signal_clock == 0, RESUME); - emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; + DEOPT_IF(_Py_emscripten_signal_clock == 0, RESUME); + _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; #endif /* Possibly combine these two checks */ DEOPT_IF(_PyFrame_GetCode(frame)->_co_instrumentation_version diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 84f83db128ea50..136b36c8260cb5 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -28,8 +28,8 @@ TARGET(RESUME_CHECK) { #if defined(__EMSCRIPTEN__) - DEOPT_IF(emscripten_signal_clock == 0, RESUME); - emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; + DEOPT_IF(_Py_emscripten_signal_clock == 0, RESUME); + _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; #endif /* Possibly combine these two checks */ DEOPT_IF(_PyFrame_GetCode(frame)->_co_instrumentation_version From 87a7faf6b68c8076e640a9a1347a255f132d8382 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 8 Sep 2023 19:57:41 +0300 Subject: [PATCH 108/357] Check the result of PySet_Contains() for error in Python/symtable.c (GH-109146) --- Python/symtable.c | 72 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 15 deletions(-) diff --git a/Python/symtable.c b/Python/symtable.c index 217e6f59a61484..7eef6f7231c035 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -523,6 +523,7 @@ analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags, PyObject *bound, PyObject *local, PyObject *free, PyObject *global, PyObject *type_params, PySTEntryObject *class_entry) { + int contains; if (flags & DEF_GLOBAL) { if (flags & DEF_NONLOCAL) { PyErr_Format(PyExc_SyntaxError, @@ -543,14 +544,22 @@ analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags, "nonlocal declaration not allowed at module level"); return error_at_directive(ste, name); } - if (!PySet_Contains(bound, name)) { + contains = PySet_Contains(bound, name); + if (contains < 0) { + return 0; + } + if (!contains) { PyErr_Format(PyExc_SyntaxError, "no binding for nonlocal '%U' found", name); return error_at_directive(ste, name); } - if (PySet_Contains(type_params, name)) { + contains = PySet_Contains(type_params, name); + if (contains < 0) { + return 0; + } + if (contains) { PyErr_Format(PyExc_SyntaxError, "nonlocal binding not allowed for type parameter '%U'", name); @@ -599,17 +608,29 @@ analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags, Note that having a non-NULL bound implies that the block is nested. */ - if (bound && PySet_Contains(bound, name)) { - SET_SCOPE(scopes, name, FREE); - ste->ste_free = 1; - return PySet_Add(free, name) >= 0; + if (bound) { + contains = PySet_Contains(bound, name); + if (contains < 0) { + return 0; + } + if (contains) { + SET_SCOPE(scopes, name, FREE); + ste->ste_free = 1; + return PySet_Add(free, name) >= 0; + } } /* If a parent has a global statement, then call it global explicit? It could also be global implicit. */ - if (global && PySet_Contains(global, name)) { - SET_SCOPE(scopes, name, GLOBAL_IMPLICIT); - return 1; + if (global) { + contains = PySet_Contains(global, name); + if (contains < 0) { + return 0; + } + if (contains) { + SET_SCOPE(scopes, name, GLOBAL_IMPLICIT); + return 1; + } } if (ste->ste_nested) ste->ste_free = 1; @@ -712,8 +733,19 @@ analyze_cells(PyObject *scopes, PyObject *free, PyObject *inlined_cells) scope = PyLong_AS_LONG(v); if (scope != LOCAL) continue; - if (!PySet_Contains(free, name) && !PySet_Contains(inlined_cells, name)) - continue; + int contains = PySet_Contains(free, name); + if (contains < 0) { + goto error; + } + if (!contains) { + contains = PySet_Contains(inlined_cells, name); + if (contains < 0) { + goto error; + } + if (!contains) { + continue; + } + } /* Replace LOCAL with CELL for this name, and remove from free. It is safe to replace the value of name in the dict, because it will not cause a resize. @@ -764,7 +796,11 @@ update_symbols(PyObject *symbols, PyObject *scopes, long scope, flags; assert(PyLong_Check(v)); flags = PyLong_AS_LONG(v); - if (PySet_Contains(inlined_cells, name)) { + int contains = PySet_Contains(inlined_cells, name); + if (contains < 0) { + return 0; + } + if (contains) { flags |= DEF_COMP_CELL; } v_scope = PyDict_GetItemWithError(scopes, name); @@ -822,9 +858,15 @@ update_symbols(PyObject *symbols, PyObject *scopes, goto error; } /* Handle global symbol */ - if (bound && !PySet_Contains(bound, name)) { - Py_DECREF(name); - continue; /* it's a global */ + if (bound) { + int contains = PySet_Contains(bound, name); + if (contains < 0) { + goto error; + } + if (!contains) { + Py_DECREF(name); + continue; /* it's a global */ + } } /* Propagate new free symbol up the lexical stack */ if (PyDict_SetItem(symbols, name, v_free) < 0) { From 5bda2f637e1cfbca45a83aa6e22db25498064b27 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Fri, 8 Sep 2023 18:00:23 +0100 Subject: [PATCH 109/357] gh-109114: Relax the check for invalid lambdas inside f-strings to avoid false positives (#109121) --- Grammar/python.gram | 2 +- Lib/test/test_fstring.py | 4 + ...-09-08-01-50-41.gh-issue-109114.adqgtb.rst | 3 + Parser/parser.c | 2557 ++++++++--------- 4 files changed, 1257 insertions(+), 1309 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-08-01-50-41.gh-issue-109114.adqgtb.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index e7c817856d514b..ae998f98076a0a 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -1170,7 +1170,7 @@ invalid_expression: _PyPegen_check_legacy_stmt(p, a) ? NULL : p->tokens[p->mark-1]->level == 0 ? NULL : RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Perhaps you forgot a comma?") } | a=disjunction 'if' b=disjunction !('else'|':') { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "expected 'else' after 'if' expression") } - | a='lambda' [lambda_params] b=':' &(FSTRING_MIDDLE | fstring_replacement_field) { + | a='lambda' [lambda_params] b=':' &FSTRING_MIDDLE { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "f-string: lambda expressions are not allowed without parentheses") } invalid_named_expression(memo): diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 16f01973f99f3e..4f05a149a901b2 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -1027,6 +1027,10 @@ def test_lambda(self): "f'{lambda x:}'", "f'{lambda :}'", ]) + # Ensure the detection of invalid lambdas doesn't trigger detection + # for valid lambdas in the second error pass + with self.assertRaisesRegex(SyntaxError, "invalid syntax"): + compile("lambda name_3=f'{name_4}': {name_3}\n1 $ 1", "", "exec") # but don't emit the paren warning in general cases with self.assertRaisesRegex(SyntaxError, "f-string: expecting a valid expression after '{'"): diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-08-01-50-41.gh-issue-109114.adqgtb.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-08-01-50-41.gh-issue-109114.adqgtb.rst new file mode 100644 index 00000000000000..3d95dd5d29450c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-08-01-50-41.gh-issue-109114.adqgtb.rst @@ -0,0 +1,3 @@ +Relax the detection of the error message for invalid lambdas inside +f-strings to not search for arbitrary replacement fields to avoid false +positives. Patch by Pablo Galindo diff --git a/Parser/parser.c b/Parser/parser.c index 95cbef4a64a10f..e5847e7d1bd920 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -483,65 +483,65 @@ static char *soft_keywords[] = { #define _tmp_157_type 1400 #define _tmp_158_type 1401 #define _tmp_159_type 1402 -#define _tmp_160_type 1403 +#define _loop0_160_type 1403 #define _loop0_161_type 1404 #define _loop0_162_type 1405 -#define _loop0_163_type 1406 +#define _tmp_163_type 1406 #define _tmp_164_type 1407 #define _tmp_165_type 1408 #define _tmp_166_type 1409 #define _tmp_167_type 1410 -#define _tmp_168_type 1411 +#define _loop0_168_type 1411 #define _loop0_169_type 1412 #define _loop0_170_type 1413 -#define _loop0_171_type 1414 -#define _loop1_172_type 1415 -#define _tmp_173_type 1416 -#define _loop0_174_type 1417 -#define _tmp_175_type 1418 -#define _loop0_176_type 1419 -#define _loop1_177_type 1420 +#define _loop1_171_type 1414 +#define _tmp_172_type 1415 +#define _loop0_173_type 1416 +#define _tmp_174_type 1417 +#define _loop0_175_type 1418 +#define _loop1_176_type 1419 +#define _tmp_177_type 1420 #define _tmp_178_type 1421 #define _tmp_179_type 1422 -#define _tmp_180_type 1423 -#define _loop0_181_type 1424 +#define _loop0_180_type 1423 +#define _tmp_181_type 1424 #define _tmp_182_type 1425 -#define _tmp_183_type 1426 -#define _loop1_184_type 1427 -#define _tmp_185_type 1428 +#define _loop1_183_type 1426 +#define _tmp_184_type 1427 +#define _loop0_185_type 1428 #define _loop0_186_type 1429 #define _loop0_187_type 1430 -#define _loop0_188_type 1431 -#define _loop0_190_type 1432 -#define _gather_189_type 1433 -#define _tmp_191_type 1434 -#define _loop0_192_type 1435 -#define _tmp_193_type 1436 -#define _loop0_194_type 1437 +#define _loop0_189_type 1431 +#define _gather_188_type 1432 +#define _tmp_190_type 1433 +#define _loop0_191_type 1434 +#define _tmp_192_type 1435 +#define _loop0_193_type 1436 +#define _loop1_194_type 1437 #define _loop1_195_type 1438 -#define _loop1_196_type 1439 +#define _tmp_196_type 1439 #define _tmp_197_type 1440 -#define _tmp_198_type 1441 -#define _loop0_199_type 1442 +#define _loop0_198_type 1441 +#define _tmp_199_type 1442 #define _tmp_200_type 1443 #define _tmp_201_type 1444 -#define _tmp_202_type 1445 -#define _loop0_204_type 1446 -#define _gather_203_type 1447 -#define _loop0_206_type 1448 -#define _gather_205_type 1449 -#define _loop0_208_type 1450 -#define _gather_207_type 1451 -#define _loop0_210_type 1452 -#define _gather_209_type 1453 -#define _loop0_212_type 1454 -#define _gather_211_type 1455 -#define _tmp_213_type 1456 -#define _loop0_214_type 1457 -#define _loop1_215_type 1458 -#define _tmp_216_type 1459 -#define _loop0_217_type 1460 -#define _loop1_218_type 1461 +#define _loop0_203_type 1445 +#define _gather_202_type 1446 +#define _loop0_205_type 1447 +#define _gather_204_type 1448 +#define _loop0_207_type 1449 +#define _gather_206_type 1450 +#define _loop0_209_type 1451 +#define _gather_208_type 1452 +#define _loop0_211_type 1453 +#define _gather_210_type 1454 +#define _tmp_212_type 1455 +#define _loop0_213_type 1456 +#define _loop1_214_type 1457 +#define _tmp_215_type 1458 +#define _loop0_216_type 1459 +#define _loop1_217_type 1460 +#define _tmp_218_type 1461 #define _tmp_219_type 1462 #define _tmp_220_type 1463 #define _tmp_221_type 1464 @@ -551,9 +551,9 @@ static char *soft_keywords[] = { #define _tmp_225_type 1468 #define _tmp_226_type 1469 #define _tmp_227_type 1470 -#define _tmp_228_type 1471 -#define _loop0_230_type 1472 -#define _gather_229_type 1473 +#define _loop0_229_type 1471 +#define _gather_228_type 1472 +#define _tmp_230_type 1473 #define _tmp_231_type 1474 #define _tmp_232_type 1475 #define _tmp_233_type 1476 @@ -566,8 +566,8 @@ static char *soft_keywords[] = { #define _tmp_240_type 1483 #define _tmp_241_type 1484 #define _tmp_242_type 1485 -#define _tmp_243_type 1486 -#define _loop0_244_type 1487 +#define _loop0_243_type 1486 +#define _tmp_244_type 1487 #define _tmp_245_type 1488 #define _tmp_246_type 1489 #define _tmp_247_type 1490 @@ -599,7 +599,6 @@ static char *soft_keywords[] = { #define _tmp_273_type 1516 #define _tmp_274_type 1517 #define _tmp_275_type 1518 -#define _tmp_276_type 1519 static mod_ty file_rule(Parser *p); static mod_ty interactive_rule(Parser *p); @@ -1004,65 +1003,65 @@ static void *_tmp_156_rule(Parser *p); static void *_tmp_157_rule(Parser *p); static void *_tmp_158_rule(Parser *p); static void *_tmp_159_rule(Parser *p); -static void *_tmp_160_rule(Parser *p); +static asdl_seq *_loop0_160_rule(Parser *p); static asdl_seq *_loop0_161_rule(Parser *p); static asdl_seq *_loop0_162_rule(Parser *p); -static asdl_seq *_loop0_163_rule(Parser *p); +static void *_tmp_163_rule(Parser *p); static void *_tmp_164_rule(Parser *p); static void *_tmp_165_rule(Parser *p); static void *_tmp_166_rule(Parser *p); static void *_tmp_167_rule(Parser *p); -static void *_tmp_168_rule(Parser *p); +static asdl_seq *_loop0_168_rule(Parser *p); static asdl_seq *_loop0_169_rule(Parser *p); static asdl_seq *_loop0_170_rule(Parser *p); -static asdl_seq *_loop0_171_rule(Parser *p); -static asdl_seq *_loop1_172_rule(Parser *p); -static void *_tmp_173_rule(Parser *p); -static asdl_seq *_loop0_174_rule(Parser *p); -static void *_tmp_175_rule(Parser *p); -static asdl_seq *_loop0_176_rule(Parser *p); -static asdl_seq *_loop1_177_rule(Parser *p); +static asdl_seq *_loop1_171_rule(Parser *p); +static void *_tmp_172_rule(Parser *p); +static asdl_seq *_loop0_173_rule(Parser *p); +static void *_tmp_174_rule(Parser *p); +static asdl_seq *_loop0_175_rule(Parser *p); +static asdl_seq *_loop1_176_rule(Parser *p); +static void *_tmp_177_rule(Parser *p); static void *_tmp_178_rule(Parser *p); static void *_tmp_179_rule(Parser *p); -static void *_tmp_180_rule(Parser *p); -static asdl_seq *_loop0_181_rule(Parser *p); +static asdl_seq *_loop0_180_rule(Parser *p); +static void *_tmp_181_rule(Parser *p); static void *_tmp_182_rule(Parser *p); -static void *_tmp_183_rule(Parser *p); -static asdl_seq *_loop1_184_rule(Parser *p); -static void *_tmp_185_rule(Parser *p); +static asdl_seq *_loop1_183_rule(Parser *p); +static void *_tmp_184_rule(Parser *p); +static asdl_seq *_loop0_185_rule(Parser *p); static asdl_seq *_loop0_186_rule(Parser *p); static asdl_seq *_loop0_187_rule(Parser *p); -static asdl_seq *_loop0_188_rule(Parser *p); -static asdl_seq *_loop0_190_rule(Parser *p); -static asdl_seq *_gather_189_rule(Parser *p); -static void *_tmp_191_rule(Parser *p); -static asdl_seq *_loop0_192_rule(Parser *p); -static void *_tmp_193_rule(Parser *p); -static asdl_seq *_loop0_194_rule(Parser *p); +static asdl_seq *_loop0_189_rule(Parser *p); +static asdl_seq *_gather_188_rule(Parser *p); +static void *_tmp_190_rule(Parser *p); +static asdl_seq *_loop0_191_rule(Parser *p); +static void *_tmp_192_rule(Parser *p); +static asdl_seq *_loop0_193_rule(Parser *p); +static asdl_seq *_loop1_194_rule(Parser *p); static asdl_seq *_loop1_195_rule(Parser *p); -static asdl_seq *_loop1_196_rule(Parser *p); +static void *_tmp_196_rule(Parser *p); static void *_tmp_197_rule(Parser *p); -static void *_tmp_198_rule(Parser *p); -static asdl_seq *_loop0_199_rule(Parser *p); +static asdl_seq *_loop0_198_rule(Parser *p); +static void *_tmp_199_rule(Parser *p); static void *_tmp_200_rule(Parser *p); static void *_tmp_201_rule(Parser *p); -static void *_tmp_202_rule(Parser *p); -static asdl_seq *_loop0_204_rule(Parser *p); -static asdl_seq *_gather_203_rule(Parser *p); -static asdl_seq *_loop0_206_rule(Parser *p); -static asdl_seq *_gather_205_rule(Parser *p); -static asdl_seq *_loop0_208_rule(Parser *p); -static asdl_seq *_gather_207_rule(Parser *p); -static asdl_seq *_loop0_210_rule(Parser *p); -static asdl_seq *_gather_209_rule(Parser *p); -static asdl_seq *_loop0_212_rule(Parser *p); -static asdl_seq *_gather_211_rule(Parser *p); -static void *_tmp_213_rule(Parser *p); -static asdl_seq *_loop0_214_rule(Parser *p); -static asdl_seq *_loop1_215_rule(Parser *p); -static void *_tmp_216_rule(Parser *p); -static asdl_seq *_loop0_217_rule(Parser *p); -static asdl_seq *_loop1_218_rule(Parser *p); +static asdl_seq *_loop0_203_rule(Parser *p); +static asdl_seq *_gather_202_rule(Parser *p); +static asdl_seq *_loop0_205_rule(Parser *p); +static asdl_seq *_gather_204_rule(Parser *p); +static asdl_seq *_loop0_207_rule(Parser *p); +static asdl_seq *_gather_206_rule(Parser *p); +static asdl_seq *_loop0_209_rule(Parser *p); +static asdl_seq *_gather_208_rule(Parser *p); +static asdl_seq *_loop0_211_rule(Parser *p); +static asdl_seq *_gather_210_rule(Parser *p); +static void *_tmp_212_rule(Parser *p); +static asdl_seq *_loop0_213_rule(Parser *p); +static asdl_seq *_loop1_214_rule(Parser *p); +static void *_tmp_215_rule(Parser *p); +static asdl_seq *_loop0_216_rule(Parser *p); +static asdl_seq *_loop1_217_rule(Parser *p); +static void *_tmp_218_rule(Parser *p); static void *_tmp_219_rule(Parser *p); static void *_tmp_220_rule(Parser *p); static void *_tmp_221_rule(Parser *p); @@ -1072,9 +1071,9 @@ static void *_tmp_224_rule(Parser *p); static void *_tmp_225_rule(Parser *p); static void *_tmp_226_rule(Parser *p); static void *_tmp_227_rule(Parser *p); -static void *_tmp_228_rule(Parser *p); -static asdl_seq *_loop0_230_rule(Parser *p); -static asdl_seq *_gather_229_rule(Parser *p); +static asdl_seq *_loop0_229_rule(Parser *p); +static asdl_seq *_gather_228_rule(Parser *p); +static void *_tmp_230_rule(Parser *p); static void *_tmp_231_rule(Parser *p); static void *_tmp_232_rule(Parser *p); static void *_tmp_233_rule(Parser *p); @@ -1087,8 +1086,8 @@ static void *_tmp_239_rule(Parser *p); static void *_tmp_240_rule(Parser *p); static void *_tmp_241_rule(Parser *p); static void *_tmp_242_rule(Parser *p); -static void *_tmp_243_rule(Parser *p); -static asdl_seq *_loop0_244_rule(Parser *p); +static asdl_seq *_loop0_243_rule(Parser *p); +static void *_tmp_244_rule(Parser *p); static void *_tmp_245_rule(Parser *p); static void *_tmp_246_rule(Parser *p); static void *_tmp_247_rule(Parser *p); @@ -1120,7 +1119,6 @@ static void *_tmp_272_rule(Parser *p); static void *_tmp_273_rule(Parser *p); static void *_tmp_274_rule(Parser *p); static void *_tmp_275_rule(Parser *p); -static void *_tmp_276_rule(Parser *p); // file: statements? $ @@ -20276,7 +20274,7 @@ invalid_legacy_expression_rule(Parser *p) // invalid_expression: // | !(NAME STRING | SOFT_KEYWORD) disjunction expression_without_invalid // | disjunction 'if' disjunction !('else' | ':') -// | 'lambda' lambda_params? ':' &(FSTRING_MIDDLE | fstring_replacement_field) +// | 'lambda' lambda_params? ':' &FSTRING_MIDDLE static void * invalid_expression_rule(Parser *p) { @@ -20350,12 +20348,12 @@ invalid_expression_rule(Parser *p) D(fprintf(stderr, "%*c%s invalid_expression[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "disjunction 'if' disjunction !('else' | ':')")); } - { // 'lambda' lambda_params? ':' &(FSTRING_MIDDLE | fstring_replacement_field) + { // 'lambda' lambda_params? ':' &FSTRING_MIDDLE if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> invalid_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'lambda' lambda_params? ':' &(FSTRING_MIDDLE | fstring_replacement_field)")); + D(fprintf(stderr, "%*c> invalid_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'lambda' lambda_params? ':' &FSTRING_MIDDLE")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings Token * a; @@ -20367,10 +20365,10 @@ invalid_expression_rule(Parser *p) && (b = _PyPegen_expect_token(p, 11)) // token=':' && - _PyPegen_lookahead(1, _tmp_157_rule, p) + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, FSTRING_MIDDLE) // token=FSTRING_MIDDLE ) { - D(fprintf(stderr, "%*c+ invalid_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'lambda' lambda_params? ':' &(FSTRING_MIDDLE | fstring_replacement_field)")); + D(fprintf(stderr, "%*c+ invalid_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'lambda' lambda_params? ':' &FSTRING_MIDDLE")); _res = RAISE_SYNTAX_ERROR_KNOWN_RANGE ( a , b , "f-string: lambda expressions are not allowed without parentheses" ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -20381,7 +20379,7 @@ invalid_expression_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s invalid_expression[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'lambda' lambda_params? ':' &(FSTRING_MIDDLE | fstring_replacement_field)")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'lambda' lambda_params? ':' &FSTRING_MIDDLE")); } _res = NULL; done: @@ -20455,7 +20453,7 @@ invalid_named_expression_rule(Parser *p) && (b = bitwise_or_rule(p)) // bitwise_or && - _PyPegen_lookahead(0, _tmp_158_rule, p) + _PyPegen_lookahead(0, _tmp_157_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '=' bitwise_or !('=' | ':=')")); @@ -20481,7 +20479,7 @@ invalid_named_expression_rule(Parser *p) Token * b; expr_ty bitwise_or_var; if ( - _PyPegen_lookahead(0, _tmp_159_rule, p) + _PyPegen_lookahead(0, _tmp_158_rule, p) && (a = bitwise_or_rule(p)) // bitwise_or && @@ -20489,7 +20487,7 @@ invalid_named_expression_rule(Parser *p) && (bitwise_or_var = bitwise_or_rule(p)) // bitwise_or && - _PyPegen_lookahead(0, _tmp_160_rule, p) + _PyPegen_lookahead(0, _tmp_159_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!(list | tuple | genexp | 'True' | 'None' | 'False') bitwise_or '=' bitwise_or !('=' | ':=')")); @@ -20569,7 +20567,7 @@ invalid_assignment_rule(Parser *p) D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions* ':' expression")); Token * _literal; Token * _literal_1; - asdl_seq * _loop0_161_var; + asdl_seq * _loop0_160_var; expr_ty a; expr_ty expression_var; if ( @@ -20577,7 +20575,7 @@ invalid_assignment_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_loop0_161_var = _loop0_161_rule(p)) // star_named_expressions* + (_loop0_160_var = _loop0_160_rule(p)) // star_named_expressions* && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -20634,10 +20632,10 @@ invalid_assignment_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* star_expressions '='")); Token * _literal; - asdl_seq * _loop0_162_var; + asdl_seq * _loop0_161_var; expr_ty a; if ( - (_loop0_162_var = _loop0_162_rule(p)) // ((star_targets '='))* + (_loop0_161_var = _loop0_161_rule(p)) // ((star_targets '='))* && (a = star_expressions_rule(p)) // star_expressions && @@ -20664,10 +20662,10 @@ invalid_assignment_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* yield_expr '='")); Token * _literal; - asdl_seq * _loop0_163_var; + asdl_seq * _loop0_162_var; expr_ty a; if ( - (_loop0_163_var = _loop0_163_rule(p)) // ((star_targets '='))* + (_loop0_162_var = _loop0_162_rule(p)) // ((star_targets '='))* && (a = yield_expr_rule(p)) // yield_expr && @@ -20693,7 +20691,7 @@ invalid_assignment_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); - void *_tmp_164_var; + void *_tmp_163_var; expr_ty a; AugOperator* augassign_var; if ( @@ -20701,7 +20699,7 @@ invalid_assignment_rule(Parser *p) && (augassign_var = augassign_rule(p)) // augassign && - (_tmp_164_var = _tmp_164_rule(p)) // yield_expr | star_expressions + (_tmp_163_var = _tmp_163_rule(p)) // yield_expr | star_expressions ) { D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); @@ -20923,11 +20921,11 @@ invalid_comprehension_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '(' | '{') starred_expression for_if_clauses")); - void *_tmp_165_var; + void *_tmp_164_var; expr_ty a; asdl_comprehension_seq* for_if_clauses_var; if ( - (_tmp_165_var = _tmp_165_rule(p)) // '[' | '(' | '{' + (_tmp_164_var = _tmp_164_rule(p)) // '[' | '(' | '{' && (a = starred_expression_rule(p)) // starred_expression && @@ -20954,12 +20952,12 @@ invalid_comprehension_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions for_if_clauses")); Token * _literal; - void *_tmp_166_var; + void *_tmp_165_var; expr_ty a; asdl_expr_seq* b; asdl_comprehension_seq* for_if_clauses_var; if ( - (_tmp_166_var = _tmp_166_rule(p)) // '[' | '{' + (_tmp_165_var = _tmp_165_rule(p)) // '[' | '{' && (a = star_named_expression_rule(p)) // star_named_expression && @@ -20989,12 +20987,12 @@ invalid_comprehension_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' for_if_clauses")); - void *_tmp_167_var; + void *_tmp_166_var; expr_ty a; Token * b; asdl_comprehension_seq* for_if_clauses_var; if ( - (_tmp_167_var = _tmp_167_rule(p)) // '[' | '{' + (_tmp_166_var = _tmp_166_rule(p)) // '[' | '{' && (a = star_named_expression_rule(p)) // star_named_expression && @@ -21129,13 +21127,13 @@ invalid_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(slash_no_default | slash_with_default) param_maybe_default* '/'")); - asdl_seq * _loop0_169_var; - void *_tmp_168_var; + asdl_seq * _loop0_168_var; + void *_tmp_167_var; Token * a; if ( - (_tmp_168_var = _tmp_168_rule(p)) // slash_no_default | slash_with_default + (_tmp_167_var = _tmp_167_rule(p)) // slash_no_default | slash_with_default && - (_loop0_169_var = _loop0_169_rule(p)) // param_maybe_default* + (_loop0_168_var = _loop0_168_rule(p)) // param_maybe_default* && (a = _PyPegen_expect_token(p, 17)) // token='/' ) @@ -21159,7 +21157,7 @@ invalid_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default? param_no_default* invalid_parameters_helper param_no_default")); - asdl_seq * _loop0_170_var; + asdl_seq * _loop0_169_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings arg_ty a; @@ -21167,7 +21165,7 @@ invalid_parameters_rule(Parser *p) if ( (_opt_var = slash_no_default_rule(p), !p->error_indicator) // slash_no_default? && - (_loop0_170_var = _loop0_170_rule(p)) // param_no_default* + (_loop0_169_var = _loop0_169_rule(p)) // param_no_default* && (invalid_parameters_helper_var = invalid_parameters_helper_rule(p)) // invalid_parameters_helper && @@ -21193,18 +21191,18 @@ invalid_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default* '(' param_no_default+ ','? ')'")); - asdl_seq * _loop0_171_var; - asdl_seq * _loop1_172_var; + asdl_seq * _loop0_170_var; + asdl_seq * _loop1_171_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings Token * a; Token * b; if ( - (_loop0_171_var = _loop0_171_rule(p)) // param_no_default* + (_loop0_170_var = _loop0_170_rule(p)) // param_no_default* && (a = _PyPegen_expect_token(p, 7)) // token='(' && - (_loop1_172_var = _loop1_172_rule(p)) // param_no_default+ + (_loop1_171_var = _loop1_171_rule(p)) // param_no_default+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -21231,22 +21229,22 @@ invalid_parameters_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "[(slash_no_default | slash_with_default)] param_maybe_default* '*' (',' | param_no_default) param_maybe_default* '/'")); Token * _literal; - asdl_seq * _loop0_174_var; - asdl_seq * _loop0_176_var; + asdl_seq * _loop0_173_var; + asdl_seq * _loop0_175_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - void *_tmp_175_var; + void *_tmp_174_var; Token * a; if ( - (_opt_var = _tmp_173_rule(p), !p->error_indicator) // [(slash_no_default | slash_with_default)] + (_opt_var = _tmp_172_rule(p), !p->error_indicator) // [(slash_no_default | slash_with_default)] && - (_loop0_174_var = _loop0_174_rule(p)) // param_maybe_default* + (_loop0_173_var = _loop0_173_rule(p)) // param_maybe_default* && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_175_var = _tmp_175_rule(p)) // ',' | param_no_default + (_tmp_174_var = _tmp_174_rule(p)) // ',' | param_no_default && - (_loop0_176_var = _loop0_176_rule(p)) // param_maybe_default* + (_loop0_175_var = _loop0_175_rule(p)) // param_maybe_default* && (a = _PyPegen_expect_token(p, 17)) // token='/' ) @@ -21271,10 +21269,10 @@ invalid_parameters_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default+ '/' '*'")); Token * _literal; - asdl_seq * _loop1_177_var; + asdl_seq * _loop1_176_var; Token * a; if ( - (_loop1_177_var = _loop1_177_rule(p)) // param_maybe_default+ + (_loop1_176_var = _loop1_176_rule(p)) // param_maybe_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -21323,7 +21321,7 @@ invalid_default_rule(Parser *p) if ( (a = _PyPegen_expect_token(p, 22)) // token='=' && - _PyPegen_lookahead(1, _tmp_178_rule, p) + _PyPegen_lookahead(1, _tmp_177_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' &(')' | ',')")); @@ -21368,12 +21366,12 @@ invalid_star_etc_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); - void *_tmp_179_var; + void *_tmp_178_var; Token * a; if ( (a = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_179_var = _tmp_179_rule(p)) // ')' | ',' (')' | '**') + (_tmp_178_var = _tmp_178_rule(p)) // ')' | ',' (')' | '**') ) { D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); @@ -21456,20 +21454,20 @@ invalid_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (param_no_default | ',') param_maybe_default* '*' (param_no_default | ',')")); Token * _literal; - asdl_seq * _loop0_181_var; - void *_tmp_180_var; - void *_tmp_182_var; + asdl_seq * _loop0_180_var; + void *_tmp_179_var; + void *_tmp_181_var; Token * a; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_180_var = _tmp_180_rule(p)) // param_no_default | ',' + (_tmp_179_var = _tmp_179_rule(p)) // param_no_default | ',' && - (_loop0_181_var = _loop0_181_rule(p)) // param_maybe_default* + (_loop0_180_var = _loop0_180_rule(p)) // param_maybe_default* && (a = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_182_var = _tmp_182_rule(p)) // param_no_default | ',' + (_tmp_181_var = _tmp_181_rule(p)) // param_no_default | ',' ) { D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (param_no_default | ',') param_maybe_default* '*' (param_no_default | ',')")); @@ -21584,7 +21582,7 @@ invalid_kwds_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' && - (a = (Token*)_tmp_183_rule(p)) // '*' | '**' | '/' + (a = (Token*)_tmp_182_rule(p)) // '*' | '**' | '/' ) { D(fprintf(stderr, "%*c+ invalid_kwds[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' param ',' ('*' | '**' | '/')")); @@ -21649,13 +21647,13 @@ invalid_parameters_helper_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters_helper[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default+")); - asdl_seq * _loop1_184_var; + asdl_seq * _loop1_183_var; if ( - (_loop1_184_var = _loop1_184_rule(p)) // param_with_default+ + (_loop1_183_var = _loop1_183_rule(p)) // param_with_default+ ) { D(fprintf(stderr, "%*c+ invalid_parameters_helper[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_with_default+")); - _res = _loop1_184_var; + _res = _loop1_183_var; goto done; } p->mark = _mark; @@ -21720,13 +21718,13 @@ invalid_lambda_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(lambda_slash_no_default | lambda_slash_with_default) lambda_param_maybe_default* '/'")); - asdl_seq * _loop0_186_var; - void *_tmp_185_var; + asdl_seq * _loop0_185_var; + void *_tmp_184_var; Token * a; if ( - (_tmp_185_var = _tmp_185_rule(p)) // lambda_slash_no_default | lambda_slash_with_default + (_tmp_184_var = _tmp_184_rule(p)) // lambda_slash_no_default | lambda_slash_with_default && - (_loop0_186_var = _loop0_186_rule(p)) // lambda_param_maybe_default* + (_loop0_185_var = _loop0_185_rule(p)) // lambda_param_maybe_default* && (a = _PyPegen_expect_token(p, 17)) // token='/' ) @@ -21750,7 +21748,7 @@ invalid_lambda_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default? lambda_param_no_default* invalid_lambda_parameters_helper lambda_param_no_default")); - asdl_seq * _loop0_187_var; + asdl_seq * _loop0_186_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings arg_ty a; @@ -21758,7 +21756,7 @@ invalid_lambda_parameters_rule(Parser *p) if ( (_opt_var = lambda_slash_no_default_rule(p), !p->error_indicator) // lambda_slash_no_default? && - (_loop0_187_var = _loop0_187_rule(p)) // lambda_param_no_default* + (_loop0_186_var = _loop0_186_rule(p)) // lambda_param_no_default* && (invalid_lambda_parameters_helper_var = invalid_lambda_parameters_helper_rule(p)) // invalid_lambda_parameters_helper && @@ -21784,18 +21782,18 @@ invalid_lambda_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* '(' ','.lambda_param+ ','? ')'")); - asdl_seq * _gather_189_var; - asdl_seq * _loop0_188_var; + asdl_seq * _gather_188_var; + asdl_seq * _loop0_187_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings Token * a; Token * b; if ( - (_loop0_188_var = _loop0_188_rule(p)) // lambda_param_no_default* + (_loop0_187_var = _loop0_187_rule(p)) // lambda_param_no_default* && (a = _PyPegen_expect_token(p, 7)) // token='(' && - (_gather_189_var = _gather_189_rule(p)) // ','.lambda_param+ + (_gather_188_var = _gather_188_rule(p)) // ','.lambda_param+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -21822,22 +21820,22 @@ invalid_lambda_parameters_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "[(lambda_slash_no_default | lambda_slash_with_default)] lambda_param_maybe_default* '*' (',' | lambda_param_no_default) lambda_param_maybe_default* '/'")); Token * _literal; - asdl_seq * _loop0_192_var; - asdl_seq * _loop0_194_var; + asdl_seq * _loop0_191_var; + asdl_seq * _loop0_193_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - void *_tmp_193_var; + void *_tmp_192_var; Token * a; if ( - (_opt_var = _tmp_191_rule(p), !p->error_indicator) // [(lambda_slash_no_default | lambda_slash_with_default)] + (_opt_var = _tmp_190_rule(p), !p->error_indicator) // [(lambda_slash_no_default | lambda_slash_with_default)] && - (_loop0_192_var = _loop0_192_rule(p)) // lambda_param_maybe_default* + (_loop0_191_var = _loop0_191_rule(p)) // lambda_param_maybe_default* && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_193_var = _tmp_193_rule(p)) // ',' | lambda_param_no_default + (_tmp_192_var = _tmp_192_rule(p)) // ',' | lambda_param_no_default && - (_loop0_194_var = _loop0_194_rule(p)) // lambda_param_maybe_default* + (_loop0_193_var = _loop0_193_rule(p)) // lambda_param_maybe_default* && (a = _PyPegen_expect_token(p, 17)) // token='/' ) @@ -21862,10 +21860,10 @@ invalid_lambda_parameters_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default+ '/' '*'")); Token * _literal; - asdl_seq * _loop1_195_var; + asdl_seq * _loop1_194_var; Token * a; if ( - (_loop1_195_var = _loop1_195_rule(p)) // lambda_param_maybe_default+ + (_loop1_194_var = _loop1_194_rule(p)) // lambda_param_maybe_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -21936,13 +21934,13 @@ invalid_lambda_parameters_helper_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters_helper[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); - asdl_seq * _loop1_196_var; + asdl_seq * _loop1_195_var; if ( - (_loop1_196_var = _loop1_196_rule(p)) // lambda_param_with_default+ + (_loop1_195_var = _loop1_195_rule(p)) // lambda_param_with_default+ ) { D(fprintf(stderr, "%*c+ invalid_lambda_parameters_helper[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); - _res = _loop1_196_var; + _res = _loop1_195_var; goto done; } p->mark = _mark; @@ -21978,11 +21976,11 @@ invalid_lambda_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); Token * _literal; - void *_tmp_197_var; + void *_tmp_196_var; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_197_var = _tmp_197_rule(p)) // ':' | ',' (':' | '**') + (_tmp_196_var = _tmp_196_rule(p)) // ':' | ',' (':' | '**') ) { D(fprintf(stderr, "%*c+ invalid_lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); @@ -22035,20 +22033,20 @@ invalid_lambda_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (lambda_param_no_default | ',') lambda_param_maybe_default* '*' (lambda_param_no_default | ',')")); Token * _literal; - asdl_seq * _loop0_199_var; - void *_tmp_198_var; - void *_tmp_200_var; + asdl_seq * _loop0_198_var; + void *_tmp_197_var; + void *_tmp_199_var; Token * a; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_198_var = _tmp_198_rule(p)) // lambda_param_no_default | ',' + (_tmp_197_var = _tmp_197_rule(p)) // lambda_param_no_default | ',' && - (_loop0_199_var = _loop0_199_rule(p)) // lambda_param_maybe_default* + (_loop0_198_var = _loop0_198_rule(p)) // lambda_param_maybe_default* && (a = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_200_var = _tmp_200_rule(p)) // lambda_param_no_default | ',' + (_tmp_199_var = _tmp_199_rule(p)) // lambda_param_no_default | ',' ) { D(fprintf(stderr, "%*c+ invalid_lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (lambda_param_no_default | ',') lambda_param_maybe_default* '*' (lambda_param_no_default | ',')")); @@ -22166,7 +22164,7 @@ invalid_lambda_kwds_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' && - (a = (Token*)_tmp_201_rule(p)) // '*' | '**' | '/' + (a = (Token*)_tmp_200_rule(p)) // '*' | '**' | '/' ) { D(fprintf(stderr, "%*c+ invalid_lambda_kwds[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' lambda_param ',' ('*' | '**' | '/')")); @@ -22272,7 +22270,7 @@ invalid_with_item_rule(Parser *p) && (a = expression_rule(p)) // expression && - _PyPegen_lookahead(1, _tmp_202_rule, p) + _PyPegen_lookahead(1, _tmp_201_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' expression &(',' | ')' | ':')")); @@ -22445,14 +22443,14 @@ invalid_import_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_import[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import' ','.dotted_name+ 'from' dotted_name")); - asdl_seq * _gather_203_var; + asdl_seq * _gather_202_var; Token * _keyword; Token * a; expr_ty dotted_name_var; if ( (a = _PyPegen_expect_token(p, 617)) // token='import' && - (_gather_203_var = _gather_203_rule(p)) // ','.dotted_name+ + (_gather_202_var = _gather_202_rule(p)) // ','.dotted_name+ && (_keyword = _PyPegen_expect_token(p, 618)) // token='from' && @@ -22548,7 +22546,7 @@ invalid_with_stmt_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'? 'with' ','.(expression ['as' star_target])+ NEWLINE")); - asdl_seq * _gather_205_var; + asdl_seq * _gather_204_var; Token * _keyword; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings @@ -22558,7 +22556,7 @@ invalid_with_stmt_rule(Parser *p) && (_keyword = _PyPegen_expect_token(p, 629)) // token='with' && - (_gather_205_var = _gather_205_rule(p)) // ','.(expression ['as' star_target])+ + (_gather_204_var = _gather_204_rule(p)) // ','.(expression ['as' star_target])+ && (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) @@ -22582,7 +22580,7 @@ invalid_with_stmt_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' NEWLINE")); - asdl_seq * _gather_207_var; + asdl_seq * _gather_206_var; Token * _keyword; Token * _literal; Token * _literal_1; @@ -22598,7 +22596,7 @@ invalid_with_stmt_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (_gather_207_var = _gather_207_rule(p)) // ','.(expressions ['as' star_target])+ + (_gather_206_var = _gather_206_rule(p)) // ','.(expressions ['as' star_target])+ && (_opt_var_1 = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -22647,7 +22645,7 @@ invalid_with_stmt_indent_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt_indent[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'? 'with' ','.(expression ['as' star_target])+ ':' NEWLINE !INDENT")); - asdl_seq * _gather_209_var; + asdl_seq * _gather_208_var; Token * _literal; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings @@ -22658,7 +22656,7 @@ invalid_with_stmt_indent_rule(Parser *p) && (a = _PyPegen_expect_token(p, 629)) // token='with' && - (_gather_209_var = _gather_209_rule(p)) // ','.(expression ['as' star_target])+ + (_gather_208_var = _gather_208_rule(p)) // ','.(expression ['as' star_target])+ && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -22686,7 +22684,7 @@ invalid_with_stmt_indent_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt_indent[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' ':' NEWLINE !INDENT")); - asdl_seq * _gather_211_var; + asdl_seq * _gather_210_var; Token * _literal; Token * _literal_1; Token * _literal_2; @@ -22703,7 +22701,7 @@ invalid_with_stmt_indent_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (_gather_211_var = _gather_211_rule(p)) // ','.(expressions ['as' star_target])+ + (_gather_210_var = _gather_210_rule(p)) // ','.(expressions ['as' star_target])+ && (_opt_var_1 = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -22800,7 +22798,7 @@ invalid_try_stmt_rule(Parser *p) && (block_var = block_rule(p)) // block && - _PyPegen_lookahead(0, _tmp_213_rule, p) + _PyPegen_lookahead(0, _tmp_212_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_try_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'try' ':' block !('except' | 'finally')")); @@ -22825,8 +22823,8 @@ invalid_try_stmt_rule(Parser *p) Token * _keyword; Token * _literal; Token * _literal_1; - asdl_seq * _loop0_214_var; - asdl_seq * _loop1_215_var; + asdl_seq * _loop0_213_var; + asdl_seq * _loop1_214_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings Token * a; @@ -22837,9 +22835,9 @@ invalid_try_stmt_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && - (_loop0_214_var = _loop0_214_rule(p)) // block* + (_loop0_213_var = _loop0_213_rule(p)) // block* && - (_loop1_215_var = _loop1_215_rule(p)) // except_block+ + (_loop1_214_var = _loop1_214_rule(p)) // except_block+ && (a = _PyPegen_expect_token(p, 651)) // token='except' && @@ -22847,7 +22845,7 @@ invalid_try_stmt_rule(Parser *p) && (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_216_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var = _tmp_215_rule(p), !p->error_indicator) // ['as' NAME] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' ) @@ -22874,8 +22872,8 @@ invalid_try_stmt_rule(Parser *p) Token * _keyword; Token * _literal; Token * _literal_1; - asdl_seq * _loop0_217_var; - asdl_seq * _loop1_218_var; + asdl_seq * _loop0_216_var; + asdl_seq * _loop1_217_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings Token * a; @@ -22884,13 +22882,13 @@ invalid_try_stmt_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && - (_loop0_217_var = _loop0_217_rule(p)) // block* + (_loop0_216_var = _loop0_216_rule(p)) // block* && - (_loop1_218_var = _loop1_218_rule(p)) // except_star_block+ + (_loop1_217_var = _loop1_217_rule(p)) // except_star_block+ && (a = _PyPegen_expect_token(p, 651)) // token='except' && - (_opt_var = _tmp_219_rule(p), !p->error_indicator) // [expression ['as' NAME]] + (_opt_var = _tmp_218_rule(p), !p->error_indicator) // [expression ['as' NAME]] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' ) @@ -22957,7 +22955,7 @@ invalid_except_stmt_rule(Parser *p) && (expressions_var = expressions_rule(p)) // expressions && - (_opt_var_1 = _tmp_220_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var_1 = _tmp_219_rule(p), !p->error_indicator) // ['as' NAME] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' ) @@ -22995,7 +22993,7 @@ invalid_except_stmt_rule(Parser *p) && (expression_var = expression_rule(p)) // expression && - (_opt_var_1 = _tmp_221_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var_1 = _tmp_220_rule(p), !p->error_indicator) // ['as' NAME] && (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) @@ -23047,14 +23045,14 @@ invalid_except_stmt_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_except_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' '*' (NEWLINE | ':')")); Token * _literal; - void *_tmp_222_var; + void *_tmp_221_var; Token * a; if ( (a = _PyPegen_expect_token(p, 651)) // token='except' && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_222_var = _tmp_222_rule(p)) // NEWLINE | ':' + (_tmp_221_var = _tmp_221_rule(p)) // NEWLINE | ':' ) { D(fprintf(stderr, "%*c+ invalid_except_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' '*' (NEWLINE | ':')")); @@ -23159,7 +23157,7 @@ invalid_except_stmt_indent_rule(Parser *p) && (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_223_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var = _tmp_222_rule(p), !p->error_indicator) // ['as' NAME] && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -23253,7 +23251,7 @@ invalid_except_star_stmt_indent_rule(Parser *p) && (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_224_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var = _tmp_223_rule(p), !p->error_indicator) // ['as' NAME] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -23617,7 +23615,7 @@ invalid_class_argument_pattern_rule(Parser *p) asdl_pattern_seq* a; asdl_seq* keyword_patterns_var; if ( - (_opt_var = _tmp_225_rule(p), !p->error_indicator) // [positional_patterns ','] + (_opt_var = _tmp_224_rule(p), !p->error_indicator) // [positional_patterns ','] && (keyword_patterns_var = keyword_patterns_rule(p)) // keyword_patterns && @@ -24105,7 +24103,7 @@ invalid_def_raw_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' && - (_opt_var_2 = _tmp_226_rule(p), !p->error_indicator) // ['->' expression] + (_opt_var_2 = _tmp_225_rule(p), !p->error_indicator) // ['->' expression] && (_literal_2 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -24164,7 +24162,7 @@ invalid_class_def_raw_rule(Parser *p) && (name_var = _PyPegen_name_token(p)) // NAME && - (_opt_var = _tmp_227_rule(p), !p->error_indicator) // ['(' arguments? ')'] + (_opt_var = _tmp_226_rule(p), !p->error_indicator) // ['(' arguments? ')'] && (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) @@ -24199,7 +24197,7 @@ invalid_class_def_raw_rule(Parser *p) && (name_var = _PyPegen_name_token(p)) // NAME && - (_opt_var = _tmp_228_rule(p), !p->error_indicator) // ['(' arguments? ')'] + (_opt_var = _tmp_227_rule(p), !p->error_indicator) // ['(' arguments? ')'] && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -24249,11 +24247,11 @@ invalid_double_starred_kvpairs_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_double_starred_kvpairs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.double_starred_kvpair+ ',' invalid_kvpair")); - asdl_seq * _gather_229_var; + asdl_seq * _gather_228_var; Token * _literal; void *invalid_kvpair_var; if ( - (_gather_229_var = _gather_229_rule(p)) // ','.double_starred_kvpair+ + (_gather_228_var = _gather_228_rule(p)) // ','.double_starred_kvpair+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && @@ -24261,7 +24259,7 @@ invalid_double_starred_kvpairs_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ invalid_double_starred_kvpairs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.double_starred_kvpair+ ',' invalid_kvpair")); - _res = _PyPegen_dummy_name(p, _gather_229_var, _literal, invalid_kvpair_var); + _res = _PyPegen_dummy_name(p, _gather_228_var, _literal, invalid_kvpair_var); goto done; } p->mark = _mark; @@ -24314,7 +24312,7 @@ invalid_double_starred_kvpairs_rule(Parser *p) && (a = _PyPegen_expect_token(p, 11)) // token=':' && - _PyPegen_lookahead(1, _tmp_231_rule, p) + _PyPegen_lookahead(1, _tmp_230_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_double_starred_kvpairs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':' &('}' | ',')")); @@ -24424,7 +24422,7 @@ invalid_kvpair_rule(Parser *p) && (a = _PyPegen_expect_token(p, 11)) // token=':' && - _PyPegen_lookahead(1, _tmp_232_rule, p) + _PyPegen_lookahead(1, _tmp_231_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_kvpair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':' &('}' | ',')")); @@ -24640,7 +24638,7 @@ invalid_replacement_field_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' && - _PyPegen_lookahead(0, _tmp_233_rule, p) + _PyPegen_lookahead(0, _tmp_232_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' !(yield_expr | star_expressions)")); @@ -24663,13 +24661,13 @@ invalid_replacement_field_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}')")); Token * _literal; - void *_tmp_234_var; + void *_tmp_233_var; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' && - (_tmp_234_var = _tmp_234_rule(p)) // yield_expr | star_expressions + (_tmp_233_var = _tmp_233_rule(p)) // yield_expr | star_expressions && - _PyPegen_lookahead(0, _tmp_235_rule, p) + _PyPegen_lookahead(0, _tmp_234_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}')")); @@ -24693,15 +24691,15 @@ invalid_replacement_field_rule(Parser *p) D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '=' !('!' | ':' | '}')")); Token * _literal; Token * _literal_1; - void *_tmp_236_var; + void *_tmp_235_var; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' && - (_tmp_236_var = _tmp_236_rule(p)) // yield_expr | star_expressions + (_tmp_235_var = _tmp_235_rule(p)) // yield_expr | star_expressions && (_literal_1 = _PyPegen_expect_token(p, 22)) // token='=' && - _PyPegen_lookahead(0, _tmp_237_rule, p) + _PyPegen_lookahead(0, _tmp_236_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '=' !('!' | ':' | '}')")); @@ -24726,12 +24724,12 @@ invalid_replacement_field_rule(Parser *p) Token * _literal; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - void *_tmp_238_var; + void *_tmp_237_var; void *invalid_conversion_character_var; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' && - (_tmp_238_var = _tmp_238_rule(p)) // yield_expr | star_expressions + (_tmp_237_var = _tmp_237_rule(p)) // yield_expr | star_expressions && (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? && @@ -24739,7 +24737,7 @@ invalid_replacement_field_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? invalid_conversion_character")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_238_var, _opt_var, invalid_conversion_character_var); + _res = _PyPegen_dummy_name(p, _literal, _tmp_237_var, _opt_var, invalid_conversion_character_var); goto done; } p->mark = _mark; @@ -24757,17 +24755,17 @@ invalid_replacement_field_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings void *_opt_var_1; UNUSED(_opt_var_1); // Silence compiler warnings - void *_tmp_239_var; + void *_tmp_238_var; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' && - (_tmp_239_var = _tmp_239_rule(p)) // yield_expr | star_expressions + (_tmp_238_var = _tmp_238_rule(p)) // yield_expr | star_expressions && (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? && - (_opt_var_1 = _tmp_240_rule(p), !p->error_indicator) // ['!' NAME] + (_opt_var_1 = _tmp_239_rule(p), !p->error_indicator) // ['!' NAME] && - _PyPegen_lookahead(0, _tmp_241_rule, p) + _PyPegen_lookahead(0, _tmp_240_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] !(':' | '}')")); @@ -24791,24 +24789,24 @@ invalid_replacement_field_rule(Parser *p) D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] ':' fstring_format_spec* !'}'")); Token * _literal; Token * _literal_1; - asdl_seq * _loop0_244_var; + asdl_seq * _loop0_243_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings void *_opt_var_1; UNUSED(_opt_var_1); // Silence compiler warnings - void *_tmp_242_var; + void *_tmp_241_var; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' && - (_tmp_242_var = _tmp_242_rule(p)) // yield_expr | star_expressions + (_tmp_241_var = _tmp_241_rule(p)) // yield_expr | star_expressions && (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? && - (_opt_var_1 = _tmp_243_rule(p), !p->error_indicator) // ['!' NAME] + (_opt_var_1 = _tmp_242_rule(p), !p->error_indicator) // ['!' NAME] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' && - (_loop0_244_var = _loop0_244_rule(p)) // fstring_format_spec* + (_loop0_243_var = _loop0_243_rule(p)) // fstring_format_spec* && _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 26) // token='}' ) @@ -24837,15 +24835,15 @@ invalid_replacement_field_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings void *_opt_var_1; UNUSED(_opt_var_1); // Silence compiler warnings - void *_tmp_245_var; + void *_tmp_244_var; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' && - (_tmp_245_var = _tmp_245_rule(p)) // yield_expr | star_expressions + (_tmp_244_var = _tmp_244_rule(p)) // yield_expr | star_expressions && (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? && - (_opt_var_1 = _tmp_246_rule(p), !p->error_indicator) // ['!' NAME] + (_opt_var_1 = _tmp_245_rule(p), !p->error_indicator) // ['!' NAME] && _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 26) // token='}' ) @@ -24892,7 +24890,7 @@ invalid_conversion_character_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 54)) // token='!' && - _PyPegen_lookahead(1, _tmp_247_rule, p) + _PyPegen_lookahead(1, _tmp_246_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_conversion_character[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' &(':' | '}')")); @@ -25822,12 +25820,12 @@ _loop1_15_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_248_var; + void *_tmp_247_var; while ( - (_tmp_248_var = _tmp_248_rule(p)) // star_targets '=' + (_tmp_247_var = _tmp_247_rule(p)) // star_targets '=' ) { - _res = _tmp_248_var; + _res = _tmp_247_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -26391,12 +26389,12 @@ _loop0_25_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_25[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_249_var; + void *_tmp_248_var; while ( - (_tmp_249_var = _tmp_249_rule(p)) // '.' | '...' + (_tmp_248_var = _tmp_248_rule(p)) // '.' | '...' ) { - _res = _tmp_249_var; + _res = _tmp_248_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -26458,12 +26456,12 @@ _loop1_26_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_26[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_250_var; + void *_tmp_249_var; while ( - (_tmp_250_var = _tmp_250_rule(p)) // '.' | '...' + (_tmp_249_var = _tmp_249_rule(p)) // '.' | '...' ) { - _res = _tmp_250_var; + _res = _tmp_249_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -26856,12 +26854,12 @@ _loop1_33_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_33[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); - void *_tmp_251_var; + void *_tmp_250_var; while ( - (_tmp_251_var = _tmp_251_rule(p)) // '@' named_expression NEWLINE + (_tmp_250_var = _tmp_250_rule(p)) // '@' named_expression NEWLINE ) { - _res = _tmp_251_var; + _res = _tmp_250_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -29986,12 +29984,12 @@ _loop1_83_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_83[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); - void *_tmp_252_var; + void *_tmp_251_var; while ( - (_tmp_252_var = _tmp_252_rule(p)) // ',' expression + (_tmp_251_var = _tmp_251_rule(p)) // ',' expression ) { - _res = _tmp_252_var; + _res = _tmp_251_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30058,9 +30056,198 @@ _loop1_84_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_84[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); + void *_tmp_252_var; + while ( + (_tmp_252_var = _tmp_252_rule(p)) // ',' star_expression + ) + { + _res = _tmp_252_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_84[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_expression)")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + p->level--; + return _seq; +} + +// _loop0_86: ',' star_named_expression +static asdl_seq * +_loop0_86_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + _Pypegen_stack_overflow(p); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // ',' star_named_expression + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_named_expression")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = star_named_expression_rule(p)) // star_named_expression + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + p->level--; + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_86[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_named_expression")); + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + p->level--; + return _seq; +} + +// _gather_85: star_named_expression _loop0_86 +static asdl_seq * +_gather_85_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + _Pypegen_stack_overflow(p); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // star_named_expression _loop0_86 + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _gather_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_86")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = star_named_expression_rule(p)) // star_named_expression + && + (seq = _loop0_86_rule(p)) // _loop0_86 + ) + { + D(fprintf(stderr, "%*c+ _gather_85[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_86")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_85[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression _loop0_86")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _loop1_87: ('or' conjunction) +static asdl_seq * +_loop1_87_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + _Pypegen_stack_overflow(p); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // ('or' conjunction) + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); void *_tmp_253_var; while ( - (_tmp_253_var = _tmp_253_rule(p)) // ',' star_expression + (_tmp_253_var = _tmp_253_rule(p)) // 'or' conjunction ) { _res = _tmp_253_var; @@ -30080,195 +30267,6 @@ _loop1_84_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_84[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_expression)")); - } - if (_n == 0 || p->error_indicator) { - PyMem_Free(_children); - p->level--; - return NULL; - } - asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); - if (!_seq) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); - PyMem_Free(_children); - p->level--; - return _seq; -} - -// _loop0_86: ',' star_named_expression -static asdl_seq * -_loop0_86_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - _Pypegen_stack_overflow(p); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - void *_res = NULL; - int _mark = p->mark; - void **_children = PyMem_Malloc(sizeof(void *)); - if (!_children) { - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - Py_ssize_t _children_capacity = 1; - Py_ssize_t _n = 0; - { // ',' star_named_expression - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _loop0_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_named_expression")); - Token * _literal; - expr_ty elem; - while ( - (_literal = _PyPegen_expect_token(p, 12)) // token=',' - && - (elem = star_named_expression_rule(p)) // star_named_expression - ) - { - _res = elem; - if (_res == NULL && PyErr_Occurred()) { - p->error_indicator = 1; - PyMem_Free(_children); - p->level--; - return NULL; - } - if (_n == _children_capacity) { - _children_capacity *= 2; - void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); - if (!_new_children) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - _children = _new_children; - } - _children[_n++] = _res; - _mark = p->mark; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_86[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_named_expression")); - } - asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); - if (!_seq) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); - PyMem_Free(_children); - p->level--; - return _seq; -} - -// _gather_85: star_named_expression _loop0_86 -static asdl_seq * -_gather_85_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - _Pypegen_stack_overflow(p); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - asdl_seq * _res = NULL; - int _mark = p->mark; - { // star_named_expression _loop0_86 - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _gather_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_86")); - expr_ty elem; - asdl_seq * seq; - if ( - (elem = star_named_expression_rule(p)) // star_named_expression - && - (seq = _loop0_86_rule(p)) // _loop0_86 - ) - { - D(fprintf(stderr, "%*c+ _gather_85[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_86")); - _res = _PyPegen_seq_insert_in_front(p, elem, seq); - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_85[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression _loop0_86")); - } - _res = NULL; - done: - p->level--; - return _res; -} - -// _loop1_87: ('or' conjunction) -static asdl_seq * -_loop1_87_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - _Pypegen_stack_overflow(p); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - void *_res = NULL; - int _mark = p->mark; - void **_children = PyMem_Malloc(sizeof(void *)); - if (!_children) { - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - Py_ssize_t _children_capacity = 1; - Py_ssize_t _n = 0; - { // ('or' conjunction) - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _loop1_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); - void *_tmp_254_var; - while ( - (_tmp_254_var = _tmp_254_rule(p)) // 'or' conjunction - ) - { - _res = _tmp_254_var; - if (_n == _children_capacity) { - _children_capacity *= 2; - void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); - if (!_new_children) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - _children = _new_children; - } - _children[_n++] = _res; - _mark = p->mark; - } - p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_87[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('or' conjunction)")); } @@ -30319,12 +30317,12 @@ _loop1_88_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); - void *_tmp_255_var; + void *_tmp_254_var; while ( - (_tmp_255_var = _tmp_255_rule(p)) // 'and' inversion + (_tmp_254_var = _tmp_254_rule(p)) // 'and' inversion ) { - _res = _tmp_255_var; + _res = _tmp_254_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30511,7 +30509,7 @@ _loop0_92_rule(Parser *p) while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_256_rule(p)) // slice | starred_expression + (elem = _tmp_255_rule(p)) // slice | starred_expression ) { _res = elem; @@ -30576,7 +30574,7 @@ _gather_91_rule(Parser *p) void *elem; asdl_seq * seq; if ( - (elem = _tmp_256_rule(p)) // slice | starred_expression + (elem = _tmp_255_rule(p)) // slice | starred_expression && (seq = _loop0_92_rule(p)) // _loop0_92 ) @@ -32108,12 +32106,12 @@ _loop1_115_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(fstring | string)")); - void *_tmp_257_var; + void *_tmp_256_var; while ( - (_tmp_257_var = _tmp_257_rule(p)) // fstring | string + (_tmp_256_var = _tmp_256_rule(p)) // fstring | string ) { - _res = _tmp_257_var; + _res = _tmp_256_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -32418,12 +32416,12 @@ _loop0_120_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_258_var; + void *_tmp_257_var; while ( - (_tmp_258_var = _tmp_258_rule(p)) // 'if' disjunction + (_tmp_257_var = _tmp_257_rule(p)) // 'if' disjunction ) { - _res = _tmp_258_var; + _res = _tmp_257_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -32485,12 +32483,12 @@ _loop0_121_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_259_var; + void *_tmp_258_var; while ( - (_tmp_259_var = _tmp_259_rule(p)) // 'if' disjunction + (_tmp_258_var = _tmp_258_rule(p)) // 'if' disjunction ) { - _res = _tmp_259_var; + _res = _tmp_258_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -32616,7 +32614,7 @@ _loop0_124_rule(Parser *p) while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_260_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' + (elem = _tmp_259_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' ) { _res = elem; @@ -32682,7 +32680,7 @@ _gather_123_rule(Parser *p) void *elem; asdl_seq * seq; if ( - (elem = _tmp_260_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' + (elem = _tmp_259_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' && (seq = _loop0_124_rule(p)) // _loop0_124 ) @@ -33243,12 +33241,12 @@ _loop0_134_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_261_var; + void *_tmp_260_var; while ( - (_tmp_261_var = _tmp_261_rule(p)) // ',' star_target + (_tmp_260_var = _tmp_260_rule(p)) // ',' star_target ) { - _res = _tmp_261_var; + _res = _tmp_260_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -33427,12 +33425,12 @@ _loop1_137_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_262_var; + void *_tmp_261_var; while ( - (_tmp_262_var = _tmp_262_rule(p)) // ',' star_target + (_tmp_261_var = _tmp_261_rule(p)) // ',' star_target ) { - _res = _tmp_262_var; + _res = _tmp_261_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -34529,66 +34527,9 @@ _tmp_156_rule(Parser *p) return _res; } -// _tmp_157: FSTRING_MIDDLE | fstring_replacement_field +// _tmp_157: '=' | ':=' static void * _tmp_157_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - _Pypegen_stack_overflow(p); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - void * _res = NULL; - int _mark = p->mark; - { // FSTRING_MIDDLE - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "FSTRING_MIDDLE")); - Token * fstring_middle_var; - if ( - (fstring_middle_var = _PyPegen_expect_token(p, FSTRING_MIDDLE)) // token='FSTRING_MIDDLE' - ) - { - D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "FSTRING_MIDDLE")); - _res = fstring_middle_var; - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_MIDDLE")); - } - { // fstring_replacement_field - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_replacement_field")); - expr_ty fstring_replacement_field_var; - if ( - (fstring_replacement_field_var = fstring_replacement_field_rule(p)) // fstring_replacement_field - ) - { - D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "fstring_replacement_field")); - _res = fstring_replacement_field_var; - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_replacement_field")); - } - _res = NULL; - done: - p->level--; - return _res; -} - -// _tmp_158: '=' | ':=' -static void * -_tmp_158_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -34604,18 +34545,18 @@ _tmp_158_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); } { // ':=' @@ -34623,18 +34564,18 @@ _tmp_158_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 53)) // token=':=' ) { - D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':='")); } _res = NULL; @@ -34643,9 +34584,9 @@ _tmp_158_rule(Parser *p) return _res; } -// _tmp_159: list | tuple | genexp | 'True' | 'None' | 'False' +// _tmp_158: list | tuple | genexp | 'True' | 'None' | 'False' static void * -_tmp_159_rule(Parser *p) +_tmp_158_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -34661,18 +34602,18 @@ _tmp_159_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); expr_ty list_var; if ( (list_var = list_rule(p)) // list ) { - D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); _res = list_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "list")); } { // tuple @@ -34680,18 +34621,18 @@ _tmp_159_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); expr_ty tuple_var; if ( (tuple_var = tuple_rule(p)) // tuple ) { - D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); _res = tuple_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tuple")); } { // genexp @@ -34699,18 +34640,18 @@ _tmp_159_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); expr_ty genexp_var; if ( (genexp_var = genexp_rule(p)) // genexp ) { - D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); _res = genexp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "genexp")); } { // 'True' @@ -34718,18 +34659,18 @@ _tmp_159_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 610)) // token='True' ) { - D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); + D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'True'")); } { // 'None' @@ -34737,18 +34678,18 @@ _tmp_159_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 611)) // token='None' ) { - D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); + D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'None'")); } { // 'False' @@ -34756,18 +34697,18 @@ _tmp_159_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 612)) // token='False' ) { - D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); + D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'False'")); } _res = NULL; @@ -34776,9 +34717,9 @@ _tmp_159_rule(Parser *p) return _res; } -// _tmp_160: '=' | ':=' +// _tmp_159: '=' | ':=' static void * -_tmp_160_rule(Parser *p) +_tmp_159_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -34794,18 +34735,18 @@ _tmp_160_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); } { // ':=' @@ -34813,18 +34754,18 @@ _tmp_160_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='")); + D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 53)) // token=':=' ) { - D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='")); + D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':='")); } _res = NULL; @@ -34833,9 +34774,9 @@ _tmp_160_rule(Parser *p) return _res; } -// _loop0_161: star_named_expressions +// _loop0_160: star_named_expressions static asdl_seq * -_loop0_161_rule(Parser *p) +_loop0_160_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -34860,7 +34801,7 @@ _loop0_161_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions")); + D(fprintf(stderr, "%*c> _loop0_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions")); asdl_expr_seq* star_named_expressions_var; while ( (star_named_expressions_var = star_named_expressions_rule(p)) // star_named_expressions @@ -34883,7 +34824,7 @@ _loop0_161_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_161[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_160[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expressions")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -34900,9 +34841,9 @@ _loop0_161_rule(Parser *p) return _seq; } -// _loop0_162: (star_targets '=') +// _loop0_161: (star_targets '=') static asdl_seq * -_loop0_162_rule(Parser *p) +_loop0_161_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -34927,13 +34868,13 @@ _loop0_162_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_263_var; + D(fprintf(stderr, "%*c> _loop0_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_262_var; while ( - (_tmp_263_var = _tmp_263_rule(p)) // star_targets '=' + (_tmp_262_var = _tmp_262_rule(p)) // star_targets '=' ) { - _res = _tmp_263_var; + _res = _tmp_262_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -34950,7 +34891,7 @@ _loop0_162_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_162[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_161[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -34967,9 +34908,9 @@ _loop0_162_rule(Parser *p) return _seq; } -// _loop0_163: (star_targets '=') +// _loop0_162: (star_targets '=') static asdl_seq * -_loop0_163_rule(Parser *p) +_loop0_162_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -34994,13 +34935,13 @@ _loop0_163_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_264_var; + D(fprintf(stderr, "%*c> _loop0_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_263_var; while ( - (_tmp_264_var = _tmp_264_rule(p)) // star_targets '=' + (_tmp_263_var = _tmp_263_rule(p)) // star_targets '=' ) { - _res = _tmp_264_var; + _res = _tmp_263_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -35017,7 +34958,7 @@ _loop0_163_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_163[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_162[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35034,9 +34975,9 @@ _loop0_163_rule(Parser *p) return _seq; } -// _tmp_164: yield_expr | star_expressions +// _tmp_163: yield_expr | star_expressions static void * -_tmp_164_rule(Parser *p) +_tmp_163_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -35052,18 +34993,18 @@ _tmp_164_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -35071,18 +35012,18 @@ _tmp_164_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -35091,9 +35032,9 @@ _tmp_164_rule(Parser *p) return _res; } -// _tmp_165: '[' | '(' | '{' +// _tmp_164: '[' | '(' | '{' static void * -_tmp_165_rule(Parser *p) +_tmp_164_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -35109,18 +35050,18 @@ _tmp_165_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 9)) // token='[' ) { - D(fprintf(stderr, "%*c+ _tmp_165[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_165[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); } { // '(' @@ -35128,18 +35069,18 @@ _tmp_165_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' ) { - D(fprintf(stderr, "%*c+ _tmp_165[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_165[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); } { // '{' @@ -35147,18 +35088,18 @@ _tmp_165_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' ) { - D(fprintf(stderr, "%*c+ _tmp_165[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_165[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); } _res = NULL; @@ -35167,9 +35108,9 @@ _tmp_165_rule(Parser *p) return _res; } -// _tmp_166: '[' | '{' +// _tmp_165: '[' | '{' static void * -_tmp_166_rule(Parser *p) +_tmp_165_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -35185,18 +35126,18 @@ _tmp_166_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c> _tmp_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 9)) // token='[' ) { - D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c+ _tmp_165[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_165[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); } { // '{' @@ -35204,18 +35145,18 @@ _tmp_166_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c> _tmp_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' ) { - D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c+ _tmp_165[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_165[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); } _res = NULL; @@ -35224,9 +35165,9 @@ _tmp_166_rule(Parser *p) return _res; } -// _tmp_167: '[' | '{' +// _tmp_166: '[' | '{' static void * -_tmp_167_rule(Parser *p) +_tmp_166_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -35242,18 +35183,18 @@ _tmp_167_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_167[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 9)) // token='[' ) { - D(fprintf(stderr, "%*c+ _tmp_167[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_167[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); } { // '{' @@ -35261,18 +35202,18 @@ _tmp_167_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_167[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' ) { - D(fprintf(stderr, "%*c+ _tmp_167[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_167[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); } _res = NULL; @@ -35281,9 +35222,9 @@ _tmp_167_rule(Parser *p) return _res; } -// _tmp_168: slash_no_default | slash_with_default +// _tmp_167: slash_no_default | slash_with_default static void * -_tmp_168_rule(Parser *p) +_tmp_167_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -35299,18 +35240,18 @@ _tmp_168_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_168[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default")); + D(fprintf(stderr, "%*c> _tmp_167[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default")); asdl_arg_seq* slash_no_default_var; if ( (slash_no_default_var = slash_no_default_rule(p)) // slash_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_168[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default")); + D(fprintf(stderr, "%*c+ _tmp_167[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default")); _res = slash_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_168[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_167[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_no_default")); } { // slash_with_default @@ -35318,18 +35259,18 @@ _tmp_168_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_168[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_167[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); SlashWithDefault* slash_with_default_var; if ( (slash_with_default_var = slash_with_default_rule(p)) // slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_168[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_167[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); _res = slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_168[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_167[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_with_default")); } _res = NULL; @@ -35338,9 +35279,9 @@ _tmp_168_rule(Parser *p) return _res; } -// _loop0_169: param_maybe_default +// _loop0_168: param_maybe_default static asdl_seq * -_loop0_169_rule(Parser *p) +_loop0_168_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -35365,7 +35306,7 @@ _loop0_169_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_169[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_168[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -35388,7 +35329,7 @@ _loop0_169_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_169[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_168[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35405,9 +35346,9 @@ _loop0_169_rule(Parser *p) return _seq; } -// _loop0_170: param_no_default +// _loop0_169: param_no_default static asdl_seq * -_loop0_170_rule(Parser *p) +_loop0_169_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -35432,7 +35373,7 @@ _loop0_170_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_170[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_169[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -35455,7 +35396,7 @@ _loop0_170_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_170[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_169[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35472,9 +35413,9 @@ _loop0_170_rule(Parser *p) return _seq; } -// _loop0_171: param_no_default +// _loop0_170: param_no_default static asdl_seq * -_loop0_171_rule(Parser *p) +_loop0_170_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -35499,7 +35440,7 @@ _loop0_171_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_171[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_170[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -35522,7 +35463,7 @@ _loop0_171_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_171[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_170[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35539,9 +35480,9 @@ _loop0_171_rule(Parser *p) return _seq; } -// _loop1_172: param_no_default +// _loop1_171: param_no_default static asdl_seq * -_loop1_172_rule(Parser *p) +_loop1_171_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -35566,7 +35507,7 @@ _loop1_172_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_172[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop1_171[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -35589,7 +35530,7 @@ _loop1_172_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_172[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_171[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -35611,9 +35552,9 @@ _loop1_172_rule(Parser *p) return _seq; } -// _tmp_173: slash_no_default | slash_with_default +// _tmp_172: slash_no_default | slash_with_default static void * -_tmp_173_rule(Parser *p) +_tmp_172_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -35629,18 +35570,18 @@ _tmp_173_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default")); + D(fprintf(stderr, "%*c> _tmp_172[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default")); asdl_arg_seq* slash_no_default_var; if ( (slash_no_default_var = slash_no_default_rule(p)) // slash_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default")); + D(fprintf(stderr, "%*c+ _tmp_172[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default")); _res = slash_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_172[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_no_default")); } { // slash_with_default @@ -35648,18 +35589,18 @@ _tmp_173_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_172[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); SlashWithDefault* slash_with_default_var; if ( (slash_with_default_var = slash_with_default_rule(p)) // slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_172[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); _res = slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_172[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_with_default")); } _res = NULL; @@ -35668,9 +35609,9 @@ _tmp_173_rule(Parser *p) return _res; } -// _loop0_174: param_maybe_default +// _loop0_173: param_maybe_default static asdl_seq * -_loop0_174_rule(Parser *p) +_loop0_173_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -35695,7 +35636,7 @@ _loop0_174_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_174[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -35718,7 +35659,7 @@ _loop0_174_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_174[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_173[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35735,9 +35676,9 @@ _loop0_174_rule(Parser *p) return _seq; } -// _tmp_175: ',' | param_no_default +// _tmp_174: ',' | param_no_default static void * -_tmp_175_rule(Parser *p) +_tmp_174_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -35753,18 +35694,18 @@ _tmp_175_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_175[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_174[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_175[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_174[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_175[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_174[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // param_no_default @@ -35772,18 +35713,18 @@ _tmp_175_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_175[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _tmp_174[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; if ( (param_no_default_var = param_no_default_rule(p)) // param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_175[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_174[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); _res = param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_175[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_174[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } _res = NULL; @@ -35792,9 +35733,9 @@ _tmp_175_rule(Parser *p) return _res; } -// _loop0_176: param_maybe_default +// _loop0_175: param_maybe_default static asdl_seq * -_loop0_176_rule(Parser *p) +_loop0_175_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -35819,7 +35760,7 @@ _loop0_176_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_176[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_175[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -35842,7 +35783,7 @@ _loop0_176_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_176[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_175[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35859,9 +35800,9 @@ _loop0_176_rule(Parser *p) return _seq; } -// _loop1_177: param_maybe_default +// _loop1_176: param_maybe_default static asdl_seq * -_loop1_177_rule(Parser *p) +_loop1_176_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -35886,7 +35827,7 @@ _loop1_177_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_177[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop1_176[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -35909,7 +35850,7 @@ _loop1_177_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_177[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_176[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } if (_n == 0 || p->error_indicator) { @@ -35931,9 +35872,9 @@ _loop1_177_rule(Parser *p) return _seq; } -// _tmp_178: ')' | ',' +// _tmp_177: ')' | ',' static void * -_tmp_178_rule(Parser *p) +_tmp_177_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -35949,18 +35890,18 @@ _tmp_178_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_178[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_177[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_178[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_177[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_178[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_177[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ',' @@ -35968,18 +35909,18 @@ _tmp_178_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_178[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_177[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_178[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_177[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_178[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_177[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -35988,9 +35929,9 @@ _tmp_178_rule(Parser *p) return _res; } -// _tmp_179: ')' | ',' (')' | '**') +// _tmp_178: ')' | ',' (')' | '**') static void * -_tmp_179_rule(Parser *p) +_tmp_178_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36006,18 +35947,18 @@ _tmp_179_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_179[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_178[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_179[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_178[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_179[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_178[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ',' (')' | '**') @@ -36025,21 +35966,21 @@ _tmp_179_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_179[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + D(fprintf(stderr, "%*c> _tmp_178[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); Token * _literal; - void *_tmp_265_var; + void *_tmp_264_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_265_var = _tmp_265_rule(p)) // ')' | '**' + (_tmp_264_var = _tmp_264_rule(p)) // ')' | '**' ) { - D(fprintf(stderr, "%*c+ _tmp_179[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_265_var); + D(fprintf(stderr, "%*c+ _tmp_178[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_264_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_179[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_178[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (')' | '**')")); } _res = NULL; @@ -36048,9 +35989,9 @@ _tmp_179_rule(Parser *p) return _res; } -// _tmp_180: param_no_default | ',' +// _tmp_179: param_no_default | ',' static void * -_tmp_180_rule(Parser *p) +_tmp_179_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36066,18 +36007,18 @@ _tmp_180_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_180[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _tmp_179[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; if ( (param_no_default_var = param_no_default_rule(p)) // param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_180[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_179[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); _res = param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_180[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_179[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } { // ',' @@ -36085,18 +36026,18 @@ _tmp_180_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_180[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_179[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_180[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_179[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_180[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_179[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -36105,9 +36046,9 @@ _tmp_180_rule(Parser *p) return _res; } -// _loop0_181: param_maybe_default +// _loop0_180: param_maybe_default static asdl_seq * -_loop0_181_rule(Parser *p) +_loop0_180_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36132,7 +36073,7 @@ _loop0_181_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_181[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_180[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -36155,7 +36096,7 @@ _loop0_181_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_181[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_180[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36172,9 +36113,9 @@ _loop0_181_rule(Parser *p) return _seq; } -// _tmp_182: param_no_default | ',' +// _tmp_181: param_no_default | ',' static void * -_tmp_182_rule(Parser *p) +_tmp_181_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36190,18 +36131,18 @@ _tmp_182_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_182[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _tmp_181[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; if ( (param_no_default_var = param_no_default_rule(p)) // param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_182[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_181[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); _res = param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_182[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_181[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } { // ',' @@ -36209,18 +36150,18 @@ _tmp_182_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_182[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_181[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_182[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_181[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_182[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_181[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -36229,9 +36170,9 @@ _tmp_182_rule(Parser *p) return _res; } -// _tmp_183: '*' | '**' | '/' +// _tmp_182: '*' | '**' | '/' static void * -_tmp_183_rule(Parser *p) +_tmp_182_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36247,18 +36188,18 @@ _tmp_183_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_183[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c> _tmp_182[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' ) { - D(fprintf(stderr, "%*c+ _tmp_183[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c+ _tmp_182[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_183[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_182[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*'")); } { // '**' @@ -36266,18 +36207,18 @@ _tmp_183_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_183[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_182[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_183[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_182[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_183[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_182[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } { // '/' @@ -36285,18 +36226,18 @@ _tmp_183_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_183[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c> _tmp_182[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 17)) // token='/' ) { - D(fprintf(stderr, "%*c+ _tmp_183[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c+ _tmp_182[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_183[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_182[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'/'")); } _res = NULL; @@ -36305,9 +36246,9 @@ _tmp_183_rule(Parser *p) return _res; } -// _loop1_184: param_with_default +// _loop1_183: param_with_default static asdl_seq * -_loop1_184_rule(Parser *p) +_loop1_183_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36332,7 +36273,7 @@ _loop1_184_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_184[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop1_183[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -36355,7 +36296,7 @@ _loop1_184_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_184[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_183[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -36377,9 +36318,9 @@ _loop1_184_rule(Parser *p) return _seq; } -// _tmp_185: lambda_slash_no_default | lambda_slash_with_default +// _tmp_184: lambda_slash_no_default | lambda_slash_with_default static void * -_tmp_185_rule(Parser *p) +_tmp_184_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36395,18 +36336,18 @@ _tmp_185_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_185[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); + D(fprintf(stderr, "%*c> _tmp_184[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); asdl_arg_seq* lambda_slash_no_default_var; if ( (lambda_slash_no_default_var = lambda_slash_no_default_rule(p)) // lambda_slash_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_185[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); + D(fprintf(stderr, "%*c+ _tmp_184[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); _res = lambda_slash_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_185[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_184[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_no_default")); } { // lambda_slash_with_default @@ -36414,18 +36355,18 @@ _tmp_185_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_185[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_184[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); SlashWithDefault* lambda_slash_with_default_var; if ( (lambda_slash_with_default_var = lambda_slash_with_default_rule(p)) // lambda_slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_185[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_184[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); _res = lambda_slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_185[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_184[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_with_default")); } _res = NULL; @@ -36434,9 +36375,9 @@ _tmp_185_rule(Parser *p) return _res; } -// _loop0_186: lambda_param_maybe_default +// _loop0_185: lambda_param_maybe_default static asdl_seq * -_loop0_186_rule(Parser *p) +_loop0_185_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36461,7 +36402,7 @@ _loop0_186_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_186[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_185[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -36484,7 +36425,7 @@ _loop0_186_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_186[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_185[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36501,9 +36442,9 @@ _loop0_186_rule(Parser *p) return _seq; } -// _loop0_187: lambda_param_no_default +// _loop0_186: lambda_param_no_default static asdl_seq * -_loop0_187_rule(Parser *p) +_loop0_186_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36528,7 +36469,7 @@ _loop0_187_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_187[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop0_186[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -36551,7 +36492,7 @@ _loop0_187_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_187[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_186[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36568,9 +36509,9 @@ _loop0_187_rule(Parser *p) return _seq; } -// _loop0_188: lambda_param_no_default +// _loop0_187: lambda_param_no_default static asdl_seq * -_loop0_188_rule(Parser *p) +_loop0_187_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36595,7 +36536,7 @@ _loop0_188_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_188[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop0_187[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -36618,7 +36559,7 @@ _loop0_188_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_188[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_187[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36635,9 +36576,9 @@ _loop0_188_rule(Parser *p) return _seq; } -// _loop0_190: ',' lambda_param +// _loop0_189: ',' lambda_param static asdl_seq * -_loop0_190_rule(Parser *p) +_loop0_189_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36662,7 +36603,7 @@ _loop0_190_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_190[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' lambda_param")); + D(fprintf(stderr, "%*c> _loop0_189[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' lambda_param")); Token * _literal; arg_ty elem; while ( @@ -36694,7 +36635,7 @@ _loop0_190_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_190[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_189[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' lambda_param")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36711,9 +36652,9 @@ _loop0_190_rule(Parser *p) return _seq; } -// _gather_189: lambda_param _loop0_190 +// _gather_188: lambda_param _loop0_189 static asdl_seq * -_gather_189_rule(Parser *p) +_gather_188_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36724,27 +36665,27 @@ _gather_189_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // lambda_param _loop0_190 + { // lambda_param _loop0_189 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_189[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_190")); + D(fprintf(stderr, "%*c> _gather_188[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_189")); arg_ty elem; asdl_seq * seq; if ( (elem = lambda_param_rule(p)) // lambda_param && - (seq = _loop0_190_rule(p)) // _loop0_190 + (seq = _loop0_189_rule(p)) // _loop0_189 ) { - D(fprintf(stderr, "%*c+ _gather_189[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_190")); + D(fprintf(stderr, "%*c+ _gather_188[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_189")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_189[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param _loop0_190")); + D(fprintf(stderr, "%*c%s _gather_188[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param _loop0_189")); } _res = NULL; done: @@ -36752,9 +36693,9 @@ _gather_189_rule(Parser *p) return _res; } -// _tmp_191: lambda_slash_no_default | lambda_slash_with_default +// _tmp_190: lambda_slash_no_default | lambda_slash_with_default static void * -_tmp_191_rule(Parser *p) +_tmp_190_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36770,18 +36711,18 @@ _tmp_191_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_191[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); + D(fprintf(stderr, "%*c> _tmp_190[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); asdl_arg_seq* lambda_slash_no_default_var; if ( (lambda_slash_no_default_var = lambda_slash_no_default_rule(p)) // lambda_slash_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_191[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); + D(fprintf(stderr, "%*c+ _tmp_190[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); _res = lambda_slash_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_191[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_190[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_no_default")); } { // lambda_slash_with_default @@ -36789,18 +36730,18 @@ _tmp_191_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_191[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_190[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); SlashWithDefault* lambda_slash_with_default_var; if ( (lambda_slash_with_default_var = lambda_slash_with_default_rule(p)) // lambda_slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_191[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_190[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); _res = lambda_slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_191[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_190[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_with_default")); } _res = NULL; @@ -36809,9 +36750,9 @@ _tmp_191_rule(Parser *p) return _res; } -// _loop0_192: lambda_param_maybe_default +// _loop0_191: lambda_param_maybe_default static asdl_seq * -_loop0_192_rule(Parser *p) +_loop0_191_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36836,7 +36777,7 @@ _loop0_192_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_192[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_191[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -36859,7 +36800,7 @@ _loop0_192_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_192[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_191[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36876,9 +36817,9 @@ _loop0_192_rule(Parser *p) return _seq; } -// _tmp_193: ',' | lambda_param_no_default +// _tmp_192: ',' | lambda_param_no_default static void * -_tmp_193_rule(Parser *p) +_tmp_192_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36894,18 +36835,18 @@ _tmp_193_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_193[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_192[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_193[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_192[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_193[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_192[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // lambda_param_no_default @@ -36913,18 +36854,18 @@ _tmp_193_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_193[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _tmp_192[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; if ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_193[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_192[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); _res = lambda_param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_193[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_192[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } _res = NULL; @@ -36933,9 +36874,9 @@ _tmp_193_rule(Parser *p) return _res; } -// _loop0_194: lambda_param_maybe_default +// _loop0_193: lambda_param_maybe_default static asdl_seq * -_loop0_194_rule(Parser *p) +_loop0_193_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -36960,7 +36901,7 @@ _loop0_194_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_194[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_193[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -36983,7 +36924,7 @@ _loop0_194_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_194[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_193[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -37000,9 +36941,9 @@ _loop0_194_rule(Parser *p) return _seq; } -// _loop1_195: lambda_param_maybe_default +// _loop1_194: lambda_param_maybe_default static asdl_seq * -_loop1_195_rule(Parser *p) +_loop1_194_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37027,7 +36968,7 @@ _loop1_195_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_195[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop1_194[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -37050,7 +36991,7 @@ _loop1_195_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_195[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_194[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } if (_n == 0 || p->error_indicator) { @@ -37072,9 +37013,9 @@ _loop1_195_rule(Parser *p) return _seq; } -// _loop1_196: lambda_param_with_default +// _loop1_195: lambda_param_with_default static asdl_seq * -_loop1_196_rule(Parser *p) +_loop1_195_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37099,7 +37040,7 @@ _loop1_196_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_196[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop1_195[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -37122,7 +37063,7 @@ _loop1_196_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_196[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_195[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -37144,9 +37085,9 @@ _loop1_196_rule(Parser *p) return _seq; } -// _tmp_197: ':' | ',' (':' | '**') +// _tmp_196: ':' | ',' (':' | '**') static void * -_tmp_197_rule(Parser *p) +_tmp_196_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37162,18 +37103,18 @@ _tmp_197_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_197[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_196[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_197[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_196[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_197[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_196[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // ',' (':' | '**') @@ -37181,21 +37122,21 @@ _tmp_197_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_197[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + D(fprintf(stderr, "%*c> _tmp_196[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); Token * _literal; - void *_tmp_266_var; + void *_tmp_265_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_266_var = _tmp_266_rule(p)) // ':' | '**' + (_tmp_265_var = _tmp_265_rule(p)) // ':' | '**' ) { - D(fprintf(stderr, "%*c+ _tmp_197[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_266_var); + D(fprintf(stderr, "%*c+ _tmp_196[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_265_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_197[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_196[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (':' | '**')")); } _res = NULL; @@ -37204,9 +37145,9 @@ _tmp_197_rule(Parser *p) return _res; } -// _tmp_198: lambda_param_no_default | ',' +// _tmp_197: lambda_param_no_default | ',' static void * -_tmp_198_rule(Parser *p) +_tmp_197_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37222,18 +37163,18 @@ _tmp_198_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_198[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _tmp_197[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; if ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_198[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_197[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); _res = lambda_param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_198[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_197[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } { // ',' @@ -37241,18 +37182,18 @@ _tmp_198_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_198[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_197[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_198[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_197[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_198[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_197[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -37261,9 +37202,9 @@ _tmp_198_rule(Parser *p) return _res; } -// _loop0_199: lambda_param_maybe_default +// _loop0_198: lambda_param_maybe_default static asdl_seq * -_loop0_199_rule(Parser *p) +_loop0_198_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37288,7 +37229,7 @@ _loop0_199_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_199[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_198[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -37311,7 +37252,7 @@ _loop0_199_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_199[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_198[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -37328,9 +37269,9 @@ _loop0_199_rule(Parser *p) return _seq; } -// _tmp_200: lambda_param_no_default | ',' +// _tmp_199: lambda_param_no_default | ',' static void * -_tmp_200_rule(Parser *p) +_tmp_199_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37346,18 +37287,18 @@ _tmp_200_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_200[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _tmp_199[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; if ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_200[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_199[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); _res = lambda_param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_200[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_199[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } { // ',' @@ -37365,18 +37306,18 @@ _tmp_200_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_200[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_199[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_200[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_199[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_200[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_199[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -37385,9 +37326,9 @@ _tmp_200_rule(Parser *p) return _res; } -// _tmp_201: '*' | '**' | '/' +// _tmp_200: '*' | '**' | '/' static void * -_tmp_201_rule(Parser *p) +_tmp_200_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37403,18 +37344,18 @@ _tmp_201_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_201[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c> _tmp_200[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' ) { - D(fprintf(stderr, "%*c+ _tmp_201[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c+ _tmp_200[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_201[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_200[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*'")); } { // '**' @@ -37422,18 +37363,18 @@ _tmp_201_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_201[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_200[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_201[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_200[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_201[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_200[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } { // '/' @@ -37441,18 +37382,18 @@ _tmp_201_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_201[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c> _tmp_200[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 17)) // token='/' ) { - D(fprintf(stderr, "%*c+ _tmp_201[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c+ _tmp_200[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_201[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_200[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'/'")); } _res = NULL; @@ -37461,9 +37402,9 @@ _tmp_201_rule(Parser *p) return _res; } -// _tmp_202: ',' | ')' | ':' +// _tmp_201: ',' | ')' | ':' static void * -_tmp_202_rule(Parser *p) +_tmp_201_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37479,18 +37420,18 @@ _tmp_202_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_202[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_201[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_202[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_201[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_202[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_201[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // ')' @@ -37498,18 +37439,18 @@ _tmp_202_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_202[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_201[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_202[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_201[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_202[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_201[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ':' @@ -37517,18 +37458,18 @@ _tmp_202_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_202[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_201[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_202[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_201[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_202[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_201[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } _res = NULL; @@ -37537,9 +37478,9 @@ _tmp_202_rule(Parser *p) return _res; } -// _loop0_204: ',' dotted_name +// _loop0_203: ',' dotted_name static asdl_seq * -_loop0_204_rule(Parser *p) +_loop0_203_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37564,7 +37505,7 @@ _loop0_204_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_204[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' dotted_name")); + D(fprintf(stderr, "%*c> _loop0_203[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' dotted_name")); Token * _literal; expr_ty elem; while ( @@ -37596,7 +37537,7 @@ _loop0_204_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_204[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_203[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' dotted_name")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -37613,9 +37554,9 @@ _loop0_204_rule(Parser *p) return _seq; } -// _gather_203: dotted_name _loop0_204 +// _gather_202: dotted_name _loop0_203 static asdl_seq * -_gather_203_rule(Parser *p) +_gather_202_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37626,27 +37567,27 @@ _gather_203_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // dotted_name _loop0_204 + { // dotted_name _loop0_203 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_203[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_name _loop0_204")); + D(fprintf(stderr, "%*c> _gather_202[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_name _loop0_203")); expr_ty elem; asdl_seq * seq; if ( (elem = dotted_name_rule(p)) // dotted_name && - (seq = _loop0_204_rule(p)) // _loop0_204 + (seq = _loop0_203_rule(p)) // _loop0_203 ) { - D(fprintf(stderr, "%*c+ _gather_203[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name _loop0_204")); + D(fprintf(stderr, "%*c+ _gather_202[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name _loop0_203")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_203[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_name _loop0_204")); + D(fprintf(stderr, "%*c%s _gather_202[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_name _loop0_203")); } _res = NULL; done: @@ -37654,9 +37595,9 @@ _gather_203_rule(Parser *p) return _res; } -// _loop0_206: ',' (expression ['as' star_target]) +// _loop0_205: ',' (expression ['as' star_target]) static asdl_seq * -_loop0_206_rule(Parser *p) +_loop0_205_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37681,13 +37622,13 @@ _loop0_206_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_206[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); + D(fprintf(stderr, "%*c> _loop0_205[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_267_rule(p)) // expression ['as' star_target] + (elem = _tmp_266_rule(p)) // expression ['as' star_target] ) { _res = elem; @@ -37713,7 +37654,7 @@ _loop0_206_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_206[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_205[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expression ['as' star_target])")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -37730,9 +37671,9 @@ _loop0_206_rule(Parser *p) return _seq; } -// _gather_205: (expression ['as' star_target]) _loop0_206 +// _gather_204: (expression ['as' star_target]) _loop0_205 static asdl_seq * -_gather_205_rule(Parser *p) +_gather_204_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37743,27 +37684,27 @@ _gather_205_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (expression ['as' star_target]) _loop0_206 + { // (expression ['as' star_target]) _loop0_205 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_205[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_206")); + D(fprintf(stderr, "%*c> _gather_204[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_205")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_267_rule(p)) // expression ['as' star_target] + (elem = _tmp_266_rule(p)) // expression ['as' star_target] && - (seq = _loop0_206_rule(p)) // _loop0_206 + (seq = _loop0_205_rule(p)) // _loop0_205 ) { - D(fprintf(stderr, "%*c+ _gather_205[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_206")); + D(fprintf(stderr, "%*c+ _gather_204[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_205")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_205[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_206")); + D(fprintf(stderr, "%*c%s _gather_204[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_205")); } _res = NULL; done: @@ -37771,9 +37712,9 @@ _gather_205_rule(Parser *p) return _res; } -// _loop0_208: ',' (expressions ['as' star_target]) +// _loop0_207: ',' (expressions ['as' star_target]) static asdl_seq * -_loop0_208_rule(Parser *p) +_loop0_207_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37798,13 +37739,13 @@ _loop0_208_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_208[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); + D(fprintf(stderr, "%*c> _loop0_207[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_268_rule(p)) // expressions ['as' star_target] + (elem = _tmp_267_rule(p)) // expressions ['as' star_target] ) { _res = elem; @@ -37830,7 +37771,7 @@ _loop0_208_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_208[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_207[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expressions ['as' star_target])")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -37847,9 +37788,9 @@ _loop0_208_rule(Parser *p) return _seq; } -// _gather_207: (expressions ['as' star_target]) _loop0_208 +// _gather_206: (expressions ['as' star_target]) _loop0_207 static asdl_seq * -_gather_207_rule(Parser *p) +_gather_206_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37860,27 +37801,27 @@ _gather_207_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (expressions ['as' star_target]) _loop0_208 + { // (expressions ['as' star_target]) _loop0_207 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_207[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_208")); + D(fprintf(stderr, "%*c> _gather_206[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_207")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_268_rule(p)) // expressions ['as' star_target] + (elem = _tmp_267_rule(p)) // expressions ['as' star_target] && - (seq = _loop0_208_rule(p)) // _loop0_208 + (seq = _loop0_207_rule(p)) // _loop0_207 ) { - D(fprintf(stderr, "%*c+ _gather_207[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_208")); + D(fprintf(stderr, "%*c+ _gather_206[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_207")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_207[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_208")); + D(fprintf(stderr, "%*c%s _gather_206[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_207")); } _res = NULL; done: @@ -37888,9 +37829,9 @@ _gather_207_rule(Parser *p) return _res; } -// _loop0_210: ',' (expression ['as' star_target]) +// _loop0_209: ',' (expression ['as' star_target]) static asdl_seq * -_loop0_210_rule(Parser *p) +_loop0_209_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37915,13 +37856,13 @@ _loop0_210_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_210[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); + D(fprintf(stderr, "%*c> _loop0_209[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_269_rule(p)) // expression ['as' star_target] + (elem = _tmp_268_rule(p)) // expression ['as' star_target] ) { _res = elem; @@ -37947,7 +37888,7 @@ _loop0_210_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_210[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_209[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expression ['as' star_target])")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -37964,9 +37905,9 @@ _loop0_210_rule(Parser *p) return _seq; } -// _gather_209: (expression ['as' star_target]) _loop0_210 +// _gather_208: (expression ['as' star_target]) _loop0_209 static asdl_seq * -_gather_209_rule(Parser *p) +_gather_208_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -37977,27 +37918,27 @@ _gather_209_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (expression ['as' star_target]) _loop0_210 + { // (expression ['as' star_target]) _loop0_209 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_209[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_210")); + D(fprintf(stderr, "%*c> _gather_208[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_209")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_269_rule(p)) // expression ['as' star_target] + (elem = _tmp_268_rule(p)) // expression ['as' star_target] && - (seq = _loop0_210_rule(p)) // _loop0_210 + (seq = _loop0_209_rule(p)) // _loop0_209 ) { - D(fprintf(stderr, "%*c+ _gather_209[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_210")); + D(fprintf(stderr, "%*c+ _gather_208[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_209")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_209[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_210")); + D(fprintf(stderr, "%*c%s _gather_208[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_209")); } _res = NULL; done: @@ -38005,9 +37946,9 @@ _gather_209_rule(Parser *p) return _res; } -// _loop0_212: ',' (expressions ['as' star_target]) +// _loop0_211: ',' (expressions ['as' star_target]) static asdl_seq * -_loop0_212_rule(Parser *p) +_loop0_211_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38032,13 +37973,13 @@ _loop0_212_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_212[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); + D(fprintf(stderr, "%*c> _loop0_211[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_270_rule(p)) // expressions ['as' star_target] + (elem = _tmp_269_rule(p)) // expressions ['as' star_target] ) { _res = elem; @@ -38064,7 +38005,7 @@ _loop0_212_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_212[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_211[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expressions ['as' star_target])")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -38081,9 +38022,9 @@ _loop0_212_rule(Parser *p) return _seq; } -// _gather_211: (expressions ['as' star_target]) _loop0_212 +// _gather_210: (expressions ['as' star_target]) _loop0_211 static asdl_seq * -_gather_211_rule(Parser *p) +_gather_210_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38094,27 +38035,27 @@ _gather_211_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (expressions ['as' star_target]) _loop0_212 + { // (expressions ['as' star_target]) _loop0_211 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_211[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_212")); + D(fprintf(stderr, "%*c> _gather_210[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_211")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_270_rule(p)) // expressions ['as' star_target] + (elem = _tmp_269_rule(p)) // expressions ['as' star_target] && - (seq = _loop0_212_rule(p)) // _loop0_212 + (seq = _loop0_211_rule(p)) // _loop0_211 ) { - D(fprintf(stderr, "%*c+ _gather_211[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_212")); + D(fprintf(stderr, "%*c+ _gather_210[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_211")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_211[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_212")); + D(fprintf(stderr, "%*c%s _gather_210[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_211")); } _res = NULL; done: @@ -38122,9 +38063,9 @@ _gather_211_rule(Parser *p) return _res; } -// _tmp_213: 'except' | 'finally' +// _tmp_212: 'except' | 'finally' static void * -_tmp_213_rule(Parser *p) +_tmp_212_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38140,18 +38081,18 @@ _tmp_213_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_213[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except'")); + D(fprintf(stderr, "%*c> _tmp_212[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 651)) // token='except' ) { - D(fprintf(stderr, "%*c+ _tmp_213[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except'")); + D(fprintf(stderr, "%*c+ _tmp_212[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_213[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_212[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except'")); } { // 'finally' @@ -38159,18 +38100,18 @@ _tmp_213_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_213[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'finally'")); + D(fprintf(stderr, "%*c> _tmp_212[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'finally'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 647)) // token='finally' ) { - D(fprintf(stderr, "%*c+ _tmp_213[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'finally'")); + D(fprintf(stderr, "%*c+ _tmp_212[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'finally'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_213[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_212[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'finally'")); } _res = NULL; @@ -38179,9 +38120,9 @@ _tmp_213_rule(Parser *p) return _res; } -// _loop0_214: block +// _loop0_213: block static asdl_seq * -_loop0_214_rule(Parser *p) +_loop0_213_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38206,7 +38147,7 @@ _loop0_214_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_214[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block")); + D(fprintf(stderr, "%*c> _loop0_213[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block")); asdl_stmt_seq* block_var; while ( (block_var = block_rule(p)) // block @@ -38229,7 +38170,7 @@ _loop0_214_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_214[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_213[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "block")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -38246,9 +38187,9 @@ _loop0_214_rule(Parser *p) return _seq; } -// _loop1_215: except_block +// _loop1_214: except_block static asdl_seq * -_loop1_215_rule(Parser *p) +_loop1_214_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38273,7 +38214,7 @@ _loop1_215_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_215[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_block")); + D(fprintf(stderr, "%*c> _loop1_214[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_block")); excepthandler_ty except_block_var; while ( (except_block_var = except_block_rule(p)) // except_block @@ -38296,7 +38237,7 @@ _loop1_215_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_215[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_214[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_block")); } if (_n == 0 || p->error_indicator) { @@ -38318,9 +38259,9 @@ _loop1_215_rule(Parser *p) return _seq; } -// _tmp_216: 'as' NAME +// _tmp_215: 'as' NAME static void * -_tmp_216_rule(Parser *p) +_tmp_215_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38336,7 +38277,7 @@ _tmp_216_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_216[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_215[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( @@ -38345,12 +38286,12 @@ _tmp_216_rule(Parser *p) (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_216[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_215[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_216[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_215[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -38359,9 +38300,9 @@ _tmp_216_rule(Parser *p) return _res; } -// _loop0_217: block +// _loop0_216: block static asdl_seq * -_loop0_217_rule(Parser *p) +_loop0_216_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38386,7 +38327,7 @@ _loop0_217_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_217[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block")); + D(fprintf(stderr, "%*c> _loop0_216[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block")); asdl_stmt_seq* block_var; while ( (block_var = block_rule(p)) // block @@ -38409,7 +38350,7 @@ _loop0_217_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_217[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_216[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "block")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -38426,9 +38367,9 @@ _loop0_217_rule(Parser *p) return _seq; } -// _loop1_218: except_star_block +// _loop1_217: except_star_block static asdl_seq * -_loop1_218_rule(Parser *p) +_loop1_217_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38453,7 +38394,7 @@ _loop1_218_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_218[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_star_block")); + D(fprintf(stderr, "%*c> _loop1_217[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_star_block")); excepthandler_ty except_star_block_var; while ( (except_star_block_var = except_star_block_rule(p)) // except_star_block @@ -38476,7 +38417,7 @@ _loop1_218_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_218[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_217[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_star_block")); } if (_n == 0 || p->error_indicator) { @@ -38498,9 +38439,9 @@ _loop1_218_rule(Parser *p) return _seq; } -// _tmp_219: expression ['as' NAME] +// _tmp_218: expression ['as' NAME] static void * -_tmp_219_rule(Parser *p) +_tmp_218_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38516,22 +38457,22 @@ _tmp_219_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_219[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); + D(fprintf(stderr, "%*c> _tmp_218[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_271_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var = _tmp_270_rule(p), !p->error_indicator) // ['as' NAME] ) { - D(fprintf(stderr, "%*c+ _tmp_219[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); + D(fprintf(stderr, "%*c+ _tmp_218[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); _res = _PyPegen_dummy_name(p, expression_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_219[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_218[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' NAME]")); } _res = NULL; @@ -38540,9 +38481,9 @@ _tmp_219_rule(Parser *p) return _res; } -// _tmp_220: 'as' NAME +// _tmp_219: 'as' NAME static void * -_tmp_220_rule(Parser *p) +_tmp_219_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38558,7 +38499,7 @@ _tmp_220_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_220[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_219[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( @@ -38567,12 +38508,12 @@ _tmp_220_rule(Parser *p) (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_220[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_219[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_220[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_219[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -38581,9 +38522,9 @@ _tmp_220_rule(Parser *p) return _res; } -// _tmp_221: 'as' NAME +// _tmp_220: 'as' NAME static void * -_tmp_221_rule(Parser *p) +_tmp_220_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38599,7 +38540,7 @@ _tmp_221_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_221[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_220[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( @@ -38608,12 +38549,12 @@ _tmp_221_rule(Parser *p) (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_221[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_220[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_221[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_220[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -38622,9 +38563,9 @@ _tmp_221_rule(Parser *p) return _res; } -// _tmp_222: NEWLINE | ':' +// _tmp_221: NEWLINE | ':' static void * -_tmp_222_rule(Parser *p) +_tmp_221_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38640,18 +38581,18 @@ _tmp_222_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_222[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_221[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); Token * newline_var; if ( (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_222[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_221[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); _res = newline_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_222[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_221[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); } { // ':' @@ -38659,18 +38600,18 @@ _tmp_222_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_222[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_221[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_222[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_221[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_222[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_221[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } _res = NULL; @@ -38679,9 +38620,9 @@ _tmp_222_rule(Parser *p) return _res; } -// _tmp_223: 'as' NAME +// _tmp_222: 'as' NAME static void * -_tmp_223_rule(Parser *p) +_tmp_222_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38697,7 +38638,7 @@ _tmp_223_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_223[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_222[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( @@ -38706,12 +38647,12 @@ _tmp_223_rule(Parser *p) (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_223[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_222[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_223[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_222[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -38720,9 +38661,9 @@ _tmp_223_rule(Parser *p) return _res; } -// _tmp_224: 'as' NAME +// _tmp_223: 'as' NAME static void * -_tmp_224_rule(Parser *p) +_tmp_223_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38738,7 +38679,7 @@ _tmp_224_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_224[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_223[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( @@ -38747,12 +38688,12 @@ _tmp_224_rule(Parser *p) (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_224[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_223[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_224[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_223[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -38761,9 +38702,9 @@ _tmp_224_rule(Parser *p) return _res; } -// _tmp_225: positional_patterns ',' +// _tmp_224: positional_patterns ',' static void * -_tmp_225_rule(Parser *p) +_tmp_224_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38779,7 +38720,7 @@ _tmp_225_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_225[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); + D(fprintf(stderr, "%*c> _tmp_224[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); Token * _literal; asdl_pattern_seq* positional_patterns_var; if ( @@ -38788,12 +38729,12 @@ _tmp_225_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_225[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); + D(fprintf(stderr, "%*c+ _tmp_224[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); _res = _PyPegen_dummy_name(p, positional_patterns_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_225[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_224[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "positional_patterns ','")); } _res = NULL; @@ -38802,9 +38743,9 @@ _tmp_225_rule(Parser *p) return _res; } -// _tmp_226: '->' expression +// _tmp_225: '->' expression static void * -_tmp_226_rule(Parser *p) +_tmp_225_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38820,7 +38761,7 @@ _tmp_226_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_226[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c> _tmp_225[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); Token * _literal; expr_ty expression_var; if ( @@ -38829,12 +38770,12 @@ _tmp_226_rule(Parser *p) (expression_var = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_226[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c+ _tmp_225[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); _res = _PyPegen_dummy_name(p, _literal, expression_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_226[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_225[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'->' expression")); } _res = NULL; @@ -38843,9 +38784,9 @@ _tmp_226_rule(Parser *p) return _res; } -// _tmp_227: '(' arguments? ')' +// _tmp_226: '(' arguments? ')' static void * -_tmp_227_rule(Parser *p) +_tmp_226_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38861,7 +38802,7 @@ _tmp_227_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_227[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c> _tmp_226[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); Token * _literal; Token * _literal_1; void *_opt_var; @@ -38874,12 +38815,12 @@ _tmp_227_rule(Parser *p) (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_227[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c+ _tmp_226[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); _res = _PyPegen_dummy_name(p, _literal, _opt_var, _literal_1); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_227[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_226[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' arguments? ')'")); } _res = NULL; @@ -38888,9 +38829,9 @@ _tmp_227_rule(Parser *p) return _res; } -// _tmp_228: '(' arguments? ')' +// _tmp_227: '(' arguments? ')' static void * -_tmp_228_rule(Parser *p) +_tmp_227_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38906,7 +38847,7 @@ _tmp_228_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_228[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c> _tmp_227[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); Token * _literal; Token * _literal_1; void *_opt_var; @@ -38919,12 +38860,12 @@ _tmp_228_rule(Parser *p) (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_228[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c+ _tmp_227[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); _res = _PyPegen_dummy_name(p, _literal, _opt_var, _literal_1); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_228[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_227[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' arguments? ')'")); } _res = NULL; @@ -38933,9 +38874,9 @@ _tmp_228_rule(Parser *p) return _res; } -// _loop0_230: ',' double_starred_kvpair +// _loop0_229: ',' double_starred_kvpair static asdl_seq * -_loop0_230_rule(Parser *p) +_loop0_229_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -38960,7 +38901,7 @@ _loop0_230_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_230[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); + D(fprintf(stderr, "%*c> _loop0_229[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); Token * _literal; KeyValuePair* elem; while ( @@ -38992,7 +38933,7 @@ _loop0_230_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_230[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_229[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -39009,9 +38950,9 @@ _loop0_230_rule(Parser *p) return _seq; } -// _gather_229: double_starred_kvpair _loop0_230 +// _gather_228: double_starred_kvpair _loop0_229 static asdl_seq * -_gather_229_rule(Parser *p) +_gather_228_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39022,27 +38963,27 @@ _gather_229_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // double_starred_kvpair _loop0_230 + { // double_starred_kvpair _loop0_229 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_229[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_230")); + D(fprintf(stderr, "%*c> _gather_228[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_229")); KeyValuePair* elem; asdl_seq * seq; if ( (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair && - (seq = _loop0_230_rule(p)) // _loop0_230 + (seq = _loop0_229_rule(p)) // _loop0_229 ) { - D(fprintf(stderr, "%*c+ _gather_229[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_230")); + D(fprintf(stderr, "%*c+ _gather_228[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_229")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_229[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_230")); + D(fprintf(stderr, "%*c%s _gather_228[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_229")); } _res = NULL; done: @@ -39050,9 +38991,9 @@ _gather_229_rule(Parser *p) return _res; } -// _tmp_231: '}' | ',' +// _tmp_230: '}' | ',' static void * -_tmp_231_rule(Parser *p) +_tmp_230_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39068,18 +39009,18 @@ _tmp_231_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_231[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c> _tmp_230[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ _tmp_231[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c+ _tmp_230[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_231[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_230[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); } { // ',' @@ -39087,18 +39028,18 @@ _tmp_231_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_231[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_230[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_231[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_230[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_231[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_230[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -39107,9 +39048,9 @@ _tmp_231_rule(Parser *p) return _res; } -// _tmp_232: '}' | ',' +// _tmp_231: '}' | ',' static void * -_tmp_232_rule(Parser *p) +_tmp_231_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39125,18 +39066,18 @@ _tmp_232_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_232[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c> _tmp_231[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ _tmp_232[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c+ _tmp_231[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_232[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_231[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); } { // ',' @@ -39144,18 +39085,18 @@ _tmp_232_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_232[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_231[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_232[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_231[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_232[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_231[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -39164,9 +39105,9 @@ _tmp_232_rule(Parser *p) return _res; } -// _tmp_233: yield_expr | star_expressions +// _tmp_232: yield_expr | star_expressions static void * -_tmp_233_rule(Parser *p) +_tmp_232_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39182,18 +39123,18 @@ _tmp_233_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_233[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_232[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_233[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_232[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_233[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_232[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -39201,18 +39142,18 @@ _tmp_233_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_233[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_232[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_233[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_232[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_233[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_232[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -39221,9 +39162,9 @@ _tmp_233_rule(Parser *p) return _res; } -// _tmp_234: yield_expr | star_expressions +// _tmp_233: yield_expr | star_expressions static void * -_tmp_234_rule(Parser *p) +_tmp_233_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39239,18 +39180,18 @@ _tmp_234_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_234[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_233[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_234[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_233[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_234[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_233[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -39258,18 +39199,18 @@ _tmp_234_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_234[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_233[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_234[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_233[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_234[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_233[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -39278,9 +39219,9 @@ _tmp_234_rule(Parser *p) return _res; } -// _tmp_235: '=' | '!' | ':' | '}' +// _tmp_234: '=' | '!' | ':' | '}' static void * -_tmp_235_rule(Parser *p) +_tmp_234_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39296,18 +39237,18 @@ _tmp_235_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_235[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c> _tmp_234[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_235[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c+ _tmp_234[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_235[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_234[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); } { // '!' @@ -39315,18 +39256,18 @@ _tmp_235_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_235[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!'")); + D(fprintf(stderr, "%*c> _tmp_234[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 54)) // token='!' ) { - D(fprintf(stderr, "%*c+ _tmp_235[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!'")); + D(fprintf(stderr, "%*c+ _tmp_234[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_235[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_234[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!'")); } { // ':' @@ -39334,18 +39275,18 @@ _tmp_235_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_235[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_234[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_235[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_234[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_235[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_234[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '}' @@ -39353,18 +39294,18 @@ _tmp_235_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_235[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c> _tmp_234[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ _tmp_235[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c+ _tmp_234[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_235[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_234[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); } _res = NULL; @@ -39373,9 +39314,9 @@ _tmp_235_rule(Parser *p) return _res; } -// _tmp_236: yield_expr | star_expressions +// _tmp_235: yield_expr | star_expressions static void * -_tmp_236_rule(Parser *p) +_tmp_235_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39391,18 +39332,18 @@ _tmp_236_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_236[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_235[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_236[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_235[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_236[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_235[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -39410,18 +39351,18 @@ _tmp_236_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_236[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_235[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_236[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_235[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_236[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_235[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -39430,9 +39371,9 @@ _tmp_236_rule(Parser *p) return _res; } -// _tmp_237: '!' | ':' | '}' +// _tmp_236: '!' | ':' | '}' static void * -_tmp_237_rule(Parser *p) +_tmp_236_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39448,18 +39389,18 @@ _tmp_237_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_237[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!'")); + D(fprintf(stderr, "%*c> _tmp_236[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 54)) // token='!' ) { - D(fprintf(stderr, "%*c+ _tmp_237[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!'")); + D(fprintf(stderr, "%*c+ _tmp_236[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_237[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_236[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!'")); } { // ':' @@ -39467,18 +39408,18 @@ _tmp_237_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_237[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_236[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_237[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_236[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_237[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_236[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '}' @@ -39486,18 +39427,18 @@ _tmp_237_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_237[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c> _tmp_236[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ _tmp_237[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c+ _tmp_236[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_237[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_236[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); } _res = NULL; @@ -39506,9 +39447,9 @@ _tmp_237_rule(Parser *p) return _res; } -// _tmp_238: yield_expr | star_expressions +// _tmp_237: yield_expr | star_expressions static void * -_tmp_238_rule(Parser *p) +_tmp_237_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39524,18 +39465,18 @@ _tmp_238_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_238[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_237[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_238[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_237[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_238[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_237[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -39543,18 +39484,18 @@ _tmp_238_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_238[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_237[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_238[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_237[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_238[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_237[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -39563,9 +39504,9 @@ _tmp_238_rule(Parser *p) return _res; } -// _tmp_239: yield_expr | star_expressions +// _tmp_238: yield_expr | star_expressions static void * -_tmp_239_rule(Parser *p) +_tmp_238_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39581,18 +39522,18 @@ _tmp_239_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_239[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_238[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_239[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_238[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_239[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_238[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -39600,18 +39541,18 @@ _tmp_239_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_239[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_238[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_239[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_238[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_239[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_238[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -39620,9 +39561,9 @@ _tmp_239_rule(Parser *p) return _res; } -// _tmp_240: '!' NAME +// _tmp_239: '!' NAME static void * -_tmp_240_rule(Parser *p) +_tmp_239_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39638,7 +39579,7 @@ _tmp_240_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_240[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + D(fprintf(stderr, "%*c> _tmp_239[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' NAME")); Token * _literal; expr_ty name_var; if ( @@ -39647,12 +39588,12 @@ _tmp_240_rule(Parser *p) (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_240[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + D(fprintf(stderr, "%*c+ _tmp_239[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' NAME")); _res = _PyPegen_dummy_name(p, _literal, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_240[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_239[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!' NAME")); } _res = NULL; @@ -39661,9 +39602,9 @@ _tmp_240_rule(Parser *p) return _res; } -// _tmp_241: ':' | '}' +// _tmp_240: ':' | '}' static void * -_tmp_241_rule(Parser *p) +_tmp_240_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39679,18 +39620,18 @@ _tmp_241_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_241[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_240[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_241[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_240[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_241[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_240[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '}' @@ -39698,18 +39639,18 @@ _tmp_241_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_241[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c> _tmp_240[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ _tmp_241[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c+ _tmp_240[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_241[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_240[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); } _res = NULL; @@ -39718,9 +39659,9 @@ _tmp_241_rule(Parser *p) return _res; } -// _tmp_242: yield_expr | star_expressions +// _tmp_241: yield_expr | star_expressions static void * -_tmp_242_rule(Parser *p) +_tmp_241_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39736,18 +39677,18 @@ _tmp_242_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_242[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_241[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_242[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_241[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_242[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_241[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -39755,18 +39696,18 @@ _tmp_242_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_242[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_241[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_242[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_241[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_242[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_241[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -39775,9 +39716,9 @@ _tmp_242_rule(Parser *p) return _res; } -// _tmp_243: '!' NAME +// _tmp_242: '!' NAME static void * -_tmp_243_rule(Parser *p) +_tmp_242_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39793,7 +39734,7 @@ _tmp_243_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_243[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + D(fprintf(stderr, "%*c> _tmp_242[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' NAME")); Token * _literal; expr_ty name_var; if ( @@ -39802,12 +39743,12 @@ _tmp_243_rule(Parser *p) (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_243[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + D(fprintf(stderr, "%*c+ _tmp_242[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' NAME")); _res = _PyPegen_dummy_name(p, _literal, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_243[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_242[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!' NAME")); } _res = NULL; @@ -39816,9 +39757,9 @@ _tmp_243_rule(Parser *p) return _res; } -// _loop0_244: fstring_format_spec +// _loop0_243: fstring_format_spec static asdl_seq * -_loop0_244_rule(Parser *p) +_loop0_243_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39843,7 +39784,7 @@ _loop0_244_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_244[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_format_spec")); + D(fprintf(stderr, "%*c> _loop0_243[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_format_spec")); expr_ty fstring_format_spec_var; while ( (fstring_format_spec_var = fstring_format_spec_rule(p)) // fstring_format_spec @@ -39866,7 +39807,7 @@ _loop0_244_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_244[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_243[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_format_spec")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -39883,9 +39824,9 @@ _loop0_244_rule(Parser *p) return _seq; } -// _tmp_245: yield_expr | star_expressions +// _tmp_244: yield_expr | star_expressions static void * -_tmp_245_rule(Parser *p) +_tmp_244_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39901,18 +39842,18 @@ _tmp_245_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_245[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_244[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_245[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_244[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_245[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_244[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -39920,18 +39861,18 @@ _tmp_245_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_245[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_244[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_245[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_244[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_245[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_244[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -39940,9 +39881,9 @@ _tmp_245_rule(Parser *p) return _res; } -// _tmp_246: '!' NAME +// _tmp_245: '!' NAME static void * -_tmp_246_rule(Parser *p) +_tmp_245_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39958,7 +39899,7 @@ _tmp_246_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_246[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + D(fprintf(stderr, "%*c> _tmp_245[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' NAME")); Token * _literal; expr_ty name_var; if ( @@ -39967,12 +39908,12 @@ _tmp_246_rule(Parser *p) (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_246[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + D(fprintf(stderr, "%*c+ _tmp_245[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' NAME")); _res = _PyPegen_dummy_name(p, _literal, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_246[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_245[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!' NAME")); } _res = NULL; @@ -39981,9 +39922,9 @@ _tmp_246_rule(Parser *p) return _res; } -// _tmp_247: ':' | '}' +// _tmp_246: ':' | '}' static void * -_tmp_247_rule(Parser *p) +_tmp_246_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -39999,18 +39940,18 @@ _tmp_247_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_247[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_246[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_247[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_246[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_247[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_246[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '}' @@ -40018,18 +39959,18 @@ _tmp_247_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_247[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c> _tmp_246[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ _tmp_247[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c+ _tmp_246[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_247[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_246[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); } _res = NULL; @@ -40038,9 +39979,9 @@ _tmp_247_rule(Parser *p) return _res; } -// _tmp_248: star_targets '=' +// _tmp_247: star_targets '=' static void * -_tmp_248_rule(Parser *p) +_tmp_247_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40056,7 +39997,7 @@ _tmp_248_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_248[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_247[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty z; if ( @@ -40065,7 +40006,7 @@ _tmp_248_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_248[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_247[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -40075,7 +40016,7 @@ _tmp_248_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_248[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_247[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -40084,9 +40025,9 @@ _tmp_248_rule(Parser *p) return _res; } -// _tmp_249: '.' | '...' +// _tmp_248: '.' | '...' static void * -_tmp_249_rule(Parser *p) +_tmp_248_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40102,18 +40043,18 @@ _tmp_249_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_249[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_248[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_249[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_248[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_249[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_248[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -40121,18 +40062,18 @@ _tmp_249_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_249[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_248[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_249[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_248[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_249[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_248[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -40141,9 +40082,9 @@ _tmp_249_rule(Parser *p) return _res; } -// _tmp_250: '.' | '...' +// _tmp_249: '.' | '...' static void * -_tmp_250_rule(Parser *p) +_tmp_249_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40159,18 +40100,18 @@ _tmp_250_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_250[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_249[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_250[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_249[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_250[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_249[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -40178,18 +40119,18 @@ _tmp_250_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_250[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_249[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_250[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_249[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_250[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_249[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -40198,9 +40139,9 @@ _tmp_250_rule(Parser *p) return _res; } -// _tmp_251: '@' named_expression NEWLINE +// _tmp_250: '@' named_expression NEWLINE static void * -_tmp_251_rule(Parser *p) +_tmp_250_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40216,7 +40157,7 @@ _tmp_251_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_251[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_250[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); Token * _literal; expr_ty f; Token * newline_var; @@ -40228,7 +40169,7 @@ _tmp_251_rule(Parser *p) (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_251[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_250[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); _res = f; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -40238,7 +40179,7 @@ _tmp_251_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_251[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_250[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@' named_expression NEWLINE")); } _res = NULL; @@ -40247,9 +40188,9 @@ _tmp_251_rule(Parser *p) return _res; } -// _tmp_252: ',' expression +// _tmp_251: ',' expression static void * -_tmp_252_rule(Parser *p) +_tmp_251_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40265,7 +40206,7 @@ _tmp_252_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_252[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _tmp_251[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty c; if ( @@ -40274,7 +40215,7 @@ _tmp_252_rule(Parser *p) (c = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_252[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c+ _tmp_251[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -40284,7 +40225,7 @@ _tmp_252_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_252[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_251[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } _res = NULL; @@ -40293,9 +40234,9 @@ _tmp_252_rule(Parser *p) return _res; } -// _tmp_253: ',' star_expression +// _tmp_252: ',' star_expression static void * -_tmp_253_rule(Parser *p) +_tmp_252_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40311,7 +40252,7 @@ _tmp_253_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_253[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c> _tmp_252[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); Token * _literal; expr_ty c; if ( @@ -40320,7 +40261,7 @@ _tmp_253_rule(Parser *p) (c = star_expression_rule(p)) // star_expression ) { - D(fprintf(stderr, "%*c+ _tmp_253[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c+ _tmp_252[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -40330,7 +40271,7 @@ _tmp_253_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_253[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_252[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); } _res = NULL; @@ -40339,9 +40280,9 @@ _tmp_253_rule(Parser *p) return _res; } -// _tmp_254: 'or' conjunction +// _tmp_253: 'or' conjunction static void * -_tmp_254_rule(Parser *p) +_tmp_253_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40357,7 +40298,7 @@ _tmp_254_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_254[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c> _tmp_253[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); Token * _keyword; expr_ty c; if ( @@ -40366,7 +40307,7 @@ _tmp_254_rule(Parser *p) (c = conjunction_rule(p)) // conjunction ) { - D(fprintf(stderr, "%*c+ _tmp_254[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c+ _tmp_253[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -40376,7 +40317,7 @@ _tmp_254_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_254[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_253[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'or' conjunction")); } _res = NULL; @@ -40385,9 +40326,9 @@ _tmp_254_rule(Parser *p) return _res; } -// _tmp_255: 'and' inversion +// _tmp_254: 'and' inversion static void * -_tmp_255_rule(Parser *p) +_tmp_254_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40403,7 +40344,7 @@ _tmp_255_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_255[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c> _tmp_254[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); Token * _keyword; expr_ty c; if ( @@ -40412,7 +40353,7 @@ _tmp_255_rule(Parser *p) (c = inversion_rule(p)) // inversion ) { - D(fprintf(stderr, "%*c+ _tmp_255[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c+ _tmp_254[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -40422,7 +40363,7 @@ _tmp_255_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_255[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_254[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'and' inversion")); } _res = NULL; @@ -40431,9 +40372,9 @@ _tmp_255_rule(Parser *p) return _res; } -// _tmp_256: slice | starred_expression +// _tmp_255: slice | starred_expression static void * -_tmp_256_rule(Parser *p) +_tmp_255_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40449,18 +40390,18 @@ _tmp_256_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_256[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slice")); + D(fprintf(stderr, "%*c> _tmp_255[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slice")); expr_ty slice_var; if ( (slice_var = slice_rule(p)) // slice ) { - D(fprintf(stderr, "%*c+ _tmp_256[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slice")); + D(fprintf(stderr, "%*c+ _tmp_255[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slice")); _res = slice_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_256[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_255[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slice")); } { // starred_expression @@ -40468,18 +40409,18 @@ _tmp_256_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_256[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c> _tmp_255[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); expr_ty starred_expression_var; if ( (starred_expression_var = starred_expression_rule(p)) // starred_expression ) { - D(fprintf(stderr, "%*c+ _tmp_256[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c+ _tmp_255[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); _res = starred_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_256[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_255[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } _res = NULL; @@ -40488,9 +40429,9 @@ _tmp_256_rule(Parser *p) return _res; } -// _tmp_257: fstring | string +// _tmp_256: fstring | string static void * -_tmp_257_rule(Parser *p) +_tmp_256_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40506,18 +40447,18 @@ _tmp_257_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_257[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring")); + D(fprintf(stderr, "%*c> _tmp_256[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring")); expr_ty fstring_var; if ( (fstring_var = fstring_rule(p)) // fstring ) { - D(fprintf(stderr, "%*c+ _tmp_257[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "fstring")); + D(fprintf(stderr, "%*c+ _tmp_256[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "fstring")); _res = fstring_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_257[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_256[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring")); } { // string @@ -40525,18 +40466,18 @@ _tmp_257_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_257[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "string")); + D(fprintf(stderr, "%*c> _tmp_256[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "string")); expr_ty string_var; if ( (string_var = string_rule(p)) // string ) { - D(fprintf(stderr, "%*c+ _tmp_257[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "string")); + D(fprintf(stderr, "%*c+ _tmp_256[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "string")); _res = string_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_257[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_256[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "string")); } _res = NULL; @@ -40545,9 +40486,9 @@ _tmp_257_rule(Parser *p) return _res; } -// _tmp_258: 'if' disjunction +// _tmp_257: 'if' disjunction static void * -_tmp_258_rule(Parser *p) +_tmp_257_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40563,7 +40504,7 @@ _tmp_258_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_258[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_257[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -40572,7 +40513,7 @@ _tmp_258_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_258[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_257[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -40582,7 +40523,7 @@ _tmp_258_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_258[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_257[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -40591,9 +40532,9 @@ _tmp_258_rule(Parser *p) return _res; } -// _tmp_259: 'if' disjunction +// _tmp_258: 'if' disjunction static void * -_tmp_259_rule(Parser *p) +_tmp_258_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40609,7 +40550,7 @@ _tmp_259_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_259[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_258[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -40618,7 +40559,7 @@ _tmp_259_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_259[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_258[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -40628,7 +40569,7 @@ _tmp_259_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_259[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_258[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -40637,9 +40578,9 @@ _tmp_259_rule(Parser *p) return _res; } -// _tmp_260: starred_expression | (assignment_expression | expression !':=') !'=' +// _tmp_259: starred_expression | (assignment_expression | expression !':=') !'=' static void * -_tmp_260_rule(Parser *p) +_tmp_259_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40655,18 +40596,18 @@ _tmp_260_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_260[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c> _tmp_259[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); expr_ty starred_expression_var; if ( (starred_expression_var = starred_expression_rule(p)) // starred_expression ) { - D(fprintf(stderr, "%*c+ _tmp_260[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c+ _tmp_259[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); _res = starred_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_260[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_259[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } { // (assignment_expression | expression !':=') !'=' @@ -40674,20 +40615,20 @@ _tmp_260_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_260[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); - void *_tmp_272_var; + D(fprintf(stderr, "%*c> _tmp_259[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); + void *_tmp_271_var; if ( - (_tmp_272_var = _tmp_272_rule(p)) // assignment_expression | expression !':=' + (_tmp_271_var = _tmp_271_rule(p)) // assignment_expression | expression !':=' && _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_260[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); - _res = _tmp_272_var; + D(fprintf(stderr, "%*c+ _tmp_259[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); + _res = _tmp_271_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_260[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_259[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(assignment_expression | expression !':=') !'='")); } _res = NULL; @@ -40696,9 +40637,9 @@ _tmp_260_rule(Parser *p) return _res; } -// _tmp_261: ',' star_target +// _tmp_260: ',' star_target static void * -_tmp_261_rule(Parser *p) +_tmp_260_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40714,7 +40655,7 @@ _tmp_261_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_261[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_260[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -40723,7 +40664,7 @@ _tmp_261_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_261[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_260[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -40733,7 +40674,7 @@ _tmp_261_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_261[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_260[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -40742,9 +40683,9 @@ _tmp_261_rule(Parser *p) return _res; } -// _tmp_262: ',' star_target +// _tmp_261: ',' star_target static void * -_tmp_262_rule(Parser *p) +_tmp_261_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40760,7 +40701,7 @@ _tmp_262_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_262[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_261[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -40769,7 +40710,7 @@ _tmp_262_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_262[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_261[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -40779,7 +40720,7 @@ _tmp_262_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_262[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_261[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -40788,9 +40729,9 @@ _tmp_262_rule(Parser *p) return _res; } -// _tmp_263: star_targets '=' +// _tmp_262: star_targets '=' static void * -_tmp_263_rule(Parser *p) +_tmp_262_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40806,7 +40747,7 @@ _tmp_263_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_263[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_262[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -40815,12 +40756,12 @@ _tmp_263_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_263[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_262[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_263[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_262[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -40829,9 +40770,9 @@ _tmp_263_rule(Parser *p) return _res; } -// _tmp_264: star_targets '=' +// _tmp_263: star_targets '=' static void * -_tmp_264_rule(Parser *p) +_tmp_263_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40847,7 +40788,7 @@ _tmp_264_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_264[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_263[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -40856,12 +40797,12 @@ _tmp_264_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_264[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_263[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_264[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_263[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -40870,9 +40811,9 @@ _tmp_264_rule(Parser *p) return _res; } -// _tmp_265: ')' | '**' +// _tmp_264: ')' | '**' static void * -_tmp_265_rule(Parser *p) +_tmp_264_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40888,18 +40829,18 @@ _tmp_265_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_265[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_264[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_265[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_264[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_265[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_264[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // '**' @@ -40907,18 +40848,18 @@ _tmp_265_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_265[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_264[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_265[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_264[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_265[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_264[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -40927,9 +40868,9 @@ _tmp_265_rule(Parser *p) return _res; } -// _tmp_266: ':' | '**' +// _tmp_265: ':' | '**' static void * -_tmp_266_rule(Parser *p) +_tmp_265_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -40945,18 +40886,18 @@ _tmp_266_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_266[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_265[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_266[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_265[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_266[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_265[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '**' @@ -40964,18 +40905,18 @@ _tmp_266_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_266[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_265[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_266[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_265[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_266[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_265[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -40984,9 +40925,9 @@ _tmp_266_rule(Parser *p) return _res; } -// _tmp_267: expression ['as' star_target] +// _tmp_266: expression ['as' star_target] static void * -_tmp_267_rule(Parser *p) +_tmp_266_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -41002,22 +40943,22 @@ _tmp_267_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_267[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_266[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_273_rule(p), !p->error_indicator) // ['as' star_target] + (_opt_var = _tmp_272_rule(p), !p->error_indicator) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_267[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_266[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); _res = _PyPegen_dummy_name(p, expression_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_267[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_266[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' star_target]")); } _res = NULL; @@ -41026,9 +40967,9 @@ _tmp_267_rule(Parser *p) return _res; } -// _tmp_268: expressions ['as' star_target] +// _tmp_267: expressions ['as' star_target] static void * -_tmp_268_rule(Parser *p) +_tmp_267_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -41044,22 +40985,22 @@ _tmp_268_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_268[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_267[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expressions_var; if ( (expressions_var = expressions_rule(p)) // expressions && - (_opt_var = _tmp_274_rule(p), !p->error_indicator) // ['as' star_target] + (_opt_var = _tmp_273_rule(p), !p->error_indicator) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_268[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_267[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); _res = _PyPegen_dummy_name(p, expressions_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_268[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_267[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expressions ['as' star_target]")); } _res = NULL; @@ -41068,9 +41009,9 @@ _tmp_268_rule(Parser *p) return _res; } -// _tmp_269: expression ['as' star_target] +// _tmp_268: expression ['as' star_target] static void * -_tmp_269_rule(Parser *p) +_tmp_268_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -41086,22 +41027,22 @@ _tmp_269_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_269[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_268[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_275_rule(p), !p->error_indicator) // ['as' star_target] + (_opt_var = _tmp_274_rule(p), !p->error_indicator) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_269[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_268[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); _res = _PyPegen_dummy_name(p, expression_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_269[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_268[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' star_target]")); } _res = NULL; @@ -41110,9 +41051,9 @@ _tmp_269_rule(Parser *p) return _res; } -// _tmp_270: expressions ['as' star_target] +// _tmp_269: expressions ['as' star_target] static void * -_tmp_270_rule(Parser *p) +_tmp_269_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -41128,22 +41069,22 @@ _tmp_270_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_270[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_269[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expressions_var; if ( (expressions_var = expressions_rule(p)) // expressions && - (_opt_var = _tmp_276_rule(p), !p->error_indicator) // ['as' star_target] + (_opt_var = _tmp_275_rule(p), !p->error_indicator) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_270[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_269[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); _res = _PyPegen_dummy_name(p, expressions_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_270[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_269[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expressions ['as' star_target]")); } _res = NULL; @@ -41152,9 +41093,9 @@ _tmp_270_rule(Parser *p) return _res; } -// _tmp_271: 'as' NAME +// _tmp_270: 'as' NAME static void * -_tmp_271_rule(Parser *p) +_tmp_270_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -41170,7 +41111,7 @@ _tmp_271_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_271[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_270[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( @@ -41179,12 +41120,12 @@ _tmp_271_rule(Parser *p) (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_271[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_270[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_271[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_270[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -41193,9 +41134,9 @@ _tmp_271_rule(Parser *p) return _res; } -// _tmp_272: assignment_expression | expression !':=' +// _tmp_271: assignment_expression | expression !':=' static void * -_tmp_272_rule(Parser *p) +_tmp_271_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -41211,18 +41152,18 @@ _tmp_272_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_272[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment_expression")); + D(fprintf(stderr, "%*c> _tmp_271[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment_expression")); expr_ty assignment_expression_var; if ( (assignment_expression_var = assignment_expression_rule(p)) // assignment_expression ) { - D(fprintf(stderr, "%*c+ _tmp_272[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment_expression")); + D(fprintf(stderr, "%*c+ _tmp_271[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment_expression")); _res = assignment_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_272[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_271[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "assignment_expression")); } { // expression !':=' @@ -41230,7 +41171,7 @@ _tmp_272_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_272[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='")); + D(fprintf(stderr, "%*c> _tmp_271[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='")); expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression @@ -41238,12 +41179,12 @@ _tmp_272_rule(Parser *p) _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 53) // token=':=' ) { - D(fprintf(stderr, "%*c+ _tmp_272[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='")); + D(fprintf(stderr, "%*c+ _tmp_271[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='")); _res = expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_272[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_271[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression !':='")); } _res = NULL; @@ -41252,9 +41193,9 @@ _tmp_272_rule(Parser *p) return _res; } -// _tmp_273: 'as' star_target +// _tmp_272: 'as' star_target static void * -_tmp_273_rule(Parser *p) +_tmp_272_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -41270,7 +41211,7 @@ _tmp_273_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_273[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_272[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( @@ -41279,12 +41220,12 @@ _tmp_273_rule(Parser *p) (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_273[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_272[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_273[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_272[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; @@ -41293,9 +41234,9 @@ _tmp_273_rule(Parser *p) return _res; } -// _tmp_274: 'as' star_target +// _tmp_273: 'as' star_target static void * -_tmp_274_rule(Parser *p) +_tmp_273_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -41311,7 +41252,7 @@ _tmp_274_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_274[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_273[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( @@ -41320,12 +41261,12 @@ _tmp_274_rule(Parser *p) (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_274[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_273[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_274[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_273[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; @@ -41334,9 +41275,9 @@ _tmp_274_rule(Parser *p) return _res; } -// _tmp_275: 'as' star_target +// _tmp_274: 'as' star_target static void * -_tmp_275_rule(Parser *p) +_tmp_274_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -41352,7 +41293,7 @@ _tmp_275_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_275[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_274[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( @@ -41361,12 +41302,12 @@ _tmp_275_rule(Parser *p) (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_275[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_274[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_275[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_274[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; @@ -41375,9 +41316,9 @@ _tmp_275_rule(Parser *p) return _res; } -// _tmp_276: 'as' star_target +// _tmp_275: 'as' star_target static void * -_tmp_276_rule(Parser *p) +_tmp_275_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -41393,7 +41334,7 @@ _tmp_276_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_276[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_275[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( @@ -41402,12 +41343,12 @@ _tmp_276_rule(Parser *p) (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_276[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_275[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_276[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_275[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; From 15d659f929bb2a79fa7211947ef4f2c43818fd31 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 8 Sep 2023 22:06:34 +0200 Subject: [PATCH 110/357] gh-91960: FreeBSD Cirrus CI runs configure separately (#109127) Run configure and make in separated steps to have more readable logs. --- .cirrus.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 823b1f921d66d1..ca41c2e9092fa6 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -10,13 +10,16 @@ freebsd_task: sysctl_script: - sysctl net.inet.tcp.blackhole=0 - sysctl net.inet.udp.blackhole=0 - build_script: + configure_script: - mkdir build - cd build - ../configure --with-pydebug + build_script: + - cd build - make -j$(sysctl -n hw.ncpu) pythoninfo_script: - - cd build && make pythoninfo + - cd build + - make pythoninfo test_script: - cd build # dtrace fails to build on FreeBSD - see gh-73263 From 697c9dcf8fc746636c6187e4f110e0e6e865b710 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Fri, 8 Sep 2023 22:05:40 +0100 Subject: [PATCH 111/357] gh-108455: peg_generator: enable mypy's `--warn-unreachable` setting and `redundant-expr` error code (#109160) --- Tools/peg_generator/mypy.ini | 14 +++++++++++--- Tools/peg_generator/pegen/ast_dump.py | 2 -- Tools/peg_generator/pegen/grammar.py | 6 ++---- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Tools/peg_generator/mypy.ini b/Tools/peg_generator/mypy.ini index 8820d77b36f646..f38f21bed004b2 100644 --- a/Tools/peg_generator/mypy.ini +++ b/Tools/peg_generator/mypy.ini @@ -8,8 +8,16 @@ python_version = 3.10 # Be strict... strict = True -enable_error_code = truthy-bool,ignore-without-code +warn_unreachable = True +enable_error_code = truthy-bool,ignore-without-code,redundant-expr -# except for a few settings that can't yet be enabled: +# This causes *many* false positives on the peg_generator +# due to pegen.grammar.GrammarVisitor returning Any from visit() and generic_visit(). +# It would be possible to workaround the false positives using asserts, +# but it would be pretty tedious, and probably isn't worth it. warn_return_any = False -warn_unreachable = False + +# Not all of the strictest settings can be enabled +# on generated Python code yet: +[mypy-pegen.grammar_parser.*] +disable_error_code = redundant-expr diff --git a/Tools/peg_generator/pegen/ast_dump.py b/Tools/peg_generator/pegen/ast_dump.py index 2c57d0932fda37..07f8799c114f5d 100644 --- a/Tools/peg_generator/pegen/ast_dump.py +++ b/Tools/peg_generator/pegen/ast_dump.py @@ -66,6 +66,4 @@ def _format(node: Any, level: int = 0) -> Tuple[str, bool]: if all(cls.__name__ != "AST" for cls in node.__class__.__mro__): raise TypeError("expected AST, got %r" % node.__class__.__name__) - if indent is not None and not isinstance(indent, str): - indent = " " * indent return _format(node)[0] diff --git a/Tools/peg_generator/pegen/grammar.py b/Tools/peg_generator/pegen/grammar.py index fcf868eb1753e5..065894e7fe66ab 100644 --- a/Tools/peg_generator/pegen/grammar.py +++ b/Tools/peg_generator/pegen/grammar.py @@ -112,8 +112,7 @@ def __str__(self) -> str: return self.value def __iter__(self) -> Iterable[str]: - if False: - yield + yield from () class NameLeaf(Leaf): @@ -335,8 +334,7 @@ def __str__(self) -> str: return f"~" def __iter__(self) -> Iterator[Tuple[str, str]]: - if False: - yield + yield from () def __eq__(self, other: object) -> bool: if not isinstance(other, Cut): From 1f7e42131d2800f0fbb89bfd91fafa8a073e066d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 8 Sep 2023 23:14:33 +0200 Subject: [PATCH 112/357] gh-109054: configure checks if libatomic is needed (#109101) Fix building the _testcapi extension on Linux AArch64 which requires linking to libatomic when is used: the _Py_atomic_or_uint64() function requires libatomic __atomic_fetch_or_8() on this platform. The configure script now checks if linking to libatomic is needed and generates a new LIBATOMIC variable used to build the _testcapi extension. Building the _testcapi extension now uses the LIBATOMIC variable in its LDFLAGS, since Modules/_testcapi/pyatomic.c uses . Co-authored-by: Erlend E. Aasland --- ...-09-07-19-58-05.gh-issue-109054.5r3S3l.rst | 6 ++ configure | 85 ++++++++++++++++++- configure.ac | 62 +++++++++++++- 3 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2023-09-07-19-58-05.gh-issue-109054.5r3S3l.rst diff --git a/Misc/NEWS.d/next/Build/2023-09-07-19-58-05.gh-issue-109054.5r3S3l.rst b/Misc/NEWS.d/next/Build/2023-09-07-19-58-05.gh-issue-109054.5r3S3l.rst new file mode 100644 index 00000000000000..d86a110e0de68c --- /dev/null +++ b/Misc/NEWS.d/next/Build/2023-09-07-19-58-05.gh-issue-109054.5r3S3l.rst @@ -0,0 +1,6 @@ +Fix building the ``_testcapi`` extension on Linux AArch64 which requires +linking to libatomic when ```` is used: the +``_Py_atomic_or_uint64()`` function requires libatomic +``__atomic_fetch_or_8()`` on this platform. The configure script now checks +if linking to libatomic is needed and generates a new LIBATOMIC variable +used to build the _testcapi extension. Patch by Victor Stinner. diff --git a/configure b/configure index d73b4b271ac719..c78c45d11260f6 100755 --- a/configure +++ b/configure @@ -27752,6 +27752,88 @@ printf "%s\n" "#define Py_NOGIL 1" >>confdefs.h fi +# gh-109054: Check if -latomic is needed to get atomic functions. +# On Linux aarch64, GCC may require programs and libraries to be linked +# explicitly to libatomic. Call _Py_atomic_or_uint64() which may require +# libatomic __atomic_fetch_or_8(), or not, depending on the C compiler and the +# compiler flags. +# +# Avoid #include or #include . The header +# requires header which is only written below by AC_OUTPUT below. +# If the check is done after AC_OUTPUT, modifying LIBATOMIC has no effect +# anymore. cannot be included alone, it's designed to be included +# by : it expects other includes and macros to be defined. +save_CPPFLAGS=$CPPFLAGS +CPPFLAGS="${BASECPPFLAGS} -I. -I${srcdir}/Include ${CPPFLAGS}" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether libatomic is needed by " >&5 +printf %s "checking whether libatomic is needed by ... " >&6; } +if test ${ac_cv_libatomic_needed+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + ac_cv_libatomic_needed=yes +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +// pyatomic.h needs uint64_t and Py_ssize_t types +#include // int64_t, intptr_t +#ifdef HAVE_SYS_TYPES_H +# include // ssize_t +#endif +// Code adapted from Include/pyport.h +#if HAVE_SSIZE_T +typedef ssize_t Py_ssize_t; +#elif SIZEOF_VOID_P == SIZEOF_SIZE_T +typedef intptr_t Py_ssize_t; +#else +# error "unable to define Py_ssize_t" +#endif + +#include "cpython/pyatomic.h" + +int main() +{ + uint64_t byte; + _Py_atomic_store_uint64(&byte, 2); + if (_Py_atomic_or_uint64(&byte, 8) != 2) { + return 1; // error + } + if (_Py_atomic_load_uint64(&byte) != 10) { + return 1; // error + } + return 0; // all good +} + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + + ac_cv_libatomic_needed=no + +else $as_nop + ac_cv_libatomic_needed=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libatomic_needed" >&5 +printf "%s\n" "$ac_cv_libatomic_needed" >&6; } + +if test "x$ac_cv_libatomic_needed" = xyes +then : + LIBATOMIC=${LIBATOMIC-"-latomic"} +fi +CPPFLAGS=$save_CPPFLAGS + + +# stdlib # stdlib not available @@ -29900,7 +29982,7 @@ fi then : - + as_fn_append MODULE_BLOCK "MODULE__TESTCAPI_LDFLAGS=$LIBATOMIC$as_nl" fi if test "$py_cv_module__testcapi" = yes; then @@ -30344,6 +30426,7 @@ ac_config_files="$ac_config_files Modules/Setup.bootstrap Modules/Setup.stdlib" ac_config_files="$ac_config_files Modules/ld_so_aix" +# Generate files like pyconfig.h cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure diff --git a/configure.ac b/configure.ac index 612c072af329d4..f833755a466012 100644 --- a/configure.ac +++ b/configure.ac @@ -6962,6 +6962,62 @@ then [Define if you want to disable the GIL]) fi +# gh-109054: Check if -latomic is needed to get atomic functions. +# On Linux aarch64, GCC may require programs and libraries to be linked +# explicitly to libatomic. Call _Py_atomic_or_uint64() which may require +# libatomic __atomic_fetch_or_8(), or not, depending on the C compiler and the +# compiler flags. +# +# Avoid #include or #include . The header +# requires header which is only written below by AC_OUTPUT below. +# If the check is done after AC_OUTPUT, modifying LIBATOMIC has no effect +# anymore. cannot be included alone, it's designed to be included +# by : it expects other includes and macros to be defined. +_SAVE_VAR([CPPFLAGS]) +CPPFLAGS="${BASECPPFLAGS} -I. -I${srcdir}/Include ${CPPFLAGS}" + +AC_CACHE_CHECK([whether libatomic is needed by ], + [ac_cv_libatomic_needed], +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +// pyatomic.h needs uint64_t and Py_ssize_t types +#include // int64_t, intptr_t +#ifdef HAVE_SYS_TYPES_H +# include // ssize_t +#endif +// Code adapted from Include/pyport.h +#if HAVE_SSIZE_T +typedef ssize_t Py_ssize_t; +#elif SIZEOF_VOID_P == SIZEOF_SIZE_T +typedef intptr_t Py_ssize_t; +#else +# error "unable to define Py_ssize_t" +#endif + +#include "cpython/pyatomic.h" + +int main() +{ + uint64_t byte; + _Py_atomic_store_uint64(&byte, 2); + if (_Py_atomic_or_uint64(&byte, 8) != 2) { + return 1; // error + } + if (_Py_atomic_load_uint64(&byte) != 10) { + return 1; // error + } + return 0; // all good +} +]])],[ + ac_cv_libatomic_needed=no +],[ac_cv_libatomic_needed=yes],[ac_cv_libatomic_needed=yes]) +]) + +AS_VAR_IF([ac_cv_libatomic_needed], [yes], + [LIBATOMIC=${LIBATOMIC-"-latomic"}]) +_RESTORE_VAR([CPPFLAGS]) + + +# stdlib AC_DEFUN([PY_STDLIB_MOD_SET_NA], [ m4_foreach([mod], [$@], [ AS_VAR_SET([py_cv_module_]mod, [n/a])]) @@ -7229,7 +7285,10 @@ PY_STDLIB_MOD([_hashlib], [], [test "$ac_cv_working_openssl_hashlib" = yes], [$OPENSSL_INCLUDES], [$OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH $LIBCRYPTO_LIBS]) dnl test modules -PY_STDLIB_MOD([_testcapi], [test "$TEST_MODULES" = yes]) +PY_STDLIB_MOD([_testcapi], + [test "$TEST_MODULES" = yes], [] + dnl Modules/_testcapi/pyatomic.c uses header + [], [], [$LIBATOMIC]) PY_STDLIB_MOD([_testclinic], [test "$TEST_MODULES" = yes]) PY_STDLIB_MOD([_testclinic_limited], [test "$TEST_MODULES" = yes]) PY_STDLIB_MOD([_testinternalcapi], [test "$TEST_MODULES" = yes]) @@ -7262,6 +7321,7 @@ AC_CONFIG_FILES(m4_normalize([ Modules/Setup.stdlib ])) AC_CONFIG_FILES([Modules/ld_so_aix], [chmod +x Modules/ld_so_aix]) +# Generate files like pyconfig.h AC_OUTPUT AC_MSG_NOTICE([creating Modules/Setup.local]) From bcb2ab5ef8c646565b09c860fb14e415d7b374bd Mon Sep 17 00:00:00 2001 From: AN Long Date: Sat, 9 Sep 2023 06:38:38 +0800 Subject: [PATCH 113/357] gh-108996: add tests for msvcrt (#109004) Co-authored-by: Terry Jan Reedy Co-authored-by: Steve Dower --- Lib/test/test_msvcrt.py | 111 ++++++++++++++++++ ...-09-06-22-06-22.gh-issue-108996.IBhR3U.rst | 1 + 2 files changed, 112 insertions(+) create mode 100644 Lib/test/test_msvcrt.py create mode 100644 Misc/NEWS.d/next/Tests/2023-09-06-22-06-22.gh-issue-108996.IBhR3U.rst diff --git a/Lib/test/test_msvcrt.py b/Lib/test/test_msvcrt.py new file mode 100644 index 00000000000000..adf4e26b98ac55 --- /dev/null +++ b/Lib/test/test_msvcrt.py @@ -0,0 +1,111 @@ +import os +import sys +import unittest + +from test.support import os_helper +from test.support.os_helper import TESTFN, TESTFN_ASCII + +if sys.platform != "win32": + raise unittest.SkipTest("windows related tests") + +import _winapi +import msvcrt; + +from _testconsole import write_input + + +class TestFileOperations(unittest.TestCase): + def test_locking(self): + with open(TESTFN, "w") as f: + self.addCleanup(os_helper.unlink, TESTFN) + + msvcrt.locking(f.fileno(), msvcrt.LK_LOCK, 1) + self.assertRaises(OSError, msvcrt.locking, f.fileno(), msvcrt.LK_NBLCK, 1) + + def test_unlockfile(self): + with open(TESTFN, "w") as f: + self.addCleanup(os_helper.unlink, TESTFN) + + msvcrt.locking(f.fileno(), msvcrt.LK_LOCK, 1) + msvcrt.locking(f.fileno(), msvcrt.LK_UNLCK, 1) + msvcrt.locking(f.fileno(), msvcrt.LK_LOCK, 1) + + def test_setmode(self): + with open(TESTFN, "w") as f: + self.addCleanup(os_helper.unlink, TESTFN) + + msvcrt.setmode(f.fileno(), os.O_BINARY) + msvcrt.setmode(f.fileno(), os.O_TEXT) + + def test_open_osfhandle(self): + h = _winapi.CreateFile(TESTFN_ASCII, _winapi.GENERIC_WRITE, 0, 0, 1, 128, 0) + self.addCleanup(os_helper.unlink, TESTFN_ASCII) + + try: + fd = msvcrt.open_osfhandle(h, os.O_RDONLY) + h = None + os.close(fd) + finally: + if h: + _winapi.CloseHandle(h) + + def test_get_osfhandle(self): + with open(TESTFN, "w") as f: + self.addCleanup(os_helper.unlink, TESTFN) + + msvcrt.get_osfhandle(f.fileno()) + + +c = '\u5b57' # unicode CJK char (meaning 'character') for 'wide-char' tests +c_encoded = b'\x57\x5b' # utf-16-le (which windows internally used) encoded char for this CJK char + + +class TestConsoleIO(unittest.TestCase): + def test_kbhit(self): + self.assertEqual(msvcrt.kbhit(), 0) + + def test_getch(self): + msvcrt.ungetch(b'c') + self.assertEqual(msvcrt.getch(), b'c') + + def test_getwch(self): + stdin = open('CONIN$', 'r') + old_stdin = sys.stdin + try: + sys.stdin = stdin + write_input(stdin.buffer.raw, c_encoded) + self.assertEqual(msvcrt.getwch(), c) + finally: + sys.stdin = old_stdin + + def test_getche(self): + msvcrt.ungetch(b'c') + self.assertEqual(msvcrt.getche(), b'c') + + def test_getwche(self): + stdin = open('CONIN$', 'r') + old_stdin = sys.stdin + try: + sys.stdin = stdin + write_input(stdin.buffer.raw, c_encoded) + self.assertEqual(msvcrt.getwche(), c) + finally: + sys.stdin = old_stdin + + def test_putch(self): + msvcrt.putch(b'c') + + def test_putwch(self): + msvcrt.putwch(c) + + +class TestOther(unittest.TestCase): + def test_heap_min(self): + try: + msvcrt.heapmin() + except OSError: + pass + + +if __name__ == "__main__": + unittest.main() diff --git a/Misc/NEWS.d/next/Tests/2023-09-06-22-06-22.gh-issue-108996.IBhR3U.rst b/Misc/NEWS.d/next/Tests/2023-09-06-22-06-22.gh-issue-108996.IBhR3U.rst new file mode 100644 index 00000000000000..887f8b74bcfa30 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-06-22-06-22.gh-issue-108996.IBhR3U.rst @@ -0,0 +1 @@ +Add tests for ``msvcrt``. From 5b7303e2653a0723a3e4c767d03dd02681206ca8 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 9 Sep 2023 00:41:26 +0200 Subject: [PATCH 114/357] gh-109162: Refactor Regrtest.main() (#109163) * main() now calls _parse_args() and pass 'ns' to Regrtest constructor. Remove kwargs argument from Regrtest.main(). * _parse_args() checks ns.huntrleaks. * set_temp_dir() is now responsible to call expanduser(). * Regrtest.main() sets self.tests earlier. * Add TestTuple and TestList types. * Rename MatchTests to FilterTuple and rename MatchTestsDict to FilterTestDict. * TestResult.get_rerun_match_tests() return type is now FilterTuple: return a tuple instead of a list. RunTests.tests type becomes TestTuple. --- Lib/test/libregrtest/cmdline.py | 9 ++++ Lib/test/libregrtest/main.py | 87 +++++++++++++----------------- Lib/test/libregrtest/runtest.py | 26 +++++---- Lib/test/libregrtest/runtest_mp.py | 4 +- 4 files changed, 64 insertions(+), 62 deletions(-) diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index d1a590d8c1a5b3..bbac980a0bf5d8 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -448,4 +448,13 @@ def _parse_args(args, **kwargs): # --forever implies --failfast ns.failfast = True + if ns.huntrleaks: + warmup, repetitions, _ = ns.huntrleaks + if warmup < 1 or repetitions < 1: + msg = ("Invalid values for the --huntrleaks/-R parameters. The " + "number of warmups and repetitions must be at least 1 " + "each (1:1).") + print(msg, file=sys.stderr, flush=True) + sys.exit(2) + return ns diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index ab03647ca5802f..f973f03ab26512 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -9,10 +9,10 @@ import tempfile import time import unittest -from test.libregrtest.cmdline import _parse_args +from test.libregrtest.cmdline import _parse_args, Namespace from test.libregrtest.runtest import ( findtests, split_test_packages, runtest, abs_module_name, - PROGRESS_MIN_TIME, State, MatchTestsDict, RunTests) + PROGRESS_MIN_TIME, State, FilterDict, RunTests, TestResult, TestList) from test.libregrtest.setup import setup_tests from test.libregrtest.pgo import setup_pgo_tests from test.libregrtest.utils import (strip_py_suffix, count, format_duration, @@ -58,9 +58,9 @@ class Regrtest: directly to set the values that would normally be set by flags on the command line. """ - def __init__(self): + def __init__(self, ns: Namespace): # Namespace of command line options - self.ns = None + self.ns: Namespace = ns # tests self.tests = [] @@ -68,14 +68,14 @@ def __init__(self): self.all_runtests: list[RunTests] = [] # test results - self.good: list[str] = [] - self.bad: list[str] = [] - self.rerun_bad: list[str] = [] - self.skipped: list[str] = [] - self.resource_denied: list[str] = [] - self.environment_changed: list[str] = [] - self.run_no_tests: list[str] = [] - self.rerun: list[str] = [] + self.good: TestList = [] + self.bad: TestList = [] + self.rerun_bad: TestList = [] + self.skipped: TestList = [] + self.resource_denied: TestList = [] + self.environment_changed: TestList = [] + self.run_no_tests: TestList = [] + self.rerun: TestList = [] self.need_rerun: list[TestResult] = [] self.first_state: str | None = None @@ -184,29 +184,7 @@ def display_progress(self, test_index, text): line = f"{line}/{fails}" self.log(f"[{line}] {text}") - def parse_args(self, kwargs): - ns = _parse_args(sys.argv[1:], **kwargs) - - if ns.xmlpath: - support.junit_xml_list = self.testsuite_xml = [] - - strip_py_suffix(ns.args) - - if ns.huntrleaks: - warmup, repetitions, _ = ns.huntrleaks - if warmup < 1 or repetitions < 1: - msg = ("Invalid values for the --huntrleaks/-R parameters. The " - "number of warmups and repetitions must be at least 1 " - "each (1:1).") - print(msg, file=sys.stderr, flush=True) - sys.exit(2) - - if ns.tempdir: - ns.tempdir = os.path.expanduser(ns.tempdir) - - self.ns = ns - - def find_tests(self, tests): + def find_tests(self): ns = self.ns single = ns.single fromfile = ns.fromfile @@ -216,8 +194,6 @@ def find_tests(self, tests): starting_test = ns.start randomize = ns.randomize - self.tests = tests - if single: self.next_single_filename = os.path.join(self.tmp_dir, 'pynexttest') try: @@ -321,7 +297,7 @@ def list_cases(self): print(count(len(skipped), "test"), "skipped:", file=stderr) printlist(skipped, file=stderr) - def get_rerun_match(self, rerun_list) -> MatchTestsDict: + def get_rerun_match(self, rerun_list) -> FilterDict: rerun_match_tests = {} for result in rerun_list: match_tests = result.get_rerun_match_tests() @@ -352,7 +328,7 @@ def _rerun_failed_tests(self, need_rerun): # Re-run failed tests self.log(f"Re-running {len(tests)} failed tests in verbose mode in subprocesses") - runtests = RunTests(tests, match_tests=match_tests, rerun=True) + runtests = RunTests(tuple(tests), match_tests=match_tests, rerun=True) self.all_runtests.append(runtests) self._run_tests_mp(runtests) @@ -624,7 +600,7 @@ def run_tests(self): tests = self.selected self.set_tests(tests) - runtests = RunTests(tests, forever=self.ns.forever) + runtests = RunTests(tuple(tests), forever=self.ns.forever) self.all_runtests.append(runtests) if self.ns.use_mp: self._run_tests_mp(runtests) @@ -737,8 +713,12 @@ def fix_umask(self): os.umask(old_mask) def set_temp_dir(self): - if self.ns.tempdir: - self.tmp_dir = self.ns.tempdir + ns = self.ns + if ns.tempdir: + ns.tempdir = os.path.expanduser(ns.tempdir) + + if ns.tempdir: + self.tmp_dir = ns.tempdir if not self.tmp_dir: # When tests are run from the Python build directory, it is best practice @@ -795,14 +775,20 @@ def cleanup(self): print("Remove file: %s" % name) os_helper.unlink(name) - def main(self, tests=None, **kwargs): - self.parse_args(kwargs) + def main(self, tests: TestList | None = None): + ns = self.ns + self.tests = tests + + if ns.xmlpath: + support.junit_xml_list = self.testsuite_xml = [] + + strip_py_suffix(ns.args) self.set_temp_dir() self.fix_umask() - if self.ns.cleanup: + if ns.cleanup: self.cleanup() sys.exit(0) @@ -817,9 +803,9 @@ def main(self, tests=None, **kwargs): # 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 + ns.tempdir = test_cwd - self._main(tests, kwargs) + self._main() except SystemExit as exc: # bpo-38203: Python can hang at exit in Py_Finalize(), especially # on threading._shutdown() call: put a timeout @@ -862,7 +848,7 @@ def action_run_tests(self): self.display_summary() self.finalize() - def _main(self, tests, kwargs): + def _main(self): if self.is_worker(): from test.libregrtest.runtest_mp import run_tests_worker run_tests_worker(self.ns.worker_args) @@ -872,7 +858,7 @@ def _main(self, tests, kwargs): input("Press any key to continue...") setup_tests(self.ns) - self.find_tests(tests) + self.find_tests() exitcode = 0 if self.ns.list_tests: @@ -888,4 +874,5 @@ def _main(self, tests, kwargs): def main(tests=None, **kwargs): """Run the Python suite.""" - Regrtest().main(tests=tests, **kwargs) + ns = _parse_args(sys.argv[1:], **kwargs) + Regrtest(ns).main(tests=tests) diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index 16ae04191da768..7e4b2e6a36b452 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -19,8 +19,13 @@ from test.libregrtest.utils import clear_caches, format_duration, print_warning -MatchTests = list[str] -MatchTestsDict = dict[str, MatchTests] +TestTuple = list[str] +TestList = list[str] + +# --match and --ignore options: list of patterns +# ('*' joker character can be used) +FilterTuple = tuple[str, ...] +FilterDict = dict[str, FilterTuple] # Avoid enum.Enum to reduce the number of imports when tests are run @@ -174,7 +179,7 @@ def must_stop(self, fail_fast: bool, fail_env_changed: bool) -> bool: return True return False - def get_rerun_match_tests(self): + def get_rerun_match_tests(self) -> FilterTuple | None: match_tests = [] errors = self.errors or [] @@ -195,29 +200,30 @@ def get_rerun_match_tests(self): return None match_tests.append(match_name) - return match_tests + if not match_tests: + return None + return tuple(match_tests) @dataclasses.dataclass(slots=True, frozen=True) class RunTests: - tests: list[str] - match_tests: MatchTestsDict | None = None + tests: TestTuple + match_tests: FilterDict | None = None rerun: bool = False forever: bool = False - def get_match_tests(self, test_name) -> MatchTests | None: + def get_match_tests(self, test_name) -> FilterTuple | None: if self.match_tests is not None: return self.match_tests.get(test_name, None) else: return None def iter_tests(self): - tests = tuple(self.tests) if self.forever: while True: - yield from tests + yield from self.tests else: - yield from tests + yield from self.tests # Minimum duration of a test to display its duration or to mention that diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index 60089554cab5dd..2ecdfca0e77010 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -20,7 +20,7 @@ from test.libregrtest.main import Regrtest from test.libregrtest.runtest import ( runtest, TestResult, State, PROGRESS_MIN_TIME, - MatchTests, RunTests) + FilterTuple, RunTests) from test.libregrtest.setup import setup_tests from test.libregrtest.utils import format_duration, print_warning @@ -49,7 +49,7 @@ class WorkerJob: test_name: str namespace: Namespace rerun: bool = False - match_tests: MatchTests | None = None + match_tests: FilterTuple | None = None class _EncodeWorkerJob(json.JSONEncoder): From ac8409b38b5a11d88b2cfe4e38a712e8967ec843 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 9 Sep 2023 01:48:54 +0200 Subject: [PATCH 115/357] gh-109162: Regrtest copies 'ns' attributes (#109168) * Regrtest.__init__() now copies 'ns' namespace attributes to Regrtest attributes. Regrtest match_tests and ignore_tests attributes have type FilterTuple (tuple), instead of a list. * Add RunTests.copy(). Regrtest._rerun_failed_tests() now uses RunTests.copy(). * Replace Regrtest.all_tests (list) with Regrtest.first_runtests (RunTests). * Make random_seed maximum 10x larger (9 digits, instead of 8). --- Lib/test/libregrtest/main.py | 114 +++++++++++++++++++------------- Lib/test/libregrtest/runtest.py | 5 ++ Lib/test/test_regrtest.py | 2 +- 3 files changed, 73 insertions(+), 48 deletions(-) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index f973f03ab26512..bf71ec3b1b08be 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -12,7 +12,8 @@ from test.libregrtest.cmdline import _parse_args, Namespace from test.libregrtest.runtest import ( findtests, split_test_packages, runtest, abs_module_name, - PROGRESS_MIN_TIME, State, FilterDict, RunTests, TestResult, TestList) + PROGRESS_MIN_TIME, State, RunTests, TestResult, + FilterTuple, FilterDict, TestList) from test.libregrtest.setup import setup_tests from test.libregrtest.pgo import setup_pgo_tests from test.libregrtest.utils import (strip_py_suffix, count, format_duration, @@ -62,10 +63,35 @@ def __init__(self, ns: Namespace): # Namespace of command line options self.ns: Namespace = ns + # Actions + self.want_header = ns.header + self.want_list_tests = ns.list_tests + self.want_list_cases = ns.list_cases + self.want_wait = ns.wait + self.want_cleanup = ns.cleanup + + # Select tests + if ns.match_tests: + self.match_tests: FilterTuple = tuple(ns.match_tests) + else: + self.match_tests = None + if ns.ignore_tests: + self.ignore_tests: FilterTuple = tuple(ns.ignore_tests) + else: + self.ignore_tests = None + self.exclude = ns.exclude + self.fromfile = ns.fromfile + self.starting_test = ns.start + + # Options to run tests + self.forever = ns.forever + self.randomize = ns.randomize + self.random_seed = ns.random_seed + # tests self.tests = [] self.selected = [] - self.all_runtests: list[RunTests] = [] + self.first_runtests: RunTests | None = None # test results self.good: TestList = [] @@ -187,12 +213,8 @@ def display_progress(self, test_index, text): def find_tests(self): ns = self.ns single = ns.single - fromfile = ns.fromfile pgo = ns.pgo - exclude = ns.exclude test_dir = ns.testdir - starting_test = ns.start - randomize = ns.randomize if single: self.next_single_filename = os.path.join(self.tmp_dir, 'pynexttest') @@ -203,12 +225,12 @@ def find_tests(self): except OSError: pass - if fromfile: + if self.fromfile: self.tests = [] # regex to match 'test_builtin' in line: # '0:00:00 [ 4/400] test_builtin -- test_dict took 1 sec' regex = re.compile(r'\btest_[a-zA-Z0-9_]+\b') - with open(os.path.join(os_helper.SAVEDCWD, fromfile)) as fp: + with open(os.path.join(os_helper.SAVEDCWD, self.fromfile)) as fp: for line in fp: line = line.split('#', 1)[0] line = line.strip() @@ -223,14 +245,14 @@ def find_tests(self): setup_pgo_tests(ns) exclude_tests = set() - if exclude: + if self.exclude: for arg in ns.args: exclude_tests.add(arg) ns.args = [] alltests = findtests(testdir=test_dir, exclude=exclude_tests) - if not fromfile: + if not self.fromfile: self.selected = self.tests or ns.args if self.selected: self.selected = split_test_packages(self.selected) @@ -248,17 +270,17 @@ def find_tests(self): pass # Remove all the selected tests that precede start if it's set. - if starting_test: + if self.starting_test: try: - del self.selected[:self.selected.index(starting_test)] + del self.selected[:self.selected.index(self.starting_test)] except ValueError: - print(f"Cannot find starting test: {starting_test}") + print(f"Cannot find starting test: {self.starting_test}") sys.exit(1) - if randomize: - if ns.random_seed is None: - ns.random_seed = random.randrange(10000000) - random.seed(ns.random_seed) + if self.randomize: + if self.random_seed is None: + self.random_seed = random.randrange(100_000_000) + random.seed(self.random_seed) random.shuffle(self.selected) def list_tests(self): @@ -279,7 +301,7 @@ def list_cases(self): ns = self.ns test_dir = ns.testdir support.verbose = False - support.set_match_tests(ns.match_tests, ns.ignore_tests) + support.set_match_tests(self.match_tests, self.ignore_tests) skipped = [] for test_name in self.selected: @@ -306,20 +328,18 @@ def get_rerun_match(self, rerun_list) -> FilterDict: rerun_match_tests[result.test_name] = match_tests return rerun_match_tests - def _rerun_failed_tests(self, need_rerun): + def _rerun_failed_tests(self, need_rerun, runtests: RunTests): # Configure the runner to re-run tests ns = self.ns ns.verbose = True ns.failfast = False ns.verbose3 = False - ns.forever = False if ns.use_mp is None: ns.use_mp = 1 # Get tests to re-run tests = [result.test_name for result in need_rerun] match_tests = self.get_rerun_match(need_rerun) - self.set_tests(tests) # Clear previously failed tests self.rerun_bad.extend(self.bad) @@ -328,11 +348,14 @@ def _rerun_failed_tests(self, need_rerun): # Re-run failed tests self.log(f"Re-running {len(tests)} failed tests in verbose mode in subprocesses") - runtests = RunTests(tuple(tests), match_tests=match_tests, rerun=True) - self.all_runtests.append(runtests) + runtests = runtests.copy(tests=tuple(tests), + match_tests=match_tests, + rerun=True, + forever=False) + self.set_tests(runtests) self._run_tests_mp(runtests) - def rerun_failed_tests(self, need_rerun): + def rerun_failed_tests(self, need_rerun, runtests: RunTests): if self.ns.python: # Temp patch for https://github.com/python/cpython/issues/94052 self.log( @@ -344,7 +367,7 @@ def rerun_failed_tests(self, need_rerun): self.first_state = self.get_tests_state() print() - self._rerun_failed_tests(need_rerun) + self._rerun_failed_tests(need_rerun, runtests) if self.bad: print(count(len(self.bad), 'test'), "failed again:") @@ -572,9 +595,9 @@ def _run_tests_mp(self, runtests: RunTests) -> None: self.win_load_tracker.close() self.win_load_tracker = None - def set_tests(self, tests): - self.tests = tests - if self.ns.forever: + def set_tests(self, runtests: RunTests): + self.tests = runtests.tests + if runtests.forever: self.test_count_text = '' self.test_count_width = 3 else: @@ -583,7 +606,7 @@ def set_tests(self, tests): def run_tests(self): # For a partial run, we do not need to clutter the output. - if (self.ns.header + if (self.want_header or not(self.ns.pgo or self.ns.quiet or self.ns.single or self.tests or self.ns.args)): self.display_header() @@ -595,17 +618,18 @@ def run_tests(self): "3 warmup repetitions can give false positives!") print(msg, file=sys.stdout, flush=True) - if self.ns.randomize: - print("Using random seed", self.ns.random_seed) + if self.randomize: + print("Using random seed", self.random_seed) tests = self.selected - self.set_tests(tests) - runtests = RunTests(tuple(tests), forever=self.ns.forever) - self.all_runtests.append(runtests) + runtests = RunTests(tuple(tests), forever=self.forever) + self.first_runtests = runtests + self.set_tests(runtests) if self.ns.use_mp: self._run_tests_mp(runtests) else: self.run_tests_sequentially(runtests) + return runtests def finalize(self): if self.next_single_filename: @@ -627,11 +651,7 @@ def finalize(self): def display_summary(self): duration = time.perf_counter() - self.start_time - first_runtests = self.all_runtests[0] - # the second runtests (re-run failed tests) disables forever, - # use the first runtests - forever = first_runtests.forever - filtered = bool(self.ns.match_tests) or bool(self.ns.ignore_tests) + filtered = bool(self.match_tests) or bool(self.ignore_tests) # Total duration print() @@ -655,8 +675,8 @@ def display_summary(self): self.environment_changed, self.run_no_tests] run = sum(map(len, all_tests)) text = f'run={run}' - if not forever: - ntest = len(first_runtests.tests) + if not self.first_runtests.forever: + ntest = len(self.first_runtests.tests) text = f"{text}/{ntest}" if filtered: text = f"{text} (filtered)" @@ -788,7 +808,7 @@ def main(self, tests: TestList | None = None): self.fix_umask() - if ns.cleanup: + if self.want_cleanup: self.cleanup() sys.exit(0) @@ -838,12 +858,12 @@ def get_exitcode(self): return exitcode def action_run_tests(self): - self.run_tests() + runtests = self.run_tests() self.display_result() need_rerun = self.need_rerun if self.ns.rerun and need_rerun: - self.rerun_failed_tests(need_rerun) + self.rerun_failed_tests(need_rerun, runtests) self.display_summary() self.finalize() @@ -854,16 +874,16 @@ def _main(self): run_tests_worker(self.ns.worker_args) return - if self.ns.wait: + if self.want_wait: input("Press any key to continue...") setup_tests(self.ns) self.find_tests() exitcode = 0 - if self.ns.list_tests: + if self.want_list_tests: self.list_tests() - elif self.ns.list_cases: + elif self.want_list_cases: self.list_cases() else: self.action_run_tests() diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index 7e4b2e6a36b452..5fcbb777bb829b 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -212,6 +212,11 @@ class RunTests: rerun: bool = False forever: bool = False + def copy(self, **override): + state = dataclasses.asdict(self) + state.update(override) + return RunTests(**state) + def get_match_tests(self, test_name) -> FilterTuple | None: if self.match_tests is not None: return self.match_tests.get(test_name, None) diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index aff5404408f8d0..ece8c1f5efdff6 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -589,7 +589,7 @@ def list_regex(line_format, tests): def parse_random_seed(self, output): match = self.regex_search(r'Using random seed ([0-9]+)', output) randseed = int(match.group(1)) - self.assertTrue(0 <= randseed <= 10000000, randseed) + self.assertTrue(0 <= randseed <= 100_000_000, randseed) return randseed def run_command(self, args, input=None, exitcode=0, **kw): From 2fafc3d5c6d720c9b9a4803dde60607fa44b89ce Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 9 Sep 2023 01:56:53 +0200 Subject: [PATCH 116/357] gh-108996: Skip broken test_msvcrt for now (#109169) --- Lib/test/test_msvcrt.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/test/test_msvcrt.py b/Lib/test/test_msvcrt.py index adf4e26b98ac55..3a63de351e095d 100644 --- a/Lib/test/test_msvcrt.py +++ b/Lib/test/test_msvcrt.py @@ -2,6 +2,8 @@ import sys import unittest +raise unittest.SkipTest("FIXME! broken test see: https://github.com/python/cpython/pull/109004") + from test.support import os_helper from test.support.os_helper import TESTFN, TESTFN_ASCII From 489ca0acf00bb87ae63ab9199787843fdec5a0c8 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 9 Sep 2023 02:30:28 +0200 Subject: [PATCH 117/357] gh-109162: Refactor Regrtest.action_run_tests() (#109170) Refator Regrtest class: * Rename finalize() finalize_tests(). * Pass tracer to run_test() and finalize_tests(). Remove Regrtest.tracer. * run_test() does less things: move code to its caller. --- Lib/test/libregrtest/main.py | 98 ++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index bf71ec3b1b08be..13500fae50c8e2 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -111,9 +111,6 @@ def __init__(self, ns: Namespace): # used by --slow self.test_times = [] - # used by --coverage, trace.Trace instance - self.tracer = None - # used to display the progress bar "[ 3/100]" self.start_time = time.perf_counter() self.test_count_text = '' @@ -443,28 +440,18 @@ def display_result(self): print(count(len(self.run_no_tests), "test"), "run no tests:") printlist(self.run_no_tests) - def run_test(self, test_index, test_name, previous_test, save_modules): - text = test_name - if previous_test: - text = '%s -- %s' % (text, previous_test) - self.display_progress(test_index, text) - - if self.tracer: + def run_test(self, test_name: str, runtests: RunTests, tracer): + if tracer is not None: # If we're tracing code coverage, then we don't exit with status # if on a false return value from main. - cmd = ('result = runtest(self.ns, test_name); ' - 'self.accumulate_result(result)') + cmd = ('result = runtest(self.ns, test_name)') ns = dict(locals()) - self.tracer.runctx(cmd, globals=globals(), locals=ns) + tracer.runctx(cmd, globals=globals(), locals=ns) result = ns['result'] else: result = runtest(self.ns, test_name) - self.accumulate_result(result) - # Unload the newly imported modules (best effort finalization) - for module in sys.modules.keys(): - if module not in save_modules and module.startswith("test."): - support.unload(module) + self.accumulate_result(result) return result @@ -477,7 +464,9 @@ def run_tests_sequentially(self, runtests): if coverage: import trace - self.tracer = trace.Trace(trace=False, count=True) + tracer = trace.Trace(trace=False, count=True) + else: + tracer = None save_modules = sys.modules.keys() @@ -491,8 +480,17 @@ def run_tests_sequentially(self, runtests): for test_index, test_name in enumerate(tests_iter, 1): start_time = time.perf_counter() - result = self.run_test(test_index, test_name, - previous_test, save_modules) + text = test_name + if previous_test: + text = '%s -- %s' % (text, previous_test) + self.display_progress(test_index, text) + + result = self.run_test(test_name, runtests, tracer) + + # Unload the newly imported modules (best effort finalization) + for module in sys.modules.keys(): + if module not in save_modules and module.startswith("test."): + support.unload(module) if result.must_stop(fail_fast, fail_env_changed): break @@ -508,6 +506,8 @@ def run_tests_sequentially(self, runtests): if previous_test: print(previous_test) + return tracer + def display_header(self): # Print basic platform information print("==", platform.python_implementation(), *sys.version.split()) @@ -604,34 +604,17 @@ def set_tests(self, runtests: RunTests): self.test_count_text = '/{}'.format(len(self.tests)) self.test_count_width = len(self.test_count_text) - 1 - def run_tests(self): - # For a partial run, we do not need to clutter the output. - if (self.want_header - or not(self.ns.pgo or self.ns.quiet or self.ns.single - or self.tests or self.ns.args)): - self.display_header() - - if self.ns.huntrleaks: - warmup, repetitions, _ = self.ns.huntrleaks - if warmup < 3: - msg = ("WARNING: Running tests with --huntrleaks/-R and less than " - "3 warmup repetitions can give false positives!") - print(msg, file=sys.stdout, flush=True) - - if self.randomize: - print("Using random seed", self.random_seed) - - tests = self.selected - runtests = RunTests(tuple(tests), forever=self.forever) + def run_tests(self, runtests: RunTests): self.first_runtests = runtests self.set_tests(runtests) if self.ns.use_mp: self._run_tests_mp(runtests) + tracer = None else: - self.run_tests_sequentially(runtests) - return runtests + tracer = self.run_tests_sequentially(runtests) + return tracer - def finalize(self): + def finalize_tests(self, tracer): if self.next_single_filename: if self.next_single_test: with open(self.next_single_filename, 'w') as fp: @@ -639,10 +622,10 @@ def finalize(self): else: os.unlink(self.next_single_filename) - if self.tracer: - r = self.tracer.results() - r.write_results(show_missing=True, summary=True, - coverdir=self.ns.coverdir) + if tracer is not None: + results = tracer.results() + results.write_results(show_missing=True, summary=True, + coverdir=self.ns.coverdir) if self.ns.runleaks: os.system("leaks %d" % os.getpid()) @@ -858,7 +841,24 @@ def get_exitcode(self): return exitcode def action_run_tests(self): - runtests = self.run_tests() + if self.ns.huntrleaks: + warmup, repetitions, _ = self.ns.huntrleaks + if warmup < 3: + msg = ("WARNING: Running tests with --huntrleaks/-R and less than " + "3 warmup repetitions can give false positives!") + print(msg, file=sys.stdout, flush=True) + + # For a partial run, we do not need to clutter the output. + if (self.want_header + or not(self.ns.pgo or self.ns.quiet or self.ns.single + or self.tests or self.ns.args)): + self.display_header() + + if self.randomize: + print("Using random seed", self.random_seed) + + runtests = RunTests(tuple(self.selected), forever=self.forever) + tracer = self.run_tests(runtests) self.display_result() need_rerun = self.need_rerun @@ -866,7 +866,7 @@ def action_run_tests(self): self.rerun_failed_tests(need_rerun, runtests) self.display_summary() - self.finalize() + self.finalize_tests(tracer) def _main(self): if self.is_worker(): From a56c92875699c2ba92ed49e72f6abbf363a5c537 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 9 Sep 2023 03:03:39 +0200 Subject: [PATCH 118/357] gh-109162: Refactor libregrtest WorkerJob (#109171) * Rename --worker-args command line option to --worker-json. * Rename _parse_worker_args() to _parse_worker_json(). * WorkerJob: * Add runtests attribute * Remove test_name and rerun attribute * Rename run_test_in_subprocess() to create_worker_process(). * Rename run_tests_worker() to worker_process(). * create_worker_process() uses json.dump(): write directly JSON to stdout. * Convert MultiprocessResult to a frozen dataclass. * Rename RunTests.match_tests to RunTests.match_tests_dict. --- Lib/test/libregrtest/cmdline.py | 3 +- Lib/test/libregrtest/main.py | 10 ++--- Lib/test/libregrtest/runtest.py | 6 +-- Lib/test/libregrtest/runtest_mp.py | 62 ++++++++++++++++-------------- Lib/test/test_regrtest.py | 8 ++-- 5 files changed, 48 insertions(+), 41 deletions(-) diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index bbac980a0bf5d8..c08b3be9285d9f 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -170,6 +170,7 @@ def __init__(self, **kwargs) -> None: self.ignore_tests = None self.pgo = False self.pgo_extended = False + self.worker_json = None super().__init__(**kwargs) @@ -205,7 +206,7 @@ def _create_parser(): group.add_argument('--wait', action='store_true', help='wait for user input, e.g., allow a debugger ' 'to be attached') - group.add_argument('--worker-args', metavar='ARGS') + group.add_argument('--worker-json', metavar='ARGS') group.add_argument('-S', '--start', metavar='START', help='the name of the test at which to start.' + more_details) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 13500fae50c8e2..cd053c59a98548 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -336,7 +336,7 @@ def _rerun_failed_tests(self, need_rerun, runtests: RunTests): # Get tests to re-run tests = [result.test_name for result in need_rerun] - match_tests = self.get_rerun_match(need_rerun) + match_tests_dict = self.get_rerun_match(need_rerun) # Clear previously failed tests self.rerun_bad.extend(self.bad) @@ -346,7 +346,7 @@ def _rerun_failed_tests(self, need_rerun, runtests: RunTests): # Re-run failed tests self.log(f"Re-running {len(tests)} failed tests in verbose mode in subprocesses") runtests = runtests.copy(tests=tuple(tests), - match_tests=match_tests, + match_tests_dict=match_tests_dict, rerun=True, forever=False) self.set_tests(runtests) @@ -742,7 +742,7 @@ def set_temp_dir(self): self.tmp_dir = os.path.abspath(self.tmp_dir) def is_worker(self): - return (self.ns.worker_args is not None) + return (self.ns.worker_json is not None) def create_temp_dir(self): os.makedirs(self.tmp_dir, exist_ok=True) @@ -870,8 +870,8 @@ def action_run_tests(self): def _main(self): if self.is_worker(): - from test.libregrtest.runtest_mp import run_tests_worker - run_tests_worker(self.ns.worker_args) + from test.libregrtest.runtest_mp import worker_process + worker_process(self.ns.worker_json) return if self.want_wait: diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index 5fcbb777bb829b..ea5d0564b14aea 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -208,7 +208,7 @@ def get_rerun_match_tests(self) -> FilterTuple | None: @dataclasses.dataclass(slots=True, frozen=True) class RunTests: tests: TestTuple - match_tests: FilterDict | None = None + match_tests_dict: FilterDict | None = None rerun: bool = False forever: bool = False @@ -218,8 +218,8 @@ def copy(self, **override): return RunTests(**state) def get_match_tests(self, test_name) -> FilterTuple | None: - if self.match_tests is not None: - return self.match_tests.get(test_name, None) + if self.match_tests_dict is not None: + return self.match_tests_dict.get(test_name, None) else: return None diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index 2ecdfca0e77010..45db24f255fcf7 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -46,9 +46,8 @@ @dataclasses.dataclass(slots=True) class WorkerJob: - test_name: str + runtests: RunTests namespace: Namespace - rerun: bool = False match_tests: FilterTuple | None = None @@ -70,6 +69,7 @@ def default(self, o: Any) -> dict[str, Any]: def _decode_worker_job(d: dict[str, Any]) -> WorkerJob | dict[str, Any]: if "__worker_job__" in d: d.pop('__worker_job__') + d['runtests'] = RunTests(**d['runtests']) return WorkerJob(**d) if "__namespace__" in d: d.pop('__namespace__') @@ -78,17 +78,16 @@ def _decode_worker_job(d: dict[str, Any]) -> WorkerJob | dict[str, Any]: return d -def _parse_worker_args(worker_json: str) -> tuple[Namespace, str]: - return json.loads(worker_json, - object_hook=_decode_worker_job) +def _parse_worker_json(worker_json: str) -> tuple[Namespace, str]: + return json.loads(worker_json, object_hook=_decode_worker_job) -def run_test_in_subprocess(worker_job: WorkerJob, - output_file: TextIO, - tmp_dir: str | None = None) -> subprocess.Popen: +def create_worker_process(worker_job: WorkerJob, + output_file: TextIO, + tmp_dir: str | None = None) -> subprocess.Popen: ns = worker_job.namespace python = ns.python - worker_args = json.dumps(worker_job, cls=_EncodeWorkerJob) + worker_json = json.dumps(worker_job, cls=_EncodeWorkerJob) if python is not None: executable = python @@ -97,7 +96,7 @@ def run_test_in_subprocess(worker_job: WorkerJob, cmd = [*executable, *support.args_from_interpreter_flags(), '-u', # Unbuffered stdout and stderr '-m', 'test.regrtest', - '--worker-args', worker_args] + '--worker-json', worker_json] env = dict(os.environ) if tmp_dir is not None: @@ -122,16 +121,16 @@ def run_test_in_subprocess(worker_job: WorkerJob, return subprocess.Popen(cmd, **kw) -def run_tests_worker(worker_json: str) -> NoReturn: - worker_job = _parse_worker_args(worker_json) +def worker_process(worker_json: str) -> NoReturn: + worker_job = _parse_worker_json(worker_json) + runtests = worker_job.runtests ns = worker_job.namespace - test_name = worker_job.test_name - rerun = worker_job.rerun - match_tests = worker_job.match_tests + test_name = runtests.tests[0] + match_tests: FilterTuple | None = worker_job.match_tests setup_tests(ns) - if rerun: + if runtests.rerun: if match_tests: matching = "matching: " + ", ".join(match_tests) print(f"Re-running {test_name} in verbose mode ({matching})", flush=True) @@ -139,14 +138,15 @@ def run_tests_worker(worker_json: str) -> NoReturn: print(f"Re-running {test_name} in verbose mode", flush=True) ns.verbose = True - if match_tests is not None: - ns.match_tests = match_tests + if match_tests is not None: + ns.match_tests = match_tests result = runtest(ns, test_name) print() # Force a newline (just in case) # Serialize TestResult as dict in JSON - print(json.dumps(result, cls=EncodeTestResult), flush=True) + json.dump(result, sys.stdout, cls=EncodeTestResult) + sys.stdout.flush() sys.exit(0) @@ -173,7 +173,8 @@ def stop(self): self.tests_iter = None -class MultiprocessResult(NamedTuple): +@dataclasses.dataclass(slots=True, frozen=True) +class MultiprocessResult: result: TestResult # bpo-45410: stderr is written into stdout to keep messages order worker_stdout: str | None = None @@ -198,7 +199,6 @@ def __init__(self, worker_id: int, runner: "MultiprocessTestRunner") -> None: self.ns = runner.ns self.timeout = runner.worker_timeout self.regrtest = runner.regrtest - self.rerun = runner.rerun self.current_test_name = None self.start_time = None self._popen = None @@ -264,9 +264,8 @@ def mp_result_error( def _run_process(self, worker_job, output_file: TextIO, tmp_dir: str | None = None) -> int: - self.current_test_name = worker_job.test_name try: - popen = run_test_in_subprocess(worker_job, output_file, tmp_dir) + popen = create_worker_process(worker_job, output_file, tmp_dir) self._killed = False self._popen = popen @@ -316,6 +315,8 @@ def _run_process(self, worker_job, output_file: TextIO, self.current_test_name = None def _runtest(self, test_name: str) -> MultiprocessResult: + self.current_test_name = test_name + if sys.platform == 'win32': # gh-95027: When stdout is not a TTY, Python uses the ANSI code # page for the sys.stdout encoding. If the main process runs in a @@ -324,15 +325,20 @@ def _runtest(self, test_name: str) -> MultiprocessResult: else: encoding = sys.stdout.encoding - match_tests = self.runtests.get_match_tests(test_name) + tests = (test_name,) + if self.runtests.rerun: + match_tests = self.runtests.get_match_tests(test_name) + else: + match_tests = None + worker_runtests = self.runtests.copy(tests=tests) + worker_job = WorkerJob( + worker_runtests, + namespace=self.ns, + match_tests=match_tests) # gh-94026: Write stdout+stderr to a tempfile as workaround for # non-blocking pipes on Emscripten with NodeJS. with tempfile.TemporaryFile('w+', encoding=encoding) as stdout_file: - worker_job = WorkerJob(test_name, - namespace=self.ns, - rerun=self.rerun, - match_tests=match_tests) # gh-93353: Check for leaked temporary files in the parent process, # since the deletion of temporary files can happen late during # Python finalization: too late for libregrtest. diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index ece8c1f5efdff6..8cced1f5185c2f 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -75,10 +75,10 @@ def test_wait(self): ns = libregrtest._parse_args(['--wait']) self.assertTrue(ns.wait) - def test_worker_args(self): - ns = libregrtest._parse_args(['--worker-args', '[[], {}]']) - self.assertEqual(ns.worker_args, '[[], {}]') - self.checkError(['--worker-args'], 'expected one argument') + def test_worker_json(self): + ns = libregrtest._parse_args(['--worker-json', '[[], {}]']) + self.assertEqual(ns.worker_json, '[[], {}]') + self.checkError(['--worker-json'], 'expected one argument') def test_start(self): for opt in '-S', '--start': From 057bc7249073066ed8087b548ee06f0eabfa9e7c Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Fri, 8 Sep 2023 18:24:49 -0700 Subject: [PATCH 119/357] gh-109052: Use the base opcode when comparing code objects (gh-109107) --- Lib/test/test_code.py | 19 +++++++++++++++++++ ...-09-07-18-49-01.gh-issue-109052.TBU4nC.rst | 1 + Objects/codeobject.c | 10 ++++------ 3 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-07-18-49-01.gh-issue-109052.TBU4nC.rst diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 812c0682569207..a961ddbe17a3d3 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -505,6 +505,25 @@ def test_code_hash_uses_bytecode(self): self.assertNotEqual(c, c1) self.assertNotEqual(hash(c), hash(c1)) + @cpython_only + def test_code_equal_with_instrumentation(self): + """ GH-109052 + + Make sure the instrumentation doesn't affect the code equality + The validity of this test relies on the fact that "x is x" and + "x in x" have only one different instruction and the instructions + have the same argument. + + """ + code1 = compile("x is x", "example.py", "eval") + code2 = compile("x in x", "example.py", "eval") + sys._getframe().f_trace_opcodes = True + sys.settrace(lambda *args: None) + exec(code1, {'x': []}) + exec(code2, {'x': []}) + self.assertNotEqual(code1, code2) + sys.settrace(None) + def isinterned(s): return s is sys.intern(('_' + s + '_')[1:-1]) diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-07-18-49-01.gh-issue-109052.TBU4nC.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-07-18-49-01.gh-issue-109052.TBU4nC.rst new file mode 100644 index 00000000000000..175046c771cdf3 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-07-18-49-01.gh-issue-109052.TBU4nC.rst @@ -0,0 +1 @@ +Use the base opcode when comparing code objects to avoid interference from instrumentation diff --git a/Objects/codeobject.c b/Objects/codeobject.c index d00bd0422f004d..20e5dedb22826f 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1798,28 +1798,26 @@ code_richcompare(PyObject *self, PyObject *other, int op) for (int i = 0; i < Py_SIZE(co); i++) { _Py_CODEUNIT co_instr = _PyCode_CODE(co)[i]; _Py_CODEUNIT cp_instr = _PyCode_CODE(cp)[i]; - uint8_t co_code = co_instr.op.code; + uint8_t co_code = _Py_GetBaseOpcode(co, i); uint8_t co_arg = co_instr.op.arg; - uint8_t cp_code = cp_instr.op.code; + uint8_t cp_code = _Py_GetBaseOpcode(cp, i); uint8_t cp_arg = cp_instr.op.arg; if (co_code == ENTER_EXECUTOR) { const int exec_index = co_arg; _PyExecutorObject *exec = co->co_executors->executors[exec_index]; - co_code = exec->vm_data.opcode; + co_code = _PyOpcode_Deopt[exec->vm_data.opcode]; co_arg = exec->vm_data.oparg; } assert(co_code != ENTER_EXECUTOR); - co_code = _PyOpcode_Deopt[co_code]; if (cp_code == ENTER_EXECUTOR) { const int exec_index = cp_arg; _PyExecutorObject *exec = cp->co_executors->executors[exec_index]; - cp_code = exec->vm_data.opcode; + cp_code = _PyOpcode_Deopt[exec->vm_data.opcode]; cp_arg = exec->vm_data.oparg; } assert(cp_code != ENTER_EXECUTOR); - cp_code = _PyOpcode_Deopt[cp_code]; if (co_code != cp_code || co_arg != cp_arg) { goto unequal; From e9e2ca7a7b4b4320009cdf85c84ec5bd6c4923c3 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 9 Sep 2023 03:37:48 +0200 Subject: [PATCH 120/357] gh-109162: Refactor libregrtest.runtest (#109172) * Rename runtest() to run_single_test(). * Pass runtests to run_single_test(). * Add type annotation to Regrtest attributes. Add missing attributes to Namespace. * Add attributes to Regrtest and RunTests: * fail_fast * ignore_tests * match_tests * output_on_failure * pgo * pgo_extended * timeout * Get pgo from 'runtests', rather than from 'ns'. * Remove WorkerJob.match_tests. * setup_support() now gets pgo_extended from runtests. * save_env(): change parameter order, pass test_name first. * Add setup_test_dir() function. * Pass runtests to setup_tests(). --- Lib/test/libregrtest/cmdline.py | 6 ++ Lib/test/libregrtest/main.py | 91 +++++++++++++++++------------- Lib/test/libregrtest/runtest.py | 60 ++++++++++++-------- Lib/test/libregrtest/runtest_mp.py | 52 ++++++++--------- Lib/test/libregrtest/setup.py | 29 +++++----- 5 files changed, 134 insertions(+), 104 deletions(-) diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index c08b3be9285d9f..71e7396d71d4a5 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -149,6 +149,10 @@ def __init__(self, **kwargs) -> None: self.verbose = 0 self.quiet = False self.exclude = False + self.cleanup = False + self.wait = False + self.list_cases = False + self.list_tests = False self.single = False self.randomize = False self.fromfile = None @@ -171,6 +175,8 @@ def __init__(self, **kwargs) -> None: self.pgo = False self.pgo_extended = False self.worker_json = None + self.start = None + self.timeout = None super().__init__(**kwargs) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index cd053c59a98548..f7d28a859213f5 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -11,10 +11,10 @@ import unittest from test.libregrtest.cmdline import _parse_args, Namespace from test.libregrtest.runtest import ( - findtests, split_test_packages, runtest, abs_module_name, + findtests, split_test_packages, run_single_test, abs_module_name, PROGRESS_MIN_TIME, State, RunTests, TestResult, FilterTuple, FilterDict, TestList) -from test.libregrtest.setup import setup_tests +from test.libregrtest.setup import setup_tests, setup_test_dir from test.libregrtest.pgo import setup_pgo_tests from test.libregrtest.utils import (strip_py_suffix, count, format_duration, printlist, get_build_info) @@ -64,11 +64,11 @@ def __init__(self, ns: Namespace): self.ns: Namespace = ns # Actions - self.want_header = ns.header - self.want_list_tests = ns.list_tests - self.want_list_cases = ns.list_cases - self.want_wait = ns.wait - self.want_cleanup = ns.cleanup + self.want_header: bool = ns.header + self.want_list_tests: bool = ns.list_tests + self.want_list_cases: bool = ns.list_cases + self.want_wait: bool = ns.wait + self.want_cleanup: bool = ns.cleanup # Select tests if ns.match_tests: @@ -79,14 +79,19 @@ def __init__(self, ns: Namespace): self.ignore_tests: FilterTuple = tuple(ns.ignore_tests) else: self.ignore_tests = None - self.exclude = ns.exclude - self.fromfile = ns.fromfile - self.starting_test = ns.start + self.exclude: bool = ns.exclude + self.fromfile: str | None = ns.fromfile + self.starting_test: str | None = ns.start # Options to run tests - self.forever = ns.forever - self.randomize = ns.randomize - self.random_seed = ns.random_seed + self.fail_fast: bool = ns.failfast + self.forever: bool = ns.forever + self.randomize: bool = ns.randomize + self.random_seed: int | None = ns.random_seed + self.pgo: bool = ns.pgo + self.pgo_extended: bool = ns.pgo_extended + self.output_on_failure: bool = ns.verbose3 + self.timeout: float | None = ns.timeout # tests self.tests = [] @@ -196,21 +201,19 @@ def log(self, line=''): def display_progress(self, test_index, text): quiet = self.ns.quiet - pgo = self.ns.pgo if quiet: return # "[ 51/405/1] test_tcl passed" line = f"{test_index:{self.test_count_width}}{self.test_count_text}" fails = len(self.bad) + len(self.environment_changed) - if fails and not pgo: + if fails and not self.pgo: line = f"{line}/{fails}" self.log(f"[{line}] {text}") def find_tests(self): ns = self.ns single = ns.single - pgo = ns.pgo test_dir = ns.testdir if single: @@ -237,7 +240,7 @@ def find_tests(self): strip_py_suffix(self.tests) - if pgo: + if self.pgo: # add default PGO tests if no tests are specified setup_pgo_tests(ns) @@ -329,8 +332,6 @@ def _rerun_failed_tests(self, need_rerun, runtests: RunTests): # Configure the runner to re-run tests ns = self.ns ns.verbose = True - ns.failfast = False - ns.verbose3 = False if ns.use_mp is None: ns.use_mp = 1 @@ -345,12 +346,16 @@ def _rerun_failed_tests(self, need_rerun, runtests: RunTests): # Re-run failed tests self.log(f"Re-running {len(tests)} failed tests in verbose mode in subprocesses") - runtests = runtests.copy(tests=tuple(tests), - match_tests_dict=match_tests_dict, - rerun=True, - forever=False) + runtests = runtests.copy( + tests=tuple(tests), + rerun=True, + forever=False, + fail_fast=False, + match_tests_dict=match_tests_dict, + output_on_failure=False) self.set_tests(runtests) self._run_tests_mp(runtests) + return runtests def rerun_failed_tests(self, need_rerun, runtests: RunTests): if self.ns.python: @@ -364,16 +369,16 @@ def rerun_failed_tests(self, need_rerun, runtests: RunTests): self.first_state = self.get_tests_state() print() - self._rerun_failed_tests(need_rerun, runtests) + rerun_runtests = self._rerun_failed_tests(need_rerun, runtests) if self.bad: print(count(len(self.bad), 'test'), "failed again:") printlist(self.bad) - self.display_result() + self.display_result(rerun_runtests) - def display_result(self): - pgo = self.ns.pgo + def display_result(self, runtests): + pgo = runtests.pgo quiet = self.ns.quiet print_slow = self.ns.print_slow @@ -444,12 +449,12 @@ def run_test(self, test_name: str, runtests: RunTests, tracer): if tracer is not None: # If we're tracing code coverage, then we don't exit with status # if on a false return value from main. - cmd = ('result = runtest(self.ns, test_name)') + cmd = ('result = run_single_test(test_name, runtests, self.ns)') ns = dict(locals()) tracer.runctx(cmd, globals=globals(), locals=ns) result = ns['result'] else: - result = runtest(self.ns, test_name) + result = run_single_test(test_name, runtests, self.ns) self.accumulate_result(result) @@ -458,9 +463,7 @@ def run_test(self, test_name: str, runtests: RunTests, tracer): def run_tests_sequentially(self, runtests): ns = self.ns coverage = ns.trace - fail_fast = ns.failfast fail_env_changed = ns.fail_env_changed - timeout = ns.timeout if coverage: import trace @@ -471,8 +474,8 @@ def run_tests_sequentially(self, runtests): save_modules = sys.modules.keys() msg = "Run tests sequentially" - if timeout: - msg += " (timeout: %s)" % format_duration(timeout) + if runtests.timeout: + msg += " (timeout: %s)" % format_duration(runtests.timeout) self.log(msg) previous_test = None @@ -492,7 +495,7 @@ def run_tests_sequentially(self, runtests): if module not in save_modules and module.startswith("test."): support.unload(module) - if result.must_stop(fail_fast, fail_env_changed): + if result.must_stop(self.fail_fast, fail_env_changed): break previous_test = str(result) @@ -850,16 +853,28 @@ def action_run_tests(self): # For a partial run, we do not need to clutter the output. if (self.want_header - or not(self.ns.pgo or self.ns.quiet or self.ns.single + or not(self.pgo or self.ns.quiet or self.ns.single or self.tests or self.ns.args)): self.display_header() if self.randomize: print("Using random seed", self.random_seed) - runtests = RunTests(tuple(self.selected), forever=self.forever) + runtests = RunTests( + tuple(self.selected), + fail_fast=self.fail_fast, + match_tests=self.match_tests, + ignore_tests=self.ignore_tests, + forever=self.forever, + pgo=self.pgo, + pgo_extended=self.pgo_extended, + output_on_failure=self.output_on_failure, + timeout=self.timeout) + + setup_tests(runtests, self.ns) + tracer = self.run_tests(runtests) - self.display_result() + self.display_result(runtests) need_rerun = self.need_rerun if self.ns.rerun and need_rerun: @@ -877,7 +892,7 @@ def _main(self): if self.want_wait: input("Press any key to continue...") - setup_tests(self.ns) + setup_test_dir(self.ns.testdir) self.find_tests() exitcode = 0 diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index ea5d0564b14aea..bfb0718aa56c32 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -208,9 +208,16 @@ def get_rerun_match_tests(self) -> FilterTuple | None: @dataclasses.dataclass(slots=True, frozen=True) class RunTests: tests: TestTuple + fail_fast: bool = False + match_tests: FilterTuple | None = None + ignore_tests: FilterTuple | None = None match_tests_dict: FilterDict | None = None rerun: bool = False forever: bool = False + pgo: bool = False + pgo_extended: bool = False + output_on_failure: bool = False + timeout: float | None = None def copy(self, **override): state = dataclasses.asdict(self) @@ -295,11 +302,11 @@ def abs_module_name(test_name: str, test_dir: str | None) -> str: return 'test.' + test_name -def setup_support(ns: Namespace): - support.PGO = ns.pgo - support.PGO_EXTENDED = ns.pgo_extended - support.set_match_tests(ns.match_tests, ns.ignore_tests) - support.failfast = ns.failfast +def setup_support(runtests: RunTests, ns: Namespace): + support.PGO = runtests.pgo + support.PGO_EXTENDED = runtests.pgo_extended + support.set_match_tests(runtests.match_tests, runtests.ignore_tests) + support.failfast = runtests.fail_fast support.verbose = ns.verbose if ns.xmlpath: support.junit_xml_list = [] @@ -307,12 +314,12 @@ def setup_support(ns: Namespace): support.junit_xml_list = None -def _runtest(result: TestResult, ns: Namespace) -> None: +def _runtest(result: TestResult, runtests: RunTests, ns: Namespace) -> None: # Capture stdout and stderr, set faulthandler timeout, # and create JUnit XML report. verbose = ns.verbose - output_on_failure = ns.verbose3 - timeout = ns.timeout + output_on_failure = runtests.output_on_failure + timeout = runtests.timeout use_timeout = ( timeout is not None and threading_helper.can_start_thread @@ -321,7 +328,7 @@ def _runtest(result: TestResult, ns: Namespace) -> None: faulthandler.dump_traceback_later(timeout, exit=True) try: - setup_support(ns) + setup_support(runtests, ns) if output_on_failure: support.verbose = True @@ -341,7 +348,7 @@ def _runtest(result: TestResult, ns: Namespace) -> None: # warnings will be written to sys.stderr below. print_warning.orig_stderr = stream - _runtest_env_changed_exc(result, ns, display_failure=False) + _runtest_env_changed_exc(result, runtests, ns, display_failure=False) # Ignore output if the test passed successfully if result.state != State.PASSED: output = stream.getvalue() @@ -356,7 +363,7 @@ def _runtest(result: TestResult, ns: Namespace) -> None: else: # Tell tests to be moderately quiet support.verbose = verbose - _runtest_env_changed_exc(result, ns, display_failure=not verbose) + _runtest_env_changed_exc(result, runtests, ns, display_failure=not verbose) xml_list = support.junit_xml_list if xml_list: @@ -369,7 +376,7 @@ def _runtest(result: TestResult, ns: Namespace) -> None: support.junit_xml_list = None -def runtest(ns: Namespace, test_name: str) -> TestResult: +def run_single_test(test_name: str, runtests: RunTests, ns: Namespace) -> TestResult: """Run a single test. ns -- regrtest namespace of options @@ -382,10 +389,11 @@ def runtest(ns: Namespace, test_name: str) -> TestResult: """ start_time = time.perf_counter() result = TestResult(test_name) + pgo = runtests.pgo try: - _runtest(result, ns) + _runtest(result, runtests, ns) except: - if not ns.pgo: + if not pgo: msg = traceback.format_exc() print(f"test {test_name} crashed -- {msg}", file=sys.stderr, flush=True) @@ -404,8 +412,8 @@ def run_unittest(test_mod): return support.run_unittest(tests) -def save_env(ns: Namespace, test_name: str): - return saved_test_environment(test_name, ns.verbose, ns.quiet, pgo=ns.pgo) +def save_env(test_name: str, runtests: RunTests, ns: Namespace): + return saved_test_environment(test_name, ns.verbose, ns.quiet, pgo=runtests.pgo) def regrtest_runner(result, test_func, ns) -> None: @@ -442,7 +450,7 @@ def regrtest_runner(result, test_func, ns) -> None: FOUND_GARBAGE = [] -def _load_run_test(result: TestResult, ns: Namespace) -> None: +def _load_run_test(result: TestResult, runtests: RunTests, ns: Namespace) -> None: # Load the test function, run the test function. module_name = abs_module_name(result.test_name, ns.testdir) @@ -458,7 +466,7 @@ def test_func(): return run_unittest(test_mod) try: - with save_env(ns, result.test_name): + with save_env(result.test_name, runtests, ns): regrtest_runner(result, test_func, ns) finally: # First kill any dangling references to open files etc. @@ -482,7 +490,8 @@ def test_func(): support.reap_children() -def _runtest_env_changed_exc(result: TestResult, ns: Namespace, +def _runtest_env_changed_exc(result: TestResult, runtests: RunTests, + ns: Namespace, display_failure: bool = True) -> None: # Detect environment changes, handle exceptions. @@ -490,7 +499,8 @@ def _runtest_env_changed_exc(result: TestResult, ns: Namespace, # the environment support.environment_altered = False - if ns.pgo: + pgo = runtests.pgo + if pgo: display_failure = False test_name = result.test_name @@ -498,15 +508,15 @@ def _runtest_env_changed_exc(result: TestResult, ns: Namespace, clear_caches() support.gc_collect() - with save_env(ns, test_name): - _load_run_test(result, ns) + with save_env(test_name, runtests, ns): + _load_run_test(result, runtests, ns) except support.ResourceDenied as msg: - if not ns.quiet and not ns.pgo: + if not ns.quiet and not pgo: print(f"{test_name} skipped -- {msg}", flush=True) result.state = State.RESOURCE_DENIED return except unittest.SkipTest as msg: - if not ns.quiet and not ns.pgo: + if not ns.quiet and not pgo: print(f"{test_name} skipped -- {msg}", flush=True) result.state = State.SKIPPED return @@ -536,7 +546,7 @@ def _runtest_env_changed_exc(result: TestResult, ns: Namespace, result.state = State.INTERRUPTED return except: - if not ns.pgo: + if not pgo: msg = traceback.format_exc() print(f"test {test_name} crashed -- {msg}", file=sys.stderr, flush=True) diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index 45db24f255fcf7..ecdde3aa523098 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -10,7 +10,7 @@ import threading import time import traceback -from typing import NamedTuple, NoReturn, Literal, Any, TextIO +from typing import NoReturn, Literal, Any, TextIO from test import support from test.support import os_helper @@ -19,9 +19,9 @@ from test.libregrtest.cmdline import Namespace from test.libregrtest.main import Regrtest from test.libregrtest.runtest import ( - runtest, TestResult, State, PROGRESS_MIN_TIME, + run_single_test, TestResult, State, PROGRESS_MIN_TIME, FilterTuple, RunTests) -from test.libregrtest.setup import setup_tests +from test.libregrtest.setup import setup_tests, setup_test_dir from test.libregrtest.utils import format_duration, print_warning if sys.platform == 'win32': @@ -48,7 +48,6 @@ class WorkerJob: runtests: RunTests namespace: Namespace - match_tests: FilterTuple | None = None class _EncodeWorkerJob(json.JSONEncoder): @@ -126,9 +125,10 @@ def worker_process(worker_json: str) -> NoReturn: runtests = worker_job.runtests ns = worker_job.namespace test_name = runtests.tests[0] - match_tests: FilterTuple | None = worker_job.match_tests + match_tests: FilterTuple | None = runtests.match_tests - setup_tests(ns) + setup_test_dir(ns.testdir) + setup_tests(runtests, ns) if runtests.rerun: if match_tests: @@ -138,10 +138,7 @@ def worker_process(worker_json: str) -> NoReturn: print(f"Re-running {test_name} in verbose mode", flush=True) ns.verbose = True - if match_tests is not None: - ns.match_tests = match_tests - - result = runtest(ns, test_name) + result = run_single_test(test_name, runtests, ns) print() # Force a newline (just in case) # Serialize TestResult as dict in JSON @@ -330,11 +327,13 @@ def _runtest(self, test_name: str) -> MultiprocessResult: match_tests = self.runtests.get_match_tests(test_name) else: match_tests = None - worker_runtests = self.runtests.copy(tests=tests) + kwargs = {} + if match_tests: + kwargs['match_tests'] = match_tests + worker_runtests = self.runtests.copy(tests=tests, **kwargs) worker_job = WorkerJob( worker_runtests, - namespace=self.ns, - match_tests=match_tests) + namespace=self.ns) # gh-94026: Write stdout+stderr to a tempfile as workaround for # non-blocking pipes on Emscripten with NodeJS. @@ -401,7 +400,7 @@ def _runtest(self, test_name: str) -> MultiprocessResult: return MultiprocessResult(result, stdout) def run(self) -> None: - fail_fast = self.ns.failfast + fail_fast = self.runtests.fail_fast fail_env_changed = self.ns.fail_env_changed while not self._stopped: try: @@ -473,7 +472,6 @@ def get_running(workers: list[TestWorkerProcess]) -> list[TestWorkerProcess]: class MultiprocessTestRunner: def __init__(self, regrtest: Regrtest, runtests: RunTests) -> None: ns = regrtest.ns - timeout = ns.timeout self.regrtest = regrtest self.runtests = runtests @@ -483,24 +481,24 @@ def __init__(self, regrtest: Regrtest, runtests: RunTests) -> None: self.output: queue.Queue[QueueOutput] = queue.Queue() tests_iter = runtests.iter_tests() self.pending = MultiprocessIterator(tests_iter) - if timeout is not None: + self.timeout = runtests.timeout + if self.timeout is not None: # Rely on faulthandler to kill a worker process. This timouet is # when faulthandler fails to kill a worker process. Give a maximum # of 5 minutes to faulthandler to kill the worker. - self.worker_timeout = min(timeout * 1.5, timeout + 5 * 60) + self.worker_timeout = min(self.timeout * 1.5, self.timeout + 5 * 60) else: self.worker_timeout = None self.workers = None def start_workers(self) -> None: use_mp = self.ns.use_mp - timeout = self.ns.timeout self.workers = [TestWorkerProcess(index, self) for index in range(1, use_mp + 1)] msg = f"Run tests in parallel using {len(self.workers)} child processes" - if timeout: + if self.timeout: msg += (" (timeout: %s, worker timeout: %s)" - % (format_duration(timeout), + % (format_duration(self.timeout), format_duration(self.worker_timeout))) self.log(msg) for worker in self.workers: @@ -514,9 +512,8 @@ def stop_workers(self) -> None: worker.wait_stopped(start_time) def _get_result(self) -> QueueOutput | None: - pgo = self.ns.pgo - use_faulthandler = (self.ns.timeout is not None) - timeout = PROGRESS_UPDATE + pgo = self.runtests.pgo + use_faulthandler = (self.timeout is not None) # bpo-46205: check the status of workers every iteration to avoid # waiting forever on an empty queue. @@ -527,7 +524,7 @@ def _get_result(self) -> QueueOutput | None: # wait for a thread try: - return self.output.get(timeout=timeout) + return self.output.get(timeout=PROGRESS_UPDATE) except queue.Empty: pass @@ -544,7 +541,7 @@ def _get_result(self) -> QueueOutput | None: def display_result(self, mp_result: MultiprocessResult) -> None: result = mp_result.result - pgo = self.ns.pgo + pgo = self.runtests.pgo text = str(result) if mp_result.err_msg: @@ -580,9 +577,8 @@ def _process_result(self, item: QueueOutput) -> bool: return result def run_tests(self) -> None: - fail_fast = self.ns.failfast + fail_fast = self.runtests.fail_fast fail_env_changed = self.ns.fail_env_changed - timeout = self.ns.timeout self.start_workers() @@ -600,7 +596,7 @@ def run_tests(self) -> None: print() self.regrtest.interrupted = True finally: - if timeout is not None: + if self.timeout is not None: faulthandler.cancel_dump_traceback_later() # Always ensure that all worker processes are no longer diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index b76bece7ca08b5..f640362cb2df7f 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -18,7 +18,14 @@ UNICODE_GUARD_ENV = "PYTHONREGRTEST_UNICODE_GUARD" -def setup_tests(ns): +def setup_test_dir(testdir): + if testdir: + # Prepend test directory to sys.path, so runtest() will be able + # to locate tests + sys.path.insert(0, os.path.abspath(testdir)) + + +def setup_tests(runtests, ns): try: stderr_fd = sys.__stderr__.fileno() except (ValueError, AttributeError): @@ -44,11 +51,6 @@ def setup_tests(ns): replace_stdout() support.record_original_stdout(sys.stdout) - if ns.testdir: - # Prepend test directory to sys.path, so runtest() will be able - # to locate tests - sys.path.insert(0, os.path.abspath(ns.testdir)) - # Some times __path__ and __file__ are not absolute (e.g. while running from # Lib/) and, if we change the CWD to run the tests in a temporary dir, some # imports might fail. This affects only the modules imported before os.chdir(). @@ -88,16 +90,17 @@ def _test_audit_hook(name, args): setup_unraisable_hook() setup_threading_excepthook() - if ns.timeout is not None: + timeout = runtests.timeout + if timeout is not None: # For a slow buildbot worker, increase SHORT_TIMEOUT and LONG_TIMEOUT - support.SHORT_TIMEOUT = max(support.SHORT_TIMEOUT, ns.timeout / 40) - support.LONG_TIMEOUT = max(support.LONG_TIMEOUT, ns.timeout / 4) + support.SHORT_TIMEOUT = max(support.SHORT_TIMEOUT, timeout / 40) + support.LONG_TIMEOUT = max(support.LONG_TIMEOUT, timeout / 4) # If --timeout is short: reduce timeouts - support.LOOPBACK_TIMEOUT = min(support.LOOPBACK_TIMEOUT, ns.timeout) - support.INTERNET_TIMEOUT = min(support.INTERNET_TIMEOUT, ns.timeout) - support.SHORT_TIMEOUT = min(support.SHORT_TIMEOUT, ns.timeout) - support.LONG_TIMEOUT = min(support.LONG_TIMEOUT, ns.timeout) + support.LOOPBACK_TIMEOUT = min(support.LOOPBACK_TIMEOUT, timeout) + support.INTERNET_TIMEOUT = min(support.INTERNET_TIMEOUT, timeout) + support.SHORT_TIMEOUT = min(support.SHORT_TIMEOUT, timeout) + support.LONG_TIMEOUT = min(support.LONG_TIMEOUT, timeout) if ns.xmlpath: from test.support.testresult import RegressionTestResult From 17f994174de9211b2baaff217eeb1033343230fc Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Fri, 8 Sep 2023 19:49:20 -0700 Subject: [PATCH 121/357] gh-109118: Fix runtime crash when NameError happens in PEP 695 function (#109123) --- Include/internal/pycore_opcode_metadata.h | 90 ++++++++----------- Lib/test/test_type_params.py | 40 +++++++++ ...-09-07-18-24-42.gh-issue-109118.yPXRAe.rst | 2 + Python/abstract_interp_cases.c.h | 10 ++- Python/bytecodes.c | 44 +++++++-- Python/executor_cases.c.h | 42 ++++++++- Python/generated_cases.c.h | 67 ++++++-------- 7 files changed, 189 insertions(+), 106 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-07-18-24-42.gh-issue-109118.yPXRAe.rst diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index fb5c0465a10021..f70b75a56c150c 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -39,40 +39,38 @@ #define _BINARY_OP_ADD_UNICODE 311 #define _BINARY_OP_INPLACE_ADD_UNICODE 312 #define _POP_FRAME 313 -#define _LOAD_LOCALS 314 -#define _LOAD_FROM_DICT_OR_GLOBALS 315 -#define _GUARD_GLOBALS_VERSION 316 -#define _GUARD_BUILTINS_VERSION 317 -#define _LOAD_GLOBAL_MODULE 318 -#define _LOAD_GLOBAL_BUILTINS 319 -#define _GUARD_TYPE_VERSION 320 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES 321 -#define _LOAD_ATTR_INSTANCE_VALUE 322 -#define IS_NONE 323 -#define _ITER_CHECK_LIST 324 -#define _ITER_JUMP_LIST 325 -#define _IS_ITER_EXHAUSTED_LIST 326 -#define _ITER_NEXT_LIST 327 -#define _ITER_CHECK_TUPLE 328 -#define _ITER_JUMP_TUPLE 329 -#define _IS_ITER_EXHAUSTED_TUPLE 330 -#define _ITER_NEXT_TUPLE 331 -#define _ITER_CHECK_RANGE 332 -#define _ITER_JUMP_RANGE 333 -#define _IS_ITER_EXHAUSTED_RANGE 334 -#define _ITER_NEXT_RANGE 335 -#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 336 -#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 337 -#define _CHECK_PEP_523 338 -#define _CHECK_FUNCTION_EXACT_ARGS 339 -#define _CHECK_STACK_SPACE 340 -#define _INIT_CALL_PY_EXACT_ARGS 341 -#define _PUSH_FRAME 342 -#define _POP_JUMP_IF_FALSE 343 -#define _POP_JUMP_IF_TRUE 344 -#define JUMP_TO_TOP 345 -#define SAVE_CURRENT_IP 346 -#define INSERT 347 +#define _GUARD_GLOBALS_VERSION 314 +#define _GUARD_BUILTINS_VERSION 315 +#define _LOAD_GLOBAL_MODULE 316 +#define _LOAD_GLOBAL_BUILTINS 317 +#define _GUARD_TYPE_VERSION 318 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES 319 +#define _LOAD_ATTR_INSTANCE_VALUE 320 +#define IS_NONE 321 +#define _ITER_CHECK_LIST 322 +#define _ITER_JUMP_LIST 323 +#define _IS_ITER_EXHAUSTED_LIST 324 +#define _ITER_NEXT_LIST 325 +#define _ITER_CHECK_TUPLE 326 +#define _ITER_JUMP_TUPLE 327 +#define _IS_ITER_EXHAUSTED_TUPLE 328 +#define _ITER_NEXT_TUPLE 329 +#define _ITER_CHECK_RANGE 330 +#define _ITER_JUMP_RANGE 331 +#define _IS_ITER_EXHAUSTED_RANGE 332 +#define _ITER_NEXT_RANGE 333 +#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 334 +#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 335 +#define _CHECK_PEP_523 336 +#define _CHECK_FUNCTION_EXACT_ARGS 337 +#define _CHECK_STACK_SPACE 338 +#define _INIT_CALL_PY_EXACT_ARGS 339 +#define _PUSH_FRAME 340 +#define _POP_JUMP_IF_FALSE 341 +#define _POP_JUMP_IF_TRUE 342 +#define JUMP_TO_TOP 343 +#define SAVE_CURRENT_IP 344 +#define INSERT 345 extern int _PyOpcode_num_popped(int opcode, int oparg, bool jump); #ifdef NEED_OPCODE_METADATA @@ -268,16 +266,12 @@ int _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 1; case DELETE_GLOBAL: return 0; - case _LOAD_LOCALS: - return 0; case LOAD_LOCALS: return 0; - case _LOAD_FROM_DICT_OR_GLOBALS: + case LOAD_FROM_DICT_OR_GLOBALS: return 1; case LOAD_NAME: return 0; - case LOAD_FROM_DICT_OR_GLOBALS: - return 1; case LOAD_GLOBAL: return 0; case _GUARD_GLOBALS_VERSION: @@ -802,16 +796,12 @@ int _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 0; case DELETE_GLOBAL: return 0; - case _LOAD_LOCALS: - return 1; case LOAD_LOCALS: return 1; - case _LOAD_FROM_DICT_OR_GLOBALS: + case LOAD_FROM_DICT_OR_GLOBALS: return 1; case LOAD_NAME: return 1; - case LOAD_FROM_DICT_OR_GLOBALS: - return 1; case LOAD_GLOBAL: return ((oparg & 1) ? 1 : 0) + 1; case _GUARD_GLOBALS_VERSION: @@ -1305,11 +1295,9 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[OPCODE_METADATA_SIZE] = { [DELETE_ATTR] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG }, [STORE_GLOBAL] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG }, [DELETE_GLOBAL] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG }, - [_LOAD_LOCALS] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG }, [LOAD_LOCALS] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG }, - [_LOAD_FROM_DICT_OR_GLOBALS] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG }, - [LOAD_NAME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG }, [LOAD_FROM_DICT_OR_GLOBALS] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG }, + [LOAD_NAME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG }, [LOAD_GLOBAL] = { true, INSTR_FMT_IBC000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG }, [_GUARD_GLOBALS_VERSION] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG }, [_GUARD_BUILTINS_VERSION] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG }, @@ -1546,9 +1534,9 @@ const struct opcode_macro_expansion _PyOpcode_macro_expansion[OPCODE_MACRO_EXPAN [DELETE_ATTR] = { .nuops = 1, .uops = { { DELETE_ATTR, 0, 0 } } }, [STORE_GLOBAL] = { .nuops = 1, .uops = { { STORE_GLOBAL, 0, 0 } } }, [DELETE_GLOBAL] = { .nuops = 1, .uops = { { DELETE_GLOBAL, 0, 0 } } }, - [LOAD_LOCALS] = { .nuops = 1, .uops = { { _LOAD_LOCALS, 0, 0 } } }, - [LOAD_NAME] = { .nuops = 2, .uops = { { _LOAD_LOCALS, 0, 0 }, { _LOAD_FROM_DICT_OR_GLOBALS, 0, 0 } } }, - [LOAD_FROM_DICT_OR_GLOBALS] = { .nuops = 1, .uops = { { _LOAD_FROM_DICT_OR_GLOBALS, 0, 0 } } }, + [LOAD_LOCALS] = { .nuops = 1, .uops = { { LOAD_LOCALS, 0, 0 } } }, + [LOAD_FROM_DICT_OR_GLOBALS] = { .nuops = 1, .uops = { { LOAD_FROM_DICT_OR_GLOBALS, 0, 0 } } }, + [LOAD_NAME] = { .nuops = 1, .uops = { { LOAD_NAME, 0, 0 } } }, [LOAD_GLOBAL] = { .nuops = 1, .uops = { { LOAD_GLOBAL, 0, 0 } } }, [LOAD_GLOBAL_MODULE] = { .nuops = 2, .uops = { { _GUARD_GLOBALS_VERSION, 1, 1 }, { _LOAD_GLOBAL_MODULE, 1, 3 } } }, [LOAD_GLOBAL_BUILTIN] = { .nuops = 3, .uops = { { _GUARD_GLOBALS_VERSION, 1, 1 }, { _GUARD_BUILTINS_VERSION, 1, 2 }, { _LOAD_GLOBAL_BUILTINS, 1, 3 } } }, @@ -1633,8 +1621,6 @@ const char * const _PyOpcode_uop_name[OPCODE_UOP_NAME_SIZE] = { [_BINARY_OP_ADD_UNICODE] = "_BINARY_OP_ADD_UNICODE", [_BINARY_OP_INPLACE_ADD_UNICODE] = "_BINARY_OP_INPLACE_ADD_UNICODE", [_POP_FRAME] = "_POP_FRAME", - [_LOAD_LOCALS] = "_LOAD_LOCALS", - [_LOAD_FROM_DICT_OR_GLOBALS] = "_LOAD_FROM_DICT_OR_GLOBALS", [_GUARD_GLOBALS_VERSION] = "_GUARD_GLOBALS_VERSION", [_GUARD_BUILTINS_VERSION] = "_GUARD_BUILTINS_VERSION", [_LOAD_GLOBAL_MODULE] = "_LOAD_GLOBAL_MODULE", diff --git a/Lib/test/test_type_params.py b/Lib/test/test_type_params.py index 0045057f181e1c..f93d088ea758a9 100644 --- a/Lib/test/test_type_params.py +++ b/Lib/test/test_type_params.py @@ -956,3 +956,43 @@ class NewStyle[T]: for case in cases: with self.subTest(case=case): weakref.ref(case) + + +class TypeParamsRuntimeTest(unittest.TestCase): + def test_name_error(self): + # gh-109118: This crashed the interpreter due to a refcounting bug + code = """ + class name_2[name_5]: + class name_4[name_5](name_0): + pass + """ + with self.assertRaises(NameError): + run_code(code) + + # Crashed with a slightly different stack trace + code = """ + class name_2[name_5]: + class name_4[name_5: name_5](name_0): + pass + """ + with self.assertRaises(NameError): + run_code(code) + + def test_broken_class_namespace(self): + code = """ + class WeirdMapping(dict): + def __missing__(self, key): + if key == "T": + raise RuntimeError + raise KeyError(key) + + class Meta(type): + def __prepare__(name, bases): + return WeirdMapping() + + class MyClass[V](metaclass=Meta): + class Inner[U](T): + pass + """ + with self.assertRaises(RuntimeError): + run_code(code) diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-07-18-24-42.gh-issue-109118.yPXRAe.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-07-18-24-42.gh-issue-109118.yPXRAe.rst new file mode 100644 index 00000000000000..f14fce4423896f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-07-18-24-42.gh-issue-109118.yPXRAe.rst @@ -0,0 +1,2 @@ +Fix interpreter crash when a NameError is raised inside the type parameters +of a generic class. diff --git a/Python/abstract_interp_cases.c.h b/Python/abstract_interp_cases.c.h index 11fbf4443dda16..398c04616bc091 100644 --- a/Python/abstract_interp_cases.c.h +++ b/Python/abstract_interp_cases.c.h @@ -291,13 +291,19 @@ break; } - case _LOAD_LOCALS: { + case LOAD_LOCALS: { STACK_GROW(1); PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); break; } - case _LOAD_FROM_DICT_OR_GLOBALS: { + case LOAD_FROM_DICT_OR_GLOBALS: { + PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); + break; + } + + case LOAD_NAME: { + STACK_GROW(1); PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); break; } diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 21069204cf8693..ff95f37b900da6 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -1286,7 +1286,7 @@ dummy_func( } } - op(_LOAD_LOCALS, ( -- locals)) { + inst(LOAD_LOCALS, ( -- locals)) { locals = LOCALS(); if (locals == NULL) { _PyErr_SetString(tstate, PyExc_SystemError, @@ -1296,15 +1296,11 @@ dummy_func( Py_INCREF(locals); } - macro(LOAD_LOCALS) = _LOAD_LOCALS; - - op(_LOAD_FROM_DICT_OR_GLOBALS, (mod_or_class_dict -- v)) { + inst(LOAD_FROM_DICT_OR_GLOBALS, (mod_or_class_dict -- v)) { PyObject *name = GETITEM(FRAME_CO_NAMES, oparg); if (PyMapping_GetOptionalItem(mod_or_class_dict, name, &v) < 0) { - Py_DECREF(mod_or_class_dict); goto error; } - Py_DECREF(mod_or_class_dict); if (v == NULL) { v = PyDict_GetItemWithError(GLOBALS(), name); if (v != NULL) { @@ -1325,11 +1321,41 @@ dummy_func( } } } + DECREF_INPUTS(); } - macro(LOAD_NAME) = _LOAD_LOCALS + _LOAD_FROM_DICT_OR_GLOBALS; - - macro(LOAD_FROM_DICT_OR_GLOBALS) = _LOAD_FROM_DICT_OR_GLOBALS; + inst(LOAD_NAME, (-- v)) { + PyObject *mod_or_class_dict = LOCALS(); + if (mod_or_class_dict == NULL) { + _PyErr_SetString(tstate, PyExc_SystemError, + "no locals found"); + ERROR_IF(true, error); + } + PyObject *name = GETITEM(FRAME_CO_NAMES, oparg); + if (PyMapping_GetOptionalItem(mod_or_class_dict, name, &v) < 0) { + goto error; + } + if (v == NULL) { + v = PyDict_GetItemWithError(GLOBALS(), name); + if (v != NULL) { + Py_INCREF(v); + } + else if (_PyErr_Occurred(tstate)) { + goto error; + } + else { + if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) { + goto error; + } + if (v == NULL) { + _PyEval_FormatExcCheckArg( + tstate, PyExc_NameError, + NAME_ERROR_MSG, name); + goto error; + } + } + } + } family(LOAD_GLOBAL, INLINE_CACHE_ENTRIES_LOAD_GLOBAL) = { LOAD_GLOBAL_MODULE, diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index fa7cb88e4a1e1f..918991dca7dd25 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -1046,7 +1046,7 @@ break; } - case _LOAD_LOCALS: { + case LOAD_LOCALS: { PyObject *locals; locals = LOCALS(); if (locals == NULL) { @@ -1060,16 +1060,51 @@ break; } - case _LOAD_FROM_DICT_OR_GLOBALS: { + case LOAD_FROM_DICT_OR_GLOBALS: { PyObject *mod_or_class_dict; PyObject *v; mod_or_class_dict = stack_pointer[-1]; PyObject *name = GETITEM(FRAME_CO_NAMES, oparg); if (PyMapping_GetOptionalItem(mod_or_class_dict, name, &v) < 0) { - Py_DECREF(mod_or_class_dict); goto error; } + if (v == NULL) { + v = PyDict_GetItemWithError(GLOBALS(), name); + if (v != NULL) { + Py_INCREF(v); + } + else if (_PyErr_Occurred(tstate)) { + goto error; + } + else { + if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) { + goto error; + } + if (v == NULL) { + _PyEval_FormatExcCheckArg( + tstate, PyExc_NameError, + NAME_ERROR_MSG, name); + goto error; + } + } + } Py_DECREF(mod_or_class_dict); + stack_pointer[-1] = v; + break; + } + + case LOAD_NAME: { + PyObject *v; + PyObject *mod_or_class_dict = LOCALS(); + if (mod_or_class_dict == NULL) { + _PyErr_SetString(tstate, PyExc_SystemError, + "no locals found"); + if (true) goto error; + } + PyObject *name = GETITEM(FRAME_CO_NAMES, oparg); + if (PyMapping_GetOptionalItem(mod_or_class_dict, name, &v) < 0) { + goto error; + } if (v == NULL) { v = PyDict_GetItemWithError(GLOBALS(), name); if (v != NULL) { @@ -1090,6 +1125,7 @@ } } } + STACK_GROW(1); stack_pointer[-1] = v; break; } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 136b36c8260cb5..e84599d87a6968 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -1675,65 +1675,51 @@ DISPATCH(); } - TARGET(LOAD_NAME) { - PyObject *locals; + TARGET(LOAD_FROM_DICT_OR_GLOBALS) { PyObject *mod_or_class_dict; PyObject *v; - // _LOAD_LOCALS - { - locals = LOCALS(); - if (locals == NULL) { - _PyErr_SetString(tstate, PyExc_SystemError, - "no locals found"); - if (true) goto error; - } - Py_INCREF(locals); + mod_or_class_dict = stack_pointer[-1]; + PyObject *name = GETITEM(FRAME_CO_NAMES, oparg); + if (PyMapping_GetOptionalItem(mod_or_class_dict, name, &v) < 0) { + goto error; } - // _LOAD_FROM_DICT_OR_GLOBALS - mod_or_class_dict = locals; - { - PyObject *name = GETITEM(FRAME_CO_NAMES, oparg); - if (PyMapping_GetOptionalItem(mod_or_class_dict, name, &v) < 0) { - Py_DECREF(mod_or_class_dict); + if (v == NULL) { + v = PyDict_GetItemWithError(GLOBALS(), name); + if (v != NULL) { + Py_INCREF(v); + } + else if (_PyErr_Occurred(tstate)) { goto error; } - Py_DECREF(mod_or_class_dict); - if (v == NULL) { - v = PyDict_GetItemWithError(GLOBALS(), name); - if (v != NULL) { - Py_INCREF(v); - } - else if (_PyErr_Occurred(tstate)) { + else { + if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) { goto error; } - else { - if (PyMapping_GetOptionalItem(BUILTINS(), name, &v) < 0) { - goto error; - } - if (v == NULL) { - _PyEval_FormatExcCheckArg( - tstate, PyExc_NameError, - NAME_ERROR_MSG, name); - goto error; - } + if (v == NULL) { + _PyEval_FormatExcCheckArg( + tstate, PyExc_NameError, + NAME_ERROR_MSG, name); + goto error; } } } - STACK_GROW(1); + Py_DECREF(mod_or_class_dict); stack_pointer[-1] = v; DISPATCH(); } - TARGET(LOAD_FROM_DICT_OR_GLOBALS) { - PyObject *mod_or_class_dict; + TARGET(LOAD_NAME) { PyObject *v; - mod_or_class_dict = stack_pointer[-1]; + PyObject *mod_or_class_dict = LOCALS(); + if (mod_or_class_dict == NULL) { + _PyErr_SetString(tstate, PyExc_SystemError, + "no locals found"); + if (true) goto error; + } PyObject *name = GETITEM(FRAME_CO_NAMES, oparg); if (PyMapping_GetOptionalItem(mod_or_class_dict, name, &v) < 0) { - Py_DECREF(mod_or_class_dict); goto error; } - Py_DECREF(mod_or_class_dict); if (v == NULL) { v = PyDict_GetItemWithError(GLOBALS(), name); if (v != NULL) { @@ -1754,6 +1740,7 @@ } } } + STACK_GROW(1); stack_pointer[-1] = v; DISPATCH(); } From b4131a13cb41d0f397776683c3b99500db9e2cfd Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 9 Sep 2023 08:44:46 +0300 Subject: [PATCH 122/357] gh-109050: Remove remaining tests for legacy Unicode C API (GH-109068) --- Lib/test/support/__init__.py | 9 ----- Lib/test/test_capi/test_getargs.py | 64 ------------------------------ Lib/test/test_csv.py | 12 ------ Lib/test/test_decimal.py | 31 +-------------- Lib/test/test_str.py | 30 -------------- Modules/_testcapi/getargs.c | 52 ------------------------ 6 files changed, 1 insertion(+), 197 deletions(-) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 84b74ee2c298e9..f40b73b0a799f1 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -506,15 +506,6 @@ def has_no_debug_ranges(): def requires_debug_ranges(reason='requires co_positions / debug_ranges'): return unittest.skipIf(has_no_debug_ranges(), reason) -def requires_legacy_unicode_capi(): - try: - from _testcapi import unicode_legacy_string - except ImportError: - unicode_legacy_string = None - - return unittest.skipUnless(unicode_legacy_string, - 'requires legacy Unicode C API') - # Is not actually used in tests, but is kept for compatibility. is_jython = sys.platform.startswith('java') diff --git a/Lib/test/test_capi/test_getargs.py b/Lib/test/test_capi/test_getargs.py index 246206af86101c..e10f679eeb71c8 100644 --- a/Lib/test/test_capi/test_getargs.py +++ b/Lib/test/test_capi/test_getargs.py @@ -1004,70 +1004,6 @@ def test_et_hash(self): buf = bytearray() self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf) - @support.requires_legacy_unicode_capi() - def test_u(self): - from _testcapi import getargs_u - with self.assertWarns(DeprecationWarning): - self.assertEqual(getargs_u('abc\xe9'), 'abc\xe9') - with self.assertWarns(DeprecationWarning): - self.assertRaises(ValueError, getargs_u, 'nul:\0') - with self.assertWarns(DeprecationWarning): - self.assertRaises(TypeError, getargs_u, b'bytes') - with self.assertWarns(DeprecationWarning): - self.assertRaises(TypeError, getargs_u, bytearray(b'bytearray')) - with self.assertWarns(DeprecationWarning): - self.assertRaises(TypeError, getargs_u, memoryview(b'memoryview')) - with self.assertWarns(DeprecationWarning): - self.assertRaises(TypeError, getargs_u, None) - - @support.requires_legacy_unicode_capi() - def test_u_hash(self): - from _testcapi import getargs_u_hash - with self.assertWarns(DeprecationWarning): - self.assertEqual(getargs_u_hash('abc\xe9'), 'abc\xe9') - with self.assertWarns(DeprecationWarning): - self.assertEqual(getargs_u_hash('nul:\0'), 'nul:\0') - with self.assertWarns(DeprecationWarning): - self.assertRaises(TypeError, getargs_u_hash, b'bytes') - with self.assertWarns(DeprecationWarning): - self.assertRaises(TypeError, getargs_u_hash, bytearray(b'bytearray')) - with self.assertWarns(DeprecationWarning): - self.assertRaises(TypeError, getargs_u_hash, memoryview(b'memoryview')) - with self.assertWarns(DeprecationWarning): - self.assertRaises(TypeError, getargs_u_hash, None) - - @support.requires_legacy_unicode_capi() - def test_Z(self): - from _testcapi import getargs_Z - with self.assertWarns(DeprecationWarning): - self.assertEqual(getargs_Z('abc\xe9'), 'abc\xe9') - with self.assertWarns(DeprecationWarning): - self.assertRaises(ValueError, getargs_Z, 'nul:\0') - with self.assertWarns(DeprecationWarning): - self.assertRaises(TypeError, getargs_Z, b'bytes') - with self.assertWarns(DeprecationWarning): - self.assertRaises(TypeError, getargs_Z, bytearray(b'bytearray')) - with self.assertWarns(DeprecationWarning): - self.assertRaises(TypeError, getargs_Z, memoryview(b'memoryview')) - with self.assertWarns(DeprecationWarning): - self.assertIsNone(getargs_Z(None)) - - @support.requires_legacy_unicode_capi() - def test_Z_hash(self): - from _testcapi import getargs_Z_hash - with self.assertWarns(DeprecationWarning): - self.assertEqual(getargs_Z_hash('abc\xe9'), 'abc\xe9') - with self.assertWarns(DeprecationWarning): - self.assertEqual(getargs_Z_hash('nul:\0'), 'nul:\0') - with self.assertWarns(DeprecationWarning): - self.assertRaises(TypeError, getargs_Z_hash, b'bytes') - with self.assertWarns(DeprecationWarning): - self.assertRaises(TypeError, getargs_Z_hash, bytearray(b'bytearray')) - with self.assertWarns(DeprecationWarning): - self.assertRaises(TypeError, getargs_Z_hash, memoryview(b'memoryview')) - with self.assertWarns(DeprecationWarning): - self.assertIsNone(getargs_Z_hash(None)) - def test_gh_99240_clear_args(self): from _testcapi import gh_99240_clear_args self.assertRaises(TypeError, gh_99240_clear_args, 'a', '\0b') diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index bc6879176cd85e..27f4978ca66a88 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -281,18 +281,6 @@ def test_writerows_errors(self): self.assertRaises(TypeError, writer.writerows, None) self.assertRaises(OSError, writer.writerows, BadIterable()) - @support.cpython_only - @support.requires_legacy_unicode_capi() - @warnings_helper.ignore_warnings(category=DeprecationWarning) - def test_writerows_legacy_strings(self): - import _testcapi - c = _testcapi.unicode_legacy_string('a') - with TemporaryFile("w+", encoding="utf-8", newline='') as fileobj: - writer = csv.writer(fileobj) - writer.writerows([[c]]) - fileobj.seek(0) - self.assertEqual(fileobj.read(), "a\r\n") - def _read_test(self, input, expect, **kwargs): reader = csv.reader(input, **kwargs) result = list(reader) diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py index abfd71c868d009..d806eeac25fb2f 100644 --- a/Lib/test/test_decimal.py +++ b/Lib/test/test_decimal.py @@ -34,7 +34,7 @@ import locale from test.support import (is_resource_enabled, requires_IEEE_754, requires_docstrings, - requires_legacy_unicode_capi, check_sanitizer, + check_sanitizer, check_disallow_instantiation) from test.support import (TestFailed, run_with_locale, cpython_only, @@ -587,18 +587,6 @@ def test_explicit_from_string(self): # underscores don't prevent errors self.assertRaises(InvalidOperation, Decimal, "1_2_\u00003") - @cpython_only - @requires_legacy_unicode_capi() - @warnings_helper.ignore_warnings(category=DeprecationWarning) - def test_from_legacy_strings(self): - import _testcapi - Decimal = self.decimal.Decimal - context = self.decimal.Context() - - s = _testcapi.unicode_legacy_string('9.999999') - self.assertEqual(str(Decimal(s)), '9.999999') - self.assertEqual(str(context.create_decimal(s)), '9.999999') - def test_explicit_from_tuples(self): Decimal = self.decimal.Decimal @@ -2919,23 +2907,6 @@ def test_none_args(self): assert_signals(self, c, 'traps', [InvalidOperation, DivisionByZero, Overflow]) - @cpython_only - @requires_legacy_unicode_capi() - @warnings_helper.ignore_warnings(category=DeprecationWarning) - def test_from_legacy_strings(self): - import _testcapi - c = self.decimal.Context() - - for rnd in RoundingModes: - c.rounding = _testcapi.unicode_legacy_string(rnd) - self.assertEqual(c.rounding, rnd) - - s = _testcapi.unicode_legacy_string('') - self.assertRaises(TypeError, setattr, c, 'rounding', s) - - s = _testcapi.unicode_legacy_string('ROUND_\x00UP') - self.assertRaises(TypeError, setattr, c, 'rounding', s) - def test_pickle(self): for proto in range(pickle.HIGHEST_PROTOCOL + 1): diff --git a/Lib/test/test_str.py b/Lib/test/test_str.py index 3ae2f45ef6bddc..814ef111c5bec8 100644 --- a/Lib/test/test_str.py +++ b/Lib/test/test_str.py @@ -812,16 +812,6 @@ def test_isidentifier(self): self.assertFalse("©".isidentifier()) self.assertFalse("0".isidentifier()) - @support.cpython_only - @support.requires_legacy_unicode_capi() - @unittest.skipIf(_testcapi is None, 'need _testcapi module') - def test_isidentifier_legacy(self): - u = '𝖀𝖓𝖎𝖈𝖔𝖉𝖊' - self.assertTrue(u.isidentifier()) - with warnings_helper.check_warnings(): - warnings.simplefilter('ignore', DeprecationWarning) - self.assertTrue(_testcapi.unicode_legacy_string(u).isidentifier()) - def test_isprintable(self): self.assertTrue("".isprintable()) self.assertTrue(" ".isprintable()) @@ -2489,26 +2479,6 @@ def test_getnewargs(self): self.assertEqual(args[0], text) self.assertEqual(len(args), 1) - @support.cpython_only - @support.requires_legacy_unicode_capi() - @unittest.skipIf(_testcapi is None, 'need _testcapi module') - def test_resize(self): - for length in range(1, 100, 7): - # generate a fresh string (refcount=1) - text = 'a' * length + 'b' - - # fill wstr internal field - with self.assertWarns(DeprecationWarning): - abc = _testcapi.getargs_u(text) - self.assertEqual(abc, text) - - # resize text: wstr field must be cleared and then recomputed - text += 'c' - with self.assertWarns(DeprecationWarning): - abcdef = _testcapi.getargs_u(text) - self.assertNotEqual(abc, abcdef) - self.assertEqual(abcdef, text) - def test_compare(self): # Issue #17615 N = 10 diff --git a/Modules/_testcapi/getargs.c b/Modules/_testcapi/getargs.c index 10a1c1dd05253d..5f4a6dc8ca7672 100644 --- a/Modules/_testcapi/getargs.c +++ b/Modules/_testcapi/getargs.c @@ -589,54 +589,6 @@ getargs_y_hash(PyObject *self, PyObject *args) return PyBytes_FromStringAndSize(str, size); } -static PyObject * -getargs_u(PyObject *self, PyObject *args) -{ - wchar_t *str; - if (!PyArg_ParseTuple(args, "u", &str)) { - return NULL; - } - return PyUnicode_FromWideChar(str, -1); -} - -static PyObject * -getargs_u_hash(PyObject *self, PyObject *args) -{ - wchar_t *str; - Py_ssize_t size; - if (!PyArg_ParseTuple(args, "u#", &str, &size)) { - return NULL; - } - return PyUnicode_FromWideChar(str, size); -} - -static PyObject * -getargs_Z(PyObject *self, PyObject *args) -{ - wchar_t *str; - if (!PyArg_ParseTuple(args, "Z", &str)) { - return NULL; - } - if (str != NULL) { - return PyUnicode_FromWideChar(str, -1); - } - Py_RETURN_NONE; -} - -static PyObject * -getargs_Z_hash(PyObject *self, PyObject *args) -{ - wchar_t *str; - Py_ssize_t size; - if (!PyArg_ParseTuple(args, "Z#", &str, &size)) { - return NULL; - } - if (str != NULL) { - return PyUnicode_FromWideChar(str, size); - } - Py_RETURN_NONE; -} - static PyObject * getargs_es(PyObject *self, PyObject *args) { @@ -845,8 +797,6 @@ static PyMethodDef test_methods[] = { {"getargs_S", getargs_S, METH_VARARGS}, {"getargs_U", getargs_U, METH_VARARGS}, {"getargs_Y", getargs_Y, METH_VARARGS}, - {"getargs_Z", getargs_Z, METH_VARARGS}, - {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS}, {"getargs_b", getargs_b, METH_VARARGS}, {"getargs_c", getargs_c, METH_VARARGS}, {"getargs_d", getargs_d, METH_VARARGS}, @@ -868,8 +818,6 @@ static PyMethodDef test_methods[] = { {"getargs_s_hash", getargs_s_hash, METH_VARARGS}, {"getargs_s_star", getargs_s_star, METH_VARARGS}, {"getargs_tuple", getargs_tuple, METH_VARARGS}, - {"getargs_u", getargs_u, METH_VARARGS}, - {"getargs_u_hash", getargs_u_hash, METH_VARARGS}, {"getargs_w_star", getargs_w_star, METH_VARARGS}, {"getargs_y", getargs_y, METH_VARARGS}, {"getargs_y_hash", getargs_y_hash, METH_VARARGS}, From e21c89f9841488a1d4ca1024dc97c1aba44e0c87 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 9 Sep 2023 11:18:14 +0200 Subject: [PATCH 123/357] gh-109162: Refactor libregrtest.RunTests (#109177) * Rename dash_R() runtest_refleak(). The function now gets huntrleaks and quiet arguments, instead of 'ns' argument. * Add attributes to Regrtest and RunTests: * verbose * quiet * huntrleaks * test_dir * Add HuntRefleak class. --- Lib/test/libregrtest/main.py | 57 +++++++++++++++++------------- Lib/test/libregrtest/refleak.py | 23 +++++++----- Lib/test/libregrtest/runtest.py | 57 +++++++++++++++++++----------- Lib/test/libregrtest/runtest_mp.py | 3 +- Lib/test/libregrtest/setup.py | 8 ++--- 5 files changed, 88 insertions(+), 60 deletions(-) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index f7d28a859213f5..bb02101d97a2d2 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -12,7 +12,7 @@ from test.libregrtest.cmdline import _parse_args, Namespace from test.libregrtest.runtest import ( findtests, split_test_packages, run_single_test, abs_module_name, - PROGRESS_MIN_TIME, State, RunTests, TestResult, + PROGRESS_MIN_TIME, State, RunTests, TestResult, HuntRefleak, FilterTuple, FilterDict, TestList) from test.libregrtest.setup import setup_tests, setup_test_dir from test.libregrtest.pgo import setup_pgo_tests @@ -92,6 +92,14 @@ def __init__(self, ns: Namespace): self.pgo_extended: bool = ns.pgo_extended self.output_on_failure: bool = ns.verbose3 self.timeout: float | None = ns.timeout + self.verbose: bool = ns.verbose + self.quiet: bool = ns.quiet + if ns.huntrleaks: + self.hunt_refleak: HuntRefleak = HuntRefleak(*ns.huntrleaks) + else: + self.hunt_refleak = None + self.test_dir: str | None = ns.testdir + self.junit_filename: str | None = ns.xmlpath # tests self.tests = [] @@ -200,8 +208,7 @@ def log(self, line=''): print(line, flush=True) def display_progress(self, test_index, text): - quiet = self.ns.quiet - if quiet: + if self.quiet: return # "[ 51/405/1] test_tcl passed" @@ -214,7 +221,6 @@ def display_progress(self, test_index, text): def find_tests(self): ns = self.ns single = ns.single - test_dir = ns.testdir if single: self.next_single_filename = os.path.join(self.tmp_dir, 'pynexttest') @@ -250,7 +256,8 @@ def find_tests(self): exclude_tests.add(arg) ns.args = [] - alltests = findtests(testdir=test_dir, exclude=exclude_tests) + alltests = findtests(testdir=self.test_dir, + exclude=exclude_tests) if not self.fromfile: self.selected = self.tests or ns.args @@ -298,14 +305,12 @@ def _list_cases(self, suite): print(test.id()) def list_cases(self): - ns = self.ns - test_dir = ns.testdir support.verbose = False support.set_match_tests(self.match_tests, self.ignore_tests) skipped = [] for test_name in self.selected: - module_name = abs_module_name(test_name, test_dir) + module_name = abs_module_name(test_name, self.test_dir) try: suite = unittest.defaultTestLoader.loadTestsFromName(module_name) self._list_cases(suite) @@ -331,7 +336,6 @@ def get_rerun_match(self, rerun_list) -> FilterDict: def _rerun_failed_tests(self, need_rerun, runtests: RunTests): # Configure the runner to re-run tests ns = self.ns - ns.verbose = True if ns.use_mp is None: ns.use_mp = 1 @@ -349,6 +353,7 @@ def _rerun_failed_tests(self, need_rerun, runtests: RunTests): runtests = runtests.copy( tests=tuple(tests), rerun=True, + verbose=True, forever=False, fail_fast=False, match_tests_dict=match_tests_dict, @@ -379,7 +384,6 @@ def rerun_failed_tests(self, need_rerun, runtests: RunTests): def display_result(self, runtests): pgo = runtests.pgo - quiet = self.ns.quiet print_slow = self.ns.print_slow # If running the test suite for PGO then no one cares about results. @@ -398,7 +402,7 @@ def display_result(self, runtests): print(count(len(omitted), "test"), "omitted:") printlist(omitted) - if self.good and not quiet: + if self.good and not self.quiet: print() if (not self.bad and not self.skipped @@ -425,12 +429,12 @@ def display_result(self, runtests): count(len(self.environment_changed), "test"))) printlist(self.environment_changed) - if self.skipped and not quiet: + if self.skipped and not self.quiet: print() print(count(len(self.skipped), "test"), "skipped:") printlist(self.skipped) - if self.resource_denied and not quiet: + if self.resource_denied and not self.quiet: print() print(count(len(self.resource_denied), "test"), "skipped (resource denied):") printlist(self.resource_denied) @@ -684,7 +688,7 @@ def display_summary(self): print(f"Result: {result}") def save_xml_result(self): - if not self.ns.xmlpath and not self.testsuite_xml: + if not self.junit_filename and not self.testsuite_xml: return import xml.etree.ElementTree as ET @@ -703,7 +707,7 @@ def save_xml_result(self): for k, v in totals.items(): root.set(k, str(v)) - xmlpath = os.path.join(os_helper.SAVEDCWD, self.ns.xmlpath) + xmlpath = os.path.join(os_helper.SAVEDCWD, self.junit_filename) with open(xmlpath, 'wb') as f: for s in ET.tostringlist(root): f.write(s) @@ -785,7 +789,7 @@ def main(self, tests: TestList | None = None): ns = self.ns self.tests = tests - if ns.xmlpath: + if self.junit_filename: support.junit_xml_list = self.testsuite_xml = [] strip_py_suffix(ns.args) @@ -844,16 +848,14 @@ def get_exitcode(self): return exitcode def action_run_tests(self): - if self.ns.huntrleaks: - warmup, repetitions, _ = self.ns.huntrleaks - if warmup < 3: - msg = ("WARNING: Running tests with --huntrleaks/-R and less than " - "3 warmup repetitions can give false positives!") - print(msg, file=sys.stdout, flush=True) + if self.hunt_refleak and self.hunt_refleak.warmups < 3: + msg = ("WARNING: Running tests with --huntrleaks/-R and " + "less than 3 warmup repetitions can give false positives!") + print(msg, file=sys.stdout, flush=True) # For a partial run, we do not need to clutter the output. if (self.want_header - or not(self.pgo or self.ns.quiet or self.ns.single + or not(self.pgo or self.quiet or self.ns.single or self.tests or self.ns.args)): self.display_header() @@ -869,7 +871,12 @@ def action_run_tests(self): pgo=self.pgo, pgo_extended=self.pgo_extended, output_on_failure=self.output_on_failure, - timeout=self.timeout) + timeout=self.timeout, + verbose=self.verbose, + quiet=self.quiet, + hunt_refleak=self.hunt_refleak, + test_dir=self.test_dir, + junit_filename=self.junit_filename) setup_tests(runtests, self.ns) @@ -892,7 +899,7 @@ def _main(self): if self.want_wait: input("Press any key to continue...") - setup_test_dir(self.ns.testdir) + setup_test_dir(self.test_dir) self.find_tests() exitcode = 0 diff --git a/Lib/test/libregrtest/refleak.py b/Lib/test/libregrtest/refleak.py index 206802b60ddcd0..2e9f17e1c1eee6 100644 --- a/Lib/test/libregrtest/refleak.py +++ b/Lib/test/libregrtest/refleak.py @@ -4,6 +4,7 @@ from inspect import isabstract from test import support from test.support import os_helper +from test.libregrtest.runtest import HuntRefleak from test.libregrtest.utils import clear_caches try: @@ -19,7 +20,9 @@ def _get_dump(cls): cls._abc_negative_cache, cls._abc_negative_cache_version) -def dash_R(ns, test_name, test_func): +def runtest_refleak(test_name, test_func, + hunt_refleak: HuntRefleak, + quiet: bool): """Run a test multiple times, looking for reference leaks. Returns: @@ -62,9 +65,11 @@ def dash_R(ns, test_name, test_func): def get_pooled_int(value): return int_pool.setdefault(value, value) - nwarmup, ntracked, fname = ns.huntrleaks - fname = os.path.join(os_helper.SAVEDCWD, fname) - repcount = nwarmup + ntracked + warmups = hunt_refleak.warmups + runs = hunt_refleak.runs + filename = hunt_refleak.filename + filename = os.path.join(os_helper.SAVEDCWD, filename) + repcount = warmups + runs # Pre-allocate to ensure that the loop doesn't allocate anything new rep_range = list(range(repcount)) @@ -78,7 +83,7 @@ def get_pooled_int(value): # initialize variables to make pyflakes quiet rc_before = alloc_before = fd_before = interned_before = 0 - if not ns.quiet: + if not quiet: print("beginning", repcount, "repetitions", file=sys.stderr) print(("1234567890"*(repcount//10 + 1))[:repcount], file=sys.stderr, flush=True) @@ -102,7 +107,7 @@ def get_pooled_int(value): rc_after = gettotalrefcount() - interned_after * 2 fd_after = fd_count() - if not ns.quiet: + if not quiet: print('.', end='', file=sys.stderr, flush=True) rc_deltas[i] = get_pooled_int(rc_after - rc_before) @@ -114,7 +119,7 @@ def get_pooled_int(value): fd_before = fd_after interned_before = interned_after - if not ns.quiet: + if not quiet: print(file=sys.stderr) # These checkers return False on success, True on failure @@ -143,12 +148,12 @@ def check_fd_deltas(deltas): (fd_deltas, 'file descriptors', check_fd_deltas) ]: # ignore warmup runs - deltas = deltas[nwarmup:] + deltas = deltas[warmups:] if checker(deltas): msg = '%s leaked %s %s, sum=%s' % ( test_name, deltas, item_name, sum(deltas)) print(msg, file=sys.stderr, flush=True) - with open(fname, "a", encoding="utf-8") as refrep: + with open(filename, "a", encoding="utf-8") as refrep: print(msg, file=refrep) refrep.flush() failed = True diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index bfb0718aa56c32..4f12176ced5c87 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -28,6 +28,13 @@ FilterDict = dict[str, FilterTuple] +@dataclasses.dataclass(slots=True, frozen=True) +class HuntRefleak: + warmups: int + runs: int + filename: str + + # Avoid enum.Enum to reduce the number of imports when tests are run class State: PASSED = "PASSED" @@ -218,6 +225,11 @@ class RunTests: pgo_extended: bool = False output_on_failure: bool = False timeout: float | None = None + verbose: bool = False + quiet: bool = False + hunt_refleak: HuntRefleak | None = None + test_dir: str | None = None + junit_filename: str | None = None def copy(self, **override): state = dataclasses.asdict(self) @@ -260,7 +272,7 @@ def findtestdir(path=None): return path or os.path.dirname(os.path.dirname(__file__)) or os.curdir -def findtests(*, testdir=None, exclude=(), +def findtests(*, testdir: str | None =None, exclude=(), split_test_dirs=SPLITTESTDIRS, base_mod=""): """Return a list of all applicable test modules.""" testdir = findtestdir(testdir) @@ -279,7 +291,7 @@ def findtests(*, testdir=None, exclude=(), return sorted(tests) -def split_test_packages(tests, *, testdir=None, exclude=(), +def split_test_packages(tests, *, testdir: str | None = None, exclude=(), split_test_dirs=SPLITTESTDIRS): testdir = findtestdir(testdir) splitted = [] @@ -307,8 +319,8 @@ def setup_support(runtests: RunTests, ns: Namespace): support.PGO_EXTENDED = runtests.pgo_extended support.set_match_tests(runtests.match_tests, runtests.ignore_tests) support.failfast = runtests.fail_fast - support.verbose = ns.verbose - if ns.xmlpath: + support.verbose = runtests.verbose + if runtests.junit_filename: support.junit_xml_list = [] else: support.junit_xml_list = None @@ -317,7 +329,7 @@ def setup_support(runtests: RunTests, ns: Namespace): def _runtest(result: TestResult, runtests: RunTests, ns: Namespace) -> None: # Capture stdout and stderr, set faulthandler timeout, # and create JUnit XML report. - verbose = ns.verbose + verbose = runtests.verbose output_on_failure = runtests.output_on_failure timeout = runtests.timeout @@ -363,7 +375,8 @@ def _runtest(result: TestResult, runtests: RunTests, ns: Namespace) -> None: else: # Tell tests to be moderately quiet support.verbose = verbose - _runtest_env_changed_exc(result, runtests, ns, display_failure=not verbose) + _runtest_env_changed_exc(result, runtests, ns, + display_failure=not verbose) xml_list = support.junit_xml_list if xml_list: @@ -384,7 +397,7 @@ def run_single_test(test_name: str, runtests: RunTests, ns: Namespace) -> TestRe Returns a TestResult. - If ns.xmlpath is not None, xml_data is a list containing each + If runtests.junit_filename is not None, xml_data is a list containing each generated testsuite element. """ start_time = time.perf_counter() @@ -412,16 +425,19 @@ def run_unittest(test_mod): return support.run_unittest(tests) -def save_env(test_name: str, runtests: RunTests, ns: Namespace): - return saved_test_environment(test_name, ns.verbose, ns.quiet, pgo=runtests.pgo) +def save_env(test_name: str, runtests: RunTests): + return saved_test_environment(test_name, runtests.verbose, runtests.quiet, + pgo=runtests.pgo) -def regrtest_runner(result, test_func, ns) -> None: +def regrtest_runner(result: TestResult, test_func, runtests: RunTests) -> None: # Run test_func(), collect statistics, and detect reference and memory # leaks. - if ns.huntrleaks: - from test.libregrtest.refleak import dash_R - refleak, test_result = dash_R(ns, result.test_name, test_func) + if runtests.hunt_refleak: + from test.libregrtest.refleak import runtest_refleak + refleak, test_result = runtest_refleak(result.test_name, test_func, + runtests.hunt_refleak, + runtests.quiet) else: test_result = test_func() refleak = False @@ -452,7 +468,7 @@ def regrtest_runner(result, test_func, ns) -> None: def _load_run_test(result: TestResult, runtests: RunTests, ns: Namespace) -> None: # Load the test function, run the test function. - module_name = abs_module_name(result.test_name, ns.testdir) + module_name = abs_module_name(result.test_name, runtests.test_dir) # Remove the module from sys.module to reload it if it was already imported sys.modules.pop(module_name, None) @@ -466,8 +482,8 @@ def test_func(): return run_unittest(test_mod) try: - with save_env(result.test_name, runtests, ns): - regrtest_runner(result, test_func, ns) + with save_env(result.test_name, runtests): + regrtest_runner(result, test_func, runtests) finally: # First kill any dangling references to open files etc. # This can also issue some ResourceWarnings which would otherwise get @@ -475,7 +491,7 @@ def test_func(): # failures. support.gc_collect() - remove_testfn(result.test_name, ns.verbose) + remove_testfn(result.test_name, runtests.verbose) if gc.garbage: support.environment_altered = True @@ -502,21 +518,22 @@ def _runtest_env_changed_exc(result: TestResult, runtests: RunTests, pgo = runtests.pgo if pgo: display_failure = False + quiet = runtests.quiet test_name = result.test_name try: clear_caches() support.gc_collect() - with save_env(test_name, runtests, ns): + with save_env(test_name, runtests): _load_run_test(result, runtests, ns) except support.ResourceDenied as msg: - if not ns.quiet and not pgo: + if not quiet and not pgo: print(f"{test_name} skipped -- {msg}", flush=True) result.state = State.RESOURCE_DENIED return except unittest.SkipTest as msg: - if not ns.quiet and not pgo: + if not quiet and not pgo: print(f"{test_name} skipped -- {msg}", flush=True) result.state = State.SKIPPED return diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index ecdde3aa523098..4bff7f99964119 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -127,7 +127,7 @@ def worker_process(worker_json: str) -> NoReturn: test_name = runtests.tests[0] match_tests: FilterTuple | None = runtests.match_tests - setup_test_dir(ns.testdir) + setup_test_dir(runtests.test_dir) setup_tests(runtests, ns) if runtests.rerun: @@ -136,7 +136,6 @@ def worker_process(worker_json: str) -> NoReturn: print(f"Re-running {test_name} in verbose mode ({matching})", flush=True) else: print(f"Re-running {test_name} in verbose mode", flush=True) - ns.verbose = True result = run_single_test(test_name, runtests, ns) print() # Force a newline (just in case) diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index f640362cb2df7f..59bbf2c81a167a 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -18,7 +18,7 @@ UNICODE_GUARD_ENV = "PYTHONREGRTEST_UNICODE_GUARD" -def setup_test_dir(testdir): +def setup_test_dir(testdir: str | None) -> None: if testdir: # Prepend test directory to sys.path, so runtest() will be able # to locate tests @@ -68,7 +68,7 @@ def setup_tests(runtests, ns): if getattr(module, '__file__', None): module.__file__ = os.path.abspath(module.__file__) - if ns.huntrleaks: + if runtests.hunt_refleak: unittest.BaseTestSuite._cleanup = False if ns.memlimit is not None: @@ -77,7 +77,7 @@ def setup_tests(runtests, ns): if ns.threshold is not None: gc.set_threshold(ns.threshold) - support.suppress_msvcrt_asserts(ns.verbose and ns.verbose >= 2) + support.suppress_msvcrt_asserts(runtests.verbose and runtests.verbose >= 2) support.use_resources = ns.use_resources @@ -102,7 +102,7 @@ def _test_audit_hook(name, args): support.SHORT_TIMEOUT = min(support.SHORT_TIMEOUT, timeout) support.LONG_TIMEOUT = min(support.LONG_TIMEOUT, timeout) - if ns.xmlpath: + if runtests.junit_filename: from test.support.testresult import RegressionTestResult RegressionTestResult.USE_XML = True From 75cd86599bad05cb372aed9fccc3ff884cd38b70 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 9 Sep 2023 10:21:42 -0500 Subject: [PATCH 124/357] Fix an ironic typo in a code comment. (gh-109186) --- Lib/random.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/random.py b/Lib/random.py index 586c3f7f9da938..84bbfc5df1bf23 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -827,7 +827,7 @@ def binomialvariate(self, n=1, p=0.5): return k # Acceptance-rejection test. - # Note, the original paper errorneously omits the call to log(v) + # Note, the original paper erroneously omits the call to log(v) # when comparing to the log of the rescaled binomial distribution. if not setup_complete: alpha = (2.83 + 5.1 / b) * spq From d3ed9921cdd8ac291fbfe3adf42f7730d3a14dbc Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 9 Sep 2023 17:50:04 -0500 Subject: [PATCH 125/357] Improve the sieve() recipe in the itertools docs (gh-109199) Lazier sieve --- Doc/library/itertools.rst | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 42243715c2d93b..3cfc2602fe0694 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -1030,13 +1030,16 @@ The following recipes have a more mathematical flavor: def sieve(n): "Primes less than n." # sieve(30) --> 2 3 5 7 11 13 17 19 23 29 + if n > 2: + yield 2 + start = 3 data = bytearray((0, 1)) * (n // 2) - data[:3] = 0, 0, 0 limit = math.isqrt(n) + 1 - for p in compress(range(limit), data): + for p in iter_index(data, 1, start, limit): + yield from iter_index(data, 1, start, p*p) data[p*p : n : p+p] = bytes(len(range(p*p, n, p+p))) - data[2] = 1 - return iter_index(data, 1) if n > 2 else iter([]) + start = p*p + yield from iter_index(data, 1, start) def factor(n): "Prime factors of n." From 24fa8f2046965b46c70a750a5a004708a63ac770 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 10 Sep 2023 00:51:24 +0200 Subject: [PATCH 126/357] gh-109162: libregrtest: fix _decode_worker_job() (#109202) Decode also HuntRefleak() object inside the RunTests object. Add an unit test on huntrleaks with multiprocessing (-R -jN). --- Lib/test/libregrtest/runtest.py | 6 ++++++ Lib/test/libregrtest/runtest_mp.py | 2 +- Lib/test/test_regrtest.py | 18 ++++++++++++++---- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index 4f12176ced5c87..ab59d8123013da 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -249,6 +249,12 @@ def iter_tests(self): else: yield from self.tests + @staticmethod + def from_json_dict(json_dict): + if json_dict['hunt_refleak']: + json_dict['hunt_refleak'] = HuntRefleak(**json_dict['hunt_refleak']) + return RunTests(**json_dict) + # Minimum duration of a test to display its duration or to mention that # the test is running in background diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index 4bff7f99964119..4e3148fa8e2e67 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -68,7 +68,7 @@ def default(self, o: Any) -> dict[str, Any]: def _decode_worker_job(d: dict[str, Any]) -> WorkerJob | dict[str, Any]: if "__worker_job__" in d: d.pop('__worker_job__') - d['runtests'] = RunTests(**d['runtests']) + d['runtests'] = RunTests.from_json_dict(d['runtests']) return WorkerJob(**d) if "__namespace__" in d: d.pop('__namespace__') diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 8cced1f5185c2f..23896fdedaccac 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -1018,12 +1018,16 @@ def test_run(self): stats=TestStats(4, 1), forever=True) - def check_leak(self, code, what): + def check_leak(self, code, what, *, multiprocessing=False): test = self.create_test('huntrleaks', code=code) filename = 'reflog.txt' self.addCleanup(os_helper.unlink, filename) - output = self.run_tests('--huntrleaks', '6:3:', test, + cmd = ['--huntrleaks', '6:3:'] + if multiprocessing: + cmd.append('-j1') + cmd.append(test) + output = self.run_tests(*cmd, exitcode=EXITCODE_BAD_TEST, stderr=subprocess.STDOUT) self.check_executed_tests(output, [test], failed=test, stats=1) @@ -1039,7 +1043,7 @@ def check_leak(self, code, what): self.assertIn(line2, reflog) @unittest.skipUnless(support.Py_DEBUG, 'need a debug build') - def test_huntrleaks(self): + def check_huntrleaks(self, *, multiprocessing: bool): # test --huntrleaks code = textwrap.dedent(""" import unittest @@ -1050,7 +1054,13 @@ class RefLeakTest(unittest.TestCase): def test_leak(self): GLOBAL_LIST.append(object()) """) - self.check_leak(code, 'references') + self.check_leak(code, 'references', multiprocessing=multiprocessing) + + def test_huntrleaks(self): + self.check_huntrleaks(multiprocessing=False) + + def test_huntrleaks_mp(self): + self.check_huntrleaks(multiprocessing=True) @unittest.skipUnless(support.Py_DEBUG, 'need a debug build') def test_huntrleaks_fd_leak(self): From 0c0f254230bbc9532a7e78077a639a3ac940953c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 10 Sep 2023 01:41:21 +0200 Subject: [PATCH 127/357] gh-109162: libregrtest: remove WorkerJob class (#109204) * Add attributes to Regrtest and RunTests: * gc_threshold * memory_limit * python_cmd * use_resources * Remove WorkerJob class. Add as_json() and from_json() methods to RunTests. A worker process now only uses RunTests for all parameters. * Add tests on support.set_memlimit() in test_support. Create _parse_memlimit() and also adds tests on it. * Remove 'ns' parameter from runtest.py. --- Lib/test/libregrtest/cmdline.py | 2 ++ Lib/test/libregrtest/main.py | 21 +++++++---- Lib/test/libregrtest/runtest.py | 56 ++++++++++++++++++++--------- Lib/test/libregrtest/runtest_mp.py | 58 ++++++------------------------ Lib/test/libregrtest/setup.py | 12 +++---- Lib/test/support/__init__.py | 24 +++++++------ Lib/test/test_support.py | 41 +++++++++++++++++++-- 7 files changed, 126 insertions(+), 88 deletions(-) diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index 71e7396d71d4a5..9afb13224975ee 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -177,6 +177,8 @@ def __init__(self, **kwargs) -> None: self.worker_json = None self.start = None self.timeout = None + self.memlimit = None + self.threshold = None super().__init__(**kwargs) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index bb02101d97a2d2..4066d06c98600e 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -100,6 +100,10 @@ def __init__(self, ns: Namespace): self.hunt_refleak = None self.test_dir: str | None = ns.testdir self.junit_filename: str | None = ns.xmlpath + self.memory_limit: str | None = ns.memlimit + self.gc_threshold: int | None = ns.threshold + self.use_resources: list[str] = ns.use_resources + self.python_cmd: list[str] | None = ns.python # tests self.tests = [] @@ -363,7 +367,7 @@ def _rerun_failed_tests(self, need_rerun, runtests: RunTests): return runtests def rerun_failed_tests(self, need_rerun, runtests: RunTests): - if self.ns.python: + if self.python_cmd: # Temp patch for https://github.com/python/cpython/issues/94052 self.log( "Re-running failed tests is not supported with --python " @@ -453,12 +457,12 @@ def run_test(self, test_name: str, runtests: RunTests, tracer): if tracer is not None: # If we're tracing code coverage, then we don't exit with status # if on a false return value from main. - cmd = ('result = run_single_test(test_name, runtests, self.ns)') + cmd = ('result = run_single_test(test_name, runtests)') ns = dict(locals()) tracer.runctx(cmd, globals=globals(), locals=ns) result = ns['result'] else: - result = run_single_test(test_name, runtests, self.ns) + result = run_single_test(test_name, runtests) self.accumulate_result(result) @@ -876,9 +880,14 @@ def action_run_tests(self): quiet=self.quiet, hunt_refleak=self.hunt_refleak, test_dir=self.test_dir, - junit_filename=self.junit_filename) - - setup_tests(runtests, self.ns) + junit_filename=self.junit_filename, + memory_limit=self.memory_limit, + gc_threshold=self.gc_threshold, + use_resources=self.use_resources, + python_cmd=self.python_cmd, + ) + + setup_tests(runtests) tracer = self.run_tests(runtests) self.display_result(runtests) diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index ab59d8123013da..dc574eda8b99f5 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -4,17 +4,18 @@ import gc import importlib import io +import json import os import sys import time import traceback import unittest +from typing import Any from test import support from test.support import TestStats from test.support import os_helper from test.support import threading_helper -from test.libregrtest.cmdline import Namespace from test.libregrtest.save_env import saved_test_environment from test.libregrtest.utils import clear_caches, format_duration, print_warning @@ -230,6 +231,10 @@ class RunTests: hunt_refleak: HuntRefleak | None = None test_dir: str | None = None junit_filename: str | None = None + memory_limit: str | None = None + gc_threshold: int | None = None + use_resources: list[str] = None + python_cmd: list[str] | None = None def copy(self, **override): state = dataclasses.asdict(self) @@ -249,11 +254,32 @@ def iter_tests(self): else: yield from self.tests + def as_json(self): + return json.dumps(self, cls=_EncodeRunTests) + @staticmethod - def from_json_dict(json_dict): - if json_dict['hunt_refleak']: - json_dict['hunt_refleak'] = HuntRefleak(**json_dict['hunt_refleak']) - return RunTests(**json_dict) + def from_json(worker_json): + return json.loads(worker_json, object_hook=_decode_runtests) + + +class _EncodeRunTests(json.JSONEncoder): + def default(self, o: Any) -> dict[str, Any]: + if isinstance(o, RunTests): + result = dataclasses.asdict(o) + result["__runtests__"] = True + return result + else: + return super().default(o) + + +def _decode_runtests(data: dict[str, Any]) -> RunTests | dict[str, Any]: + if "__runtests__" in data: + data.pop('__runtests__') + if data['hunt_refleak']: + data['hunt_refleak'] = HuntRefleak(**data['hunt_refleak']) + return RunTests(**data) + else: + return data # Minimum duration of a test to display its duration or to mention that @@ -320,7 +346,7 @@ def abs_module_name(test_name: str, test_dir: str | None) -> str: return 'test.' + test_name -def setup_support(runtests: RunTests, ns: Namespace): +def setup_support(runtests: RunTests): support.PGO = runtests.pgo support.PGO_EXTENDED = runtests.pgo_extended support.set_match_tests(runtests.match_tests, runtests.ignore_tests) @@ -332,7 +358,7 @@ def setup_support(runtests: RunTests, ns: Namespace): support.junit_xml_list = None -def _runtest(result: TestResult, runtests: RunTests, ns: Namespace) -> None: +def _runtest(result: TestResult, runtests: RunTests) -> None: # Capture stdout and stderr, set faulthandler timeout, # and create JUnit XML report. verbose = runtests.verbose @@ -346,7 +372,7 @@ def _runtest(result: TestResult, runtests: RunTests, ns: Namespace) -> None: faulthandler.dump_traceback_later(timeout, exit=True) try: - setup_support(runtests, ns) + setup_support(runtests) if output_on_failure: support.verbose = True @@ -366,7 +392,7 @@ def _runtest(result: TestResult, runtests: RunTests, ns: Namespace) -> None: # warnings will be written to sys.stderr below. print_warning.orig_stderr = stream - _runtest_env_changed_exc(result, runtests, ns, display_failure=False) + _runtest_env_changed_exc(result, runtests, display_failure=False) # Ignore output if the test passed successfully if result.state != State.PASSED: output = stream.getvalue() @@ -381,7 +407,7 @@ def _runtest(result: TestResult, runtests: RunTests, ns: Namespace) -> None: else: # Tell tests to be moderately quiet support.verbose = verbose - _runtest_env_changed_exc(result, runtests, ns, + _runtest_env_changed_exc(result, runtests, display_failure=not verbose) xml_list = support.junit_xml_list @@ -395,10 +421,9 @@ def _runtest(result: TestResult, runtests: RunTests, ns: Namespace) -> None: support.junit_xml_list = None -def run_single_test(test_name: str, runtests: RunTests, ns: Namespace) -> TestResult: +def run_single_test(test_name: str, runtests: RunTests) -> TestResult: """Run a single test. - ns -- regrtest namespace of options test_name -- the name of the test Returns a TestResult. @@ -410,7 +435,7 @@ def run_single_test(test_name: str, runtests: RunTests, ns: Namespace) -> TestRe result = TestResult(test_name) pgo = runtests.pgo try: - _runtest(result, runtests, ns) + _runtest(result, runtests) except: if not pgo: msg = traceback.format_exc() @@ -472,7 +497,7 @@ def regrtest_runner(result: TestResult, test_func, runtests: RunTests) -> None: FOUND_GARBAGE = [] -def _load_run_test(result: TestResult, runtests: RunTests, ns: Namespace) -> None: +def _load_run_test(result: TestResult, runtests: RunTests) -> None: # Load the test function, run the test function. module_name = abs_module_name(result.test_name, runtests.test_dir) @@ -513,7 +538,6 @@ def test_func(): def _runtest_env_changed_exc(result: TestResult, runtests: RunTests, - ns: Namespace, display_failure: bool = True) -> None: # Detect environment changes, handle exceptions. @@ -532,7 +556,7 @@ def _runtest_env_changed_exc(result: TestResult, runtests: RunTests, support.gc_collect() with save_env(test_name, runtests): - _load_run_test(result, runtests, ns) + _load_run_test(result, runtests) except support.ResourceDenied as msg: if not quiet and not pgo: print(f"{test_name} skipped -- {msg}", flush=True) diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index 4e3148fa8e2e67..e4a9301656436b 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -47,49 +47,16 @@ @dataclasses.dataclass(slots=True) class WorkerJob: runtests: RunTests - namespace: Namespace -class _EncodeWorkerJob(json.JSONEncoder): - def default(self, o: Any) -> dict[str, Any]: - match o: - case WorkerJob(): - result = dataclasses.asdict(o) - result["__worker_job__"] = True - return result - case Namespace(): - result = vars(o) - result["__namespace__"] = True - return result - case _: - return super().default(o) - - -def _decode_worker_job(d: dict[str, Any]) -> WorkerJob | dict[str, Any]: - if "__worker_job__" in d: - d.pop('__worker_job__') - d['runtests'] = RunTests.from_json_dict(d['runtests']) - return WorkerJob(**d) - if "__namespace__" in d: - d.pop('__namespace__') - return Namespace(**d) - else: - return d - - -def _parse_worker_json(worker_json: str) -> tuple[Namespace, str]: - return json.loads(worker_json, object_hook=_decode_worker_job) - - -def create_worker_process(worker_job: WorkerJob, +def create_worker_process(runtests: RunTests, output_file: TextIO, tmp_dir: str | None = None) -> subprocess.Popen: - ns = worker_job.namespace - python = ns.python - worker_json = json.dumps(worker_job, cls=_EncodeWorkerJob) + python_cmd = runtests.python_cmd + worker_json = runtests.as_json() - if python is not None: - executable = python + if python_cmd is not None: + executable = python_cmd else: executable = [sys.executable] cmd = [*executable, *support.args_from_interpreter_flags(), @@ -121,14 +88,12 @@ def create_worker_process(worker_job: WorkerJob, def worker_process(worker_json: str) -> NoReturn: - worker_job = _parse_worker_json(worker_json) - runtests = worker_job.runtests - ns = worker_job.namespace + runtests = RunTests.from_json(worker_json) test_name = runtests.tests[0] match_tests: FilterTuple | None = runtests.match_tests setup_test_dir(runtests.test_dir) - setup_tests(runtests, ns) + setup_tests(runtests) if runtests.rerun: if match_tests: @@ -137,7 +102,7 @@ def worker_process(worker_json: str) -> NoReturn: else: print(f"Re-running {test_name} in verbose mode", flush=True) - result = run_single_test(test_name, runtests, ns) + result = run_single_test(test_name, runtests) print() # Force a newline (just in case) # Serialize TestResult as dict in JSON @@ -330,9 +295,6 @@ def _runtest(self, test_name: str) -> MultiprocessResult: if match_tests: kwargs['match_tests'] = match_tests worker_runtests = self.runtests.copy(tests=tests, **kwargs) - worker_job = WorkerJob( - worker_runtests, - namespace=self.ns) # gh-94026: Write stdout+stderr to a tempfile as workaround for # non-blocking pipes on Emscripten with NodeJS. @@ -347,12 +309,12 @@ def _runtest(self, test_name: str) -> MultiprocessResult: tmp_dir = tempfile.mkdtemp(prefix="test_python_") tmp_dir = os.path.abspath(tmp_dir) try: - retcode = self._run_process(worker_job, stdout_file, tmp_dir) + retcode = self._run_process(worker_runtests, stdout_file, tmp_dir) finally: tmp_files = os.listdir(tmp_dir) os_helper.rmtree(tmp_dir) else: - retcode = self._run_process(worker_job, stdout_file) + retcode = self._run_process(worker_runtests, stdout_file) tmp_files = () stdout_file.seek(0) diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index 59bbf2c81a167a..594498333fe792 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -25,7 +25,7 @@ def setup_test_dir(testdir: str | None) -> None: sys.path.insert(0, os.path.abspath(testdir)) -def setup_tests(runtests, ns): +def setup_tests(runtests): try: stderr_fd = sys.__stderr__.fileno() except (ValueError, AttributeError): @@ -71,15 +71,15 @@ def setup_tests(runtests, ns): if runtests.hunt_refleak: unittest.BaseTestSuite._cleanup = False - if ns.memlimit is not None: - support.set_memlimit(ns.memlimit) + if runtests.memory_limit is not None: + support.set_memlimit(runtests.memory_limit) - if ns.threshold is not None: - gc.set_threshold(ns.threshold) + if runtests.gc_threshold is not None: + gc.set_threshold(runtests.gc_threshold) support.suppress_msvcrt_asserts(runtests.verbose and runtests.verbose >= 2) - support.use_resources = ns.use_resources + support.use_resources = runtests.use_resources if hasattr(sys, 'addaudithook'): # Add an auditing hook for all tests to ensure PySys_Audit is tested diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index f40b73b0a799f1..6fc85ff5d704e1 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -878,27 +878,31 @@ def inner(*args, **kwds): MAX_Py_ssize_t = sys.maxsize -def set_memlimit(limit): - global max_memuse - global real_max_memuse +def _parse_memlimit(limit: str) -> int: sizes = { 'k': 1024, 'm': _1M, 'g': _1G, 't': 1024*_1G, } - m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit, + m = re.match(r'(\d+(?:\.\d+)?) (K|M|G|T)b?$', limit, re.IGNORECASE | re.VERBOSE) if m is None: - raise ValueError('Invalid memory limit %r' % (limit,)) - memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()]) - real_max_memuse = memlimit - if memlimit > MAX_Py_ssize_t: - memlimit = MAX_Py_ssize_t + raise ValueError(f'Invalid memory limit: {limit!r}') + return int(float(m.group(1)) * sizes[m.group(2).lower()]) + +def set_memlimit(limit: str) -> None: + global max_memuse + global real_max_memuse + memlimit = _parse_memlimit(limit) if memlimit < _2G - 1: - raise ValueError('Memory limit %r too low to be useful' % (limit,)) + raise ValueError('Memory limit {limit!r} too low to be useful') + + real_max_memuse = memlimit + memlimit = min(memlimit, MAX_Py_ssize_t) max_memuse = memlimit + class _MemoryWatchdog: """An object which periodically watches the process' memory consumption and prints it out. diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index 64280739f00946..5b57c5fd54a68d 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -760,7 +760,45 @@ def recursive_function(depth): else: self.fail("RecursionError was not raised") - #self.assertEqual(available, 2) + def test_parse_memlimit(self): + parse = support._parse_memlimit + KiB = 1024 + MiB = KiB * 1024 + GiB = MiB * 1024 + TiB = GiB * 1024 + self.assertEqual(parse('0k'), 0) + self.assertEqual(parse('3k'), 3 * KiB) + self.assertEqual(parse('2.4m'), int(2.4 * MiB)) + self.assertEqual(parse('4g'), int(4 * GiB)) + self.assertEqual(parse('1t'), TiB) + + for limit in ('', '3', '3.5.10k', '10x'): + with self.subTest(limit=limit): + with self.assertRaises(ValueError): + parse(limit) + + def test_set_memlimit(self): + _4GiB = 4 * 1024 ** 3 + TiB = 1024 ** 4 + old_max_memuse = support.max_memuse + old_real_max_memuse = support.real_max_memuse + try: + if sys.maxsize > 2**32: + support.set_memlimit('4g') + self.assertEqual(support.max_memuse, _4GiB) + self.assertEqual(support.real_max_memuse, _4GiB) + + big = 2**100 // TiB + support.set_memlimit(f'{big}t') + self.assertEqual(support.max_memuse, sys.maxsize) + self.assertEqual(support.real_max_memuse, big * TiB) + else: + support.set_memlimit('4g') + self.assertEqual(support.max_memuse, sys.maxsize) + self.assertEqual(support.real_max_memuse, _4GiB) + finally: + support.max_memuse = old_max_memuse + support.real_max_memuse = old_real_max_memuse # XXX -follows a list of untested API # make_legacy_pyc @@ -773,7 +811,6 @@ def recursive_function(depth): # EnvironmentVarGuard # transient_internet # run_with_locale - # set_memlimit # bigmemtest # precisionbigmemtest # bigaddrspacetest From 0553fdfe3040073307e8c53273041130148541d5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 10 Sep 2023 02:24:38 +0200 Subject: [PATCH 128/357] gh-109162: Refactor libregrtest.runtest_mp (#109205) * Add attributes to Regrtest and RunTests: * fail_env_changed * num_workers * Rename MultiprocessTestRunner to RunWorkers. Add num_workers parameters to RunWorkers constructor. Remove RunWorkers.ns attribute. * Rename TestWorkerProcess to WorkerThread. * get_running() now returns a string like: "running (...): ...". * Regrtest.action_run_tests() now selects the number of worker processes, instead of the command line parser. --- Lib/test/libregrtest/cmdline.py | 6 +-- Lib/test/libregrtest/main.py | 44 +++++++++++++-------- Lib/test/libregrtest/runtest.py | 1 + Lib/test/libregrtest/runtest_mp.py | 62 ++++++++++++++---------------- 4 files changed, 57 insertions(+), 56 deletions(-) diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index 9afb13224975ee..2835546fc713cf 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -1,5 +1,5 @@ import argparse -import os +import os.path import shlex import sys from test.support import os_helper @@ -410,10 +410,6 @@ def _parse_args(args, **kwargs): if ns.timeout is not None: if ns.timeout <= 0: ns.timeout = None - if ns.use_mp is not None: - if ns.use_mp <= 0: - # Use all cores + extras for tests that like to sleep - ns.use_mp = 2 + (os.cpu_count() or 1) if ns.use: for a in ns.use: for r in a: diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 4066d06c98600e..1fa7b07a09d701 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -83,8 +83,18 @@ def __init__(self, ns: Namespace): self.fromfile: str | None = ns.fromfile self.starting_test: str | None = ns.start + # Run tests + if ns.use_mp is None: + num_workers = 0 # run sequentially + elif ns.use_mp <= 0: + num_workers = -1 # use the number of CPUs + else: + num_workers = ns.use_mp + self.num_workers: int = num_workers + # Options to run tests self.fail_fast: bool = ns.failfast + self.fail_env_changed: bool = ns.fail_env_changed self.forever: bool = ns.forever self.randomize: bool = ns.randomize self.random_seed: int | None = ns.random_seed @@ -150,7 +160,6 @@ def get_executed(self): | set(self.run_no_tests)) def accumulate_result(self, result, rerun=False): - fail_env_changed = self.ns.fail_env_changed test_name = result.test_name match result.state: @@ -167,7 +176,7 @@ def accumulate_result(self, result, rerun=False): case State.DID_NOT_RUN: self.run_no_tests.append(test_name) case _: - if result.is_failed(fail_env_changed): + if result.is_failed(self.fail_env_changed): self.bad.append(test_name) self.need_rerun.append(result) else: @@ -339,9 +348,8 @@ def get_rerun_match(self, rerun_list) -> FilterDict: def _rerun_failed_tests(self, need_rerun, runtests: RunTests): # Configure the runner to re-run tests - ns = self.ns - if ns.use_mp is None: - ns.use_mp = 1 + if self.num_workers == 0: + self.num_workers = 1 # Get tests to re-run tests = [result.test_name for result in need_rerun] @@ -363,7 +371,7 @@ def _rerun_failed_tests(self, need_rerun, runtests: RunTests): match_tests_dict=match_tests_dict, output_on_failure=False) self.set_tests(runtests) - self._run_tests_mp(runtests) + self._run_tests_mp(runtests, self.num_workers) return runtests def rerun_failed_tests(self, need_rerun, runtests: RunTests): @@ -471,7 +479,6 @@ def run_test(self, test_name: str, runtests: RunTests, tracer): def run_tests_sequentially(self, runtests): ns = self.ns coverage = ns.trace - fail_env_changed = ns.fail_env_changed if coverage: import trace @@ -503,7 +510,7 @@ def run_tests_sequentially(self, runtests): if module not in save_modules and module.startswith("test."): support.unload(module) - if result.must_stop(self.fail_fast, fail_env_changed): + if result.must_stop(self.fail_fast, self.fail_env_changed): break previous_test = str(result) @@ -564,12 +571,10 @@ def no_tests_run(self): self.environment_changed)) def get_tests_state(self): - fail_env_changed = self.ns.fail_env_changed - result = [] if self.bad: result.append("FAILURE") - elif fail_env_changed and self.environment_changed: + elif self.fail_env_changed and self.environment_changed: result.append("ENV CHANGED") elif self.no_tests_run(): result.append("NO TESTS RAN") @@ -585,8 +590,9 @@ def get_tests_state(self): result = '%s then %s' % (self.first_state, result) return result - def _run_tests_mp(self, runtests: RunTests) -> None: - from test.libregrtest.runtest_mp import run_tests_multiprocess + def _run_tests_mp(self, runtests: RunTests, num_workers: int) -> None: + from test.libregrtest.runtest_mp import RunWorkers + # If we're on windows and this is the parent runner (not a worker), # track the load average. if sys.platform == 'win32': @@ -600,7 +606,7 @@ def _run_tests_mp(self, runtests: RunTests) -> None: print(f'Failed to create WindowsLoadTracker: {error}') try: - run_tests_multiprocess(self, runtests) + RunWorkers(self, runtests, num_workers).run() finally: if self.win_load_tracker is not None: self.win_load_tracker.close() @@ -618,8 +624,8 @@ def set_tests(self, runtests: RunTests): def run_tests(self, runtests: RunTests): self.first_runtests = runtests self.set_tests(runtests) - if self.ns.use_mp: - self._run_tests_mp(runtests) + if self.num_workers: + self._run_tests_mp(runtests, self.num_workers) tracer = None else: tracer = self.run_tests_sequentially(runtests) @@ -843,7 +849,7 @@ def get_exitcode(self): exitcode = EXITCODE_BAD_TEST elif self.interrupted: exitcode = EXITCODE_INTERRUPTED - elif self.ns.fail_env_changed and self.environment_changed: + elif self.fail_env_changed and self.environment_changed: exitcode = EXITCODE_ENV_CHANGED elif self.no_tests_run(): exitcode = EXITCODE_NO_TESTS_RAN @@ -866,6 +872,10 @@ def action_run_tests(self): if self.randomize: print("Using random seed", self.random_seed) + if self.num_workers < 0: + # Use all cores + extras for tests that like to sleep + self.num_workers = 2 + (os.cpu_count() or 1) + runtests = RunTests( tuple(self.selected), fail_fast=self.fail_fast, diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index dc574eda8b99f5..667701778d9a79 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -217,6 +217,7 @@ def get_rerun_match_tests(self) -> FilterTuple | None: class RunTests: tests: TestTuple fail_fast: bool = False + fail_env_changed: bool = False match_tests: FilterTuple | None = None ignore_tests: FilterTuple | None = None match_tests_dict: FilterDict | None = None diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index e4a9301656436b..28c05b5976e159 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -16,7 +16,6 @@ from test.support import os_helper from test.support import TestStats -from test.libregrtest.cmdline import Namespace from test.libregrtest.main import Regrtest from test.libregrtest.runtest import ( run_single_test, TestResult, State, PROGRESS_MIN_TIME, @@ -150,14 +149,13 @@ class ExitThread(Exception): pass -class TestWorkerProcess(threading.Thread): - def __init__(self, worker_id: int, runner: "MultiprocessTestRunner") -> None: +class WorkerThread(threading.Thread): + def __init__(self, worker_id: int, runner: "RunWorkers") -> None: super().__init__() self.worker_id = worker_id self.runtests = runner.runtests self.pending = runner.pending self.output = runner.output - self.ns = runner.ns self.timeout = runner.worker_timeout self.regrtest = runner.regrtest self.current_test_name = None @@ -167,7 +165,7 @@ def __init__(self, worker_id: int, runner: "MultiprocessTestRunner") -> None: self._stopped = False def __repr__(self) -> str: - info = [f'TestWorkerProcess #{self.worker_id}'] + info = [f'WorkerThread #{self.worker_id}'] if self.is_alive(): info.append("running") else: @@ -203,7 +201,7 @@ def _kill(self) -> None: else: popen.kill() except ProcessLookupError: - # popen.kill(): the process completed, the TestWorkerProcess thread + # popen.kill(): the process completed, the WorkerThread thread # read its exit status, but Popen.send_signal() read the returncode # just before Popen.wait() set returncode. pass @@ -362,7 +360,7 @@ def _runtest(self, test_name: str) -> MultiprocessResult: def run(self) -> None: fail_fast = self.runtests.fail_fast - fail_env_changed = self.ns.fail_env_changed + fail_env_changed = self.runtests.fail_env_changed while not self._stopped: try: try: @@ -394,10 +392,10 @@ def _wait_completed(self) -> None: f"{exc!r}") def wait_stopped(self, start_time: float) -> None: - # bpo-38207: MultiprocessTestRunner.stop_workers() called self.stop() + # bpo-38207: RunWorkers.stop_workers() called self.stop() # which killed the process. Sometimes, killing the process from the # main thread does not interrupt popen.communicate() in - # TestWorkerProcess thread. This loop with a timeout is a workaround + # WorkerThread thread. This loop with a timeout is a workaround # for that. # # Moreover, if this method fails to join the thread, it is likely @@ -417,7 +415,7 @@ def wait_stopped(self, start_time: float) -> None: break -def get_running(workers: list[TestWorkerProcess]) -> list[TestWorkerProcess]: +def get_running(workers: list[WorkerThread]) -> list[str]: running = [] for worker in workers: current_test_name = worker.current_test_name @@ -427,18 +425,17 @@ def get_running(workers: list[TestWorkerProcess]) -> list[TestWorkerProcess]: if dt >= PROGRESS_MIN_TIME: text = '%s (%s)' % (current_test_name, format_duration(dt)) running.append(text) - return running + if not running: + return None + return f"running ({len(running)}): {', '.join(running)}" -class MultiprocessTestRunner: - def __init__(self, regrtest: Regrtest, runtests: RunTests) -> None: - ns = regrtest.ns - +class RunWorkers: + def __init__(self, regrtest: Regrtest, runtests: RunTests, num_workers: int) -> None: self.regrtest = regrtest + self.log = regrtest.log + self.num_workers = num_workers self.runtests = runtests - self.rerun = runtests.rerun - self.log = self.regrtest.log - self.ns = ns self.output: queue.Queue[QueueOutput] = queue.Queue() tests_iter = runtests.iter_tests() self.pending = MultiprocessIterator(tests_iter) @@ -453,9 +450,8 @@ def __init__(self, regrtest: Regrtest, runtests: RunTests) -> None: self.workers = None def start_workers(self) -> None: - use_mp = self.ns.use_mp - self.workers = [TestWorkerProcess(index, self) - for index in range(1, use_mp + 1)] + self.workers = [WorkerThread(index, self) + for index in range(1, self.num_workers + 1)] msg = f"Run tests in parallel using {len(self.workers)} child processes" if self.timeout: msg += (" (timeout: %s, worker timeout: %s)" @@ -489,10 +485,11 @@ def _get_result(self) -> QueueOutput | None: except queue.Empty: pass - # display progress - running = get_running(self.workers) - if running and not pgo: - self.log('running: %s' % ', '.join(running)) + if not pgo: + # display progress + running = get_running(self.workers) + if running: + self.log(running) # all worker threads are done: consume pending results try: @@ -510,9 +507,10 @@ def display_result(self, mp_result: MultiprocessResult) -> None: text += ' (%s)' % mp_result.err_msg elif (result.duration >= PROGRESS_MIN_TIME and not pgo): text += ' (%s)' % format_duration(result.duration) - running = get_running(self.workers) - if running and not pgo: - text += ' -- running: %s' % ', '.join(running) + if not pgo: + running = get_running(self.workers) + if running: + text += f' -- {running}' self.regrtest.display_progress(self.test_index, text) def _process_result(self, item: QueueOutput) -> bool: @@ -537,9 +535,9 @@ def _process_result(self, item: QueueOutput) -> bool: return result - def run_tests(self) -> None: + def run(self) -> None: fail_fast = self.runtests.fail_fast - fail_env_changed = self.ns.fail_env_changed + fail_env_changed = self.runtests.fail_env_changed self.start_workers() @@ -566,10 +564,6 @@ def run_tests(self) -> None: self.stop_workers() -def run_tests_multiprocess(regrtest: Regrtest, runtests: RunTests) -> None: - MultiprocessTestRunner(regrtest, runtests).run_tests() - - class EncodeTestResult(json.JSONEncoder): """Encode a TestResult (sub)class object into a JSON dict.""" From a341750078e6de5206560adcf53337e0172ae1c6 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 10 Sep 2023 03:07:05 +0200 Subject: [PATCH 129/357] gh-109162: Refactor libregrtest.Regrtest (#109206) * Add type hint types: TestName, StrPath, StrJSON. * Add attributes to Regrtest: * cmdline_args * coverage * coverage_dir * fail_rerun * next_single_filename * print_slowest * tmp_dir * want_rerun * want_run_leaks * Remove Regrtest.ns attribute. * Rename Regrtest methods: * cleanup() => cleanup_temp_dir() * create_temp_dir() => make_temp_dir() * set_temp_dir() => select_temp_dir() * Convert Regrtest methods to static methods: * cleanup_temp_dir() * display_header() * fix_umask() * get_rerun_match_tests() * list_tests() * make_temp_dir() * select_temp_dir() * Remove display_sanitizers() method: move code into display_header(). * Rename 'test_cwd' variable to 'work_dir'. --- Lib/test/libregrtest/cmdline.py | 2 + Lib/test/libregrtest/main.py | 174 ++++++++++++++--------------- Lib/test/libregrtest/pgo.py | 6 +- Lib/test/libregrtest/runtest.py | 43 +++---- Lib/test/libregrtest/runtest_mp.py | 10 +- 5 files changed, 120 insertions(+), 115 deletions(-) diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index 2835546fc713cf..41d969625d04d2 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -179,6 +179,8 @@ def __init__(self, **kwargs) -> None: self.timeout = None self.memlimit = None self.threshold = None + self.fail_rerun = False + self.tempdir = None super().__init__(**kwargs) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 1fa7b07a09d701..e2e732ebd69e1c 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -13,7 +13,7 @@ from test.libregrtest.runtest import ( findtests, split_test_packages, run_single_test, abs_module_name, PROGRESS_MIN_TIME, State, RunTests, TestResult, HuntRefleak, - FilterTuple, FilterDict, TestList) + FilterTuple, FilterDict, TestList, StrPath, StrJSON, TestName) from test.libregrtest.setup import setup_tests, setup_test_dir from test.libregrtest.pgo import setup_pgo_tests from test.libregrtest.utils import (strip_py_suffix, count, format_duration, @@ -60,15 +60,14 @@ class Regrtest: on the command line. """ def __init__(self, ns: Namespace): - # Namespace of command line options - self.ns: Namespace = ns - # Actions self.want_header: bool = ns.header self.want_list_tests: bool = ns.list_tests self.want_list_cases: bool = ns.list_cases self.want_wait: bool = ns.wait self.want_cleanup: bool = ns.cleanup + self.want_rerun: bool = ns.rerun + self.want_run_leaks: bool = ns.runleaks # Select tests if ns.match_tests: @@ -80,10 +79,11 @@ def __init__(self, ns: Namespace): else: self.ignore_tests = None self.exclude: bool = ns.exclude - self.fromfile: str | None = ns.fromfile - self.starting_test: str | None = ns.start + self.fromfile: StrPath | None = ns.fromfile + self.starting_test: TestName | None = ns.start + self.cmdline_args: TestList = ns.args - # Run tests + # Workers if ns.use_mp is None: num_workers = 0 # run sequentially elif ns.use_mp <= 0: @@ -91,10 +91,12 @@ def __init__(self, ns: Namespace): else: num_workers = ns.use_mp self.num_workers: int = num_workers + self.worker_json: StrJSON | None = ns.worker_json # Options to run tests self.fail_fast: bool = ns.failfast self.fail_env_changed: bool = ns.fail_env_changed + self.fail_rerun: bool = ns.fail_rerun self.forever: bool = ns.forever self.randomize: bool = ns.randomize self.random_seed: int | None = ns.random_seed @@ -108,12 +110,15 @@ def __init__(self, ns: Namespace): self.hunt_refleak: HuntRefleak = HuntRefleak(*ns.huntrleaks) else: self.hunt_refleak = None - self.test_dir: str | None = ns.testdir - self.junit_filename: str | None = ns.xmlpath + self.test_dir: StrPath | None = ns.testdir + self.junit_filename: StrPath | None = ns.xmlpath self.memory_limit: str | None = ns.memlimit self.gc_threshold: int | None = ns.threshold self.use_resources: list[str] = ns.use_resources self.python_cmd: list[str] | None = ns.python + self.coverage: bool = ns.trace + self.coverage_dir: StrPath | None = ns.coverdir + self.tmp_dir: StrPath | None = ns.tempdir # tests self.tests = [] @@ -135,8 +140,9 @@ def __init__(self, ns: Namespace): self.interrupted = False self.total_stats = TestStats() - # used by --slow - self.test_times = [] + # used by --slowest + self.test_times: list[tuple[float, TestName]] = [] + self.print_slowest: bool = ns.print_slow # used to display the progress bar "[ 3/100]" self.start_time = time.perf_counter() @@ -144,15 +150,15 @@ def __init__(self, ns: Namespace): self.test_count_width = 1 # used by --single - self.next_single_test = None - self.next_single_filename = None + self.single_test_run: bool = ns.single + self.next_single_test: TestName | None = None + self.next_single_filename: StrPath | None = None # used by --junit-xml self.testsuite_xml = None # misc self.win_load_tracker = None - self.tmp_dir = None def get_executed(self): return (set(self.good) | set(self.bad) | set(self.skipped) @@ -232,10 +238,7 @@ def display_progress(self, test_index, text): self.log(f"[{line}] {text}") def find_tests(self): - ns = self.ns - single = ns.single - - if single: + if self.single_test_run: self.next_single_filename = os.path.join(self.tmp_dir, 'pynexttest') try: with open(self.next_single_filename, 'r') as fp: @@ -261,19 +264,19 @@ def find_tests(self): if self.pgo: # add default PGO tests if no tests are specified - setup_pgo_tests(ns) + setup_pgo_tests(self.cmdline_args, self.pgo_extended) exclude_tests = set() if self.exclude: - for arg in ns.args: + for arg in self.cmdline_args: exclude_tests.add(arg) - ns.args = [] + self.cmdline_args = [] alltests = findtests(testdir=self.test_dir, exclude=exclude_tests) if not self.fromfile: - self.selected = self.tests or ns.args + self.selected = self.tests or self.cmdline_args if self.selected: self.selected = split_test_packages(self.selected) else: @@ -281,7 +284,7 @@ def find_tests(self): else: self.selected = self.tests - if single: + if self.single_test_run: self.selected = self.selected[:1] try: pos = alltests.index(self.selected[0]) @@ -303,8 +306,9 @@ def find_tests(self): random.seed(self.random_seed) random.shuffle(self.selected) - def list_tests(self): - for name in self.selected: + @staticmethod + def list_tests(tests: TestList): + for name in tests: print(name) def _list_cases(self, suite): @@ -337,7 +341,8 @@ def list_cases(self): print(count(len(skipped), "test"), "skipped:", file=stderr) printlist(skipped, file=stderr) - def get_rerun_match(self, rerun_list) -> FilterDict: + @staticmethod + def get_rerun_match(rerun_list) -> FilterDict: rerun_match_tests = {} for result in rerun_list: match_tests = result.get_rerun_match_tests() @@ -396,7 +401,6 @@ def rerun_failed_tests(self, need_rerun, runtests: RunTests): def display_result(self, runtests): pgo = runtests.pgo - print_slow = self.ns.print_slow # If running the test suite for PGO then no one cares about results. if pgo: @@ -423,7 +427,7 @@ def display_result(self, runtests): print("All", end=' ') print(count(len(self.good), "test"), "OK.") - if print_slow: + if self.print_slowest: self.test_times.sort(reverse=True) print() print("10 slowest tests:") @@ -461,14 +465,14 @@ def display_result(self, runtests): print(count(len(self.run_no_tests), "test"), "run no tests:") printlist(self.run_no_tests) - def run_test(self, test_name: str, runtests: RunTests, tracer): + def run_test(self, test_name: TestName, runtests: RunTests, tracer): if tracer is not None: # If we're tracing code coverage, then we don't exit with status # if on a false return value from main. cmd = ('result = run_single_test(test_name, runtests)') - ns = dict(locals()) - tracer.runctx(cmd, globals=globals(), locals=ns) - result = ns['result'] + namespace = dict(locals()) + tracer.runctx(cmd, globals=globals(), locals=namespace) + result = namespace['result'] else: result = run_single_test(test_name, runtests) @@ -477,10 +481,7 @@ def run_test(self, test_name: str, runtests: RunTests, tracer): return result def run_tests_sequentially(self, runtests): - ns = self.ns - coverage = ns.trace - - if coverage: + if self.coverage: import trace tracer = trace.Trace(trace=False, count=True) else: @@ -526,7 +527,8 @@ def run_tests_sequentially(self, runtests): return tracer - def display_header(self): + @staticmethod + def display_header(): # Print basic platform information print("==", platform.python_implementation(), *sys.version.split()) print("==", platform.platform(aliased=True), @@ -538,9 +540,7 @@ def display_header(self): print("== CPU count:", cpu_count) print("== encodings: locale=%s, FS=%s" % (locale.getencoding(), sys.getfilesystemencoding())) - self.display_sanitizers() - def display_sanitizers(self): # This makes it easier to remember what to set in your local # environment when trying to reproduce a sanitizer failure. asan = support.check_sanitizer(address=True) @@ -642,9 +642,9 @@ def finalize_tests(self, tracer): if tracer is not None: results = tracer.results() results.write_results(show_missing=True, summary=True, - coverdir=self.ns.coverdir) + coverdir=self.coverage_dir) - if self.ns.runleaks: + if self.want_run_leaks: os.system("leaks %d" % os.getpid()) self.save_xml_result() @@ -722,7 +722,8 @@ def save_xml_result(self): for s in ET.tostringlist(root): f.write(s) - def fix_umask(self): + @staticmethod + def fix_umask(): if support.is_emscripten: # Emscripten has default umask 0o777, which breaks some tests. # see https://github.com/emscripten-core/emscripten/issues/17269 @@ -732,37 +733,34 @@ def fix_umask(self): else: os.umask(old_mask) - def set_temp_dir(self): - ns = self.ns - if ns.tempdir: - ns.tempdir = os.path.expanduser(ns.tempdir) - - if ns.tempdir: - self.tmp_dir = ns.tempdir - - if not self.tmp_dir: + @staticmethod + def select_temp_dir(tmp_dir): + if tmp_dir: + tmp_dir = os.path.expanduser(tmp_dir) + else: # 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: + tmp_dir = sysconfig.get_config_var('abs_builddir') + if 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') + tmp_dir = sysconfig.get_config_var('srcdir') + tmp_dir = os.path.join(tmp_dir, 'build') else: - self.tmp_dir = tempfile.gettempdir() + tmp_dir = tempfile.gettempdir() - self.tmp_dir = os.path.abspath(self.tmp_dir) + return os.path.abspath(tmp_dir) def is_worker(self): - return (self.ns.worker_json is not None) + return (self.worker_json is not None) - def create_temp_dir(self): - os.makedirs(self.tmp_dir, exist_ok=True) + @staticmethod + def make_temp_dir(tmp_dir: StrPath, is_worker: bool): + os.makedirs(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 @@ -774,19 +772,20 @@ def create_temp_dir(self): else: nounce = os.getpid() - if self.is_worker(): - test_cwd = 'test_python_worker_{}'.format(nounce) + if is_worker: + work_dir = 'test_python_worker_{}'.format(nounce) else: - test_cwd = 'test_python_{}'.format(nounce) - test_cwd += os_helper.FS_NONASCII - test_cwd = os.path.join(self.tmp_dir, test_cwd) - return test_cwd + work_dir = 'test_python_{}'.format(nounce) + work_dir += os_helper.FS_NONASCII + work_dir = os.path.join(tmp_dir, work_dir) + return work_dir - def cleanup(self): + @staticmethod + def cleanup_temp_dir(tmp_dir: StrPath): import glob - path = os.path.join(glob.escape(self.tmp_dir), 'test_python_*') - print("Cleanup %s directory" % self.tmp_dir) + path = os.path.join(glob.escape(tmp_dir), 'test_python_*') + print("Cleanup %s directory" % tmp_dir) for name in glob.glob(path): if os.path.isdir(name): print("Remove directory: %s" % name) @@ -796,34 +795,33 @@ def cleanup(self): os_helper.unlink(name) def main(self, tests: TestList | None = None): - ns = self.ns self.tests = tests if self.junit_filename: support.junit_xml_list = self.testsuite_xml = [] - strip_py_suffix(ns.args) + strip_py_suffix(self.cmdline_args) - self.set_temp_dir() + self.tmp_dir = self.select_temp_dir(self.tmp_dir) self.fix_umask() if self.want_cleanup: - self.cleanup() + self.cleanup_temp_dir(self.tmp_dir) sys.exit(0) - test_cwd = self.create_temp_dir() + work_dir = self.make_temp_dir(self.tmp_dir, self.is_worker()) try: - # 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. + # 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 os_helper.SAVEDCWD. - with os_helper.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. - ns.tempdir = test_cwd + with os_helper.temp_cwd(work_dir, quiet=True): + # When using multiprocessing, worker processes will use + # work_dir as their parent temporary directory. So when the + # main process exit, it removes also subdirectories of worker + # processes. self._main() except SystemExit as exc: @@ -853,7 +851,7 @@ def get_exitcode(self): exitcode = EXITCODE_ENV_CHANGED elif self.no_tests_run(): exitcode = EXITCODE_NO_TESTS_RAN - elif self.rerun and self.ns.fail_rerun: + elif self.rerun and self.fail_rerun: exitcode = EXITCODE_RERUN_FAIL return exitcode @@ -865,8 +863,8 @@ def action_run_tests(self): # For a partial run, we do not need to clutter the output. if (self.want_header - or not(self.pgo or self.quiet or self.ns.single - or self.tests or self.ns.args)): + or not(self.pgo or self.quiet or self.single_test_run + or self.tests or self.cmdline_args)): self.display_header() if self.randomize: @@ -903,7 +901,7 @@ def action_run_tests(self): self.display_result(runtests) need_rerun = self.need_rerun - if self.ns.rerun and need_rerun: + if self.want_rerun and need_rerun: self.rerun_failed_tests(need_rerun, runtests) self.display_summary() @@ -912,7 +910,7 @@ def action_run_tests(self): def _main(self): if self.is_worker(): from test.libregrtest.runtest_mp import worker_process - worker_process(self.ns.worker_json) + worker_process(self.worker_json) return if self.want_wait: @@ -923,7 +921,7 @@ def _main(self): exitcode = 0 if self.want_list_tests: - self.list_tests() + self.list_tests(self.selected) elif self.want_list_cases: self.list_cases() else: diff --git a/Lib/test/libregrtest/pgo.py b/Lib/test/libregrtest/pgo.py index 42ce5fba7a97c3..cabbba73d5eff5 100644 --- a/Lib/test/libregrtest/pgo.py +++ b/Lib/test/libregrtest/pgo.py @@ -50,7 +50,7 @@ 'test_xml_etree_c', ] -def setup_pgo_tests(ns): - if not ns.args and not ns.pgo_extended: +def setup_pgo_tests(cmdline_args, pgo_extended: bool): + if not cmdline_args and not pgo_extended: # run default set of tests for PGO training - ns.args = PGO_TESTS[:] + cmdline_args[:] = PGO_TESTS[:] diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index 667701778d9a79..6607e912330b52 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -20,20 +20,23 @@ from test.libregrtest.utils import clear_caches, format_duration, print_warning -TestTuple = list[str] -TestList = list[str] +StrJSON = str +StrPath = str +TestName = str +TestTuple = tuple[TestName, ...] +TestList = list[TestName] # --match and --ignore options: list of patterns # ('*' joker character can be used) -FilterTuple = tuple[str, ...] -FilterDict = dict[str, FilterTuple] +FilterTuple = tuple[TestName, ...] +FilterDict = dict[TestName, FilterTuple] @dataclasses.dataclass(slots=True, frozen=True) class HuntRefleak: warmups: int runs: int - filename: str + filename: StrPath # Avoid enum.Enum to reduce the number of imports when tests are run @@ -110,7 +113,7 @@ def normalize_test_name(test_full_name, *, is_error=False): @dataclasses.dataclass(slots=True) class TestResult: - test_name: str + test_name: TestName state: str | None = None # Test duration in seconds duration: float | None = None @@ -230,8 +233,8 @@ class RunTests: verbose: bool = False quiet: bool = False hunt_refleak: HuntRefleak | None = None - test_dir: str | None = None - junit_filename: str | None = None + test_dir: StrPath | None = None + junit_filename: StrPath | None = None memory_limit: str | None = None gc_threshold: int | None = None use_resources: list[str] = None @@ -255,11 +258,11 @@ def iter_tests(self): else: yield from self.tests - def as_json(self): + def as_json(self) -> StrJSON: return json.dumps(self, cls=_EncodeRunTests) @staticmethod - def from_json(worker_json): + def from_json(worker_json: StrJSON) -> 'RunTests': return json.loads(worker_json, object_hook=_decode_runtests) @@ -292,7 +295,7 @@ def _decode_runtests(data: dict[str, Any]) -> RunTests | dict[str, Any]: # Beware this can't generally be done for any directory with sub-tests as the # __init__.py may do things which alter what tests are to be run. -SPLITTESTDIRS = { +SPLITTESTDIRS: set[TestName] = { "test_asyncio", "test_concurrent_futures", "test_multiprocessing_fork", @@ -305,8 +308,9 @@ def findtestdir(path=None): return path or os.path.dirname(os.path.dirname(__file__)) or os.curdir -def findtests(*, testdir: str | None =None, exclude=(), - split_test_dirs=SPLITTESTDIRS, base_mod=""): +def findtests(*, testdir: StrPath | None = None, exclude=(), + split_test_dirs: set[TestName] = SPLITTESTDIRS, + base_mod: str = "") -> TestList: """Return a list of all applicable test modules.""" testdir = findtestdir(testdir) tests = [] @@ -318,13 +322,14 @@ def findtests(*, testdir: str | None =None, exclude=(), subdir = os.path.join(testdir, mod) mod = f"{base_mod or 'test'}.{mod}" tests.extend(findtests(testdir=subdir, exclude=exclude, - split_test_dirs=split_test_dirs, base_mod=mod)) + split_test_dirs=split_test_dirs, + base_mod=mod)) elif ext in (".py", ""): tests.append(f"{base_mod}.{mod}" if base_mod else mod) return sorted(tests) -def split_test_packages(tests, *, testdir: str | None = None, exclude=(), +def split_test_packages(tests, *, testdir: StrPath | None = None, exclude=(), split_test_dirs=SPLITTESTDIRS): testdir = findtestdir(testdir) splitted = [] @@ -339,7 +344,7 @@ def split_test_packages(tests, *, testdir: str | None = None, exclude=(), return splitted -def abs_module_name(test_name: str, test_dir: str | None) -> str: +def abs_module_name(test_name: TestName, test_dir: StrPath | None) -> TestName: if test_name.startswith('test.') or test_dir: return test_name else: @@ -422,7 +427,7 @@ def _runtest(result: TestResult, runtests: RunTests) -> None: support.junit_xml_list = None -def run_single_test(test_name: str, runtests: RunTests) -> TestResult: +def run_single_test(test_name: TestName, runtests: RunTests) -> TestResult: """Run a single test. test_name -- the name of the test @@ -457,7 +462,7 @@ def run_unittest(test_mod): return support.run_unittest(tests) -def save_env(test_name: str, runtests: RunTests): +def save_env(test_name: TestName, runtests: RunTests): return saved_test_environment(test_name, runtests.verbose, runtests.quiet, pgo=runtests.pgo) @@ -608,7 +613,7 @@ def _runtest_env_changed_exc(result: TestResult, runtests: RunTests, result.state = State.PASSED -def remove_testfn(test_name: str, verbose: int) -> None: +def remove_testfn(test_name: TestName, verbose: int) -> None: # Try to clean up os_helper.TESTFN if left behind. # # While tests shouldn't leave any files or directories behind, when a test diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index 28c05b5976e159..2575f1811a4930 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -19,7 +19,7 @@ from test.libregrtest.main import Regrtest from test.libregrtest.runtest import ( run_single_test, TestResult, State, PROGRESS_MIN_TIME, - FilterTuple, RunTests) + FilterTuple, RunTests, StrPath, StrJSON, TestName) from test.libregrtest.setup import setup_tests, setup_test_dir from test.libregrtest.utils import format_duration, print_warning @@ -50,7 +50,7 @@ class WorkerJob: def create_worker_process(runtests: RunTests, output_file: TextIO, - tmp_dir: str | None = None) -> subprocess.Popen: + tmp_dir: StrPath | None = None) -> subprocess.Popen: python_cmd = runtests.python_cmd worker_json = runtests.as_json() @@ -86,7 +86,7 @@ def create_worker_process(runtests: RunTests, return subprocess.Popen(cmd, **kw) -def worker_process(worker_json: str) -> NoReturn: +def worker_process(worker_json: StrJSON) -> NoReturn: runtests = RunTests.from_json(worker_json) test_name = runtests.tests[0] match_tests: FilterTuple | None = runtests.match_tests @@ -222,7 +222,7 @@ def mp_result_error( return MultiprocessResult(test_result, stdout, err_msg) def _run_process(self, worker_job, output_file: TextIO, - tmp_dir: str | None = None) -> int: + tmp_dir: StrPath | None = None) -> int: try: popen = create_worker_process(worker_job, output_file, tmp_dir) @@ -273,7 +273,7 @@ def _run_process(self, worker_job, output_file: TextIO, self._popen = None self.current_test_name = None - def _runtest(self, test_name: str) -> MultiprocessResult: + def _runtest(self, test_name: TestName) -> MultiprocessResult: self.current_test_name = test_name if sys.platform == 'win32': From db5bfe91f822bb06b4c8fe7c58e649694c854bf2 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 10 Sep 2023 04:30:43 +0200 Subject: [PATCH 130/357] gh-109162: libregrtest: add TestResults class (#109208) * Add TestResults class. * Move Regrtest methods to TestResults: * accumulate_result(): now takes a RunTests parameter * get_executed() * no_tests_run() * Add methods to TestResults: * add_junit() * display_result() * display_summary() * need_rerun() * prepare_rerun() * write_junit() * Rename 'need_rerun' attribute to 'bad_results'. * Rename 'total_stats' attribute to 'stats'. --- Lib/test/libregrtest/main.py | 303 ++++------------------------- Lib/test/libregrtest/results.py | 259 ++++++++++++++++++++++++ Lib/test/libregrtest/runtest_mp.py | 18 +- 3 files changed, 306 insertions(+), 274 deletions(-) create mode 100644 Lib/test/libregrtest/results.py diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index e2e732ebd69e1c..75c3d0e8350ade 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -12,14 +12,14 @@ from test.libregrtest.cmdline import _parse_args, Namespace from test.libregrtest.runtest import ( findtests, split_test_packages, run_single_test, abs_module_name, - PROGRESS_MIN_TIME, State, RunTests, TestResult, HuntRefleak, - FilterTuple, FilterDict, TestList, StrPath, StrJSON, TestName) + PROGRESS_MIN_TIME, State, RunTests, HuntRefleak, + FilterTuple, TestList, StrPath, StrJSON, TestName) from test.libregrtest.setup import setup_tests, setup_test_dir from test.libregrtest.pgo import setup_pgo_tests +from test.libregrtest.results import TestResults from test.libregrtest.utils import (strip_py_suffix, count, format_duration, printlist, get_build_info) from test import support -from test.support import TestStats from test.support import os_helper from test.support import threading_helper @@ -29,12 +29,6 @@ # Must be smaller than buildbot "1200 seconds without output" limit. EXIT_TIMEOUT = 120.0 -EXITCODE_BAD_TEST = 2 -EXITCODE_ENV_CHANGED = 3 -EXITCODE_NO_TESTS_RAN = 4 -EXITCODE_RERUN_FAIL = 5 -EXITCODE_INTERRUPTED = 130 - class Regrtest: """Execute a test suite. @@ -122,26 +116,15 @@ def __init__(self, ns: Namespace): # tests self.tests = [] - self.selected = [] + self.selected: TestList = [] self.first_runtests: RunTests | None = None # test results - self.good: TestList = [] - self.bad: TestList = [] - self.rerun_bad: TestList = [] - self.skipped: TestList = [] - self.resource_denied: TestList = [] - self.environment_changed: TestList = [] - self.run_no_tests: TestList = [] - self.rerun: TestList = [] - - self.need_rerun: list[TestResult] = [] + self.results: TestResults = TestResults() + self.first_state: str | None = None - self.interrupted = False - self.total_stats = TestStats() # used by --slowest - self.test_times: list[tuple[float, TestName]] = [] self.print_slowest: bool = ns.print_slow # used to display the progress bar "[ 3/100]" @@ -154,57 +137,9 @@ def __init__(self, ns: Namespace): self.next_single_test: TestName | None = None self.next_single_filename: StrPath | None = None - # used by --junit-xml - self.testsuite_xml = None - # misc self.win_load_tracker = None - def get_executed(self): - return (set(self.good) | set(self.bad) | set(self.skipped) - | set(self.resource_denied) | set(self.environment_changed) - | set(self.run_no_tests)) - - def accumulate_result(self, result, rerun=False): - test_name = result.test_name - - match result.state: - case State.PASSED: - self.good.append(test_name) - case State.ENV_CHANGED: - self.environment_changed.append(test_name) - case State.SKIPPED: - self.skipped.append(test_name) - case State.RESOURCE_DENIED: - self.resource_denied.append(test_name) - case State.INTERRUPTED: - self.interrupted = True - case State.DID_NOT_RUN: - self.run_no_tests.append(test_name) - case _: - if result.is_failed(self.fail_env_changed): - self.bad.append(test_name) - self.need_rerun.append(result) - else: - raise ValueError(f"invalid test state: {result.state!r}") - - if result.has_meaningful_duration() and not rerun: - self.test_times.append((result.duration, test_name)) - if result.stats is not None: - self.total_stats.accumulate(result.stats) - if rerun: - self.rerun.append(test_name) - - xml_data = result.xml_data - if xml_data: - import xml.etree.ElementTree as ET - for e in xml_data: - try: - self.testsuite_xml.append(ET.fromstring(e)) - except ET.ParseError: - print(xml_data, file=sys.__stderr__) - raise - def log(self, line=''): empty = not line @@ -232,7 +167,7 @@ def display_progress(self, test_index, text): # "[ 51/405/1] test_tcl passed" line = f"{test_index:{self.test_count_width}}{self.test_count_text}" - fails = len(self.bad) + len(self.environment_changed) + fails = len(self.results.bad) + len(self.results.env_changed) if fails and not self.pgo: line = f"{line}/{fails}" self.log(f"[{line}] {text}") @@ -341,34 +276,17 @@ def list_cases(self): print(count(len(skipped), "test"), "skipped:", file=stderr) printlist(skipped, file=stderr) - @staticmethod - def get_rerun_match(rerun_list) -> FilterDict: - rerun_match_tests = {} - for result in rerun_list: - match_tests = result.get_rerun_match_tests() - # ignore empty match list - if match_tests: - rerun_match_tests[result.test_name] = match_tests - return rerun_match_tests - - def _rerun_failed_tests(self, need_rerun, runtests: RunTests): + def _rerun_failed_tests(self, runtests: RunTests): # Configure the runner to re-run tests if self.num_workers == 0: self.num_workers = 1 - # Get tests to re-run - tests = [result.test_name for result in need_rerun] - match_tests_dict = self.get_rerun_match(need_rerun) - - # Clear previously failed tests - self.rerun_bad.extend(self.bad) - self.bad.clear() - self.need_rerun.clear() + tests, match_tests_dict = self.results.prepare_rerun() # Re-run failed tests self.log(f"Re-running {len(tests)} failed tests in verbose mode in subprocesses") runtests = runtests.copy( - tests=tuple(tests), + tests=tests, rerun=True, verbose=True, forever=False, @@ -379,7 +297,7 @@ def _rerun_failed_tests(self, need_rerun, runtests: RunTests): self._run_tests_mp(runtests, self.num_workers) return runtests - def rerun_failed_tests(self, need_rerun, runtests: RunTests): + def rerun_failed_tests(self, runtests: RunTests): if self.python_cmd: # Temp patch for https://github.com/python/cpython/issues/94052 self.log( @@ -388,82 +306,27 @@ def rerun_failed_tests(self, need_rerun, runtests: RunTests): ) return - self.first_state = self.get_tests_state() + self.first_state = self.get_state() print() - rerun_runtests = self._rerun_failed_tests(need_rerun, runtests) + rerun_runtests = self._rerun_failed_tests(runtests) - if self.bad: - print(count(len(self.bad), 'test'), "failed again:") - printlist(self.bad) + if self.results.bad: + print(count(len(self.results.bad), 'test'), "failed again:") + printlist(self.results.bad) self.display_result(rerun_runtests) def display_result(self, runtests): - pgo = runtests.pgo - # If running the test suite for PGO then no one cares about results. - if pgo: + if runtests.pgo: return + state = self.get_state() print() - print("== Tests result: %s ==" % self.get_tests_state()) - - if self.interrupted: - print("Test suite interrupted by signal SIGINT.") - - omitted = set(self.selected) - self.get_executed() - if omitted: - print() - print(count(len(omitted), "test"), "omitted:") - printlist(omitted) - - if self.good and not self.quiet: - print() - if (not self.bad - and not self.skipped - and not self.interrupted - and len(self.good) > 1): - print("All", end=' ') - print(count(len(self.good), "test"), "OK.") - - if self.print_slowest: - self.test_times.sort(reverse=True) - print() - print("10 slowest tests:") - for test_time, test in self.test_times[:10]: - print("- %s: %s" % (test, format_duration(test_time))) - - if self.bad: - print() - print(count(len(self.bad), "test"), "failed:") - printlist(self.bad) - - if self.environment_changed: - print() - print("{} altered the execution environment:".format( - count(len(self.environment_changed), "test"))) - printlist(self.environment_changed) - - if self.skipped and not self.quiet: - print() - print(count(len(self.skipped), "test"), "skipped:") - printlist(self.skipped) - - if self.resource_denied and not self.quiet: - print() - print(count(len(self.resource_denied), "test"), "skipped (resource denied):") - printlist(self.resource_denied) - - if self.rerun: - print() - print("%s:" % count(len(self.rerun), "re-run test")) - printlist(self.rerun) - - if self.run_no_tests: - print() - print(count(len(self.run_no_tests), "test"), "run no tests:") - printlist(self.run_no_tests) + print(f"== Tests result: {state} ==") + + self.results.display_result(self.selected, self.quiet, self.print_slowest) def run_test(self, test_name: TestName, runtests: RunTests, tracer): if tracer is not None: @@ -476,7 +339,7 @@ def run_test(self, test_name: TestName, runtests: RunTests, tracer): else: result = run_single_test(test_name, runtests) - self.accumulate_result(result) + self.results.accumulate_result(result, runtests) return result @@ -566,29 +429,11 @@ def display_header(): if sanitizer and options is not None: print(f"== {env_var}={options!r}") - def no_tests_run(self): - return not any((self.good, self.bad, self.skipped, self.interrupted, - self.environment_changed)) - - def get_tests_state(self): - result = [] - if self.bad: - result.append("FAILURE") - elif self.fail_env_changed and self.environment_changed: - result.append("ENV CHANGED") - elif self.no_tests_run(): - result.append("NO TESTS RAN") - - if self.interrupted: - result.append("INTERRUPTED") - - if not result: - result.append("SUCCESS") - - result = ', '.join(result) + def get_state(self): + state = self.results.get_state(self.fail_env_changed) if self.first_state: - result = '%s then %s' % (self.first_state, result) - return result + state = f'{self.first_state} then {state}' + return state def _run_tests_mp(self, runtests: RunTests, num_workers: int) -> None: from test.libregrtest.runtest_mp import RunWorkers @@ -647,7 +492,8 @@ def finalize_tests(self, tracer): if self.want_run_leaks: os.system("leaks %d" % os.getpid()) - self.save_xml_result() + if self.junit_filename: + self.results.write_junit(self.junit_filename) def display_summary(self): duration = time.perf_counter() - self.start_time @@ -657,70 +503,11 @@ def display_summary(self): print() print("Total duration: %s" % format_duration(duration)) - # Total tests - total = self.total_stats - text = f'run={total.tests_run:,}' - if filtered: - text = f"{text} (filtered)" - stats = [text] - if total.failures: - stats.append(f'failures={total.failures:,}') - if total.skipped: - stats.append(f'skipped={total.skipped:,}') - print(f"Total tests: {' '.join(stats)}") - - # Total test files - all_tests = [self.good, self.bad, self.rerun, - self.skipped, - self.environment_changed, self.run_no_tests] - run = sum(map(len, all_tests)) - text = f'run={run}' - if not self.first_runtests.forever: - ntest = len(self.first_runtests.tests) - text = f"{text}/{ntest}" - if filtered: - text = f"{text} (filtered)" - report = [text] - for name, tests in ( - ('failed', self.bad), - ('env_changed', self.environment_changed), - ('skipped', self.skipped), - ('resource_denied', self.resource_denied), - ('rerun', self.rerun), - ('run_no_tests', self.run_no_tests), - ): - if tests: - report.append(f'{name}={len(tests)}') - print(f"Total test files: {' '.join(report)}") + self.results.display_summary(self.first_runtests, filtered) # Result - result = self.get_tests_state() - print(f"Result: {result}") - - def save_xml_result(self): - if not self.junit_filename and not self.testsuite_xml: - return - - import xml.etree.ElementTree as ET - root = ET.Element("testsuites") - - # Manually count the totals for the overall summary - totals = {'tests': 0, 'errors': 0, 'failures': 0} - for suite in self.testsuite_xml: - root.append(suite) - for k in totals: - try: - totals[k] += int(suite.get(k, 0)) - except ValueError: - pass - - for k, v in totals.items(): - root.set(k, str(v)) - - xmlpath = os.path.join(os_helper.SAVEDCWD, self.junit_filename) - with open(xmlpath, 'wb') as f: - for s in ET.tostringlist(root): - f.write(s) + state = self.get_state() + print(f"Result: {state}") @staticmethod def fix_umask(): @@ -795,10 +582,10 @@ def cleanup_temp_dir(tmp_dir: StrPath): os_helper.unlink(name) def main(self, tests: TestList | None = None): - self.tests = tests + if self.junit_filename and not os.path.isabs(self.junit_filename): + self.junit_filename = os.path.abspath(self.junit_filename) - if self.junit_filename: - support.junit_xml_list = self.testsuite_xml = [] + self.tests = tests strip_py_suffix(self.cmdline_args) @@ -841,20 +628,6 @@ def getloadavg(self): return None - def get_exitcode(self): - exitcode = 0 - if self.bad: - exitcode = EXITCODE_BAD_TEST - elif self.interrupted: - exitcode = EXITCODE_INTERRUPTED - elif self.fail_env_changed and self.environment_changed: - exitcode = EXITCODE_ENV_CHANGED - elif self.no_tests_run(): - exitcode = EXITCODE_NO_TESTS_RAN - elif self.rerun and self.fail_rerun: - exitcode = EXITCODE_RERUN_FAIL - return exitcode - def action_run_tests(self): if self.hunt_refleak and self.hunt_refleak.warmups < 3: msg = ("WARNING: Running tests with --huntrleaks/-R and " @@ -900,9 +673,8 @@ def action_run_tests(self): tracer = self.run_tests(runtests) self.display_result(runtests) - need_rerun = self.need_rerun - if self.want_rerun and need_rerun: - self.rerun_failed_tests(need_rerun, runtests) + if self.want_rerun and self.results.need_rerun(): + self.rerun_failed_tests(runtests) self.display_summary() self.finalize_tests(tracer) @@ -926,7 +698,8 @@ def _main(self): self.list_cases() else: self.action_run_tests() - exitcode = self.get_exitcode() + exitcode = self.results.get_exitcode(self.fail_env_changed, + self.fail_rerun) sys.exit(exitcode) diff --git a/Lib/test/libregrtest/results.py b/Lib/test/libregrtest/results.py new file mode 100644 index 00000000000000..1df15c23770cc1 --- /dev/null +++ b/Lib/test/libregrtest/results.py @@ -0,0 +1,259 @@ +import sys +from test.support import TestStats + +from test.libregrtest.runtest import ( + TestName, TestTuple, TestList, FilterDict, StrPath, State, + TestResult, RunTests) +from test.libregrtest.utils import printlist, count, format_duration + + +EXITCODE_BAD_TEST = 2 +EXITCODE_ENV_CHANGED = 3 +EXITCODE_NO_TESTS_RAN = 4 +EXITCODE_RERUN_FAIL = 5 +EXITCODE_INTERRUPTED = 130 + + +class TestResults: + def __init__(self): + self.bad: TestList = [] + self.good: TestList = [] + self.rerun_bad: TestList = [] + self.skipped: TestList = [] + self.resource_denied: TestList = [] + self.env_changed: TestList = [] + self.run_no_tests: TestList = [] + self.rerun: TestList = [] + self.bad_results: list[TestResult] = [] + + self.interrupted: bool = False + self.test_times: list[tuple[float, TestName]] = [] + self.stats = TestStats() + # used by --junit-xml + self.testsuite_xml: list[str] = [] + + def get_executed(self): + return (set(self.good) | set(self.bad) | set(self.skipped) + | set(self.resource_denied) | set(self.env_changed) + | set(self.run_no_tests)) + + def no_tests_run(self): + return not any((self.good, self.bad, self.skipped, self.interrupted, + self.env_changed)) + + def get_state(self, fail_env_changed): + state = [] + if self.bad: + state.append("FAILURE") + elif fail_env_changed and self.env_changed: + state.append("ENV CHANGED") + elif self.no_tests_run(): + state.append("NO TESTS RAN") + + if self.interrupted: + state.append("INTERRUPTED") + if not state: + state.append("SUCCESS") + + return ', '.join(state) + + def get_exitcode(self, fail_env_changed, fail_rerun): + exitcode = 0 + if self.bad: + exitcode = EXITCODE_BAD_TEST + elif self.interrupted: + exitcode = EXITCODE_INTERRUPTED + elif fail_env_changed and self.env_changed: + exitcode = EXITCODE_ENV_CHANGED + elif self.no_tests_run(): + exitcode = EXITCODE_NO_TESTS_RAN + elif fail_rerun and self.rerun: + exitcode = EXITCODE_RERUN_FAIL + return exitcode + + def accumulate_result(self, result: TestResult, runtests: RunTests): + test_name = result.test_name + rerun = runtests.rerun + fail_env_changed = runtests.fail_env_changed + + match result.state: + case State.PASSED: + self.good.append(test_name) + case State.ENV_CHANGED: + self.env_changed.append(test_name) + case State.SKIPPED: + self.skipped.append(test_name) + case State.RESOURCE_DENIED: + self.resource_denied.append(test_name) + case State.INTERRUPTED: + self.interrupted = True + case State.DID_NOT_RUN: + self.run_no_tests.append(test_name) + case _: + if result.is_failed(fail_env_changed): + self.bad.append(test_name) + self.bad_results.append(result) + else: + raise ValueError(f"invalid test state: {result.state!r}") + + if result.has_meaningful_duration() and not rerun: + self.test_times.append((result.duration, test_name)) + if result.stats is not None: + self.stats.accumulate(result.stats) + if rerun: + self.rerun.append(test_name) + + xml_data = result.xml_data + if xml_data: + self.add_junit(result.xml_data) + + def need_rerun(self): + return bool(self.bad_results) + + def prepare_rerun(self) -> (TestTuple, FilterDict): + tests: TestList = [] + match_tests_dict = {} + for result in self.bad_results: + tests.append(result.test_name) + + match_tests = result.get_rerun_match_tests() + # ignore empty match list + if match_tests: + match_tests_dict[result.test_name] = match_tests + + # Clear previously failed tests + self.rerun_bad.extend(self.bad) + self.bad.clear() + self.bad_results.clear() + + return (tuple(tests), match_tests_dict) + + def add_junit(self, xml_data: list[str]): + import xml.etree.ElementTree as ET + for e in xml_data: + try: + self.testsuite_xml.append(ET.fromstring(e)) + except ET.ParseError: + print(xml_data, file=sys.__stderr__) + raise + + def write_junit(self, filename: StrPath): + if not self.testsuite_xml: + # Don't create empty XML file + return + + import xml.etree.ElementTree as ET + root = ET.Element("testsuites") + + # Manually count the totals for the overall summary + totals = {'tests': 0, 'errors': 0, 'failures': 0} + for suite in self.testsuite_xml: + root.append(suite) + for k in totals: + try: + totals[k] += int(suite.get(k, 0)) + except ValueError: + pass + + for k, v in totals.items(): + root.set(k, str(v)) + + with open(filename, 'wb') as f: + for s in ET.tostringlist(root): + f.write(s) + + def display_result(self, tests: TestList, quiet: bool, print_slowest: bool): + if self.interrupted: + print("Test suite interrupted by signal SIGINT.") + + omitted = set(tests) - self.get_executed() + if omitted: + print() + print(count(len(omitted), "test"), "omitted:") + printlist(omitted) + + if self.good and not quiet: + print() + if (not self.bad + and not self.skipped + and not self.interrupted + and len(self.good) > 1): + print("All", end=' ') + print(count(len(self.good), "test"), "OK.") + + if print_slowest: + self.test_times.sort(reverse=True) + print() + print("10 slowest tests:") + for test_time, test in self.test_times[:10]: + print("- %s: %s" % (test, format_duration(test_time))) + + if self.bad: + print() + print(count(len(self.bad), "test"), "failed:") + printlist(self.bad) + + if self.env_changed: + print() + print("{} altered the execution environment:".format( + count(len(self.env_changed), "test"))) + printlist(self.env_changed) + + if self.skipped and not quiet: + print() + print(count(len(self.skipped), "test"), "skipped:") + printlist(self.skipped) + + if self.resource_denied and not quiet: + print() + print(count(len(self.resource_denied), "test"), "skipped (resource denied):") + printlist(self.resource_denied) + + if self.rerun: + print() + print("%s:" % count(len(self.rerun), "re-run test")) + printlist(self.rerun) + + if self.run_no_tests: + print() + print(count(len(self.run_no_tests), "test"), "run no tests:") + printlist(self.run_no_tests) + + def display_summary(self, first_runtests: RunTests, filtered: bool): + # Total tests + stats = self.stats + text = f'run={stats.tests_run:,}' + if filtered: + text = f"{text} (filtered)" + report = [text] + if stats.failures: + report.append(f'failures={stats.failures:,}') + if stats.skipped: + report.append(f'skipped={stats.skipped:,}') + report = ' '.join(report) + print(f"Total tests: {report}") + + # Total test files + all_tests = [self.good, self.bad, self.rerun, + self.skipped, + self.env_changed, self.run_no_tests] + run = sum(map(len, all_tests)) + text = f'run={run}' + if not first_runtests.forever: + ntest = len(first_runtests.tests) + text = f"{text}/{ntest}" + if filtered: + text = f"{text} (filtered)" + report = [text] + for name, tests in ( + ('failed', self.bad), + ('env_changed', self.env_changed), + ('skipped', self.skipped), + ('resource_denied', self.resource_denied), + ('rerun', self.rerun), + ('run_no_tests', self.run_no_tests), + ): + if tests: + report.append(f'{name}={len(tests)}') + report = ' '.join(report) + print(f"Total test files: {report}") diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index 2575f1811a4930..179b6104a8f79a 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -21,6 +21,7 @@ run_single_test, TestResult, State, PROGRESS_MIN_TIME, FilterTuple, RunTests, StrPath, StrJSON, TestName) from test.libregrtest.setup import setup_tests, setup_test_dir +from test.libregrtest.results import TestResults from test.libregrtest.utils import format_duration, print_warning if sys.platform == 'win32': @@ -157,7 +158,7 @@ def __init__(self, worker_id: int, runner: "RunWorkers") -> None: self.pending = runner.pending self.output = runner.output self.timeout = runner.worker_timeout - self.regrtest = runner.regrtest + self.log = runner.log self.current_test_name = None self.start_time = None self._popen = None @@ -408,8 +409,7 @@ def wait_stopped(self, start_time: float) -> None: if not self.is_alive(): break dt = time.monotonic() - start_time - self.regrtest.log(f"Waiting for {self} thread " - f"for {format_duration(dt)}") + self.log(f"Waiting for {self} thread for {format_duration(dt)}") if dt > JOIN_TIMEOUT: print_warning(f"Failed to join {self} in {format_duration(dt)}") break @@ -432,8 +432,9 @@ def get_running(workers: list[WorkerThread]) -> list[str]: class RunWorkers: def __init__(self, regrtest: Regrtest, runtests: RunTests, num_workers: int) -> None: - self.regrtest = regrtest + self.results: TestResults = regrtest.results self.log = regrtest.log + self.display_progress = regrtest.display_progress self.num_workers = num_workers self.runtests = runtests self.output: queue.Queue[QueueOutput] = queue.Queue() @@ -511,23 +512,22 @@ def display_result(self, mp_result: MultiprocessResult) -> None: running = get_running(self.workers) if running: text += f' -- {running}' - self.regrtest.display_progress(self.test_index, text) + self.display_progress(self.test_index, text) def _process_result(self, item: QueueOutput) -> bool: """Returns True if test runner must stop.""" - rerun = self.runtests.rerun if item[0]: # Thread got an exception format_exc = item[1] print_warning(f"regrtest worker thread failed: {format_exc}") result = TestResult("", state=State.MULTIPROCESSING_ERROR) - self.regrtest.accumulate_result(result, rerun=rerun) + self.results.accumulate_result(result, self.runtests) return result self.test_index += 1 mp_result = item[1] result = mp_result.result - self.regrtest.accumulate_result(result, rerun=rerun) + self.results.accumulate_result(result, self.runtests) self.display_result(mp_result) if mp_result.worker_stdout: @@ -553,7 +553,7 @@ def run(self) -> None: break except KeyboardInterrupt: print() - self.regrtest.interrupted = True + self.results.interrupted = True finally: if self.timeout is not None: faulthandler.cancel_dump_traceback_later() From 0eab2427b149cd46e0dee3efbb6b2cfca2a4f723 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 10 Sep 2023 05:04:26 +0200 Subject: [PATCH 131/357] gh-109162: libregrtest: add Logger class (#109212) * Add Logger class in a new logger.py file. * Move Regrtest attributes to Logger: * start_time * test_count_text * test_count_width * win_load_tracker * Move Regrtest method to Logger: * log() * getloadavg(): rename to get_load_avg() * set_tests() * Add methods to the Logger class: * start_load_tracker() * stop_load_tracker() --- Lib/test/libregrtest/logger.py | 69 ++++++++++++++ Lib/test/libregrtest/main.py | 148 ++++++++++------------------- Lib/test/libregrtest/runtest_mp.py | 2 +- Lib/test/libregrtest/utils.py | 3 + 4 files changed, 123 insertions(+), 99 deletions(-) create mode 100644 Lib/test/libregrtest/logger.py diff --git a/Lib/test/libregrtest/logger.py b/Lib/test/libregrtest/logger.py new file mode 100644 index 00000000000000..c4498a43545545 --- /dev/null +++ b/Lib/test/libregrtest/logger.py @@ -0,0 +1,69 @@ +import os +import time + +from test.libregrtest.runtest import RunTests +from test.libregrtest.utils import print_warning, MS_WINDOWS + +if MS_WINDOWS: + from test.libregrtest.win_utils import WindowsLoadTracker + + +class Logger: + def __init__(self): + self.start_time = time.perf_counter() + self.test_count_text = '' + self.test_count_width = 3 + self.win_load_tracker = None + + def log(self, line: str = '') -> None: + empty = not line + + # add the system load prefix: "load avg: 1.80 " + load_avg = self.get_load_avg() + if load_avg is not None: + line = f"load avg: {load_avg:.2f} {line}" + + # add the timestamp prefix: "0:01:05 " + test_time = time.perf_counter() - self.start_time + + mins, secs = divmod(int(test_time), 60) + hours, mins = divmod(mins, 60) + test_time = "%d:%02d:%02d" % (hours, mins, secs) + + line = f"{test_time} {line}" + if empty: + line = line[:-1] + + print(line, flush=True) + + def get_load_avg(self) -> float | None: + if hasattr(os, 'getloadavg'): + return os.getloadavg()[0] + if self.win_load_tracker is not None: + return self.win_load_tracker.getloadavg() + return None + + def set_tests(self, runtests: RunTests) -> None: + if runtests.forever: + self.test_count_text = '' + self.test_count_width = 3 + else: + self.test_count_text = '/{}'.format(len(runtests.tests)) + self.test_count_width = len(self.test_count_text) - 1 + + def start_load_tracker(self) -> None: + if not MS_WINDOWS: + return + + try: + self.win_load_tracker = WindowsLoadTracker() + except PermissionError as error: + # Standard accounts may not have access to the performance + # counters. + print_warning(f'Failed to create WindowsLoadTracker: {error}') + + def stop_load_tracker(self) -> None: + if self.win_load_tracker is None: + return + self.win_load_tracker.close() + self.win_load_tracker = None diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 75c3d0e8350ade..74ef69b7c65307 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -10,6 +10,7 @@ import time import unittest from test.libregrtest.cmdline import _parse_args, Namespace +from test.libregrtest.logger import Logger from test.libregrtest.runtest import ( findtests, split_test_packages, run_single_test, abs_module_name, PROGRESS_MIN_TIME, State, RunTests, HuntRefleak, @@ -54,6 +55,8 @@ class Regrtest: on the command line. """ def __init__(self, ns: Namespace): + self.logger = Logger() + # Actions self.want_header: bool = ns.header self.want_list_tests: bool = ns.list_tests @@ -137,29 +140,8 @@ def __init__(self, ns: Namespace): self.next_single_test: TestName | None = None self.next_single_filename: StrPath | None = None - # misc - self.win_load_tracker = None - def log(self, line=''): - empty = not line - - # add the system load prefix: "load avg: 1.80 " - load_avg = self.getloadavg() - if load_avg is not None: - line = f"load avg: {load_avg:.2f} {line}" - - # add the timestamp prefix: "0:01:05 " - test_time = time.perf_counter() - self.start_time - - mins, secs = divmod(int(test_time), 60) - hours, mins = divmod(mins, 60) - test_time = "%d:%02d:%02d" % (hours, mins, secs) - - line = f"{test_time} {line}" - if empty: - line = line[:-1] - - print(line, flush=True) + self.logger.log(line) def display_progress(self, test_index, text): if self.quiet: @@ -293,7 +275,7 @@ def _rerun_failed_tests(self, runtests: RunTests): fail_fast=False, match_tests_dict=match_tests_dict, output_on_failure=False) - self.set_tests(runtests) + self.logger.set_tests(runtests) self._run_tests_mp(runtests, self.num_workers) return runtests @@ -437,44 +419,7 @@ def get_state(self): def _run_tests_mp(self, runtests: RunTests, num_workers: int) -> None: from test.libregrtest.runtest_mp import RunWorkers - - # If we're on windows and this is the parent runner (not a worker), - # track the load average. - if sys.platform == 'win32': - from test.libregrtest.win_utils import WindowsLoadTracker - - try: - self.win_load_tracker = WindowsLoadTracker() - except PermissionError as error: - # Standard accounts may not have access to the performance - # counters. - print(f'Failed to create WindowsLoadTracker: {error}') - - try: - RunWorkers(self, runtests, num_workers).run() - finally: - if self.win_load_tracker is not None: - self.win_load_tracker.close() - self.win_load_tracker = None - - def set_tests(self, runtests: RunTests): - self.tests = runtests.tests - if runtests.forever: - self.test_count_text = '' - self.test_count_width = 3 - else: - self.test_count_text = '/{}'.format(len(self.tests)) - self.test_count_width = len(self.test_count_text) - 1 - - def run_tests(self, runtests: RunTests): - self.first_runtests = runtests - self.set_tests(runtests) - if self.num_workers: - self._run_tests_mp(runtests, self.num_workers) - tracer = None - else: - tracer = self.run_tests_sequentially(runtests) - return tracer + RunWorkers(self, runtests, num_workers).run() def finalize_tests(self, tracer): if self.next_single_filename: @@ -496,7 +441,7 @@ def finalize_tests(self, tracer): self.results.write_junit(self.junit_filename) def display_summary(self): - duration = time.perf_counter() - self.start_time + duration = time.perf_counter() - self.logger.start_time filtered = bool(self.match_tests) or bool(self.ignore_tests) # Total duration @@ -619,35 +564,8 @@ def main(self, tests: TestList | None = None): sys.exit(exc.code) - def getloadavg(self): - if self.win_load_tracker is not None: - return self.win_load_tracker.getloadavg() - - if hasattr(os, 'getloadavg'): - return os.getloadavg()[0] - - return None - - def action_run_tests(self): - if self.hunt_refleak and self.hunt_refleak.warmups < 3: - msg = ("WARNING: Running tests with --huntrleaks/-R and " - "less than 3 warmup repetitions can give false positives!") - print(msg, file=sys.stdout, flush=True) - - # For a partial run, we do not need to clutter the output. - if (self.want_header - or not(self.pgo or self.quiet or self.single_test_run - or self.tests or self.cmdline_args)): - self.display_header() - - if self.randomize: - print("Using random seed", self.random_seed) - - if self.num_workers < 0: - # Use all cores + extras for tests that like to sleep - self.num_workers = 2 + (os.cpu_count() or 1) - - runtests = RunTests( + def create_run_tests(self): + return RunTests( tuple(self.selected), fail_fast=self.fail_fast, match_tests=self.match_tests, @@ -668,17 +586,53 @@ def action_run_tests(self): python_cmd=self.python_cmd, ) + def run_tests(self) -> int: + if self.hunt_refleak and self.hunt_refleak.warmups < 3: + msg = ("WARNING: Running tests with --huntrleaks/-R and " + "less than 3 warmup repetitions can give false positives!") + print(msg, file=sys.stdout, flush=True) + + if self.num_workers < 0: + # Use all CPUs + 2 extra worker processes for tests + # that like to sleep + self.num_workers = (os.cpu_count() or 1) + 2 + + # For a partial run, we do not need to clutter the output. + if (self.want_header + or not(self.pgo or self.quiet or self.single_test_run + or self.tests or self.cmdline_args)): + self.display_header() + + if self.randomize: + print("Using random seed", self.random_seed) + + runtests = self.create_run_tests() + self.first_runtests = runtests + self.logger.set_tests(runtests) + setup_tests(runtests) - tracer = self.run_tests(runtests) - self.display_result(runtests) + self.logger.start_load_tracker() + try: + if self.num_workers: + self._run_tests_mp(runtests, self.num_workers) + tracer = None + else: + tracer = self.run_tests_sequentially(runtests) - if self.want_rerun and self.results.need_rerun(): - self.rerun_failed_tests(runtests) + self.display_result(runtests) + + if self.want_rerun and self.results.need_rerun(): + self.rerun_failed_tests(runtests) + finally: + self.logger.stop_load_tracker() self.display_summary() self.finalize_tests(tracer) + return self.results.get_exitcode(self.fail_env_changed, + self.fail_rerun) + def _main(self): if self.is_worker(): from test.libregrtest.runtest_mp import worker_process @@ -697,9 +651,7 @@ def _main(self): elif self.want_list_cases: self.list_cases() else: - self.action_run_tests() - exitcode = self.results.get_exitcode(self.fail_env_changed, - self.fail_rerun) + exitcode = self.run_tests() sys.exit(exitcode) diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index 179b6104a8f79a..c4cffff57b14c4 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -433,7 +433,7 @@ def get_running(workers: list[WorkerThread]) -> list[str]: class RunWorkers: def __init__(self, regrtest: Regrtest, runtests: RunTests, num_workers: int) -> None: self.results: TestResults = regrtest.results - self.log = regrtest.log + self.log = regrtest.logger.log self.display_progress = regrtest.display_progress self.num_workers = num_workers self.runtests = runtests diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 9a60a3d40b4c2c..57d85432bbfc95 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -6,6 +6,9 @@ from test import support +MS_WINDOWS = (sys.platform == 'win32') + + def format_duration(seconds): ms = math.ceil(seconds * 1e3) seconds, ms = divmod(ms, 1000) From 92578919a60ebe2b8d6d42377f1e27479c156d65 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 10 Sep 2023 08:09:25 +0300 Subject: [PATCH 132/357] gh-109174: Add support of SimpleNamespace in copy.replace() (GH-109175) --- Doc/library/types.rst | 2 ++ Lib/test/test_types.py | 27 ++++++++++++++++++ ...-09-09-09-05-41.gh-issue-109174.OJea5s.rst | 1 + Objects/namespaceobject.c | 28 +++++++++++++++++++ 4 files changed, 58 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2023-09-09-09-05-41.gh-issue-109174.OJea5s.rst diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 82300afef0641e..875916be1049a3 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -504,6 +504,8 @@ Additional Utility Classes and Functions However, for a structured record type use :func:`~collections.namedtuple` instead. + :class:`!SimpleNamespace` objects are supported by :func:`copy.replace`. + .. versionadded:: 3.3 .. versionchanged:: 3.9 diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index f2efee90dc0240..c6bff79f903828 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -1900,6 +1900,33 @@ def test_pickle(self): self.assertEqual(ns, ns_roundtrip, pname) + def test_replace(self): + ns = types.SimpleNamespace(x=11, y=22) + + ns2 = copy.replace(ns) + self.assertEqual(ns2, ns) + self.assertIsNot(ns2, ns) + self.assertIs(type(ns2), types.SimpleNamespace) + self.assertEqual(vars(ns2), {'x': 11, 'y': 22}) + ns2.x = 3 + self.assertEqual(ns.x, 11) + ns.x = 4 + self.assertEqual(ns2.x, 3) + + self.assertEqual(vars(copy.replace(ns, x=1)), {'x': 1, 'y': 22}) + self.assertEqual(vars(copy.replace(ns, y=2)), {'x': 4, 'y': 2}) + self.assertEqual(vars(copy.replace(ns, x=1, y=2)), {'x': 1, 'y': 2}) + + def test_replace_subclass(self): + class Spam(types.SimpleNamespace): + pass + + spam = Spam(ham=8, eggs=9) + spam2 = copy.replace(spam, ham=5) + + self.assertIs(type(spam2), Spam) + self.assertEqual(vars(spam2), {'ham': 5, 'eggs': 9}) + def test_fake_namespace_compare(self): # Issue #24257: Incorrect use of PyObject_IsInstance() caused # SystemError. diff --git a/Misc/NEWS.d/next/Library/2023-09-09-09-05-41.gh-issue-109174.OJea5s.rst b/Misc/NEWS.d/next/Library/2023-09-09-09-05-41.gh-issue-109174.OJea5s.rst new file mode 100644 index 00000000000000..63461fac3b96f7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-09-09-05-41.gh-issue-109174.OJea5s.rst @@ -0,0 +1 @@ +Add support of :class:`types.SimpleNamespace` in :func:`copy.replace`. diff --git a/Objects/namespaceobject.c b/Objects/namespaceobject.c index 11cf859add3ab8..204c114fd9de2d 100644 --- a/Objects/namespaceobject.c +++ b/Objects/namespaceobject.c @@ -189,9 +189,37 @@ namespace_reduce(_PyNamespaceObject *ns, PyObject *Py_UNUSED(ignored)) } +static PyObject * +namespace_replace(PyObject *self, PyObject *args, PyObject *kwargs) +{ + if (!_PyArg_NoPositional("__replace__", args)) { + return NULL; + } + + PyObject *result = PyObject_CallNoArgs((PyObject *)Py_TYPE(self)); + if (!result) { + return NULL; + } + if (PyDict_Update(((_PyNamespaceObject*)result)->ns_dict, + ((_PyNamespaceObject*)self)->ns_dict) < 0) + { + Py_DECREF(result); + return NULL; + } + if (kwargs) { + if (PyDict_Update(((_PyNamespaceObject*)result)->ns_dict, kwargs) < 0) { + Py_DECREF(result); + return NULL; + } + } + return result; +} + + static PyMethodDef namespace_methods[] = { {"__reduce__", (PyCFunction)namespace_reduce, METH_NOARGS, namespace_reduce__doc__}, + {"__replace__", _PyCFunction_CAST(namespace_replace), METH_VARARGS|METH_KEYWORDS, NULL}, {NULL, NULL} // sentinel }; From 85a5d3dbe19249ba8d414d63328ae84241a35528 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Sun, 10 Sep 2023 09:06:08 +0200 Subject: [PATCH 133/357] gh-93627: Align Python implementation of pickle with C implementation of pickle (GH-103035) If a method like __reduce_ex_ or __reduce__ is set to None, a TypeError is raised. --- Lib/pickle.py | 22 +++---- Lib/test/pickletester.py | 59 +++++++++++++++++++ ...3-03-26-19-11-10.gh-issue-93627.0UgwBL.rst | 1 + 3 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-26-19-11-10.gh-issue-93627.0UgwBL.rst diff --git a/Lib/pickle.py b/Lib/pickle.py index fe86f80f51d3b9..4f5ad5b71e8899 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -396,6 +396,8 @@ def decode_long(data): return int.from_bytes(data, byteorder='little', signed=True) +_NoValue = object() + # Pickling machinery class _Pickler: @@ -542,8 +544,8 @@ def save(self, obj, save_persistent_id=True): return rv = NotImplemented - reduce = getattr(self, "reducer_override", None) - if reduce is not None: + reduce = getattr(self, "reducer_override", _NoValue) + if reduce is not _NoValue: rv = reduce(obj) if rv is NotImplemented: @@ -556,8 +558,8 @@ def save(self, obj, save_persistent_id=True): # 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: + reduce = getattr(self, 'dispatch_table', dispatch_table).get(t, _NoValue) + if reduce is not _NoValue: rv = reduce(obj) else: # Check for a class with a custom metaclass; treat as regular @@ -567,12 +569,12 @@ def save(self, obj, save_persistent_id=True): return # Check for a __reduce_ex__ method, fall back to __reduce__ - reduce = getattr(obj, "__reduce_ex__", None) - if reduce is not None: + reduce = getattr(obj, "__reduce_ex__", _NoValue) + if reduce is not _NoValue: rv = reduce(self.proto) else: - reduce = getattr(obj, "__reduce__", None) - if reduce is not None: + reduce = getattr(obj, "__reduce__", _NoValue) + if reduce is not _NoValue: rv = reduce() else: raise PicklingError("Can't pickle %r object: %r" % @@ -1705,8 +1707,8 @@ def load_build(self): stack = self.stack state = stack.pop() inst = stack[-1] - setstate = getattr(inst, "__setstate__", None) - if setstate is not None: + setstate = getattr(inst, "__setstate__", _NoValue) + if setstate is not _NoValue: setstate(state) return slotstate = None diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index a687fe0629080a..ddb180ef5ef825 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -2408,6 +2408,22 @@ def test_reduce_calls_base(self): y = self.loads(s) self.assertEqual(y._reduce_called, 1) + def test_reduce_ex_None(self): + c = REX_None() + with self.assertRaises(TypeError): + self.dumps(c) + + def test_reduce_None(self): + c = R_None() + with self.assertRaises(TypeError): + self.dumps(c) + + def test_pickle_setstate_None(self): + c = C_None_setstate() + p = self.dumps(c) + with self.assertRaises(TypeError): + self.loads(p) + @no_tracing def test_bad_getattr(self): # Issue #3514: crash when there is an infinite loop in __getattr__ @@ -3349,6 +3365,21 @@ def __setstate__(self, state): def __reduce__(self): return type(self), (), self.state +class REX_None: + """ Setting __reduce_ex__ to None should fail """ + __reduce_ex__ = None + +class R_None: + """ Setting __reduce__ to None should fail """ + __reduce__ = None + +class C_None_setstate: + """ Setting __setstate__ to None should fail """ + def __getstate__(self): + return 1 + + __setstate__ = None + # Test classes for newobj @@ -3752,6 +3783,25 @@ def test_unpickling_buffering_readline(self): unpickler = self.unpickler_class(f) self.assertEqual(unpickler.load(), data) + def test_pickle_invalid_reducer_override(self): + # gh-103035 + obj = object() + + f = io.BytesIO() + class MyPickler(self.pickler_class): + pass + pickler = MyPickler(f) + pickler.dump(obj) + + pickler.clear_memo() + pickler.reducer_override = None + with self.assertRaises(TypeError): + pickler.dump(obj) + + pickler.clear_memo() + pickler.reducer_override = 10 + with self.assertRaises(TypeError): + pickler.dump(obj) # Tests for dispatch_table attribute @@ -3914,6 +3964,15 @@ def dumps(obj, protocol=None): self._test_dispatch_table(dumps, dt) + def test_dispatch_table_None_item(self): + # gh-93627 + obj = object() + f = io.BytesIO() + pickler = self.pickler_class(f) + pickler.dispatch_table = {type(obj): None} + with self.assertRaises(TypeError): + pickler.dump(obj) + def _test_dispatch_table(self, dumps, dispatch_table): def custom_load_dump(obj): return pickle.loads(dumps(obj, 0)) diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-26-19-11-10.gh-issue-93627.0UgwBL.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-26-19-11-10.gh-issue-93627.0UgwBL.rst new file mode 100644 index 00000000000000..854da44b560b21 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-03-26-19-11-10.gh-issue-93627.0UgwBL.rst @@ -0,0 +1 @@ +Update the Python pickle module implementation to match the C implementation of the pickle module. For objects setting reduction methods like :meth:`~object.__reduce_ex__` or :meth:`~object.__reduce__` to ``None``, pickling will result in a :exc:`TypeError`. From 2dd6a86c4ee604b331ed739c2508b0d0114993c6 Mon Sep 17 00:00:00 2001 From: Delgan <4193924+Delgan@users.noreply.github.com> Date: Sun, 10 Sep 2023 12:55:56 +0200 Subject: [PATCH 134/357] Fix "FSTRING_MIDDLE" typo in py312 "What's New" (#109222) --- Doc/whatsnew/3.12.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index bdccbe1012c9e2..a46c913c4997ba 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -1599,7 +1599,7 @@ Changes in the Python API functions is now changed due to the changes introduced in :pep:`701`. This means that ``STRING`` tokens are not emitted any more for f-strings and the tokens described in :pep:`701` are now produced instead: ``FSTRING_START``, - ``FSRING_MIDDLE`` and ``FSTRING_END`` are now emitted for f-string "string" + ``FSTRING_MIDDLE`` and ``FSTRING_END`` are now emitted for f-string "string" parts in addition to the appropriate tokens for the tokenization in the expression components. For example for the f-string ``f"start {1+1} end"`` the old version of the tokenizer emitted:: From 429749969621b149c1a7c3c004bd44f52bec8f44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91line?= <31395137+yunline@users.noreply.github.com> Date: Sun, 10 Sep 2023 20:04:24 +0800 Subject: [PATCH 135/357] gh-109207: Fix SystemError when printing symtable entry object. (GH-109225) --- Lib/test/test_symtable.py | 4 ++++ .../2023-09-10-18-53-55.gh-issue-109207.Fei8bY.rst | 1 + Python/symtable.c | 5 ++--- 3 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-10-18-53-55.gh-issue-109207.Fei8bY.rst diff --git a/Lib/test/test_symtable.py b/Lib/test/test_symtable.py index 25714aecda3a15..36cb7b3f242e4c 100644 --- a/Lib/test/test_symtable.py +++ b/Lib/test/test_symtable.py @@ -251,6 +251,10 @@ def test_symtable_repr(self): self.assertEqual(str(self.top), "") self.assertEqual(str(self.spam), "") + def test_symtable_entry_repr(self): + expected = f"" + self.assertEqual(repr(self.top._table), expected) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-10-18-53-55.gh-issue-109207.Fei8bY.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-10-18-53-55.gh-issue-109207.Fei8bY.rst new file mode 100644 index 00000000000000..f9da3ac4d1abbd --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-10-18-53-55.gh-issue-109207.Fei8bY.rst @@ -0,0 +1 @@ +Fix a SystemError in ``__repr__`` of symtable entry object. diff --git a/Python/symtable.c b/Python/symtable.c index 7eef6f7231c035..6c28b49a0655c6 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -150,9 +150,8 @@ ste_new(struct symtable *st, identifier name, _Py_block_ty block, static PyObject * ste_repr(PySTEntryObject *ste) { - return PyUnicode_FromFormat("", - ste->ste_name, - PyLong_AS_LONG(ste->ste_id), ste->ste_lineno); + return PyUnicode_FromFormat("", + ste->ste_name, ste->ste_id, ste->ste_lineno); } static void From 71b6e2602c0b5b06d51855f179cdb30094a67968 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 10 Sep 2023 18:21:13 +0200 Subject: [PATCH 136/357] gh-109054: Don't use libatomic on cross-compilation (#109211) configure no longer uses libatomic by default when Python is cross-compiled. The LIBATOMIC variable can be set manually in this case: ./configure LIBATOMIC="-latomic" (...) --- configure | 7 ++----- configure.ac | 7 ++++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/configure b/configure index c78c45d11260f6..8326a1db06c2da 100755 --- a/configure +++ b/configure @@ -27774,7 +27774,7 @@ then : else $as_nop if test "$cross_compiling" = yes then : - ac_cv_libatomic_needed=yes + ac_cv_libatomic_needed=no else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -27811,17 +27811,14 @@ int main() _ACEOF if ac_fn_c_try_run "$LINENO" then : - ac_cv_libatomic_needed=no - else $as_nop - ac_cv_libatomic_needed=yes + ac_cv_libatomic_needed=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi - fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libatomic_needed" >&5 printf "%s\n" "$ac_cv_libatomic_needed" >&6; } diff --git a/configure.ac b/configure.ac index f833755a466012..843f2b267a5253 100644 --- a/configure.ac +++ b/configure.ac @@ -7007,9 +7007,10 @@ int main() } return 0; // all good } -]])],[ - ac_cv_libatomic_needed=no -],[ac_cv_libatomic_needed=yes],[ac_cv_libatomic_needed=yes]) +]])], + [ac_cv_libatomic_needed=no], dnl build succeeded + [ac_cv_libatomic_needed=yes], dnl build failed + [ac_cv_libatomic_needed=no]) dnl cross compilation ]) AS_VAR_IF([ac_cv_libatomic_needed], [yes], From d6892c2b9263b39ea1c7905667942914b6a24b2c Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 10 Sep 2023 20:06:09 +0300 Subject: [PATCH 137/357] gh-50644: Forbid pickling of codecs streams (GH-109180) Attempts to pickle or create a shallow or deep copy of codecs streams now raise a TypeError. Previously, copying failed with a RecursionError, while pickling produced wrong results that eventually caused unpickling to fail with a RecursionError. --- Lib/codecs.py | 12 +++ Lib/test/test_codecs.py | 79 +++++++++++++++++++ ...3-09-09-15-08-37.gh-issue-50644.JUAZOh.rst | 4 + 3 files changed, 95 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2023-09-09-15-08-37.gh-issue-50644.JUAZOh.rst diff --git a/Lib/codecs.py b/Lib/codecs.py index c1c55d8afef389..82f23983e719c2 100644 --- a/Lib/codecs.py +++ b/Lib/codecs.py @@ -414,6 +414,9 @@ def __enter__(self): def __exit__(self, type, value, tb): self.stream.close() + def __reduce_ex__(self, proto): + raise TypeError("can't serialize %s" % self.__class__.__name__) + ### class StreamReader(Codec): @@ -663,6 +666,9 @@ def __enter__(self): def __exit__(self, type, value, tb): self.stream.close() + def __reduce_ex__(self, proto): + raise TypeError("can't serialize %s" % self.__class__.__name__) + ### class StreamReaderWriter: @@ -750,6 +756,9 @@ def __enter__(self): def __exit__(self, type, value, tb): self.stream.close() + def __reduce_ex__(self, proto): + raise TypeError("can't serialize %s" % self.__class__.__name__) + ### class StreamRecoder: @@ -866,6 +875,9 @@ def __enter__(self): def __exit__(self, type, value, tb): self.stream.close() + def __reduce_ex__(self, proto): + raise TypeError("can't serialize %s" % self.__class__.__name__) + ### Shortcuts def open(filename, mode='r', encoding=None, errors='strict', buffering=-1): diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 91d7eaf997ae20..b5e9271ac0c3cd 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -1,7 +1,9 @@ import codecs import contextlib +import copy import io import locale +import pickle import sys import unittest import encodings @@ -1771,6 +1773,61 @@ def test_readlines(self): f = self.reader(self.stream) self.assertEqual(f.readlines(), ['\ud55c\n', '\uae00']) + def test_copy(self): + f = self.reader(Queue(b'\xed\x95\x9c\n\xea\xb8\x80')) + with self.assertRaisesRegex(TypeError, 'StreamReader'): + copy.copy(f) + with self.assertRaisesRegex(TypeError, 'StreamReader'): + copy.deepcopy(f) + + def test_pickle(self): + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(protocol=proto): + f = self.reader(Queue(b'\xed\x95\x9c\n\xea\xb8\x80')) + with self.assertRaisesRegex(TypeError, 'StreamReader'): + pickle.dumps(f, proto) + + +class StreamWriterTest(unittest.TestCase): + + def setUp(self): + self.writer = codecs.getwriter('utf-8') + + def test_copy(self): + f = self.writer(Queue(b'')) + with self.assertRaisesRegex(TypeError, 'StreamWriter'): + copy.copy(f) + with self.assertRaisesRegex(TypeError, 'StreamWriter'): + copy.deepcopy(f) + + def test_pickle(self): + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(protocol=proto): + f = self.writer(Queue(b'')) + with self.assertRaisesRegex(TypeError, 'StreamWriter'): + pickle.dumps(f, proto) + + +class StreamReaderWriterTest(unittest.TestCase): + + def setUp(self): + self.reader = codecs.getreader('latin1') + self.writer = codecs.getwriter('utf-8') + + def test_copy(self): + f = codecs.StreamReaderWriter(Queue(b''), self.reader, self.writer) + with self.assertRaisesRegex(TypeError, 'StreamReaderWriter'): + copy.copy(f) + with self.assertRaisesRegex(TypeError, 'StreamReaderWriter'): + copy.deepcopy(f) + + def test_pickle(self): + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(protocol=proto): + f = codecs.StreamReaderWriter(Queue(b''), self.reader, self.writer) + with self.assertRaisesRegex(TypeError, 'StreamReaderWriter'): + pickle.dumps(f, proto) + class EncodedFileTest(unittest.TestCase): @@ -3346,6 +3403,28 @@ def test_seeking_write(self): self.assertEqual(sr.readline(), b'abc\n') self.assertEqual(sr.readline(), b'789\n') + def test_copy(self): + bio = io.BytesIO() + codec = codecs.lookup('ascii') + sr = codecs.StreamRecoder(bio, codec.encode, codec.decode, + encodings.ascii.StreamReader, encodings.ascii.StreamWriter) + + with self.assertRaisesRegex(TypeError, 'StreamRecoder'): + copy.copy(sr) + with self.assertRaisesRegex(TypeError, 'StreamRecoder'): + copy.deepcopy(sr) + + def test_pickle(self): + q = Queue(b'') + codec = codecs.lookup('ascii') + sr = codecs.StreamRecoder(q, codec.encode, codec.decode, + encodings.ascii.StreamReader, encodings.ascii.StreamWriter) + + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(protocol=proto): + with self.assertRaisesRegex(TypeError, 'StreamRecoder'): + pickle.dumps(sr, proto) + @unittest.skipIf(_testinternalcapi is None, 'need _testinternalcapi module') class LocaleCodecTest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2023-09-09-15-08-37.gh-issue-50644.JUAZOh.rst b/Misc/NEWS.d/next/Library/2023-09-09-15-08-37.gh-issue-50644.JUAZOh.rst new file mode 100644 index 00000000000000..a7a442e35289d3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-09-15-08-37.gh-issue-50644.JUAZOh.rst @@ -0,0 +1,4 @@ +Attempts to pickle or create a shallow or deep copy of :mod:`codecs` streams +now raise a TypeError. Previously, copying failed with a RecursionError, +while pickling produced wrong results that eventually caused unpickling +to fail with a RecursionError. From cbb3a6f8ada3d133c3ab9f9465b65067fce5bb42 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 11 Sep 2023 00:04:35 +0200 Subject: [PATCH 138/357] gh-109237: Fix test_site for non-ASCII working directory (#109238) Fix test_site.test_underpth_basic() when the working directory contains at least one non-ASCII character: encode the "._pth" file to UTF-8 and enable the UTF-8 Mode to use UTF-8 for the child process stdout. --- Lib/test/test_site.py | 4 ++-- .../next/Tests/2023-09-10-22-32-20.gh-issue-109237.SvgKwD.rst | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-10-22-32-20.gh-issue-109237.SvgKwD.rst diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 20a96169e8be4e..e8ec3b35881fec 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -576,7 +576,7 @@ def _create_underpth_exe(self, lines, exe_pth=True): _pth_file = os.path.splitext(exe_file)[0] + '._pth' else: _pth_file = os.path.splitext(dll_file)[0] + '._pth' - with open(_pth_file, 'w') as f: + with open(_pth_file, 'w', encoding='utf8') as f: for line in lines: print(line, file=f) return exe_file @@ -613,7 +613,7 @@ def test_underpth_basic(self): os.path.dirname(exe_file), pth_lines) - output = subprocess.check_output([exe_file, '-c', + output = subprocess.check_output([exe_file, '-X', 'utf8', '-c', 'import sys; print("\\n".join(sys.path) if sys.flags.no_site else "")' ], encoding='utf-8', errors='surrogateescape') actual_sys_path = output.rstrip().split('\n') diff --git a/Misc/NEWS.d/next/Tests/2023-09-10-22-32-20.gh-issue-109237.SvgKwD.rst b/Misc/NEWS.d/next/Tests/2023-09-10-22-32-20.gh-issue-109237.SvgKwD.rst new file mode 100644 index 00000000000000..1d762bbe1d2592 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-10-22-32-20.gh-issue-109237.SvgKwD.rst @@ -0,0 +1,4 @@ +Fix ``test_site.test_underpth_basic()`` when the working directory contains +at least one non-ASCII character: encode the ``._pth`` file to UTF-8 and +enable the UTF-8 Mode to use UTF-8 for the child process stdout. Patch by +Victor Stinner. From e55aab95786e0e9fb36a9a1122d2d0fb3d2403cd Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 11 Sep 2023 00:16:59 +0200 Subject: [PATCH 139/357] gh-109230: test_pyexpat no longer depends on the current directory (#109233) Fix test_pyexpat.test_exception(): it can now be run from a directory different than Python source code directory. Before, the test failed in this case. Skip the test if Modules/pyexpat.c source is not available. Skip also the test on Python implementations other than CPython. --- Lib/test/test_pyexpat.py | 72 ++++++++++++------- ...-09-10-19-59-57.gh-issue-109230.SRNLFQ.rst | 5 ++ 2 files changed, 53 insertions(+), 24 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-10-19-59-57.gh-issue-109230.SRNLFQ.rst diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py index abe1ad517d2246..41f4d172f8d057 100644 --- a/Lib/test/test_pyexpat.py +++ b/Lib/test/test_pyexpat.py @@ -1,13 +1,15 @@ # XXX TypeErrors on calling handlers, or on bad return values from a # handler, are obscure and unhelpful. -from io import BytesIO import os import platform import sys import sysconfig import unittest import traceback +from io import BytesIO +from test import support +from test.support import os_helper from xml.parsers import expat from xml.parsers.expat import errors @@ -439,37 +441,59 @@ def test7(self): # Test handling of exception from callback: class HandlerExceptionTest(unittest.TestCase): def StartElementHandler(self, name, attrs): - raise RuntimeError(name) + raise RuntimeError(f'StartElementHandler: <{name}>') def check_traceback_entry(self, entry, filename, funcname): - self.assertEqual(os.path.basename(entry[0]), filename) - self.assertEqual(entry[2], funcname) + self.assertEqual(os.path.basename(entry.filename), filename) + self.assertEqual(entry.name, funcname) + @support.cpython_only def test_exception(self): + # gh-66652: test _PyTraceback_Add() used by pyexpat.c to inject frames + + # Change the current directory to the Python source code directory + # if it is available. + src_dir = sysconfig.get_config_var('abs_builddir') + if src_dir: + have_source = os.path.isdir(src_dir) + else: + have_source = False + if have_source: + with os_helper.change_cwd(src_dir): + self._test_exception(have_source) + else: + self._test_exception(have_source) + + def _test_exception(self, have_source): + # Use path relative to the current directory which should be the Python + # source code directory (if it is available). + PYEXPAT_C = os.path.join('Modules', 'pyexpat.c') + parser = expat.ParserCreate() parser.StartElementHandler = self.StartElementHandler try: parser.Parse(b"", True) - self.fail() - except RuntimeError as e: - self.assertEqual(e.args[0], 'a', - "Expected RuntimeError for element 'a', but" + \ - " found %r" % e.args[0]) - # Check that the traceback contains the relevant line in pyexpat.c - entries = traceback.extract_tb(e.__traceback__) - self.assertEqual(len(entries), 3) - self.check_traceback_entry(entries[0], - "test_pyexpat.py", "test_exception") - self.check_traceback_entry(entries[1], - "pyexpat.c", "StartElement") - self.check_traceback_entry(entries[2], - "test_pyexpat.py", "StartElementHandler") - if (sysconfig.is_python_build() - and not (sys.platform == 'win32' and platform.machine() == 'ARM') - and not is_emscripten - and not is_wasi - ): - self.assertIn('call_with_frame("StartElement"', entries[1][3]) + + self.fail("the parser did not raise RuntimeError") + except RuntimeError as exc: + self.assertEqual(exc.args[0], 'StartElementHandler: ', exc) + entries = traceback.extract_tb(exc.__traceback__) + + self.assertEqual(len(entries), 3, entries) + self.check_traceback_entry(entries[0], + "test_pyexpat.py", "_test_exception") + self.check_traceback_entry(entries[1], + os.path.basename(PYEXPAT_C), + "StartElement") + self.check_traceback_entry(entries[2], + "test_pyexpat.py", "StartElementHandler") + + # Check that the traceback contains the relevant line in + # Modules/pyexpat.c. Skip the test if Modules/pyexpat.c is not + # available. + if have_source and os.path.exists(PYEXPAT_C): + self.assertIn('call_with_frame("StartElement"', + entries[1].line) # Test Current* members: diff --git a/Misc/NEWS.d/next/Tests/2023-09-10-19-59-57.gh-issue-109230.SRNLFQ.rst b/Misc/NEWS.d/next/Tests/2023-09-10-19-59-57.gh-issue-109230.SRNLFQ.rst new file mode 100644 index 00000000000000..18e1e85242005a --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-10-19-59-57.gh-issue-109230.SRNLFQ.rst @@ -0,0 +1,5 @@ +Fix ``test_pyexpat.test_exception()``: it can now be run from a directory +different than Python source code directory. Before, the test failed in this +case. Skip the test if Modules/pyexpat.c source is not available. Skip also +the test on Python implementations other than CPython. Patch by Victor +Stinner. From a939b65aa63e2cae1eec7d27e1dc56324aee01d7 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 11 Sep 2023 01:11:22 +0200 Subject: [PATCH 140/357] gh-109162: libregrtest: add worker.py (#109229) Add new worker.py file: * Move create_worker_process() and worker_process() to this file. * Add main() function to worker.py. create_worker_process() now runs the command: "python -m test.libregrtest.worker JSON". * create_worker_process() now starts the worker process in the current working directory. Regrtest now gets the absolute path of the reflog.txt filename: -R command line option filename. * Remove --worker-json command line option. Remove test_regrtest.test_worker_json(). Related changes: * Add write_json() and from_json() methods to TestResult. * Rename select_temp_dir() to get_temp_dir() and move it to utils. * Rename make_temp_dir() to get_work_dir() and move it to utils. It no longer calls os.makedirs(): Regrtest.main() now calls it. * Move fix_umask() to utils. The function is now called by setup_tests(). * Move StrPath to utils. * Add exit_timeout() context manager to utils. * RunTests: Replace junit_filename (StrPath) with use_junit (bool). --- Lib/test/libregrtest/cmdline.py | 1 - Lib/test/libregrtest/main.py | 108 +++++----------------------- Lib/test/libregrtest/refleak.py | 1 - Lib/test/libregrtest/results.py | 5 +- Lib/test/libregrtest/runtest.py | 39 ++++++++-- Lib/test/libregrtest/runtest_mp.py | 110 ++--------------------------- Lib/test/libregrtest/setup.py | 8 ++- Lib/test/libregrtest/utils.py | 81 +++++++++++++++++++++ Lib/test/libregrtest/worker.py | 93 ++++++++++++++++++++++++ Lib/test/test_regrtest.py | 5 -- 10 files changed, 238 insertions(+), 213 deletions(-) create mode 100644 Lib/test/libregrtest/worker.py diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index 41d969625d04d2..ab8efb427a14a5 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -216,7 +216,6 @@ def _create_parser(): group.add_argument('--wait', action='store_true', help='wait for user input, e.g., allow a debugger ' 'to be attached') - group.add_argument('--worker-json', metavar='ARGS') group.add_argument('-S', '--start', metavar='START', help='the name of the test at which to start.' + more_details) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 74ef69b7c65307..ed0813d6f30c10 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -1,34 +1,27 @@ -import faulthandler import locale import os import platform import random import re import sys -import sysconfig -import tempfile import time import unittest + +from test import support +from test.support import os_helper + from test.libregrtest.cmdline import _parse_args, Namespace from test.libregrtest.logger import Logger from test.libregrtest.runtest import ( findtests, split_test_packages, run_single_test, abs_module_name, PROGRESS_MIN_TIME, State, RunTests, HuntRefleak, - FilterTuple, TestList, StrPath, StrJSON, TestName) + FilterTuple, TestList, StrJSON, TestName) from test.libregrtest.setup import setup_tests, setup_test_dir from test.libregrtest.pgo import setup_pgo_tests from test.libregrtest.results import TestResults -from test.libregrtest.utils import (strip_py_suffix, count, format_duration, - printlist, get_build_info) -from test import support -from test.support import os_helper -from test.support import threading_helper - - -# bpo-38203: Maximum delay in seconds to exit Python (call Py_Finalize()). -# Used to protect against threading._shutdown() hang. -# Must be smaller than buildbot "1200 seconds without output" limit. -EXIT_TIMEOUT = 120.0 +from test.libregrtest.utils import ( + strip_py_suffix, count, format_duration, StrPath, + printlist, get_build_info, get_temp_dir, get_work_dir, exit_timeout) class Regrtest: @@ -104,7 +97,9 @@ def __init__(self, ns: Namespace): self.verbose: bool = ns.verbose self.quiet: bool = ns.quiet if ns.huntrleaks: - self.hunt_refleak: HuntRefleak = HuntRefleak(*ns.huntrleaks) + warmups, runs, filename = ns.huntrleaks + filename = os.path.abspath(filename) + self.hunt_refleak: HuntRefleak = HuntRefleak(warmups, runs, filename) else: self.hunt_refleak = None self.test_dir: StrPath | None = ns.testdir @@ -454,64 +449,6 @@ def display_summary(self): state = self.get_state() print(f"Result: {state}") - @staticmethod - def fix_umask(): - if support.is_emscripten: - # Emscripten has default umask 0o777, which breaks some tests. - # see https://github.com/emscripten-core/emscripten/issues/17269 - old_mask = os.umask(0) - if old_mask == 0o777: - os.umask(0o027) - else: - os.umask(old_mask) - - @staticmethod - def select_temp_dir(tmp_dir): - if tmp_dir: - tmp_dir = os.path.expanduser(tmp_dir) - else: - # 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(): - tmp_dir = sysconfig.get_config_var('abs_builddir') - if 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. - tmp_dir = sysconfig.get_config_var('srcdir') - tmp_dir = os.path.join(tmp_dir, 'build') - else: - tmp_dir = tempfile.gettempdir() - - return os.path.abspath(tmp_dir) - - def is_worker(self): - return (self.worker_json is not None) - - @staticmethod - def make_temp_dir(tmp_dir: StrPath, is_worker: bool): - os.makedirs(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). - # Emscripten and WASI have stubbed getpid(), Emscripten has only - # milisecond clock resolution. Use randint() instead. - if sys.platform in {"emscripten", "wasi"}: - nounce = random.randint(0, 1_000_000) - else: - nounce = os.getpid() - - if is_worker: - work_dir = 'test_python_worker_{}'.format(nounce) - else: - work_dir = 'test_python_{}'.format(nounce) - work_dir += os_helper.FS_NONASCII - work_dir = os.path.join(tmp_dir, work_dir) - return work_dir - @staticmethod def cleanup_temp_dir(tmp_dir: StrPath): import glob @@ -534,17 +471,16 @@ def main(self, tests: TestList | None = None): strip_py_suffix(self.cmdline_args) - self.tmp_dir = self.select_temp_dir(self.tmp_dir) - - self.fix_umask() + self.tmp_dir = get_temp_dir(self.tmp_dir) if self.want_cleanup: self.cleanup_temp_dir(self.tmp_dir) sys.exit(0) - work_dir = self.make_temp_dir(self.tmp_dir, self.is_worker()) + os.makedirs(self.tmp_dir, exist_ok=True) + work_dir = get_work_dir(parent_dir=self.tmp_dir) - try: + with exit_timeout(): # 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. @@ -556,13 +492,6 @@ def main(self, tests: TestList | None = None): # processes. self._main() - except SystemExit as exc: - # bpo-38203: Python can hang at exit in Py_Finalize(), especially - # on threading._shutdown() call: put a timeout - if threading_helper.can_start_thread: - faulthandler.dump_traceback_later(EXIT_TIMEOUT, exit=True) - - sys.exit(exc.code) def create_run_tests(self): return RunTests( @@ -579,7 +508,7 @@ def create_run_tests(self): quiet=self.quiet, hunt_refleak=self.hunt_refleak, test_dir=self.test_dir, - junit_filename=self.junit_filename, + use_junit=(self.junit_filename is not None), memory_limit=self.memory_limit, gc_threshold=self.gc_threshold, use_resources=self.use_resources, @@ -634,11 +563,6 @@ def run_tests(self) -> int: self.fail_rerun) def _main(self): - if self.is_worker(): - from test.libregrtest.runtest_mp import worker_process - worker_process(self.worker_json) - return - if self.want_wait: input("Press any key to continue...") diff --git a/Lib/test/libregrtest/refleak.py b/Lib/test/libregrtest/refleak.py index 2e9f17e1c1eee6..81f163c47e5665 100644 --- a/Lib/test/libregrtest/refleak.py +++ b/Lib/test/libregrtest/refleak.py @@ -68,7 +68,6 @@ def get_pooled_int(value): warmups = hunt_refleak.warmups runs = hunt_refleak.runs filename = hunt_refleak.filename - filename = os.path.join(os_helper.SAVEDCWD, filename) repcount = warmups + runs # Pre-allocate to ensure that the loop doesn't allocate anything new diff --git a/Lib/test/libregrtest/results.py b/Lib/test/libregrtest/results.py index 1df15c23770cc1..e44301938c6527 100644 --- a/Lib/test/libregrtest/results.py +++ b/Lib/test/libregrtest/results.py @@ -2,9 +2,10 @@ from test.support import TestStats from test.libregrtest.runtest import ( - TestName, TestTuple, TestList, FilterDict, StrPath, State, + TestName, TestTuple, TestList, FilterDict, State, TestResult, RunTests) -from test.libregrtest.utils import printlist, count, format_duration +from test.libregrtest.utils import ( + printlist, count, format_duration, StrPath) EXITCODE_BAD_TEST = 2 diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index 6607e912330b52..a12c7fcaee8bc6 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -17,11 +17,11 @@ from test.support import os_helper from test.support import threading_helper from test.libregrtest.save_env import saved_test_environment -from test.libregrtest.utils import clear_caches, format_duration, print_warning +from test.libregrtest.utils import ( + clear_caches, format_duration, print_warning, StrPath) StrJSON = str -StrPath = str TestName = str TestTuple = tuple[TestName, ...] TestList = list[TestName] @@ -215,6 +215,33 @@ def get_rerun_match_tests(self) -> FilterTuple | None: return None return tuple(match_tests) + def write_json(self, file) -> None: + json.dump(self, file, cls=_EncodeTestResult) + + @staticmethod + def from_json(worker_json) -> 'TestResult': + return json.loads(worker_json, object_hook=_decode_test_result) + + +class _EncodeTestResult(json.JSONEncoder): + def default(self, o: Any) -> dict[str, Any]: + if isinstance(o, TestResult): + result = dataclasses.asdict(o) + result["__test_result__"] = o.__class__.__name__ + return result + else: + return super().default(o) + + +def _decode_test_result(data: dict[str, Any]) -> TestResult | dict[str, Any]: + if "__test_result__" in data: + data.pop('__test_result__') + if data['stats'] is not None: + data['stats'] = TestStats(**data['stats']) + return TestResult(**data) + else: + return data + @dataclasses.dataclass(slots=True, frozen=True) class RunTests: @@ -234,7 +261,7 @@ class RunTests: quiet: bool = False hunt_refleak: HuntRefleak | None = None test_dir: StrPath | None = None - junit_filename: StrPath | None = None + use_junit: bool = False memory_limit: str | None = None gc_threshold: int | None = None use_resources: list[str] = None @@ -358,7 +385,7 @@ def setup_support(runtests: RunTests): support.set_match_tests(runtests.match_tests, runtests.ignore_tests) support.failfast = runtests.fail_fast support.verbose = runtests.verbose - if runtests.junit_filename: + if runtests.use_junit: support.junit_xml_list = [] else: support.junit_xml_list = None @@ -434,8 +461,8 @@ def run_single_test(test_name: TestName, runtests: RunTests) -> TestResult: Returns a TestResult. - If runtests.junit_filename is not None, xml_data is a list containing each - generated testsuite element. + If runtests.use_junit, xml_data is a list containing each generated + testsuite element. """ start_time = time.perf_counter() result = TestResult(test_name) diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index c4cffff57b14c4..c1bd911c43e2c4 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -1,6 +1,5 @@ import dataclasses import faulthandler -import json import os.path import queue import signal @@ -10,19 +9,19 @@ import threading import time import traceback -from typing import NoReturn, Literal, Any, TextIO +from typing import Literal, TextIO from test import support from test.support import os_helper -from test.support import TestStats from test.libregrtest.main import Regrtest from test.libregrtest.runtest import ( - run_single_test, TestResult, State, PROGRESS_MIN_TIME, - FilterTuple, RunTests, StrPath, StrJSON, TestName) -from test.libregrtest.setup import setup_tests, setup_test_dir + TestResult, State, PROGRESS_MIN_TIME, + RunTests, TestName) from test.libregrtest.results import TestResults -from test.libregrtest.utils import format_duration, print_warning +from test.libregrtest.utils import ( + format_duration, print_warning, StrPath) +from test.libregrtest.worker import create_worker_process, USE_PROCESS_GROUP if sys.platform == 'win32': import locale @@ -41,75 +40,6 @@ # Time to wait until a worker completes: should be immediate JOIN_TIMEOUT = 30.0 # seconds -USE_PROCESS_GROUP = (hasattr(os, "setsid") and hasattr(os, "killpg")) - - -@dataclasses.dataclass(slots=True) -class WorkerJob: - runtests: RunTests - - -def create_worker_process(runtests: RunTests, - output_file: TextIO, - tmp_dir: StrPath | None = None) -> subprocess.Popen: - python_cmd = runtests.python_cmd - worker_json = runtests.as_json() - - if python_cmd is not None: - executable = python_cmd - else: - executable = [sys.executable] - cmd = [*executable, *support.args_from_interpreter_flags(), - '-u', # Unbuffered stdout and stderr - '-m', 'test.regrtest', - '--worker-json', worker_json] - - env = dict(os.environ) - if tmp_dir is not None: - env['TMPDIR'] = tmp_dir - env['TEMP'] = tmp_dir - env['TMP'] = tmp_dir - - # Running the child from the same working directory as regrtest's original - # invocation ensures that TEMPDIR for the child is the same when - # sysconfig.is_python_build() is true. See issue 15300. - kw = dict( - env=env, - stdout=output_file, - # bpo-45410: Write stderr into stdout to keep messages order - stderr=output_file, - text=True, - close_fds=(os.name != 'nt'), - cwd=os_helper.SAVEDCWD, - ) - if USE_PROCESS_GROUP: - kw['start_new_session'] = True - return subprocess.Popen(cmd, **kw) - - -def worker_process(worker_json: StrJSON) -> NoReturn: - runtests = RunTests.from_json(worker_json) - test_name = runtests.tests[0] - match_tests: FilterTuple | None = runtests.match_tests - - setup_test_dir(runtests.test_dir) - setup_tests(runtests) - - if runtests.rerun: - if match_tests: - matching = "matching: " + ", ".join(match_tests) - print(f"Re-running {test_name} in verbose mode ({matching})", flush=True) - else: - print(f"Re-running {test_name} in verbose mode", flush=True) - - result = run_single_test(test_name, runtests) - print() # Force a newline (just in case) - - # Serialize TestResult as dict in JSON - json.dump(result, sys.stdout, cls=EncodeTestResult) - sys.stdout.flush() - sys.exit(0) - # We do not use a generator so multiple threads can call next(). class MultiprocessIterator: @@ -340,9 +270,7 @@ def _runtest(self, test_name: TestName) -> MultiprocessResult: err_msg = "Failed to parse worker stdout" else: try: - # deserialize run_tests_worker() output - result = json.loads(worker_json, - object_hook=decode_test_result) + result = TestResult.from_json(worker_json) except Exception as exc: err_msg = "Failed to parse worker JSON: %s" % exc @@ -562,27 +490,3 @@ def run(self) -> None: # worker when we exit this function self.pending.stop() self.stop_workers() - - -class EncodeTestResult(json.JSONEncoder): - """Encode a TestResult (sub)class object into a JSON dict.""" - - def default(self, o: Any) -> dict[str, Any]: - if isinstance(o, TestResult): - result = dataclasses.asdict(o) - result["__test_result__"] = o.__class__.__name__ - return result - - return super().default(o) - - -def decode_test_result(d: dict[str, Any]) -> TestResult | dict[str, Any]: - """Decode a TestResult (sub)class object from a JSON dict.""" - - if "__test_result__" not in d: - return d - - d.pop('__test_result__') - if d['stats'] is not None: - d['stats'] = TestStats(**d['stats']) - return TestResult(**d) diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index 594498333fe792..48eb8b6800af1e 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -11,8 +11,8 @@ except ImportError: gc = None -from test.libregrtest.utils import (setup_unraisable_hook, - setup_threading_excepthook) +from test.libregrtest.utils import ( + setup_unraisable_hook, setup_threading_excepthook, fix_umask) UNICODE_GUARD_ENV = "PYTHONREGRTEST_UNICODE_GUARD" @@ -26,6 +26,8 @@ def setup_test_dir(testdir: str | None) -> None: def setup_tests(runtests): + fix_umask() + try: stderr_fd = sys.__stderr__.fileno() except (ValueError, AttributeError): @@ -102,7 +104,7 @@ def _test_audit_hook(name, args): support.SHORT_TIMEOUT = min(support.SHORT_TIMEOUT, timeout) support.LONG_TIMEOUT = min(support.LONG_TIMEOUT, timeout) - if runtests.junit_filename: + if runtests.use_junit: from test.support.testresult import RegressionTestResult RegressionTestResult.USE_XML = True diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 57d85432bbfc95..e77772cc2577fe 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -1,13 +1,28 @@ +import contextlib +import faulthandler import math import os.path +import random import sys import sysconfig +import tempfile import textwrap + from test import support +from test.support import os_helper +from test.support import threading_helper MS_WINDOWS = (sys.platform == 'win32') +# bpo-38203: Maximum delay in seconds to exit Python (call Py_Finalize()). +# Used to protect against threading._shutdown() hang. +# Must be smaller than buildbot "1200 seconds without output" limit. +EXIT_TIMEOUT = 120.0 + + +StrPath = str + def format_duration(seconds): ms = math.ceil(seconds * 1e3) @@ -308,3 +323,69 @@ def get_build_info(): build.append("dtrace") return build + + +def get_temp_dir(tmp_dir): + if tmp_dir: + tmp_dir = os.path.expanduser(tmp_dir) + else: + # 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(): + tmp_dir = sysconfig.get_config_var('abs_builddir') + if 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. + tmp_dir = sysconfig.get_config_var('srcdir') + tmp_dir = os.path.join(tmp_dir, 'build') + else: + tmp_dir = tempfile.gettempdir() + + return os.path.abspath(tmp_dir) + + +def fix_umask(): + if support.is_emscripten: + # Emscripten has default umask 0o777, which breaks some tests. + # see https://github.com/emscripten-core/emscripten/issues/17269 + old_mask = os.umask(0) + if old_mask == 0o777: + os.umask(0o027) + else: + os.umask(old_mask) + + +def get_work_dir(*, parent_dir: StrPath = '', worker: bool = False): + # 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). + # Emscripten and WASI have stubbed getpid(), Emscripten has only + # milisecond clock resolution. Use randint() instead. + if sys.platform in {"emscripten", "wasi"}: + nounce = random.randint(0, 1_000_000) + else: + nounce = os.getpid() + + if worker: + work_dir = 'test_python_worker_{}'.format(nounce) + else: + work_dir = 'test_python_{}'.format(nounce) + work_dir += os_helper.FS_NONASCII + if parent_dir: + work_dir = os.path.join(parent_dir, work_dir) + return work_dir + + +@contextlib.contextmanager +def exit_timeout(): + try: + yield + except SystemExit as exc: + # bpo-38203: Python can hang at exit in Py_Finalize(), especially + # on threading._shutdown() call: put a timeout + if threading_helper.can_start_thread: + faulthandler.dump_traceback_later(EXIT_TIMEOUT, exit=True) + sys.exit(exc.code) diff --git a/Lib/test/libregrtest/worker.py b/Lib/test/libregrtest/worker.py new file mode 100644 index 00000000000000..033a0a3ff62260 --- /dev/null +++ b/Lib/test/libregrtest/worker.py @@ -0,0 +1,93 @@ +import subprocess +import sys +import os +from typing import TextIO, NoReturn + +from test import support +from test.support import os_helper + +from test.libregrtest.setup import setup_tests, setup_test_dir +from test.libregrtest.runtest import ( + run_single_test, StrJSON, FilterTuple, RunTests) +from test.libregrtest.utils import get_work_dir, exit_timeout, StrPath + + +USE_PROCESS_GROUP = (hasattr(os, "setsid") and hasattr(os, "killpg")) + + +def create_worker_process(runtests: RunTests, + output_file: TextIO, + tmp_dir: StrPath | None = None) -> subprocess.Popen: + python_cmd = runtests.python_cmd + worker_json = runtests.as_json() + + if python_cmd is not None: + executable = python_cmd + else: + executable = [sys.executable] + cmd = [*executable, *support.args_from_interpreter_flags(), + '-u', # Unbuffered stdout and stderr + '-m', 'test.libregrtest.worker', + worker_json] + + env = dict(os.environ) + if tmp_dir is not None: + env['TMPDIR'] = tmp_dir + env['TEMP'] = tmp_dir + env['TMP'] = tmp_dir + + # Running the child from the same working directory as regrtest's original + # invocation ensures that TEMPDIR for the child is the same when + # sysconfig.is_python_build() is true. See issue 15300. + kw = dict( + env=env, + stdout=output_file, + # bpo-45410: Write stderr into stdout to keep messages order + stderr=output_file, + text=True, + close_fds=(os.name != 'nt'), + ) + if USE_PROCESS_GROUP: + kw['start_new_session'] = True + return subprocess.Popen(cmd, **kw) + + +def worker_process(worker_json: StrJSON) -> NoReturn: + runtests = RunTests.from_json(worker_json) + test_name = runtests.tests[0] + match_tests: FilterTuple | None = runtests.match_tests + + setup_test_dir(runtests.test_dir) + setup_tests(runtests) + + if runtests.rerun: + if match_tests: + matching = "matching: " + ", ".join(match_tests) + print(f"Re-running {test_name} in verbose mode ({matching})", flush=True) + else: + print(f"Re-running {test_name} in verbose mode", flush=True) + + result = run_single_test(test_name, runtests) + print() # Force a newline (just in case) + + # Serialize TestResult as dict in JSON + result.write_json(sys.stdout) + sys.stdout.flush() + sys.exit(0) + + +def main(): + if len(sys.argv) != 2: + print("usage: python -m test.libregrtest.worker JSON") + sys.exit(1) + worker_json = sys.argv[1] + + work_dir = get_work_dir(worker=True) + + with exit_timeout(): + with os_helper.temp_cwd(work_dir, quiet=True): + worker_process(worker_json) + + +if __name__ == "__main__": + main() diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 23896fdedaccac..a5ee4c2155536e 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -75,11 +75,6 @@ def test_wait(self): ns = libregrtest._parse_args(['--wait']) self.assertTrue(ns.wait) - def test_worker_json(self): - ns = libregrtest._parse_args(['--worker-json', '[[], {}]']) - self.assertEqual(ns.worker_json, '[[], {}]') - self.checkError(['--worker-json'], 'expected one argument') - def test_start(self): for opt in '-S', '--start': with self.subTest(opt=opt): From 1ec45378e97a2d3812ed8bc18e1bd1eb8ddcc9a0 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 11 Sep 2023 02:07:18 +0200 Subject: [PATCH 141/357] gh-109162: libregrtest: add single.py and result.py (#109243) * Add single.py and result.py files. * Rename runtest.py to runtests.py. * Move run_single_test() function and its helper functions to single.py. * Move remove_testfn(), abs_module_name() and normalize_test_name() to utils.py. * Move setup_support() to setup.py. * Move type hints like TestName to utils.py. * Rename runtest.py to runtests.py. --- Lib/test/libregrtest/findtests.py | 58 +++ Lib/test/libregrtest/logger.py | 2 +- Lib/test/libregrtest/main.py | 14 +- Lib/test/libregrtest/refleak.py | 5 +- Lib/test/libregrtest/result.py | 184 ++++++++ Lib/test/libregrtest/results.py | 8 +- Lib/test/libregrtest/runtest.py | 676 ----------------------------- Lib/test/libregrtest/runtest_mp.py | 9 +- Lib/test/libregrtest/runtests.py | 83 ++++ Lib/test/libregrtest/setup.py | 13 + Lib/test/libregrtest/single.py | 275 ++++++++++++ Lib/test/libregrtest/utils.py | 82 ++++ Lib/test/libregrtest/worker.py | 8 +- Lib/test/test_regrtest.py | 2 +- 14 files changed, 722 insertions(+), 697 deletions(-) create mode 100644 Lib/test/libregrtest/findtests.py create mode 100644 Lib/test/libregrtest/result.py delete mode 100644 Lib/test/libregrtest/runtest.py create mode 100644 Lib/test/libregrtest/runtests.py create mode 100644 Lib/test/libregrtest/single.py diff --git a/Lib/test/libregrtest/findtests.py b/Lib/test/libregrtest/findtests.py new file mode 100644 index 00000000000000..88570be7dccdfd --- /dev/null +++ b/Lib/test/libregrtest/findtests.py @@ -0,0 +1,58 @@ +import os + +from test.libregrtest.utils import StrPath, TestName, TestList + + +# If these test directories are encountered recurse into them and treat each +# "test_*.py" file or each sub-directory as a separate test module. This can +# increase parallelism. +# +# Beware this can't generally be done for any directory with sub-tests as the +# __init__.py may do things which alter what tests are to be run. +SPLITTESTDIRS: set[TestName] = { + "test_asyncio", + "test_concurrent_futures", + "test_multiprocessing_fork", + "test_multiprocessing_forkserver", + "test_multiprocessing_spawn", +} + + +def findtestdir(path=None): + return path or os.path.dirname(os.path.dirname(__file__)) or os.curdir + + +def findtests(*, testdir: StrPath | None = None, exclude=(), + split_test_dirs: set[TestName] = SPLITTESTDIRS, + base_mod: str = "") -> TestList: + """Return a list of all applicable test modules.""" + testdir = findtestdir(testdir) + tests = [] + for name in os.listdir(testdir): + mod, ext = os.path.splitext(name) + if (not mod.startswith("test_")) or (mod in exclude): + continue + if mod in split_test_dirs: + subdir = os.path.join(testdir, mod) + mod = f"{base_mod or 'test'}.{mod}" + tests.extend(findtests(testdir=subdir, exclude=exclude, + split_test_dirs=split_test_dirs, + base_mod=mod)) + elif ext in (".py", ""): + tests.append(f"{base_mod}.{mod}" if base_mod else mod) + return sorted(tests) + + +def split_test_packages(tests, *, testdir: StrPath | None = None, exclude=(), + split_test_dirs=SPLITTESTDIRS): + testdir = findtestdir(testdir) + splitted = [] + for name in tests: + if name in split_test_dirs: + subdir = os.path.join(testdir, name) + splitted.extend(findtests(testdir=subdir, exclude=exclude, + split_test_dirs=split_test_dirs, + base_mod=name)) + else: + splitted.append(name) + return splitted diff --git a/Lib/test/libregrtest/logger.py b/Lib/test/libregrtest/logger.py index c4498a43545545..05b9307c97ded1 100644 --- a/Lib/test/libregrtest/logger.py +++ b/Lib/test/libregrtest/logger.py @@ -1,7 +1,7 @@ import os import time -from test.libregrtest.runtest import RunTests +from test.libregrtest.runtests import RunTests from test.libregrtest.utils import print_warning, MS_WINDOWS if MS_WINDOWS: diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index ed0813d6f30c10..0227a2d1fc612e 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -11,17 +11,19 @@ from test.support import os_helper from test.libregrtest.cmdline import _parse_args, Namespace +from test.libregrtest.findtests import findtests, split_test_packages from test.libregrtest.logger import Logger -from test.libregrtest.runtest import ( - findtests, split_test_packages, run_single_test, abs_module_name, - PROGRESS_MIN_TIME, State, RunTests, HuntRefleak, - FilterTuple, TestList, StrJSON, TestName) +from test.libregrtest.result import State +from test.libregrtest.runtests import RunTests, HuntRefleak from test.libregrtest.setup import setup_tests, setup_test_dir +from test.libregrtest.single import run_single_test, PROGRESS_MIN_TIME from test.libregrtest.pgo import setup_pgo_tests from test.libregrtest.results import TestResults from test.libregrtest.utils import ( - strip_py_suffix, count, format_duration, StrPath, - printlist, get_build_info, get_temp_dir, get_work_dir, exit_timeout) + StrPath, StrJSON, TestName, TestList, FilterTuple, + strip_py_suffix, count, format_duration, + printlist, get_build_info, get_temp_dir, get_work_dir, exit_timeout, + abs_module_name) class Regrtest: diff --git a/Lib/test/libregrtest/refleak.py b/Lib/test/libregrtest/refleak.py index 81f163c47e5665..6b1d7082ba46ba 100644 --- a/Lib/test/libregrtest/refleak.py +++ b/Lib/test/libregrtest/refleak.py @@ -1,10 +1,11 @@ -import os import sys import warnings from inspect import isabstract + from test import support from test.support import os_helper -from test.libregrtest.runtest import HuntRefleak + +from test.libregrtest.runtests import HuntRefleak from test.libregrtest.utils import clear_caches try: diff --git a/Lib/test/libregrtest/result.py b/Lib/test/libregrtest/result.py new file mode 100644 index 00000000000000..4a68872369c9e7 --- /dev/null +++ b/Lib/test/libregrtest/result.py @@ -0,0 +1,184 @@ +import dataclasses +import json +from typing import Any + +from test.support import TestStats + +from test.libregrtest.utils import ( + TestName, FilterTuple, + format_duration, normalize_test_name, print_warning) + + +# Avoid enum.Enum to reduce the number of imports when tests are run +class State: + PASSED = "PASSED" + FAILED = "FAILED" + SKIPPED = "SKIPPED" + UNCAUGHT_EXC = "UNCAUGHT_EXC" + REFLEAK = "REFLEAK" + ENV_CHANGED = "ENV_CHANGED" + RESOURCE_DENIED = "RESOURCE_DENIED" + INTERRUPTED = "INTERRUPTED" + MULTIPROCESSING_ERROR = "MULTIPROCESSING_ERROR" + DID_NOT_RUN = "DID_NOT_RUN" + TIMEOUT = "TIMEOUT" + + @staticmethod + def is_failed(state): + return state in { + State.FAILED, + State.UNCAUGHT_EXC, + State.REFLEAK, + State.MULTIPROCESSING_ERROR, + State.TIMEOUT} + + @staticmethod + def has_meaningful_duration(state): + # Consider that the duration is meaningless for these cases. + # For example, if a whole test file is skipped, its duration + # is unlikely to be the duration of executing its tests, + # but just the duration to execute code which skips the test. + return state not in { + State.SKIPPED, + State.RESOURCE_DENIED, + State.INTERRUPTED, + State.MULTIPROCESSING_ERROR, + State.DID_NOT_RUN} + + @staticmethod + def must_stop(state): + return state in { + State.INTERRUPTED, + State.MULTIPROCESSING_ERROR} + + +@dataclasses.dataclass(slots=True) +class TestResult: + test_name: TestName + state: str | None = None + # Test duration in seconds + duration: float | None = None + xml_data: list[str] | None = None + stats: TestStats | None = None + + # errors and failures copied from support.TestFailedWithDetails + errors: list[tuple[str, str]] | None = None + failures: list[tuple[str, str]] | None = None + + def is_failed(self, fail_env_changed: bool) -> bool: + if self.state == State.ENV_CHANGED: + return fail_env_changed + return State.is_failed(self.state) + + def _format_failed(self): + if self.errors and self.failures: + le = len(self.errors) + lf = len(self.failures) + error_s = "error" + ("s" if le > 1 else "") + failure_s = "failure" + ("s" if lf > 1 else "") + return f"{self.test_name} failed ({le} {error_s}, {lf} {failure_s})" + + if self.errors: + le = len(self.errors) + error_s = "error" + ("s" if le > 1 else "") + return f"{self.test_name} failed ({le} {error_s})" + + if self.failures: + lf = len(self.failures) + failure_s = "failure" + ("s" if lf > 1 else "") + return f"{self.test_name} failed ({lf} {failure_s})" + + return f"{self.test_name} failed" + + def __str__(self) -> str: + match self.state: + case State.PASSED: + return f"{self.test_name} passed" + case State.FAILED: + return self._format_failed() + case State.SKIPPED: + return f"{self.test_name} skipped" + case State.UNCAUGHT_EXC: + return f"{self.test_name} failed (uncaught exception)" + case State.REFLEAK: + return f"{self.test_name} failed (reference leak)" + case State.ENV_CHANGED: + return f"{self.test_name} failed (env changed)" + case State.RESOURCE_DENIED: + return f"{self.test_name} skipped (resource denied)" + case State.INTERRUPTED: + return f"{self.test_name} interrupted" + case State.MULTIPROCESSING_ERROR: + return f"{self.test_name} process crashed" + case State.DID_NOT_RUN: + return f"{self.test_name} ran no tests" + case State.TIMEOUT: + return f"{self.test_name} timed out ({format_duration(self.duration)})" + case _: + raise ValueError("unknown result state: {state!r}") + + def has_meaningful_duration(self): + return State.has_meaningful_duration(self.state) + + def set_env_changed(self): + if self.state is None or self.state == State.PASSED: + self.state = State.ENV_CHANGED + + def must_stop(self, fail_fast: bool, fail_env_changed: bool) -> bool: + if State.must_stop(self.state): + return True + if fail_fast and self.is_failed(fail_env_changed): + return True + return False + + def get_rerun_match_tests(self) -> FilterTuple | None: + match_tests = [] + + errors = self.errors or [] + failures = self.failures or [] + for error_list, is_error in ( + (errors, True), + (failures, False), + ): + for full_name, *_ in error_list: + match_name = normalize_test_name(full_name, is_error=is_error) + if match_name is None: + # 'setUpModule (test.test_sys)': don't filter tests + return None + if not match_name: + error_type = "ERROR" if is_error else "FAIL" + print_warning(f"rerun failed to parse {error_type} test name: " + f"{full_name!r}: don't filter tests") + return None + match_tests.append(match_name) + + if not match_tests: + return None + return tuple(match_tests) + + def write_json(self, file) -> None: + json.dump(self, file, cls=_EncodeTestResult) + + @staticmethod + def from_json(worker_json) -> 'TestResult': + return json.loads(worker_json, object_hook=_decode_test_result) + + +class _EncodeTestResult(json.JSONEncoder): + def default(self, o: Any) -> dict[str, Any]: + if isinstance(o, TestResult): + result = dataclasses.asdict(o) + result["__test_result__"] = o.__class__.__name__ + return result + else: + return super().default(o) + + +def _decode_test_result(data: dict[str, Any]) -> TestResult | dict[str, Any]: + if "__test_result__" in data: + data.pop('__test_result__') + if data['stats'] is not None: + data['stats'] = TestStats(**data['stats']) + return TestResult(**data) + else: + return data diff --git a/Lib/test/libregrtest/results.py b/Lib/test/libregrtest/results.py index e44301938c6527..b7a044eae25aae 100644 --- a/Lib/test/libregrtest/results.py +++ b/Lib/test/libregrtest/results.py @@ -1,11 +1,11 @@ import sys from test.support import TestStats -from test.libregrtest.runtest import ( - TestName, TestTuple, TestList, FilterDict, State, - TestResult, RunTests) +from test.libregrtest.runtests import RunTests +from test.libregrtest.result import State, TestResult from test.libregrtest.utils import ( - printlist, count, format_duration, StrPath) + StrPath, TestName, TestTuple, TestList, FilterDict, + printlist, count, format_duration) EXITCODE_BAD_TEST = 2 diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py deleted file mode 100644 index a12c7fcaee8bc6..00000000000000 --- a/Lib/test/libregrtest/runtest.py +++ /dev/null @@ -1,676 +0,0 @@ -import dataclasses -import doctest -import faulthandler -import gc -import importlib -import io -import json -import os -import sys -import time -import traceback -import unittest -from typing import Any - -from test import support -from test.support import TestStats -from test.support import os_helper -from test.support import threading_helper -from test.libregrtest.save_env import saved_test_environment -from test.libregrtest.utils import ( - clear_caches, format_duration, print_warning, StrPath) - - -StrJSON = str -TestName = str -TestTuple = tuple[TestName, ...] -TestList = list[TestName] - -# --match and --ignore options: list of patterns -# ('*' joker character can be used) -FilterTuple = tuple[TestName, ...] -FilterDict = dict[TestName, FilterTuple] - - -@dataclasses.dataclass(slots=True, frozen=True) -class HuntRefleak: - warmups: int - runs: int - filename: StrPath - - -# Avoid enum.Enum to reduce the number of imports when tests are run -class State: - PASSED = "PASSED" - FAILED = "FAILED" - SKIPPED = "SKIPPED" - UNCAUGHT_EXC = "UNCAUGHT_EXC" - REFLEAK = "REFLEAK" - ENV_CHANGED = "ENV_CHANGED" - RESOURCE_DENIED = "RESOURCE_DENIED" - INTERRUPTED = "INTERRUPTED" - MULTIPROCESSING_ERROR = "MULTIPROCESSING_ERROR" - DID_NOT_RUN = "DID_NOT_RUN" - TIMEOUT = "TIMEOUT" - - @staticmethod - def is_failed(state): - return state in { - State.FAILED, - State.UNCAUGHT_EXC, - State.REFLEAK, - State.MULTIPROCESSING_ERROR, - State.TIMEOUT} - - @staticmethod - def has_meaningful_duration(state): - # Consider that the duration is meaningless for these cases. - # For example, if a whole test file is skipped, its duration - # is unlikely to be the duration of executing its tests, - # but just the duration to execute code which skips the test. - return state not in { - State.SKIPPED, - State.RESOURCE_DENIED, - State.INTERRUPTED, - State.MULTIPROCESSING_ERROR, - State.DID_NOT_RUN} - - @staticmethod - def must_stop(state): - return state in { - State.INTERRUPTED, - State.MULTIPROCESSING_ERROR} - - -# gh-90681: When rerunning tests, we might need to rerun the whole -# class or module suite if some its life-cycle hooks fail. -# Test level hooks are not affected. -_TEST_LIFECYCLE_HOOKS = frozenset(( - 'setUpClass', 'tearDownClass', - 'setUpModule', 'tearDownModule', -)) - -def normalize_test_name(test_full_name, *, is_error=False): - short_name = test_full_name.split(" ")[0] - if is_error and short_name in _TEST_LIFECYCLE_HOOKS: - if test_full_name.startswith(('setUpModule (', 'tearDownModule (')): - # if setUpModule() or tearDownModule() failed, don't filter - # tests with the test file name, don't use use filters. - return None - - # This means that we have a failure in a life-cycle hook, - # we need to rerun the whole module or class suite. - # Basically the error looks like this: - # ERROR: setUpClass (test.test_reg_ex.RegTest) - # or - # ERROR: setUpModule (test.test_reg_ex) - # So, we need to parse the class / module name. - lpar = test_full_name.index('(') - rpar = test_full_name.index(')') - return test_full_name[lpar + 1: rpar].split('.')[-1] - return short_name - - -@dataclasses.dataclass(slots=True) -class TestResult: - test_name: TestName - state: str | None = None - # Test duration in seconds - duration: float | None = None - xml_data: list[str] | None = None - stats: TestStats | None = None - - # errors and failures copied from support.TestFailedWithDetails - errors: list[tuple[str, str]] | None = None - failures: list[tuple[str, str]] | None = None - - def is_failed(self, fail_env_changed: bool) -> bool: - if self.state == State.ENV_CHANGED: - return fail_env_changed - return State.is_failed(self.state) - - def _format_failed(self): - if self.errors and self.failures: - le = len(self.errors) - lf = len(self.failures) - error_s = "error" + ("s" if le > 1 else "") - failure_s = "failure" + ("s" if lf > 1 else "") - return f"{self.test_name} failed ({le} {error_s}, {lf} {failure_s})" - - if self.errors: - le = len(self.errors) - error_s = "error" + ("s" if le > 1 else "") - return f"{self.test_name} failed ({le} {error_s})" - - if self.failures: - lf = len(self.failures) - failure_s = "failure" + ("s" if lf > 1 else "") - return f"{self.test_name} failed ({lf} {failure_s})" - - return f"{self.test_name} failed" - - def __str__(self) -> str: - match self.state: - case State.PASSED: - return f"{self.test_name} passed" - case State.FAILED: - return self._format_failed() - case State.SKIPPED: - return f"{self.test_name} skipped" - case State.UNCAUGHT_EXC: - return f"{self.test_name} failed (uncaught exception)" - case State.REFLEAK: - return f"{self.test_name} failed (reference leak)" - case State.ENV_CHANGED: - return f"{self.test_name} failed (env changed)" - case State.RESOURCE_DENIED: - return f"{self.test_name} skipped (resource denied)" - case State.INTERRUPTED: - return f"{self.test_name} interrupted" - case State.MULTIPROCESSING_ERROR: - return f"{self.test_name} process crashed" - case State.DID_NOT_RUN: - return f"{self.test_name} ran no tests" - case State.TIMEOUT: - return f"{self.test_name} timed out ({format_duration(self.duration)})" - case _: - raise ValueError("unknown result state: {state!r}") - - def has_meaningful_duration(self): - return State.has_meaningful_duration(self.state) - - def set_env_changed(self): - if self.state is None or self.state == State.PASSED: - self.state = State.ENV_CHANGED - - def must_stop(self, fail_fast: bool, fail_env_changed: bool) -> bool: - if State.must_stop(self.state): - return True - if fail_fast and self.is_failed(fail_env_changed): - return True - return False - - def get_rerun_match_tests(self) -> FilterTuple | None: - match_tests = [] - - errors = self.errors or [] - failures = self.failures or [] - for error_list, is_error in ( - (errors, True), - (failures, False), - ): - for full_name, *_ in error_list: - match_name = normalize_test_name(full_name, is_error=is_error) - if match_name is None: - # 'setUpModule (test.test_sys)': don't filter tests - return None - if not match_name: - error_type = "ERROR" if is_error else "FAIL" - print_warning(f"rerun failed to parse {error_type} test name: " - f"{full_name!r}: don't filter tests") - return None - match_tests.append(match_name) - - if not match_tests: - return None - return tuple(match_tests) - - def write_json(self, file) -> None: - json.dump(self, file, cls=_EncodeTestResult) - - @staticmethod - def from_json(worker_json) -> 'TestResult': - return json.loads(worker_json, object_hook=_decode_test_result) - - -class _EncodeTestResult(json.JSONEncoder): - def default(self, o: Any) -> dict[str, Any]: - if isinstance(o, TestResult): - result = dataclasses.asdict(o) - result["__test_result__"] = o.__class__.__name__ - return result - else: - return super().default(o) - - -def _decode_test_result(data: dict[str, Any]) -> TestResult | dict[str, Any]: - if "__test_result__" in data: - data.pop('__test_result__') - if data['stats'] is not None: - data['stats'] = TestStats(**data['stats']) - return TestResult(**data) - else: - return data - - -@dataclasses.dataclass(slots=True, frozen=True) -class RunTests: - tests: TestTuple - fail_fast: bool = False - fail_env_changed: bool = False - match_tests: FilterTuple | None = None - ignore_tests: FilterTuple | None = None - match_tests_dict: FilterDict | None = None - rerun: bool = False - forever: bool = False - pgo: bool = False - pgo_extended: bool = False - output_on_failure: bool = False - timeout: float | None = None - verbose: bool = False - quiet: bool = False - hunt_refleak: HuntRefleak | None = None - test_dir: StrPath | None = None - use_junit: bool = False - memory_limit: str | None = None - gc_threshold: int | None = None - use_resources: list[str] = None - python_cmd: list[str] | None = None - - def copy(self, **override): - state = dataclasses.asdict(self) - state.update(override) - return RunTests(**state) - - def get_match_tests(self, test_name) -> FilterTuple | None: - if self.match_tests_dict is not None: - return self.match_tests_dict.get(test_name, None) - else: - return None - - def iter_tests(self): - if self.forever: - while True: - yield from self.tests - else: - yield from self.tests - - def as_json(self) -> StrJSON: - return json.dumps(self, cls=_EncodeRunTests) - - @staticmethod - def from_json(worker_json: StrJSON) -> 'RunTests': - return json.loads(worker_json, object_hook=_decode_runtests) - - -class _EncodeRunTests(json.JSONEncoder): - def default(self, o: Any) -> dict[str, Any]: - if isinstance(o, RunTests): - result = dataclasses.asdict(o) - result["__runtests__"] = True - return result - else: - return super().default(o) - - -def _decode_runtests(data: dict[str, Any]) -> RunTests | dict[str, Any]: - if "__runtests__" in data: - data.pop('__runtests__') - if data['hunt_refleak']: - data['hunt_refleak'] = HuntRefleak(**data['hunt_refleak']) - return RunTests(**data) - else: - return data - - -# Minimum duration of a test to display its duration or to mention that -# the test is running in background -PROGRESS_MIN_TIME = 30.0 # seconds - -#If these test directories are encountered recurse into them and treat each -# test_ .py or dir as a separate test module. This can increase parallelism. -# Beware this can't generally be done for any directory with sub-tests as the -# __init__.py may do things which alter what tests are to be run. - -SPLITTESTDIRS: set[TestName] = { - "test_asyncio", - "test_concurrent_futures", - "test_multiprocessing_fork", - "test_multiprocessing_forkserver", - "test_multiprocessing_spawn", -} - - -def findtestdir(path=None): - return path or os.path.dirname(os.path.dirname(__file__)) or os.curdir - - -def findtests(*, testdir: StrPath | None = None, exclude=(), - split_test_dirs: set[TestName] = SPLITTESTDIRS, - base_mod: str = "") -> TestList: - """Return a list of all applicable test modules.""" - testdir = findtestdir(testdir) - tests = [] - for name in os.listdir(testdir): - mod, ext = os.path.splitext(name) - if (not mod.startswith("test_")) or (mod in exclude): - continue - if mod in split_test_dirs: - subdir = os.path.join(testdir, mod) - mod = f"{base_mod or 'test'}.{mod}" - tests.extend(findtests(testdir=subdir, exclude=exclude, - split_test_dirs=split_test_dirs, - base_mod=mod)) - elif ext in (".py", ""): - tests.append(f"{base_mod}.{mod}" if base_mod else mod) - return sorted(tests) - - -def split_test_packages(tests, *, testdir: StrPath | None = None, exclude=(), - split_test_dirs=SPLITTESTDIRS): - testdir = findtestdir(testdir) - splitted = [] - for name in tests: - if name in split_test_dirs: - subdir = os.path.join(testdir, name) - splitted.extend(findtests(testdir=subdir, exclude=exclude, - split_test_dirs=split_test_dirs, - base_mod=name)) - else: - splitted.append(name) - return splitted - - -def abs_module_name(test_name: TestName, test_dir: StrPath | None) -> TestName: - if test_name.startswith('test.') or test_dir: - return test_name - else: - # Import it from the test package - return 'test.' + test_name - - -def setup_support(runtests: RunTests): - support.PGO = runtests.pgo - support.PGO_EXTENDED = runtests.pgo_extended - support.set_match_tests(runtests.match_tests, runtests.ignore_tests) - support.failfast = runtests.fail_fast - support.verbose = runtests.verbose - if runtests.use_junit: - support.junit_xml_list = [] - else: - support.junit_xml_list = None - - -def _runtest(result: TestResult, runtests: RunTests) -> None: - # Capture stdout and stderr, set faulthandler timeout, - # and create JUnit XML report. - verbose = runtests.verbose - output_on_failure = runtests.output_on_failure - timeout = runtests.timeout - - use_timeout = ( - timeout is not None and threading_helper.can_start_thread - ) - if use_timeout: - faulthandler.dump_traceback_later(timeout, exit=True) - - try: - setup_support(runtests) - - if output_on_failure: - support.verbose = True - - stream = io.StringIO() - orig_stdout = sys.stdout - orig_stderr = sys.stderr - print_warning = support.print_warning - orig_print_warnings_stderr = print_warning.orig_stderr - - output = None - try: - sys.stdout = stream - sys.stderr = stream - # print_warning() writes into the temporary stream to preserve - # messages order. If support.environment_altered becomes true, - # warnings will be written to sys.stderr below. - print_warning.orig_stderr = stream - - _runtest_env_changed_exc(result, runtests, display_failure=False) - # Ignore output if the test passed successfully - if result.state != State.PASSED: - output = stream.getvalue() - finally: - sys.stdout = orig_stdout - sys.stderr = orig_stderr - print_warning.orig_stderr = orig_print_warnings_stderr - - if output is not None: - sys.stderr.write(output) - sys.stderr.flush() - else: - # Tell tests to be moderately quiet - support.verbose = verbose - _runtest_env_changed_exc(result, runtests, - display_failure=not verbose) - - xml_list = support.junit_xml_list - if xml_list: - import xml.etree.ElementTree as ET - result.xml_data = [ET.tostring(x).decode('us-ascii') - for x in xml_list] - finally: - if use_timeout: - faulthandler.cancel_dump_traceback_later() - support.junit_xml_list = None - - -def run_single_test(test_name: TestName, runtests: RunTests) -> TestResult: - """Run a single test. - - test_name -- the name of the test - - Returns a TestResult. - - If runtests.use_junit, xml_data is a list containing each generated - testsuite element. - """ - start_time = time.perf_counter() - result = TestResult(test_name) - pgo = runtests.pgo - try: - _runtest(result, runtests) - except: - if not pgo: - msg = traceback.format_exc() - print(f"test {test_name} crashed -- {msg}", - file=sys.stderr, flush=True) - result.state = State.UNCAUGHT_EXC - result.duration = time.perf_counter() - start_time - return result - - -def run_unittest(test_mod): - loader = unittest.TestLoader() - tests = loader.loadTestsFromModule(test_mod) - for error in loader.errors: - print(error, file=sys.stderr) - if loader.errors: - raise Exception("errors while loading tests") - return support.run_unittest(tests) - - -def save_env(test_name: TestName, runtests: RunTests): - return saved_test_environment(test_name, runtests.verbose, runtests.quiet, - pgo=runtests.pgo) - - -def regrtest_runner(result: TestResult, test_func, runtests: RunTests) -> None: - # Run test_func(), collect statistics, and detect reference and memory - # leaks. - if runtests.hunt_refleak: - from test.libregrtest.refleak import runtest_refleak - refleak, test_result = runtest_refleak(result.test_name, test_func, - runtests.hunt_refleak, - runtests.quiet) - else: - test_result = test_func() - refleak = False - - if refleak: - result.state = State.REFLEAK - - match test_result: - case TestStats(): - stats = test_result - case unittest.TestResult(): - stats = TestStats.from_unittest(test_result) - case doctest.TestResults(): - stats = TestStats.from_doctest(test_result) - case None: - print_warning(f"{result.test_name} test runner returned None: {test_func}") - stats = None - case _: - print_warning(f"Unknown test result type: {type(test_result)}") - stats = None - - result.stats = stats - - -# Storage of uncollectable objects -FOUND_GARBAGE = [] - - -def _load_run_test(result: TestResult, runtests: RunTests) -> None: - # Load the test function, run the test function. - module_name = abs_module_name(result.test_name, runtests.test_dir) - - # Remove the module from sys.module to reload it if it was already imported - sys.modules.pop(module_name, None) - - test_mod = importlib.import_module(module_name) - - if hasattr(test_mod, "test_main"): - # https://github.com/python/cpython/issues/89392 - raise Exception(f"Module {result.test_name} defines test_main() which is no longer supported by regrtest") - def test_func(): - return run_unittest(test_mod) - - try: - with save_env(result.test_name, runtests): - regrtest_runner(result, test_func, runtests) - finally: - # First kill any dangling references to open files etc. - # This can also issue some ResourceWarnings which would otherwise get - # triggered during the following test run, and possibly produce - # failures. - support.gc_collect() - - remove_testfn(result.test_name, runtests.verbose) - - if gc.garbage: - support.environment_altered = True - print_warning(f"{result.test_name} created {len(gc.garbage)} " - f"uncollectable object(s)") - - # move the uncollectable objects somewhere, - # so we don't see them again - FOUND_GARBAGE.extend(gc.garbage) - gc.garbage.clear() - - support.reap_children() - - -def _runtest_env_changed_exc(result: TestResult, runtests: RunTests, - display_failure: bool = True) -> None: - # Detect environment changes, handle exceptions. - - # Reset the environment_altered flag to detect if a test altered - # the environment - support.environment_altered = False - - pgo = runtests.pgo - if pgo: - display_failure = False - quiet = runtests.quiet - - test_name = result.test_name - try: - clear_caches() - support.gc_collect() - - with save_env(test_name, runtests): - _load_run_test(result, runtests) - except support.ResourceDenied as msg: - if not quiet and not pgo: - print(f"{test_name} skipped -- {msg}", flush=True) - result.state = State.RESOURCE_DENIED - return - except unittest.SkipTest as msg: - if not quiet and not pgo: - print(f"{test_name} skipped -- {msg}", flush=True) - result.state = State.SKIPPED - return - except support.TestFailedWithDetails as exc: - msg = f"test {test_name} failed" - if display_failure: - msg = f"{msg} -- {exc}" - print(msg, file=sys.stderr, flush=True) - result.state = State.FAILED - result.errors = exc.errors - result.failures = exc.failures - result.stats = exc.stats - return - except support.TestFailed as exc: - msg = f"test {test_name} failed" - if display_failure: - msg = f"{msg} -- {exc}" - print(msg, file=sys.stderr, flush=True) - result.state = State.FAILED - result.stats = exc.stats - return - except support.TestDidNotRun: - result.state = State.DID_NOT_RUN - return - except KeyboardInterrupt: - print() - result.state = State.INTERRUPTED - return - except: - if not pgo: - msg = traceback.format_exc() - print(f"test {test_name} crashed -- {msg}", - file=sys.stderr, flush=True) - result.state = State.UNCAUGHT_EXC - return - - if support.environment_altered: - result.set_env_changed() - # Don't override the state if it was already set (REFLEAK or ENV_CHANGED) - if result.state is None: - result.state = State.PASSED - - -def remove_testfn(test_name: TestName, verbose: int) -> None: - # Try to clean up os_helper.TESTFN if left behind. - # - # While tests shouldn't leave any files or directories behind, when a test - # fails that can be tedious for it to arrange. The consequences can be - # especially nasty on Windows, since if a test leaves a file open, it - # cannot be deleted by name (while there's nothing we can do about that - # here either, we can display the name of the offending test, which is a - # real help). - name = os_helper.TESTFN - if not os.path.exists(name): - return - - if os.path.isdir(name): - import shutil - kind, nuker = "directory", shutil.rmtree - elif os.path.isfile(name): - kind, nuker = "file", os.unlink - else: - raise RuntimeError(f"os.path says {name!r} exists but is neither " - f"directory nor file") - - if verbose: - print_warning(f"{test_name} left behind {kind} {name!r}") - support.environment_altered = True - - try: - import stat - # fix possible permissions problems that might prevent cleanup - os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) - nuker(name) - except Exception as exc: - print_warning(f"{test_name} left behind {kind} {name!r} " - f"and it couldn't be removed: {exc}") diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index c1bd911c43e2c4..f576d49e85db93 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -15,12 +15,13 @@ from test.support import os_helper from test.libregrtest.main import Regrtest -from test.libregrtest.runtest import ( - TestResult, State, PROGRESS_MIN_TIME, - RunTests, TestName) +from test.libregrtest.result import TestResult, State from test.libregrtest.results import TestResults +from test.libregrtest.runtests import RunTests +from test.libregrtest.single import PROGRESS_MIN_TIME from test.libregrtest.utils import ( - format_duration, print_warning, StrPath) + StrPath, TestName, + format_duration, print_warning) from test.libregrtest.worker import create_worker_process, USE_PROCESS_GROUP if sys.platform == 'win32': diff --git a/Lib/test/libregrtest/runtests.py b/Lib/test/libregrtest/runtests.py new file mode 100644 index 00000000000000..366c6f1e7a1046 --- /dev/null +++ b/Lib/test/libregrtest/runtests.py @@ -0,0 +1,83 @@ +import dataclasses +import json +from typing import Any + +from test.libregrtest.utils import ( + StrPath, StrJSON, TestTuple, FilterTuple, FilterDict) + + +@dataclasses.dataclass(slots=True, frozen=True) +class HuntRefleak: + warmups: int + runs: int + filename: StrPath + + +@dataclasses.dataclass(slots=True, frozen=True) +class RunTests: + tests: TestTuple + fail_fast: bool = False + fail_env_changed: bool = False + match_tests: FilterTuple | None = None + ignore_tests: FilterTuple | None = None + match_tests_dict: FilterDict | None = None + rerun: bool = False + forever: bool = False + pgo: bool = False + pgo_extended: bool = False + output_on_failure: bool = False + timeout: float | None = None + verbose: bool = False + quiet: bool = False + hunt_refleak: HuntRefleak | None = None + test_dir: StrPath | None = None + use_junit: bool = False + memory_limit: str | None = None + gc_threshold: int | None = None + use_resources: list[str] = None + python_cmd: list[str] | None = None + + def copy(self, **override): + state = dataclasses.asdict(self) + state.update(override) + return RunTests(**state) + + def get_match_tests(self, test_name) -> FilterTuple | None: + if self.match_tests_dict is not None: + return self.match_tests_dict.get(test_name, None) + else: + return None + + def iter_tests(self): + if self.forever: + while True: + yield from self.tests + else: + yield from self.tests + + def as_json(self) -> StrJSON: + return json.dumps(self, cls=_EncodeRunTests) + + @staticmethod + def from_json(worker_json: StrJSON) -> 'RunTests': + return json.loads(worker_json, object_hook=_decode_runtests) + + +class _EncodeRunTests(json.JSONEncoder): + def default(self, o: Any) -> dict[str, Any]: + if isinstance(o, RunTests): + result = dataclasses.asdict(o) + result["__runtests__"] = True + return result + else: + return super().default(o) + + +def _decode_runtests(data: dict[str, Any]) -> RunTests | dict[str, Any]: + if "__runtests__" in data: + data.pop('__runtests__') + if data['hunt_refleak']: + data['hunt_refleak'] = HuntRefleak(**data['hunt_refleak']) + return RunTests(**data) + else: + return data diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index 48eb8b6800af1e..20ef3dc38cbd04 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -11,6 +11,7 @@ except ImportError: gc = None +from test.libregrtest.runtests import RunTests from test.libregrtest.utils import ( setup_unraisable_hook, setup_threading_excepthook, fix_umask) @@ -25,6 +26,18 @@ def setup_test_dir(testdir: str | None) -> None: sys.path.insert(0, os.path.abspath(testdir)) +def setup_support(runtests: RunTests): + support.PGO = runtests.pgo + support.PGO_EXTENDED = runtests.pgo_extended + support.set_match_tests(runtests.match_tests, runtests.ignore_tests) + support.failfast = runtests.fail_fast + support.verbose = runtests.verbose + if runtests.use_junit: + support.junit_xml_list = [] + else: + support.junit_xml_list = None + + def setup_tests(runtests): fix_umask() diff --git a/Lib/test/libregrtest/single.py b/Lib/test/libregrtest/single.py new file mode 100644 index 00000000000000..bb33387fee0d35 --- /dev/null +++ b/Lib/test/libregrtest/single.py @@ -0,0 +1,275 @@ +import doctest +import faulthandler +import gc +import importlib +import io +import sys +import time +import traceback +import unittest + +from test import support +from test.support import TestStats +from test.support import threading_helper + +from test.libregrtest.result import State, TestResult +from test.libregrtest.runtests import RunTests +from test.libregrtest.save_env import saved_test_environment +from test.libregrtest.setup import setup_support +from test.libregrtest.utils import ( + TestName, + clear_caches, remove_testfn, abs_module_name, print_warning) + + +# Minimum duration of a test to display its duration or to mention that +# the test is running in background +PROGRESS_MIN_TIME = 30.0 # seconds + + +def run_unittest(test_mod): + loader = unittest.TestLoader() + tests = loader.loadTestsFromModule(test_mod) + for error in loader.errors: + print(error, file=sys.stderr) + if loader.errors: + raise Exception("errors while loading tests") + return support.run_unittest(tests) + + +def regrtest_runner(result: TestResult, test_func, runtests: RunTests) -> None: + # Run test_func(), collect statistics, and detect reference and memory + # leaks. + if runtests.hunt_refleak: + from test.libregrtest.refleak import runtest_refleak + refleak, test_result = runtest_refleak(result.test_name, test_func, + runtests.hunt_refleak, + runtests.quiet) + else: + test_result = test_func() + refleak = False + + if refleak: + result.state = State.REFLEAK + + match test_result: + case TestStats(): + stats = test_result + case unittest.TestResult(): + stats = TestStats.from_unittest(test_result) + case doctest.TestResults(): + stats = TestStats.from_doctest(test_result) + case None: + print_warning(f"{result.test_name} test runner returned None: {test_func}") + stats = None + case _: + print_warning(f"Unknown test result type: {type(test_result)}") + stats = None + + result.stats = stats + + +def save_env(test_name: TestName, runtests: RunTests): + return saved_test_environment(test_name, runtests.verbose, runtests.quiet, + pgo=runtests.pgo) + + +# Storage of uncollectable GC objects (gc.garbage) +GC_GARBAGE = [] + + +def _load_run_test(result: TestResult, runtests: RunTests) -> None: + # Load the test function, run the test function. + module_name = abs_module_name(result.test_name, runtests.test_dir) + + # Remove the module from sys.module to reload it if it was already imported + sys.modules.pop(module_name, None) + + test_mod = importlib.import_module(module_name) + + if hasattr(test_mod, "test_main"): + # https://github.com/python/cpython/issues/89392 + raise Exception(f"Module {result.test_name} defines test_main() which is no longer supported by regrtest") + def test_func(): + return run_unittest(test_mod) + + try: + with save_env(result.test_name, runtests): + regrtest_runner(result, test_func, runtests) + finally: + # First kill any dangling references to open files etc. + # This can also issue some ResourceWarnings which would otherwise get + # triggered during the following test run, and possibly produce + # failures. + support.gc_collect() + + remove_testfn(result.test_name, runtests.verbose) + + if gc.garbage: + support.environment_altered = True + print_warning(f"{result.test_name} created {len(gc.garbage)} " + f"uncollectable object(s)") + + # move the uncollectable objects somewhere, + # so we don't see them again + GC_GARBAGE.extend(gc.garbage) + gc.garbage.clear() + + support.reap_children() + + +def _runtest_env_changed_exc(result: TestResult, runtests: RunTests, + display_failure: bool = True) -> None: + # Detect environment changes, handle exceptions. + + # Reset the environment_altered flag to detect if a test altered + # the environment + support.environment_altered = False + + pgo = runtests.pgo + if pgo: + display_failure = False + quiet = runtests.quiet + + test_name = result.test_name + try: + clear_caches() + support.gc_collect() + + with save_env(test_name, runtests): + _load_run_test(result, runtests) + except support.ResourceDenied as msg: + if not quiet and not pgo: + print(f"{test_name} skipped -- {msg}", flush=True) + result.state = State.RESOURCE_DENIED + return + except unittest.SkipTest as msg: + if not quiet and not pgo: + print(f"{test_name} skipped -- {msg}", flush=True) + result.state = State.SKIPPED + return + except support.TestFailedWithDetails as exc: + msg = f"test {test_name} failed" + if display_failure: + msg = f"{msg} -- {exc}" + print(msg, file=sys.stderr, flush=True) + result.state = State.FAILED + result.errors = exc.errors + result.failures = exc.failures + result.stats = exc.stats + return + except support.TestFailed as exc: + msg = f"test {test_name} failed" + if display_failure: + msg = f"{msg} -- {exc}" + print(msg, file=sys.stderr, flush=True) + result.state = State.FAILED + result.stats = exc.stats + return + except support.TestDidNotRun: + result.state = State.DID_NOT_RUN + return + except KeyboardInterrupt: + print() + result.state = State.INTERRUPTED + return + except: + if not pgo: + msg = traceback.format_exc() + print(f"test {test_name} crashed -- {msg}", + file=sys.stderr, flush=True) + result.state = State.UNCAUGHT_EXC + return + + if support.environment_altered: + result.set_env_changed() + # Don't override the state if it was already set (REFLEAK or ENV_CHANGED) + if result.state is None: + result.state = State.PASSED + + +def _runtest(result: TestResult, runtests: RunTests) -> None: + # Capture stdout and stderr, set faulthandler timeout, + # and create JUnit XML report. + verbose = runtests.verbose + output_on_failure = runtests.output_on_failure + timeout = runtests.timeout + + use_timeout = ( + timeout is not None and threading_helper.can_start_thread + ) + if use_timeout: + faulthandler.dump_traceback_later(timeout, exit=True) + + try: + setup_support(runtests) + + if output_on_failure: + support.verbose = True + + stream = io.StringIO() + orig_stdout = sys.stdout + orig_stderr = sys.stderr + print_warning = support.print_warning + orig_print_warnings_stderr = print_warning.orig_stderr + + output = None + try: + sys.stdout = stream + sys.stderr = stream + # print_warning() writes into the temporary stream to preserve + # messages order. If support.environment_altered becomes true, + # warnings will be written to sys.stderr below. + print_warning.orig_stderr = stream + + _runtest_env_changed_exc(result, runtests, display_failure=False) + # Ignore output if the test passed successfully + if result.state != State.PASSED: + output = stream.getvalue() + finally: + sys.stdout = orig_stdout + sys.stderr = orig_stderr + print_warning.orig_stderr = orig_print_warnings_stderr + + if output is not None: + sys.stderr.write(output) + sys.stderr.flush() + else: + # Tell tests to be moderately quiet + support.verbose = verbose + _runtest_env_changed_exc(result, runtests, + display_failure=not verbose) + + xml_list = support.junit_xml_list + if xml_list: + import xml.etree.ElementTree as ET + result.xml_data = [ET.tostring(x).decode('us-ascii') + for x in xml_list] + finally: + if use_timeout: + faulthandler.cancel_dump_traceback_later() + support.junit_xml_list = None + + +def run_single_test(test_name: TestName, runtests: RunTests) -> TestResult: + """Run a single test. + + test_name -- the name of the test + + Returns a TestResult. + + If runtests.use_junit, xml_data is a list containing each generated + testsuite element. + """ + start_time = time.perf_counter() + result = TestResult(test_name) + pgo = runtests.pgo + try: + _runtest(result, runtests) + except: + if not pgo: + msg = traceback.format_exc() + print(f"test {test_name} crashed -- {msg}", + file=sys.stderr, flush=True) + result.state = State.UNCAUGHT_EXC + result.duration = time.perf_counter() - start_time + return result diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index e77772cc2577fe..011d287e1674cd 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -21,7 +21,16 @@ EXIT_TIMEOUT = 120.0 +# Types for types hints StrPath = str +TestName = str +StrJSON = str +TestTuple = tuple[TestName, ...] +TestList = list[TestName] +# --match and --ignore options: list of patterns +# ('*' joker character can be used) +FilterTuple = tuple[TestName, ...] +FilterDict = dict[TestName, FilterTuple] def format_duration(seconds): @@ -389,3 +398,76 @@ def exit_timeout(): if threading_helper.can_start_thread: faulthandler.dump_traceback_later(EXIT_TIMEOUT, exit=True) sys.exit(exc.code) + + +def remove_testfn(test_name: TestName, verbose: int) -> None: + # Try to clean up os_helper.TESTFN if left behind. + # + # While tests shouldn't leave any files or directories behind, when a test + # fails that can be tedious for it to arrange. The consequences can be + # especially nasty on Windows, since if a test leaves a file open, it + # cannot be deleted by name (while there's nothing we can do about that + # here either, we can display the name of the offending test, which is a + # real help). + name = os_helper.TESTFN + if not os.path.exists(name): + return + + if os.path.isdir(name): + import shutil + kind, nuker = "directory", shutil.rmtree + elif os.path.isfile(name): + kind, nuker = "file", os.unlink + else: + raise RuntimeError(f"os.path says {name!r} exists but is neither " + f"directory nor file") + + if verbose: + print_warning(f"{test_name} left behind {kind} {name!r}") + support.environment_altered = True + + try: + import stat + # fix possible permissions problems that might prevent cleanup + os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) + nuker(name) + except Exception as exc: + print_warning(f"{test_name} left behind {kind} {name!r} " + f"and it couldn't be removed: {exc}") + + +def abs_module_name(test_name: TestName, test_dir: StrPath | None) -> TestName: + if test_name.startswith('test.') or test_dir: + return test_name + else: + # Import it from the test package + return 'test.' + test_name + + +# gh-90681: When rerunning tests, we might need to rerun the whole +# class or module suite if some its life-cycle hooks fail. +# Test level hooks are not affected. +_TEST_LIFECYCLE_HOOKS = frozenset(( + 'setUpClass', 'tearDownClass', + 'setUpModule', 'tearDownModule', +)) + +def normalize_test_name(test_full_name, *, is_error=False): + short_name = test_full_name.split(" ")[0] + if is_error and short_name in _TEST_LIFECYCLE_HOOKS: + if test_full_name.startswith(('setUpModule (', 'tearDownModule (')): + # if setUpModule() or tearDownModule() failed, don't filter + # tests with the test file name, don't use use filters. + return None + + # This means that we have a failure in a life-cycle hook, + # we need to rerun the whole module or class suite. + # Basically the error looks like this: + # ERROR: setUpClass (test.test_reg_ex.RegTest) + # or + # ERROR: setUpModule (test.test_reg_ex) + # So, we need to parse the class / module name. + lpar = test_full_name.index('(') + rpar = test_full_name.index(')') + return test_full_name[lpar + 1: rpar].split('.')[-1] + return short_name diff --git a/Lib/test/libregrtest/worker.py b/Lib/test/libregrtest/worker.py index 033a0a3ff62260..24251c35cdd2f1 100644 --- a/Lib/test/libregrtest/worker.py +++ b/Lib/test/libregrtest/worker.py @@ -7,9 +7,11 @@ from test.support import os_helper from test.libregrtest.setup import setup_tests, setup_test_dir -from test.libregrtest.runtest import ( - run_single_test, StrJSON, FilterTuple, RunTests) -from test.libregrtest.utils import get_work_dir, exit_timeout, StrPath +from test.libregrtest.runtests import RunTests +from test.libregrtest.single import run_single_test +from test.libregrtest.utils import ( + StrPath, StrJSON, FilterTuple, + get_work_dir, exit_timeout) USE_PROCESS_GROUP = (hasattr(os, "setsid") and hasattr(os, "killpg")) diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index a5ee4c2155536e..21babb5185548f 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -22,7 +22,7 @@ from test import support from test.support import os_helper, TestStats from test.libregrtest import utils, setup -from test.libregrtest.runtest import normalize_test_name +from test.libregrtest.utils import normalize_test_name if not support.has_subprocess_support: raise unittest.SkipTest("test module requires subprocess") From 0b6b05391bcc5893d2b71032cb704995696ecd0b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 11 Sep 2023 03:46:26 +0200 Subject: [PATCH 142/357] gh-109162: libregrtest: fix Logger (#109246) * Pass results, quiet and pgo to Logger constructor. * Move display_progress() method from Regrtest to Logger. * No longer pass Regrtest to RunWorkers, but logger and results. --- Lib/test/libregrtest/logger.py | 18 +++++++++++++- Lib/test/libregrtest/main.py | 39 +++++++++++------------------- Lib/test/libregrtest/runtest_mp.py | 11 ++++++--- 3 files changed, 38 insertions(+), 30 deletions(-) diff --git a/Lib/test/libregrtest/logger.py b/Lib/test/libregrtest/logger.py index 05b9307c97ded1..6195b5ddd4ebc0 100644 --- a/Lib/test/libregrtest/logger.py +++ b/Lib/test/libregrtest/logger.py @@ -1,6 +1,7 @@ import os import time +from test.libregrtest.results import TestResults from test.libregrtest.runtests import RunTests from test.libregrtest.utils import print_warning, MS_WINDOWS @@ -9,11 +10,14 @@ class Logger: - def __init__(self): + def __init__(self, results: TestResults, quiet: bool, pgo: bool): self.start_time = time.perf_counter() self.test_count_text = '' self.test_count_width = 3 self.win_load_tracker = None + self._results: TestResults = results + self._quiet: bool = quiet + self._pgo: bool = pgo def log(self, line: str = '') -> None: empty = not line @@ -43,6 +47,18 @@ def get_load_avg(self) -> float | None: return self.win_load_tracker.getloadavg() return None + def display_progress(self, test_index: int, text: str) -> None: + if self._quiet: + return + results = self._results + + # "[ 51/405/1] test_tcl passed" + line = f"{test_index:{self.test_count_width}}{self.test_count_text}" + fails = len(results.bad) + len(results.env_changed) + if fails and not self._pgo: + line = f"{line}/{fails}" + self.log(f"[{line}] {text}") + def set_tests(self, runtests: RunTests) -> None: if runtests.forever: self.test_count_text = '' diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 0227a2d1fc612e..0864cbb3276d2b 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -50,7 +50,18 @@ class Regrtest: on the command line. """ def __init__(self, ns: Namespace): - self.logger = Logger() + # Log verbosity + self.verbose: bool = ns.verbose + self.quiet: bool = ns.quiet + self.pgo: bool = ns.pgo + self.pgo_extended: bool = ns.pgo_extended + + # Test results + self.results: TestResults = TestResults() + self.first_state: str | None = None + + # Logger + self.logger = Logger(self.results, self.quiet, self.pgo) # Actions self.want_header: bool = ns.header @@ -92,12 +103,8 @@ def __init__(self, ns: Namespace): self.forever: bool = ns.forever self.randomize: bool = ns.randomize self.random_seed: int | None = ns.random_seed - self.pgo: bool = ns.pgo - self.pgo_extended: bool = ns.pgo_extended self.output_on_failure: bool = ns.verbose3 self.timeout: float | None = ns.timeout - self.verbose: bool = ns.verbose - self.quiet: bool = ns.quiet if ns.huntrleaks: warmups, runs, filename = ns.huntrleaks filename = os.path.abspath(filename) @@ -119,18 +126,11 @@ def __init__(self, ns: Namespace): self.selected: TestList = [] self.first_runtests: RunTests | None = None - # test results - self.results: TestResults = TestResults() - - self.first_state: str | None = None - # used by --slowest self.print_slowest: bool = ns.print_slow # used to display the progress bar "[ 3/100]" self.start_time = time.perf_counter() - self.test_count_text = '' - self.test_count_width = 1 # used by --single self.single_test_run: bool = ns.single @@ -140,17 +140,6 @@ def __init__(self, ns: Namespace): def log(self, line=''): self.logger.log(line) - def display_progress(self, test_index, text): - if self.quiet: - return - - # "[ 51/405/1] test_tcl passed" - line = f"{test_index:{self.test_count_width}}{self.test_count_text}" - fails = len(self.results.bad) + len(self.results.env_changed) - if fails and not self.pgo: - line = f"{line}/{fails}" - self.log(f"[{line}] {text}") - def find_tests(self): if self.single_test_run: self.next_single_filename = os.path.join(self.tmp_dir, 'pynexttest') @@ -344,7 +333,7 @@ def run_tests_sequentially(self, runtests): text = test_name if previous_test: text = '%s -- %s' % (text, previous_test) - self.display_progress(test_index, text) + self.logger.display_progress(test_index, text) result = self.run_test(test_name, runtests, tracer) @@ -416,7 +405,7 @@ def get_state(self): def _run_tests_mp(self, runtests: RunTests, num_workers: int) -> None: from test.libregrtest.runtest_mp import RunWorkers - RunWorkers(self, runtests, num_workers).run() + RunWorkers(num_workers, runtests, self.logger, self.results).run() def finalize_tests(self, tracer): if self.next_single_filename: diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index f576d49e85db93..96b2ac521b9d82 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -14,6 +14,7 @@ from test import support from test.support import os_helper +from test.libregrtest.logger import Logger from test.libregrtest.main import Regrtest from test.libregrtest.result import TestResult, State from test.libregrtest.results import TestResults @@ -360,12 +361,14 @@ def get_running(workers: list[WorkerThread]) -> list[str]: class RunWorkers: - def __init__(self, regrtest: Regrtest, runtests: RunTests, num_workers: int) -> None: - self.results: TestResults = regrtest.results - self.log = regrtest.logger.log - self.display_progress = regrtest.display_progress + def __init__(self, num_workers: int, runtests: RunTests, + logger: Logger, results: TestResult) -> None: self.num_workers = num_workers self.runtests = runtests + self.log = logger.log + self.display_progress = logger.display_progress + self.results: TestResults = results + self.output: queue.Queue[QueueOutput] = queue.Queue() tests_iter = runtests.iter_tests() self.pending = MultiprocessIterator(tests_iter) From 0c139b5f2fb9c8a9e6df58e5da9d4a992d17926d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 11 Sep 2023 05:27:37 +0200 Subject: [PATCH 143/357] gh-109162: libregrtest: rename runtest_mp.py to run_workers.py (#109248) * Rename runtest_mp.py to run_workers.py * Move exit_timeout() and temp_cwd() context managers from Regrtest.main() to Regrtest.run_tests(). Actions like --list-tests or --list-cases don't need these protections. * Regrtest: remove selected and tests attributes. Pass 'selected' to list_tests(), list_cases() and run_tests(). display_result() now expects a TestTuple, instead of TestList. * Rename setup_tests() to setup_process() and rename setup_support() to setup_tests(). * Move _adjust_resource_limits() to utils and rename it to adjust_rlimit_nofile(). * Move replace_stdout() to utils. * Fix RunTests.verbose type: it's an int. --- Lib/test/libregrtest/main.py | 133 +++++++++--------- Lib/test/libregrtest/result.py | 4 +- Lib/test/libregrtest/results.py | 4 +- .../{runtest_mp.py => run_workers.py} | 5 +- Lib/test/libregrtest/runtests.py | 4 +- Lib/test/libregrtest/setup.py | 124 +++++----------- Lib/test/libregrtest/single.py | 4 +- Lib/test/libregrtest/utils.py | 53 +++++++ Lib/test/libregrtest/worker.py | 4 +- 9 files changed, 171 insertions(+), 164 deletions(-) rename Lib/test/libregrtest/{runtest_mp.py => run_workers.py} (98%) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 0864cbb3276d2b..31eab99ca76351 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -15,12 +15,12 @@ from test.libregrtest.logger import Logger from test.libregrtest.result import State from test.libregrtest.runtests import RunTests, HuntRefleak -from test.libregrtest.setup import setup_tests, setup_test_dir +from test.libregrtest.setup import setup_process, setup_test_dir from test.libregrtest.single import run_single_test, PROGRESS_MIN_TIME from test.libregrtest.pgo import setup_pgo_tests from test.libregrtest.results import TestResults from test.libregrtest.utils import ( - StrPath, StrJSON, TestName, TestList, FilterTuple, + StrPath, StrJSON, TestName, TestList, TestTuple, FilterTuple, strip_py_suffix, count, format_duration, printlist, get_build_info, get_temp_dir, get_work_dir, exit_timeout, abs_module_name) @@ -51,7 +51,7 @@ class Regrtest: """ def __init__(self, ns: Namespace): # Log verbosity - self.verbose: bool = ns.verbose + self.verbose: int = int(ns.verbose) self.quiet: bool = ns.quiet self.pgo: bool = ns.pgo self.pgo_extended: bool = ns.pgo_extended @@ -122,8 +122,6 @@ def __init__(self, ns: Namespace): self.tmp_dir: StrPath | None = ns.tempdir # tests - self.tests = [] - self.selected: TestList = [] self.first_runtests: RunTests | None = None # used by --slowest @@ -140,18 +138,18 @@ def __init__(self, ns: Namespace): def log(self, line=''): self.logger.log(line) - def find_tests(self): + def find_tests(self, tests: TestList | None = None) -> tuple[TestTuple, TestList | None]: if self.single_test_run: 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() - self.tests = [next_test] + tests = [next_test] except OSError: pass if self.fromfile: - self.tests = [] + tests = [] # regex to match 'test_builtin' in line: # '0:00:00 [ 4/400] test_builtin -- test_dict took 1 sec' regex = re.compile(r'\btest_[a-zA-Z0-9_]+\b') @@ -161,9 +159,9 @@ def find_tests(self): line = line.strip() match = regex.search(line) if match is not None: - self.tests.append(match.group()) + tests.append(match.group()) - strip_py_suffix(self.tests) + strip_py_suffix(tests) if self.pgo: # add default PGO tests if no tests are specified @@ -179,18 +177,18 @@ def find_tests(self): exclude=exclude_tests) if not self.fromfile: - self.selected = self.tests or self.cmdline_args - if self.selected: - self.selected = split_test_packages(self.selected) + selected = tests or self.cmdline_args + if selected: + selected = split_test_packages(selected) else: - self.selected = alltests + selected = alltests else: - self.selected = self.tests + selected = tests if self.single_test_run: - self.selected = self.selected[:1] + selected = selected[:1] try: - pos = alltests.index(self.selected[0]) + pos = alltests.index(selected[0]) self.next_single_test = alltests[pos + 1] except IndexError: pass @@ -198,7 +196,7 @@ def find_tests(self): # Remove all the selected tests that precede start if it's set. if self.starting_test: try: - del self.selected[:self.selected.index(self.starting_test)] + del selected[:selected.index(self.starting_test)] except ValueError: print(f"Cannot find starting test: {self.starting_test}") sys.exit(1) @@ -207,10 +205,12 @@ def find_tests(self): if self.random_seed is None: self.random_seed = random.randrange(100_000_000) random.seed(self.random_seed) - random.shuffle(self.selected) + random.shuffle(selected) + + return (tuple(selected), tests) @staticmethod - def list_tests(tests: TestList): + def list_tests(tests: TestTuple): for name in tests: print(name) @@ -224,12 +224,12 @@ def _list_cases(self, suite): if support.match_test(test): print(test.id()) - def list_cases(self): + def list_cases(self, tests: TestTuple): support.verbose = False support.set_match_tests(self.match_tests, self.ignore_tests) skipped = [] - for test_name in self.selected: + for test_name in tests: module_name = abs_module_name(test_name, self.test_dir) try: suite = unittest.defaultTestLoader.loadTestsFromName(module_name) @@ -247,6 +247,10 @@ def list_cases(self): def _rerun_failed_tests(self, runtests: RunTests): # Configure the runner to re-run tests if self.num_workers == 0: + # Always run tests in fresh processes to have more deterministic + # initial state. Don't re-run tests in parallel but limit to a + # single worker process to have side effects (on the system load + # and timings) between tests. self.num_workers = 1 tests, match_tests_dict = self.results.prepare_rerun() @@ -294,7 +298,8 @@ def display_result(self, runtests): print() print(f"== Tests result: {state} ==") - self.results.display_result(self.selected, self.quiet, self.print_slowest) + self.results.display_result(runtests.tests, + self.quiet, self.print_slowest) def run_test(self, test_name: TestName, runtests: RunTests, tracer): if tracer is not None: @@ -404,7 +409,7 @@ def get_state(self): return state def _run_tests_mp(self, runtests: RunTests, num_workers: int) -> None: - from test.libregrtest.runtest_mp import RunWorkers + from test.libregrtest.run_workers import RunWorkers RunWorkers(num_workers, runtests, self.logger, self.results).run() def finalize_tests(self, tracer): @@ -454,39 +459,9 @@ def cleanup_temp_dir(tmp_dir: StrPath): print("Remove file: %s" % name) os_helper.unlink(name) - def main(self, tests: TestList | None = None): - if self.junit_filename and not os.path.isabs(self.junit_filename): - self.junit_filename = os.path.abspath(self.junit_filename) - - self.tests = tests - - strip_py_suffix(self.cmdline_args) - - self.tmp_dir = get_temp_dir(self.tmp_dir) - - if self.want_cleanup: - self.cleanup_temp_dir(self.tmp_dir) - sys.exit(0) - - os.makedirs(self.tmp_dir, exist_ok=True) - work_dir = get_work_dir(parent_dir=self.tmp_dir) - - with exit_timeout(): - # 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 os_helper.SAVEDCWD. - with os_helper.temp_cwd(work_dir, quiet=True): - # When using multiprocessing, worker processes will use - # work_dir as their parent temporary directory. So when the - # main process exit, it removes also subdirectories of worker - # processes. - - self._main() - - def create_run_tests(self): + def create_run_tests(self, tests: TestTuple): return RunTests( - tuple(self.selected), + tests, fail_fast=self.fail_fast, match_tests=self.match_tests, ignore_tests=self.ignore_tests, @@ -506,7 +481,7 @@ def create_run_tests(self): python_cmd=self.python_cmd, ) - def run_tests(self) -> int: + def _run_tests(self, selected: TestTuple, tests: TestList | None) -> int: if self.hunt_refleak and self.hunt_refleak.warmups < 3: msg = ("WARNING: Running tests with --huntrleaks/-R and " "less than 3 warmup repetitions can give false positives!") @@ -520,17 +495,17 @@ def run_tests(self) -> int: # For a partial run, we do not need to clutter the output. if (self.want_header or not(self.pgo or self.quiet or self.single_test_run - or self.tests or self.cmdline_args)): + or tests or self.cmdline_args)): self.display_header() if self.randomize: print("Using random seed", self.random_seed) - runtests = self.create_run_tests() + runtests = self.create_run_tests(selected) self.first_runtests = runtests self.logger.set_tests(runtests) - setup_tests(runtests) + setup_process() self.logger.start_load_tracker() try: @@ -553,20 +528,48 @@ def run_tests(self) -> int: return self.results.get_exitcode(self.fail_env_changed, self.fail_rerun) - def _main(self): + def run_tests(self, selected: TestTuple, tests: TestList | None) -> int: + os.makedirs(self.tmp_dir, exist_ok=True) + work_dir = get_work_dir(parent_dir=self.tmp_dir) + + # Put a timeout on Python exit + with exit_timeout(): + # 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 os_helper.SAVEDCWD. + with os_helper.temp_cwd(work_dir, quiet=True): + # When using multiprocessing, worker processes will use + # work_dir as their parent temporary directory. So when the + # main process exit, it removes also subdirectories of worker + # processes. + return self._run_tests(selected, tests) + + def main(self, tests: TestList | None = None): + if self.junit_filename and not os.path.isabs(self.junit_filename): + self.junit_filename = os.path.abspath(self.junit_filename) + + strip_py_suffix(self.cmdline_args) + + self.tmp_dir = get_temp_dir(self.tmp_dir) + + if self.want_cleanup: + self.cleanup_temp_dir(self.tmp_dir) + sys.exit(0) + if self.want_wait: input("Press any key to continue...") setup_test_dir(self.test_dir) - self.find_tests() + selected, tests = self.find_tests(tests) exitcode = 0 if self.want_list_tests: - self.list_tests(self.selected) + self.list_tests(selected) elif self.want_list_cases: - self.list_cases() + self.list_cases(selected) else: - exitcode = self.run_tests() + exitcode = self.run_tests(selected, tests) sys.exit(exitcode) diff --git a/Lib/test/libregrtest/result.py b/Lib/test/libregrtest/result.py index 4a68872369c9e7..b73494d07583fc 100644 --- a/Lib/test/libregrtest/result.py +++ b/Lib/test/libregrtest/result.py @@ -5,7 +5,7 @@ from test.support import TestStats from test.libregrtest.utils import ( - TestName, FilterTuple, + StrJSON, TestName, FilterTuple, format_duration, normalize_test_name, print_warning) @@ -160,7 +160,7 @@ def write_json(self, file) -> None: json.dump(self, file, cls=_EncodeTestResult) @staticmethod - def from_json(worker_json) -> 'TestResult': + def from_json(worker_json: StrJSON) -> 'TestResult': return json.loads(worker_json, object_hook=_decode_test_result) diff --git a/Lib/test/libregrtest/results.py b/Lib/test/libregrtest/results.py index b7a044eae25aae..6a07c2fcf3092c 100644 --- a/Lib/test/libregrtest/results.py +++ b/Lib/test/libregrtest/results.py @@ -106,7 +106,7 @@ def accumulate_result(self, result: TestResult, runtests: RunTests): xml_data = result.xml_data if xml_data: - self.add_junit(result.xml_data) + self.add_junit(xml_data) def need_rerun(self): return bool(self.bad_results) @@ -163,7 +163,7 @@ def write_junit(self, filename: StrPath): for s in ET.tostringlist(root): f.write(s) - def display_result(self, tests: TestList, quiet: bool, print_slowest: bool): + def display_result(self, tests: TestTuple, quiet: bool, print_slowest: bool): if self.interrupted: print("Test suite interrupted by signal SIGINT.") diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/run_workers.py similarity index 98% rename from Lib/test/libregrtest/runtest_mp.py rename to Lib/test/libregrtest/run_workers.py index 96b2ac521b9d82..6267fe5a924d9f 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/run_workers.py @@ -15,7 +15,6 @@ from test.support import os_helper from test.libregrtest.logger import Logger -from test.libregrtest.main import Regrtest from test.libregrtest.result import TestResult, State from test.libregrtest.results import TestResults from test.libregrtest.runtests import RunTests @@ -154,10 +153,10 @@ def mp_result_error( ) -> MultiprocessResult: return MultiprocessResult(test_result, stdout, err_msg) - def _run_process(self, worker_job, output_file: TextIO, + def _run_process(self, runtests: RunTests, output_file: TextIO, tmp_dir: StrPath | None = None) -> int: try: - popen = create_worker_process(worker_job, output_file, tmp_dir) + popen = create_worker_process(runtests, output_file, tmp_dir) self._killed = False self._popen = popen diff --git a/Lib/test/libregrtest/runtests.py b/Lib/test/libregrtest/runtests.py index 366c6f1e7a1046..e16e79e990c8f1 100644 --- a/Lib/test/libregrtest/runtests.py +++ b/Lib/test/libregrtest/runtests.py @@ -27,14 +27,14 @@ class RunTests: pgo_extended: bool = False output_on_failure: bool = False timeout: float | None = None - verbose: bool = False + verbose: int = 0 quiet: bool = False hunt_refleak: HuntRefleak | None = None test_dir: StrPath | None = None use_junit: bool = False memory_limit: str | None = None gc_threshold: int | None = None - use_resources: list[str] = None + use_resources: list[str] = dataclasses.field(default_factory=list) python_cmd: list[str] | None = None def copy(self, **override): diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index 20ef3dc38cbd04..c3d81273163860 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -1,4 +1,3 @@ -import atexit import faulthandler import os import signal @@ -13,7 +12,8 @@ from test.libregrtest.runtests import RunTests from test.libregrtest.utils import ( - setup_unraisable_hook, setup_threading_excepthook, fix_umask) + setup_unraisable_hook, setup_threading_excepthook, fix_umask, + replace_stdout, adjust_rlimit_nofile) UNICODE_GUARD_ENV = "PYTHONREGRTEST_UNICODE_GUARD" @@ -26,19 +26,7 @@ def setup_test_dir(testdir: str | None) -> None: sys.path.insert(0, os.path.abspath(testdir)) -def setup_support(runtests: RunTests): - support.PGO = runtests.pgo - support.PGO_EXTENDED = runtests.pgo_extended - support.set_match_tests(runtests.match_tests, runtests.ignore_tests) - support.failfast = runtests.fail_fast - support.verbose = runtests.verbose - if runtests.use_junit: - support.junit_xml_list = [] - else: - support.junit_xml_list = None - - -def setup_tests(runtests): +def setup_process(): fix_umask() try: @@ -62,7 +50,7 @@ def setup_tests(runtests): for signum in signals: faulthandler.register(signum, chain=True, file=stderr_fd) - _adjust_resource_limits() + adjust_rlimit_nofile() replace_stdout() support.record_original_stdout(sys.stdout) @@ -83,19 +71,6 @@ def setup_tests(runtests): if getattr(module, '__file__', None): module.__file__ = os.path.abspath(module.__file__) - if runtests.hunt_refleak: - unittest.BaseTestSuite._cleanup = False - - if runtests.memory_limit is not None: - support.set_memlimit(runtests.memory_limit) - - if runtests.gc_threshold is not None: - gc.set_threshold(runtests.gc_threshold) - - support.suppress_msvcrt_asserts(runtests.verbose and runtests.verbose >= 2) - - support.use_resources = runtests.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): @@ -105,6 +80,36 @@ def _test_audit_hook(name, args): setup_unraisable_hook() setup_threading_excepthook() + # Ensure there's a non-ASCII character in env vars at all times to force + # tests consider this case. See BPO-44647 for details. + if TESTFN_UNDECODABLE and os.supports_bytes_environ: + os.environb.setdefault(UNICODE_GUARD_ENV.encode(), TESTFN_UNDECODABLE) + elif FS_NONASCII: + os.environ.setdefault(UNICODE_GUARD_ENV, FS_NONASCII) + + +def setup_tests(runtests: RunTests): + support.verbose = runtests.verbose + support.failfast = runtests.fail_fast + support.PGO = runtests.pgo + support.PGO_EXTENDED = runtests.pgo_extended + + support.set_match_tests(runtests.match_tests, runtests.ignore_tests) + + if runtests.use_junit: + support.junit_xml_list = [] + from test.support.testresult import RegressionTestResult + RegressionTestResult.USE_XML = True + else: + support.junit_xml_list = None + + if runtests.memory_limit is not None: + support.set_memlimit(runtests.memory_limit) + + support.suppress_msvcrt_asserts(runtests.verbose >= 2) + + support.use_resources = runtests.use_resources + timeout = runtests.timeout if timeout is not None: # For a slow buildbot worker, increase SHORT_TIMEOUT and LONG_TIMEOUT @@ -117,61 +122,8 @@ def _test_audit_hook(name, args): support.SHORT_TIMEOUT = min(support.SHORT_TIMEOUT, timeout) support.LONG_TIMEOUT = min(support.LONG_TIMEOUT, timeout) - if runtests.use_junit: - from test.support.testresult import RegressionTestResult - RegressionTestResult.USE_XML = True - - # Ensure there's a non-ASCII character in env vars at all times to force - # tests consider this case. See BPO-44647 for details. - if TESTFN_UNDECODABLE and os.supports_bytes_environ: - os.environb.setdefault(UNICODE_GUARD_ENV.encode(), TESTFN_UNDECODABLE) - elif FS_NONASCII: - os.environ.setdefault(UNICODE_GUARD_ENV, FS_NONASCII) - - -def replace_stdout(): - """Set stdout encoder error handler to backslashreplace (as stderr error - handler) to avoid UnicodeEncodeError when printing a traceback""" - stdout = sys.stdout - try: - fd = stdout.fileno() - except ValueError: - # On IDLE, sys.stdout has no file descriptor and is not a TextIOWrapper - # object. Leaving sys.stdout unchanged. - # - # Catch ValueError to catch io.UnsupportedOperation on TextIOBase - # and ValueError on a closed stream. - return - - sys.stdout = open(fd, 'w', - encoding=stdout.encoding, - errors="backslashreplace", - closefd=False, - newline='\n') - - def restore_stdout(): - sys.stdout.close() - sys.stdout = stdout - atexit.register(restore_stdout) - + if runtests.hunt_refleak: + unittest.BaseTestSuite._cleanup = False -def _adjust_resource_limits(): - """Adjust the system resource limits (ulimit) if needed.""" - try: - import resource - from resource import RLIMIT_NOFILE - except ImportError: - return - fd_limit, max_fds = resource.getrlimit(RLIMIT_NOFILE) - # On macOS the default fd limit is sometimes too low (256) for our - # test suite to succeed. Raise it to something more reasonable. - # 1024 is a common Linux default. - desired_fds = 1024 - if fd_limit < desired_fds and fd_limit < max_fds: - new_fd_limit = min(desired_fds, max_fds) - try: - resource.setrlimit(RLIMIT_NOFILE, (new_fd_limit, max_fds)) - print(f"Raised RLIMIT_NOFILE: {fd_limit} -> {new_fd_limit}") - except (ValueError, OSError) as err: - print(f"Unable to raise RLIMIT_NOFILE from {fd_limit} to " - f"{new_fd_limit}: {err}.") + if runtests.gc_threshold is not None: + gc.set_threshold(runtests.gc_threshold) diff --git a/Lib/test/libregrtest/single.py b/Lib/test/libregrtest/single.py index bb33387fee0d35..0cb31925787893 100644 --- a/Lib/test/libregrtest/single.py +++ b/Lib/test/libregrtest/single.py @@ -15,7 +15,7 @@ from test.libregrtest.result import State, TestResult from test.libregrtest.runtests import RunTests from test.libregrtest.save_env import saved_test_environment -from test.libregrtest.setup import setup_support +from test.libregrtest.setup import setup_tests from test.libregrtest.utils import ( TestName, clear_caches, remove_testfn, abs_module_name, print_warning) @@ -201,7 +201,7 @@ def _runtest(result: TestResult, runtests: RunTests) -> None: faulthandler.dump_traceback_later(timeout, exit=True) try: - setup_support(runtests) + setup_tests(runtests) if output_on_failure: support.verbose = True diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 011d287e1674cd..f97e3fd4bb7106 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -1,3 +1,4 @@ +import atexit import contextlib import faulthandler import math @@ -471,3 +472,55 @@ def normalize_test_name(test_full_name, *, is_error=False): rpar = test_full_name.index(')') return test_full_name[lpar + 1: rpar].split('.')[-1] return short_name + + +def replace_stdout(): + """Set stdout encoder error handler to backslashreplace (as stderr error + handler) to avoid UnicodeEncodeError when printing a traceback""" + stdout = sys.stdout + try: + fd = stdout.fileno() + except ValueError: + # On IDLE, sys.stdout has no file descriptor and is not a TextIOWrapper + # object. Leaving sys.stdout unchanged. + # + # Catch ValueError to catch io.UnsupportedOperation on TextIOBase + # and ValueError on a closed stream. + return + + sys.stdout = open(fd, 'w', + encoding=stdout.encoding, + errors="backslashreplace", + closefd=False, + newline='\n') + + def restore_stdout(): + sys.stdout.close() + sys.stdout = stdout + atexit.register(restore_stdout) + + +def adjust_rlimit_nofile(): + """ + On macOS the default fd limit (RLIMIT_NOFILE) is sometimes too low (256) + for our test suite to succeed. Raise it to something more reasonable. 1024 + is a common Linux default. + """ + try: + import resource + except ImportError: + return + + fd_limit, max_fds = resource.getrlimit(resource.RLIMIT_NOFILE) + + desired_fds = 1024 + + if fd_limit < desired_fds and fd_limit < max_fds: + new_fd_limit = min(desired_fds, max_fds) + try: + resource.setrlimit(resource.RLIMIT_NOFILE, + (new_fd_limit, max_fds)) + print(f"Raised RLIMIT_NOFILE: {fd_limit} -> {new_fd_limit}") + except (ValueError, OSError) as err: + print_warning(f"Unable to raise RLIMIT_NOFILE from {fd_limit} to " + f"{new_fd_limit}: {err}.") diff --git a/Lib/test/libregrtest/worker.py b/Lib/test/libregrtest/worker.py index 24251c35cdd2f1..b9fb031764349a 100644 --- a/Lib/test/libregrtest/worker.py +++ b/Lib/test/libregrtest/worker.py @@ -6,7 +6,7 @@ from test import support from test.support import os_helper -from test.libregrtest.setup import setup_tests, setup_test_dir +from test.libregrtest.setup import setup_process, setup_test_dir from test.libregrtest.runtests import RunTests from test.libregrtest.single import run_single_test from test.libregrtest.utils import ( @@ -60,7 +60,7 @@ def worker_process(worker_json: StrJSON) -> NoReturn: match_tests: FilterTuple | None = runtests.match_tests setup_test_dir(runtests.test_dir) - setup_tests(runtests) + setup_process() if runtests.rerun: if match_tests: From 7aa8fcc8eb700bd4ae4bc19e086ce7ff5916f7bd Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 11 Sep 2023 09:02:35 +0200 Subject: [PATCH 144/357] gh-109162: libregrtest: use relative imports (#109250) libregrtest.__init__ no longer exposes any symbol, so "python -m test.libregrtest.worker" imports less modules. --- Lib/test/__main__.py | 2 +- Lib/test/autotest.py | 2 +- Lib/test/libregrtest/__init__.py | 2 - Lib/test/libregrtest/findtests.py | 2 +- Lib/test/libregrtest/logger.py | 8 +- Lib/test/libregrtest/main.py | 22 ++--- Lib/test/libregrtest/refleak.py | 4 +- Lib/test/libregrtest/result.py | 2 +- Lib/test/libregrtest/results.py | 6 +- Lib/test/libregrtest/run_workers.py | 14 ++-- Lib/test/libregrtest/runtests.py | 2 +- Lib/test/libregrtest/save_env.py | 4 +- Lib/test/libregrtest/setup.py | 4 +- Lib/test/libregrtest/single.py | 12 +-- Lib/test/libregrtest/worker.py | 8 +- Lib/test/regrtest.py | 2 +- Lib/test/test_regrtest.py | 119 +++++++++++++++------------- 17 files changed, 110 insertions(+), 105 deletions(-) diff --git a/Lib/test/__main__.py b/Lib/test/__main__.py index 19a6b2b8904526..e5780b784b4b05 100644 --- a/Lib/test/__main__.py +++ b/Lib/test/__main__.py @@ -1,2 +1,2 @@ -from test.libregrtest import main +from test.libregrtest.main import main main() diff --git a/Lib/test/autotest.py b/Lib/test/autotest.py index fa85cc153a133a..b5a1fab404c72d 100644 --- a/Lib/test/autotest.py +++ b/Lib/test/autotest.py @@ -1,5 +1,5 @@ # This should be equivalent to running regrtest.py from the cmdline. # It can be especially handy if you're in an interactive shell, e.g., # from test import autotest. -from test.libregrtest import main +from test.libregrtest.main import main main() diff --git a/Lib/test/libregrtest/__init__.py b/Lib/test/libregrtest/__init__.py index 5e8dba5dbde71a..e69de29bb2d1d6 100644 --- a/Lib/test/libregrtest/__init__.py +++ b/Lib/test/libregrtest/__init__.py @@ -1,2 +0,0 @@ -from test.libregrtest.cmdline import _parse_args, RESOURCE_NAMES, ALL_RESOURCES -from test.libregrtest.main import main diff --git a/Lib/test/libregrtest/findtests.py b/Lib/test/libregrtest/findtests.py index 88570be7dccdfd..0d38b8e60eb722 100644 --- a/Lib/test/libregrtest/findtests.py +++ b/Lib/test/libregrtest/findtests.py @@ -1,6 +1,6 @@ import os -from test.libregrtest.utils import StrPath, TestName, TestList +from .utils import StrPath, TestName, TestList # If these test directories are encountered recurse into them and treat each diff --git a/Lib/test/libregrtest/logger.py b/Lib/test/libregrtest/logger.py index 6195b5ddd4ebc0..f74bdff6322f13 100644 --- a/Lib/test/libregrtest/logger.py +++ b/Lib/test/libregrtest/logger.py @@ -1,12 +1,12 @@ import os import time -from test.libregrtest.results import TestResults -from test.libregrtest.runtests import RunTests -from test.libregrtest.utils import print_warning, MS_WINDOWS +from .results import TestResults +from .runtests import RunTests +from .utils import print_warning, MS_WINDOWS if MS_WINDOWS: - from test.libregrtest.win_utils import WindowsLoadTracker + from .win_utils import WindowsLoadTracker class Logger: diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 31eab99ca76351..0f289c06325bd0 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -10,16 +10,16 @@ from test import support from test.support import os_helper -from test.libregrtest.cmdline import _parse_args, Namespace -from test.libregrtest.findtests import findtests, split_test_packages -from test.libregrtest.logger import Logger -from test.libregrtest.result import State -from test.libregrtest.runtests import RunTests, HuntRefleak -from test.libregrtest.setup import setup_process, setup_test_dir -from test.libregrtest.single import run_single_test, PROGRESS_MIN_TIME -from test.libregrtest.pgo import setup_pgo_tests -from test.libregrtest.results import TestResults -from test.libregrtest.utils import ( +from .cmdline import _parse_args, Namespace +from .findtests import findtests, split_test_packages +from .logger import Logger +from .result import State +from .runtests import RunTests, HuntRefleak +from .setup import setup_process, setup_test_dir +from .single import run_single_test, PROGRESS_MIN_TIME +from .pgo import setup_pgo_tests +from .results import TestResults +from .utils import ( StrPath, StrJSON, TestName, TestList, TestTuple, FilterTuple, strip_py_suffix, count, format_duration, printlist, get_build_info, get_temp_dir, get_work_dir, exit_timeout, @@ -409,7 +409,7 @@ def get_state(self): return state def _run_tests_mp(self, runtests: RunTests, num_workers: int) -> None: - from test.libregrtest.run_workers import RunWorkers + from .run_workers import RunWorkers RunWorkers(num_workers, runtests, self.logger, self.results).run() def finalize_tests(self, tracer): diff --git a/Lib/test/libregrtest/refleak.py b/Lib/test/libregrtest/refleak.py index 6b1d7082ba46ba..edf8569a8f95fd 100644 --- a/Lib/test/libregrtest/refleak.py +++ b/Lib/test/libregrtest/refleak.py @@ -5,8 +5,8 @@ from test import support from test.support import os_helper -from test.libregrtest.runtests import HuntRefleak -from test.libregrtest.utils import clear_caches +from .runtests import HuntRefleak +from .utils import clear_caches try: from _abc import _get_dump diff --git a/Lib/test/libregrtest/result.py b/Lib/test/libregrtest/result.py index b73494d07583fc..cfd08ecc41b7d4 100644 --- a/Lib/test/libregrtest/result.py +++ b/Lib/test/libregrtest/result.py @@ -4,7 +4,7 @@ from test.support import TestStats -from test.libregrtest.utils import ( +from .utils import ( StrJSON, TestName, FilterTuple, format_duration, normalize_test_name, print_warning) diff --git a/Lib/test/libregrtest/results.py b/Lib/test/libregrtest/results.py index 6a07c2fcf3092c..94654fd6ab23f9 100644 --- a/Lib/test/libregrtest/results.py +++ b/Lib/test/libregrtest/results.py @@ -1,9 +1,9 @@ import sys from test.support import TestStats -from test.libregrtest.runtests import RunTests -from test.libregrtest.result import State, TestResult -from test.libregrtest.utils import ( +from .runtests import RunTests +from .result import State, TestResult +from .utils import ( StrPath, TestName, TestTuple, TestList, FilterDict, printlist, count, format_duration) diff --git a/Lib/test/libregrtest/run_workers.py b/Lib/test/libregrtest/run_workers.py index 6267fe5a924d9f..768625cb507f9a 100644 --- a/Lib/test/libregrtest/run_workers.py +++ b/Lib/test/libregrtest/run_workers.py @@ -14,15 +14,15 @@ from test import support from test.support import os_helper -from test.libregrtest.logger import Logger -from test.libregrtest.result import TestResult, State -from test.libregrtest.results import TestResults -from test.libregrtest.runtests import RunTests -from test.libregrtest.single import PROGRESS_MIN_TIME -from test.libregrtest.utils import ( +from .logger import Logger +from .result import TestResult, State +from .results import TestResults +from .runtests import RunTests +from .single import PROGRESS_MIN_TIME +from .utils import ( StrPath, TestName, format_duration, print_warning) -from test.libregrtest.worker import create_worker_process, USE_PROCESS_GROUP +from .worker import create_worker_process, USE_PROCESS_GROUP if sys.platform == 'win32': import locale diff --git a/Lib/test/libregrtest/runtests.py b/Lib/test/libregrtest/runtests.py index e16e79e990c8f1..e843cc2dadf734 100644 --- a/Lib/test/libregrtest/runtests.py +++ b/Lib/test/libregrtest/runtests.py @@ -2,7 +2,7 @@ import json from typing import Any -from test.libregrtest.utils import ( +from .utils import ( StrPath, StrJSON, TestTuple, FilterTuple, FilterDict) diff --git a/Lib/test/libregrtest/save_env.py b/Lib/test/libregrtest/save_env.py index 164fe9806b5f0d..55c1f7801489b0 100644 --- a/Lib/test/libregrtest/save_env.py +++ b/Lib/test/libregrtest/save_env.py @@ -3,9 +3,11 @@ import os import sys import threading + from test import support from test.support import os_helper -from test.libregrtest.utils import print_warning + +from .utils import print_warning class SkipTestEnvironment(Exception): diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index c3d81273163860..353a0f70b94ab2 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -10,8 +10,8 @@ except ImportError: gc = None -from test.libregrtest.runtests import RunTests -from test.libregrtest.utils import ( +from .runtests import RunTests +from .utils import ( setup_unraisable_hook, setup_threading_excepthook, fix_umask, replace_stdout, adjust_rlimit_nofile) diff --git a/Lib/test/libregrtest/single.py b/Lib/test/libregrtest/single.py index 0cb31925787893..635b4f93702b04 100644 --- a/Lib/test/libregrtest/single.py +++ b/Lib/test/libregrtest/single.py @@ -12,11 +12,11 @@ from test.support import TestStats from test.support import threading_helper -from test.libregrtest.result import State, TestResult -from test.libregrtest.runtests import RunTests -from test.libregrtest.save_env import saved_test_environment -from test.libregrtest.setup import setup_tests -from test.libregrtest.utils import ( +from .result import State, TestResult +from .runtests import RunTests +from .save_env import saved_test_environment +from .setup import setup_tests +from .utils import ( TestName, clear_caches, remove_testfn, abs_module_name, print_warning) @@ -40,7 +40,7 @@ def regrtest_runner(result: TestResult, test_func, runtests: RunTests) -> None: # Run test_func(), collect statistics, and detect reference and memory # leaks. if runtests.hunt_refleak: - from test.libregrtest.refleak import runtest_refleak + from .refleak import runtest_refleak refleak, test_result = runtest_refleak(result.test_name, test_func, runtests.hunt_refleak, runtests.quiet) diff --git a/Lib/test/libregrtest/worker.py b/Lib/test/libregrtest/worker.py index b9fb031764349a..ed1286e5700679 100644 --- a/Lib/test/libregrtest/worker.py +++ b/Lib/test/libregrtest/worker.py @@ -6,10 +6,10 @@ from test import support from test.support import os_helper -from test.libregrtest.setup import setup_process, setup_test_dir -from test.libregrtest.runtests import RunTests -from test.libregrtest.single import run_single_test -from test.libregrtest.utils import ( +from .setup import setup_process, setup_test_dir +from .runtests import RunTests +from .single import run_single_test +from .utils import ( StrPath, StrJSON, FilterTuple, get_work_dir, exit_timeout) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index 0ffb3ed454eda0..46a74fe276f553 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -8,7 +8,7 @@ import os import sys -from test.libregrtest import main +from test.libregrtest.main import main # Alias for backward compatibility (just in case) diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 21babb5185548f..f587a8f919dcde 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -18,10 +18,11 @@ import tempfile import textwrap import unittest -from test import libregrtest from test import support from test.support import os_helper, TestStats -from test.libregrtest import utils, setup +from test.libregrtest import cmdline +from test.libregrtest import utils +from test.libregrtest import setup from test.libregrtest.utils import normalize_test_name if not support.has_subprocess_support: @@ -52,9 +53,13 @@ class ParseArgsTestCase(unittest.TestCase): Test regrtest's argument parsing, function _parse_args(). """ + @staticmethod + def parse_args(args): + return cmdline._parse_args(args) + def checkError(self, args, msg): with support.captured_stderr() as err, self.assertRaises(SystemExit): - libregrtest._parse_args(args) + self.parse_args(args) self.assertIn(msg, err.getvalue()) def test_help(self): @@ -62,78 +67,78 @@ def test_help(self): with self.subTest(opt=opt): with support.captured_stdout() as out, \ self.assertRaises(SystemExit): - libregrtest._parse_args([opt]) + self.parse_args([opt]) self.assertIn('Run Python regression tests.', out.getvalue()) def test_timeout(self): - ns = libregrtest._parse_args(['--timeout', '4.2']) + ns = self.parse_args(['--timeout', '4.2']) self.assertEqual(ns.timeout, 4.2) self.checkError(['--timeout'], 'expected one argument') self.checkError(['--timeout', 'foo'], 'invalid float value') def test_wait(self): - ns = libregrtest._parse_args(['--wait']) + ns = self.parse_args(['--wait']) self.assertTrue(ns.wait) def test_start(self): for opt in '-S', '--start': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt, 'foo']) + ns = self.parse_args([opt, 'foo']) self.assertEqual(ns.start, 'foo') self.checkError([opt], 'expected one argument') def test_verbose(self): - ns = libregrtest._parse_args(['-v']) + ns = self.parse_args(['-v']) self.assertEqual(ns.verbose, 1) - ns = libregrtest._parse_args(['-vvv']) + ns = self.parse_args(['-vvv']) self.assertEqual(ns.verbose, 3) - ns = libregrtest._parse_args(['--verbose']) + ns = self.parse_args(['--verbose']) self.assertEqual(ns.verbose, 1) - ns = libregrtest._parse_args(['--verbose'] * 3) + ns = self.parse_args(['--verbose'] * 3) self.assertEqual(ns.verbose, 3) - ns = libregrtest._parse_args([]) + ns = self.parse_args([]) self.assertEqual(ns.verbose, 0) def test_rerun(self): for opt in '-w', '--rerun', '--verbose2': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt]) + ns = self.parse_args([opt]) self.assertTrue(ns.rerun) def test_verbose3(self): for opt in '-W', '--verbose3': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt]) + ns = self.parse_args([opt]) self.assertTrue(ns.verbose3) def test_quiet(self): for opt in '-q', '--quiet': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt]) + ns = self.parse_args([opt]) self.assertTrue(ns.quiet) self.assertEqual(ns.verbose, 0) def test_slowest(self): for opt in '-o', '--slowest': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt]) + ns = self.parse_args([opt]) self.assertTrue(ns.print_slow) def test_header(self): - ns = libregrtest._parse_args(['--header']) + ns = self.parse_args(['--header']) self.assertTrue(ns.header) - ns = libregrtest._parse_args(['--verbose']) + ns = self.parse_args(['--verbose']) self.assertTrue(ns.header) def test_randomize(self): for opt in '-r', '--randomize': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt]) + ns = self.parse_args([opt]) self.assertTrue(ns.randomize) def test_randseed(self): - ns = libregrtest._parse_args(['--randseed', '12345']) + ns = self.parse_args(['--randseed', '12345']) self.assertEqual(ns.random_seed, 12345) self.assertTrue(ns.randomize) self.checkError(['--randseed'], 'expected one argument') @@ -142,7 +147,7 @@ def test_randseed(self): def test_fromfile(self): for opt in '-f', '--fromfile': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt, 'foo']) + ns = self.parse_args([opt, 'foo']) self.assertEqual(ns.fromfile, 'foo') self.checkError([opt], 'expected one argument') self.checkError([opt, 'foo', '-s'], "don't go together") @@ -150,20 +155,20 @@ def test_fromfile(self): def test_exclude(self): for opt in '-x', '--exclude': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt]) + ns = self.parse_args([opt]) self.assertTrue(ns.exclude) def test_single(self): for opt in '-s', '--single': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt]) + ns = self.parse_args([opt]) self.assertTrue(ns.single) self.checkError([opt, '-f', 'foo'], "don't go together") def test_ignore(self): for opt in '-i', '--ignore': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt, 'pattern']) + ns = self.parse_args([opt, 'pattern']) self.assertEqual(ns.ignore_tests, ['pattern']) self.checkError([opt], 'expected one argument') @@ -173,7 +178,7 @@ def test_ignore(self): print('matchfile2', file=fp) filename = os.path.abspath(os_helper.TESTFN) - ns = libregrtest._parse_args(['-m', 'match', + ns = self.parse_args(['-m', 'match', '--ignorefile', filename]) self.assertEqual(ns.ignore_tests, ['matchfile1', 'matchfile2']) @@ -181,11 +186,11 @@ def test_ignore(self): def test_match(self): for opt in '-m', '--match': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt, 'pattern']) + ns = self.parse_args([opt, 'pattern']) self.assertEqual(ns.match_tests, ['pattern']) self.checkError([opt], 'expected one argument') - ns = libregrtest._parse_args(['-m', 'pattern1', + ns = self.parse_args(['-m', 'pattern1', '-m', 'pattern2']) self.assertEqual(ns.match_tests, ['pattern1', 'pattern2']) @@ -195,7 +200,7 @@ def test_match(self): print('matchfile2', file=fp) filename = os.path.abspath(os_helper.TESTFN) - ns = libregrtest._parse_args(['-m', 'match', + ns = self.parse_args(['-m', 'match', '--matchfile', filename]) self.assertEqual(ns.match_tests, ['match', 'matchfile1', 'matchfile2']) @@ -203,65 +208,65 @@ def test_match(self): def test_failfast(self): for opt in '-G', '--failfast': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt, '-v']) + ns = self.parse_args([opt, '-v']) self.assertTrue(ns.failfast) - ns = libregrtest._parse_args([opt, '-W']) + ns = self.parse_args([opt, '-W']) self.assertTrue(ns.failfast) self.checkError([opt], '-G/--failfast needs either -v or -W') def test_use(self): for opt in '-u', '--use': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt, 'gui,network']) + ns = self.parse_args([opt, 'gui,network']) self.assertEqual(ns.use_resources, ['gui', 'network']) - ns = libregrtest._parse_args([opt, 'gui,none,network']) + ns = self.parse_args([opt, 'gui,none,network']) self.assertEqual(ns.use_resources, ['network']) - expected = list(libregrtest.ALL_RESOURCES) + expected = list(cmdline.ALL_RESOURCES) expected.remove('gui') - ns = libregrtest._parse_args([opt, 'all,-gui']) + ns = self.parse_args([opt, 'all,-gui']) self.assertEqual(ns.use_resources, expected) self.checkError([opt], 'expected one argument') self.checkError([opt, 'foo'], 'invalid resource') # all + a resource not part of "all" - ns = libregrtest._parse_args([opt, 'all,tzdata']) + ns = self.parse_args([opt, 'all,tzdata']) self.assertEqual(ns.use_resources, - list(libregrtest.ALL_RESOURCES) + ['tzdata']) + list(cmdline.ALL_RESOURCES) + ['tzdata']) # test another resource which is not part of "all" - ns = libregrtest._parse_args([opt, 'extralargefile']) + ns = self.parse_args([opt, 'extralargefile']) self.assertEqual(ns.use_resources, ['extralargefile']) def test_memlimit(self): for opt in '-M', '--memlimit': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt, '4G']) + ns = self.parse_args([opt, '4G']) self.assertEqual(ns.memlimit, '4G') self.checkError([opt], 'expected one argument') def test_testdir(self): - ns = libregrtest._parse_args(['--testdir', 'foo']) + ns = self.parse_args(['--testdir', 'foo']) self.assertEqual(ns.testdir, os.path.join(os_helper.SAVEDCWD, 'foo')) self.checkError(['--testdir'], 'expected one argument') def test_runleaks(self): for opt in '-L', '--runleaks': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt]) + ns = self.parse_args([opt]) self.assertTrue(ns.runleaks) def test_huntrleaks(self): for opt in '-R', '--huntrleaks': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt, ':']) + ns = self.parse_args([opt, ':']) self.assertEqual(ns.huntrleaks, (5, 4, 'reflog.txt')) - ns = libregrtest._parse_args([opt, '6:']) + ns = self.parse_args([opt, '6:']) self.assertEqual(ns.huntrleaks, (6, 4, 'reflog.txt')) - ns = libregrtest._parse_args([opt, ':3']) + ns = self.parse_args([opt, ':3']) self.assertEqual(ns.huntrleaks, (5, 3, 'reflog.txt')) - ns = libregrtest._parse_args([opt, '6:3:leaks.log']) + ns = self.parse_args([opt, '6:3:leaks.log']) self.assertEqual(ns.huntrleaks, (6, 3, 'leaks.log')) self.checkError([opt], 'expected one argument') self.checkError([opt, '6'], @@ -272,7 +277,7 @@ def test_huntrleaks(self): def test_multiprocess(self): for opt in '-j', '--multiprocess': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt, '2']) + ns = self.parse_args([opt, '2']) self.assertEqual(ns.use_mp, 2) self.checkError([opt], 'expected one argument') self.checkError([opt, 'foo'], 'invalid int value') @@ -282,13 +287,13 @@ def test_multiprocess(self): def test_coverage(self): for opt in '-T', '--coverage': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt]) + ns = self.parse_args([opt]) self.assertTrue(ns.trace) def test_coverdir(self): for opt in '-D', '--coverdir': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt, 'foo']) + ns = self.parse_args([opt, 'foo']) self.assertEqual(ns.coverdir, os.path.join(os_helper.SAVEDCWD, 'foo')) self.checkError([opt], 'expected one argument') @@ -296,13 +301,13 @@ def test_coverdir(self): def test_nocoverdir(self): for opt in '-N', '--nocoverdir': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt]) + ns = self.parse_args([opt]) self.assertIsNone(ns.coverdir) def test_threshold(self): for opt in '-t', '--threshold': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt, '1000']) + ns = self.parse_args([opt, '1000']) self.assertEqual(ns.threshold, 1000) self.checkError([opt], 'expected one argument') self.checkError([opt, 'foo'], 'invalid int value') @@ -311,7 +316,7 @@ def test_nowindows(self): for opt in '-n', '--nowindows': with self.subTest(opt=opt): with contextlib.redirect_stderr(io.StringIO()) as stderr: - ns = libregrtest._parse_args([opt]) + ns = self.parse_args([opt]) self.assertTrue(ns.nowindows) err = stderr.getvalue() self.assertIn('the --nowindows (-n) option is deprecated', err) @@ -319,39 +324,39 @@ def test_nowindows(self): def test_forever(self): for opt in '-F', '--forever': with self.subTest(opt=opt): - ns = libregrtest._parse_args([opt]) + ns = self.parse_args([opt]) self.assertTrue(ns.forever) def test_unrecognized_argument(self): self.checkError(['--xxx'], 'usage:') def test_long_option__partial(self): - ns = libregrtest._parse_args(['--qui']) + ns = self.parse_args(['--qui']) self.assertTrue(ns.quiet) self.assertEqual(ns.verbose, 0) def test_two_options(self): - ns = libregrtest._parse_args(['--quiet', '--exclude']) + ns = self.parse_args(['--quiet', '--exclude']) self.assertTrue(ns.quiet) self.assertEqual(ns.verbose, 0) self.assertTrue(ns.exclude) def test_option_with_empty_string_value(self): - ns = libregrtest._parse_args(['--start', '']) + ns = self.parse_args(['--start', '']) self.assertEqual(ns.start, '') def test_arg(self): - ns = libregrtest._parse_args(['foo']) + ns = self.parse_args(['foo']) self.assertEqual(ns.args, ['foo']) def test_option_and_arg(self): - ns = libregrtest._parse_args(['--quiet', 'foo']) + ns = self.parse_args(['--quiet', 'foo']) self.assertTrue(ns.quiet) self.assertEqual(ns.verbose, 0) self.assertEqual(ns.args, ['foo']) def test_arg_option_arg(self): - ns = libregrtest._parse_args(['test_unaryop', '-v', 'test_binop']) + ns = self.parse_args(['test_unaryop', '-v', 'test_binop']) self.assertEqual(ns.verbose, 1) self.assertEqual(ns.args, ['test_unaryop', 'test_binop']) From 3b2ecbc1275bd05534885cee9ac1389987238561 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 11 Sep 2023 09:34:04 +0200 Subject: [PATCH 145/357] GH-108614: Increase importlib MAGIC for RESUME_CHECK instruction (#109247) --- Lib/importlib/_bootstrap_external.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 0717e202ecbcde..7a83a58d0874df 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -455,6 +455,7 @@ def _write_atomic(path, data, mode=0o666): # Python 3.13a1 3557 (Make the conversion to boolean in jumps explicit) # Python 3.13a1 3558 (Reorder the stack items for CALL) # Python 3.13a1 3559 (Generate opcode IDs from bytecodes.c) +# Python 3.13a1 3560 (Add RESUME_CHECK instruction) # Python 3.14 will start with 3600 @@ -471,7 +472,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3559).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3560).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c From a9b1f84790e977fb09f75b148c4c4f5924a6ef99 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 11 Sep 2023 10:11:31 +0200 Subject: [PATCH 146/357] gh-107219: Fix concurrent.futures terminate_broken() (#109244) Fix a race condition in concurrent.futures. When a process in the process pool was terminated abruptly (while the future was running or pending), close the connection write end. If the call queue is blocked on sending bytes to a worker process, closing the connection write end interrupts the send, so the queue can be closed. Changes: * _ExecutorManagerThread.terminate_broken() now closes call_queue._writer. * multiprocessing PipeConnection.close() now interrupts WaitForMultipleObjects() in _send_bytes() by cancelling the overlapped operation. --- Lib/concurrent/futures/process.py | 4 ++++ Lib/multiprocessing/connection.py | 18 ++++++++++++++++++ ...3-09-11-00-32-18.gh-issue-107219.3zqyFT.rst | 5 +++++ 3 files changed, 27 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2023-09-11-00-32-18.gh-issue-107219.3zqyFT.rst diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 9933d3d0e040ea..f4b5cd1d869067 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -510,6 +510,10 @@ def terminate_broken(self, cause): # https://github.com/python/cpython/issues/94777 self.call_queue._reader.close() + # gh-107219: Close the connection writer which can unblock + # Queue._feed() if it was stuck in send_bytes(). + self.call_queue._writer.close() + # clean up resources self.join_executor_internals() diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py index 04eaea811cfbbe..7c425a2d8e7034 100644 --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -9,6 +9,7 @@ __all__ = [ 'Client', 'Listener', 'Pipe', 'wait' ] +import errno import io import os import sys @@ -41,6 +42,7 @@ BUFSIZE = 8192 # A very generous timeout when it comes to local connections... CONNECTION_TIMEOUT = 20. +WSA_OPERATION_ABORTED = 995 _mmap_counter = itertools.count() @@ -271,12 +273,22 @@ class PipeConnection(_ConnectionBase): with FILE_FLAG_OVERLAPPED. """ _got_empty_message = False + _send_ov = None def _close(self, _CloseHandle=_winapi.CloseHandle): + ov = self._send_ov + if ov is not None: + # Interrupt WaitForMultipleObjects() in _send_bytes() + ov.cancel() _CloseHandle(self._handle) def _send_bytes(self, buf): + if self._send_ov is not None: + # A connection should only be used by a single thread + raise ValueError("concurrent send_bytes() calls " + "are not supported") ov, err = _winapi.WriteFile(self._handle, buf, overlapped=True) + self._send_ov = ov try: if err == _winapi.ERROR_IO_PENDING: waitres = _winapi.WaitForMultipleObjects( @@ -286,7 +298,13 @@ def _send_bytes(self, buf): ov.cancel() raise finally: + self._send_ov = None nwritten, err = ov.GetOverlappedResult(True) + if err == WSA_OPERATION_ABORTED: + # close() was called by another thread while + # WaitForMultipleObjects() was waiting for the overlapped + # operation. + raise OSError(errno.EPIPE, "handle is closed") assert err == 0 assert nwritten == len(buf) diff --git a/Misc/NEWS.d/next/Library/2023-09-11-00-32-18.gh-issue-107219.3zqyFT.rst b/Misc/NEWS.d/next/Library/2023-09-11-00-32-18.gh-issue-107219.3zqyFT.rst new file mode 100644 index 00000000000000..10afbcf823386a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-11-00-32-18.gh-issue-107219.3zqyFT.rst @@ -0,0 +1,5 @@ +Fix a race condition in ``concurrent.futures``. When a process in the +process pool was terminated abruptly (while the future was running or +pending), close the connection write end. If the call queue is blocked on +sending bytes to a worker process, closing the connection write end interrupts +the send, so the queue can be closed. Patch by Victor Stinner. From c439f6a72d828a55aa373fd42c8a0ef771e303cd Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 11 Sep 2023 10:52:03 +0200 Subject: [PATCH 147/357] gh-109162: libregrtest: move code around (#109253) * Move Regrtest.display_header() to utils.py. * Move cleanup_temp_dir() to utils.py. * Move list_cases() to findtests.py. --- Lib/test/libregrtest/findtests.py | 42 ++++++++++++- Lib/test/libregrtest/main.py | 101 +++--------------------------- Lib/test/libregrtest/utils.py | 55 ++++++++++++++++ 3 files changed, 105 insertions(+), 93 deletions(-) diff --git a/Lib/test/libregrtest/findtests.py b/Lib/test/libregrtest/findtests.py index 0d38b8e60eb722..f4a8b9ae26ae65 100644 --- a/Lib/test/libregrtest/findtests.py +++ b/Lib/test/libregrtest/findtests.py @@ -1,6 +1,12 @@ import os +import sys +import unittest -from .utils import StrPath, TestName, TestList +from test import support + +from .utils import ( + StrPath, TestName, TestTuple, TestList, FilterTuple, + abs_module_name, count, printlist) # If these test directories are encountered recurse into them and treat each @@ -56,3 +62,37 @@ def split_test_packages(tests, *, testdir: StrPath | None = None, exclude=(), else: splitted.append(name) return splitted + + +def _list_cases(suite): + for test in suite: + if isinstance(test, unittest.loader._FailedTest): + continue + if isinstance(test, unittest.TestSuite): + _list_cases(test) + elif isinstance(test, unittest.TestCase): + if support.match_test(test): + print(test.id()) + +def list_cases(tests: TestTuple, *, + match_tests: FilterTuple | None = None, + ignore_tests: FilterTuple | None = None, + test_dir: StrPath | None = None): + support.verbose = False + support.set_match_tests(match_tests, ignore_tests) + + skipped = [] + for test_name in tests: + module_name = abs_module_name(test_name, test_dir) + try: + suite = unittest.defaultTestLoader.loadTestsFromName(module_name) + _list_cases(suite) + except unittest.SkipTest: + skipped.append(test_name) + + if skipped: + sys.stdout.flush() + stderr = sys.stderr + print(file=stderr) + print(count(len(skipped), "test"), "skipped:", file=stderr) + printlist(skipped, file=stderr) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 0f289c06325bd0..2c0a6c204373cc 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -1,17 +1,14 @@ -import locale import os -import platform import random import re import sys import time -import unittest from test import support from test.support import os_helper from .cmdline import _parse_args, Namespace -from .findtests import findtests, split_test_packages +from .findtests import findtests, split_test_packages, list_cases from .logger import Logger from .result import State from .runtests import RunTests, HuntRefleak @@ -22,8 +19,8 @@ from .utils import ( StrPath, StrJSON, TestName, TestList, TestTuple, FilterTuple, strip_py_suffix, count, format_duration, - printlist, get_build_info, get_temp_dir, get_work_dir, exit_timeout, - abs_module_name) + printlist, get_temp_dir, get_work_dir, exit_timeout, + display_header, cleanup_temp_dir) class Regrtest: @@ -214,36 +211,6 @@ def list_tests(tests: TestTuple): for name in tests: print(name) - def _list_cases(self, suite): - for test in suite: - if isinstance(test, unittest.loader._FailedTest): - continue - if isinstance(test, unittest.TestSuite): - self._list_cases(test) - elif isinstance(test, unittest.TestCase): - if support.match_test(test): - print(test.id()) - - def list_cases(self, tests: TestTuple): - support.verbose = False - support.set_match_tests(self.match_tests, self.ignore_tests) - - skipped = [] - for test_name in tests: - module_name = abs_module_name(test_name, self.test_dir) - try: - suite = unittest.defaultTestLoader.loadTestsFromName(module_name) - self._list_cases(suite) - except unittest.SkipTest: - skipped.append(test_name) - - if skipped: - sys.stdout.flush() - stderr = sys.stderr - print(file=stderr) - print(count(len(skipped), "test"), "skipped:", file=stderr) - printlist(skipped, file=stderr) - def _rerun_failed_tests(self, runtests: RunTests): # Configure the runner to re-run tests if self.num_workers == 0: @@ -363,45 +330,6 @@ def run_tests_sequentially(self, runtests): return tracer - @staticmethod - def display_header(): - # Print basic platform information - print("==", platform.python_implementation(), *sys.version.split()) - print("==", platform.platform(aliased=True), - "%s-endian" % sys.byteorder) - print("== Python build:", ' '.join(get_build_info())) - print("== cwd:", os.getcwd()) - cpu_count = os.cpu_count() - if cpu_count: - print("== CPU count:", cpu_count) - print("== encodings: locale=%s, FS=%s" - % (locale.getencoding(), sys.getfilesystemencoding())) - - # This makes it easier to remember what to set in your local - # environment when trying to reproduce a sanitizer failure. - asan = support.check_sanitizer(address=True) - msan = support.check_sanitizer(memory=True) - ubsan = support.check_sanitizer(ub=True) - sanitizers = [] - if asan: - sanitizers.append("address") - if msan: - sanitizers.append("memory") - if ubsan: - sanitizers.append("undefined behavior") - if not sanitizers: - return - - print(f"== sanitizers: {', '.join(sanitizers)}") - for sanitizer, env_var in ( - (asan, "ASAN_OPTIONS"), - (msan, "MSAN_OPTIONS"), - (ubsan, "UBSAN_OPTIONS"), - ): - options= os.environ.get(env_var) - if sanitizer and options is not None: - print(f"== {env_var}={options!r}") - def get_state(self): state = self.results.get_state(self.fail_env_changed) if self.first_state: @@ -445,20 +373,6 @@ def display_summary(self): state = self.get_state() print(f"Result: {state}") - @staticmethod - def cleanup_temp_dir(tmp_dir: StrPath): - import glob - - path = os.path.join(glob.escape(tmp_dir), 'test_python_*') - print("Cleanup %s directory" % tmp_dir) - for name in glob.glob(path): - if os.path.isdir(name): - print("Remove directory: %s" % name) - os_helper.rmtree(name) - else: - print("Remove file: %s" % name) - os_helper.unlink(name) - def create_run_tests(self, tests: TestTuple): return RunTests( tests, @@ -496,7 +410,7 @@ def _run_tests(self, selected: TestTuple, tests: TestList | None) -> int: if (self.want_header or not(self.pgo or self.quiet or self.single_test_run or tests or self.cmdline_args)): - self.display_header() + display_header() if self.randomize: print("Using random seed", self.random_seed) @@ -554,7 +468,7 @@ def main(self, tests: TestList | None = None): self.tmp_dir = get_temp_dir(self.tmp_dir) if self.want_cleanup: - self.cleanup_temp_dir(self.tmp_dir) + cleanup_temp_dir(self.tmp_dir) sys.exit(0) if self.want_wait: @@ -567,7 +481,10 @@ def main(self, tests: TestList | None = None): if self.want_list_tests: self.list_tests(selected) elif self.want_list_cases: - self.list_cases(selected) + list_cases(selected, + match_tests=self.match_tests, + ignore_tests=self.ignore_tests, + test_dir=self.test_dir) else: exitcode = self.run_tests(selected, tests) diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index f97e3fd4bb7106..b46cec6f0eec70 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -1,8 +1,10 @@ import atexit import contextlib import faulthandler +import locale import math import os.path +import platform import random import sys import sysconfig @@ -524,3 +526,56 @@ def adjust_rlimit_nofile(): except (ValueError, OSError) as err: print_warning(f"Unable to raise RLIMIT_NOFILE from {fd_limit} to " f"{new_fd_limit}: {err}.") + + +def display_header(): + # Print basic platform information + print("==", platform.python_implementation(), *sys.version.split()) + print("==", platform.platform(aliased=True), + "%s-endian" % sys.byteorder) + print("== Python build:", ' '.join(get_build_info())) + print("== cwd:", os.getcwd()) + cpu_count = os.cpu_count() + if cpu_count: + print("== CPU count:", cpu_count) + print("== encodings: locale=%s, FS=%s" + % (locale.getencoding(), sys.getfilesystemencoding())) + + # This makes it easier to remember what to set in your local + # environment when trying to reproduce a sanitizer failure. + asan = support.check_sanitizer(address=True) + msan = support.check_sanitizer(memory=True) + ubsan = support.check_sanitizer(ub=True) + sanitizers = [] + if asan: + sanitizers.append("address") + if msan: + sanitizers.append("memory") + if ubsan: + sanitizers.append("undefined behavior") + if not sanitizers: + return + + print(f"== sanitizers: {', '.join(sanitizers)}") + for sanitizer, env_var in ( + (asan, "ASAN_OPTIONS"), + (msan, "MSAN_OPTIONS"), + (ubsan, "UBSAN_OPTIONS"), + ): + options= os.environ.get(env_var) + if sanitizer and options is not None: + print(f"== {env_var}={options!r}") + + +def cleanup_temp_dir(tmp_dir: StrPath): + import glob + + path = os.path.join(glob.escape(tmp_dir), 'test_python_*') + print("Cleanup %s directory" % tmp_dir) + for name in glob.glob(path): + if os.path.isdir(name): + print("Remove directory: %s" % name) + os_helper.rmtree(name) + else: + print("Remove file: %s" % name) + os_helper.unlink(name) From 0abc935086931d4915ea3c45cffffecb31e7a45c Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 11 Sep 2023 14:03:30 +0300 Subject: [PATCH 148/357] Test DocTestFinder directly instead of calling support.run_doctest() (GH-108917) --- Lib/test/test_doctest.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index 9cc460c8b913f6..6e12e82a7a0084 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -784,15 +784,13 @@ class TestDocTestFinder(unittest.TestCase): def test_issue35753(self): # This import of `call` should trigger issue35753 when - # `support.run_doctest` is called due to unwrap failing, + # DocTestFinder.find() is called due to inspect.unwrap() failing, # however with a patched doctest this should succeed. from unittest.mock import call dummy_module = types.ModuleType("dummy") dummy_module.__dict__['inject_call'] = call - try: - support.run_doctest(dummy_module, verbosity=True) - except ValueError as e: - raise support.TestFailed("Doctest unwrap failed") from e + finder = doctest.DocTestFinder() + self.assertEqual(finder.find(dummy_module), []) def test_empty_namespace_package(self): pkg_name = 'doctest_empty_pkg' From 60b8341d07649194aa73108369a1e04ed1848794 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 11 Sep 2023 14:05:30 +0300 Subject: [PATCH 149/357] Better integration of doctest and unittest in test_ctypes.test_objects (GH-108922) Better integration of docrtest and unittest in test_ctypes.test_objects --- Lib/test/test_ctypes/test_objects.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_ctypes/test_objects.py b/Lib/test/test_ctypes/test_objects.py index 23c92b01a11107..fb01421b955951 100644 --- a/Lib/test/test_ctypes/test_objects.py +++ b/Lib/test/test_ctypes/test_objects.py @@ -55,14 +55,12 @@ import doctest import unittest -import test.test_ctypes.test_objects -class TestCase(unittest.TestCase): - def test(self): - failures, tests = doctest.testmod(test.test_ctypes.test_objects) - self.assertFalse(failures, 'doctests failed, see output above') +def load_tests(loader, tests, pattern): + tests.addTest(doctest.DocTestSuite()) + return tests if __name__ == '__main__': - doctest.testmod(test.test_ctypes.test_objects) + unittest.main() From 4a69301ea4539da172a00a80e78c07e9b41c1f8e Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Mon, 11 Sep 2023 14:37:09 +0100 Subject: [PATCH 150/357] GH-108976. Keep monitoring data structures valid during de-optimization during callback. (GH-109131) --- Lib/test/test_monitoring.py | 8 ++ Lib/test/test_pdb.py | 18 +++ ...-09-06-22-50-25.gh-issue-108976.MUKaIJ.rst | 2 + Python/instrumentation.c | 106 +++++++++--------- 4 files changed, 79 insertions(+), 55 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-06-22-50-25.gh-issue-108976.MUKaIJ.rst diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py index 8a7d300b734dcc..e575eca42fabf9 100644 --- a/Lib/test/test_monitoring.py +++ b/Lib/test/test_monitoring.py @@ -1719,6 +1719,14 @@ def make_foo_optimized_then_set_event(): finally: sys.monitoring.set_events(TEST_TOOL, 0) + def test_gh108976(self): + sys.monitoring.use_tool_id(0, "test") + sys.monitoring.set_events(0, 0) + sys.monitoring.register_callback(0, E.LINE, lambda *args: sys.monitoring.set_events(0, 0)) + sys.monitoring.register_callback(0, E.INSTRUCTION, lambda *args: 0) + sys.monitoring.set_events(0, E.LINE | E.INSTRUCTION) + sys.monitoring.set_events(0, 0) + class TestOptimizer(MonitoringTestBase, unittest.TestCase): diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index f6bed84808ed7f..f337656121643c 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -2297,6 +2297,24 @@ def test_pdb_issue_gh_101517(): (Pdb) continue """ +def test_pdb_issue_gh_108976(): + """See GH-108976 + Make sure setting f_trace_opcodes = True won't crash pdb + >>> def test_function(): + ... import sys + ... sys._getframe().f_trace_opcodes = True + ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() + ... a = 1 + >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE + ... 'continue' + ... ]): + ... test_function() + bdb.Bdb.dispatch: unknown debugging event: 'opcode' + > (5)test_function() + -> a = 1 + (Pdb) continue + """ + def test_pdb_ambiguous_statements(): """See GH-104301 diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-06-22-50-25.gh-issue-108976.MUKaIJ.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-06-22-50-25.gh-issue-108976.MUKaIJ.rst new file mode 100644 index 00000000000000..4b89375f0f57ef --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-06-22-50-25.gh-issue-108976.MUKaIJ.rst @@ -0,0 +1,2 @@ +Fix crash that occurs after de-instrumenting a code object in a monitoring +callback. diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 74c3adf0c1f475..5f714602eafbb8 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -364,7 +364,7 @@ dump_instrumentation_data_per_instruction(PyCodeObject *code, _PyCoMonitoringDat } static void -dump_monitors(const char *prefix, _Py_Monitors monitors, FILE*out) +dump_global_monitors(const char *prefix, _Py_GlobalMonitors monitors, FILE*out) { fprintf(out, "%s monitors:\n", prefix); for (int event = 0; event < _PY_MONITORING_UNGROUPED_EVENTS; event++) { @@ -372,37 +372,13 @@ dump_monitors(const char *prefix, _Py_Monitors monitors, FILE*out) } } -/* Like _Py_GetBaseOpcode but without asserts. - * Does its best to give the right answer, but won't abort - * if something is wrong */ -static int -get_base_opcode_best_attempt(PyCodeObject *code, int offset) +static void +dump_local_monitors(const char *prefix, _Py_LocalMonitors monitors, FILE*out) { - int opcode = _Py_OPCODE(_PyCode_CODE(code)[offset]); - if (INSTRUMENTED_OPCODES[opcode] != opcode) { - /* Not instrumented */ - return _PyOpcode_Deopt[opcode] == 0 ? opcode : _PyOpcode_Deopt[opcode]; - } - if (opcode == INSTRUMENTED_INSTRUCTION) { - if (code->_co_monitoring->per_instruction_opcodes[offset] == 0) { - return opcode; - } - opcode = code->_co_monitoring->per_instruction_opcodes[offset]; - } - if (opcode == INSTRUMENTED_LINE) { - if (code->_co_monitoring->lines[offset].original_opcode == 0) { - return opcode; - } - opcode = code->_co_monitoring->lines[offset].original_opcode; - } - int deinstrumented = DE_INSTRUMENT[opcode]; - if (deinstrumented) { - return deinstrumented; - } - if (_PyOpcode_Deopt[opcode] == 0) { - return opcode; + fprintf(out, "%s monitors:\n", prefix); + for (int event = 0; event < _PY_MONITORING_LOCAL_EVENTS; event++) { + fprintf(out, " Event %d: Tools %x\n", event, monitors.tools[event]); } - return _PyOpcode_Deopt[opcode]; } /* No error checking -- Don't use this for anything but experimental debugging */ @@ -417,9 +393,9 @@ dump_instrumentation_data(PyCodeObject *code, int star, FILE*out) fprintf(out, "NULL\n"); return; } - dump_monitors("Global", _PyInterpreterState_GET()->monitors, out); - dump_monitors("Code", data->local_monitors, out); - dump_monitors("Active", data->active_monitors, out); + dump_global_monitors("Global", _PyInterpreterState_GET()->monitors, out); + dump_local_monitors("Code", data->local_monitors, out); + dump_local_monitors("Active", data->active_monitors, out); int code_len = (int)Py_SIZE(code); bool starred = false; for (int i = 0; i < code_len; i += _PyInstruction_GetLength(code, i)) { @@ -458,6 +434,9 @@ dump_instrumentation_data(PyCodeObject *code, int star, FILE*out) static bool valid_opcode(int opcode) { + if (opcode == INSTRUMENTED_LINE) { + return true; + } if (IS_VALID_OPCODE(opcode) && opcode != CACHE && opcode != RESERVED && @@ -475,18 +454,23 @@ sanity_check_instrumentation(PyCodeObject *code) if (data == NULL) { return; } - _Py_GlobalMonitors active_monitors = _PyInterpreterState_GET()->monitors; + _Py_GlobalMonitors global_monitors = _PyInterpreterState_GET()->monitors; + _Py_LocalMonitors active_monitors; if (code->_co_monitoring) { - _Py_Monitors local_monitors = code->_co_monitoring->local_monitors; - active_monitors = local_union(active_monitors, local_monitors); + _Py_LocalMonitors local_monitors = code->_co_monitoring->local_monitors; + active_monitors = local_union(global_monitors, local_monitors); + } + else { + _Py_LocalMonitors empty = (_Py_LocalMonitors) { 0 }; + active_monitors = local_union(global_monitors, empty); } assert(monitors_equals( code->_co_monitoring->active_monitors, - active_monitors) - ); + active_monitors)); int code_len = (int)Py_SIZE(code); for (int i = 0; i < code_len;) { - int opcode = _PyCode_CODE(code)[i].op.code; + _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; + int opcode = instr->op.code; int base_opcode = _Py_GetBaseOpcode(code, i); CHECK(valid_opcode(opcode)); CHECK(valid_opcode(base_opcode)); @@ -506,23 +490,30 @@ sanity_check_instrumentation(PyCodeObject *code) opcode = data->lines[i].original_opcode; CHECK(opcode != END_FOR); CHECK(opcode != RESUME); + CHECK(opcode != RESUME_CHECK); CHECK(opcode != INSTRUMENTED_RESUME); if (!is_instrumented(opcode)) { CHECK(_PyOpcode_Deopt[opcode] == opcode); } CHECK(opcode != INSTRUMENTED_LINE); } - else if (data->lines && !is_instrumented(opcode)) { - CHECK(data->lines[i].original_opcode == 0 || - data->lines[i].original_opcode == base_opcode || - DE_INSTRUMENT[data->lines[i].original_opcode] == base_opcode); + else if (data->lines) { + /* If original_opcode is INSTRUMENTED_INSTRUCTION + * *and* we are executing a INSTRUMENTED_LINE instruction + * that has de-instrumented itself, then we will execute + * an invalid INSTRUMENTED_INSTRUCTION */ + CHECK(data->lines[i].original_opcode != INSTRUMENTED_INSTRUCTION); + } + if (opcode == INSTRUMENTED_INSTRUCTION) { + CHECK(data->per_instruction_opcodes[i] != 0); + opcode = data->per_instruction_opcodes[i]; } if (is_instrumented(opcode)) { CHECK(DE_INSTRUMENT[opcode] == base_opcode); int event = EVENT_FOR_OPCODE[DE_INSTRUMENT[opcode]]; if (event < 0) { /* RESUME fixup */ - event = _PyCode_CODE(code)[i].op.arg; + event = instr->op.arg ? 1: 0; } CHECK(active_monitors.tools[event] != 0); } @@ -608,30 +599,30 @@ static void de_instrument_line(PyCodeObject *code, int i) { _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; - uint8_t *opcode_ptr = &instr->op.code; - int opcode =*opcode_ptr; + int opcode = instr->op.code; if (opcode != INSTRUMENTED_LINE) { return; } _PyCoLineInstrumentationData *lines = &code->_co_monitoring->lines[i]; int original_opcode = lines->original_opcode; + if (original_opcode == INSTRUMENTED_INSTRUCTION) { + lines->original_opcode = code->_co_monitoring->per_instruction_opcodes[i]; + } CHECK(original_opcode != 0); CHECK(original_opcode == _PyOpcode_Deopt[original_opcode]); - *opcode_ptr = instr->op.code = original_opcode; + instr->op.code = original_opcode; if (_PyOpcode_Caches[original_opcode]) { instr[1].cache = adaptive_counter_warmup(); } - assert(*opcode_ptr != INSTRUMENTED_LINE); assert(instr->op.code != INSTRUMENTED_LINE); } - static void de_instrument_per_instruction(PyCodeObject *code, int i) { _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; uint8_t *opcode_ptr = &instr->op.code; - int opcode =*opcode_ptr; + int opcode = *opcode_ptr; if (opcode == INSTRUMENTED_LINE) { opcode_ptr = &code->_co_monitoring->lines[i].original_opcode; opcode = *opcode_ptr; @@ -642,10 +633,11 @@ de_instrument_per_instruction(PyCodeObject *code, int i) int original_opcode = code->_co_monitoring->per_instruction_opcodes[i]; CHECK(original_opcode != 0); CHECK(original_opcode == _PyOpcode_Deopt[original_opcode]); - instr->op.code = original_opcode; + *opcode_ptr = original_opcode; if (_PyOpcode_Caches[original_opcode]) { instr[1].cache = adaptive_counter_warmup(); } + assert(*opcode_ptr != INSTRUMENTED_INSTRUCTION); assert(instr->op.code != INSTRUMENTED_INSTRUCTION); /* Keep things clean for sanity check */ code->_co_monitoring->per_instruction_opcodes[i] = 0; @@ -685,7 +677,7 @@ static void instrument_line(PyCodeObject *code, int i) { uint8_t *opcode_ptr = &_PyCode_CODE(code)[i].op.code; - int opcode =*opcode_ptr; + int opcode = *opcode_ptr; if (opcode == INSTRUMENTED_LINE) { return; } @@ -700,13 +692,14 @@ instrument_per_instruction(PyCodeObject *code, int i) { _Py_CODEUNIT *instr = &_PyCode_CODE(code)[i]; uint8_t *opcode_ptr = &instr->op.code; - int opcode =*opcode_ptr; + int opcode = *opcode_ptr; if (opcode == INSTRUMENTED_LINE) { _PyCoLineInstrumentationData *lines = &code->_co_monitoring->lines[i]; opcode_ptr = &lines->original_opcode; opcode = *opcode_ptr; } if (opcode == INSTRUMENTED_INSTRUCTION) { + assert(code->_co_monitoring->per_instruction_opcodes[i] > 0); return; } CHECK(opcode != 0); @@ -1129,7 +1122,6 @@ _Py_call_instrumentation_line(PyThreadState *tstate, _PyInterpreterFrame* frame, _PyCoMonitoringData *monitoring = code->_co_monitoring; _PyCoLineInstrumentationData *line_data = &monitoring->lines[i]; - uint8_t original_opcode = line_data->original_opcode; if (tstate->tracing) { goto done; } @@ -1212,7 +1204,9 @@ _Py_call_instrumentation_line(PyThreadState *tstate, _PyInterpreterFrame* frame, } } while (tools); Py_DECREF(line_obj); + uint8_t original_opcode; done: + original_opcode = line_data->original_opcode; assert(original_opcode != 0); assert(original_opcode != INSTRUMENTED_LINE); assert(_PyOpcode_Deopt[original_opcode] == original_opcode); @@ -1655,7 +1649,9 @@ _Py_Instrument(PyCodeObject *code, PyInterpreterState *interp) i += _PyInstruction_GetLength(code, i); } } - +#ifdef INSTRUMENT_DEBUG + sanity_check_instrumentation(code); +#endif uint8_t new_line_tools = new_events.tools[PY_MONITORING_EVENT_LINE]; uint8_t new_per_instruction_tools = new_events.tools[PY_MONITORING_EVENT_INSTRUCTION]; From c0f488b88f2a54d76256818e2841d868fecfd396 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 11 Sep 2023 17:50:33 +0300 Subject: [PATCH 151/357] gh-109182: Fix and improve tests for gh-108654 (GH-109189) --- Lib/test/test_listcomps.py | 46 +++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/Lib/test/test_listcomps.py b/Lib/test/test_listcomps.py index c1089574d71b02..12f7bbd123b30c 100644 --- a/Lib/test/test_listcomps.py +++ b/Lib/test/test_listcomps.py @@ -125,7 +125,7 @@ def get_output(moddict, name): self.assertIs(type(e), raises) else: for k, v in (outputs or {}).items(): - self.assertEqual(get_output(newns, k), v) + self.assertEqual(get_output(newns, k), v, k) def test_lambdas_with_iteration_var_as_default(self): code = """ @@ -563,28 +563,38 @@ def test_iter_var_available_in_locals(self): def test_comp_in_try_except(self): template = """ - value = ["a"] + value = ["ab"] + result = snapshot = None try: - [{func}(value) for value in value] + result = [{func}(value) for value in value] except: - pass + snapshot = value + raise """ - for func in ["str", "int"]: - code = template.format(func=func) - raises = func != "str" - with self.subTest(raises=raises): - self._check_in_scopes(code, {"value": ["a"]}) + # No exception. + code = template.format(func='len') + self._check_in_scopes(code, {"value": ["ab"], "result": [2], "snapshot": None}) + # Handles exception. + code = template.format(func='int') + self._check_in_scopes(code, {"value": ["ab"], "result": None, "snapshot": ["ab"]}, + raises=ValueError) def test_comp_in_try_finally(self): - code = """ - def f(value): - try: - [{func}(value) for value in value] - finally: - return value - ret = f(["a"]) - """ - self._check_in_scopes(code, {"ret": ["a"]}) + template = """ + value = ["ab"] + result = snapshot = None + try: + result = [{func}(value) for value in value] + finally: + snapshot = value + """ + # No exception. + code = template.format(func='len') + self._check_in_scopes(code, {"value": ["ab"], "result": [2], "snapshot": ["ab"]}) + # Handles exception. + code = template.format(func='int') + self._check_in_scopes(code, {"value": ["ab"], "result": None, "snapshot": ["ab"]}, + raises=ValueError) def test_exception_in_post_comp_call(self): code = """ From 517cd82ea7d01b344804413ef05610934a43a241 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 11 Sep 2023 17:27:03 +0200 Subject: [PATCH 152/357] gh-108987: Fix _thread.start_new_thread() race condition (#109135) Fix _thread.start_new_thread() race condition. If a thread is created during Python finalization, the newly spawned thread now exits immediately instead of trying to access freed memory and lead to a crash. thread_run() calls PyEval_AcquireThread() which checks if the thread must exit. The problem was that tstate was dereferenced earlier in _PyThreadState_Bind() which leads to a crash most of the time. Move _PyThreadState_CheckConsistency() from thread_run() to _PyThreadState_Bind(). --- Include/internal/pycore_pystate.h | 2 + ...-09-08-12-09-55.gh-issue-108987.x5AIG8.rst | 4 ++ Modules/_threadmodule.c | 47 ++++++++++++------- Python/ceval_gil.c | 28 ++--------- Python/pystate.c | 29 ++++++++++++ 5 files changed, 69 insertions(+), 41 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-08-12-09-55.gh-issue-108987.x5AIG8.rst diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 9c0e42e7bad06c..9fc8ae903b2ac0 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -71,6 +71,8 @@ extern _Py_thread_local PyThreadState *_Py_tss_tstate; extern int _PyThreadState_CheckConsistency(PyThreadState *tstate); #endif +int _PyThreadState_MustExit(PyThreadState *tstate); + // Export for most shared extensions, used via _PyThreadState_GET() static // inline function. PyAPI_FUNC(PyThreadState *) _PyThreadState_GetCurrent(void); diff --git a/Misc/NEWS.d/next/Library/2023-09-08-12-09-55.gh-issue-108987.x5AIG8.rst b/Misc/NEWS.d/next/Library/2023-09-08-12-09-55.gh-issue-108987.x5AIG8.rst new file mode 100644 index 00000000000000..16526ee748d869 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-08-12-09-55.gh-issue-108987.x5AIG8.rst @@ -0,0 +1,4 @@ +Fix :func:`_thread.start_new_thread` race condition. If a thread is created +during Python finalization, the newly spawned thread now exits immediately +instead of trying to access freed memory and lead to a crash. Patch by +Victor Stinner. diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 05bb49756c9303..7692bacccc4909 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -1051,21 +1051,21 @@ _localdummy_destroyed(PyObject *localweakref, PyObject *dummyweakref) /* Module functions */ struct bootstate { - PyInterpreterState *interp; + PyThreadState *tstate; PyObject *func; PyObject *args; PyObject *kwargs; - PyThreadState *tstate; - _PyRuntimeState *runtime; }; static void -thread_bootstate_free(struct bootstate *boot) +thread_bootstate_free(struct bootstate *boot, int decref) { - Py_DECREF(boot->func); - Py_DECREF(boot->args); - Py_XDECREF(boot->kwargs); + if (decref) { + Py_DECREF(boot->func); + Py_DECREF(boot->args); + Py_XDECREF(boot->kwargs); + } PyMem_Free(boot); } @@ -1076,9 +1076,24 @@ thread_run(void *boot_raw) struct bootstate *boot = (struct bootstate *) boot_raw; PyThreadState *tstate = boot->tstate; - // gh-104690: If Python is being finalized and PyInterpreterState_Delete() - // was called, tstate becomes a dangling pointer. - assert(_PyThreadState_CheckConsistency(tstate)); + // gh-108987: If _thread.start_new_thread() is called before or while + // Python is being finalized, thread_run() can called *after*. + // _PyRuntimeState_SetFinalizing() is called. At this point, all Python + // threads must exit, except of the thread calling Py_Finalize() whch holds + // the GIL and must not exit. + // + // At this stage, tstate can be a dangling pointer (point to freed memory), + // it's ok to call _PyThreadState_MustExit() with a dangling pointer. + if (_PyThreadState_MustExit(tstate)) { + // Don't call PyThreadState_Clear() nor _PyThreadState_DeleteCurrent(). + // These functions are called on tstate indirectly by Py_Finalize() + // which calls _PyInterpreterState_Clear(). + // + // Py_DECREF() cannot be called because the GIL is not held: leak + // references on purpose. Python is being finalized anyway. + thread_bootstate_free(boot, 0); + goto exit; + } _PyThreadState_Bind(tstate); PyEval_AcquireThread(tstate); @@ -1097,14 +1112,17 @@ thread_run(void *boot_raw) Py_DECREF(res); } - thread_bootstate_free(boot); + thread_bootstate_free(boot, 1); + tstate->interp->threads.count--; PyThreadState_Clear(tstate); _PyThreadState_DeleteCurrent(tstate); +exit: // bpo-44434: Don't call explicitly PyThread_exit_thread(). On Linux with // the glibc, pthread_exit() can abort the whole process if dlopen() fails // to open the libgcc_s.so library (ex: EMFILE error). + return; } static PyObject * @@ -1128,7 +1146,6 @@ and False otherwise.\n"); static PyObject * thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) { - _PyRuntimeState *runtime = &_PyRuntime; PyObject *func, *args, *kwargs = NULL; if (!PyArg_UnpackTuple(fargs, "start_new_thread", 2, 3, @@ -1171,8 +1188,7 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) if (boot == NULL) { return PyErr_NoMemory(); } - boot->interp = _PyInterpreterState_GET(); - boot->tstate = _PyThreadState_New(boot->interp); + boot->tstate = _PyThreadState_New(interp); if (boot->tstate == NULL) { PyMem_Free(boot); if (!PyErr_Occurred()) { @@ -1180,7 +1196,6 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) } return NULL; } - boot->runtime = runtime; boot->func = Py_NewRef(func); boot->args = Py_NewRef(args); boot->kwargs = Py_XNewRef(kwargs); @@ -1189,7 +1204,7 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) if (ident == PYTHREAD_INVALID_THREAD_ID) { PyErr_SetString(ThreadError, "can't start new thread"); PyThreadState_Clear(boot->tstate); - thread_bootstate_free(boot); + thread_bootstate_free(boot, 1); return NULL; } return PyLong_FromUnsignedLong(ident); diff --git a/Python/ceval_gil.c b/Python/ceval_gil.c index cef5317b46bf8e..3b7e6cb1bda3ff 100644 --- a/Python/ceval_gil.c +++ b/Python/ceval_gil.c @@ -329,28 +329,6 @@ drop_gil(struct _ceval_state *ceval, PyThreadState *tstate) } -/* Check if a Python thread must exit immediately, rather than taking the GIL - if Py_Finalize() has been called. - - When this function is called by a daemon thread after Py_Finalize() has been - called, the GIL does no longer exist. - - tstate must be non-NULL. */ -static inline int -tstate_must_exit(PyThreadState *tstate) -{ - /* bpo-39877: Access _PyRuntime directly rather than using - tstate->interp->runtime to support calls from Python daemon threads. - After Py_Finalize() has been called, tstate can be a dangling pointer: - point to PyThreadState freed memory. */ - PyThreadState *finalizing = _PyRuntimeState_GetFinalizing(&_PyRuntime); - if (finalizing == NULL) { - finalizing = _PyInterpreterState_GetFinalizing(tstate->interp); - } - return (finalizing != NULL && finalizing != tstate); -} - - /* Take the GIL. The function saves errno at entry and restores its value at exit. @@ -366,7 +344,7 @@ take_gil(PyThreadState *tstate) // XXX It may be more correct to check tstate->_status.finalizing. // XXX assert(!tstate->_status.cleared); - if (tstate_must_exit(tstate)) { + if (_PyThreadState_MustExit(tstate)) { /* bpo-39877: If Py_Finalize() has been called and tstate is not the thread which called Py_Finalize(), exit immediately the thread. @@ -404,7 +382,7 @@ take_gil(PyThreadState *tstate) _Py_atomic_load_relaxed(&gil->locked) && gil->switch_number == saved_switchnum) { - if (tstate_must_exit(tstate)) { + if (_PyThreadState_MustExit(tstate)) { MUTEX_UNLOCK(gil->mutex); // gh-96387: If the loop requested a drop request in a previous // iteration, reset the request. Otherwise, drop_gil() can @@ -444,7 +422,7 @@ take_gil(PyThreadState *tstate) MUTEX_UNLOCK(gil->switch_mutex); #endif - if (tstate_must_exit(tstate)) { + if (_PyThreadState_MustExit(tstate)) { /* bpo-36475: If Py_Finalize() has been called and tstate is not the thread which called Py_Finalize(), exit immediately the thread. diff --git a/Python/pystate.c b/Python/pystate.c index 09c3538ad7b872..b5c4fd7fb50616 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1907,6 +1907,10 @@ PyThreadState_Swap(PyThreadState *newts) void _PyThreadState_Bind(PyThreadState *tstate) { + // gh-104690: If Python is being finalized and PyInterpreterState_Delete() + // was called, tstate becomes a dangling pointer. + assert(_PyThreadState_CheckConsistency(tstate)); + bind_tstate(tstate); // This makes sure there's a gilstate tstate bound // as soon as possible. @@ -2908,6 +2912,31 @@ _PyThreadState_CheckConsistency(PyThreadState *tstate) #endif +// Check if a Python thread must exit immediately, rather than taking the GIL +// if Py_Finalize() has been called. +// +// When this function is called by a daemon thread after Py_Finalize() has been +// called, the GIL does no longer exist. +// +// tstate can be a dangling pointer (point to freed memory): only tstate value +// is used, the pointer is not deferenced. +// +// tstate must be non-NULL. +int +_PyThreadState_MustExit(PyThreadState *tstate) +{ + /* bpo-39877: Access _PyRuntime directly rather than using + tstate->interp->runtime to support calls from Python daemon threads. + After Py_Finalize() has been called, tstate can be a dangling pointer: + point to PyThreadState freed memory. */ + PyThreadState *finalizing = _PyRuntimeState_GetFinalizing(&_PyRuntime); + if (finalizing == NULL) { + finalizing = _PyInterpreterState_GetFinalizing(tstate->interp); + } + return (finalizing != NULL && finalizing != tstate); +} + + #ifdef __cplusplus } #endif From 57b6205523d934d61b6308d63ef72c494c7d2b7e Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 11 Sep 2023 10:06:16 -0600 Subject: [PATCH 153/357] gh-109190: What's New in 3.12: Add subheadings to removals for easy linking (#109159) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/whatsnew/3.12.rst | 159 ++++++++++++++++++++++++++++-------------- 1 file changed, 107 insertions(+), 52 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index a46c913c4997ba..447e81855a4a66 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -1274,13 +1274,19 @@ although there is currently no date scheduled for their removal. Removed ======= -* ``asynchat`` and ``asyncore``: These two modules have been removed +asynchat and asyncore +--------------------- + +* These two modules have been removed according to the schedule in :pep:`594`, having been deprecated in Python 3.6. Use :mod:`asyncio` instead. (Contributed by Nikita Sobolev in :gh:`96580`.) -* :mod:`configparser`: Several names deprecated in the :mod:`configparser` way back in 3.2 have +configparser +------------ + +* Several names deprecated in the :mod:`configparser` way back in 3.2 have been removed per :gh:`89336`: * :class:`configparser.ParsingError` no longer has a ``filename`` attribute @@ -1290,13 +1296,19 @@ Removed * :class:`configparser.ConfigParser` no longer has a ``readfp`` method. Use :meth:`~configparser.ConfigParser.read_file` instead. -* ``distutils``: Remove the ``distutils`` package. It was deprecated in Python 3.10 by +distutils +--------- + +* Remove the :py:mod:`!distutils` package. It was deprecated in Python 3.10 by :pep:`632` "Deprecate distutils module". For projects still using ``distutils`` and cannot be updated to something else, the ``setuptools`` project can be installed: it still provides ``distutils``. (Contributed by Victor Stinner in :gh:`92584`.) -* :mod:`ensurepip`: Remove the bundled setuptools wheel from :mod:`ensurepip`, +ensurepip +--------- + +* Remove the bundled setuptools wheel from :mod:`ensurepip`, and stop installing setuptools in environments created by :mod:`venv`. ``pip (>= 22.1)`` does not require setuptools to be installed in the @@ -1314,27 +1326,42 @@ Removed (Contributed by Pradyun Gedam in :gh:`95299`.) -* :mod:`enum`: Remove ``EnumMeta.__getattr__``, which is no longer needed for +enum +---- + +* Remove :mod:`enum`'s ``EnumMeta.__getattr__``, which is no longer needed for enum attribute access. (Contributed by Ethan Furman in :gh:`95083`.) -* :mod:`ftplib`: Remove the ``FTP_TLS.ssl_version`` class attribute: use the +ftplib +------ + +* Remove :mod:`ftplib`'s ``FTP_TLS.ssl_version`` class attribute: use the *context* parameter instead. (Contributed by Victor Stinner in :gh:`94172`.) -* :mod:`gzip`: Remove the ``filename`` attribute of :class:`gzip.GzipFile`, +gzip +---- + +* Remove the ``filename`` attribute of :mod:`gzip`'s :class:`gzip.GzipFile`, deprecated since Python 2.6, use the :attr:`~gzip.GzipFile.name` attribute instead. In write mode, the ``filename`` attribute added ``'.gz'`` file extension if it was not present. (Contributed by Victor Stinner in :gh:`94196`.) -* :mod:`hashlib`: Remove the pure Python implementation of +hashlib +------- + +* Remove the pure Python implementation of :mod:`hashlib`'s :func:`hashlib.pbkdf2_hmac()`, deprecated in Python 3.10. Python 3.10 and newer requires OpenSSL 1.1.1 (:pep:`644`): this OpenSSL version provides a C implementation of :func:`~hashlib.pbkdf2_hmac()` which is faster. (Contributed by Victor Stinner in :gh:`94199`.) -* :mod:`importlib`: Many previously deprecated cleanups in :mod:`importlib` have now been +importlib +--------- + +* Many previously deprecated cleanups in :mod:`importlib` have now been completed: * References to, and support for :meth:`!module_repr()` has been removed. @@ -1350,10 +1377,13 @@ Removed * ``importlib.abc.Finder``, ``pkgutil.ImpImporter``, and ``pkgutil.ImpLoader`` have been removed. (Contributed by Barry Warsaw in :gh:`98040`.) - * The :mod:`!imp` module has been removed. (Contributed by Barry Warsaw in - :gh:`98040`.) +imp +--- - * Replace removed :mod:`!imp` functions with :mod:`importlib` functions: +* The :mod:`!imp` module has been removed. (Contributed by Barry Warsaw in + :gh:`98040`.) + +* Replace removed :mod:`!imp` functions with :mod:`importlib` functions: ================================= ======================================= imp importlib @@ -1370,7 +1400,7 @@ Removed ``imp.source_from_cache()`` :func:`importlib.util.source_from_cache` ================================= ======================================= - * Replace ``imp.load_source()`` with:: +* Replace ``imp.load_source()`` with:: import importlib.util import importlib.machinery @@ -1385,28 +1415,34 @@ Removed loader.exec_module(module) return module - * Removed :mod:`!imp` functions and attributes with no replacements: +* Removed :mod:`!imp` functions and attributes with no replacements: + + * undocumented functions: - * undocumented functions: + * ``imp.init_builtin()`` + * ``imp.load_compiled()`` + * ``imp.load_dynamic()`` + * ``imp.load_package()`` - * ``imp.init_builtin()`` - * ``imp.load_compiled()`` - * ``imp.load_dynamic()`` - * ``imp.load_package()`` + * ``imp.lock_held()``, ``imp.acquire_lock()``, ``imp.release_lock()``: + the locking scheme has changed in Python 3.3 to per-module locks. + * ``imp.find_module()`` constants: ``SEARCH_ERROR``, ``PY_SOURCE``, + ``PY_COMPILED``, ``C_EXTENSION``, ``PY_RESOURCE``, ``PKG_DIRECTORY``, + ``C_BUILTIN``, ``PY_FROZEN``, ``PY_CODERESOURCE``, ``IMP_HOOK``. - * ``imp.lock_held()``, ``imp.acquire_lock()``, ``imp.release_lock()``: - the locking scheme has changed in Python 3.3 to per-module locks. - * ``imp.find_module()`` constants: ``SEARCH_ERROR``, ``PY_SOURCE``, - ``PY_COMPILED``, ``C_EXTENSION``, ``PY_RESOURCE``, ``PKG_DIRECTORY``, - ``C_BUILTIN``, ``PY_FROZEN``, ``PY_CODERESOURCE``, ``IMP_HOOK``. +io +-- -* :mod:`io`: Remove ``io.OpenWrapper`` and ``_pyio.OpenWrapper``, deprecated in Python +* Remove :mod:`io`'s ``io.OpenWrapper`` and ``_pyio.OpenWrapper``, deprecated in Python 3.10: just use :func:`open` instead. The :func:`open` (:func:`io.open`) function is a built-in function. Since Python 3.10, :func:`!_pyio.open` is also a static method. (Contributed by Victor Stinner in :gh:`94169`.) -* :mod:`locale`: Remove the :func:`!locale.format` function, deprecated in Python 3.7: +locale +------ + +* Remove :mod:`locale`'s :func:`!locale.format` function, deprecated in Python 3.7: use :func:`locale.format_string` instead. (Contributed by Victor Stinner in :gh:`94226`.) @@ -1418,7 +1454,10 @@ Removed .. _aiosmtpd: https://pypi.org/project/aiosmtpd/ -* :mod:`sqlite3`: The following undocumented :mod:`sqlite3` features, deprecated in Python +sqlite3 +------- + +* The following undocumented :mod:`sqlite3` features, deprecated in Python 3.10, are now removed: * ``sqlite3.enable_shared_cache()`` @@ -1434,30 +1473,34 @@ Removed (Contributed by Erlend E. Aasland in :gh:`92548`.) -* :mod:`ssl`: +ssl +--- - * Remove the :func:`!ssl.RAND_pseudo_bytes` function, deprecated in Python 3.6: - use :func:`os.urandom` or :func:`ssl.RAND_bytes` instead. - (Contributed by Victor Stinner in :gh:`94199`.) +* Remove :mod:`ssl`'s :func:`!ssl.RAND_pseudo_bytes` function, deprecated in Python 3.6: + use :func:`os.urandom` or :func:`ssl.RAND_bytes` instead. + (Contributed by Victor Stinner in :gh:`94199`.) + +* Remove the :func:`!ssl.match_hostname` function. + It was deprecated in Python 3.7. OpenSSL performs + hostname matching since Python 3.7, Python no longer uses the + :func:`!ssl.match_hostname` function. + (Contributed by Victor Stinner in :gh:`94199`.) - * Remove the :func:`!ssl.match_hostname` function. - It was deprecated in Python 3.7. OpenSSL performs - hostname matching since Python 3.7, Python no longer uses the - :func:`!ssl.match_hostname` function. - (Contributed by Victor Stinner in :gh:`94199`.) +* Remove the :func:`!ssl.wrap_socket` function, deprecated in Python 3.7: + instead, create a :class:`ssl.SSLContext` object and call its + :class:`ssl.SSLContext.wrap_socket` method. Any package that still uses + :func:`!ssl.wrap_socket` is broken and insecure. The function neither sends a + SNI TLS extension nor validates server hostname. Code is subject to `CWE-295 + `_: Improper Certificate + Validation. + (Contributed by Victor Stinner in :gh:`94199`.) - * Remove the :func:`!ssl.wrap_socket` function, deprecated in Python 3.7: - instead, create a :class:`ssl.SSLContext` object and call its - :class:`ssl.SSLContext.wrap_socket` method. Any package that still uses - :func:`!ssl.wrap_socket` is broken and insecure. The function neither sends a - SNI TLS extension nor validates server hostname. Code is subject to `CWE-295 - `_: Improper Certificate - Validation. - (Contributed by Victor Stinner in :gh:`94199`.) +unittest +-------- -* :mod:`unittest`: Removed many old deprecated :mod:`unittest` features: +* Removed many old deprecated :mod:`unittest` features: - - A number of :class:`~unittest.TestCase` method aliases: + * A number of :class:`~unittest.TestCase` method aliases: ============================ =============================== =============== Deprecated alias Method Name Deprecated in @@ -1482,33 +1525,45 @@ Removed You can use https://github.com/isidentical/teyit to automatically modernise your unit tests. - - Undocumented and broken :class:`~unittest.TestCase` method + * Undocumented and broken :class:`~unittest.TestCase` method ``assertDictContainsSubset`` (deprecated in Python 3.2). - - Undocumented :meth:`TestLoader.loadTestsFromModule + * Undocumented :meth:`TestLoader.loadTestsFromModule ` parameter *use_load_tests* (deprecated and ignored since Python 3.2). - - An alias of the :class:`~unittest.TextTestResult` class: + * An alias of the :class:`~unittest.TextTestResult` class: ``_TextTestResult`` (deprecated in Python 3.2). (Contributed by Serhiy Storchaka in :issue:`45162`.) -* :mod:`webbrowser`: Remove support for obsolete browsers from :mod:`webbrowser`. +webbrowser +---------- + +* Remove support for obsolete browsers from :mod:`webbrowser`. Removed browsers include: Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird, and Firefox versions 35 and below (:gh:`102871`). -* :mod:`xml.etree.ElementTree`: Remove the ``ElementTree.Element.copy()`` method of the +xml.etree.ElementTree +--------------------- + +* Remove the ``ElementTree.Element.copy()`` method of the pure Python implementation, deprecated in Python 3.10, use the :func:`copy.copy` function instead. The C implementation of :mod:`xml.etree.ElementTree` has no ``copy()`` method, only a ``__copy__()`` method. (Contributed by Victor Stinner in :gh:`94383`.) -* :mod:`zipimport`: Remove ``find_loader()`` and ``find_module()`` methods, +zipimport +--------- + +* Remove :mod:`zipimport`'s ``find_loader()`` and ``find_module()`` methods, deprecated in Python 3.10: use the ``find_spec()`` method instead. See :pep:`451` for the rationale. (Contributed by Victor Stinner in :gh:`94379`.) +Others +------ + * Removed the ``suspicious`` rule from the documentation Makefile, and removed ``Doc/tools/rstlint.py``, both in favor of `sphinx-lint `_. From baa6dc8e388e71b2a00347143ecefb2ad3a8e53b Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Mon, 11 Sep 2023 19:13:37 +0300 Subject: [PATCH 154/357] gh-90805: Make sure test_functools works with and without _functoolsmodule (GH-108644) --- Lib/test/test_functools.py | 58 ++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index 5ba7f51c91f3b5..e4de2c5ede15f1 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -26,10 +26,16 @@ py_functools = import_helper.import_fresh_module('functools', blocked=['_functools']) -c_functools = import_helper.import_fresh_module('functools') +c_functools = import_helper.import_fresh_module('functools', + fresh=['_functools']) decimal = import_helper.import_fresh_module('decimal', fresh=['_decimal']) +_partial_types = [py_functools.partial] +if c_functools: + _partial_types.append(c_functools.partial) + + @contextlib.contextmanager def replaced_module(name, replacement): original_module = sys.modules[name] @@ -201,7 +207,7 @@ def test_repr(self): kwargs = {'a': object(), 'b': object()} kwargs_reprs = ['a={a!r}, b={b!r}'.format_map(kwargs), 'b={b!r}, a={a!r}'.format_map(kwargs)] - if self.partial in (c_functools.partial, py_functools.partial): + if self.partial in _partial_types: name = 'functools.partial' else: name = self.partial.__name__ @@ -223,7 +229,7 @@ def test_repr(self): for kwargs_repr in kwargs_reprs]) def test_recursive_repr(self): - if self.partial in (c_functools.partial, py_functools.partial): + if self.partial in _partial_types: name = 'functools.partial' else: name = self.partial.__name__ @@ -250,7 +256,7 @@ def test_recursive_repr(self): f.__setstate__((capture, (), {}, {})) def test_pickle(self): - with self.AllowPickle(): + with replaced_module('functools', self.module): f = self.partial(signature, ['asdf'], bar=[True]) f.attr = [] for proto in range(pickle.HIGHEST_PROTOCOL + 1): @@ -333,7 +339,7 @@ def test_setstate_subclasses(self): self.assertIs(type(r[0]), tuple) def test_recursive_pickle(self): - with self.AllowPickle(): + with replaced_module('functools', self.module): f = self.partial(capture) f.__setstate__((f, (), {}, {})) try: @@ -387,14 +393,9 @@ def __getitem__(self, key): @unittest.skipUnless(c_functools, 'requires the C _functools module') class TestPartialC(TestPartial, unittest.TestCase): if c_functools: + module = c_functools partial = c_functools.partial - class AllowPickle: - def __enter__(self): - return self - def __exit__(self, type, value, tb): - return False - def test_attributes_unwritable(self): # attributes should not be writable p = self.partial(capture, 1, 2, a=10, b=20) @@ -437,15 +438,9 @@ def __str__(self): class TestPartialPy(TestPartial, unittest.TestCase): + module = py_functools partial = py_functools.partial - class AllowPickle: - def __init__(self): - self._cm = replaced_module("functools", py_functools) - def __enter__(self): - return self._cm.__enter__() - def __exit__(self, type, value, tb): - return self._cm.__exit__(type, value, tb) if c_functools: class CPartialSubclass(c_functools.partial): @@ -1872,9 +1867,10 @@ def orig(): ... def py_cached_func(x, y): return 3 * x + y -@c_functools.lru_cache() -def c_cached_func(x, y): - return 3 * x + y +if c_functools: + @c_functools.lru_cache() + def c_cached_func(x, y): + return 3 * x + y class TestLRUPy(TestLRU, unittest.TestCase): @@ -1891,18 +1887,20 @@ def cached_staticmeth(x, y): return 3 * x + y +@unittest.skipUnless(c_functools, 'requires the C _functools module') class TestLRUC(TestLRU, unittest.TestCase): - module = c_functools - cached_func = c_cached_func, + if c_functools: + module = c_functools + cached_func = c_cached_func, - @module.lru_cache() - def cached_meth(self, x, y): - return 3 * x + y + @module.lru_cache() + def cached_meth(self, x, y): + return 3 * x + y - @staticmethod - @module.lru_cache() - def cached_staticmeth(x, y): - return 3 * x + y + @staticmethod + @module.lru_cache() + def cached_staticmeth(x, y): + return 3 * x + y class TestSingleDispatch(unittest.TestCase): From de5f8f7d13c0bbc723eaea83284dc78b37be54b4 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 11 Sep 2023 19:33:42 +0200 Subject: [PATCH 155/357] gh-109276: libregrtest: use separated file for JSON (#109277) libregrtest now uses a separated file descriptor to write test result as JSON. Previously, if a test wrote debug messages late around the JSON, the main test process failed to parse JSON. Rename TestResult.write_json() to TestResult.write_json_into(). worker_process() no longer writes an empty line at the end. There is no need to separate test process output from the JSON output anymore, since JSON is now written into a separated file descriptor. create_worker_process() now always spawn the process with close_fds=True. --- Lib/test/libregrtest/result.py | 2 +- Lib/test/libregrtest/run_workers.py | 66 ++++++++++++------- Lib/test/libregrtest/runtests.py | 3 + Lib/test/libregrtest/single.py | 4 ++ Lib/test/libregrtest/worker.py | 42 ++++++++---- ...-09-11-18-19-52.gh-issue-109276.btfFtT.rst | 3 + 6 files changed, 84 insertions(+), 36 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-11-18-19-52.gh-issue-109276.btfFtT.rst diff --git a/Lib/test/libregrtest/result.py b/Lib/test/libregrtest/result.py index cfd08ecc41b7d4..bf885264657d5c 100644 --- a/Lib/test/libregrtest/result.py +++ b/Lib/test/libregrtest/result.py @@ -156,7 +156,7 @@ def get_rerun_match_tests(self) -> FilterTuple | None: return None return tuple(match_tests) - def write_json(self, file) -> None: + def write_json_into(self, file) -> None: json.dump(self, file, cls=_EncodeTestResult) @staticmethod diff --git a/Lib/test/libregrtest/run_workers.py b/Lib/test/libregrtest/run_workers.py index 768625cb507f9a..5c665abfeb57bd 100644 --- a/Lib/test/libregrtest/run_workers.py +++ b/Lib/test/libregrtest/run_workers.py @@ -20,12 +20,14 @@ from .runtests import RunTests from .single import PROGRESS_MIN_TIME from .utils import ( - StrPath, TestName, + StrPath, StrJSON, TestName, MS_WINDOWS, format_duration, print_warning) from .worker import create_worker_process, USE_PROCESS_GROUP -if sys.platform == 'win32': +if MS_WINDOWS: import locale + import msvcrt + # Display the running tests if nothing happened last N seconds @@ -153,10 +155,11 @@ def mp_result_error( ) -> MultiprocessResult: return MultiprocessResult(test_result, stdout, err_msg) - def _run_process(self, runtests: RunTests, output_file: TextIO, + def _run_process(self, runtests: RunTests, output_fd: int, json_fd: int, tmp_dir: StrPath | None = None) -> int: try: - popen = create_worker_process(runtests, output_file, tmp_dir) + popen = create_worker_process(runtests, output_fd, json_fd, + tmp_dir) self._killed = False self._popen = popen @@ -208,7 +211,7 @@ def _run_process(self, runtests: RunTests, output_file: TextIO, def _runtest(self, test_name: TestName) -> MultiprocessResult: self.current_test_name = test_name - if sys.platform == 'win32': + if MS_WINDOWS: # gh-95027: When stdout is not a TTY, Python uses the ANSI code # page for the sys.stdout encoding. If the main process runs in a # terminal, sys.stdout uses WindowsConsoleIO with UTF-8 encoding. @@ -221,14 +224,25 @@ def _runtest(self, test_name: TestName) -> MultiprocessResult: match_tests = self.runtests.get_match_tests(test_name) else: match_tests = None - kwargs = {} - if match_tests: - kwargs['match_tests'] = match_tests - worker_runtests = self.runtests.copy(tests=tests, **kwargs) + err_msg = None # gh-94026: Write stdout+stderr to a tempfile as workaround for # non-blocking pipes on Emscripten with NodeJS. - with tempfile.TemporaryFile('w+', encoding=encoding) as stdout_file: + with (tempfile.TemporaryFile('w+', encoding=encoding) as stdout_file, + tempfile.TemporaryFile('w+', encoding='utf8') as json_file): + stdout_fd = stdout_file.fileno() + json_fd = json_file.fileno() + if MS_WINDOWS: + json_fd = msvcrt.get_osfhandle(json_fd) + + kwargs = {} + if match_tests: + kwargs['match_tests'] = match_tests + worker_runtests = self.runtests.copy( + tests=tests, + json_fd=json_fd, + **kwargs) + # gh-93353: Check for leaked temporary files in the parent process, # since the deletion of temporary files can happen late during # Python finalization: too late for libregrtest. @@ -239,12 +253,14 @@ def _runtest(self, test_name: TestName) -> MultiprocessResult: tmp_dir = tempfile.mkdtemp(prefix="test_python_") tmp_dir = os.path.abspath(tmp_dir) try: - retcode = self._run_process(worker_runtests, stdout_file, tmp_dir) + retcode = self._run_process(worker_runtests, + stdout_fd, json_fd, tmp_dir) finally: tmp_files = os.listdir(tmp_dir) os_helper.rmtree(tmp_dir) else: - retcode = self._run_process(worker_runtests, stdout_file) + retcode = self._run_process(worker_runtests, + stdout_fd, json_fd) tmp_files = () stdout_file.seek(0) @@ -257,23 +273,27 @@ def _runtest(self, test_name: TestName) -> MultiprocessResult: result = TestResult(test_name, state=State.MULTIPROCESSING_ERROR) return self.mp_result_error(result, err_msg=err_msg) + try: + # deserialize run_tests_worker() output + json_file.seek(0) + worker_json: StrJSON = json_file.read() + if worker_json: + result = TestResult.from_json(worker_json) + else: + err_msg = f"empty JSON" + except Exception as exc: + # gh-101634: Catch UnicodeDecodeError if stdout cannot be + # decoded from encoding + err_msg = f"Fail to read or parser worker process JSON: {exc}" + result = TestResult(test_name, state=State.MULTIPROCESSING_ERROR) + return self.mp_result_error(result, stdout, err_msg=err_msg) + if retcode is None: result = TestResult(test_name, state=State.TIMEOUT) return self.mp_result_error(result, stdout) - err_msg = None if retcode != 0: err_msg = "Exit code %s" % retcode - else: - stdout, _, worker_json = stdout.rpartition("\n") - stdout = stdout.rstrip() - if not worker_json: - err_msg = "Failed to parse worker stdout" - else: - try: - result = TestResult.from_json(worker_json) - except Exception as exc: - err_msg = "Failed to parse worker JSON: %s" % exc if err_msg: result = TestResult(test_name, state=State.MULTIPROCESSING_ERROR) diff --git a/Lib/test/libregrtest/runtests.py b/Lib/test/libregrtest/runtests.py index e843cc2dadf734..64f8f6ab0ff305 100644 --- a/Lib/test/libregrtest/runtests.py +++ b/Lib/test/libregrtest/runtests.py @@ -36,6 +36,9 @@ class RunTests: gc_threshold: int | None = None use_resources: list[str] = dataclasses.field(default_factory=list) python_cmd: list[str] | None = None + # On Unix, it's a file descriptor. + # On Windows, it's a handle. + json_fd: int | None = None def copy(self, **override): state = dataclasses.asdict(self) diff --git a/Lib/test/libregrtest/single.py b/Lib/test/libregrtest/single.py index 635b4f93702b04..c26e542cf15ef5 100644 --- a/Lib/test/libregrtest/single.py +++ b/Lib/test/libregrtest/single.py @@ -271,5 +271,9 @@ def run_single_test(test_name: TestName, runtests: RunTests) -> TestResult: print(f"test {test_name} crashed -- {msg}", file=sys.stderr, flush=True) result.state = State.UNCAUGHT_EXC + + sys.stdout.flush() + sys.stderr.flush() + result.duration = time.perf_counter() - start_time return result diff --git a/Lib/test/libregrtest/worker.py b/Lib/test/libregrtest/worker.py index ed1286e5700679..b3b204f65f92ec 100644 --- a/Lib/test/libregrtest/worker.py +++ b/Lib/test/libregrtest/worker.py @@ -10,7 +10,7 @@ from .runtests import RunTests from .single import run_single_test from .utils import ( - StrPath, StrJSON, FilterTuple, + StrPath, StrJSON, FilterTuple, MS_WINDOWS, get_work_dir, exit_timeout) @@ -18,7 +18,7 @@ def create_worker_process(runtests: RunTests, - output_file: TextIO, + output_fd: int, json_fd: int, tmp_dir: StrPath | None = None) -> subprocess.Popen: python_cmd = runtests.python_cmd worker_json = runtests.as_json() @@ -41,23 +41,42 @@ def create_worker_process(runtests: RunTests, # Running the child from the same working directory as regrtest's original # invocation ensures that TEMPDIR for the child is the same when # sysconfig.is_python_build() is true. See issue 15300. - kw = dict( + kwargs = dict( env=env, - stdout=output_file, + stdout=output_fd, # bpo-45410: Write stderr into stdout to keep messages order - stderr=output_file, + stderr=output_fd, text=True, - close_fds=(os.name != 'nt'), + close_fds=True, ) + if not MS_WINDOWS: + kwargs['pass_fds'] = [json_fd] + else: + startupinfo = subprocess.STARTUPINFO() + startupinfo.lpAttributeList = {"handle_list": [json_fd]} + kwargs['startupinfo'] = startupinfo if USE_PROCESS_GROUP: - kw['start_new_session'] = True - return subprocess.Popen(cmd, **kw) + kwargs['start_new_session'] = True + + if MS_WINDOWS: + os.set_handle_inheritable(json_fd, True) + try: + return subprocess.Popen(cmd, **kwargs) + finally: + if MS_WINDOWS: + os.set_handle_inheritable(json_fd, False) def worker_process(worker_json: StrJSON) -> NoReturn: runtests = RunTests.from_json(worker_json) test_name = runtests.tests[0] match_tests: FilterTuple | None = runtests.match_tests + json_fd: int = runtests.json_fd + + if MS_WINDOWS: + import msvcrt + json_fd = msvcrt.open_osfhandle(json_fd, os.O_WRONLY) + setup_test_dir(runtests.test_dir) setup_process() @@ -70,11 +89,10 @@ def worker_process(worker_json: StrJSON) -> NoReturn: print(f"Re-running {test_name} in verbose mode", flush=True) result = run_single_test(test_name, runtests) - print() # Force a newline (just in case) - # Serialize TestResult as dict in JSON - result.write_json(sys.stdout) - sys.stdout.flush() + with open(json_fd, 'w', encoding='utf-8') as json_file: + result.write_json_into(json_file) + sys.exit(0) diff --git a/Misc/NEWS.d/next/Tests/2023-09-11-18-19-52.gh-issue-109276.btfFtT.rst b/Misc/NEWS.d/next/Tests/2023-09-11-18-19-52.gh-issue-109276.btfFtT.rst new file mode 100644 index 00000000000000..5fcf6624f2e84d --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-11-18-19-52.gh-issue-109276.btfFtT.rst @@ -0,0 +1,3 @@ +libregrtest now uses a separated file descriptor to write test result as JSON. +Previously, if a test wrote debug messages late around the JSON, the main test +process failed to parse JSON. Patch by Victor Stinner. From ecd21a629a2a30bcae89902f7cad5670e9441e2c Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Mon, 11 Sep 2023 19:18:34 +0100 Subject: [PATCH 156/357] gh-109179: Fix traceback display for SyntaxErrors with notes (#109197) --- Lib/test/test_traceback.py | 43 ++++++++++--------- ...-09-09-21-17-18.gh-issue-109179.ZR8qs2.rst | 1 + Python/pythonrun.c | 24 +++++------ 3 files changed, 34 insertions(+), 34 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-09-21-17-18.gh-issue-109179.ZR8qs2.rst diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index be81082bb19472..aa8405bd25d120 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -1599,27 +1599,28 @@ def __repr__(self): err_msg = "b'please do not show me as numbers'" self.assertEqual(self.get_report(e), vanilla + err_msg + '\n') - def test_exception_with_note_with_multiple_notes(self): - e = ValueError(42) - vanilla = self.get_report(e) - - e.add_note('Note 1') - e.add_note('Note 2') - e.add_note('Note 3') - - self.assertEqual( - self.get_report(e), - vanilla + 'Note 1\n' + 'Note 2\n' + 'Note 3\n') - - del e.__notes__ - e.add_note('Note 4') - del e.__notes__ - e.add_note('Note 5') - e.add_note('Note 6') - - self.assertEqual( - self.get_report(e), - vanilla + 'Note 5\n' + 'Note 6\n') + def test_exception_with_multiple_notes(self): + for e in [ValueError(42), SyntaxError('bad syntax')]: + with self.subTest(e=e): + vanilla = self.get_report(e) + + e.add_note('Note 1') + e.add_note('Note 2') + e.add_note('Note 3') + + self.assertEqual( + self.get_report(e), + vanilla + 'Note 1\n' + 'Note 2\n' + 'Note 3\n') + + del e.__notes__ + e.add_note('Note 4') + del e.__notes__ + e.add_note('Note 5') + e.add_note('Note 6') + + self.assertEqual( + self.get_report(e), + vanilla + 'Note 5\n' + 'Note 6\n') def test_exception_qualname(self): class A: diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-09-21-17-18.gh-issue-109179.ZR8qs2.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-09-21-17-18.gh-issue-109179.ZR8qs2.rst new file mode 100644 index 00000000000000..dd95a8ec7920aa --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-09-21-17-18.gh-issue-109179.ZR8qs2.rst @@ -0,0 +1 @@ +Fix bug where the C traceback display drops notes from :exc:`SyntaxError`. diff --git a/Python/pythonrun.c b/Python/pythonrun.c index ddd8951cedb1f1..e3d03a8c95d767 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1125,21 +1125,16 @@ print_exception_suggestions(struct exception_print_context *ctx, } static int -print_exception_notes(struct exception_print_context *ctx, PyObject *value) +print_exception_notes(struct exception_print_context *ctx, PyObject *notes) { PyObject *f = ctx->file; - if (!PyExceptionInstance_Check(value)) { + if (notes == NULL) { return 0; } - PyObject *notes; - int res = PyObject_GetOptionalAttr(value, &_Py_ID(__notes__), ¬es); - if (res <= 0) { - return res; - } if (!PySequence_Check(notes) || PyUnicode_Check(notes) || PyBytes_Check(notes)) { - res = 0; + int res = 0; if (write_indented_margin(ctx, f) < 0) { res = -1; } @@ -1152,7 +1147,6 @@ print_exception_notes(struct exception_print_context *ctx, PyObject *value) res = PyFile_WriteObject(s, f, Py_PRINT_RAW); Py_DECREF(s); } - Py_DECREF(notes); if (PyFile_WriteString("\n", f) < 0) { res = -1; } @@ -1197,17 +1191,16 @@ print_exception_notes(struct exception_print_context *ctx, PyObject *value) } } - Py_DECREF(notes); return 0; error: Py_XDECREF(lines); - Py_DECREF(notes); return -1; } static int print_exception(struct exception_print_context *ctx, PyObject *value) { + PyObject *notes = NULL; PyObject *f = ctx->file; if (!PyExceptionInstance_Check(value)) { @@ -1221,8 +1214,11 @@ print_exception(struct exception_print_context *ctx, PyObject *value) goto error; } - /* grab the type now because value can change below */ + /* grab the type and notes now because value can change below */ PyObject *type = (PyObject *) Py_TYPE(value); + if (PyObject_GetOptionalAttr(value, &_Py_ID(__notes__), ¬es) < 0) { + goto error; + } if (print_exception_file_and_line(ctx, &value) < 0) { goto error; @@ -1236,14 +1232,16 @@ print_exception(struct exception_print_context *ctx, PyObject *value) if (PyFile_WriteString("\n", f) < 0) { goto error; } - if (print_exception_notes(ctx, value) < 0) { + if (print_exception_notes(ctx, notes) < 0) { goto error; } + Py_XDECREF(notes); Py_DECREF(value); assert(!PyErr_Occurred()); return 0; error: + Py_XDECREF(notes); Py_DECREF(value); return -1; } From bcce5e271815c0bdbe894964e853210d2c75949b Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 11 Sep 2023 11:20:24 -0700 Subject: [PATCH 157/357] gh-109039: Branch prediction for Tier 2 interpreter (#109038) This adds a 16-bit inline cache entry to the conditional branch instructions POP_JUMP_IF_{FALSE,TRUE,NONE,NOT_NONE} and their instrumented variants, which is used to keep track of the branch direction. Each time we encounter these instructions we shift the cache entry left by one and set the bottom bit to whether we jumped. Then when it's time to translate such a branch to Tier 2 uops, we use the bit count from the cache entry to decided whether to continue translating the "didn't jump" branch or the "jumped" branch. The counter is initialized to a pattern of alternating ones and zeros to avoid bias. The .pyc file magic number is updated. There's a new test, some fixes for existing tests, and a few miscellaneous cleanups. --- Include/internal/pycore_instruments.h | 1 - Include/internal/pycore_opcode_metadata.h | 22 ++- Lib/importlib/_bootstrap_external.py | 3 +- Lib/opcode.py | 12 ++ Lib/test/support/__init__.py | 17 ++ Lib/test/test_capi/test_misc.py | 45 +++-- Lib/test/test_dis.py | 222 +++++++++++----------- Lib/test/test_monitoring.py | 16 +- Lib/test/test_regrtest.py | 7 +- Python/bytecodes.c | 50 +++-- Python/generated_cases.c.h | 58 +++++- Python/instrumentation.c | 1 + Python/optimizer.c | 28 ++- Python/specialize.c | 20 +- Tools/cases_generator/generate_cases.py | 18 +- 15 files changed, 339 insertions(+), 181 deletions(-) diff --git a/Include/internal/pycore_instruments.h b/Include/internal/pycore_instruments.h index fad475c3dafb99..97dcfb9f8672f7 100644 --- a/Include/internal/pycore_instruments.h +++ b/Include/internal/pycore_instruments.h @@ -5,7 +5,6 @@ # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_bitutils.h" // _Py_popcount32 #include "pycore_frame.h" // _PyInterpreterFrame #ifdef __cplusplus diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index f70b75a56c150c..e1de21255f64fd 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1361,11 +1361,11 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[OPCODE_METADATA_SIZE] = { [JUMP] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_JUMP_FLAG }, [JUMP_NO_INTERRUPT] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_JUMP_FLAG }, [ENTER_EXECUTOR] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG }, - [POP_JUMP_IF_FALSE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_JUMP_FLAG }, - [POP_JUMP_IF_TRUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_JUMP_FLAG }, + [POP_JUMP_IF_FALSE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG }, + [POP_JUMP_IF_TRUE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG }, [IS_NONE] = { true, INSTR_FMT_IX, 0 }, - [POP_JUMP_IF_NONE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_JUMP_FLAG }, - [POP_JUMP_IF_NOT_NONE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_JUMP_FLAG }, + [POP_JUMP_IF_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG }, + [POP_JUMP_IF_NOT_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG }, [JUMP_BACKWARD_NO_INTERRUPT] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_JUMP_FLAG }, [GET_LEN] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG }, [MATCH_CLASS] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG }, @@ -1449,10 +1449,10 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[OPCODE_METADATA_SIZE] = { [INSTRUMENTED_INSTRUCTION] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG }, [INSTRUMENTED_JUMP_FORWARD] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, [INSTRUMENTED_JUMP_BACKWARD] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG }, - [INSTRUMENTED_POP_JUMP_IF_TRUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, - [INSTRUMENTED_POP_JUMP_IF_FALSE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, - [INSTRUMENTED_POP_JUMP_IF_NONE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, - [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, + [INSTRUMENTED_POP_JUMP_IF_TRUE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG }, + [INSTRUMENTED_POP_JUMP_IF_FALSE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG }, + [INSTRUMENTED_POP_JUMP_IF_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG }, + [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG }, [EXTENDED_ARG] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, [CACHE] = { true, INSTR_FMT_IX, 0 }, [RESERVED] = { true, INSTR_FMT_IX, 0 }, @@ -1885,7 +1885,6 @@ extern const uint8_t _PyOpcode_Caches[256]; #ifdef NEED_OPCODE_METADATA const uint8_t _PyOpcode_Caches[256] = { [TO_BOOL] = 3, - [BINARY_OP] = 1, [BINARY_SUBSCR] = 1, [STORE_SUBSCR] = 1, [SEND] = 1, @@ -1895,8 +1894,13 @@ const uint8_t _PyOpcode_Caches[256] = { [LOAD_SUPER_ATTR] = 1, [LOAD_ATTR] = 9, [COMPARE_OP] = 1, + [POP_JUMP_IF_FALSE] = 1, + [POP_JUMP_IF_TRUE] = 1, [FOR_ITER] = 1, [CALL] = 3, + [BINARY_OP] = 1, + [POP_JUMP_IF_NONE] = 1, + [POP_JUMP_IF_NOT_NONE] = 1, [JUMP_BACKWARD] = 1, }; #endif // NEED_OPCODE_METADATA diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 7a83a58d0874df..843af300500169 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -456,6 +456,7 @@ def _write_atomic(path, data, mode=0o666): # Python 3.13a1 3558 (Reorder the stack items for CALL) # Python 3.13a1 3559 (Generate opcode IDs from bytecodes.c) # Python 3.13a1 3560 (Add RESUME_CHECK instruction) +# Python 3.13a1 3561 (Add cache entry to branch instructions) # Python 3.14 will start with 3600 @@ -472,7 +473,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3560).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3561).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c diff --git a/Lib/opcode.py b/Lib/opcode.py index 386a2fba396a6a..88f4df7c0e8c38 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -93,6 +93,18 @@ "counter": 1, "version": 2, }, + "POP_JUMP_IF_TRUE": { + "counter": 1, + }, + "POP_JUMP_IF_FALSE": { + "counter": 1, + }, + "POP_JUMP_IF_NONE": { + "counter": 1, + }, + "POP_JUMP_IF_NOT_NONE": { + "counter": 1, + }, } _inline_cache_entries = { diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 6fc85ff5d704e1..0d9efe10c6504c 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -62,6 +62,7 @@ "LOOPBACK_TIMEOUT", "INTERNET_TIMEOUT", "SHORT_TIMEOUT", "LONG_TIMEOUT", "Py_DEBUG", "EXCEEDS_RECURSION_LIMIT", "Py_C_RECURSION_LIMIT", "skip_on_s390x", + "without_optimizer", ] @@ -2533,3 +2534,19 @@ def adjust_int_max_str_digits(max_digits): 'skipped on s390x') Py_TRACE_REFS = hasattr(sys, 'getobjects') + +# Decorator to disable optimizer while a function run +def without_optimizer(func): + try: + import _testinternalcapi + except ImportError: + return func + @functools.wraps(func) + def wrapper(*args, **kwargs): + save_opt = _testinternalcapi.get_optimizer() + try: + _testinternalcapi.set_optimizer(None) + return func(*args, **kwargs) + finally: + _testinternalcapi.set_optimizer(save_opt) + return wrapper diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py index 004ce397696556..964886ad1ca0d8 100644 --- a/Lib/test/test_capi/test_misc.py +++ b/Lib/test/test_capi/test_misc.py @@ -2455,7 +2455,7 @@ def testfunc(x): opt = _testinternalcapi.get_uop_optimizer() with temporary_optimizer(opt): - testfunc(10) + testfunc(20) ex = get_first_executor(testfunc) self.assertIsNotNone(ex) @@ -2470,7 +2470,7 @@ def testfunc(n): opt = _testinternalcapi.get_uop_optimizer() with temporary_optimizer(opt): - testfunc(10) + testfunc(20) ex = get_first_executor(testfunc) self.assertIsNotNone(ex) @@ -2485,7 +2485,7 @@ def testfunc(a): opt = _testinternalcapi.get_uop_optimizer() with temporary_optimizer(opt): - testfunc(range(10)) + testfunc(range(20)) ex = get_first_executor(testfunc) self.assertIsNotNone(ex) @@ -2495,12 +2495,13 @@ def testfunc(a): def test_pop_jump_if_not_none(self): def testfunc(a): for x in a: + x = None if x is not None: x = 0 opt = _testinternalcapi.get_uop_optimizer() with temporary_optimizer(opt): - testfunc(range(10)) + testfunc(range(20)) ex = get_first_executor(testfunc) self.assertIsNotNone(ex) @@ -2515,7 +2516,7 @@ def testfunc(n): opt = _testinternalcapi.get_uop_optimizer() with temporary_optimizer(opt): - testfunc(10) + testfunc(20) ex = get_first_executor(testfunc) self.assertIsNotNone(ex) @@ -2530,7 +2531,7 @@ def testfunc(n): opt = _testinternalcapi.get_uop_optimizer() with temporary_optimizer(opt): - testfunc(10) + testfunc(20) ex = get_first_executor(testfunc) self.assertIsNotNone(ex) @@ -2550,7 +2551,7 @@ def testfunc(n): opt = _testinternalcapi.get_uop_optimizer() with temporary_optimizer(opt): - testfunc(10) + testfunc(20) ex = get_first_executor(testfunc) self.assertIsNotNone(ex) @@ -2568,8 +2569,8 @@ def testfunc(n): opt = _testinternalcapi.get_uop_optimizer() with temporary_optimizer(opt): - total = testfunc(10) - self.assertEqual(total, 45) + total = testfunc(20) + self.assertEqual(total, 190) ex = get_first_executor(testfunc) self.assertIsNotNone(ex) @@ -2589,9 +2590,9 @@ def testfunc(a): opt = _testinternalcapi.get_uop_optimizer() with temporary_optimizer(opt): - a = list(range(10)) + a = list(range(20)) total = testfunc(a) - self.assertEqual(total, 45) + self.assertEqual(total, 190) ex = get_first_executor(testfunc) self.assertIsNotNone(ex) @@ -2611,9 +2612,9 @@ def testfunc(a): opt = _testinternalcapi.get_uop_optimizer() with temporary_optimizer(opt): - a = tuple(range(10)) + a = tuple(range(20)) total = testfunc(a) - self.assertEqual(total, 45) + self.assertEqual(total, 190) ex = get_first_executor(testfunc) self.assertIsNotNone(ex) @@ -2647,7 +2648,7 @@ def dummy(x): opt = _testinternalcapi.get_uop_optimizer() with temporary_optimizer(opt): - testfunc(10) + testfunc(20) ex = get_first_executor(testfunc) self.assertIsNotNone(ex) @@ -2655,6 +2656,22 @@ def dummy(x): self.assertIn("_PUSH_FRAME", uops) self.assertIn("_BINARY_OP_ADD_INT", uops) + def test_branch_taken(self): + def testfunc(n): + for i in range(n): + if i < 0: + i = 0 + else: + i = 1 + + opt = _testinternalcapi.get_uop_optimizer() + with temporary_optimizer(opt): + testfunc(20) + + ex = get_first_executor(testfunc) + self.assertIsNotNone(ex) + uops = {opname for opname, _, _ in ex} + self.assertIn("_POP_JUMP_IF_TRUE", uops) if __name__ == "__main__": diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index eae1918efc3506..c3ad105fb2a3b5 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -404,7 +404,7 @@ def wrap_func_w_kwargs(): %4d LOAD_GLOBAL 0 (Exception) CHECK_EXC_MATCH - POP_JUMP_IF_FALSE 23 (to 80) + POP_JUMP_IF_FALSE 23 (to 82) STORE_FAST 0 (e) %4d LOAD_FAST 0 (e) @@ -492,7 +492,7 @@ def _with(c): %4d >> PUSH_EXC_INFO WITH_EXCEPT_START TO_BOOL - POP_JUMP_IF_TRUE 1 (to 50) + POP_JUMP_IF_TRUE 1 (to 52) RERAISE 2 >> POP_TOP POP_EXCEPT @@ -579,7 +579,7 @@ async def _asyncwith(c): >> CLEANUP_THROW >> END_SEND TO_BOOL - POP_JUMP_IF_TRUE 1 (to 116) + POP_JUMP_IF_TRUE 1 (to 118) RERAISE 2 >> POP_TOP POP_EXCEPT @@ -1273,7 +1273,8 @@ def test_loop_quicken(self): got = self.get_disassembly(loop_test, adaptive=True) expected = dis_loop_test_quickened_code if _testinternalcapi.get_optimizer(): - expected = expected.replace("JUMP_BACKWARD ", "ENTER_EXECUTOR") + # We *may* see ENTER_EXECUTOR in the disassembly + got = got.replace("ENTER_EXECUTOR", "JUMP_BACKWARD ") self.do_disassembly_compare(got, expected) @cpython_only @@ -1713,7 +1714,7 @@ def _prepare_test_cases(): Instruction(opname='LOAD_CONST', opcode=143, arg=1, argval=10, argrepr='10', offset=12, start_offset=12, starts_line=False, line_number=3, is_jump_target=False, positions=None), Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=3, is_jump_target=False, positions=None), Instruction(opname='GET_ITER', opcode=31, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='FOR_ITER', opcode=115, arg=28, argval=84, argrepr='to 84', offset=24, start_offset=24, starts_line=False, line_number=3, is_jump_target=True, positions=None), + Instruction(opname='FOR_ITER', opcode=115, arg=30, argval=88, argrepr='to 88', offset=24, start_offset=24, starts_line=False, line_number=3, is_jump_target=True, positions=None), Instruction(opname='STORE_FAST', opcode=177, arg=0, argval='i', argrepr='i', offset=28, start_offset=28, starts_line=False, line_number=3, is_jump_target=False, positions=None), Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=4, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=40, start_offset=40, starts_line=False, line_number=4, is_jump_target=False, positions=None), @@ -1722,108 +1723,108 @@ def _prepare_test_cases(): Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=52, start_offset=52, starts_line=True, line_number=5, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=143, arg=2, argval=4, argrepr='4', offset=54, start_offset=54, starts_line=False, line_number=5, is_jump_target=False, positions=None), Instruction(opname='COMPARE_OP', opcode=98, arg=18, argval='<', argrepr='bool(<)', offset=56, start_offset=56, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=2, argval=66, argrepr='to 66', offset=60, start_offset=60, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=124, arg=21, argval=24, argrepr='to 24', offset=62, start_offset=62, starts_line=True, line_number=6, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=66, start_offset=66, starts_line=True, line_number=7, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=3, argval=6, argrepr='6', offset=68, start_offset=68, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=98, arg=148, argval='>', argrepr='bool(>)', offset=70, start_offset=70, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_TRUE', opcode=164, arg=2, argval=80, argrepr='to 80', offset=74, start_offset=74, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=124, arg=28, argval=24, argrepr='to 24', offset=76, start_offset=76, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=80, start_offset=80, starts_line=True, line_number=8, is_jump_target=True, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=126, arg=12, argval=108, argrepr='to 108', offset=82, start_offset=82, starts_line=False, line_number=8, is_jump_target=False, positions=None), - Instruction(opname='END_FOR', opcode=24, arg=None, argval=None, argrepr='', offset=84, start_offset=84, starts_line=True, line_number=3, is_jump_target=True, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=86, start_offset=86, starts_line=True, line_number=10, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=96, start_offset=96, starts_line=False, line_number=10, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=98, start_offset=98, starts_line=False, line_number=10, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=106, start_offset=106, starts_line=False, line_number=10, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST_CHECK', opcode=147, arg=0, argval='i', argrepr='i', offset=108, start_offset=108, starts_line=True, line_number=11, is_jump_target=True, positions=None), - Instruction(opname='TO_BOOL', opcode=57, arg=None, argval=None, argrepr='', offset=110, start_offset=110, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=37, argval=194, argrepr='to 194', offset=118, start_offset=118, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=120, start_offset=120, starts_line=True, line_number=12, is_jump_target=True, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=130, start_offset=130, starts_line=False, line_number=12, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=132, start_offset=132, starts_line=False, line_number=12, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=140, start_offset=140, starts_line=False, line_number=12, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=142, start_offset=142, starts_line=True, line_number=13, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=5, argval=1, argrepr='1', offset=144, start_offset=144, starts_line=False, line_number=13, is_jump_target=False, positions=None), - Instruction(opname='BINARY_OP', opcode=68, arg=23, argval=23, argrepr='-=', offset=146, start_offset=146, starts_line=False, line_number=13, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=177, arg=0, argval='i', argrepr='i', offset=150, start_offset=150, starts_line=False, line_number=13, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=152, start_offset=152, starts_line=True, line_number=14, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=3, argval=6, argrepr='6', offset=154, start_offset=154, starts_line=False, line_number=14, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=98, arg=148, argval='>', argrepr='bool(>)', offset=156, start_offset=156, starts_line=False, line_number=14, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=2, argval=166, argrepr='to 166', offset=160, start_offset=160, starts_line=False, line_number=14, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=124, arg=29, argval=108, argrepr='to 108', offset=162, start_offset=162, starts_line=True, line_number=15, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=166, start_offset=166, starts_line=True, line_number=16, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=2, argval=4, argrepr='4', offset=168, start_offset=168, starts_line=False, line_number=16, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=98, arg=18, argval='<', argrepr='bool(<)', offset=170, start_offset=170, starts_line=False, line_number=16, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=1, argval=178, argrepr='to 178', offset=174, start_offset=174, starts_line=False, line_number=16, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=126, arg=19, argval=216, argrepr='to 216', offset=176, start_offset=176, starts_line=True, line_number=17, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=178, start_offset=178, starts_line=True, line_number=11, is_jump_target=True, positions=None), - Instruction(opname='TO_BOOL', opcode=57, arg=None, argval=None, argrepr='', offset=180, start_offset=180, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=2, argval=194, argrepr='to 194', offset=188, start_offset=188, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=124, arg=37, argval=120, argrepr='to 120', offset=190, start_offset=190, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=194, start_offset=194, starts_line=True, line_number=19, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=204, start_offset=204, starts_line=False, line_number=19, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=206, start_offset=206, starts_line=False, line_number=19, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=214, start_offset=214, starts_line=False, line_number=19, is_jump_target=False, positions=None), - Instruction(opname='NOP', opcode=42, arg=None, argval=None, argrepr='', offset=216, start_offset=216, starts_line=True, line_number=20, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=5, argval=1, argrepr='1', offset=218, start_offset=218, starts_line=True, line_number=21, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=7, argval=0, argrepr='0', offset=220, start_offset=220, starts_line=False, line_number=21, is_jump_target=False, positions=None), - Instruction(opname='BINARY_OP', opcode=68, arg=11, argval=11, argrepr='/', offset=222, start_offset=222, starts_line=False, line_number=21, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=226, start_offset=226, starts_line=False, line_number=21, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=228, start_offset=228, starts_line=True, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='BEFORE_WITH', opcode=2, arg=None, argval=None, argrepr='', offset=230, start_offset=230, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=177, arg=1, argval='dodgy', argrepr='dodgy', offset=232, start_offset=232, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=234, start_offset=234, starts_line=True, line_number=26, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=8, argval='Never reach this', argrepr="'Never reach this'", offset=244, start_offset=244, starts_line=False, line_number=26, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=246, start_offset=246, starts_line=False, line_number=26, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=254, start_offset=254, starts_line=False, line_number=26, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=0, argval=None, argrepr='None', offset=256, start_offset=256, starts_line=True, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=0, argval=None, argrepr='None', offset=258, start_offset=258, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=0, argval=None, argrepr='None', offset=260, start_offset=260, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=2, argval=2, argrepr='', offset=262, start_offset=262, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=270, start_offset=270, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=272, start_offset=272, starts_line=True, line_number=28, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=282, start_offset=282, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=284, start_offset=284, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=292, start_offset=292, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='RETURN_CONST', opcode=168, arg=0, argval=None, argrepr='None', offset=294, start_offset=294, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=45, arg=None, argval=None, argrepr='', offset=296, start_offset=296, starts_line=True, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='WITH_EXCEPT_START', opcode=67, arg=None, argval=None, argrepr='', offset=298, start_offset=298, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='TO_BOOL', opcode=57, arg=None, argval=None, argrepr='', offset=300, start_offset=300, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_TRUE', opcode=164, arg=1, argval=312, argrepr='to 312', offset=308, start_offset=308, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=167, arg=2, argval=2, argrepr='', offset=310, start_offset=310, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=312, start_offset=312, starts_line=False, line_number=25, is_jump_target=True, positions=None), - Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=314, start_offset=314, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=316, start_offset=316, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=318, start_offset=318, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=124, arg=26, argval=272, argrepr='to 272', offset=320, start_offset=320, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=104, arg=3, argval=3, argrepr='', offset=324, start_offset=324, starts_line=True, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=326, start_offset=326, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=167, arg=1, argval=1, argrepr='', offset=328, start_offset=328, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=45, arg=None, argval=None, argrepr='', offset=330, start_offset=330, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=332, start_offset=332, starts_line=True, line_number=22, is_jump_target=False, positions=None), - Instruction(opname='CHECK_EXC_MATCH', opcode=20, arg=None, argval=None, argrepr='', offset=342, start_offset=342, starts_line=False, line_number=22, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=15, argval=376, argrepr='to 376', offset=344, start_offset=344, starts_line=False, line_number=22, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=346, start_offset=346, starts_line=False, line_number=22, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=348, start_offset=348, starts_line=True, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=358, start_offset=358, starts_line=False, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=360, start_offset=360, starts_line=False, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=368, start_offset=368, starts_line=False, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=370, start_offset=370, starts_line=False, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=124, arg=52, argval=272, argrepr='to 272', offset=372, start_offset=372, starts_line=False, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=167, arg=0, argval=0, argrepr='', offset=376, start_offset=376, starts_line=True, line_number=22, is_jump_target=True, positions=None), - Instruction(opname='COPY', opcode=104, arg=3, argval=3, argrepr='', offset=378, start_offset=378, starts_line=True, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=380, start_offset=380, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=167, arg=1, argval=1, argrepr='', offset=382, start_offset=382, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=45, arg=None, argval=None, argrepr='', offset=384, start_offset=384, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=386, start_offset=386, starts_line=True, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=396, start_offset=396, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=398, start_offset=398, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=406, start_offset=406, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=167, arg=0, argval=0, argrepr='', offset=408, start_offset=408, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=104, arg=3, argval=3, argrepr='', offset=410, start_offset=410, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=412, start_offset=412, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=167, arg=1, argval=1, argrepr='', offset=414, start_offset=414, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=2, argval=68, argrepr='to 68', offset=60, start_offset=60, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=124, arg=22, argval=24, argrepr='to 24', offset=64, start_offset=64, starts_line=True, line_number=6, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=68, start_offset=68, starts_line=True, line_number=7, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=3, argval=6, argrepr='6', offset=70, start_offset=70, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=98, arg=148, argval='>', argrepr='bool(>)', offset=72, start_offset=72, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=164, arg=2, argval=84, argrepr='to 84', offset=76, start_offset=76, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=124, arg=30, argval=24, argrepr='to 24', offset=80, start_offset=80, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=84, start_offset=84, starts_line=True, line_number=8, is_jump_target=True, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=126, arg=12, argval=112, argrepr='to 112', offset=86, start_offset=86, starts_line=False, line_number=8, is_jump_target=False, positions=None), + Instruction(opname='END_FOR', opcode=24, arg=None, argval=None, argrepr='', offset=88, start_offset=88, starts_line=True, line_number=3, is_jump_target=True, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=90, start_offset=90, starts_line=True, line_number=10, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=100, start_offset=100, starts_line=False, line_number=10, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=102, start_offset=102, starts_line=False, line_number=10, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=110, start_offset=110, starts_line=False, line_number=10, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST_CHECK', opcode=147, arg=0, argval='i', argrepr='i', offset=112, start_offset=112, starts_line=True, line_number=11, is_jump_target=True, positions=None), + Instruction(opname='TO_BOOL', opcode=57, arg=None, argval=None, argrepr='', offset=114, start_offset=114, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=40, argval=206, argrepr='to 206', offset=122, start_offset=122, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=126, start_offset=126, starts_line=True, line_number=12, is_jump_target=True, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=136, start_offset=136, starts_line=False, line_number=12, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=138, start_offset=138, starts_line=False, line_number=12, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=146, start_offset=146, starts_line=False, line_number=12, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=148, start_offset=148, starts_line=True, line_number=13, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=5, argval=1, argrepr='1', offset=150, start_offset=150, starts_line=False, line_number=13, is_jump_target=False, positions=None), + Instruction(opname='BINARY_OP', opcode=68, arg=23, argval=23, argrepr='-=', offset=152, start_offset=152, starts_line=False, line_number=13, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=177, arg=0, argval='i', argrepr='i', offset=156, start_offset=156, starts_line=False, line_number=13, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=158, start_offset=158, starts_line=True, line_number=14, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=3, argval=6, argrepr='6', offset=160, start_offset=160, starts_line=False, line_number=14, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=98, arg=148, argval='>', argrepr='bool(>)', offset=162, start_offset=162, starts_line=False, line_number=14, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=2, argval=174, argrepr='to 174', offset=166, start_offset=166, starts_line=False, line_number=14, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=124, arg=31, argval=112, argrepr='to 112', offset=170, start_offset=170, starts_line=True, line_number=15, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=174, start_offset=174, starts_line=True, line_number=16, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=2, argval=4, argrepr='4', offset=176, start_offset=176, starts_line=False, line_number=16, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=98, arg=18, argval='<', argrepr='bool(<)', offset=178, start_offset=178, starts_line=False, line_number=16, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=1, argval=188, argrepr='to 188', offset=182, start_offset=182, starts_line=False, line_number=16, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=126, arg=20, argval=228, argrepr='to 228', offset=186, start_offset=186, starts_line=True, line_number=17, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=188, start_offset=188, starts_line=True, line_number=11, is_jump_target=True, positions=None), + Instruction(opname='TO_BOOL', opcode=57, arg=None, argval=None, argrepr='', offset=190, start_offset=190, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=2, argval=206, argrepr='to 206', offset=198, start_offset=198, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=124, arg=40, argval=126, argrepr='to 126', offset=202, start_offset=202, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=206, start_offset=206, starts_line=True, line_number=19, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=216, start_offset=216, starts_line=False, line_number=19, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=218, start_offset=218, starts_line=False, line_number=19, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=226, start_offset=226, starts_line=False, line_number=19, is_jump_target=False, positions=None), + Instruction(opname='NOP', opcode=42, arg=None, argval=None, argrepr='', offset=228, start_offset=228, starts_line=True, line_number=20, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=5, argval=1, argrepr='1', offset=230, start_offset=230, starts_line=True, line_number=21, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=7, argval=0, argrepr='0', offset=232, start_offset=232, starts_line=False, line_number=21, is_jump_target=False, positions=None), + Instruction(opname='BINARY_OP', opcode=68, arg=11, argval=11, argrepr='/', offset=234, start_offset=234, starts_line=False, line_number=21, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=238, start_offset=238, starts_line=False, line_number=21, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=240, start_offset=240, starts_line=True, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='BEFORE_WITH', opcode=2, arg=None, argval=None, argrepr='', offset=242, start_offset=242, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=177, arg=1, argval='dodgy', argrepr='dodgy', offset=244, start_offset=244, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=246, start_offset=246, starts_line=True, line_number=26, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=8, argval='Never reach this', argrepr="'Never reach this'", offset=256, start_offset=256, starts_line=False, line_number=26, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=258, start_offset=258, starts_line=False, line_number=26, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=266, start_offset=266, starts_line=False, line_number=26, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=0, argval=None, argrepr='None', offset=268, start_offset=268, starts_line=True, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=0, argval=None, argrepr='None', offset=270, start_offset=270, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=0, argval=None, argrepr='None', offset=272, start_offset=272, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=2, argval=2, argrepr='', offset=274, start_offset=274, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=282, start_offset=282, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=284, start_offset=284, starts_line=True, line_number=28, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=294, start_offset=294, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=296, start_offset=296, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=304, start_offset=304, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='RETURN_CONST', opcode=168, arg=0, argval=None, argrepr='None', offset=306, start_offset=306, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=45, arg=None, argval=None, argrepr='', offset=308, start_offset=308, starts_line=True, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='WITH_EXCEPT_START', opcode=67, arg=None, argval=None, argrepr='', offset=310, start_offset=310, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='TO_BOOL', opcode=57, arg=None, argval=None, argrepr='', offset=312, start_offset=312, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=164, arg=1, argval=326, argrepr='to 326', offset=320, start_offset=320, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=167, arg=2, argval=2, argrepr='', offset=324, start_offset=324, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=326, start_offset=326, starts_line=False, line_number=25, is_jump_target=True, positions=None), + Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=328, start_offset=328, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=330, start_offset=330, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=332, start_offset=332, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=124, arg=27, argval=284, argrepr='to 284', offset=334, start_offset=334, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=104, arg=3, argval=3, argrepr='', offset=338, start_offset=338, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=340, start_offset=340, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=167, arg=1, argval=1, argrepr='', offset=342, start_offset=342, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=45, arg=None, argval=None, argrepr='', offset=344, start_offset=344, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=346, start_offset=346, starts_line=True, line_number=22, is_jump_target=False, positions=None), + Instruction(opname='CHECK_EXC_MATCH', opcode=20, arg=None, argval=None, argrepr='', offset=356, start_offset=356, starts_line=False, line_number=22, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=15, argval=392, argrepr='to 392', offset=358, start_offset=358, starts_line=False, line_number=22, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=362, start_offset=362, starts_line=False, line_number=22, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=364, start_offset=364, starts_line=True, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=374, start_offset=374, starts_line=False, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=376, start_offset=376, starts_line=False, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=384, start_offset=384, starts_line=False, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=386, start_offset=386, starts_line=False, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=124, arg=54, argval=284, argrepr='to 284', offset=388, start_offset=388, starts_line=False, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=167, arg=0, argval=0, argrepr='', offset=392, start_offset=392, starts_line=True, line_number=22, is_jump_target=True, positions=None), + Instruction(opname='COPY', opcode=104, arg=3, argval=3, argrepr='', offset=394, start_offset=394, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=396, start_offset=396, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=167, arg=1, argval=1, argrepr='', offset=398, start_offset=398, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=45, arg=None, argval=None, argrepr='', offset=400, start_offset=400, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=402, start_offset=402, starts_line=True, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=143, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=412, start_offset=412, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=414, start_offset=414, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=422, start_offset=422, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=167, arg=0, argval=0, argrepr='', offset=424, start_offset=424, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=104, arg=3, argval=3, argrepr='', offset=426, start_offset=426, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=428, start_offset=428, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=167, arg=1, argval=1, argrepr='', offset=430, start_offset=430, starts_line=False, line_number=28, is_jump_target=False, positions=None), ] # One last piece of inspect fodder to check the default line number handling @@ -2026,6 +2027,7 @@ def test_start_offset(self): opcode.opmap["EXTENDED_ARG"], 0x01, opcode.opmap["EXTENDED_ARG"], 0x01, opcode.opmap["POP_JUMP_IF_TRUE"], 0xFF, + opcode.opmap["CACHE"], 0x00, ]) jump = list(dis._get_instructions_bytes(code))[-1] self.assertEqual(8, jump.offset) @@ -2035,18 +2037,20 @@ def test_start_offset(self): opcode.opmap["LOAD_FAST"], 0x00, opcode.opmap["EXTENDED_ARG"], 0x01, opcode.opmap["POP_JUMP_IF_TRUE"], 0xFF, + opcode.opmap["CACHE"], 0x00, opcode.opmap["EXTENDED_ARG"], 0x01, opcode.opmap["EXTENDED_ARG"], 0x01, opcode.opmap["EXTENDED_ARG"], 0x01, opcode.opmap["POP_JUMP_IF_TRUE"], 0xFF, + opcode.opmap["CACHE"], 0x00, ]) instructions = list(dis._get_instructions_bytes(code)) # 1st jump self.assertEqual(4, instructions[2].offset) self.assertEqual(2, instructions[2].start_offset) # 2nd jump - self.assertEqual(12, instructions[6].offset) - self.assertEqual(6, instructions[6].start_offset) + self.assertEqual(14, instructions[6].offset) + self.assertEqual(8, instructions[6].start_offset) def test_cache_offset_and_end_offset(self): code = bytes([ diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py index e575eca42fabf9..a4725be21706ff 100644 --- a/Lib/test/test_monitoring.py +++ b/Lib/test/test_monitoring.py @@ -1348,10 +1348,10 @@ def func(): self.check_events(func, recorders = JUMP_AND_BRANCH_RECORDERS, expected = [ ('branch', 'func', 2, 2), - ('branch', 'func', 3, 6), + ('branch', 'func', 3, 4), ('jump', 'func', 6, 2), ('branch', 'func', 2, 2), - ('branch', 'func', 3, 4), + ('branch', 'func', 3, 3), ('jump', 'func', 4, 2), ('branch', 'func', 2, 2)]) @@ -1361,13 +1361,13 @@ def func(): ('line', 'func', 2), ('branch', 'func', 2, 2), ('line', 'func', 3), - ('branch', 'func', 3, 6), + ('branch', 'func', 3, 4), ('line', 'func', 6), ('jump', 'func', 6, 2), ('line', 'func', 2), ('branch', 'func', 2, 2), ('line', 'func', 3), - ('branch', 'func', 3, 4), + ('branch', 'func', 3, 3), ('line', 'func', 4), ('jump', 'func', 4, 2), ('line', 'func', 2), @@ -1400,8 +1400,8 @@ def func(): ('line', 'func', 5), ('line', 'meth', 1), ('jump', 'func', 5, 5), - ('jump', 'func', 5, '[offset=112]'), - ('branch', 'func', '[offset=118]', '[offset=120]'), + ('jump', 'func', 5, '[offset=114]'), + ('branch', 'func', '[offset=120]', '[offset=122]'), ('line', 'get_events', 11)]) self.check_events(func, recorders = FLOW_AND_LINE_RECORDERS, expected = [ @@ -1416,8 +1416,8 @@ def func(): ('line', 'meth', 1), ('return', None), ('jump', 'func', 5, 5), - ('jump', 'func', 5, '[offset=112]'), - ('branch', 'func', '[offset=118]', '[offset=120]'), + ('jump', 'func', 5, '[offset=114]'), + ('branch', 'func', '[offset=120]', '[offset=122]'), ('return', None), ('line', 'get_events', 11)]) diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index f587a8f919dcde..466b6f66797b7a 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -19,7 +19,7 @@ import textwrap import unittest from test import support -from test.support import os_helper, TestStats +from test.support import os_helper, TestStats, without_optimizer from test.libregrtest import cmdline from test.libregrtest import utils from test.libregrtest import setup @@ -1018,12 +1018,13 @@ def test_run(self): stats=TestStats(4, 1), forever=True) + @without_optimizer def check_leak(self, code, what, *, multiprocessing=False): test = self.create_test('huntrleaks', code=code) filename = 'reflog.txt' self.addCleanup(os_helper.unlink, filename) - cmd = ['--huntrleaks', '6:3:'] + cmd = ['--huntrleaks', '3:3:'] if multiprocessing: cmd.append('-j1') cmd.append(test) @@ -1032,7 +1033,7 @@ def check_leak(self, code, what, *, multiprocessing=False): stderr=subprocess.STDOUT) self.check_executed_tests(output, [test], failed=test, stats=1) - line = 'beginning 9 repetitions\n123456789\n.........\n' + line = 'beginning 6 repetitions\n123456\n......\n' self.check_line(output, re.escape(line)) line2 = '%s leaked [1, 1, 1] %s, sum=3\n' % (test, what) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index ff95f37b900da6..c9dea5c4562f7c 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -2292,14 +2292,22 @@ dummy_func( goto resume_frame; } - inst(POP_JUMP_IF_FALSE, (cond -- )) { + inst(POP_JUMP_IF_FALSE, (unused/1, cond -- )) { assert(PyBool_Check(cond)); - JUMPBY(oparg * Py_IsFalse(cond)); + int flag = Py_IsFalse(cond); + #if ENABLE_SPECIALIZATION + next_instr->cache = (next_instr->cache << 1) | flag; + #endif + JUMPBY(oparg * flag); } - inst(POP_JUMP_IF_TRUE, (cond -- )) { + inst(POP_JUMP_IF_TRUE, (unused/1, cond -- )) { assert(PyBool_Check(cond)); - JUMPBY(oparg * Py_IsTrue(cond)); + int flag = Py_IsTrue(cond); + #if ENABLE_SPECIALIZATION + next_instr->cache = (next_instr->cache << 1) | flag; + #endif + JUMPBY(oparg * flag); } op(IS_NONE, (value -- b)) { @@ -3751,47 +3759,63 @@ dummy_func( INSTRUMENTED_JUMP(next_instr-1, next_instr+1-oparg, PY_MONITORING_EVENT_JUMP); } - inst(INSTRUMENTED_POP_JUMP_IF_TRUE, ( -- )) { + inst(INSTRUMENTED_POP_JUMP_IF_TRUE, (unused/1 -- )) { PyObject *cond = POP(); assert(PyBool_Check(cond)); _Py_CODEUNIT *here = next_instr - 1; - int offset = Py_IsTrue(cond) * oparg; + int flag = Py_IsTrue(cond); + int offset = flag * oparg; + #if ENABLE_SPECIALIZATION + next_instr->cache = (next_instr->cache << 1) | flag; + #endif INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); } - inst(INSTRUMENTED_POP_JUMP_IF_FALSE, ( -- )) { + inst(INSTRUMENTED_POP_JUMP_IF_FALSE, (unused/1 -- )) { PyObject *cond = POP(); assert(PyBool_Check(cond)); _Py_CODEUNIT *here = next_instr - 1; - int offset = Py_IsFalse(cond) * oparg; + int flag = Py_IsFalse(cond); + int offset = flag * oparg; + #if ENABLE_SPECIALIZATION + next_instr->cache = (next_instr->cache << 1) | flag; + #endif INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); } - inst(INSTRUMENTED_POP_JUMP_IF_NONE, ( -- )) { + inst(INSTRUMENTED_POP_JUMP_IF_NONE, (unused/1 -- )) { PyObject *value = POP(); - _Py_CODEUNIT *here = next_instr-1; + _Py_CODEUNIT *here = next_instr - 1; + int flag = Py_IsNone(value); int offset; - if (Py_IsNone(value)) { + if (flag) { offset = oparg; } else { Py_DECREF(value); offset = 0; } + #if ENABLE_SPECIALIZATION + next_instr->cache = (next_instr->cache << 1) | flag; + #endif INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); } - inst(INSTRUMENTED_POP_JUMP_IF_NOT_NONE, ( -- )) { + inst(INSTRUMENTED_POP_JUMP_IF_NOT_NONE, (unused/1 -- )) { PyObject *value = POP(); _Py_CODEUNIT *here = next_instr-1; int offset; - if (Py_IsNone(value)) { + int nflag = Py_IsNone(value); + if (nflag) { offset = 0; } else { Py_DECREF(value); offset = oparg; } + #if ENABLE_SPECIALIZATION + next_instr->cache = (next_instr->cache << 1) | !nflag; + #endif INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index e84599d87a6968..a4944c7fcdfbd3 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -2996,8 +2996,13 @@ PyObject *cond; cond = stack_pointer[-1]; assert(PyBool_Check(cond)); - JUMPBY(oparg * Py_IsFalse(cond)); + int flag = Py_IsFalse(cond); + #if ENABLE_SPECIALIZATION + next_instr->cache = (next_instr->cache << 1) | flag; + #endif + JUMPBY(oparg * flag); STACK_SHRINK(1); + next_instr += 1; DISPATCH(); } @@ -3005,8 +3010,13 @@ PyObject *cond; cond = stack_pointer[-1]; assert(PyBool_Check(cond)); - JUMPBY(oparg * Py_IsTrue(cond)); + int flag = Py_IsTrue(cond); + #if ENABLE_SPECIALIZATION + next_instr->cache = (next_instr->cache << 1) | flag; + #endif + JUMPBY(oparg * flag); STACK_SHRINK(1); + next_instr += 1; DISPATCH(); } @@ -3029,9 +3039,14 @@ cond = b; { assert(PyBool_Check(cond)); - JUMPBY(oparg * Py_IsTrue(cond)); + int flag = Py_IsTrue(cond); + #if ENABLE_SPECIALIZATION + next_instr->cache = (next_instr->cache << 1) | flag; + #endif + JUMPBY(oparg * flag); } STACK_SHRINK(1); + next_instr += 1; DISPATCH(); } @@ -3054,9 +3069,14 @@ cond = b; { assert(PyBool_Check(cond)); - JUMPBY(oparg * Py_IsFalse(cond)); + int flag = Py_IsFalse(cond); + #if ENABLE_SPECIALIZATION + next_instr->cache = (next_instr->cache << 1) | flag; + #endif + JUMPBY(oparg * flag); } STACK_SHRINK(1); + next_instr += 1; DISPATCH(); } @@ -4921,8 +4941,13 @@ PyObject *cond = POP(); assert(PyBool_Check(cond)); _Py_CODEUNIT *here = next_instr - 1; - int offset = Py_IsTrue(cond) * oparg; + int flag = Py_IsTrue(cond); + int offset = flag * oparg; + #if ENABLE_SPECIALIZATION + next_instr->cache = (next_instr->cache << 1) | flag; + #endif INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); + next_instr += 1; DISPATCH(); } @@ -4930,23 +4955,33 @@ PyObject *cond = POP(); assert(PyBool_Check(cond)); _Py_CODEUNIT *here = next_instr - 1; - int offset = Py_IsFalse(cond) * oparg; + int flag = Py_IsFalse(cond); + int offset = flag * oparg; + #if ENABLE_SPECIALIZATION + next_instr->cache = (next_instr->cache << 1) | flag; + #endif INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); + next_instr += 1; DISPATCH(); } TARGET(INSTRUMENTED_POP_JUMP_IF_NONE) { PyObject *value = POP(); - _Py_CODEUNIT *here = next_instr-1; + _Py_CODEUNIT *here = next_instr - 1; + int flag = Py_IsNone(value); int offset; - if (Py_IsNone(value)) { + if (flag) { offset = oparg; } else { Py_DECREF(value); offset = 0; } + #if ENABLE_SPECIALIZATION + next_instr->cache = (next_instr->cache << 1) | flag; + #endif INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); + next_instr += 1; DISPATCH(); } @@ -4954,14 +4989,19 @@ PyObject *value = POP(); _Py_CODEUNIT *here = next_instr-1; int offset; - if (Py_IsNone(value)) { + int nflag = Py_IsNone(value); + if (nflag) { offset = 0; } else { Py_DECREF(value); offset = oparg; } + #if ENABLE_SPECIALIZATION + next_instr->cache = (next_instr->cache << 1) | !nflag; + #endif INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); + next_instr += 1; DISPATCH(); } diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 5f714602eafbb8..fee6eae1734394 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -2,6 +2,7 @@ #include "opcode_ids.h" +#include "pycore_bitutils.h" // _Py_popcount32 #include "pycore_call.h" #include "pycore_code.h" // _PyCode_Clear_Executors() #include "pycore_frame.h" diff --git a/Python/optimizer.c b/Python/optimizer.c index c6d0f9e5bf22d7..8eca37a7e4a283 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -1,6 +1,7 @@ #include "Python.h" #include "opcode.h" #include "pycore_interp.h" +#include "pycore_bitutils.h" // _Py_popcount32() #include "pycore_opcode_metadata.h" // _PyOpcode_OpName() #include "pycore_opcode_utils.h" // MAX_REAL_OPCODE #include "pycore_optimizer.h" // _Py_uop_analyze_and_optimize() @@ -501,7 +502,7 @@ translate_bytecode_to_trace( code->co_firstlineno, 2 * INSTR_IP(initial_instr, code)); -top: // Jump here after _PUSH_FRAME +top: // Jump here after _PUSH_FRAME or likely branches for (;;) { RESERVE_RAW(2, "epilogue"); // Always need space for SAVE_IP and EXIT_TRACE ADD_TO_TRACE(SAVE_IP, INSTR_IP(instr, code), 0); @@ -547,16 +548,29 @@ translate_bytecode_to_trace( case POP_JUMP_IF_TRUE: { pop_jump_if_bool: - // Assume jump unlikely (TODO: handle jump likely case) RESERVE(1, 2); - _Py_CODEUNIT *target_instr = - instr + 1 + _PyOpcode_Caches[_PyOpcode_Deopt[opcode]] + oparg; max_length -= 2; // Really the start of the stubs - uint32_t uopcode = opcode == POP_JUMP_IF_TRUE ? + int counter = instr[1].cache; + int bitcount = _Py_popcount32(counter); + bool jump_likely = bitcount > 8; + bool jump_sense = opcode == POP_JUMP_IF_TRUE; + uint32_t uopcode = jump_sense ^ jump_likely ? _POP_JUMP_IF_TRUE : _POP_JUMP_IF_FALSE; + _Py_CODEUNIT *next_instr = instr + 1 + _PyOpcode_Caches[_PyOpcode_Deopt[opcode]]; + _Py_CODEUNIT *target_instr = next_instr + oparg; + _Py_CODEUNIT *stub_target = jump_likely ? next_instr : target_instr; + DPRINTF(4, "%s(%d): counter=%x, bitcount=%d, likely=%d, sense=%d, uopcode=%s\n", + uop_name(opcode), oparg, + counter, bitcount, jump_likely, jump_sense, uop_name(uopcode)); ADD_TO_TRACE(uopcode, max_length, 0); - ADD_TO_STUB(max_length, SAVE_IP, INSTR_IP(target_instr, code), 0); + ADD_TO_STUB(max_length, SAVE_IP, INSTR_IP(stub_target, code), 0); ADD_TO_STUB(max_length + 1, EXIT_TRACE, 0, 0); + if (jump_likely) { + DPRINTF(2, "Jump likely (%x = %d bits), continue at byte offset %d\n", + instr[1].cache, bitcount, 2 * INSTR_IP(target_instr, code)); + instr = target_instr; + goto top; + } break; } @@ -927,6 +941,6 @@ PyUnstable_Optimizer_NewUOpOptimizer(void) opt->resume_threshold = UINT16_MAX; // Need at least 3 iterations to settle specializations. // A few lower bits of the counter are reserved for other flags. - opt->backedge_threshold = 3 << OPTIMIZER_BITS_IN_COUNTER; + opt->backedge_threshold = 16 << OPTIMIZER_BITS_IN_COUNTER; return (PyObject *)opt; } diff --git a/Python/specialize.c b/Python/specialize.c index 8b4aac2f890930..91243419ec6fb0 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -338,9 +338,23 @@ _PyCode_Quicken(PyCodeObject *code) assert(opcode < MIN_INSTRUMENTED_OPCODE); int caches = _PyOpcode_Caches[opcode]; if (caches) { - // JUMP_BACKWARD counter counts up from 0 until it is > backedge_threshold - instructions[i + 1].cache = - opcode == JUMP_BACKWARD ? 0 : adaptive_counter_warmup(); + // The initial value depends on the opcode + int initial_value; + switch (opcode) { + case JUMP_BACKWARD: + initial_value = 0; + break; + case POP_JUMP_IF_FALSE: + case POP_JUMP_IF_TRUE: + case POP_JUMP_IF_NONE: + case POP_JUMP_IF_NOT_NONE: + initial_value = 0x5555; // Alternating 0, 1 bits + break; + default: + initial_value = adaptive_counter_warmup(); + break; + } + instructions[i + 1].cache = initial_value; i += caches; } } diff --git a/Tools/cases_generator/generate_cases.py b/Tools/cases_generator/generate_cases.py index 1335c0c29ebbf6..ad4a99931d9af6 100644 --- a/Tools/cases_generator/generate_cases.py +++ b/Tools/cases_generator/generate_cases.py @@ -549,10 +549,20 @@ def write_metadata(self, metadata_filename: str, pymetadata_filename: str) -> No "=", ";", ): - for name, _ in self.families.items(): - instr = self.instrs[name] - if instr.cache_offset > 0: - self.out.emit(f'[{name}] = {instr.cache_offset},') + family_member_names: set[str] = set() + for family in self.families.values(): + family_member_names.update(family.members) + for instr in self.instrs.values(): + if ( + instr.name not in family_member_names + and instr.cache_offset > 0 + and instr.kind == "inst" + and not instr.name.startswith("INSTRUMENTED_") + ): + self.out.emit(f"[{instr.name}] = {instr.cache_offset},") + for mac in self.macro_instrs.values(): + if mac.name not in family_member_names and mac.cache_offset > 0: + self.out.emit(f"[{mac.name}] = {mac.cache_offset},") # Irregular case: self.out.emit('[JUMP_BACKWARD] = 1,') From 1ee50e2a78f644d81d341a08562073ad169d8cc7 Mon Sep 17 00:00:00 2001 From: wim glenn Date: Mon, 11 Sep 2023 14:44:13 -0500 Subject: [PATCH 158/357] gh-107322: zipapp: Remove the suggestion to remove .dist-info directories (#107296) Removed zipapp suggestion to rm .dist-info subdirectories. This totally breaks importlib.metadata --- Doc/library/zipapp.rst | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Doc/library/zipapp.rst b/Doc/library/zipapp.rst index 8cee85b32d2a83..7c01fc102fca07 100644 --- a/Doc/library/zipapp.rst +++ b/Doc/library/zipapp.rst @@ -281,12 +281,7 @@ The steps to create a standalone archive are as follows: file - if not, you can just list the dependencies manually on the pip command line). -3. Optionally, delete the ``.dist-info`` directories created by pip in the - ``myapp`` directory. These hold metadata for pip to manage the packages, and - as you won't be making any further use of pip they aren't required - - although it won't do any harm if you leave them. - -4. Package the application using: +3. Package the application using: .. code-block:: shell-session From fbaf77eb9bd1e6812ebf984d32b29b025cc037d6 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 11 Sep 2023 15:39:19 -0700 Subject: [PATCH 159/357] gh-109214: Rename SAVE_IP to _SET_IP, and similar (#109285) * Rename SAVE_IP to _SET_IP * Rename EXIT_TRACE to _EXIT_TRACE * Rename SAVE_CURRENT_IP to _SAVE_CURRENT_IP * Rename INSERT to _INSERT (This is for Ken Jin's abstract interpreter) * Rename IS_NONE to _IS_NONE * Rename JUMP_TO_TOP to _JUMP_TO_TOP --- Include/internal/pycore_opcode_metadata.h | 70 +++++++++++------------ Lib/test/test_capi/test_misc.py | 4 +- Python/abstract_interp_cases.c.h | 12 ++-- Python/bytecodes.c | 34 +++++------ Python/executor_cases.c.h | 14 ++--- Python/generated_cases.c.h | 20 +++---- Python/optimizer.c | 60 +++++++++---------- Tools/cases_generator/analysis.py | 4 +- Tools/cases_generator/generate_cases.py | 10 ++-- Tools/cases_generator/instructions.py | 2 +- Tools/cases_generator/stacking.py | 4 +- 11 files changed, 117 insertions(+), 117 deletions(-) diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index e1de21255f64fd..05dee089b38160 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -25,8 +25,8 @@ ((OP) == POP_BLOCK) || \ 0) -#define EXIT_TRACE 300 -#define SAVE_IP 301 +#define _EXIT_TRACE 300 +#define _SET_IP 301 #define _GUARD_BOTH_INT 302 #define _BINARY_OP_MULTIPLY_INT 303 #define _BINARY_OP_ADD_INT 304 @@ -46,7 +46,7 @@ #define _GUARD_TYPE_VERSION 318 #define _CHECK_MANAGED_OBJECT_HAS_VALUES 319 #define _LOAD_ATTR_INSTANCE_VALUE 320 -#define IS_NONE 321 +#define _IS_NONE 321 #define _ITER_CHECK_LIST 322 #define _ITER_JUMP_LIST 323 #define _IS_ITER_EXHAUSTED_LIST 324 @@ -68,9 +68,9 @@ #define _PUSH_FRAME 340 #define _POP_JUMP_IF_FALSE 341 #define _POP_JUMP_IF_TRUE 342 -#define JUMP_TO_TOP 343 -#define SAVE_CURRENT_IP 344 -#define INSERT 345 +#define _JUMP_TO_TOP 343 +#define _SAVE_CURRENT_IP 344 +#define _INSERT 345 extern int _PyOpcode_num_popped(int opcode, int oparg, bool jump); #ifdef NEED_OPCODE_METADATA @@ -402,7 +402,7 @@ int _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 1; case POP_JUMP_IF_TRUE: return 1; - case IS_NONE: + case _IS_NONE: return 1; case POP_JUMP_IF_NONE: return 1; @@ -586,15 +586,15 @@ int _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 1; case _POP_JUMP_IF_TRUE: return 1; - case JUMP_TO_TOP: + case _JUMP_TO_TOP: return 0; - case SAVE_IP: + case _SET_IP: return 0; - case SAVE_CURRENT_IP: + case _SAVE_CURRENT_IP: return 0; - case EXIT_TRACE: + case _EXIT_TRACE: return 0; - case INSERT: + case _INSERT: return oparg + 1; default: return -1; @@ -932,7 +932,7 @@ int _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 0; case POP_JUMP_IF_TRUE: return 0; - case IS_NONE: + case _IS_NONE: return 1; case POP_JUMP_IF_NONE: return 0; @@ -1116,15 +1116,15 @@ int _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 0; case _POP_JUMP_IF_TRUE: return 0; - case JUMP_TO_TOP: + case _JUMP_TO_TOP: return 0; - case SAVE_IP: + case _SET_IP: return 0; - case SAVE_CURRENT_IP: + case _SAVE_CURRENT_IP: return 0; - case EXIT_TRACE: + case _EXIT_TRACE: return 0; - case INSERT: + case _INSERT: return oparg + 1; default: return -1; @@ -1186,7 +1186,7 @@ struct opcode_macro_expansion { #define OPARG_CACHE_4 4 #define OPARG_TOP 5 #define OPARG_BOTTOM 6 -#define OPARG_SAVE_IP 7 +#define OPARG_SET_IP 7 #define OPCODE_METADATA_FMT(OP) (_PyOpcode_opcode_metadata[(OP)].instr_format) #define SAME_OPCODE_METADATA(OP1, OP2) \ @@ -1363,7 +1363,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[OPCODE_METADATA_SIZE] = { [ENTER_EXECUTOR] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG }, [POP_JUMP_IF_FALSE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG }, [POP_JUMP_IF_TRUE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG }, - [IS_NONE] = { true, INSTR_FMT_IX, 0 }, + [_IS_NONE] = { true, INSTR_FMT_IX, 0 }, [POP_JUMP_IF_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG }, [POP_JUMP_IF_NOT_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG }, [JUMP_BACKWARD_NO_INTERRUPT] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_JUMP_FLAG }, @@ -1458,11 +1458,11 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[OPCODE_METADATA_SIZE] = { [RESERVED] = { true, INSTR_FMT_IX, 0 }, [_POP_JUMP_IF_FALSE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, [_POP_JUMP_IF_TRUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, - [JUMP_TO_TOP] = { true, INSTR_FMT_IX, HAS_EVAL_BREAK_FLAG }, - [SAVE_IP] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, - [SAVE_CURRENT_IP] = { true, INSTR_FMT_IX, 0 }, - [EXIT_TRACE] = { true, INSTR_FMT_IX, 0 }, - [INSERT] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, + [_JUMP_TO_TOP] = { true, INSTR_FMT_IX, HAS_EVAL_BREAK_FLAG }, + [_SET_IP] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, + [_SAVE_CURRENT_IP] = { true, INSTR_FMT_IX, 0 }, + [_EXIT_TRACE] = { true, INSTR_FMT_IX, 0 }, + [_INSERT] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, }; #endif // NEED_OPCODE_METADATA @@ -1515,8 +1515,8 @@ const struct opcode_macro_expansion _PyOpcode_macro_expansion[OPCODE_MACRO_EXPAN [DELETE_SUBSCR] = { .nuops = 1, .uops = { { DELETE_SUBSCR, 0, 0 } } }, [CALL_INTRINSIC_1] = { .nuops = 1, .uops = { { CALL_INTRINSIC_1, 0, 0 } } }, [CALL_INTRINSIC_2] = { .nuops = 1, .uops = { { CALL_INTRINSIC_2, 0, 0 } } }, - [RETURN_VALUE] = { .nuops = 3, .uops = { { SAVE_IP, 7, 0 }, { SAVE_CURRENT_IP, 0, 0 }, { _POP_FRAME, 0, 0 } } }, - [RETURN_CONST] = { .nuops = 4, .uops = { { LOAD_CONST, 0, 0 }, { SAVE_IP, 7, 0 }, { SAVE_CURRENT_IP, 0, 0 }, { _POP_FRAME, 0, 0 } } }, + [RETURN_VALUE] = { .nuops = 3, .uops = { { _SET_IP, 7, 0 }, { _SAVE_CURRENT_IP, 0, 0 }, { _POP_FRAME, 0, 0 } } }, + [RETURN_CONST] = { .nuops = 4, .uops = { { LOAD_CONST, 0, 0 }, { _SET_IP, 7, 0 }, { _SAVE_CURRENT_IP, 0, 0 }, { _POP_FRAME, 0, 0 } } }, [GET_AITER] = { .nuops = 1, .uops = { { GET_AITER, 0, 0 } } }, [GET_ANEXT] = { .nuops = 1, .uops = { { GET_ANEXT, 0, 0 } } }, [GET_AWAITABLE] = { .nuops = 1, .uops = { { GET_AWAITABLE, 0, 0 } } }, @@ -1579,8 +1579,8 @@ const struct opcode_macro_expansion _PyOpcode_macro_expansion[OPCODE_MACRO_EXPAN [GET_YIELD_FROM_ITER] = { .nuops = 1, .uops = { { GET_YIELD_FROM_ITER, 0, 0 } } }, [WITH_EXCEPT_START] = { .nuops = 1, .uops = { { WITH_EXCEPT_START, 0, 0 } } }, [PUSH_EXC_INFO] = { .nuops = 1, .uops = { { PUSH_EXC_INFO, 0, 0 } } }, - [CALL_BOUND_METHOD_EXACT_ARGS] = { .nuops = 9, .uops = { { _CHECK_PEP_523, 0, 0 }, { _CHECK_CALL_BOUND_METHOD_EXACT_ARGS, 0, 0 }, { _INIT_CALL_BOUND_METHOD_EXACT_ARGS, 0, 0 }, { _CHECK_FUNCTION_EXACT_ARGS, 2, 1 }, { _CHECK_STACK_SPACE, 0, 0 }, { _INIT_CALL_PY_EXACT_ARGS, 0, 0 }, { SAVE_IP, 7, 3 }, { SAVE_CURRENT_IP, 0, 0 }, { _PUSH_FRAME, 0, 0 } } }, - [CALL_PY_EXACT_ARGS] = { .nuops = 7, .uops = { { _CHECK_PEP_523, 0, 0 }, { _CHECK_FUNCTION_EXACT_ARGS, 2, 1 }, { _CHECK_STACK_SPACE, 0, 0 }, { _INIT_CALL_PY_EXACT_ARGS, 0, 0 }, { SAVE_IP, 7, 3 }, { SAVE_CURRENT_IP, 0, 0 }, { _PUSH_FRAME, 0, 0 } } }, + [CALL_BOUND_METHOD_EXACT_ARGS] = { .nuops = 9, .uops = { { _CHECK_PEP_523, 0, 0 }, { _CHECK_CALL_BOUND_METHOD_EXACT_ARGS, 0, 0 }, { _INIT_CALL_BOUND_METHOD_EXACT_ARGS, 0, 0 }, { _CHECK_FUNCTION_EXACT_ARGS, 2, 1 }, { _CHECK_STACK_SPACE, 0, 0 }, { _INIT_CALL_PY_EXACT_ARGS, 0, 0 }, { _SET_IP, 7, 3 }, { _SAVE_CURRENT_IP, 0, 0 }, { _PUSH_FRAME, 0, 0 } } }, + [CALL_PY_EXACT_ARGS] = { .nuops = 7, .uops = { { _CHECK_PEP_523, 0, 0 }, { _CHECK_FUNCTION_EXACT_ARGS, 2, 1 }, { _CHECK_STACK_SPACE, 0, 0 }, { _INIT_CALL_PY_EXACT_ARGS, 0, 0 }, { _SET_IP, 7, 3 }, { _SAVE_CURRENT_IP, 0, 0 }, { _PUSH_FRAME, 0, 0 } } }, [CALL_NO_KW_TYPE_1] = { .nuops = 1, .uops = { { CALL_NO_KW_TYPE_1, 0, 0 } } }, [CALL_NO_KW_STR_1] = { .nuops = 1, .uops = { { CALL_NO_KW_STR_1, 0, 0 } } }, [CALL_NO_KW_TUPLE_1] = { .nuops = 1, .uops = { { CALL_NO_KW_TUPLE_1, 0, 0 } } }, @@ -1607,8 +1607,8 @@ const struct opcode_macro_expansion _PyOpcode_macro_expansion[OPCODE_MACRO_EXPAN extern const char * const _PyOpcode_uop_name[OPCODE_UOP_NAME_SIZE]; #ifdef NEED_OPCODE_METADATA const char * const _PyOpcode_uop_name[OPCODE_UOP_NAME_SIZE] = { - [EXIT_TRACE] = "EXIT_TRACE", - [SAVE_IP] = "SAVE_IP", + [_EXIT_TRACE] = "_EXIT_TRACE", + [_SET_IP] = "_SET_IP", [_GUARD_BOTH_INT] = "_GUARD_BOTH_INT", [_BINARY_OP_MULTIPLY_INT] = "_BINARY_OP_MULTIPLY_INT", [_BINARY_OP_ADD_INT] = "_BINARY_OP_ADD_INT", @@ -1628,7 +1628,7 @@ const char * const _PyOpcode_uop_name[OPCODE_UOP_NAME_SIZE] = { [_GUARD_TYPE_VERSION] = "_GUARD_TYPE_VERSION", [_CHECK_MANAGED_OBJECT_HAS_VALUES] = "_CHECK_MANAGED_OBJECT_HAS_VALUES", [_LOAD_ATTR_INSTANCE_VALUE] = "_LOAD_ATTR_INSTANCE_VALUE", - [IS_NONE] = "IS_NONE", + [_IS_NONE] = "_IS_NONE", [_ITER_CHECK_LIST] = "_ITER_CHECK_LIST", [_ITER_JUMP_LIST] = "_ITER_JUMP_LIST", [_IS_ITER_EXHAUSTED_LIST] = "_IS_ITER_EXHAUSTED_LIST", @@ -1650,9 +1650,9 @@ const char * const _PyOpcode_uop_name[OPCODE_UOP_NAME_SIZE] = { [_PUSH_FRAME] = "_PUSH_FRAME", [_POP_JUMP_IF_FALSE] = "_POP_JUMP_IF_FALSE", [_POP_JUMP_IF_TRUE] = "_POP_JUMP_IF_TRUE", - [JUMP_TO_TOP] = "JUMP_TO_TOP", - [SAVE_CURRENT_IP] = "SAVE_CURRENT_IP", - [INSERT] = "INSERT", + [_JUMP_TO_TOP] = "_JUMP_TO_TOP", + [_SAVE_CURRENT_IP] = "_SAVE_CURRENT_IP", + [_INSERT] = "_INSERT", }; #endif // NEED_OPCODE_METADATA diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py index 964886ad1ca0d8..c9cc76a4c80ae8 100644 --- a/Lib/test/test_capi/test_misc.py +++ b/Lib/test/test_capi/test_misc.py @@ -2390,7 +2390,7 @@ def testfunc(x): ex = get_first_executor(testfunc) self.assertIsNotNone(ex) uops = {opname for opname, _, _ in ex} - self.assertIn("SAVE_IP", uops) + self.assertIn("_SET_IP", uops) self.assertIn("LOAD_FAST", uops) def test_extended_arg(self): @@ -2536,7 +2536,7 @@ def testfunc(n): ex = get_first_executor(testfunc) self.assertIsNotNone(ex) uops = {opname for opname, _, _ in ex} - self.assertIn("JUMP_TO_TOP", uops) + self.assertIn("_JUMP_TO_TOP", uops) def test_jump_forward(self): def testfunc(n): diff --git a/Python/abstract_interp_cases.c.h b/Python/abstract_interp_cases.c.h index 398c04616bc091..1b96ca130defcf 100644 --- a/Python/abstract_interp_cases.c.h +++ b/Python/abstract_interp_cases.c.h @@ -521,7 +521,7 @@ break; } - case IS_NONE: { + case _IS_NONE: { PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); break; } @@ -792,23 +792,23 @@ break; } - case JUMP_TO_TOP: { + case _JUMP_TO_TOP: { break; } - case SAVE_IP: { + case _SET_IP: { break; } - case SAVE_CURRENT_IP: { + case _SAVE_CURRENT_IP: { break; } - case EXIT_TRACE: { + case _EXIT_TRACE: { break; } - case INSERT: { + case _INSERT: { PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1 - oparg)), true); break; } diff --git a/Python/bytecodes.c b/Python/bytecodes.c index c9dea5c4562f7c..7c49f9a8cc74b1 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -803,8 +803,8 @@ dummy_func( } macro(RETURN_VALUE) = - SAVE_IP + // Tier 2 only; special-cased oparg - SAVE_CURRENT_IP + // Sets frame->prev_instr + _SET_IP + // Tier 2 only; special-cased oparg + _SAVE_CURRENT_IP + // Sets frame->prev_instr _POP_FRAME; inst(INSTRUMENTED_RETURN_VALUE, (retval --)) { @@ -828,8 +828,8 @@ dummy_func( macro(RETURN_CONST) = LOAD_CONST + - SAVE_IP + // Tier 2 only; special-cased oparg - SAVE_CURRENT_IP + // Sets frame->prev_instr + _SET_IP + // Tier 2 only; special-cased oparg + _SAVE_CURRENT_IP + // Sets frame->prev_instr _POP_FRAME; inst(INSTRUMENTED_RETURN_CONST, (--)) { @@ -2310,7 +2310,7 @@ dummy_func( JUMPBY(oparg * flag); } - op(IS_NONE, (value -- b)) { + op(_IS_NONE, (value -- b)) { if (Py_IsNone(value)) { b = Py_True; } @@ -2320,9 +2320,9 @@ dummy_func( } } - macro(POP_JUMP_IF_NONE) = IS_NONE + POP_JUMP_IF_TRUE; + macro(POP_JUMP_IF_NONE) = _IS_NONE + POP_JUMP_IF_TRUE; - macro(POP_JUMP_IF_NOT_NONE) = IS_NONE + POP_JUMP_IF_FALSE; + macro(POP_JUMP_IF_NOT_NONE) = _IS_NONE + POP_JUMP_IF_FALSE; inst(JUMP_BACKWARD_NO_INTERRUPT, (--)) { /* This bytecode is used in the `yield from` or `await` loop. @@ -3069,8 +3069,8 @@ dummy_func( _CHECK_FUNCTION_EXACT_ARGS + _CHECK_STACK_SPACE + _INIT_CALL_PY_EXACT_ARGS + - SAVE_IP + // Tier 2 only; special-cased oparg - SAVE_CURRENT_IP + // Sets frame->prev_instr + _SET_IP + // Tier 2 only; special-cased oparg + _SAVE_CURRENT_IP + // Sets frame->prev_instr _PUSH_FRAME; macro(CALL_PY_EXACT_ARGS) = @@ -3079,8 +3079,8 @@ dummy_func( _CHECK_FUNCTION_EXACT_ARGS + _CHECK_STACK_SPACE + _INIT_CALL_PY_EXACT_ARGS + - SAVE_IP + // Tier 2 only; special-cased oparg - SAVE_CURRENT_IP + // Sets frame->prev_instr + _SET_IP + // Tier 2 only; special-cased oparg + _SAVE_CURRENT_IP + // Sets frame->prev_instr _PUSH_FRAME; inst(CALL_PY_WITH_DEFAULTS, (unused/1, func_version/2, callable, self_or_null, args[oparg] -- unused)) { @@ -3851,33 +3851,33 @@ dummy_func( } } - op(JUMP_TO_TOP, (--)) { + op(_JUMP_TO_TOP, (--)) { pc = 0; CHECK_EVAL_BREAKER(); } - op(SAVE_IP, (--)) { + op(_SET_IP, (--)) { frame->prev_instr = ip_offset + oparg; } - op(SAVE_CURRENT_IP, (--)) { + op(_SAVE_CURRENT_IP, (--)) { #if TIER_ONE frame->prev_instr = next_instr - 1; #endif #if TIER_TWO - // Relies on a preceding SAVE_IP + // Relies on a preceding _SET_IP frame->prev_instr--; #endif } - op(EXIT_TRACE, (--)) { + op(_EXIT_TRACE, (--)) { frame->prev_instr--; // Back up to just before destination _PyFrame_SetStackPointer(frame, stack_pointer); Py_DECREF(self); return frame; } - op(INSERT, (unused[oparg], top -- top, unused[oparg])) { + op(_INSERT, (unused[oparg], top -- top, unused[oparg])) { // Inserts TOS at position specified by oparg; memmove(&stack_pointer[-1 - oparg], &stack_pointer[-oparg], oparg * sizeof(stack_pointer[0])); } diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 918991dca7dd25..a4d813056aa9f6 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -1902,7 +1902,7 @@ break; } - case IS_NONE: { + case _IS_NONE: { PyObject *value; PyObject *b; value = stack_pointer[-1]; @@ -2887,29 +2887,29 @@ break; } - case JUMP_TO_TOP: { + case _JUMP_TO_TOP: { pc = 0; CHECK_EVAL_BREAKER(); break; } - case SAVE_IP: { + case _SET_IP: { frame->prev_instr = ip_offset + oparg; break; } - case SAVE_CURRENT_IP: { + case _SAVE_CURRENT_IP: { #if TIER_ONE frame->prev_instr = next_instr - 1; #endif #if TIER_TWO - // Relies on a preceding SAVE_IP + // Relies on a preceding _SET_IP frame->prev_instr--; #endif break; } - case EXIT_TRACE: { + case _EXIT_TRACE: { frame->prev_instr--; // Back up to just before destination _PyFrame_SetStackPointer(frame, stack_pointer); Py_DECREF(self); @@ -2917,7 +2917,7 @@ break; } - case INSERT: { + case _INSERT: { PyObject *top; top = stack_pointer[-1]; // Inserts TOS at position specified by oparg; diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index a4944c7fcdfbd3..27cda1f03da68f 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -987,13 +987,13 @@ TARGET(RETURN_VALUE) { PyObject *retval; - // SAVE_CURRENT_IP + // _SAVE_CURRENT_IP { #if TIER_ONE frame->prev_instr = next_instr - 1; #endif #if TIER_TWO - // Relies on a preceding SAVE_IP + // Relies on a preceding _SET_IP frame->prev_instr--; #endif } @@ -1055,13 +1055,13 @@ value = GETITEM(FRAME_CO_CONSTS, oparg); Py_INCREF(value); } - // SAVE_CURRENT_IP + // _SAVE_CURRENT_IP { #if TIER_ONE frame->prev_instr = next_instr - 1; #endif #if TIER_TWO - // Relies on a preceding SAVE_IP + // Relies on a preceding _SET_IP frame->prev_instr--; #endif } @@ -3024,7 +3024,7 @@ PyObject *value; PyObject *b; PyObject *cond; - // IS_NONE + // _IS_NONE value = stack_pointer[-1]; { if (Py_IsNone(value)) { @@ -3054,7 +3054,7 @@ PyObject *value; PyObject *b; PyObject *cond; - // IS_NONE + // _IS_NONE value = stack_pointer[-1]; { if (Py_IsNone(value)) { @@ -3879,14 +3879,14 @@ new_frame->localsplus[i] = args[i]; } } - // SAVE_CURRENT_IP + // _SAVE_CURRENT_IP next_instr += 3; { #if TIER_ONE frame->prev_instr = next_instr - 1; #endif #if TIER_TWO - // Relies on a preceding SAVE_IP + // Relies on a preceding _SET_IP frame->prev_instr--; #endif } @@ -3958,14 +3958,14 @@ new_frame->localsplus[i] = args[i]; } } - // SAVE_CURRENT_IP + // _SAVE_CURRENT_IP next_instr += 3; { #if TIER_ONE frame->prev_instr = next_instr - 1; #endif #if TIER_TWO - // Relies on a preceding SAVE_IP + // Relies on a preceding _SET_IP frame->prev_instr--; #endif } diff --git a/Python/optimizer.c b/Python/optimizer.c index 8eca37a7e4a283..453e3e86f5a1e3 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -474,14 +474,14 @@ translate_bytecode_to_trace( } \ reserved = (n); // Keep ADD_TO_TRACE / ADD_TO_STUB honest -// Reserve space for main+stub uops, plus 2 for SAVE_IP and EXIT_TRACE +// Reserve space for main+stub uops, plus 2 for _SET_IP and _EXIT_TRACE #define RESERVE(main, stub) RESERVE_RAW((main) + (stub) + 2, uop_name(opcode)) // Trace stack operations (used by _PUSH_FRAME, _POP_FRAME) #define TRACE_STACK_PUSH() \ if (trace_stack_depth >= TRACE_STACK_SIZE) { \ DPRINTF(2, "Trace stack overflow\n"); \ - ADD_TO_TRACE(SAVE_IP, 0, 0); \ + ADD_TO_TRACE(_SET_IP, 0, 0); \ goto done; \ } \ trace_stack[trace_stack_depth].code = code; \ @@ -504,8 +504,8 @@ translate_bytecode_to_trace( top: // Jump here after _PUSH_FRAME or likely branches for (;;) { - RESERVE_RAW(2, "epilogue"); // Always need space for SAVE_IP and EXIT_TRACE - ADD_TO_TRACE(SAVE_IP, INSTR_IP(instr, code), 0); + RESERVE_RAW(2, "epilogue"); // Always need space for _SET_IP and _EXIT_TRACE + ADD_TO_TRACE(_SET_IP, INSTR_IP(instr, code), 0); uint32_t opcode = instr->op.code; uint32_t oparg = instr->op.arg; @@ -531,7 +531,7 @@ translate_bytecode_to_trace( case POP_JUMP_IF_NONE: { RESERVE(2, 2); - ADD_TO_TRACE(IS_NONE, 0, 0); + ADD_TO_TRACE(_IS_NONE, 0, 0); opcode = POP_JUMP_IF_TRUE; goto pop_jump_if_bool; } @@ -539,7 +539,7 @@ translate_bytecode_to_trace( case POP_JUMP_IF_NOT_NONE: { RESERVE(2, 2); - ADD_TO_TRACE(IS_NONE, 0, 0); + ADD_TO_TRACE(_IS_NONE, 0, 0); opcode = POP_JUMP_IF_FALSE; goto pop_jump_if_bool; } @@ -563,8 +563,8 @@ translate_bytecode_to_trace( uop_name(opcode), oparg, counter, bitcount, jump_likely, jump_sense, uop_name(uopcode)); ADD_TO_TRACE(uopcode, max_length, 0); - ADD_TO_STUB(max_length, SAVE_IP, INSTR_IP(stub_target, code), 0); - ADD_TO_STUB(max_length + 1, EXIT_TRACE, 0, 0); + ADD_TO_STUB(max_length, _SET_IP, INSTR_IP(stub_target, code), 0); + ADD_TO_STUB(max_length + 1, _EXIT_TRACE, 0, 0); if (jump_likely) { DPRINTF(2, "Jump likely (%x = %d bits), continue at byte offset %d\n", instr[1].cache, bitcount, 2 * INSTR_IP(target_instr, code)); @@ -578,7 +578,7 @@ translate_bytecode_to_trace( { if (instr + 2 - oparg == initial_instr && code == initial_code) { RESERVE(1, 0); - ADD_TO_TRACE(JUMP_TO_TOP, 0, 0); + ADD_TO_TRACE(_JUMP_TO_TOP, 0, 0); } else { DPRINTF(2, "JUMP_BACKWARD not to top ends trace\n"); @@ -589,7 +589,7 @@ translate_bytecode_to_trace( case JUMP_FORWARD: { RESERVE(0, 0); - // This will emit two SAVE_IP instructions; leave it to the optimizer + // This will emit two _SET_IP instructions; leave it to the optimizer instr += oparg; break; } @@ -629,8 +629,8 @@ translate_bytecode_to_trace( ADD_TO_TRACE(next_op, 0, 0); ADD_TO_STUB(max_length + 0, POP_TOP, 0, 0); - ADD_TO_STUB(max_length + 1, SAVE_IP, INSTR_IP(target_instr, code), 0); - ADD_TO_STUB(max_length + 2, EXIT_TRACE, 0, 0); + ADD_TO_STUB(max_length + 1, _SET_IP, INSTR_IP(target_instr, code), 0); + ADD_TO_STUB(max_length + 2, _EXIT_TRACE, 0, 0); break; } @@ -638,7 +638,7 @@ translate_bytecode_to_trace( { const struct opcode_macro_expansion *expansion = &_PyOpcode_macro_expansion[opcode]; if (expansion->nuops > 0) { - // Reserve space for nuops (+ SAVE_IP + EXIT_TRACE) + // Reserve space for nuops (+ _SET_IP + _EXIT_TRACE) int nuops = expansion->nuops; RESERVE(nuops, 0); if (expansion->uops[nuops-1].uop == _POP_FRAME) { @@ -682,7 +682,7 @@ translate_bytecode_to_trace( case OPARG_BOTTOM: // Second half of super-instr oparg = orig_oparg & 0xF; break; - case OPARG_SAVE_IP: // op==SAVE_IP; oparg=next instr + case OPARG_SET_IP: // op==_SET_IP; oparg=next instr oparg = INSTR_IP(instr + offset, code); break; @@ -722,7 +722,7 @@ translate_bytecode_to_trace( PyUnicode_AsUTF8(new_code->co_qualname), PyUnicode_AsUTF8(new_code->co_filename), new_code->co_firstlineno); - ADD_TO_TRACE(SAVE_IP, 0, 0); + ADD_TO_TRACE(_SET_IP, 0, 0); goto done; } if (new_code->co_version != func_version) { @@ -730,7 +730,7 @@ translate_bytecode_to_trace( // Perhaps it may happen again, so don't bother tracing. // TODO: Reason about this -- is it better to bail or not? DPRINTF(2, "Bailing because co_version != func_version\n"); - ADD_TO_TRACE(SAVE_IP, 0, 0); + ADD_TO_TRACE(_SET_IP, 0, 0); goto done; } // Increment IP to the return address @@ -746,7 +746,7 @@ translate_bytecode_to_trace( 2 * INSTR_IP(instr, code)); goto top; } - ADD_TO_TRACE(SAVE_IP, 0, 0); + ADD_TO_TRACE(_SET_IP, 0, 0); goto done; } } @@ -768,9 +768,9 @@ translate_bytecode_to_trace( TRACE_STACK_POP(); } assert(code == initial_code); - // Skip short traces like SAVE_IP, LOAD_FAST, SAVE_IP, EXIT_TRACE + // Skip short traces like _SET_IP, LOAD_FAST, _SET_IP, _EXIT_TRACE if (trace_length > 3) { - ADD_TO_TRACE(EXIT_TRACE, 0, 0); + ADD_TO_TRACE(_EXIT_TRACE, 0, 0); DPRINTF(1, "Created a trace for %s (%s:%d) at byte offset %d -- length %d+%d\n", PyUnicode_AsUTF8(code->co_qualname), @@ -819,25 +819,25 @@ translate_bytecode_to_trace( static int remove_unneeded_uops(_PyUOpInstruction *trace, int trace_length) { - // Stage 1: Replace unneeded SAVE_IP uops with NOP. - // Note that we don't enter stubs, those SAVE_IPs are needed. - int last_save_ip = -1; + // Stage 1: Replace unneeded _SET_IP uops with NOP. + // Note that we don't enter stubs, those SET_IPs are needed. + int last_set_ip = -1; int last_instr = 0; bool need_ip = true; for (int pc = 0; pc < trace_length; pc++) { int opcode = trace[pc].opcode; - if (opcode == SAVE_CURRENT_IP) { - // Special case: never remove preceding SAVE_IP - last_save_ip = -1; + if (opcode == _SAVE_CURRENT_IP) { + // Special case: never remove preceding _SET_IP + last_set_ip = -1; } - else if (opcode == SAVE_IP) { - if (!need_ip && last_save_ip >= 0) { - trace[last_save_ip].opcode = NOP; + else if (opcode == _SET_IP) { + if (!need_ip && last_set_ip >= 0) { + trace[last_set_ip].opcode = NOP; } need_ip = false; - last_save_ip = pc; + last_set_ip = pc; } - else if (opcode == JUMP_TO_TOP || opcode == EXIT_TRACE) { + else if (opcode == _JUMP_TO_TOP || opcode == _EXIT_TRACE) { last_instr = pc + 1; break; } diff --git a/Tools/cases_generator/analysis.py b/Tools/cases_generator/analysis.py index 7c7c9086cd72f5..9e0124bd90878e 100644 --- a/Tools/cases_generator/analysis.py +++ b/Tools/cases_generator/analysis.py @@ -365,8 +365,8 @@ def analyze_macro(self, macro: parsing.Macro) -> MacroInstruction: case Instruction() as instr: part, offset = self.analyze_instruction(instr, offset) parts.append(part) - if instr.name != "SAVE_IP": - # SAVE_IP in a macro is a no-op in Tier 1 + if instr.name != "_SET_IP": + # _SET_IP in a macro is a no-op in Tier 1 flags.add(instr.instr_flags) case _: assert_never(component) diff --git a/Tools/cases_generator/generate_cases.py b/Tools/cases_generator/generate_cases.py index ad4a99931d9af6..3ed71309a9d85c 100644 --- a/Tools/cases_generator/generate_cases.py +++ b/Tools/cases_generator/generate_cases.py @@ -68,7 +68,7 @@ "OPARG_CACHE_4": 4, "OPARG_TOP": 5, "OPARG_BOTTOM": 6, - "OPARG_SAVE_IP": 7, + "OPARG_SET_IP": 7, } INSTR_FMT_PREFIX = "INSTR_FMT_" @@ -658,8 +658,8 @@ def add(name: str) -> None: seen.add(name) # These two are first by convention - add("EXIT_TRACE") - add("SAVE_IP") + add("_EXIT_TRACE") + add("_SET_IP") for instr in self.instrs.values(): if instr.kind == "op": @@ -687,8 +687,8 @@ def write_macro_expansions( ) return if not part.active_caches: - if part.instr.name == "SAVE_IP": - size, offset = OPARG_SIZES["OPARG_SAVE_IP"], cache_offset + if part.instr.name == "_SET_IP": + size, offset = OPARG_SIZES["OPARG_SET_IP"], cache_offset else: size, offset = OPARG_SIZES["OPARG_FULL"], 0 else: diff --git a/Tools/cases_generator/instructions.py b/Tools/cases_generator/instructions.py index 145c1ade839b82..78b3c290a49273 100644 --- a/Tools/cases_generator/instructions.py +++ b/Tools/cases_generator/instructions.py @@ -124,7 +124,7 @@ def is_viable_uop(self) -> bool: if "FRAME" in self.name: dprint = print - if self.name == "EXIT_TRACE": + if self.name == "_EXIT_TRACE": return True # This has 'return frame' but it's okay if self.always_exits: dprint(f"Skipping {self.name} because it always exits: {self.always_exits}") diff --git a/Tools/cases_generator/stacking.py b/Tools/cases_generator/stacking.py index 3021324e909100..026f0392eff1d7 100644 --- a/Tools/cases_generator/stacking.py +++ b/Tools/cases_generator/stacking.py @@ -362,7 +362,7 @@ def write_macro_instr( parts = [ part for part in mac.parts - if isinstance(part, Component) and part.instr.name != "SAVE_IP" + if isinstance(part, Component) and part.instr.name != "_SET_IP" ] out.emit("") with out.block(f"TARGET({mac.name})"): @@ -444,7 +444,7 @@ def write_components( ), f"Expected {mgr.instr.name!r} to be the last uop" assert_no_pokes(managers) - if mgr.instr.name == "SAVE_CURRENT_IP": + if mgr.instr.name == "_SAVE_CURRENT_IP": next_instr_is_set = True if cache_offset: out.emit(f"next_instr += {cache_offset};") From ceeb4173aee7b835f553a8286feaa48b98c16124 Mon Sep 17 00:00:00 2001 From: Carl Meyer Date: Mon, 11 Sep 2023 17:35:49 -0600 Subject: [PATCH 160/357] gh-109195: fix source location for super load before LOAD_SUPER_ATTR (#109289) --- Lib/test/test_compile.py | 7 +++++++ .../2023-09-11-15-51-55.gh-issue-109195.iwxmuo.rst | 4 ++++ Python/compile.c | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-11-15-51-55.gh-issue-109195.iwxmuo.rst diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 28b2c4686bbc89..a8a519f573e663 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -1751,6 +1751,13 @@ def test_column_offset_deduplication(self): list(code.co_consts[1].co_positions()), ) + def test_load_super_attr(self): + source = "class C:\n def __init__(self):\n super().__init__()" + code = compile(source, "", "exec").co_consts[0].co_consts[1] + self.assertOpcodeSourcePositionIs( + code, "LOAD_GLOBAL", line=3, end_line=3, column=4, end_column=9 + ) + class TestExpressionStackSize(unittest.TestCase): # These tests check that the computed stack size for a code object diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-11-15-51-55.gh-issue-109195.iwxmuo.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-11-15-51-55.gh-issue-109195.iwxmuo.rst new file mode 100644 index 00000000000000..5427232c2df9a0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-11-15-51-55.gh-issue-109195.iwxmuo.rst @@ -0,0 +1,4 @@ +Fix source location for the ``LOAD_*`` instruction preceding a +``LOAD_SUPER_ATTR`` to load the ``super`` global (or shadowing variable) so +that it encompasses only the name ``super`` and not the following +parentheses. diff --git a/Python/compile.c b/Python/compile.c index ae9edc90ea4367..1f08e46023e15a 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -4868,7 +4868,7 @@ load_args_for_super(struct compiler *c, expr_ty e) { // load super() global PyObject *super_name = e->v.Call.func->v.Name.id; - RETURN_IF_ERROR(compiler_nameop(c, loc, super_name, Load)); + RETURN_IF_ERROR(compiler_nameop(c, LOC(e->v.Call.func), super_name, Load)); if (asdl_seq_LEN(e->v.Call.args) == 2) { VISIT(c, expr, asdl_seq_GET(e->v.Call.args, 0)); From 2b1e2f1cd154e6df553eda7936715ea0622b4ecf Mon Sep 17 00:00:00 2001 From: Carl Meyer Date: Mon, 11 Sep 2023 18:03:04 -0600 Subject: [PATCH 161/357] gh-109292: add symtable impact of PEP 709 to What's New (#109293) --- Doc/whatsnew/3.12.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 447e81855a4a66..4d4d1a69e0b44c 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -257,6 +257,9 @@ Inlining does result in a few visible behavior changes: * There is no longer a separate frame for the comprehension in tracebacks, and tracing/profiling no longer shows the comprehension as a function call. +* The :mod:`symtable` module will no longer produce child symbol tables for each + comprehension; instead, the comprehension's locals will be included in the + parent function's symbol table. * Calling :func:`locals` inside a comprehension now includes variables from outside the comprehension, and no longer includes the synthetic ``.0`` variable for the comprehension "argument". From b88d9e75f68f102aca45fa62e2b0e2e2ff46d810 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Mon, 11 Sep 2023 17:11:06 -0700 Subject: [PATCH 162/357] gh-109118: Disallow nested scopes within PEP 695 scopes within classes (#109196) Fixes #109118. Fixes #109194. Co-authored-by: Carl Meyer --- Lib/test/test_type_params.py | 93 +++++++++++++++++++ ...-09-09-12-49-46.gh-issue-109118.gx0X4h.rst | 2 + Python/symtable.c | 23 +++++ 3 files changed, 118 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-09-12-49-46.gh-issue-109118.gx0X4h.rst diff --git a/Lib/test/test_type_params.py b/Lib/test/test_type_params.py index f93d088ea758a9..b1848aee4753a1 100644 --- a/Lib/test/test_type_params.py +++ b/Lib/test/test_type_params.py @@ -412,6 +412,99 @@ def test_comprehension_02(self): func, = T.__bound__ self.assertEqual(func(), 1) + def test_gen_exp_in_nested_class(self): + code = """ + from test.test_type_params import make_base + + class C[T]: + T = "class" + class Inner(make_base(T for _ in (1,)), make_base(T)): + pass + """ + C = run_code(code)["C"] + T, = C.__type_params__ + base1, base2 = C.Inner.__bases__ + self.assertEqual(list(base1.__arg__), [T]) + self.assertEqual(base2.__arg__, "class") + + def test_gen_exp_in_nested_generic_class(self): + code = """ + from test.test_type_params import make_base + + class C[T]: + T = "class" + class Inner[U](make_base(T for _ in (1,)), make_base(T)): + pass + """ + with self.assertRaisesRegex(SyntaxError, + "Cannot use comprehension in annotation scope within class scope"): + run_code(code) + + def test_listcomp_in_nested_class(self): + code = """ + from test.test_type_params import make_base + + class C[T]: + T = "class" + class Inner(make_base([T for _ in (1,)]), make_base(T)): + pass + """ + C = run_code(code)["C"] + T, = C.__type_params__ + base1, base2 = C.Inner.__bases__ + self.assertEqual(base1.__arg__, [T]) + self.assertEqual(base2.__arg__, "class") + + def test_listcomp_in_nested_generic_class(self): + code = """ + from test.test_type_params import make_base + + class C[T]: + T = "class" + class Inner[U](make_base([T for _ in (1,)]), make_base(T)): + pass + """ + with self.assertRaisesRegex(SyntaxError, + "Cannot use comprehension in annotation scope within class scope"): + run_code(code) + + def test_gen_exp_in_generic_method(self): + code = """ + class C[T]: + T = "class" + def meth[U](x: (T for _ in (1,)), y: T): + pass + """ + with self.assertRaisesRegex(SyntaxError, + "Cannot use comprehension in annotation scope within class scope"): + run_code(code) + + def test_nested_scope_in_generic_alias(self): + code = """ + class C[T]: + T = "class" + {} + """ + error_cases = [ + "type Alias1[T] = lambda: T", + "type Alias2 = lambda: T", + "type Alias3[T] = (T for _ in (1,))", + "type Alias4 = (T for _ in (1,))", + "type Alias5[T] = [T for _ in (1,)]", + "type Alias6 = [T for _ in (1,)]", + ] + for case in error_cases: + with self.subTest(case=case): + with self.assertRaisesRegex(SyntaxError, + r"Cannot use [a-z]+ in annotation scope within class scope"): + run_code(code.format(case)) + + +def make_base(arg): + class Base: + __arg__ = arg + return Base + def global_generic_func[T](): pass diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-09-12-49-46.gh-issue-109118.gx0X4h.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-09-12-49-46.gh-issue-109118.gx0X4h.rst new file mode 100644 index 00000000000000..87069c85870410 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-09-12-49-46.gh-issue-109118.gx0X4h.rst @@ -0,0 +1,2 @@ +Disallow nested scopes (lambdas, generator expressions, and comprehensions) +within PEP 695 annotation scopes that are nested within classes. diff --git a/Python/symtable.c b/Python/symtable.c index 6c28b49a0655c6..d737c09203d31b 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -2010,6 +2010,17 @@ symtable_visit_expr(struct symtable *st, expr_ty e) VISIT(st, expr, e->v.UnaryOp.operand); break; case Lambda_kind: { + if (st->st_cur->ste_can_see_class_scope) { + // gh-109118 + PyErr_Format(PyExc_SyntaxError, + "Cannot use lambda in annotation scope within class scope"); + PyErr_RangedSyntaxLocationObject(st->st_filename, + e->lineno, + e->col_offset + 1, + e->end_lineno, + e->end_col_offset + 1); + VISIT_QUIT(st, 0); + } if (e->v.Lambda.args->defaults) VISIT_SEQ(st, expr, e->v.Lambda.args->defaults); if (e->v.Lambda.args->kw_defaults) @@ -2459,6 +2470,18 @@ symtable_handle_comprehension(struct symtable *st, expr_ty e, identifier scope_name, asdl_comprehension_seq *generators, expr_ty elt, expr_ty value) { + if (st->st_cur->ste_can_see_class_scope) { + // gh-109118 + PyErr_Format(PyExc_SyntaxError, + "Cannot use comprehension in annotation scope within class scope"); + PyErr_RangedSyntaxLocationObject(st->st_filename, + e->lineno, + e->col_offset + 1, + e->end_lineno, + e->end_col_offset + 1); + VISIT_QUIT(st, 0); + } + int is_generator = (e->kind == GeneratorExp_kind); comprehension_ty outermost = ((comprehension_ty) asdl_seq_GET(generators, 0)); From 391f3e3ca904449a50b2dd5956684357fdce690b Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Mon, 11 Sep 2023 18:28:43 -0700 Subject: [PATCH 163/357] GH-106734: Disable tab completion in pdb's multiline mode (GH-106735) --- Lib/pdb.py | 59 ++++++++++++------- ...-07-14-01-47-39.gh-issue-106734.eMYSoz.rst | 1 + 2 files changed, 39 insertions(+), 21 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-07-14-01-47-39.gh-issue-106734.eMYSoz.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index c31f608e6d9da5..e231d3d7eae475 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -514,6 +514,22 @@ def displayhook(self, obj): if obj is not None: self.message(repr(obj)) + @contextmanager + def _disable_tab_completion(self): + if self.use_rawinput and self.completekey == 'tab': + try: + import readline + except ImportError: + yield + return + try: + readline.parse_and_bind('tab: self-insert') + yield + finally: + readline.parse_and_bind('tab: complete') + else: + yield + def default(self, line): if line[:1] == '!': line = line[1:].strip() locals = self.curframe_locals @@ -521,28 +537,29 @@ def default(self, line): try: if (code := codeop.compile_command(line + '\n', '', 'single')) is None: # Multi-line mode - buffer = line - continue_prompt = "... " - while (code := codeop.compile_command(buffer, '', 'single')) is None: - if self.use_rawinput: - try: - line = input(continue_prompt) - except (EOFError, KeyboardInterrupt): - self.lastcmd = "" - print('\n') - return - else: - self.stdout.write(continue_prompt) - self.stdout.flush() - line = self.stdin.readline() - if not len(line): - self.lastcmd = "" - self.stdout.write('\n') - self.stdout.flush() - return + with self._disable_tab_completion(): + buffer = line + continue_prompt = "... " + while (code := codeop.compile_command(buffer, '', 'single')) is None: + if self.use_rawinput: + try: + line = input(continue_prompt) + except (EOFError, KeyboardInterrupt): + self.lastcmd = "" + print('\n') + return else: - line = line.rstrip('\r\n') - buffer += '\n' + line + self.stdout.write(continue_prompt) + self.stdout.flush() + line = self.stdin.readline() + if not len(line): + self.lastcmd = "" + self.stdout.write('\n') + self.stdout.flush() + return + else: + line = line.rstrip('\r\n') + buffer += '\n' + line save_stdout = sys.stdout save_stdin = sys.stdin save_displayhook = sys.displayhook diff --git a/Misc/NEWS.d/next/Library/2023-07-14-01-47-39.gh-issue-106734.eMYSoz.rst b/Misc/NEWS.d/next/Library/2023-07-14-01-47-39.gh-issue-106734.eMYSoz.rst new file mode 100644 index 00000000000000..37d2ab19ed1017 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-07-14-01-47-39.gh-issue-106734.eMYSoz.rst @@ -0,0 +1 @@ +Disable tab completion in multiline mode of :mod:`pdb` From 09ea4b8706165fd9474165090a0ba86509abd6c8 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 12 Sep 2023 03:31:15 +0200 Subject: [PATCH 164/357] gh-109295: Clean up multiprocessing in test_asyncio and test_compileall (#109298) test_asyncio and test_compileall now clean up multiprocessing by calling multiprocessing _cleanup_tests(): explicitly clean up resources and stop background processes like the resource tracker. --- Lib/test/test_asyncio/test_events.py | 3 +++ Lib/test/test_compileall.py | 10 +++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 30cc8fd80bfe94..1647d2308c4e35 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -31,6 +31,7 @@ from asyncio import coroutines from asyncio import events from asyncio import selector_events +from multiprocessing.util import _cleanup_tests as multiprocessing_cleanup_tests from test.test_asyncio import utils as test_utils from test import support from test.support import socket_helper @@ -2765,6 +2766,8 @@ def test_get_event_loop_new_process(self): # multiprocessing.synchronize module cannot be imported. support.skip_if_broken_multiprocessing_synchronize() + self.addCleanup(multiprocessing_cleanup_tests) + async def main(): if multiprocessing.get_start_method() == 'fork': # Avoid 'fork' DeprecationWarning. diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py index df7c5122b3b1f5..9cd92ad365c5a9 100644 --- a/Lib/test/test_compileall.py +++ b/Lib/test/test_compileall.py @@ -18,6 +18,7 @@ try: # compileall relies on ProcessPoolExecutor if ProcessPoolExecutor exists # and it can function. + from multiprocessing.util import _cleanup_tests as multiprocessing_cleanup_tests from concurrent.futures import ProcessPoolExecutor from concurrent.futures.process import _check_system_limits _check_system_limits() @@ -54,6 +55,8 @@ class CompileallTestsBase: def setUp(self): self.directory = tempfile.mkdtemp() + self.addCleanup(shutil.rmtree, self.directory) + self.source_path = os.path.join(self.directory, '_test.py') self.bc_path = importlib.util.cache_from_source(self.source_path) with open(self.source_path, 'w', encoding="utf-8") as file: @@ -66,9 +69,6 @@ def setUp(self): self.source_path3 = os.path.join(self.subdirectory, '_test3.py') shutil.copyfile(self.source_path, self.source_path3) - def tearDown(self): - shutil.rmtree(self.directory) - def add_bad_source_file(self): self.bad_source_path = os.path.join(self.directory, '_test_bad.py') with open(self.bad_source_path, 'w', encoding="utf-8") as file: @@ -307,9 +307,13 @@ def _test_ddir_only(self, *, ddir, parallel=True): script_helper.make_script(path, "__init__", "") mods.append(script_helper.make_script(path, "mod", "def fn(): 1/0\nfn()\n")) + + if parallel: + self.addCleanup(multiprocessing_cleanup_tests) compileall.compile_dir( self.directory, quiet=True, ddir=ddir, workers=2 if parallel else 1) + self.assertTrue(mods) for mod in mods: self.assertTrue(mod.startswith(self.directory), mod) From 7dedfd36dc16d9e1e15d7d0b0a636dd401a5a543 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 12 Sep 2023 03:35:26 +0200 Subject: [PATCH 165/357] gh-109295: Fix test_os.test_access_denied() for TEMP=cwd (#109299) Fix test_os.test_access_denied() when the TEMP environment variable is equal to the current working directory. Run the test using a different filename, since self.fname already exists in this case. --- Lib/test/test_os.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 99e9ed213e5615..34cd27b143f231 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -737,7 +737,7 @@ def test_access_denied(self): # denied. See issue 28075. # os.environ['TEMP'] should be located on a volume that # supports file ACLs. - fname = os.path.join(os.environ['TEMP'], self.fname) + fname = os.path.join(os.environ['TEMP'], self.fname + "_access") self.addCleanup(os_helper.unlink, fname) create_file(fname, b'ABC') # Deny the right to [S]YNCHRONIZE on the file to From f2a55fecd063244a5fd09a38f673f0781f8802d1 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 12 Sep 2023 04:04:28 +0200 Subject: [PATCH 166/357] Fix iter_index() to work with lists which do not support stop=None. (gh-109306) --- Doc/library/itertools.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 3cfc2602fe0694..5e187aea441bb9 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -877,6 +877,7 @@ which incur interpreter overhead. yield i else: # Fast path for sequences + stop = len(iterable) if stop is None else stop i = start - 1 try: while True: @@ -1345,6 +1346,16 @@ The following recipes have a more mathematical flavor: Traceback (most recent call last): ... ValueError + >>> # Verify that both paths can find identical NaN values + >>> x = float('NaN') + >>> y = float('NaN') + >>> list(iter_index([0, x, x, y, 0], x)) + [1, 2] + >>> list(iter_index(iter([0, x, x, y, 0]), x)) + [1, 2] + >>> # Test list input. Lists do not support None for the stop argument + >>> list(iter_index(list('AABCADEAF'), 'A')) + [0, 1, 4, 7] >>> list(sieve(30)) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] From 936376916100681d46db117bae0ec05adf338051 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 12 Sep 2023 04:30:07 +0200 Subject: [PATCH 167/357] gh-109295: Skip test_generated_cases if different mount drives (#109308) On Windows, skip the test if the current working directory and the Python source code directory have different mount drives. It happens if the temporary directory is on a different mount drive than the Python source code. --- Lib/test/test_generated_cases.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_generated_cases.py b/Lib/test/test_generated_cases.py index be3dfd204ee143..b5eaf824aee706 100644 --- a/Lib/test/test_generated_cases.py +++ b/Lib/test/test_generated_cases.py @@ -1,11 +1,31 @@ import contextlib +import os +import sys import tempfile import unittest -import os from test import support from test import test_tools + +def skip_if_different_mount_drives(): + if sys.platform != 'win32': + return + ROOT = os.path.dirname(os.path.dirname(__file__)) + root_drive = os.path.splitroot(ROOT)[0] + cwd_drive = os.path.splitroot(os.getcwd())[0] + if root_drive != cwd_drive: + # generate_cases.py uses relpath() which raises ValueError if ROOT + # and the current working different have different mount drives + # (on Windows). + raise unittest.SkipTest( + f"the current working directory and the Python source code " + f"directory have different mount drives " + f"({cwd_drive} and {root_drive})" + ) +skip_if_different_mount_drives() + + test_tools.skip_if_missing('cases_generator') with test_tools.imports_under_tool('cases_generator'): import generate_cases From df4f0fe203a66ffa61c8ea71d30c87d13b973d3b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 12 Sep 2023 04:50:05 +0200 Subject: [PATCH 168/357] gh-109276: Complete test.pythoninfo (#109312) * Enable collect_sysconfig() on Windows. * Add sysconfig 'abs_builddir' and 'srcdir' * Add sysconfig.is_python_build() * Add tempfile.gettempdir() * Remove compatiblity with Python 2.7 (print_function). --- Lib/test/pythoninfo.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index b25def78e42be4..e52fa6bdf05f71 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -1,18 +1,13 @@ """ Collect various information about Python to help debugging test failures. """ -from __future__ import print_function import errno import re import sys import traceback -import unittest import warnings -MS_WINDOWS = (sys.platform == 'win32') - - def normalize_text(text): if text is None: return None @@ -493,13 +488,10 @@ def collect_datetime(info_add): def collect_sysconfig(info_add): - # On Windows, sysconfig is not reliable to get macros used - # to build Python - if MS_WINDOWS: - return - import sysconfig + info_add('sysconfig.is_python_build', sysconfig.is_python_build()) + for name in ( 'ABIFLAGS', 'ANDROID_API_LEVEL', @@ -523,7 +515,9 @@ def collect_sysconfig(info_add): 'Py_NOGIL', 'SHELL', 'SOABI', + 'abs_builddir', 'prefix', + 'srcdir', ): value = sysconfig.get_config_var(name) if name == 'ANDROID_API_LEVEL' and not value: @@ -711,6 +705,7 @@ def collect_resource(info_add): def collect_test_socket(info_add): + import unittest try: from test import test_socket except (ImportError, unittest.SkipTest): @@ -896,6 +891,11 @@ def collect_fips(info_add): pass +def collect_tempfile(info_add): + import tempfile + + info_add('tempfile.gettempdir', tempfile.gettempdir()) + def collect_info(info): error = False info_add = info.add @@ -930,6 +930,7 @@ def collect_info(info): collect_sysconfig, collect_testcapi, collect_testinternalcapi, + collect_tempfile, collect_time, collect_tkinter, collect_windows, From 4e77645986fd27beaf25779426ae8580009fae33 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 12 Sep 2023 05:01:33 +0200 Subject: [PATCH 169/357] gh-109276: libregrtest only checks saved_test_environment() once (#109278) There is no need to check for environment changes twice. --- Lib/test/libregrtest/save_env.py | 2 +- Lib/test/libregrtest/single.py | 25 +++++++++++-------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/Lib/test/libregrtest/save_env.py b/Lib/test/libregrtest/save_env.py index 55c1f7801489b0..b2cc381344b2ef 100644 --- a/Lib/test/libregrtest/save_env.py +++ b/Lib/test/libregrtest/save_env.py @@ -36,7 +36,7 @@ class saved_test_environment: items is also printed. """ - def __init__(self, test_name, verbose=0, quiet=False, *, pgo=False): + def __init__(self, test_name, verbose, quiet, *, pgo): self.test_name = test_name self.verbose = verbose self.quiet = quiet diff --git a/Lib/test/libregrtest/single.py b/Lib/test/libregrtest/single.py index c26e542cf15ef5..de6056628738bc 100644 --- a/Lib/test/libregrtest/single.py +++ b/Lib/test/libregrtest/single.py @@ -68,18 +68,14 @@ def regrtest_runner(result: TestResult, test_func, runtests: RunTests) -> None: result.stats = stats -def save_env(test_name: TestName, runtests: RunTests): - return saved_test_environment(test_name, runtests.verbose, runtests.quiet, - pgo=runtests.pgo) - - # Storage of uncollectable GC objects (gc.garbage) GC_GARBAGE = [] def _load_run_test(result: TestResult, runtests: RunTests) -> None: - # Load the test function, run the test function. - module_name = abs_module_name(result.test_name, runtests.test_dir) + # Load the test module and run the tests. + test_name = result.test_name + module_name = abs_module_name(test_name, runtests.test_dir) # Remove the module from sys.module to reload it if it was already imported sys.modules.pop(module_name, None) @@ -88,13 +84,13 @@ def _load_run_test(result: TestResult, runtests: RunTests) -> None: if hasattr(test_mod, "test_main"): # https://github.com/python/cpython/issues/89392 - raise Exception(f"Module {result.test_name} defines test_main() which is no longer supported by regrtest") + raise Exception(f"Module {test_name} defines test_main() which " + f"is no longer supported by regrtest") def test_func(): return run_unittest(test_mod) try: - with save_env(result.test_name, runtests): - regrtest_runner(result, test_func, runtests) + regrtest_runner(result, test_func, runtests) finally: # First kill any dangling references to open files etc. # This can also issue some ResourceWarnings which would otherwise get @@ -102,11 +98,11 @@ def test_func(): # failures. support.gc_collect() - remove_testfn(result.test_name, runtests.verbose) + remove_testfn(test_name, runtests.verbose) if gc.garbage: support.environment_altered = True - print_warning(f"{result.test_name} created {len(gc.garbage)} " + print_warning(f"{test_name} created {len(gc.garbage)} " f"uncollectable object(s)") # move the uncollectable objects somewhere, @@ -119,7 +115,7 @@ def test_func(): def _runtest_env_changed_exc(result: TestResult, runtests: RunTests, display_failure: bool = True) -> None: - # Detect environment changes, handle exceptions. + # Handle exceptions, detect environment changes. # Reset the environment_altered flag to detect if a test altered # the environment @@ -135,7 +131,8 @@ def _runtest_env_changed_exc(result: TestResult, runtests: RunTests, clear_caches() support.gc_collect() - with save_env(test_name, runtests): + with saved_test_environment(test_name, + runtests.verbose, quiet, pgo=pgo): _load_run_test(result, runtests) except support.ResourceDenied as msg: if not quiet and not pgo: From a84cb74d42a28cf8e72ed7b5d9412fc13d18c817 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 12 Sep 2023 05:35:08 +0200 Subject: [PATCH 170/357] gh-109276: libregrtest calls random.seed() before each test (#109279) libregrtest now calls random.seed() before running each test file when -r/--randomize command line option is used. Moreover, it's also called in worker processes. It should help to make tests more deterministic. Previously, it was only called once in the main process before running all test files and it was not called in worker processes. * Convert some f-strings to regular strings in test_regrtest when f-string is not needed. * Remove unused all_methods variable from test_regrtest. * Add RunTests members are now mandatory. --- Lib/test/libregrtest/main.py | 13 +++- Lib/test/libregrtest/runtests.py | 44 ++++++------- Lib/test/libregrtest/setup.py | 4 ++ Lib/test/test_regrtest.py | 61 +++++++++++++++---- ...-09-11-19-11-57.gh-issue-109276.qxI4OG.rst | 6 ++ 5 files changed, 94 insertions(+), 34 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-11-19-11-57.gh-issue-109276.qxI4OG.rst diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 2c0a6c204373cc..f52deac329dc84 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -112,8 +112,11 @@ def __init__(self, ns: Namespace): self.junit_filename: StrPath | None = ns.xmlpath self.memory_limit: str | None = ns.memlimit self.gc_threshold: int | None = ns.threshold - self.use_resources: list[str] = ns.use_resources - self.python_cmd: list[str] | None = ns.python + self.use_resources: tuple[str] = tuple(ns.use_resources) + if ns.python: + self.python_cmd: tuple[str] = tuple(ns.python) + else: + self.python_cmd = None self.coverage: bool = ns.trace self.coverage_dir: StrPath | None = ns.coverdir self.tmp_dir: StrPath | None = ns.tempdir @@ -377,8 +380,11 @@ def create_run_tests(self, tests: TestTuple): return RunTests( tests, fail_fast=self.fail_fast, + fail_env_changed=self.fail_env_changed, match_tests=self.match_tests, ignore_tests=self.ignore_tests, + match_tests_dict=None, + rerun=None, forever=self.forever, pgo=self.pgo, pgo_extended=self.pgo_extended, @@ -393,6 +399,9 @@ def create_run_tests(self, tests: TestTuple): gc_threshold=self.gc_threshold, use_resources=self.use_resources, python_cmd=self.python_cmd, + randomize=self.randomize, + random_seed=self.random_seed, + json_fd=None, ) def _run_tests(self, selected: TestTuple, tests: TestList | None) -> int: diff --git a/Lib/test/libregrtest/runtests.py b/Lib/test/libregrtest/runtests.py index 64f8f6ab0ff305..656958fa71312f 100644 --- a/Lib/test/libregrtest/runtests.py +++ b/Lib/test/libregrtest/runtests.py @@ -16,29 +16,31 @@ class HuntRefleak: @dataclasses.dataclass(slots=True, frozen=True) class RunTests: tests: TestTuple - fail_fast: bool = False - fail_env_changed: bool = False - match_tests: FilterTuple | None = None - ignore_tests: FilterTuple | None = None - match_tests_dict: FilterDict | None = None - rerun: bool = False - forever: bool = False - pgo: bool = False - pgo_extended: bool = False - output_on_failure: bool = False - timeout: float | None = None - verbose: int = 0 - quiet: bool = False - hunt_refleak: HuntRefleak | None = None - test_dir: StrPath | None = None - use_junit: bool = False - memory_limit: str | None = None - gc_threshold: int | None = None - use_resources: list[str] = dataclasses.field(default_factory=list) - python_cmd: list[str] | None = None + fail_fast: bool + fail_env_changed: bool + match_tests: FilterTuple | None + ignore_tests: FilterTuple | None + match_tests_dict: FilterDict | None + rerun: bool + forever: bool + pgo: bool + pgo_extended: bool + output_on_failure: bool + timeout: float | None + verbose: int + quiet: bool + hunt_refleak: HuntRefleak | None + test_dir: StrPath | None + use_junit: bool + memory_limit: str | None + gc_threshold: int | None + use_resources: tuple[str] + python_cmd: tuple[str] | None + randomize: bool + random_seed: int | None # On Unix, it's a file descriptor. # On Windows, it's a handle. - json_fd: int | None = None + json_fd: int | None def copy(self, **override): state = dataclasses.asdict(self) diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index 353a0f70b94ab2..1c40b7c7b3bbfd 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -1,5 +1,6 @@ import faulthandler import os +import random import signal import sys import unittest @@ -127,3 +128,6 @@ def setup_tests(runtests: RunTests): if runtests.gc_threshold is not None: gc.set_threshold(runtests.gc_threshold) + + if runtests.randomize: + random.seed(runtests.random_seed) diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 466b6f66797b7a..7cf3d05a6e6d70 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -11,6 +11,7 @@ import locale import os.path import platform +import random import re import subprocess import sys @@ -504,7 +505,7 @@ def list_regex(line_format, tests): if rerun is not None: regex = list_regex('%s re-run test%s', [rerun.name]) self.check_line(output, regex) - regex = LOG_PREFIX + fr"Re-running 1 failed tests in verbose mode" + regex = LOG_PREFIX + r"Re-running 1 failed tests in verbose mode" self.check_line(output, regex) regex = fr"Re-running {rerun.name} in verbose mode" if rerun.match: @@ -1019,13 +1020,13 @@ def test_run(self): forever=True) @without_optimizer - def check_leak(self, code, what, *, multiprocessing=False): + def check_leak(self, code, what, *, run_workers=False): test = self.create_test('huntrleaks', code=code) filename = 'reflog.txt' self.addCleanup(os_helper.unlink, filename) cmd = ['--huntrleaks', '3:3:'] - if multiprocessing: + if run_workers: cmd.append('-j1') cmd.append(test) output = self.run_tests(*cmd, @@ -1044,7 +1045,7 @@ def check_leak(self, code, what, *, multiprocessing=False): self.assertIn(line2, reflog) @unittest.skipUnless(support.Py_DEBUG, 'need a debug build') - def check_huntrleaks(self, *, multiprocessing: bool): + def check_huntrleaks(self, *, run_workers: bool): # test --huntrleaks code = textwrap.dedent(""" import unittest @@ -1055,13 +1056,13 @@ class RefLeakTest(unittest.TestCase): def test_leak(self): GLOBAL_LIST.append(object()) """) - self.check_leak(code, 'references', multiprocessing=multiprocessing) + self.check_leak(code, 'references', run_workers=run_workers) def test_huntrleaks(self): - self.check_huntrleaks(multiprocessing=False) + self.check_huntrleaks(run_workers=False) def test_huntrleaks_mp(self): - self.check_huntrleaks(multiprocessing=True) + self.check_huntrleaks(run_workers=True) @unittest.skipUnless(support.Py_DEBUG, 'need a debug build') def test_huntrleaks_fd_leak(self): @@ -1139,8 +1140,6 @@ def test_method3(self): def test_method4(self): pass """) - all_methods = ['test_method1', 'test_method2', - 'test_method3', 'test_method4'] testname = self.create_test(code=code) # only run a subset @@ -1762,7 +1761,7 @@ def test_mp_decode_error(self): if encoding is None: encoding = sys.__stdout__.encoding if encoding is None: - self.skipTest(f"cannot get regrtest worker encoding") + self.skipTest("cannot get regrtest worker encoding") nonascii = b"byte:\xa0\xa9\xff\n" try: @@ -1789,7 +1788,7 @@ def test_mp_decode_error(self): stats=0) def test_doctest(self): - code = textwrap.dedent(fr''' + code = textwrap.dedent(r''' import doctest import sys from test import support @@ -1827,6 +1826,46 @@ def load_tests(loader, tests, pattern): randomize=True, stats=TestStats(1, 1, 0)) + def _check_random_seed(self, run_workers: bool): + # gh-109276: When -r/--randomize is used, random.seed() is called + # with the same random seed before running each test file. + code = textwrap.dedent(r''' + import random + import unittest + + class RandomSeedTest(unittest.TestCase): + def test_randint(self): + numbers = [random.randint(0, 1000) for _ in range(10)] + print(f"Random numbers: {numbers}") + ''') + tests = [self.create_test(name=f'test_random{i}', code=code) + for i in range(1, 3+1)] + + random_seed = 856_656_202 + cmd = ["--randomize", f"--randseed={random_seed}"] + if run_workers: + # run as many worker processes than the number of tests + cmd.append(f'-j{len(tests)}') + cmd.extend(tests) + output = self.run_tests(*cmd) + + random.seed(random_seed) + # Make the assumption that nothing consume entropy between libregrest + # setup_tests() which calls random.seed() and RandomSeedTest calling + # random.randint(). + numbers = [random.randint(0, 1000) for _ in range(10)] + expected = f"Random numbers: {numbers}" + + regex = r'^Random numbers: .*$' + matches = re.findall(regex, output, flags=re.MULTILINE) + self.assertEqual(matches, [expected] * len(tests)) + + def test_random_seed(self): + self._check_random_seed(run_workers=False) + + def test_random_seed_workers(self): + self._check_random_seed(run_workers=True) + class TestUtils(unittest.TestCase): def test_format_duration(self): diff --git a/Misc/NEWS.d/next/Tests/2023-09-11-19-11-57.gh-issue-109276.qxI4OG.rst b/Misc/NEWS.d/next/Tests/2023-09-11-19-11-57.gh-issue-109276.qxI4OG.rst new file mode 100644 index 00000000000000..cf4074b2fe23cc --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-11-19-11-57.gh-issue-109276.qxI4OG.rst @@ -0,0 +1,6 @@ +libregrtest now calls :func:`random.seed()` before running each test file +when ``-r/--randomize`` command line option is used. Moreover, it's also +called in worker processes. It should help to make tests more +deterministic. Previously, it was only called once in the main process before +running all test files and it was not called in worker processes. Patch by +Victor Stinner. From 8c813faf864ac1d788a3efc45b4e76c1c3c3b340 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 12 Sep 2023 05:47:04 +0200 Subject: [PATCH 171/357] gh-109276: libregrtest: limit number workers (#109288) Don't spawn more threads than the number of jobs: these worker threads would never get anything to do. * Add the number of tests in "Run ... tests in ..." message. * Add RunTests.get_jobs() method. * Add plural() function. * count() uses f-string. --- Lib/test/libregrtest/main.py | 7 ++++++- Lib/test/libregrtest/run_workers.py | 18 ++++++++++++++++-- Lib/test/libregrtest/runtests.py | 7 +++++++ Lib/test/libregrtest/utils.py | 13 +++++++++++-- 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index f52deac329dc84..a89e3c6a498da6 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -295,7 +295,12 @@ def run_tests_sequentially(self, runtests): save_modules = sys.modules.keys() - msg = "Run tests sequentially" + jobs = runtests.get_jobs() + if jobs is not None: + tests = f'{jobs} tests' + else: + tests = 'tests' + msg = f"Run {tests} sequentially" if runtests.timeout: msg += " (timeout: %s)" % format_duration(runtests.timeout) self.log(msg) diff --git a/Lib/test/libregrtest/run_workers.py b/Lib/test/libregrtest/run_workers.py index 5c665abfeb57bd..cfa36f7800943a 100644 --- a/Lib/test/libregrtest/run_workers.py +++ b/Lib/test/libregrtest/run_workers.py @@ -21,7 +21,7 @@ from .single import PROGRESS_MIN_TIME from .utils import ( StrPath, StrJSON, TestName, MS_WINDOWS, - format_duration, print_warning) + format_duration, print_warning, plural) from .worker import create_worker_process, USE_PROCESS_GROUP if MS_WINDOWS: @@ -401,10 +401,24 @@ def __init__(self, num_workers: int, runtests: RunTests, self.worker_timeout = None self.workers = None + jobs = self.runtests.get_jobs() + if jobs is not None: + # Don't spawn more threads than the number of jobs: + # these worker threads would never get anything to do. + self.num_workers = min(self.num_workers, jobs) + def start_workers(self) -> None: self.workers = [WorkerThread(index, self) for index in range(1, self.num_workers + 1)] - msg = f"Run tests in parallel using {len(self.workers)} child processes" + jobs = self.runtests.get_jobs() + if jobs is not None: + tests = f'{jobs} tests' + else: + tests = 'tests' + nworkers = len(self.workers) + processes = plural(nworkers, "process", "processes") + msg = (f"Run {tests} in parallel using " + f"{nworkers} worker {processes}") if self.timeout: msg += (" (timeout: %s, worker timeout: %s)" % (format_duration(self.timeout), diff --git a/Lib/test/libregrtest/runtests.py b/Lib/test/libregrtest/runtests.py index 656958fa71312f..5c68df126e2a8f 100644 --- a/Lib/test/libregrtest/runtests.py +++ b/Lib/test/libregrtest/runtests.py @@ -53,6 +53,13 @@ def get_match_tests(self, test_name) -> FilterTuple | None: else: return None + def get_jobs(self): + # Number of run_single_test() calls needed to run all tests. + # None means that there is not bound limit (--forever option). + if self.forever: + return None + return len(self.tests) + def iter_tests(self): if self.forever: while True: diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index b46cec6f0eec70..ce1b1088127bf7 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -70,11 +70,20 @@ def strip_py_suffix(names: list[str]): names[idx] = basename +def plural(n, singular, plural=None): + if n == 1: + return singular + elif plural is not None: + return plural + else: + return singular + 's' + + def count(n, word): if n == 1: - return "%d %s" % (n, word) + return f"{n} {word}" else: - return "%d %ss" % (n, word) + return f"{n} {word}s" def printlist(x, width=70, indent=4, file=None): From 1110c5bc828218086f6397ec05a9312fb73ea30a Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Tue, 12 Sep 2023 09:37:42 +0300 Subject: [PATCH 172/357] gh-108303: Move tokenize-related data to Lib/test/tokenizedata (GH-109265) --- .gitattributes | 2 +- .pre-commit-config.yaml | 2 +- Lib/test/test_py_compile.py | 16 +++++++--- Lib/test/test_source_encoding.py | 5 ++-- Lib/test/test_tarfile.py | 29 ++++++++++++------- Lib/test/test_tokenize.py | 7 ++--- Lib/test/test_tools/test_reindent.py | 2 +- Lib/test/test_unicode_identifiers.py | 2 +- Lib/test/tokenizedata/__init__.py | 0 Lib/test/{ => tokenizedata}/bad_coding.py | 0 Lib/test/{ => tokenizedata}/bad_coding2.py | 0 Lib/test/{ => tokenizedata}/badsyntax_3131.py | 0 Lib/test/{ => tokenizedata}/coding20731.py | 0 ...-latin1-coding-cookie-and-utf8-bom-sig.txt | 0 ...no-coding-cookie-and-utf8-bom-sig-only.txt | 0 ...utf8-coding-cookie-and-no-utf8-bom-sig.txt | 0 ...ts-utf8-coding-cookie-and-utf8-bom-sig.txt | 0 .../{ => tokenizedata}/tokenize_tests.txt | 0 18 files changed, 40 insertions(+), 25 deletions(-) create mode 100644 Lib/test/tokenizedata/__init__.py rename Lib/test/{ => tokenizedata}/bad_coding.py (100%) rename Lib/test/{ => tokenizedata}/bad_coding2.py (100%) rename Lib/test/{ => tokenizedata}/badsyntax_3131.py (100%) rename Lib/test/{ => tokenizedata}/coding20731.py (100%) rename Lib/test/{ => tokenizedata}/tokenize_tests-latin1-coding-cookie-and-utf8-bom-sig.txt (100%) rename Lib/test/{ => tokenizedata}/tokenize_tests-no-coding-cookie-and-utf8-bom-sig-only.txt (100%) rename Lib/test/{ => tokenizedata}/tokenize_tests-utf8-coding-cookie-and-no-utf8-bom-sig.txt (100%) rename Lib/test/{ => tokenizedata}/tokenize_tests-utf8-coding-cookie-and-utf8-bom-sig.txt (100%) rename Lib/test/{ => tokenizedata}/tokenize_tests.txt (100%) diff --git a/.gitattributes b/.gitattributes index e05ff900bf1c09..8c37dbbb631022 100644 --- a/.gitattributes +++ b/.gitattributes @@ -24,7 +24,7 @@ PC/classicAppCompat.* binary [attr]noeol -text Lib/test/cjkencodings/* noeol -Lib/test/coding20731.py noeol +Lib/test/tokenizedata/coding20731.py noeol Lib/test/decimaltestdata/*.decTest noeol Lib/test/test_email/data/*.txt noeol Lib/test/test_importlib/resources/data01/* noeol diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 451cbe8bc84820..68e75fa44fab60 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,7 @@ repos: - id: check-yaml - id: end-of-file-fixer types: [python] - exclude: Lib/test/coding20731.py + exclude: Lib/test/tokenizedata/coding20731.py - id: trailing-whitespace types_or: [c, python, rst] diff --git a/Lib/test/test_py_compile.py b/Lib/test/test_py_compile.py index 5e0a44ad9691ec..c4e6551f605782 100644 --- a/Lib/test/test_py_compile.py +++ b/Lib/test/test_py_compile.py @@ -132,7 +132,9 @@ def test_exceptions_propagate(self): os.chmod(self.directory, mode.st_mode) def test_bad_coding(self): - bad_coding = os.path.join(os.path.dirname(__file__), 'bad_coding2.py') + bad_coding = os.path.join(os.path.dirname(__file__), + 'tokenizedata', + 'bad_coding2.py') with support.captured_stderr(): self.assertIsNone(py_compile.compile(bad_coding, doraise=False)) self.assertFalse(os.path.exists( @@ -195,7 +197,9 @@ def test_invalidation_mode(self): self.assertEqual(flags, 0b1) def test_quiet(self): - bad_coding = os.path.join(os.path.dirname(__file__), 'bad_coding2.py') + bad_coding = os.path.join(os.path.dirname(__file__), + 'tokenizedata', + '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)) @@ -260,14 +264,18 @@ def test_with_files(self): self.assertTrue(os.path.exists(self.cache_path)) def test_bad_syntax(self): - bad_syntax = os.path.join(os.path.dirname(__file__), 'badsyntax_3131.py') + bad_syntax = os.path.join(os.path.dirname(__file__), + 'tokenizedata', + 'badsyntax_3131.py') rc, stdout, stderr = self.pycompilecmd_failure(bad_syntax) self.assertEqual(rc, 1) self.assertEqual(stdout, b'') self.assertIn(b'SyntaxError', stderr) def test_bad_syntax_with_quiet(self): - bad_syntax = os.path.join(os.path.dirname(__file__), 'badsyntax_3131.py') + bad_syntax = os.path.join(os.path.dirname(__file__), + 'tokenizedata', + 'badsyntax_3131.py') rc, stdout, stderr = self.pycompilecmd_failure('-q', bad_syntax) self.assertEqual(rc, 1) self.assertEqual(stdout, b'') diff --git a/Lib/test/test_source_encoding.py b/Lib/test/test_source_encoding.py index 72c2b47779e005..27871378f1c79e 100644 --- a/Lib/test/test_source_encoding.py +++ b/Lib/test/test_source_encoding.py @@ -68,6 +68,7 @@ def test_issue7820(self): def test_20731(self): sub = subprocess.Popen([sys.executable, os.path.join(os.path.dirname(__file__), + 'tokenizedata', 'coding20731.py')], stderr=subprocess.PIPE) err = sub.communicate()[1] @@ -100,10 +101,10 @@ def test_bad_coding2(self): self.verify_bad_module(module_name) def verify_bad_module(self, module_name): - self.assertRaises(SyntaxError, __import__, 'test.' + module_name) + self.assertRaises(SyntaxError, __import__, 'test.tokenizedata.' + module_name) path = os.path.dirname(__file__) - filename = os.path.join(path, module_name + '.py') + filename = os.path.join(path, 'tokenizedata', module_name + '.py') with open(filename, "rb") as fp: bytes = fp.read() self.assertRaises(SyntaxError, compile, bytes, filename, 'exec') diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 67009a3d2e9c24..9a39dd4a4e5f03 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -2587,16 +2587,17 @@ def tarfilecmd_failure(self, *args): return script_helper.assert_python_failure('-m', 'tarfile', *args) def make_simple_tarfile(self, tar_name): - files = [support.findfile('tokenize_tests.txt'), + files = [support.findfile('tokenize_tests.txt', + subdir='tokenizedata'), support.findfile('tokenize_tests-no-coding-cookie-' - 'and-utf8-bom-sig-only.txt')] + 'and-utf8-bom-sig-only.txt', + subdir='tokenizedata')] self.addCleanup(os_helper.unlink, tar_name) with tarfile.open(tar_name, 'w') as tf: for tardata in files: tf.add(tardata, arcname=os.path.basename(tardata)) def make_evil_tarfile(self, tar_name): - files = [support.findfile('tokenize_tests.txt')] self.addCleanup(os_helper.unlink, tar_name) with tarfile.open(tar_name, 'w') as tf: benign = tarfile.TarInfo('benign') @@ -2677,9 +2678,11 @@ def test_list_command_invalid_file(self): self.assertEqual(rc, 1) def test_create_command(self): - files = [support.findfile('tokenize_tests.txt'), + files = [support.findfile('tokenize_tests.txt', + subdir='tokenizedata'), support.findfile('tokenize_tests-no-coding-cookie-' - 'and-utf8-bom-sig-only.txt')] + 'and-utf8-bom-sig-only.txt', + subdir='tokenizedata')] for opt in '-c', '--create': try: out = self.tarfilecmd(opt, tmpname, *files) @@ -2690,9 +2693,11 @@ def test_create_command(self): os_helper.unlink(tmpname) def test_create_command_verbose(self): - files = [support.findfile('tokenize_tests.txt'), + files = [support.findfile('tokenize_tests.txt', + subdir='tokenizedata'), support.findfile('tokenize_tests-no-coding-cookie-' - 'and-utf8-bom-sig-only.txt')] + 'and-utf8-bom-sig-only.txt', + subdir='tokenizedata')] for opt in '-v', '--verbose': try: out = self.tarfilecmd(opt, '-c', tmpname, *files, @@ -2704,7 +2709,7 @@ def test_create_command_verbose(self): os_helper.unlink(tmpname) def test_create_command_dotless_filename(self): - files = [support.findfile('tokenize_tests.txt')] + files = [support.findfile('tokenize_tests.txt', subdir='tokenizedata')] try: out = self.tarfilecmd('-c', dotlessname, *files) self.assertEqual(out, b'') @@ -2715,7 +2720,7 @@ def test_create_command_dotless_filename(self): def test_create_command_dot_started_filename(self): tar_name = os.path.join(TEMPDIR, ".testtar") - files = [support.findfile('tokenize_tests.txt')] + files = [support.findfile('tokenize_tests.txt', subdir='tokenizedata')] try: out = self.tarfilecmd('-c', tar_name, *files) self.assertEqual(out, b'') @@ -2725,9 +2730,11 @@ def test_create_command_dot_started_filename(self): os_helper.unlink(tar_name) def test_create_command_compressed(self): - files = [support.findfile('tokenize_tests.txt'), + files = [support.findfile('tokenize_tests.txt', + subdir='tokenizedata'), support.findfile('tokenize_tests-no-coding-cookie-' - 'and-utf8-bom-sig-only.txt')] + 'and-utf8-bom-sig-only.txt', + subdir='tokenizedata')] for filetype in (GzipTest, Bz2Test, LzmaTest): if not filetype.open: continue diff --git a/Lib/test/test_tokenize.py b/Lib/test/test_tokenize.py index dbefee655c377c..94fb6d933de114 100644 --- a/Lib/test/test_tokenize.py +++ b/Lib/test/test_tokenize.py @@ -1200,7 +1200,7 @@ class TestTokenizerAdheresToPep0263(TestCase): """ def _testFile(self, filename): - path = os.path.join(os.path.dirname(__file__), filename) + path = os.path.join(os.path.dirname(__file__), 'tokenizedata', filename) with open(path, 'rb') as f: TestRoundtrip.check_roundtrip(self, f) @@ -1794,7 +1794,7 @@ def test_roundtrip(self): self.check_roundtrip("if x == 1 : \n" " print(x)\n") - fn = support.findfile("tokenize_tests.txt") + fn = support.findfile("tokenize_tests.txt", subdir="tokenizedata") with open(fn, 'rb') as f: self.check_roundtrip(f) self.check_roundtrip("if x == 1:\n" @@ -1849,8 +1849,7 @@ def test_random_files(self): # pass the '-ucpu' option to process the full directory. import glob, random - fn = support.findfile("tokenize_tests.txt") - tempdir = os.path.dirname(fn) or os.curdir + tempdir = os.path.dirname(__file__) or os.curdir testfiles = glob.glob(os.path.join(glob.escape(tempdir), "test*.py")) # Tokenize is broken on test_pep3131.py because regular expressions are diff --git a/Lib/test/test_tools/test_reindent.py b/Lib/test/test_tools/test_reindent.py index 3b0c793a38e4da..64e31c2b7703c0 100644 --- a/Lib/test/test_tools/test_reindent.py +++ b/Lib/test/test_tools/test_reindent.py @@ -25,7 +25,7 @@ def test_help(self): self.assertGreater(err, b'') def test_reindent_file_with_bad_encoding(self): - bad_coding_path = findfile('bad_coding.py') + bad_coding_path = findfile('bad_coding.py', subdir='tokenizedata') rc, out, err = assert_python_ok(self.script, '-r', bad_coding_path) self.assertEqual(out, b'') self.assertNotEqual(err, b'') diff --git a/Lib/test/test_unicode_identifiers.py b/Lib/test/test_unicode_identifiers.py index 5b9ced5d1cb837..63c6c055824b20 100644 --- a/Lib/test/test_unicode_identifiers.py +++ b/Lib/test/test_unicode_identifiers.py @@ -19,7 +19,7 @@ def test_non_bmp_normalized(self): def test_invalid(self): try: - from test import badsyntax_3131 + from test.tokenizedata import badsyntax_3131 except SyntaxError as err: self.assertEqual(str(err), "invalid character '€' (U+20AC) (badsyntax_3131.py, line 2)") diff --git a/Lib/test/tokenizedata/__init__.py b/Lib/test/tokenizedata/__init__.py new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/Lib/test/bad_coding.py b/Lib/test/tokenizedata/bad_coding.py similarity index 100% rename from Lib/test/bad_coding.py rename to Lib/test/tokenizedata/bad_coding.py diff --git a/Lib/test/bad_coding2.py b/Lib/test/tokenizedata/bad_coding2.py similarity index 100% rename from Lib/test/bad_coding2.py rename to Lib/test/tokenizedata/bad_coding2.py diff --git a/Lib/test/badsyntax_3131.py b/Lib/test/tokenizedata/badsyntax_3131.py similarity index 100% rename from Lib/test/badsyntax_3131.py rename to Lib/test/tokenizedata/badsyntax_3131.py diff --git a/Lib/test/coding20731.py b/Lib/test/tokenizedata/coding20731.py similarity index 100% rename from Lib/test/coding20731.py rename to Lib/test/tokenizedata/coding20731.py diff --git a/Lib/test/tokenize_tests-latin1-coding-cookie-and-utf8-bom-sig.txt b/Lib/test/tokenizedata/tokenize_tests-latin1-coding-cookie-and-utf8-bom-sig.txt similarity index 100% rename from Lib/test/tokenize_tests-latin1-coding-cookie-and-utf8-bom-sig.txt rename to Lib/test/tokenizedata/tokenize_tests-latin1-coding-cookie-and-utf8-bom-sig.txt diff --git a/Lib/test/tokenize_tests-no-coding-cookie-and-utf8-bom-sig-only.txt b/Lib/test/tokenizedata/tokenize_tests-no-coding-cookie-and-utf8-bom-sig-only.txt similarity index 100% rename from Lib/test/tokenize_tests-no-coding-cookie-and-utf8-bom-sig-only.txt rename to Lib/test/tokenizedata/tokenize_tests-no-coding-cookie-and-utf8-bom-sig-only.txt diff --git a/Lib/test/tokenize_tests-utf8-coding-cookie-and-no-utf8-bom-sig.txt b/Lib/test/tokenizedata/tokenize_tests-utf8-coding-cookie-and-no-utf8-bom-sig.txt similarity index 100% rename from Lib/test/tokenize_tests-utf8-coding-cookie-and-no-utf8-bom-sig.txt rename to Lib/test/tokenizedata/tokenize_tests-utf8-coding-cookie-and-no-utf8-bom-sig.txt diff --git a/Lib/test/tokenize_tests-utf8-coding-cookie-and-utf8-bom-sig.txt b/Lib/test/tokenizedata/tokenize_tests-utf8-coding-cookie-and-utf8-bom-sig.txt similarity index 100% rename from Lib/test/tokenize_tests-utf8-coding-cookie-and-utf8-bom-sig.txt rename to Lib/test/tokenizedata/tokenize_tests-utf8-coding-cookie-and-utf8-bom-sig.txt diff --git a/Lib/test/tokenize_tests.txt b/Lib/test/tokenizedata/tokenize_tests.txt similarity index 100% rename from Lib/test/tokenize_tests.txt rename to Lib/test/tokenizedata/tokenize_tests.txt From 247ee1bf841524667f883ebba5e343101f609026 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Tue, 12 Sep 2023 12:37:22 +0300 Subject: [PATCH 173/357] gh-109216: Fix possible memory leak in `BUILD_MAP` (#109257) --- .../2023-09-11-12-41-42.gh-issue-109216.60QOSb.rst | 1 + Python/bytecodes.c | 3 --- Python/executor_cases.c.h | 3 --- Python/generated_cases.c.h | 3 --- 4 files changed, 1 insertion(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-11-12-41-42.gh-issue-109216.60QOSb.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-11-12-41-42.gh-issue-109216.60QOSb.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-11-12-41-42.gh-issue-109216.60QOSb.rst new file mode 100644 index 00000000000000..aa8b2832af23a5 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-11-12-41-42.gh-issue-109216.60QOSb.rst @@ -0,0 +1 @@ +Fix possible memory leak in :opcode:`BUILD_MAP`. diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 7c49f9a8cc74b1..08d91b5efe51be 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -1600,9 +1600,6 @@ dummy_func( values, 2, values+1, 2, oparg); - if (map == NULL) - goto error; - DECREF_INPUTS(); ERROR_IF(map == NULL, error); } diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index a4d813056aa9f6..8f3febe7d1ab95 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -1433,9 +1433,6 @@ values, 2, values+1, 2, oparg); - if (map == NULL) - goto error; - for (int _i = oparg*2; --_i >= 0;) { Py_DECREF(values[_i]); } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 27cda1f03da68f..b86e35f84fda09 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -2077,9 +2077,6 @@ values, 2, values+1, 2, oparg); - if (map == NULL) - goto error; - for (int _i = oparg*2; --_i >= 0;) { Py_DECREF(values[_i]); } From 8b55adfa8ff05477b4be7def36db7b66c73f181d Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Tue, 12 Sep 2023 11:36:17 +0100 Subject: [PATCH 174/357] gh-109256: allocate opcode IDs for internal opcodes in their own range (#109269) --- Doc/library/dis.rst | 4 +- Include/internal/pycore_opcode_metadata.h | 194 ++++----- Include/opcode_ids.h | 372 +++++++++--------- Lib/_opcode_metadata.py | 372 +++++++++--------- Lib/importlib/_bootstrap_external.py | 3 +- Lib/test/test_dis.py | 352 ++++++++--------- ...-09-11-15-11-03.gh-issue-109256.6mfhvF.rst | 2 + Programs/test_frozenmain.h | 22 +- Python/opcode_targets.h | 142 +++---- Tools/build/deepfreeze.py | 2 +- Tools/cases_generator/generate_cases.py | 34 +- 11 files changed, 757 insertions(+), 742 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-11-15-11-03.gh-issue-109256.6mfhvF.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 6cd5f181c8433a..d929242ede743d 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1611,8 +1611,8 @@ iterations of the loop. opcodes in the range [0,255] which don't use their argument and those that do (``< HAVE_ARGUMENT`` and ``>= HAVE_ARGUMENT``, respectively). - If your application uses pseudo instructions, use the :data:`hasarg` - collection instead. + If your application uses pseudo instructions or specialized instructions, + use the :data:`hasarg` collection instead. .. versionchanged:: 3.6 Now every instruction has an argument, but opcodes ``< HAVE_ARGUMENT`` diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index 05dee089b38160..4086b309375778 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1664,21 +1664,9 @@ const char *const _PyOpcode_OpName[268] = { [RESUME] = "RESUME", [BEFORE_ASYNC_WITH] = "BEFORE_ASYNC_WITH", [BEFORE_WITH] = "BEFORE_WITH", - [BINARY_OP_ADD_FLOAT] = "BINARY_OP_ADD_FLOAT", - [BINARY_OP_ADD_INT] = "BINARY_OP_ADD_INT", - [BINARY_OP_ADD_UNICODE] = "BINARY_OP_ADD_UNICODE", [BINARY_OP_INPLACE_ADD_UNICODE] = "BINARY_OP_INPLACE_ADD_UNICODE", - [BINARY_OP_MULTIPLY_FLOAT] = "BINARY_OP_MULTIPLY_FLOAT", - [BINARY_OP_MULTIPLY_INT] = "BINARY_OP_MULTIPLY_INT", - [BINARY_OP_SUBTRACT_FLOAT] = "BINARY_OP_SUBTRACT_FLOAT", - [BINARY_OP_SUBTRACT_INT] = "BINARY_OP_SUBTRACT_INT", [BINARY_SLICE] = "BINARY_SLICE", [BINARY_SUBSCR] = "BINARY_SUBSCR", - [BINARY_SUBSCR_DICT] = "BINARY_SUBSCR_DICT", - [BINARY_SUBSCR_GETITEM] = "BINARY_SUBSCR_GETITEM", - [BINARY_SUBSCR_LIST_INT] = "BINARY_SUBSCR_LIST_INT", - [BINARY_SUBSCR_STR_INT] = "BINARY_SUBSCR_STR_INT", - [BINARY_SUBSCR_TUPLE_INT] = "BINARY_SUBSCR_TUPLE_INT", [CHECK_EG_MATCH] = "CHECK_EG_MATCH", [CHECK_EXC_MATCH] = "CHECK_EXC_MATCH", [CLEANUP_THROW] = "CLEANUP_THROW", @@ -1707,23 +1695,12 @@ const char *const _PyOpcode_OpName[268] = { [POP_TOP] = "POP_TOP", [PUSH_EXC_INFO] = "PUSH_EXC_INFO", [PUSH_NULL] = "PUSH_NULL", - [RESUME_CHECK] = "RESUME_CHECK", [RETURN_GENERATOR] = "RETURN_GENERATOR", [RETURN_VALUE] = "RETURN_VALUE", [SETUP_ANNOTATIONS] = "SETUP_ANNOTATIONS", - [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE", - [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT", [STORE_SLICE] = "STORE_SLICE", [STORE_SUBSCR] = "STORE_SUBSCR", - [STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT", - [STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT", [TO_BOOL] = "TO_BOOL", - [TO_BOOL_ALWAYS_TRUE] = "TO_BOOL_ALWAYS_TRUE", - [TO_BOOL_BOOL] = "TO_BOOL_BOOL", - [TO_BOOL_INT] = "TO_BOOL_INT", - [TO_BOOL_LIST] = "TO_BOOL_LIST", - [TO_BOOL_NONE] = "TO_BOOL_NONE", - [TO_BOOL_STR] = "TO_BOOL_STR", [UNARY_INVERT] = "UNARY_INVERT", [UNARY_NEGATIVE] = "UNARY_NEGATIVE", [UNARY_NOT] = "UNARY_NOT", @@ -1737,31 +1714,10 @@ const char *const _PyOpcode_OpName[268] = { [BUILD_STRING] = "BUILD_STRING", [BUILD_TUPLE] = "BUILD_TUPLE", [CALL] = "CALL", - [CALL_BOUND_METHOD_EXACT_ARGS] = "CALL_BOUND_METHOD_EXACT_ARGS", - [CALL_BUILTIN_CLASS] = "CALL_BUILTIN_CLASS", - [CALL_BUILTIN_FAST_WITH_KEYWORDS] = "CALL_BUILTIN_FAST_WITH_KEYWORDS", [CALL_FUNCTION_EX] = "CALL_FUNCTION_EX", [CALL_INTRINSIC_1] = "CALL_INTRINSIC_1", [CALL_INTRINSIC_2] = "CALL_INTRINSIC_2", - [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", - [CALL_NO_KW_ALLOC_AND_ENTER_INIT] = "CALL_NO_KW_ALLOC_AND_ENTER_INIT", - [CALL_NO_KW_BUILTIN_FAST] = "CALL_NO_KW_BUILTIN_FAST", - [CALL_NO_KW_BUILTIN_O] = "CALL_NO_KW_BUILTIN_O", - [CALL_NO_KW_ISINSTANCE] = "CALL_NO_KW_ISINSTANCE", - [CALL_NO_KW_LEN] = "CALL_NO_KW_LEN", - [CALL_NO_KW_LIST_APPEND] = "CALL_NO_KW_LIST_APPEND", - [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = "CALL_NO_KW_METHOD_DESCRIPTOR_FAST", - [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = "CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS", - [CALL_NO_KW_METHOD_DESCRIPTOR_O] = "CALL_NO_KW_METHOD_DESCRIPTOR_O", - [CALL_NO_KW_STR_1] = "CALL_NO_KW_STR_1", - [CALL_NO_KW_TUPLE_1] = "CALL_NO_KW_TUPLE_1", - [CALL_NO_KW_TYPE_1] = "CALL_NO_KW_TYPE_1", - [CALL_PY_EXACT_ARGS] = "CALL_PY_EXACT_ARGS", - [CALL_PY_WITH_DEFAULTS] = "CALL_PY_WITH_DEFAULTS", [COMPARE_OP] = "COMPARE_OP", - [COMPARE_OP_FLOAT] = "COMPARE_OP_FLOAT", - [COMPARE_OP_INT] = "COMPARE_OP_INT", - [COMPARE_OP_STR] = "COMPARE_OP_STR", [CONTAINS_OP] = "CONTAINS_OP", [CONVERT_VALUE] = "CONVERT_VALUE", [COPY] = "COPY", @@ -1776,10 +1732,6 @@ const char *const _PyOpcode_OpName[268] = { [ENTER_EXECUTOR] = "ENTER_EXECUTOR", [EXTENDED_ARG] = "EXTENDED_ARG", [FOR_ITER] = "FOR_ITER", - [FOR_ITER_GEN] = "FOR_ITER_GEN", - [FOR_ITER_LIST] = "FOR_ITER_LIST", - [FOR_ITER_RANGE] = "FOR_ITER_RANGE", - [FOR_ITER_TUPLE] = "FOR_ITER_TUPLE", [GET_AWAITABLE] = "GET_AWAITABLE", [IMPORT_FROM] = "IMPORT_FROM", [IMPORT_NAME] = "IMPORT_NAME", @@ -1791,18 +1743,6 @@ const char *const _PyOpcode_OpName[268] = { [LIST_APPEND] = "LIST_APPEND", [LIST_EXTEND] = "LIST_EXTEND", [LOAD_ATTR] = "LOAD_ATTR", - [LOAD_ATTR_CLASS] = "LOAD_ATTR_CLASS", - [LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN", - [LOAD_ATTR_INSTANCE_VALUE] = "LOAD_ATTR_INSTANCE_VALUE", - [LOAD_ATTR_METHOD_LAZY_DICT] = "LOAD_ATTR_METHOD_LAZY_DICT", - [LOAD_ATTR_METHOD_NO_DICT] = "LOAD_ATTR_METHOD_NO_DICT", - [LOAD_ATTR_METHOD_WITH_VALUES] = "LOAD_ATTR_METHOD_WITH_VALUES", - [LOAD_ATTR_MODULE] = "LOAD_ATTR_MODULE", - [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = "LOAD_ATTR_NONDESCRIPTOR_NO_DICT", - [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = "LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES", - [LOAD_ATTR_PROPERTY] = "LOAD_ATTR_PROPERTY", - [LOAD_ATTR_SLOT] = "LOAD_ATTR_SLOT", - [LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT", [LOAD_CONST] = "LOAD_CONST", [LOAD_DEREF] = "LOAD_DEREF", [LOAD_FAST] = "LOAD_FAST", @@ -1812,12 +1752,8 @@ const char *const _PyOpcode_OpName[268] = { [LOAD_FROM_DICT_OR_DEREF] = "LOAD_FROM_DICT_OR_DEREF", [LOAD_FROM_DICT_OR_GLOBALS] = "LOAD_FROM_DICT_OR_GLOBALS", [LOAD_GLOBAL] = "LOAD_GLOBAL", - [LOAD_GLOBAL_BUILTIN] = "LOAD_GLOBAL_BUILTIN", - [LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE", [LOAD_NAME] = "LOAD_NAME", [LOAD_SUPER_ATTR] = "LOAD_SUPER_ATTR", - [LOAD_SUPER_ATTR_ATTR] = "LOAD_SUPER_ATTR_ATTR", - [LOAD_SUPER_ATTR_METHOD] = "LOAD_SUPER_ATTR_METHOD", [MAKE_CELL] = "MAKE_CELL", [MAP_ADD] = "MAP_ADD", [MATCH_CLASS] = "MATCH_CLASS", @@ -1829,12 +1765,10 @@ const char *const _PyOpcode_OpName[268] = { [RERAISE] = "RERAISE", [RETURN_CONST] = "RETURN_CONST", [SEND] = "SEND", - [SEND_GEN] = "SEND_GEN", [SET_ADD] = "SET_ADD", [SET_FUNCTION_ATTRIBUTE] = "SET_FUNCTION_ATTRIBUTE", [SET_UPDATE] = "SET_UPDATE", [STORE_ATTR] = "STORE_ATTR", - [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT", [STORE_DEREF] = "STORE_DEREF", [STORE_FAST] = "STORE_FAST", [STORE_FAST_LOAD_FAST] = "STORE_FAST_LOAD_FAST", @@ -1844,10 +1778,76 @@ const char *const _PyOpcode_OpName[268] = { [SWAP] = "SWAP", [UNPACK_EX] = "UNPACK_EX", [UNPACK_SEQUENCE] = "UNPACK_SEQUENCE", + [YIELD_VALUE] = "YIELD_VALUE", + [BINARY_OP_ADD_FLOAT] = "BINARY_OP_ADD_FLOAT", + [BINARY_OP_ADD_INT] = "BINARY_OP_ADD_INT", + [BINARY_OP_ADD_UNICODE] = "BINARY_OP_ADD_UNICODE", + [BINARY_OP_MULTIPLY_FLOAT] = "BINARY_OP_MULTIPLY_FLOAT", + [BINARY_OP_MULTIPLY_INT] = "BINARY_OP_MULTIPLY_INT", + [BINARY_OP_SUBTRACT_FLOAT] = "BINARY_OP_SUBTRACT_FLOAT", + [BINARY_OP_SUBTRACT_INT] = "BINARY_OP_SUBTRACT_INT", + [BINARY_SUBSCR_DICT] = "BINARY_SUBSCR_DICT", + [BINARY_SUBSCR_GETITEM] = "BINARY_SUBSCR_GETITEM", + [BINARY_SUBSCR_LIST_INT] = "BINARY_SUBSCR_LIST_INT", + [BINARY_SUBSCR_STR_INT] = "BINARY_SUBSCR_STR_INT", + [BINARY_SUBSCR_TUPLE_INT] = "BINARY_SUBSCR_TUPLE_INT", + [CALL_BOUND_METHOD_EXACT_ARGS] = "CALL_BOUND_METHOD_EXACT_ARGS", + [CALL_BUILTIN_CLASS] = "CALL_BUILTIN_CLASS", + [CALL_BUILTIN_FAST_WITH_KEYWORDS] = "CALL_BUILTIN_FAST_WITH_KEYWORDS", + [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", + [CALL_NO_KW_ALLOC_AND_ENTER_INIT] = "CALL_NO_KW_ALLOC_AND_ENTER_INIT", + [CALL_NO_KW_BUILTIN_FAST] = "CALL_NO_KW_BUILTIN_FAST", + [CALL_NO_KW_BUILTIN_O] = "CALL_NO_KW_BUILTIN_O", + [CALL_NO_KW_ISINSTANCE] = "CALL_NO_KW_ISINSTANCE", + [CALL_NO_KW_LEN] = "CALL_NO_KW_LEN", + [CALL_NO_KW_LIST_APPEND] = "CALL_NO_KW_LIST_APPEND", + [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = "CALL_NO_KW_METHOD_DESCRIPTOR_FAST", + [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = "CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS", + [CALL_NO_KW_METHOD_DESCRIPTOR_O] = "CALL_NO_KW_METHOD_DESCRIPTOR_O", + [CALL_NO_KW_STR_1] = "CALL_NO_KW_STR_1", + [CALL_NO_KW_TUPLE_1] = "CALL_NO_KW_TUPLE_1", + [CALL_NO_KW_TYPE_1] = "CALL_NO_KW_TYPE_1", + [CALL_PY_EXACT_ARGS] = "CALL_PY_EXACT_ARGS", + [CALL_PY_WITH_DEFAULTS] = "CALL_PY_WITH_DEFAULTS", + [COMPARE_OP_FLOAT] = "COMPARE_OP_FLOAT", + [COMPARE_OP_INT] = "COMPARE_OP_INT", + [COMPARE_OP_STR] = "COMPARE_OP_STR", + [FOR_ITER_GEN] = "FOR_ITER_GEN", + [FOR_ITER_LIST] = "FOR_ITER_LIST", + [FOR_ITER_RANGE] = "FOR_ITER_RANGE", + [FOR_ITER_TUPLE] = "FOR_ITER_TUPLE", + [LOAD_ATTR_CLASS] = "LOAD_ATTR_CLASS", + [LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN", + [LOAD_ATTR_INSTANCE_VALUE] = "LOAD_ATTR_INSTANCE_VALUE", + [LOAD_ATTR_METHOD_LAZY_DICT] = "LOAD_ATTR_METHOD_LAZY_DICT", + [LOAD_ATTR_METHOD_NO_DICT] = "LOAD_ATTR_METHOD_NO_DICT", + [LOAD_ATTR_METHOD_WITH_VALUES] = "LOAD_ATTR_METHOD_WITH_VALUES", + [LOAD_ATTR_MODULE] = "LOAD_ATTR_MODULE", + [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = "LOAD_ATTR_NONDESCRIPTOR_NO_DICT", + [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = "LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES", + [LOAD_ATTR_PROPERTY] = "LOAD_ATTR_PROPERTY", + [LOAD_ATTR_SLOT] = "LOAD_ATTR_SLOT", + [LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT", + [LOAD_GLOBAL_BUILTIN] = "LOAD_GLOBAL_BUILTIN", + [LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE", + [LOAD_SUPER_ATTR_ATTR] = "LOAD_SUPER_ATTR_ATTR", + [LOAD_SUPER_ATTR_METHOD] = "LOAD_SUPER_ATTR_METHOD", + [RESUME_CHECK] = "RESUME_CHECK", + [SEND_GEN] = "SEND_GEN", + [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE", + [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT", + [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT", + [STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT", + [STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT", + [TO_BOOL_ALWAYS_TRUE] = "TO_BOOL_ALWAYS_TRUE", + [TO_BOOL_BOOL] = "TO_BOOL_BOOL", + [TO_BOOL_INT] = "TO_BOOL_INT", + [TO_BOOL_LIST] = "TO_BOOL_LIST", + [TO_BOOL_NONE] = "TO_BOOL_NONE", + [TO_BOOL_STR] = "TO_BOOL_STR", [UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST", [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE", [UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE", - [YIELD_VALUE] = "YIELD_VALUE", [INSTRUMENTED_RESUME] = "INSTRUMENTED_RESUME", [INSTRUMENTED_END_FOR] = "INSTRUMENTED_END_FOR", [INSTRUMENTED_END_SEND] = "INSTRUMENTED_END_SEND", @@ -2119,36 +2119,36 @@ const uint8_t _PyOpcode_Deopt[256] = { #endif // NEED_OPCODE_METADATA #define EXTRA_CASES \ - case 189: \ - case 190: \ - case 191: \ - case 192: \ - case 193: \ - case 194: \ - case 195: \ - case 196: \ - case 197: \ - case 198: \ - case 199: \ - case 200: \ - case 201: \ - case 202: \ - case 203: \ - case 204: \ - case 205: \ - case 206: \ - case 207: \ - case 208: \ - case 209: \ - case 210: \ - case 211: \ - case 212: \ - case 213: \ - case 214: \ - case 215: \ - case 216: \ - case 217: \ - case 218: \ + case 119: \ + case 120: \ + case 121: \ + case 122: \ + case 123: \ + case 124: \ + case 125: \ + case 126: \ + case 127: \ + case 128: \ + case 129: \ + case 130: \ + case 131: \ + case 132: \ + case 133: \ + case 134: \ + case 135: \ + case 136: \ + case 137: \ + case 138: \ + case 139: \ + case 140: \ + case 141: \ + case 142: \ + case 143: \ + case 144: \ + case 145: \ + case 146: \ + case 147: \ + case 148: \ case 219: \ case 220: \ case 221: \ diff --git a/Include/opcode_ids.h b/Include/opcode_ids.h index eabdf4bc020ef7..8af9684ebb18c1 100644 --- a/Include/opcode_ids.h +++ b/Include/opcode_ids.h @@ -13,193 +13,193 @@ extern "C" { #define CACHE 0 #define BEFORE_ASYNC_WITH 1 #define BEFORE_WITH 2 -#define BINARY_OP_ADD_FLOAT 3 -#define BINARY_OP_ADD_INT 4 -#define BINARY_OP_ADD_UNICODE 5 -#define BINARY_OP_INPLACE_ADD_UNICODE 6 -#define BINARY_OP_MULTIPLY_FLOAT 7 -#define BINARY_OP_MULTIPLY_INT 8 -#define BINARY_OP_SUBTRACT_FLOAT 9 -#define BINARY_OP_SUBTRACT_INT 10 -#define BINARY_SLICE 11 -#define BINARY_SUBSCR 12 -#define BINARY_SUBSCR_DICT 13 -#define BINARY_SUBSCR_GETITEM 14 -#define BINARY_SUBSCR_LIST_INT 15 -#define BINARY_SUBSCR_STR_INT 16 +#define BINARY_OP_INPLACE_ADD_UNICODE 3 +#define BINARY_SLICE 4 +#define BINARY_SUBSCR 5 +#define CHECK_EG_MATCH 6 +#define CHECK_EXC_MATCH 7 +#define CLEANUP_THROW 8 +#define DELETE_SUBSCR 9 +#define END_ASYNC_FOR 10 +#define END_FOR 11 +#define END_SEND 12 +#define EXIT_INIT_CHECK 13 +#define FORMAT_SIMPLE 14 +#define FORMAT_WITH_SPEC 15 +#define GET_AITER 16 #define RESERVED 17 -#define BINARY_SUBSCR_TUPLE_INT 18 -#define CHECK_EG_MATCH 19 -#define CHECK_EXC_MATCH 20 -#define CLEANUP_THROW 21 -#define DELETE_SUBSCR 22 -#define END_ASYNC_FOR 23 -#define END_FOR 24 -#define END_SEND 25 -#define EXIT_INIT_CHECK 26 -#define FORMAT_SIMPLE 27 -#define FORMAT_WITH_SPEC 28 -#define GET_AITER 29 -#define GET_ANEXT 30 -#define GET_ITER 31 -#define GET_LEN 32 -#define GET_YIELD_FROM_ITER 33 -#define INTERPRETER_EXIT 34 -#define LOAD_ASSERTION_ERROR 35 -#define LOAD_BUILD_CLASS 36 -#define LOAD_LOCALS 37 -#define MAKE_FUNCTION 38 -#define MATCH_KEYS 39 -#define MATCH_MAPPING 40 -#define MATCH_SEQUENCE 41 -#define NOP 42 -#define POP_EXCEPT 43 -#define POP_TOP 44 -#define PUSH_EXC_INFO 45 -#define PUSH_NULL 46 -#define RESUME_CHECK 47 -#define RETURN_GENERATOR 48 -#define RETURN_VALUE 49 -#define SETUP_ANNOTATIONS 50 -#define STORE_ATTR_INSTANCE_VALUE 51 -#define STORE_ATTR_SLOT 52 -#define STORE_SLICE 53 -#define STORE_SUBSCR 54 -#define STORE_SUBSCR_DICT 55 -#define STORE_SUBSCR_LIST_INT 56 -#define TO_BOOL 57 -#define TO_BOOL_ALWAYS_TRUE 58 -#define TO_BOOL_BOOL 59 -#define TO_BOOL_INT 60 -#define TO_BOOL_LIST 61 -#define TO_BOOL_NONE 62 -#define TO_BOOL_STR 63 -#define UNARY_INVERT 64 -#define UNARY_NEGATIVE 65 -#define UNARY_NOT 66 -#define WITH_EXCEPT_START 67 -#define HAVE_ARGUMENT 68 -#define BINARY_OP 68 -#define BUILD_CONST_KEY_MAP 69 -#define BUILD_LIST 70 -#define BUILD_MAP 71 -#define BUILD_SET 72 -#define BUILD_SLICE 73 -#define BUILD_STRING 74 -#define BUILD_TUPLE 75 -#define CALL 76 -#define CALL_BOUND_METHOD_EXACT_ARGS 77 -#define CALL_BUILTIN_CLASS 78 -#define CALL_BUILTIN_FAST_WITH_KEYWORDS 79 -#define CALL_FUNCTION_EX 80 -#define CALL_INTRINSIC_1 81 -#define CALL_INTRINSIC_2 82 -#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 83 -#define CALL_NO_KW_ALLOC_AND_ENTER_INIT 84 -#define CALL_NO_KW_BUILTIN_FAST 85 -#define CALL_NO_KW_BUILTIN_O 86 -#define CALL_NO_KW_ISINSTANCE 87 -#define CALL_NO_KW_LEN 88 -#define CALL_NO_KW_LIST_APPEND 89 -#define CALL_NO_KW_METHOD_DESCRIPTOR_FAST 90 -#define CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS 91 -#define CALL_NO_KW_METHOD_DESCRIPTOR_O 92 -#define CALL_NO_KW_STR_1 93 -#define CALL_NO_KW_TUPLE_1 94 -#define CALL_NO_KW_TYPE_1 95 -#define CALL_PY_EXACT_ARGS 96 -#define CALL_PY_WITH_DEFAULTS 97 -#define COMPARE_OP 98 -#define COMPARE_OP_FLOAT 99 -#define COMPARE_OP_INT 100 -#define COMPARE_OP_STR 101 -#define CONTAINS_OP 102 -#define CONVERT_VALUE 103 -#define COPY 104 -#define COPY_FREE_VARS 105 -#define DELETE_ATTR 106 -#define DELETE_DEREF 107 -#define DELETE_FAST 108 -#define DELETE_GLOBAL 109 -#define DELETE_NAME 110 -#define DICT_MERGE 111 -#define DICT_UPDATE 112 -#define ENTER_EXECUTOR 113 -#define EXTENDED_ARG 114 -#define FOR_ITER 115 -#define FOR_ITER_GEN 116 -#define FOR_ITER_LIST 117 -#define FOR_ITER_RANGE 118 -#define FOR_ITER_TUPLE 119 -#define GET_AWAITABLE 120 -#define IMPORT_FROM 121 -#define IMPORT_NAME 122 -#define IS_OP 123 -#define JUMP_BACKWARD 124 -#define JUMP_BACKWARD_NO_INTERRUPT 125 -#define JUMP_FORWARD 126 -#define KW_NAMES 127 -#define LIST_APPEND 128 -#define LIST_EXTEND 129 -#define LOAD_ATTR 130 -#define LOAD_ATTR_CLASS 131 -#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 132 -#define LOAD_ATTR_INSTANCE_VALUE 133 -#define LOAD_ATTR_METHOD_LAZY_DICT 134 -#define LOAD_ATTR_METHOD_NO_DICT 135 -#define LOAD_ATTR_METHOD_WITH_VALUES 136 -#define LOAD_ATTR_MODULE 137 -#define LOAD_ATTR_NONDESCRIPTOR_NO_DICT 138 -#define LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 139 -#define LOAD_ATTR_PROPERTY 140 -#define LOAD_ATTR_SLOT 141 -#define LOAD_ATTR_WITH_HINT 142 -#define LOAD_CONST 143 -#define LOAD_DEREF 144 -#define LOAD_FAST 145 -#define LOAD_FAST_AND_CLEAR 146 -#define LOAD_FAST_CHECK 147 -#define LOAD_FAST_LOAD_FAST 148 -#define LOAD_FROM_DICT_OR_DEREF 149 -#define LOAD_FROM_DICT_OR_GLOBALS 150 -#define LOAD_GLOBAL 151 -#define LOAD_GLOBAL_BUILTIN 152 -#define LOAD_GLOBAL_MODULE 153 -#define LOAD_NAME 154 -#define LOAD_SUPER_ATTR 155 -#define LOAD_SUPER_ATTR_ATTR 156 -#define LOAD_SUPER_ATTR_METHOD 157 -#define MAKE_CELL 158 -#define MAP_ADD 159 -#define MATCH_CLASS 160 -#define POP_JUMP_IF_FALSE 161 -#define POP_JUMP_IF_NONE 162 -#define POP_JUMP_IF_NOT_NONE 163 -#define POP_JUMP_IF_TRUE 164 -#define RAISE_VARARGS 165 -#define RESUME 166 -#define RERAISE 167 -#define RETURN_CONST 168 -#define SEND 169 -#define SEND_GEN 170 -#define SET_ADD 171 -#define SET_FUNCTION_ATTRIBUTE 172 -#define SET_UPDATE 173 -#define STORE_ATTR 174 -#define STORE_ATTR_WITH_HINT 175 -#define STORE_DEREF 176 -#define STORE_FAST 177 -#define STORE_FAST_LOAD_FAST 178 -#define STORE_FAST_STORE_FAST 179 -#define STORE_GLOBAL 180 -#define STORE_NAME 181 -#define SWAP 182 -#define UNPACK_EX 183 -#define UNPACK_SEQUENCE 184 -#define UNPACK_SEQUENCE_LIST 185 -#define UNPACK_SEQUENCE_TUPLE 186 -#define UNPACK_SEQUENCE_TWO_TUPLE 187 -#define YIELD_VALUE 188 +#define GET_ANEXT 18 +#define GET_ITER 19 +#define GET_LEN 20 +#define GET_YIELD_FROM_ITER 21 +#define INTERPRETER_EXIT 22 +#define LOAD_ASSERTION_ERROR 23 +#define LOAD_BUILD_CLASS 24 +#define LOAD_LOCALS 25 +#define MAKE_FUNCTION 26 +#define MATCH_KEYS 27 +#define MATCH_MAPPING 28 +#define MATCH_SEQUENCE 29 +#define NOP 30 +#define POP_EXCEPT 31 +#define POP_TOP 32 +#define PUSH_EXC_INFO 33 +#define PUSH_NULL 34 +#define RETURN_GENERATOR 35 +#define RETURN_VALUE 36 +#define SETUP_ANNOTATIONS 37 +#define STORE_SLICE 38 +#define STORE_SUBSCR 39 +#define TO_BOOL 40 +#define UNARY_INVERT 41 +#define UNARY_NEGATIVE 42 +#define UNARY_NOT 43 +#define WITH_EXCEPT_START 44 +#define HAVE_ARGUMENT 45 +#define BINARY_OP 45 +#define BUILD_CONST_KEY_MAP 46 +#define BUILD_LIST 47 +#define BUILD_MAP 48 +#define BUILD_SET 49 +#define BUILD_SLICE 50 +#define BUILD_STRING 51 +#define BUILD_TUPLE 52 +#define CALL 53 +#define CALL_FUNCTION_EX 54 +#define CALL_INTRINSIC_1 55 +#define CALL_INTRINSIC_2 56 +#define COMPARE_OP 57 +#define CONTAINS_OP 58 +#define CONVERT_VALUE 59 +#define COPY 60 +#define COPY_FREE_VARS 61 +#define DELETE_ATTR 62 +#define DELETE_DEREF 63 +#define DELETE_FAST 64 +#define DELETE_GLOBAL 65 +#define DELETE_NAME 66 +#define DICT_MERGE 67 +#define DICT_UPDATE 68 +#define ENTER_EXECUTOR 69 +#define EXTENDED_ARG 70 +#define FOR_ITER 71 +#define GET_AWAITABLE 72 +#define IMPORT_FROM 73 +#define IMPORT_NAME 74 +#define IS_OP 75 +#define JUMP_BACKWARD 76 +#define JUMP_BACKWARD_NO_INTERRUPT 77 +#define JUMP_FORWARD 78 +#define KW_NAMES 79 +#define LIST_APPEND 80 +#define LIST_EXTEND 81 +#define LOAD_ATTR 82 +#define LOAD_CONST 83 +#define LOAD_DEREF 84 +#define LOAD_FAST 85 +#define LOAD_FAST_AND_CLEAR 86 +#define LOAD_FAST_CHECK 87 +#define LOAD_FAST_LOAD_FAST 88 +#define LOAD_FROM_DICT_OR_DEREF 89 +#define LOAD_FROM_DICT_OR_GLOBALS 90 +#define LOAD_GLOBAL 91 +#define LOAD_NAME 92 +#define LOAD_SUPER_ATTR 93 +#define MAKE_CELL 94 +#define MAP_ADD 95 +#define MATCH_CLASS 96 +#define POP_JUMP_IF_FALSE 97 +#define POP_JUMP_IF_NONE 98 +#define POP_JUMP_IF_NOT_NONE 99 +#define POP_JUMP_IF_TRUE 100 +#define RAISE_VARARGS 101 +#define RERAISE 102 +#define RETURN_CONST 103 +#define SEND 104 +#define SET_ADD 105 +#define SET_FUNCTION_ATTRIBUTE 106 +#define SET_UPDATE 107 +#define STORE_ATTR 108 +#define STORE_DEREF 109 +#define STORE_FAST 110 +#define STORE_FAST_LOAD_FAST 111 +#define STORE_FAST_STORE_FAST 112 +#define STORE_GLOBAL 113 +#define STORE_NAME 114 +#define SWAP 115 +#define UNPACK_EX 116 +#define UNPACK_SEQUENCE 117 +#define YIELD_VALUE 118 +#define RESUME 149 +#define BINARY_OP_ADD_FLOAT 150 +#define BINARY_OP_ADD_INT 151 +#define BINARY_OP_ADD_UNICODE 152 +#define BINARY_OP_MULTIPLY_FLOAT 153 +#define BINARY_OP_MULTIPLY_INT 154 +#define BINARY_OP_SUBTRACT_FLOAT 155 +#define BINARY_OP_SUBTRACT_INT 156 +#define BINARY_SUBSCR_DICT 157 +#define BINARY_SUBSCR_GETITEM 158 +#define BINARY_SUBSCR_LIST_INT 159 +#define BINARY_SUBSCR_STR_INT 160 +#define BINARY_SUBSCR_TUPLE_INT 161 +#define CALL_BOUND_METHOD_EXACT_ARGS 162 +#define CALL_BUILTIN_CLASS 163 +#define CALL_BUILTIN_FAST_WITH_KEYWORDS 164 +#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 165 +#define CALL_NO_KW_ALLOC_AND_ENTER_INIT 166 +#define CALL_NO_KW_BUILTIN_FAST 167 +#define CALL_NO_KW_BUILTIN_O 168 +#define CALL_NO_KW_ISINSTANCE 169 +#define CALL_NO_KW_LEN 170 +#define CALL_NO_KW_LIST_APPEND 171 +#define CALL_NO_KW_METHOD_DESCRIPTOR_FAST 172 +#define CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS 173 +#define CALL_NO_KW_METHOD_DESCRIPTOR_O 174 +#define CALL_NO_KW_STR_1 175 +#define CALL_NO_KW_TUPLE_1 176 +#define CALL_NO_KW_TYPE_1 177 +#define CALL_PY_EXACT_ARGS 178 +#define CALL_PY_WITH_DEFAULTS 179 +#define COMPARE_OP_FLOAT 180 +#define COMPARE_OP_INT 181 +#define COMPARE_OP_STR 182 +#define FOR_ITER_GEN 183 +#define FOR_ITER_LIST 184 +#define FOR_ITER_RANGE 185 +#define FOR_ITER_TUPLE 186 +#define LOAD_ATTR_CLASS 187 +#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 188 +#define LOAD_ATTR_INSTANCE_VALUE 189 +#define LOAD_ATTR_METHOD_LAZY_DICT 190 +#define LOAD_ATTR_METHOD_NO_DICT 191 +#define LOAD_ATTR_METHOD_WITH_VALUES 192 +#define LOAD_ATTR_MODULE 193 +#define LOAD_ATTR_NONDESCRIPTOR_NO_DICT 194 +#define LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 195 +#define LOAD_ATTR_PROPERTY 196 +#define LOAD_ATTR_SLOT 197 +#define LOAD_ATTR_WITH_HINT 198 +#define LOAD_GLOBAL_BUILTIN 199 +#define LOAD_GLOBAL_MODULE 200 +#define LOAD_SUPER_ATTR_ATTR 201 +#define LOAD_SUPER_ATTR_METHOD 202 +#define RESUME_CHECK 203 +#define SEND_GEN 204 +#define STORE_ATTR_INSTANCE_VALUE 205 +#define STORE_ATTR_SLOT 206 +#define STORE_ATTR_WITH_HINT 207 +#define STORE_SUBSCR_DICT 208 +#define STORE_SUBSCR_LIST_INT 209 +#define TO_BOOL_ALWAYS_TRUE 210 +#define TO_BOOL_BOOL 211 +#define TO_BOOL_INT 212 +#define TO_BOOL_LIST 213 +#define TO_BOOL_NONE 214 +#define TO_BOOL_STR 215 +#define UNPACK_SEQUENCE_LIST 216 +#define UNPACK_SEQUENCE_TUPLE 217 +#define UNPACK_SEQUENCE_TWO_TUPLE 218 #define MIN_INSTRUMENTED_OPCODE 237 #define INSTRUMENTED_RESUME 237 #define INSTRUMENTED_END_FOR 238 diff --git a/Lib/_opcode_metadata.py b/Lib/_opcode_metadata.py index 20975ffb4c5321..4f76371dae28d1 100644 --- a/Lib/_opcode_metadata.py +++ b/Lib/_opcode_metadata.py @@ -107,198 +107,198 @@ _specializations["BINARY_OP"].append("BINARY_OP_INPLACE_ADD_UNICODE") _specialized_opmap = { - 'BINARY_OP_ADD_FLOAT': 3, - 'BINARY_OP_ADD_INT': 4, - 'BINARY_OP_ADD_UNICODE': 5, - 'BINARY_OP_INPLACE_ADD_UNICODE': 6, - 'BINARY_OP_MULTIPLY_FLOAT': 7, - 'BINARY_OP_MULTIPLY_INT': 8, - 'BINARY_OP_SUBTRACT_FLOAT': 9, - 'BINARY_OP_SUBTRACT_INT': 10, - 'BINARY_SUBSCR_DICT': 13, - 'BINARY_SUBSCR_GETITEM': 14, - 'BINARY_SUBSCR_LIST_INT': 15, - 'BINARY_SUBSCR_STR_INT': 16, - 'BINARY_SUBSCR_TUPLE_INT': 18, - 'RESUME_CHECK': 47, - 'STORE_ATTR_INSTANCE_VALUE': 51, - 'STORE_ATTR_SLOT': 52, - 'STORE_SUBSCR_DICT': 55, - 'STORE_SUBSCR_LIST_INT': 56, - 'TO_BOOL_ALWAYS_TRUE': 58, - 'TO_BOOL_BOOL': 59, - 'TO_BOOL_INT': 60, - 'TO_BOOL_LIST': 61, - 'TO_BOOL_NONE': 62, - 'TO_BOOL_STR': 63, - 'CALL_BOUND_METHOD_EXACT_ARGS': 77, - 'CALL_BUILTIN_CLASS': 78, - 'CALL_BUILTIN_FAST_WITH_KEYWORDS': 79, - 'CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS': 83, - 'CALL_NO_KW_ALLOC_AND_ENTER_INIT': 84, - 'CALL_NO_KW_BUILTIN_FAST': 85, - 'CALL_NO_KW_BUILTIN_O': 86, - 'CALL_NO_KW_ISINSTANCE': 87, - 'CALL_NO_KW_LEN': 88, - 'CALL_NO_KW_LIST_APPEND': 89, - 'CALL_NO_KW_METHOD_DESCRIPTOR_FAST': 90, - 'CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS': 91, - 'CALL_NO_KW_METHOD_DESCRIPTOR_O': 92, - 'CALL_NO_KW_STR_1': 93, - 'CALL_NO_KW_TUPLE_1': 94, - 'CALL_NO_KW_TYPE_1': 95, - 'CALL_PY_EXACT_ARGS': 96, - 'CALL_PY_WITH_DEFAULTS': 97, - 'COMPARE_OP_FLOAT': 99, - 'COMPARE_OP_INT': 100, - 'COMPARE_OP_STR': 101, - 'FOR_ITER_GEN': 116, - 'FOR_ITER_LIST': 117, - 'FOR_ITER_RANGE': 118, - 'FOR_ITER_TUPLE': 119, - 'LOAD_ATTR_CLASS': 131, - 'LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN': 132, - 'LOAD_ATTR_INSTANCE_VALUE': 133, - 'LOAD_ATTR_METHOD_LAZY_DICT': 134, - 'LOAD_ATTR_METHOD_NO_DICT': 135, - 'LOAD_ATTR_METHOD_WITH_VALUES': 136, - 'LOAD_ATTR_MODULE': 137, - 'LOAD_ATTR_NONDESCRIPTOR_NO_DICT': 138, - 'LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES': 139, - 'LOAD_ATTR_PROPERTY': 140, - 'LOAD_ATTR_SLOT': 141, - 'LOAD_ATTR_WITH_HINT': 142, - 'LOAD_GLOBAL_BUILTIN': 152, - 'LOAD_GLOBAL_MODULE': 153, - 'LOAD_SUPER_ATTR_ATTR': 156, - 'LOAD_SUPER_ATTR_METHOD': 157, - 'SEND_GEN': 170, - 'STORE_ATTR_WITH_HINT': 175, - 'UNPACK_SEQUENCE_LIST': 185, - 'UNPACK_SEQUENCE_TUPLE': 186, - 'UNPACK_SEQUENCE_TWO_TUPLE': 187, + 'BINARY_OP_INPLACE_ADD_UNICODE': 3, + 'BINARY_OP_ADD_FLOAT': 150, + 'BINARY_OP_ADD_INT': 151, + 'BINARY_OP_ADD_UNICODE': 152, + 'BINARY_OP_MULTIPLY_FLOAT': 153, + 'BINARY_OP_MULTIPLY_INT': 154, + 'BINARY_OP_SUBTRACT_FLOAT': 155, + 'BINARY_OP_SUBTRACT_INT': 156, + 'BINARY_SUBSCR_DICT': 157, + 'BINARY_SUBSCR_GETITEM': 158, + 'BINARY_SUBSCR_LIST_INT': 159, + 'BINARY_SUBSCR_STR_INT': 160, + 'BINARY_SUBSCR_TUPLE_INT': 161, + 'CALL_BOUND_METHOD_EXACT_ARGS': 162, + 'CALL_BUILTIN_CLASS': 163, + 'CALL_BUILTIN_FAST_WITH_KEYWORDS': 164, + 'CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS': 165, + 'CALL_NO_KW_ALLOC_AND_ENTER_INIT': 166, + 'CALL_NO_KW_BUILTIN_FAST': 167, + 'CALL_NO_KW_BUILTIN_O': 168, + 'CALL_NO_KW_ISINSTANCE': 169, + 'CALL_NO_KW_LEN': 170, + 'CALL_NO_KW_LIST_APPEND': 171, + 'CALL_NO_KW_METHOD_DESCRIPTOR_FAST': 172, + 'CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS': 173, + 'CALL_NO_KW_METHOD_DESCRIPTOR_O': 174, + 'CALL_NO_KW_STR_1': 175, + 'CALL_NO_KW_TUPLE_1': 176, + 'CALL_NO_KW_TYPE_1': 177, + 'CALL_PY_EXACT_ARGS': 178, + 'CALL_PY_WITH_DEFAULTS': 179, + 'COMPARE_OP_FLOAT': 180, + 'COMPARE_OP_INT': 181, + 'COMPARE_OP_STR': 182, + 'FOR_ITER_GEN': 183, + 'FOR_ITER_LIST': 184, + 'FOR_ITER_RANGE': 185, + 'FOR_ITER_TUPLE': 186, + 'LOAD_ATTR_CLASS': 187, + 'LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN': 188, + 'LOAD_ATTR_INSTANCE_VALUE': 189, + 'LOAD_ATTR_METHOD_LAZY_DICT': 190, + 'LOAD_ATTR_METHOD_NO_DICT': 191, + 'LOAD_ATTR_METHOD_WITH_VALUES': 192, + 'LOAD_ATTR_MODULE': 193, + 'LOAD_ATTR_NONDESCRIPTOR_NO_DICT': 194, + 'LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES': 195, + 'LOAD_ATTR_PROPERTY': 196, + 'LOAD_ATTR_SLOT': 197, + 'LOAD_ATTR_WITH_HINT': 198, + 'LOAD_GLOBAL_BUILTIN': 199, + 'LOAD_GLOBAL_MODULE': 200, + 'LOAD_SUPER_ATTR_ATTR': 201, + 'LOAD_SUPER_ATTR_METHOD': 202, + 'RESUME_CHECK': 203, + 'SEND_GEN': 204, + 'STORE_ATTR_INSTANCE_VALUE': 205, + 'STORE_ATTR_SLOT': 206, + 'STORE_ATTR_WITH_HINT': 207, + 'STORE_SUBSCR_DICT': 208, + 'STORE_SUBSCR_LIST_INT': 209, + 'TO_BOOL_ALWAYS_TRUE': 210, + 'TO_BOOL_BOOL': 211, + 'TO_BOOL_INT': 212, + 'TO_BOOL_LIST': 213, + 'TO_BOOL_NONE': 214, + 'TO_BOOL_STR': 215, + 'UNPACK_SEQUENCE_LIST': 216, + 'UNPACK_SEQUENCE_TUPLE': 217, + 'UNPACK_SEQUENCE_TWO_TUPLE': 218, } opmap = { 'CACHE': 0, 'BEFORE_ASYNC_WITH': 1, 'BEFORE_WITH': 2, - 'BINARY_SLICE': 11, - 'BINARY_SUBSCR': 12, + 'BINARY_SLICE': 4, + 'BINARY_SUBSCR': 5, + 'CHECK_EG_MATCH': 6, + 'CHECK_EXC_MATCH': 7, + 'CLEANUP_THROW': 8, + 'DELETE_SUBSCR': 9, + 'END_ASYNC_FOR': 10, + 'END_FOR': 11, + 'END_SEND': 12, + 'EXIT_INIT_CHECK': 13, + 'FORMAT_SIMPLE': 14, + 'FORMAT_WITH_SPEC': 15, + 'GET_AITER': 16, 'RESERVED': 17, - 'CHECK_EG_MATCH': 19, - 'CHECK_EXC_MATCH': 20, - 'CLEANUP_THROW': 21, - 'DELETE_SUBSCR': 22, - 'END_ASYNC_FOR': 23, - 'END_FOR': 24, - 'END_SEND': 25, - 'EXIT_INIT_CHECK': 26, - 'FORMAT_SIMPLE': 27, - 'FORMAT_WITH_SPEC': 28, - 'GET_AITER': 29, - 'GET_ANEXT': 30, - 'GET_ITER': 31, - 'GET_LEN': 32, - 'GET_YIELD_FROM_ITER': 33, - 'INTERPRETER_EXIT': 34, - 'LOAD_ASSERTION_ERROR': 35, - 'LOAD_BUILD_CLASS': 36, - 'LOAD_LOCALS': 37, - 'MAKE_FUNCTION': 38, - 'MATCH_KEYS': 39, - 'MATCH_MAPPING': 40, - 'MATCH_SEQUENCE': 41, - 'NOP': 42, - 'POP_EXCEPT': 43, - 'POP_TOP': 44, - 'PUSH_EXC_INFO': 45, - 'PUSH_NULL': 46, - 'RETURN_GENERATOR': 48, - 'RETURN_VALUE': 49, - 'SETUP_ANNOTATIONS': 50, - 'STORE_SLICE': 53, - 'STORE_SUBSCR': 54, - 'TO_BOOL': 57, - 'UNARY_INVERT': 64, - 'UNARY_NEGATIVE': 65, - 'UNARY_NOT': 66, - 'WITH_EXCEPT_START': 67, - 'BINARY_OP': 68, - 'BUILD_CONST_KEY_MAP': 69, - 'BUILD_LIST': 70, - 'BUILD_MAP': 71, - 'BUILD_SET': 72, - 'BUILD_SLICE': 73, - 'BUILD_STRING': 74, - 'BUILD_TUPLE': 75, - 'CALL': 76, - 'CALL_FUNCTION_EX': 80, - 'CALL_INTRINSIC_1': 81, - 'CALL_INTRINSIC_2': 82, - 'COMPARE_OP': 98, - 'CONTAINS_OP': 102, - 'CONVERT_VALUE': 103, - 'COPY': 104, - 'COPY_FREE_VARS': 105, - 'DELETE_ATTR': 106, - 'DELETE_DEREF': 107, - 'DELETE_FAST': 108, - 'DELETE_GLOBAL': 109, - 'DELETE_NAME': 110, - 'DICT_MERGE': 111, - 'DICT_UPDATE': 112, - 'ENTER_EXECUTOR': 113, - 'EXTENDED_ARG': 114, - 'FOR_ITER': 115, - 'GET_AWAITABLE': 120, - 'IMPORT_FROM': 121, - 'IMPORT_NAME': 122, - 'IS_OP': 123, - 'JUMP_BACKWARD': 124, - 'JUMP_BACKWARD_NO_INTERRUPT': 125, - 'JUMP_FORWARD': 126, - 'KW_NAMES': 127, - 'LIST_APPEND': 128, - 'LIST_EXTEND': 129, - 'LOAD_ATTR': 130, - 'LOAD_CONST': 143, - 'LOAD_DEREF': 144, - 'LOAD_FAST': 145, - 'LOAD_FAST_AND_CLEAR': 146, - 'LOAD_FAST_CHECK': 147, - 'LOAD_FAST_LOAD_FAST': 148, - 'LOAD_FROM_DICT_OR_DEREF': 149, - 'LOAD_FROM_DICT_OR_GLOBALS': 150, - 'LOAD_GLOBAL': 151, - 'LOAD_NAME': 154, - 'LOAD_SUPER_ATTR': 155, - 'MAKE_CELL': 158, - 'MAP_ADD': 159, - 'MATCH_CLASS': 160, - 'POP_JUMP_IF_FALSE': 161, - 'POP_JUMP_IF_NONE': 162, - 'POP_JUMP_IF_NOT_NONE': 163, - 'POP_JUMP_IF_TRUE': 164, - 'RAISE_VARARGS': 165, - 'RESUME': 166, - 'RERAISE': 167, - 'RETURN_CONST': 168, - 'SEND': 169, - 'SET_ADD': 171, - 'SET_FUNCTION_ATTRIBUTE': 172, - 'SET_UPDATE': 173, - 'STORE_ATTR': 174, - 'STORE_DEREF': 176, - 'STORE_FAST': 177, - 'STORE_FAST_LOAD_FAST': 178, - 'STORE_FAST_STORE_FAST': 179, - 'STORE_GLOBAL': 180, - 'STORE_NAME': 181, - 'SWAP': 182, - 'UNPACK_EX': 183, - 'UNPACK_SEQUENCE': 184, - 'YIELD_VALUE': 188, + 'GET_ANEXT': 18, + 'GET_ITER': 19, + 'GET_LEN': 20, + 'GET_YIELD_FROM_ITER': 21, + 'INTERPRETER_EXIT': 22, + 'LOAD_ASSERTION_ERROR': 23, + 'LOAD_BUILD_CLASS': 24, + 'LOAD_LOCALS': 25, + 'MAKE_FUNCTION': 26, + 'MATCH_KEYS': 27, + 'MATCH_MAPPING': 28, + 'MATCH_SEQUENCE': 29, + 'NOP': 30, + 'POP_EXCEPT': 31, + 'POP_TOP': 32, + 'PUSH_EXC_INFO': 33, + 'PUSH_NULL': 34, + 'RETURN_GENERATOR': 35, + 'RETURN_VALUE': 36, + 'SETUP_ANNOTATIONS': 37, + 'STORE_SLICE': 38, + 'STORE_SUBSCR': 39, + 'TO_BOOL': 40, + 'UNARY_INVERT': 41, + 'UNARY_NEGATIVE': 42, + 'UNARY_NOT': 43, + 'WITH_EXCEPT_START': 44, + 'BINARY_OP': 45, + 'BUILD_CONST_KEY_MAP': 46, + 'BUILD_LIST': 47, + 'BUILD_MAP': 48, + 'BUILD_SET': 49, + 'BUILD_SLICE': 50, + 'BUILD_STRING': 51, + 'BUILD_TUPLE': 52, + 'CALL': 53, + 'CALL_FUNCTION_EX': 54, + 'CALL_INTRINSIC_1': 55, + 'CALL_INTRINSIC_2': 56, + 'COMPARE_OP': 57, + 'CONTAINS_OP': 58, + 'CONVERT_VALUE': 59, + 'COPY': 60, + 'COPY_FREE_VARS': 61, + 'DELETE_ATTR': 62, + 'DELETE_DEREF': 63, + 'DELETE_FAST': 64, + 'DELETE_GLOBAL': 65, + 'DELETE_NAME': 66, + 'DICT_MERGE': 67, + 'DICT_UPDATE': 68, + 'ENTER_EXECUTOR': 69, + 'EXTENDED_ARG': 70, + 'FOR_ITER': 71, + 'GET_AWAITABLE': 72, + 'IMPORT_FROM': 73, + 'IMPORT_NAME': 74, + 'IS_OP': 75, + 'JUMP_BACKWARD': 76, + 'JUMP_BACKWARD_NO_INTERRUPT': 77, + 'JUMP_FORWARD': 78, + 'KW_NAMES': 79, + 'LIST_APPEND': 80, + 'LIST_EXTEND': 81, + 'LOAD_ATTR': 82, + 'LOAD_CONST': 83, + 'LOAD_DEREF': 84, + 'LOAD_FAST': 85, + 'LOAD_FAST_AND_CLEAR': 86, + 'LOAD_FAST_CHECK': 87, + 'LOAD_FAST_LOAD_FAST': 88, + 'LOAD_FROM_DICT_OR_DEREF': 89, + 'LOAD_FROM_DICT_OR_GLOBALS': 90, + 'LOAD_GLOBAL': 91, + 'LOAD_NAME': 92, + 'LOAD_SUPER_ATTR': 93, + 'MAKE_CELL': 94, + 'MAP_ADD': 95, + 'MATCH_CLASS': 96, + 'POP_JUMP_IF_FALSE': 97, + 'POP_JUMP_IF_NONE': 98, + 'POP_JUMP_IF_NOT_NONE': 99, + 'POP_JUMP_IF_TRUE': 100, + 'RAISE_VARARGS': 101, + 'RERAISE': 102, + 'RETURN_CONST': 103, + 'SEND': 104, + 'SET_ADD': 105, + 'SET_FUNCTION_ATTRIBUTE': 106, + 'SET_UPDATE': 107, + 'STORE_ATTR': 108, + 'STORE_DEREF': 109, + 'STORE_FAST': 110, + 'STORE_FAST_LOAD_FAST': 111, + 'STORE_FAST_STORE_FAST': 112, + 'STORE_GLOBAL': 113, + 'STORE_NAME': 114, + 'SWAP': 115, + 'UNPACK_EX': 116, + 'UNPACK_SEQUENCE': 117, + 'YIELD_VALUE': 118, + 'RESUME': 149, 'INSTRUMENTED_RESUME': 237, 'INSTRUMENTED_END_FOR': 238, 'INSTRUMENTED_END_SEND': 239, @@ -331,4 +331,4 @@ 'STORE_FAST_MAYBE_NULL': 267, } MIN_INSTRUMENTED_OPCODE = 237 -HAVE_ARGUMENT = 68 +HAVE_ARGUMENT = 45 diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 843af300500169..d671d1799884e2 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -457,6 +457,7 @@ def _write_atomic(path, data, mode=0o666): # Python 3.13a1 3559 (Generate opcode IDs from bytecodes.c) # Python 3.13a1 3560 (Add RESUME_CHECK instruction) # Python 3.13a1 3561 (Add cache entry to branch instructions) +# Python 3.13a1 3562 (Assign opcode IDs for internal ops in separate range) # Python 3.14 will start with 3600 @@ -473,7 +474,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3561).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3562).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index c3ad105fb2a3b5..0f066d8294261d 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -1641,197 +1641,197 @@ def _prepare_test_cases(): Instruction = dis.Instruction expected_opinfo_outer = [ - Instruction(opname='MAKE_CELL', opcode=158, arg=0, argval='a', argrepr='a', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='MAKE_CELL', opcode=158, arg=1, argval='b', argrepr='b', offset=2, start_offset=2, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='RESUME', opcode=166, arg=0, argval=0, argrepr='', offset=4, start_offset=4, starts_line=True, line_number=1, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=5, argval=(3, 4), argrepr='(3, 4)', offset=6, start_offset=6, starts_line=True, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='a', argrepr='a', offset=8, start_offset=8, starts_line=False, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=1, argval='b', argrepr='b', offset=10, start_offset=10, starts_line=False, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='BUILD_TUPLE', opcode=75, arg=2, argval=2, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=1, argval=code_object_f, argrepr=repr(code_object_f), offset=14, start_offset=14, starts_line=False, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='MAKE_FUNCTION', opcode=38, arg=None, argval=None, argrepr='', offset=16, start_offset=16, starts_line=False, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=172, arg=8, argval=8, argrepr='closure', offset=18, start_offset=18, starts_line=False, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=172, arg=1, argval=1, argrepr='defaults', offset=20, start_offset=20, starts_line=False, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=177, arg=2, argval='f', argrepr='f', offset=22, start_offset=22, starts_line=False, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=1, argval='print', argrepr='print + NULL', offset=24, start_offset=24, starts_line=True, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=144, arg=0, argval='a', argrepr='a', offset=34, start_offset=34, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=144, arg=1, argval='b', argrepr='b', offset=36, start_offset=36, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=2, argval='', argrepr="''", offset=38, start_offset=38, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=3, argval=1, argrepr='1', offset=40, start_offset=40, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='BUILD_LIST', opcode=70, arg=0, argval=0, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='BUILD_MAP', opcode=71, arg=0, argval=0, argrepr='', offset=44, start_offset=44, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=4, argval='Hello world!', argrepr="'Hello world!'", offset=46, start_offset=46, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=7, argval=7, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=2, argval='f', argrepr='f', offset=58, start_offset=58, starts_line=True, line_number=8, is_jump_target=False, positions=None), - Instruction(opname='RETURN_VALUE', opcode=49, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=8, is_jump_target=False, positions=None), + Instruction(opname='MAKE_CELL', opcode=94, arg=0, argval='a', argrepr='a', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='MAKE_CELL', opcode=94, arg=1, argval='b', argrepr='b', offset=2, start_offset=2, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=4, start_offset=4, starts_line=True, line_number=1, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=5, argval=(3, 4), argrepr='(3, 4)', offset=6, start_offset=6, starts_line=True, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='a', argrepr='a', offset=8, start_offset=8, starts_line=False, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=1, argval='b', argrepr='b', offset=10, start_offset=10, starts_line=False, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='BUILD_TUPLE', opcode=52, arg=2, argval=2, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=1, argval=code_object_f, argrepr=repr(code_object_f), offset=14, start_offset=14, starts_line=False, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='MAKE_FUNCTION', opcode=26, arg=None, argval=None, argrepr='', offset=16, start_offset=16, starts_line=False, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=106, arg=8, argval=8, argrepr='closure', offset=18, start_offset=18, starts_line=False, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=106, arg=1, argval=1, argrepr='defaults', offset=20, start_offset=20, starts_line=False, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=110, arg=2, argval='f', argrepr='f', offset=22, start_offset=22, starts_line=False, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=91, arg=1, argval='print', argrepr='print + NULL', offset=24, start_offset=24, starts_line=True, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=84, arg=0, argval='a', argrepr='a', offset=34, start_offset=34, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=84, arg=1, argval='b', argrepr='b', offset=36, start_offset=36, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=2, argval='', argrepr="''", offset=38, start_offset=38, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=3, argval=1, argrepr='1', offset=40, start_offset=40, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='BUILD_LIST', opcode=47, arg=0, argval=0, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='BUILD_MAP', opcode=48, arg=0, argval=0, argrepr='', offset=44, start_offset=44, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=4, argval='Hello world!', argrepr="'Hello world!'", offset=46, start_offset=46, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=53, arg=7, argval=7, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=2, argval='f', argrepr='f', offset=58, start_offset=58, starts_line=True, line_number=8, is_jump_target=False, positions=None), + Instruction(opname='RETURN_VALUE', opcode=36, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=8, is_jump_target=False, positions=None), ] expected_opinfo_f = [ - Instruction(opname='COPY_FREE_VARS', opcode=105, arg=2, argval=2, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='MAKE_CELL', opcode=158, arg=0, argval='c', argrepr='c', offset=2, start_offset=2, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='MAKE_CELL', opcode=158, arg=1, argval='d', argrepr='d', offset=4, start_offset=4, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='RESUME', opcode=166, arg=0, argval=0, argrepr='', offset=6, start_offset=6, starts_line=True, line_number=2, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=2, argval=(5, 6), argrepr='(5, 6)', offset=8, start_offset=8, starts_line=True, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=3, argval='a', argrepr='a', offset=10, start_offset=10, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=4, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='c', argrepr='c', offset=14, start_offset=14, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=1, argval='d', argrepr='d', offset=16, start_offset=16, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='BUILD_TUPLE', opcode=75, arg=4, argval=4, argrepr='', offset=18, start_offset=18, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=1, argval=code_object_inner, argrepr=repr(code_object_inner), offset=20, start_offset=20, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='MAKE_FUNCTION', opcode=38, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=172, arg=8, argval=8, argrepr='closure', offset=24, start_offset=24, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=172, arg=1, argval=1, argrepr='defaults', offset=26, start_offset=26, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=177, arg=2, argval='inner', argrepr='inner', offset=28, start_offset=28, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=1, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=144, arg=3, argval='a', argrepr='a', offset=40, start_offset=40, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=144, arg=4, argval='b', argrepr='b', offset=42, start_offset=42, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=144, arg=0, argval='c', argrepr='c', offset=44, start_offset=44, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=144, arg=1, argval='d', argrepr='d', offset=46, start_offset=46, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=4, argval=4, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=2, argval='inner', argrepr='inner', offset=58, start_offset=58, starts_line=True, line_number=6, is_jump_target=False, positions=None), - Instruction(opname='RETURN_VALUE', opcode=49, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=6, is_jump_target=False, positions=None), + Instruction(opname='COPY_FREE_VARS', opcode=61, arg=2, argval=2, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='MAKE_CELL', opcode=94, arg=0, argval='c', argrepr='c', offset=2, start_offset=2, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='MAKE_CELL', opcode=94, arg=1, argval='d', argrepr='d', offset=4, start_offset=4, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=6, start_offset=6, starts_line=True, line_number=2, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=2, argval=(5, 6), argrepr='(5, 6)', offset=8, start_offset=8, starts_line=True, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=3, argval='a', argrepr='a', offset=10, start_offset=10, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=4, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='c', argrepr='c', offset=14, start_offset=14, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=1, argval='d', argrepr='d', offset=16, start_offset=16, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='BUILD_TUPLE', opcode=52, arg=4, argval=4, argrepr='', offset=18, start_offset=18, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=1, argval=code_object_inner, argrepr=repr(code_object_inner), offset=20, start_offset=20, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='MAKE_FUNCTION', opcode=26, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=106, arg=8, argval=8, argrepr='closure', offset=24, start_offset=24, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='SET_FUNCTION_ATTRIBUTE', opcode=106, arg=1, argval=1, argrepr='defaults', offset=26, start_offset=26, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=110, arg=2, argval='inner', argrepr='inner', offset=28, start_offset=28, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=91, arg=1, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=84, arg=3, argval='a', argrepr='a', offset=40, start_offset=40, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=84, arg=4, argval='b', argrepr='b', offset=42, start_offset=42, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=84, arg=0, argval='c', argrepr='c', offset=44, start_offset=44, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=84, arg=1, argval='d', argrepr='d', offset=46, start_offset=46, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=53, arg=4, argval=4, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=2, argval='inner', argrepr='inner', offset=58, start_offset=58, starts_line=True, line_number=6, is_jump_target=False, positions=None), + Instruction(opname='RETURN_VALUE', opcode=36, arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=6, is_jump_target=False, positions=None), ] expected_opinfo_inner = [ - Instruction(opname='COPY_FREE_VARS', opcode=105, arg=4, argval=4, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='RESUME', opcode=166, arg=0, argval=0, argrepr='', offset=2, start_offset=2, starts_line=True, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=1, argval='print', argrepr='print + NULL', offset=4, start_offset=4, starts_line=True, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=144, arg=2, argval='a', argrepr='a', offset=14, start_offset=14, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=144, arg=3, argval='b', argrepr='b', offset=16, start_offset=16, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=144, arg=4, argval='c', argrepr='c', offset=18, start_offset=18, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_DEREF', opcode=144, arg=5, argval='d', argrepr='d', offset=20, start_offset=20, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST_LOAD_FAST', opcode=148, arg=1, argval=('e', 'f'), argrepr='e, f', offset=22, start_offset=22, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=6, argval=6, argrepr='', offset=24, start_offset=24, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=32, start_offset=32, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='RETURN_CONST', opcode=168, arg=0, argval=None, argrepr='None', offset=34, start_offset=34, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='COPY_FREE_VARS', opcode=61, arg=4, argval=4, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=2, start_offset=2, starts_line=True, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=91, arg=1, argval='print', argrepr='print + NULL', offset=4, start_offset=4, starts_line=True, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=84, arg=2, argval='a', argrepr='a', offset=14, start_offset=14, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=84, arg=3, argval='b', argrepr='b', offset=16, start_offset=16, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=84, arg=4, argval='c', argrepr='c', offset=18, start_offset=18, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_DEREF', opcode=84, arg=5, argval='d', argrepr='d', offset=20, start_offset=20, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST_LOAD_FAST', opcode=88, arg=1, argval=('e', 'f'), argrepr='e, f', offset=22, start_offset=22, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=53, arg=6, argval=6, argrepr='', offset=24, start_offset=24, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=32, start_offset=32, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='RETURN_CONST', opcode=103, arg=0, argval=None, argrepr='None', offset=34, start_offset=34, starts_line=False, line_number=4, is_jump_target=False, positions=None), ] expected_opinfo_jumpy = [ - Instruction(opname='RESUME', opcode=166, arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=1, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=1, argval='range', argrepr='range + NULL', offset=2, start_offset=2, starts_line=True, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=1, argval=10, argrepr='10', offset=12, start_offset=12, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='GET_ITER', opcode=31, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='FOR_ITER', opcode=115, arg=30, argval=88, argrepr='to 88', offset=24, start_offset=24, starts_line=False, line_number=3, is_jump_target=True, positions=None), - Instruction(opname='STORE_FAST', opcode=177, arg=0, argval='i', argrepr='i', offset=28, start_offset=28, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=40, start_offset=40, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=50, start_offset=50, starts_line=False, line_number=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=52, start_offset=52, starts_line=True, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=2, argval=4, argrepr='4', offset=54, start_offset=54, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=98, arg=18, argval='<', argrepr='bool(<)', offset=56, start_offset=56, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=2, argval=68, argrepr='to 68', offset=60, start_offset=60, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=124, arg=22, argval=24, argrepr='to 24', offset=64, start_offset=64, starts_line=True, line_number=6, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=68, start_offset=68, starts_line=True, line_number=7, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=3, argval=6, argrepr='6', offset=70, start_offset=70, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=98, arg=148, argval='>', argrepr='bool(>)', offset=72, start_offset=72, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_TRUE', opcode=164, arg=2, argval=84, argrepr='to 84', offset=76, start_offset=76, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=124, arg=30, argval=24, argrepr='to 24', offset=80, start_offset=80, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=84, start_offset=84, starts_line=True, line_number=8, is_jump_target=True, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=126, arg=12, argval=112, argrepr='to 112', offset=86, start_offset=86, starts_line=False, line_number=8, is_jump_target=False, positions=None), - Instruction(opname='END_FOR', opcode=24, arg=None, argval=None, argrepr='', offset=88, start_offset=88, starts_line=True, line_number=3, is_jump_target=True, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=90, start_offset=90, starts_line=True, line_number=10, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=100, start_offset=100, starts_line=False, line_number=10, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=102, start_offset=102, starts_line=False, line_number=10, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=110, start_offset=110, starts_line=False, line_number=10, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST_CHECK', opcode=147, arg=0, argval='i', argrepr='i', offset=112, start_offset=112, starts_line=True, line_number=11, is_jump_target=True, positions=None), - Instruction(opname='TO_BOOL', opcode=57, arg=None, argval=None, argrepr='', offset=114, start_offset=114, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=40, argval=206, argrepr='to 206', offset=122, start_offset=122, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=126, start_offset=126, starts_line=True, line_number=12, is_jump_target=True, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=136, start_offset=136, starts_line=False, line_number=12, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=138, start_offset=138, starts_line=False, line_number=12, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=146, start_offset=146, starts_line=False, line_number=12, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=148, start_offset=148, starts_line=True, line_number=13, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=5, argval=1, argrepr='1', offset=150, start_offset=150, starts_line=False, line_number=13, is_jump_target=False, positions=None), - Instruction(opname='BINARY_OP', opcode=68, arg=23, argval=23, argrepr='-=', offset=152, start_offset=152, starts_line=False, line_number=13, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=177, arg=0, argval='i', argrepr='i', offset=156, start_offset=156, starts_line=False, line_number=13, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=158, start_offset=158, starts_line=True, line_number=14, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=3, argval=6, argrepr='6', offset=160, start_offset=160, starts_line=False, line_number=14, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=98, arg=148, argval='>', argrepr='bool(>)', offset=162, start_offset=162, starts_line=False, line_number=14, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=2, argval=174, argrepr='to 174', offset=166, start_offset=166, starts_line=False, line_number=14, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=124, arg=31, argval=112, argrepr='to 112', offset=170, start_offset=170, starts_line=True, line_number=15, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=174, start_offset=174, starts_line=True, line_number=16, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=2, argval=4, argrepr='4', offset=176, start_offset=176, starts_line=False, line_number=16, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=98, arg=18, argval='<', argrepr='bool(<)', offset=178, start_offset=178, starts_line=False, line_number=16, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=1, argval=188, argrepr='to 188', offset=182, start_offset=182, starts_line=False, line_number=16, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=126, arg=20, argval=228, argrepr='to 228', offset=186, start_offset=186, starts_line=True, line_number=17, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=188, start_offset=188, starts_line=True, line_number=11, is_jump_target=True, positions=None), - Instruction(opname='TO_BOOL', opcode=57, arg=None, argval=None, argrepr='', offset=190, start_offset=190, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=2, argval=206, argrepr='to 206', offset=198, start_offset=198, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=124, arg=40, argval=126, argrepr='to 126', offset=202, start_offset=202, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=206, start_offset=206, starts_line=True, line_number=19, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=216, start_offset=216, starts_line=False, line_number=19, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=218, start_offset=218, starts_line=False, line_number=19, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=226, start_offset=226, starts_line=False, line_number=19, is_jump_target=False, positions=None), - Instruction(opname='NOP', opcode=42, arg=None, argval=None, argrepr='', offset=228, start_offset=228, starts_line=True, line_number=20, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=5, argval=1, argrepr='1', offset=230, start_offset=230, starts_line=True, line_number=21, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=7, argval=0, argrepr='0', offset=232, start_offset=232, starts_line=False, line_number=21, is_jump_target=False, positions=None), - Instruction(opname='BINARY_OP', opcode=68, arg=11, argval=11, argrepr='/', offset=234, start_offset=234, starts_line=False, line_number=21, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=238, start_offset=238, starts_line=False, line_number=21, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=145, arg=0, argval='i', argrepr='i', offset=240, start_offset=240, starts_line=True, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=1, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=91, arg=1, argval='range', argrepr='range + NULL', offset=2, start_offset=2, starts_line=True, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=1, argval=10, argrepr='10', offset=12, start_offset=12, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=53, arg=1, argval=1, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='GET_ITER', opcode=19, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='FOR_ITER', opcode=71, arg=30, argval=88, argrepr='to 88', offset=24, start_offset=24, starts_line=False, line_number=3, is_jump_target=True, positions=None), + Instruction(opname='STORE_FAST', opcode=110, arg=0, argval='i', argrepr='i', offset=28, start_offset=28, starts_line=False, line_number=3, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=91, arg=3, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='i', argrepr='i', offset=40, start_offset=40, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=53, arg=1, argval=1, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=50, start_offset=50, starts_line=False, line_number=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='i', argrepr='i', offset=52, start_offset=52, starts_line=True, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=2, argval=4, argrepr='4', offset=54, start_offset=54, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=57, arg=18, argval='<', argrepr='bool(<)', offset=56, start_offset=56, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=2, argval=68, argrepr='to 68', offset=60, start_offset=60, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=76, arg=22, argval=24, argrepr='to 24', offset=64, start_offset=64, starts_line=True, line_number=6, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='i', argrepr='i', offset=68, start_offset=68, starts_line=True, line_number=7, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=3, argval=6, argrepr='6', offset=70, start_offset=70, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=57, arg=148, argval='>', argrepr='bool(>)', offset=72, start_offset=72, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=100, arg=2, argval=84, argrepr='to 84', offset=76, start_offset=76, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=76, arg=30, argval=24, argrepr='to 24', offset=80, start_offset=80, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=84, start_offset=84, starts_line=True, line_number=8, is_jump_target=True, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=78, arg=12, argval=112, argrepr='to 112', offset=86, start_offset=86, starts_line=False, line_number=8, is_jump_target=False, positions=None), + Instruction(opname='END_FOR', opcode=11, arg=None, argval=None, argrepr='', offset=88, start_offset=88, starts_line=True, line_number=3, is_jump_target=True, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=91, arg=3, argval='print', argrepr='print + NULL', offset=90, start_offset=90, starts_line=True, line_number=10, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=100, start_offset=100, starts_line=False, line_number=10, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=53, arg=1, argval=1, argrepr='', offset=102, start_offset=102, starts_line=False, line_number=10, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=110, start_offset=110, starts_line=False, line_number=10, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST_CHECK', opcode=87, arg=0, argval='i', argrepr='i', offset=112, start_offset=112, starts_line=True, line_number=11, is_jump_target=True, positions=None), + Instruction(opname='TO_BOOL', opcode=40, arg=None, argval=None, argrepr='', offset=114, start_offset=114, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=40, argval=206, argrepr='to 206', offset=122, start_offset=122, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=91, arg=3, argval='print', argrepr='print + NULL', offset=126, start_offset=126, starts_line=True, line_number=12, is_jump_target=True, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='i', argrepr='i', offset=136, start_offset=136, starts_line=False, line_number=12, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=53, arg=1, argval=1, argrepr='', offset=138, start_offset=138, starts_line=False, line_number=12, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=146, start_offset=146, starts_line=False, line_number=12, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='i', argrepr='i', offset=148, start_offset=148, starts_line=True, line_number=13, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=5, argval=1, argrepr='1', offset=150, start_offset=150, starts_line=False, line_number=13, is_jump_target=False, positions=None), + Instruction(opname='BINARY_OP', opcode=45, arg=23, argval=23, argrepr='-=', offset=152, start_offset=152, starts_line=False, line_number=13, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=110, arg=0, argval='i', argrepr='i', offset=156, start_offset=156, starts_line=False, line_number=13, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='i', argrepr='i', offset=158, start_offset=158, starts_line=True, line_number=14, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=3, argval=6, argrepr='6', offset=160, start_offset=160, starts_line=False, line_number=14, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=57, arg=148, argval='>', argrepr='bool(>)', offset=162, start_offset=162, starts_line=False, line_number=14, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=2, argval=174, argrepr='to 174', offset=166, start_offset=166, starts_line=False, line_number=14, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=76, arg=31, argval=112, argrepr='to 112', offset=170, start_offset=170, starts_line=True, line_number=15, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='i', argrepr='i', offset=174, start_offset=174, starts_line=True, line_number=16, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=2, argval=4, argrepr='4', offset=176, start_offset=176, starts_line=False, line_number=16, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=57, arg=18, argval='<', argrepr='bool(<)', offset=178, start_offset=178, starts_line=False, line_number=16, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=1, argval=188, argrepr='to 188', offset=182, start_offset=182, starts_line=False, line_number=16, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=78, arg=20, argval=228, argrepr='to 228', offset=186, start_offset=186, starts_line=True, line_number=17, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='i', argrepr='i', offset=188, start_offset=188, starts_line=True, line_number=11, is_jump_target=True, positions=None), + Instruction(opname='TO_BOOL', opcode=40, arg=None, argval=None, argrepr='', offset=190, start_offset=190, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=2, argval=206, argrepr='to 206', offset=198, start_offset=198, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=76, arg=40, argval=126, argrepr='to 126', offset=202, start_offset=202, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=91, arg=3, argval='print', argrepr='print + NULL', offset=206, start_offset=206, starts_line=True, line_number=19, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=216, start_offset=216, starts_line=False, line_number=19, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=53, arg=1, argval=1, argrepr='', offset=218, start_offset=218, starts_line=False, line_number=19, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=226, start_offset=226, starts_line=False, line_number=19, is_jump_target=False, positions=None), + Instruction(opname='NOP', opcode=30, arg=None, argval=None, argrepr='', offset=228, start_offset=228, starts_line=True, line_number=20, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=5, argval=1, argrepr='1', offset=230, start_offset=230, starts_line=True, line_number=21, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=7, argval=0, argrepr='0', offset=232, start_offset=232, starts_line=False, line_number=21, is_jump_target=False, positions=None), + Instruction(opname='BINARY_OP', opcode=45, arg=11, argval=11, argrepr='/', offset=234, start_offset=234, starts_line=False, line_number=21, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=238, start_offset=238, starts_line=False, line_number=21, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='i', argrepr='i', offset=240, start_offset=240, starts_line=True, line_number=25, is_jump_target=False, positions=None), Instruction(opname='BEFORE_WITH', opcode=2, arg=None, argval=None, argrepr='', offset=242, start_offset=242, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=177, arg=1, argval='dodgy', argrepr='dodgy', offset=244, start_offset=244, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=246, start_offset=246, starts_line=True, line_number=26, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=8, argval='Never reach this', argrepr="'Never reach this'", offset=256, start_offset=256, starts_line=False, line_number=26, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=258, start_offset=258, starts_line=False, line_number=26, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=266, start_offset=266, starts_line=False, line_number=26, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=0, argval=None, argrepr='None', offset=268, start_offset=268, starts_line=True, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=0, argval=None, argrepr='None', offset=270, start_offset=270, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=0, argval=None, argrepr='None', offset=272, start_offset=272, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=2, argval=2, argrepr='', offset=274, start_offset=274, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=282, start_offset=282, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=284, start_offset=284, starts_line=True, line_number=28, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=294, start_offset=294, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=296, start_offset=296, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=304, start_offset=304, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='RETURN_CONST', opcode=168, arg=0, argval=None, argrepr='None', offset=306, start_offset=306, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=45, arg=None, argval=None, argrepr='', offset=308, start_offset=308, starts_line=True, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='WITH_EXCEPT_START', opcode=67, arg=None, argval=None, argrepr='', offset=310, start_offset=310, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='TO_BOOL', opcode=57, arg=None, argval=None, argrepr='', offset=312, start_offset=312, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_TRUE', opcode=164, arg=1, argval=326, argrepr='to 326', offset=320, start_offset=320, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=167, arg=2, argval=2, argrepr='', offset=324, start_offset=324, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=326, start_offset=326, starts_line=False, line_number=25, is_jump_target=True, positions=None), - Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=328, start_offset=328, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=330, start_offset=330, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=332, start_offset=332, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=124, arg=27, argval=284, argrepr='to 284', offset=334, start_offset=334, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=104, arg=3, argval=3, argrepr='', offset=338, start_offset=338, starts_line=True, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=340, start_offset=340, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=167, arg=1, argval=1, argrepr='', offset=342, start_offset=342, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=45, arg=None, argval=None, argrepr='', offset=344, start_offset=344, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=346, start_offset=346, starts_line=True, line_number=22, is_jump_target=False, positions=None), - Instruction(opname='CHECK_EXC_MATCH', opcode=20, arg=None, argval=None, argrepr='', offset=356, start_offset=356, starts_line=False, line_number=22, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=161, arg=15, argval=392, argrepr='to 392', offset=358, start_offset=358, starts_line=False, line_number=22, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=362, start_offset=362, starts_line=False, line_number=22, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=364, start_offset=364, starts_line=True, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=374, start_offset=374, starts_line=False, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=376, start_offset=376, starts_line=False, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=384, start_offset=384, starts_line=False, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=386, start_offset=386, starts_line=False, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=124, arg=54, argval=284, argrepr='to 284', offset=388, start_offset=388, starts_line=False, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=167, arg=0, argval=0, argrepr='', offset=392, start_offset=392, starts_line=True, line_number=22, is_jump_target=True, positions=None), - Instruction(opname='COPY', opcode=104, arg=3, argval=3, argrepr='', offset=394, start_offset=394, starts_line=True, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=396, start_offset=396, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=167, arg=1, argval=1, argrepr='', offset=398, start_offset=398, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=45, arg=None, argval=None, argrepr='', offset=400, start_offset=400, starts_line=False, line_number=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=151, arg=3, argval='print', argrepr='print + NULL', offset=402, start_offset=402, starts_line=True, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=143, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=412, start_offset=412, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=76, arg=1, argval=1, argrepr='', offset=414, start_offset=414, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=44, arg=None, argval=None, argrepr='', offset=422, start_offset=422, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=167, arg=0, argval=0, argrepr='', offset=424, start_offset=424, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=104, arg=3, argval=3, argrepr='', offset=426, start_offset=426, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=43, arg=None, argval=None, argrepr='', offset=428, start_offset=428, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=167, arg=1, argval=1, argrepr='', offset=430, start_offset=430, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=110, arg=1, argval='dodgy', argrepr='dodgy', offset=244, start_offset=244, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=91, arg=3, argval='print', argrepr='print + NULL', offset=246, start_offset=246, starts_line=True, line_number=26, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=8, argval='Never reach this', argrepr="'Never reach this'", offset=256, start_offset=256, starts_line=False, line_number=26, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=53, arg=1, argval=1, argrepr='', offset=258, start_offset=258, starts_line=False, line_number=26, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=266, start_offset=266, starts_line=False, line_number=26, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=0, argval=None, argrepr='None', offset=268, start_offset=268, starts_line=True, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=0, argval=None, argrepr='None', offset=270, start_offset=270, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=0, argval=None, argrepr='None', offset=272, start_offset=272, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=53, arg=2, argval=2, argrepr='', offset=274, start_offset=274, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=282, start_offset=282, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=91, arg=3, argval='print', argrepr='print + NULL', offset=284, start_offset=284, starts_line=True, line_number=28, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=294, start_offset=294, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=53, arg=1, argval=1, argrepr='', offset=296, start_offset=296, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=304, start_offset=304, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='RETURN_CONST', opcode=103, arg=0, argval=None, argrepr='None', offset=306, start_offset=306, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=33, arg=None, argval=None, argrepr='', offset=308, start_offset=308, starts_line=True, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='WITH_EXCEPT_START', opcode=44, arg=None, argval=None, argrepr='', offset=310, start_offset=310, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='TO_BOOL', opcode=40, arg=None, argval=None, argrepr='', offset=312, start_offset=312, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=100, arg=1, argval=326, argrepr='to 326', offset=320, start_offset=320, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=102, arg=2, argval=2, argrepr='', offset=324, start_offset=324, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=326, start_offset=326, starts_line=False, line_number=25, is_jump_target=True, positions=None), + Instruction(opname='POP_EXCEPT', opcode=31, arg=None, argval=None, argrepr='', offset=328, start_offset=328, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=330, start_offset=330, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=332, start_offset=332, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=76, arg=27, argval=284, argrepr='to 284', offset=334, start_offset=334, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=60, arg=3, argval=3, argrepr='', offset=338, start_offset=338, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=31, arg=None, argval=None, argrepr='', offset=340, start_offset=340, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=342, start_offset=342, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=33, arg=None, argval=None, argrepr='', offset=344, start_offset=344, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=91, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=346, start_offset=346, starts_line=True, line_number=22, is_jump_target=False, positions=None), + Instruction(opname='CHECK_EXC_MATCH', opcode=7, arg=None, argval=None, argrepr='', offset=356, start_offset=356, starts_line=False, line_number=22, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=15, argval=392, argrepr='to 392', offset=358, start_offset=358, starts_line=False, line_number=22, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=362, start_offset=362, starts_line=False, line_number=22, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=91, arg=3, argval='print', argrepr='print + NULL', offset=364, start_offset=364, starts_line=True, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=374, start_offset=374, starts_line=False, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=53, arg=1, argval=1, argrepr='', offset=376, start_offset=376, starts_line=False, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=384, start_offset=384, starts_line=False, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=31, arg=None, argval=None, argrepr='', offset=386, start_offset=386, starts_line=False, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=76, arg=54, argval=284, argrepr='to 284', offset=388, start_offset=388, starts_line=False, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=102, arg=0, argval=0, argrepr='', offset=392, start_offset=392, starts_line=True, line_number=22, is_jump_target=True, positions=None), + Instruction(opname='COPY', opcode=60, arg=3, argval=3, argrepr='', offset=394, start_offset=394, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=31, arg=None, argval=None, argrepr='', offset=396, start_offset=396, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=398, start_offset=398, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=33, arg=None, argval=None, argrepr='', offset=400, start_offset=400, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=91, arg=3, argval='print', argrepr='print + NULL', offset=402, start_offset=402, starts_line=True, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=83, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=412, start_offset=412, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=53, arg=1, argval=1, argrepr='', offset=414, start_offset=414, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=422, start_offset=422, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=102, arg=0, argval=0, argrepr='', offset=424, start_offset=424, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=60, arg=3, argval=3, argrepr='', offset=426, start_offset=426, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=31, arg=None, argval=None, argrepr='', offset=428, start_offset=428, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=430, start_offset=430, starts_line=False, line_number=28, is_jump_target=False, positions=None), ] # One last piece of inspect fodder to check the default line number handling def simple(): pass expected_opinfo_simple = [ - Instruction(opname='RESUME', opcode=166, arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=simple.__code__.co_firstlineno, is_jump_target=False, positions=None), - Instruction(opname='RETURN_CONST', opcode=168, arg=0, argval=None, argrepr='None', offset=2, start_offset=2, starts_line=False, line_number=simple.__code__.co_firstlineno, is_jump_target=False), + Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=simple.__code__.co_firstlineno, is_jump_target=False, positions=None), + Instruction(opname='RETURN_CONST', opcode=103, arg=0, argval=None, argrepr='None', offset=2, start_offset=2, starts_line=False, line_number=simple.__code__.co_firstlineno, is_jump_target=False), ] diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-11-15-11-03.gh-issue-109256.6mfhvF.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-11-15-11-03.gh-issue-109256.6mfhvF.rst new file mode 100644 index 00000000000000..6c33faea0ae6c4 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-11-15-11-03.gh-issue-109256.6mfhvF.rst @@ -0,0 +1,2 @@ +Opcode IDs for specialized opcodes are allocated in their own range to +improve stability of the IDs for the 'real' opcodes. diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h index 7590e87ab1eadd..c2082728aafaad 100644 --- a/Programs/test_frozenmain.h +++ b/Programs/test_frozenmain.h @@ -1,17 +1,17 @@ // Auto-generated by Programs/freeze_test_frozenmain.py unsigned char M_test_frozenmain[] = { 227,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0, - 0,0,0,0,0,243,164,0,0,0,166,0,143,0,143,1, - 122,0,181,0,143,0,143,1,122,1,181,1,154,2,46,0, - 143,2,76,1,0,0,0,0,0,0,44,0,154,2,46,0, - 143,3,154,0,130,6,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,76,2,0,0,0,0,0,0, - 44,0,154,1,130,8,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,46,0,76,0,0,0,0,0, - 0,0,143,4,12,0,0,0,181,5,143,5,31,0,115,20, - 0,0,181,6,154,2,46,0,143,6,154,6,27,0,143,7, - 154,5,154,6,12,0,0,0,27,0,74,4,76,1,0,0, - 0,0,0,0,44,0,124,22,0,0,24,0,168,1,41,8, + 0,0,0,0,0,243,164,0,0,0,149,0,83,0,83,1, + 74,0,114,0,83,0,83,1,74,1,114,1,92,2,34,0, + 83,2,53,1,0,0,0,0,0,0,32,0,92,2,34,0, + 83,3,92,0,82,6,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,53,2,0,0,0,0,0,0, + 32,0,92,1,82,8,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,34,0,53,0,0,0,0,0, + 0,0,83,4,5,0,0,0,114,5,83,5,19,0,71,20, + 0,0,114,6,92,2,34,0,83,6,92,6,14,0,83,7, + 92,5,92,6,5,0,0,0,14,0,51,4,53,1,0,0, + 0,0,0,0,32,0,76,22,0,0,11,0,103,1,41,8, 233,0,0,0,0,78,122,18,70,114,111,122,101,110,32,72, 101,108,108,111,32,87,111,114,108,100,122,8,115,121,115,46, 97,114,103,118,218,6,99,111,110,102,105,103,41,5,218,12, diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index 413bb884dcf752..f00eb31b70e26f 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -2,22 +2,9 @@ static void *opcode_targets[256] = { &&TARGET_CACHE, &&TARGET_BEFORE_ASYNC_WITH, &&TARGET_BEFORE_WITH, - &&TARGET_BINARY_OP_ADD_FLOAT, - &&TARGET_BINARY_OP_ADD_INT, - &&TARGET_BINARY_OP_ADD_UNICODE, &&TARGET_BINARY_OP_INPLACE_ADD_UNICODE, - &&TARGET_BINARY_OP_MULTIPLY_FLOAT, - &&TARGET_BINARY_OP_MULTIPLY_INT, - &&TARGET_BINARY_OP_SUBTRACT_FLOAT, - &&TARGET_BINARY_OP_SUBTRACT_INT, &&TARGET_BINARY_SLICE, &&TARGET_BINARY_SUBSCR, - &&TARGET_BINARY_SUBSCR_DICT, - &&TARGET_BINARY_SUBSCR_GETITEM, - &&TARGET_BINARY_SUBSCR_LIST_INT, - &&TARGET_BINARY_SUBSCR_STR_INT, - &&TARGET_RESERVED, - &&TARGET_BINARY_SUBSCR_TUPLE_INT, &&TARGET_CHECK_EG_MATCH, &&TARGET_CHECK_EXC_MATCH, &&TARGET_CLEANUP_THROW, @@ -29,6 +16,7 @@ static void *opcode_targets[256] = { &&TARGET_FORMAT_SIMPLE, &&TARGET_FORMAT_WITH_SPEC, &&TARGET_GET_AITER, + &&TARGET_RESERVED, &&TARGET_GET_ANEXT, &&TARGET_GET_ITER, &&TARGET_GET_LEN, @@ -46,23 +34,12 @@ static void *opcode_targets[256] = { &&TARGET_POP_TOP, &&TARGET_PUSH_EXC_INFO, &&TARGET_PUSH_NULL, - &&TARGET_RESUME_CHECK, &&TARGET_RETURN_GENERATOR, &&TARGET_RETURN_VALUE, &&TARGET_SETUP_ANNOTATIONS, - &&TARGET_STORE_ATTR_INSTANCE_VALUE, - &&TARGET_STORE_ATTR_SLOT, &&TARGET_STORE_SLICE, &&TARGET_STORE_SUBSCR, - &&TARGET_STORE_SUBSCR_DICT, - &&TARGET_STORE_SUBSCR_LIST_INT, &&TARGET_TO_BOOL, - &&TARGET_TO_BOOL_ALWAYS_TRUE, - &&TARGET_TO_BOOL_BOOL, - &&TARGET_TO_BOOL_INT, - &&TARGET_TO_BOOL_LIST, - &&TARGET_TO_BOOL_NONE, - &&TARGET_TO_BOOL_STR, &&TARGET_UNARY_INVERT, &&TARGET_UNARY_NEGATIVE, &&TARGET_UNARY_NOT, @@ -76,31 +53,10 @@ static void *opcode_targets[256] = { &&TARGET_BUILD_STRING, &&TARGET_BUILD_TUPLE, &&TARGET_CALL, - &&TARGET_CALL_BOUND_METHOD_EXACT_ARGS, - &&TARGET_CALL_BUILTIN_CLASS, - &&TARGET_CALL_BUILTIN_FAST_WITH_KEYWORDS, &&TARGET_CALL_FUNCTION_EX, &&TARGET_CALL_INTRINSIC_1, &&TARGET_CALL_INTRINSIC_2, - &&TARGET_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, - &&TARGET_CALL_NO_KW_ALLOC_AND_ENTER_INIT, - &&TARGET_CALL_NO_KW_BUILTIN_FAST, - &&TARGET_CALL_NO_KW_BUILTIN_O, - &&TARGET_CALL_NO_KW_ISINSTANCE, - &&TARGET_CALL_NO_KW_LEN, - &&TARGET_CALL_NO_KW_LIST_APPEND, - &&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_FAST, - &&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS, - &&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_O, - &&TARGET_CALL_NO_KW_STR_1, - &&TARGET_CALL_NO_KW_TUPLE_1, - &&TARGET_CALL_NO_KW_TYPE_1, - &&TARGET_CALL_PY_EXACT_ARGS, - &&TARGET_CALL_PY_WITH_DEFAULTS, &&TARGET_COMPARE_OP, - &&TARGET_COMPARE_OP_FLOAT, - &&TARGET_COMPARE_OP_INT, - &&TARGET_COMPARE_OP_STR, &&TARGET_CONTAINS_OP, &&TARGET_CONVERT_VALUE, &&TARGET_COPY, @@ -115,10 +71,6 @@ static void *opcode_targets[256] = { &&TARGET_ENTER_EXECUTOR, &&TARGET_EXTENDED_ARG, &&TARGET_FOR_ITER, - &&TARGET_FOR_ITER_GEN, - &&TARGET_FOR_ITER_LIST, - &&TARGET_FOR_ITER_RANGE, - &&TARGET_FOR_ITER_TUPLE, &&TARGET_GET_AWAITABLE, &&TARGET_IMPORT_FROM, &&TARGET_IMPORT_NAME, @@ -130,18 +82,6 @@ static void *opcode_targets[256] = { &&TARGET_LIST_APPEND, &&TARGET_LIST_EXTEND, &&TARGET_LOAD_ATTR, - &&TARGET_LOAD_ATTR_CLASS, - &&TARGET_LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN, - &&TARGET_LOAD_ATTR_INSTANCE_VALUE, - &&TARGET_LOAD_ATTR_METHOD_LAZY_DICT, - &&TARGET_LOAD_ATTR_METHOD_NO_DICT, - &&TARGET_LOAD_ATTR_METHOD_WITH_VALUES, - &&TARGET_LOAD_ATTR_MODULE, - &&TARGET_LOAD_ATTR_NONDESCRIPTOR_NO_DICT, - &&TARGET_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, - &&TARGET_LOAD_ATTR_PROPERTY, - &&TARGET_LOAD_ATTR_SLOT, - &&TARGET_LOAD_ATTR_WITH_HINT, &&TARGET_LOAD_CONST, &&TARGET_LOAD_DEREF, &&TARGET_LOAD_FAST, @@ -151,12 +91,8 @@ static void *opcode_targets[256] = { &&TARGET_LOAD_FROM_DICT_OR_DEREF, &&TARGET_LOAD_FROM_DICT_OR_GLOBALS, &&TARGET_LOAD_GLOBAL, - &&TARGET_LOAD_GLOBAL_BUILTIN, - &&TARGET_LOAD_GLOBAL_MODULE, &&TARGET_LOAD_NAME, &&TARGET_LOAD_SUPER_ATTR, - &&TARGET_LOAD_SUPER_ATTR_ATTR, - &&TARGET_LOAD_SUPER_ATTR_METHOD, &&TARGET_MAKE_CELL, &&TARGET_MAP_ADD, &&TARGET_MATCH_CLASS, @@ -165,16 +101,13 @@ static void *opcode_targets[256] = { &&TARGET_POP_JUMP_IF_NOT_NONE, &&TARGET_POP_JUMP_IF_TRUE, &&TARGET_RAISE_VARARGS, - &&TARGET_RESUME, &&TARGET_RERAISE, &&TARGET_RETURN_CONST, &&TARGET_SEND, - &&TARGET_SEND_GEN, &&TARGET_SET_ADD, &&TARGET_SET_FUNCTION_ATTRIBUTE, &&TARGET_SET_UPDATE, &&TARGET_STORE_ATTR, - &&TARGET_STORE_ATTR_WITH_HINT, &&TARGET_STORE_DEREF, &&TARGET_STORE_FAST, &&TARGET_STORE_FAST_LOAD_FAST, @@ -184,9 +117,6 @@ static void *opcode_targets[256] = { &&TARGET_SWAP, &&TARGET_UNPACK_EX, &&TARGET_UNPACK_SEQUENCE, - &&TARGET_UNPACK_SEQUENCE_LIST, - &&TARGET_UNPACK_SEQUENCE_TUPLE, - &&TARGET_UNPACK_SEQUENCE_TWO_TUPLE, &&TARGET_YIELD_VALUE, &&_unknown_opcode, &&_unknown_opcode, @@ -218,6 +148,76 @@ static void *opcode_targets[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, + &&TARGET_RESUME, + &&TARGET_BINARY_OP_ADD_FLOAT, + &&TARGET_BINARY_OP_ADD_INT, + &&TARGET_BINARY_OP_ADD_UNICODE, + &&TARGET_BINARY_OP_MULTIPLY_FLOAT, + &&TARGET_BINARY_OP_MULTIPLY_INT, + &&TARGET_BINARY_OP_SUBTRACT_FLOAT, + &&TARGET_BINARY_OP_SUBTRACT_INT, + &&TARGET_BINARY_SUBSCR_DICT, + &&TARGET_BINARY_SUBSCR_GETITEM, + &&TARGET_BINARY_SUBSCR_LIST_INT, + &&TARGET_BINARY_SUBSCR_STR_INT, + &&TARGET_BINARY_SUBSCR_TUPLE_INT, + &&TARGET_CALL_BOUND_METHOD_EXACT_ARGS, + &&TARGET_CALL_BUILTIN_CLASS, + &&TARGET_CALL_BUILTIN_FAST_WITH_KEYWORDS, + &&TARGET_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, + &&TARGET_CALL_NO_KW_ALLOC_AND_ENTER_INIT, + &&TARGET_CALL_NO_KW_BUILTIN_FAST, + &&TARGET_CALL_NO_KW_BUILTIN_O, + &&TARGET_CALL_NO_KW_ISINSTANCE, + &&TARGET_CALL_NO_KW_LEN, + &&TARGET_CALL_NO_KW_LIST_APPEND, + &&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_FAST, + &&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS, + &&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_O, + &&TARGET_CALL_NO_KW_STR_1, + &&TARGET_CALL_NO_KW_TUPLE_1, + &&TARGET_CALL_NO_KW_TYPE_1, + &&TARGET_CALL_PY_EXACT_ARGS, + &&TARGET_CALL_PY_WITH_DEFAULTS, + &&TARGET_COMPARE_OP_FLOAT, + &&TARGET_COMPARE_OP_INT, + &&TARGET_COMPARE_OP_STR, + &&TARGET_FOR_ITER_GEN, + &&TARGET_FOR_ITER_LIST, + &&TARGET_FOR_ITER_RANGE, + &&TARGET_FOR_ITER_TUPLE, + &&TARGET_LOAD_ATTR_CLASS, + &&TARGET_LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN, + &&TARGET_LOAD_ATTR_INSTANCE_VALUE, + &&TARGET_LOAD_ATTR_METHOD_LAZY_DICT, + &&TARGET_LOAD_ATTR_METHOD_NO_DICT, + &&TARGET_LOAD_ATTR_METHOD_WITH_VALUES, + &&TARGET_LOAD_ATTR_MODULE, + &&TARGET_LOAD_ATTR_NONDESCRIPTOR_NO_DICT, + &&TARGET_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, + &&TARGET_LOAD_ATTR_PROPERTY, + &&TARGET_LOAD_ATTR_SLOT, + &&TARGET_LOAD_ATTR_WITH_HINT, + &&TARGET_LOAD_GLOBAL_BUILTIN, + &&TARGET_LOAD_GLOBAL_MODULE, + &&TARGET_LOAD_SUPER_ATTR_ATTR, + &&TARGET_LOAD_SUPER_ATTR_METHOD, + &&TARGET_RESUME_CHECK, + &&TARGET_SEND_GEN, + &&TARGET_STORE_ATTR_INSTANCE_VALUE, + &&TARGET_STORE_ATTR_SLOT, + &&TARGET_STORE_ATTR_WITH_HINT, + &&TARGET_STORE_SUBSCR_DICT, + &&TARGET_STORE_SUBSCR_LIST_INT, + &&TARGET_TO_BOOL_ALWAYS_TRUE, + &&TARGET_TO_BOOL_BOOL, + &&TARGET_TO_BOOL_INT, + &&TARGET_TO_BOOL_LIST, + &&TARGET_TO_BOOL_NONE, + &&TARGET_TO_BOOL_STR, + &&TARGET_UNPACK_SEQUENCE_LIST, + &&TARGET_UNPACK_SEQUENCE_TUPLE, + &&TARGET_UNPACK_SEQUENCE_TWO_TUPLE, &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, diff --git a/Tools/build/deepfreeze.py b/Tools/build/deepfreeze.py index 996d5f65a923b2..c3231a5a40c326 100644 --- a/Tools/build/deepfreeze.py +++ b/Tools/build/deepfreeze.py @@ -22,7 +22,7 @@ verbose = False # This must be kept in sync with Tools/cases_generator/generate_cases.py -RESUME = 166 +RESUME = 149 def isprintable(b: bytes) -> bool: return all(0x20 <= c < 0x7f for c in b) diff --git a/Tools/cases_generator/generate_cases.py b/Tools/cases_generator/generate_cases.py index 3ed71309a9d85c..3a738da6c05a51 100644 --- a/Tools/cases_generator/generate_cases.py +++ b/Tools/cases_generator/generate_cases.py @@ -255,12 +255,18 @@ def assign_opcode_ids(self) -> None: ops: list[tuple[bool, str]] = [] # (has_arg, name) for each opcode instrumented_ops: list[str] = [] + specialized_ops = set() + for name, family in self.families.items(): + specialized_ops.update(family.members) + for instr in itertools.chain( [instr for instr in self.instrs.values() if instr.kind != "op"], self.macro_instrs.values(), ): assert isinstance(instr, (Instruction, MacroInstruction, PseudoInstruction)) name = instr.name + if name in specialized_ops: + continue if name.startswith("INSTRUMENTED_"): instrumented_ops.append(name) else: @@ -282,7 +288,7 @@ def assign_opcode_ids(self) -> None: def map_op(op: int, name: str) -> None: assert op < len(opname) - assert opname[op] is None + assert opname[op] is None, (op, name) assert name not in opmap opname[op] = name opmap[name] = op @@ -294,25 +300,31 @@ def map_op(op: int, name: str) -> None: # This helps catch cases where we attempt to execute a cache. map_op(17, "RESERVED") - # 166 is RESUME - it is hard coded as such in Tools/build/deepfreeze.py - map_op(166, "RESUME") + # 149 is RESUME - it is hard coded as such in Tools/build/deepfreeze.py + map_op(149, "RESUME") - next_opcode = 1 + # Specialized ops appear in their own section + # Instrumented opcodes are at the end of the valid range + min_internal = 150 + min_instrumented = 254 - (len(instrumented_ops) - 1) + assert min_internal + len(specialized_ops) < min_instrumented + next_opcode = 1 for has_arg, name in sorted(ops): if name in opmap: continue # an anchored name, like CACHE - while opname[next_opcode] is not None: - next_opcode += 1 - assert next_opcode < 255 map_op(next_opcode, name) - if has_arg and "HAVE_ARGUMENT" not in markers: markers["HAVE_ARGUMENT"] = next_opcode - # Instrumented opcodes are at the end of the valid range - min_instrumented = 254 - (len(instrumented_ops) - 1) - assert next_opcode <= min_instrumented + while opname[next_opcode] is not None: + next_opcode += 1 + + assert next_opcode < min_internal + + for i, op in enumerate(sorted(specialized_ops)): + map_op(min_internal + i, op) + markers["MIN_INSTRUMENTED_OPCODE"] = min_instrumented for i, op in enumerate(instrumented_ops): map_op(min_instrumented + i, op) From d13f782a181d579fc3c23ea6059ff352ec9fab93 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 12 Sep 2023 15:13:29 +0200 Subject: [PATCH 175/357] gh-109276: libregrtest: fix worker working dir (#109313) Fix Emscripten and WASI: start the test worker process in the Python source code directory, where 'python.js' and 'python.wasm' can be found. Then worker_process() changes to a temporary directory created to run tests. * create_worker_process() uses os_helper.SAVEDCWD as cwd. * worker_process() uses get_temp_dir() as the parent directory for get_work_dir(). * Don't use plural but singual for "test" in "Run 1 test ..." message. * Remove unused imports. * Add WORK_DIR_PREFIX and WORKER_WORK_DIR_PREFIX constants. --- Lib/test/libregrtest/main.py | 4 ++-- Lib/test/libregrtest/run_workers.py | 8 ++++---- Lib/test/libregrtest/utils.py | 15 ++++++++------- Lib/test/libregrtest/worker.py | 13 ++++++++++--- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index a89e3c6a498da6..dd9a10764b075a 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -297,7 +297,7 @@ def run_tests_sequentially(self, runtests): jobs = runtests.get_jobs() if jobs is not None: - tests = f'{jobs} tests' + tests = count(jobs, 'test') else: tests = 'tests' msg = f"Run {tests} sequentially" @@ -458,7 +458,7 @@ def _run_tests(self, selected: TestTuple, tests: TestList | None) -> int: def run_tests(self, selected: TestTuple, tests: TestList | None) -> int: os.makedirs(self.tmp_dir, exist_ok=True) - work_dir = get_work_dir(parent_dir=self.tmp_dir) + work_dir = get_work_dir(self.tmp_dir) # Put a timeout on Python exit with exit_timeout(): diff --git a/Lib/test/libregrtest/run_workers.py b/Lib/test/libregrtest/run_workers.py index cfa36f7800943a..eaca0af17ea13a 100644 --- a/Lib/test/libregrtest/run_workers.py +++ b/Lib/test/libregrtest/run_workers.py @@ -9,7 +9,7 @@ import threading import time import traceback -from typing import Literal, TextIO +from typing import Literal from test import support from test.support import os_helper @@ -21,7 +21,7 @@ from .single import PROGRESS_MIN_TIME from .utils import ( StrPath, StrJSON, TestName, MS_WINDOWS, - format_duration, print_warning, plural) + format_duration, print_warning, count, plural) from .worker import create_worker_process, USE_PROCESS_GROUP if MS_WINDOWS: @@ -280,7 +280,7 @@ def _runtest(self, test_name: TestName) -> MultiprocessResult: if worker_json: result = TestResult.from_json(worker_json) else: - err_msg = f"empty JSON" + err_msg = "empty JSON" except Exception as exc: # gh-101634: Catch UnicodeDecodeError if stdout cannot be # decoded from encoding @@ -412,7 +412,7 @@ def start_workers(self) -> None: for index in range(1, self.num_workers + 1)] jobs = self.runtests.get_jobs() if jobs is not None: - tests = f'{jobs} tests' + tests = count(jobs, 'test') else: tests = 'tests' nworkers = len(self.workers) diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index ce1b1088127bf7..03c27b9fe17053 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -17,6 +17,8 @@ MS_WINDOWS = (sys.platform == 'win32') +WORK_DIR_PREFIX = 'test_python_' +WORKER_WORK_DIR_PREFIX = f'{WORK_DIR_PREFIX}worker_' # bpo-38203: Maximum delay in seconds to exit Python (call Py_Finalize()). # Used to protect against threading._shutdown() hang. @@ -346,7 +348,7 @@ def get_build_info(): return build -def get_temp_dir(tmp_dir): +def get_temp_dir(tmp_dir: StrPath | None = None) -> StrPath: if tmp_dir: tmp_dir = os.path.expanduser(tmp_dir) else: @@ -379,7 +381,7 @@ def fix_umask(): os.umask(old_mask) -def get_work_dir(*, parent_dir: StrPath = '', worker: bool = False): +def get_work_dir(parent_dir: StrPath, worker: bool = False) -> StrPath: # 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). @@ -391,12 +393,11 @@ def get_work_dir(*, parent_dir: StrPath = '', worker: bool = False): nounce = os.getpid() if worker: - work_dir = 'test_python_worker_{}'.format(nounce) + work_dir = WORK_DIR_PREFIX + str(nounce) else: - work_dir = 'test_python_{}'.format(nounce) + work_dir = WORKER_WORK_DIR_PREFIX + str(nounce) work_dir += os_helper.FS_NONASCII - if parent_dir: - work_dir = os.path.join(parent_dir, work_dir) + work_dir = os.path.join(parent_dir, work_dir) return work_dir @@ -579,7 +580,7 @@ def display_header(): def cleanup_temp_dir(tmp_dir: StrPath): import glob - path = os.path.join(glob.escape(tmp_dir), 'test_python_*') + path = os.path.join(glob.escape(tmp_dir), WORK_DIR_PREFIX + '*') print("Cleanup %s directory" % tmp_dir) for name in glob.glob(path): if os.path.isdir(name): diff --git a/Lib/test/libregrtest/worker.py b/Lib/test/libregrtest/worker.py index b3b204f65f92ec..0963faa2e4d2a1 100644 --- a/Lib/test/libregrtest/worker.py +++ b/Lib/test/libregrtest/worker.py @@ -1,7 +1,7 @@ import subprocess import sys import os -from typing import TextIO, NoReturn +from typing import NoReturn from test import support from test.support import os_helper @@ -11,7 +11,7 @@ from .single import run_single_test from .utils import ( StrPath, StrJSON, FilterTuple, MS_WINDOWS, - get_work_dir, exit_timeout) + get_temp_dir, get_work_dir, exit_timeout) USE_PROCESS_GROUP = (hasattr(os, "setsid") and hasattr(os, "killpg")) @@ -38,6 +38,11 @@ def create_worker_process(runtests: RunTests, env['TEMP'] = tmp_dir env['TMP'] = tmp_dir + # Emscripten and WASI Python must start in the Python source code directory + # to get 'python.js' or 'python.wasm' file. Then worker_process() changes + # to a temporary directory created to run tests. + work_dir = os_helper.SAVEDCWD + # Running the child from the same working directory as regrtest's original # invocation ensures that TEMPDIR for the child is the same when # sysconfig.is_python_build() is true. See issue 15300. @@ -48,6 +53,7 @@ def create_worker_process(runtests: RunTests, stderr=output_fd, text=True, close_fds=True, + cwd=work_dir, ) if not MS_WINDOWS: kwargs['pass_fds'] = [json_fd] @@ -102,7 +108,8 @@ def main(): sys.exit(1) worker_json = sys.argv[1] - work_dir = get_work_dir(worker=True) + tmp_dir = get_temp_dir() + work_dir = get_work_dir(tmp_dir, worker=True) with exit_timeout(): with os_helper.temp_cwd(work_dir, quiet=True): From 66d1d7eb067d445f1ade151f4a6db3864dd9109f Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Tue, 12 Sep 2023 16:33:30 +0300 Subject: [PATCH 176/357] gh-84867: Do not load tests from TestCase and FunctionTestCase (GH-100497) --- Lib/test/test_unittest/test_loader.py | 29 +++++++++++++++++++ Lib/unittest/loader.py | 22 ++++++++++---- ...2-12-24-12-50-54.gh-issue-84867.OhaLbU.rst | 2 ++ 3 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2022-12-24-12-50-54.gh-issue-84867.OhaLbU.rst diff --git a/Lib/test/test_unittest/test_loader.py b/Lib/test/test_unittest/test_loader.py index f32450c9223d8b..83dd25ca54623f 100644 --- a/Lib/test/test_unittest/test_loader.py +++ b/Lib/test/test_unittest/test_loader.py @@ -82,6 +82,22 @@ def runTest(self): self.assertIsInstance(suite, loader.suiteClass) self.assertEqual(list(suite), [Foo('runTest')]) + # "Do not load any tests from `TestCase` class itself." + def test_loadTestsFromTestCase__from_TestCase(self): + loader = unittest.TestLoader() + + suite = loader.loadTestsFromTestCase(unittest.TestCase) + self.assertIsInstance(suite, loader.suiteClass) + self.assertEqual(list(suite), []) + + # "Do not load any tests from `FunctionTestCase` class." + def test_loadTestsFromTestCase__from_FunctionTestCase(self): + loader = unittest.TestLoader() + + suite = loader.loadTestsFromTestCase(unittest.FunctionTestCase) + self.assertIsInstance(suite, loader.suiteClass) + self.assertEqual(list(suite), []) + ################################################################ ### /Tests for TestLoader.loadTestsFromTestCase @@ -103,6 +119,19 @@ def test(self): expected = [loader.suiteClass([MyTestCase('test')])] self.assertEqual(list(suite), expected) + # "This test ensures that internal `TestCase` subclasses are not loaded" + def test_loadTestsFromModule__TestCase_subclass_internals(self): + # See https://github.com/python/cpython/issues/84867 + m = types.ModuleType('m') + # Simulate imported names: + m.TestCase = unittest.TestCase + m.FunctionTestCase = unittest.FunctionTestCase + + loader = unittest.TestLoader() + suite = loader.loadTestsFromModule(m) + self.assertIsInstance(suite, loader.suiteClass) + self.assertEqual(list(suite), []) + # "This method searches `module` for classes derived from TestCase" # # What happens if no tests are found (no TestCase instances)? diff --git a/Lib/unittest/loader.py b/Lib/unittest/loader.py index 678d627d7c6926..9a3e5cc4bf30e5 100644 --- a/Lib/unittest/loader.py +++ b/Lib/unittest/loader.py @@ -84,9 +84,13 @@ def loadTestsFromTestCase(self, testCaseClass): raise TypeError("Test cases should not be derived from " "TestSuite. Maybe you meant to derive from " "TestCase?") - testCaseNames = self.getTestCaseNames(testCaseClass) - if not testCaseNames and hasattr(testCaseClass, 'runTest'): - testCaseNames = ['runTest'] + if testCaseClass in (case.TestCase, case.FunctionTestCase): + # We don't load any tests from base types that should not be loaded. + testCaseNames = [] + else: + testCaseNames = self.getTestCaseNames(testCaseClass) + if not testCaseNames and hasattr(testCaseClass, 'runTest'): + testCaseNames = ['runTest'] loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames)) return loaded_suite @@ -95,7 +99,11 @@ def loadTestsFromModule(self, module, *, pattern=None): tests = [] for name in dir(module): obj = getattr(module, name) - if isinstance(obj, type) and issubclass(obj, case.TestCase): + if ( + isinstance(obj, type) + and issubclass(obj, case.TestCase) + and obj not in (case.TestCase, case.FunctionTestCase) + ): tests.append(self.loadTestsFromTestCase(obj)) load_tests = getattr(module, 'load_tests', None) @@ -164,7 +172,11 @@ def loadTestsFromName(self, name, module=None): if isinstance(obj, types.ModuleType): return self.loadTestsFromModule(obj) - elif isinstance(obj, type) and issubclass(obj, case.TestCase): + elif ( + isinstance(obj, type) + and issubclass(obj, case.TestCase) + and obj not in (case.TestCase, case.FunctionTestCase) + ): return self.loadTestsFromTestCase(obj) elif (isinstance(obj, types.FunctionType) and isinstance(parent, type) and diff --git a/Misc/NEWS.d/next/Library/2022-12-24-12-50-54.gh-issue-84867.OhaLbU.rst b/Misc/NEWS.d/next/Library/2022-12-24-12-50-54.gh-issue-84867.OhaLbU.rst new file mode 100644 index 00000000000000..8b45dcee481916 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-12-24-12-50-54.gh-issue-84867.OhaLbU.rst @@ -0,0 +1,2 @@ +:class:`unittest.TestLoader` no longer loads test cases from exact +:class:`unittest.TestCase` and :class:`unittest.FunctionTestCase` classes. From 42ab2cbd7b5e76e919b70883ae683e789dbd913d Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Tue, 12 Sep 2023 17:05:29 +0300 Subject: [PATCH 177/357] gh-108303: Add `Lib/test/tokenizedata` to `TESTSUBDIRS` (#109314) --- Makefile.pre.in | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.pre.in b/Makefile.pre.in index 19a802997838a4..922c9d7598003b 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -2246,6 +2246,7 @@ TESTSUBDIRS= idlelib/idle_test \ test/test_zoneinfo \ test/test_zoneinfo/data \ test/tkinterdata \ + test/tokenizedata \ test/tracedmodules \ test/typinganndata \ test/xmltestdata \ From e121fca33bfb03a2d2bc33ba9d6bb5616d09b033 Mon Sep 17 00:00:00 2001 From: AN Long Date: Tue, 12 Sep 2023 22:44:48 +0800 Subject: [PATCH 178/357] gh-109266: Fix msvcrt.kbhit's documented return value (GH-109267) --- Doc/library/msvcrt.rst | 3 ++- PC/clinic/msvcrtmodule.c.h | 4 ++-- PC/msvcrtmodule.c | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Doc/library/msvcrt.rst b/Doc/library/msvcrt.rst index 32693e3d007c05..a24c037678de0c 100644 --- a/Doc/library/msvcrt.rst +++ b/Doc/library/msvcrt.rst @@ -98,7 +98,8 @@ Console I/O .. function:: kbhit() - Return ``True`` if a keypress is waiting to be read. + Returns a nonzero value if a keypress is waiting to be read. Otherwise, + return 0. .. function:: getch() diff --git a/PC/clinic/msvcrtmodule.c.h b/PC/clinic/msvcrtmodule.c.h index e2959a0fda1c52..54ae61bd4f10a9 100644 --- a/PC/clinic/msvcrtmodule.c.h +++ b/PC/clinic/msvcrtmodule.c.h @@ -201,7 +201,7 @@ PyDoc_STRVAR(msvcrt_kbhit__doc__, "kbhit($module, /)\n" "--\n" "\n" -"Return true if a keypress is waiting to be read."); +"Returns a nonzero value if a keypress is waiting to be read. Otherwise, return 0."); #define MSVCRT_KBHIT_METHODDEF \ {"kbhit", (PyCFunction)msvcrt_kbhit, METH_NOARGS, msvcrt_kbhit__doc__}, @@ -695,4 +695,4 @@ msvcrt_SetErrorMode(PyObject *module, PyObject *arg) #ifndef MSVCRT_GETERRORMODE_METHODDEF #define MSVCRT_GETERRORMODE_METHODDEF #endif /* !defined(MSVCRT_GETERRORMODE_METHODDEF) */ -/*[clinic end generated code: output=97e00f191821d4c0 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=525ec6ac4e3cb4f2 input=a9049054013a1b77]*/ diff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c index d7c21766d709a6..9a3462141bffbf 100644 --- a/PC/msvcrtmodule.c +++ b/PC/msvcrtmodule.c @@ -220,12 +220,12 @@ msvcrt_get_osfhandle_impl(PyObject *module, int fd) /*[clinic input] msvcrt.kbhit -> long -Return true if a keypress is waiting to be read. +Returns a nonzero value if a keypress is waiting to be read. Otherwise, return 0. [clinic start generated code]*/ static long msvcrt_kbhit_impl(PyObject *module) -/*[clinic end generated code: output=940dfce6587c1890 input=e70d678a5c2f6acc]*/ +/*[clinic end generated code: output=940dfce6587c1890 input=d0f4cb3289ff51e2]*/ { return _kbhit(); } From 0e76cc359ba5d5e29d7c75355d7c1bc7e817eecf Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Tue, 12 Sep 2023 15:54:04 +0100 Subject: [PATCH 179/357] gh-109184: update traceback module doc w.r.t notes (message is no longer always at the end) (#109201) --- Doc/library/traceback.rst | 42 ++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/Doc/library/traceback.rst b/Doc/library/traceback.rst index 3eb77fc3df5709..67ee73d4b2e1e5 100644 --- a/Doc/library/traceback.rst +++ b/Doc/library/traceback.rst @@ -139,11 +139,11 @@ The module defines the following functions: Format the exception part of a traceback using an exception value such as given by ``sys.last_value``. The return value is a list of strings, each - ending in a newline. Normally, the list contains a single string; however, - for :exc:`SyntaxError` exceptions, it contains several lines that (when - printed) display detailed information about where the syntax error occurred. - The message indicating which exception occurred is the always last string in - the list. + ending in a newline. The list contains the exception's message, which is + normally a single string; however, for :exc:`SyntaxError` exceptions, it + contains several lines that (when printed) display detailed information + about where the syntax error occurred. Following the message, the list + contains the exception's :attr:`notes `. Since Python 3.10, instead of passing *value*, an exception object can be passed as the first argument. If *value* is provided, the first @@ -153,6 +153,9 @@ The module defines the following functions: The *etype* parameter has been renamed to *exc* and is now positional-only. + .. versionchanged:: 3.11 + The returned list now includes any notes attached to the exception. + .. function:: format_exception(exc, /[, value, tb], limit=None, chain=True) @@ -235,6 +238,12 @@ capture data for later printing in a lightweight fashion. group's exceptions array. The formatted output is truncated when either limit is exceeded. + .. versionchanged:: 3.10 + Added the *compact* parameter. + + .. versionchanged:: 3.11 + Added the *max_group_width* and *max_group_depth* parameters. + .. attribute:: __cause__ A :class:`TracebackException` of the original ``__cause__``. @@ -330,35 +339,28 @@ capture data for later printing in a lightweight fashion. some containing internal newlines. :func:`~traceback.print_exception` is a wrapper around this method which just prints the lines to a file. - The message indicating which exception occurred is always the last - string in the output. - .. method:: format_exception_only(*, show_group=False) Format the exception part of the traceback. The return value is a generator of strings, each ending in a newline. - When *show_group* is ``False``, the generator normally emits a single - string; however, for :exc:`SyntaxError` exceptions, it emits several - lines that (when printed) display detailed information about where - the syntax error occurred. The message indicating which exception - occurred is always the last string in the output. + When *show_group* is ``False``, the generator emits the exception's + message followed by its notes (if it has any). The exception message + is normally a single string; however, for :exc:`SyntaxError` exceptions, + it consists of several lines that (when printed) display detailed + information about where the syntax error occurred. When *show_group* is ``True``, and the exception is an instance of :exc:`BaseExceptionGroup`, the nested exceptions are included as well, recursively, with indentation relative to their nesting depth. + .. versionchanged:: 3.11 + The exception's notes are now included in the output. + .. versionchanged:: 3.13 Added the *show_group* parameter. - .. versionchanged:: 3.10 - Added the *compact* parameter. - - .. versionchanged:: 3.11 - Added the *max_group_width* and *max_group_depth* parameters. - - :class:`StackSummary` Objects ----------------------------- From 3cb9a8edca6e3fa0f0045b03a9a6444cf8f7affe Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 12 Sep 2023 09:28:20 -0600 Subject: [PATCH 180/357] gh-60283: Check for redefined test names in CI (#109161) Co-authored-by: Alex Waygood Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- .github/CODEOWNERS | 1 + .github/workflows/build.yml | 2 +- .github/workflows/lint.yml | 4 ++++ .pre-commit-config.yaml | 10 ++++++++++ Lib/test/.ruff.toml | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 Lib/test/.ruff.toml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 81c580eb778625..cd35cba5b5c56d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -9,6 +9,7 @@ # pre-commit .pre-commit-config.yaml @hugovk @AlexWaygood +.ruff.toml @hugovk @AlexWaygood # Build system configure* @erlend-aasland @corona10 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 668ae499f06f17..cbe5c841a433cf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -63,7 +63,7 @@ jobs: # into the PR branch anyway. # # https://github.com/python/core-workflow/issues/373 - git diff --name-only origin/$GITHUB_BASE_REF.. | grep -qvE '(\.rst$|^Doc|^Misc)' && echo "run_tests=true" >> $GITHUB_OUTPUT || true + git diff --name-only origin/$GITHUB_BASE_REF.. | grep -qvE '(\.rst$|^Doc|^Misc|^\.pre-commit-config\.yaml$|\.ruff\.toml$)' && echo "run_tests=true" >> $GITHUB_OUTPUT || true fi # Check if we should run hypothesis tests diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 27b04ba1d412e3..89f65816b6969d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -5,6 +5,10 @@ on: [push, pull_request, workflow_dispatch] permissions: contents: read +env: + FORCE_COLOR: 1 + RUFF_FORMAT: github + concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 68e75fa44fab60..4c1fd20ea921b8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,17 @@ repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.0.288 + hooks: + - id: ruff + name: Run Ruff on Lib/test/ + args: [--exit-non-zero-on-fix] + files: ^Lib/test/ + - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: + - id: check-toml + exclude: ^Lib/test/test_tomllib/ - id: check-yaml - id: end-of-file-fixer types: [python] diff --git a/Lib/test/.ruff.toml b/Lib/test/.ruff.toml new file mode 100644 index 00000000000000..a9a4a013dabec9 --- /dev/null +++ b/Lib/test/.ruff.toml @@ -0,0 +1,35 @@ +fix = true +select = [ + "F811", # Redefinition of unused variable (useful for finding test methods with the same name) +] +extend-exclude = [ + # Failed to lint + "badsyntax_pep3120.py", + "encoded_modules/module_iso_8859_1.py", + "encoded_modules/module_koi8_r.py", + # Failed to parse + "badsyntax_3131.py", + "support/socket_helper.py", + "test_fstring.py", + # TODO Fix: F811 Redefinition of unused name + "test__opcode.py", + "test_buffer.py", + "test_ctypes/test_arrays.py", + "test_ctypes/test_functions.py", + "test_dataclasses/__init__.py", + "test_descr.py", + "test_enum.py", + "test_functools.py", + "test_genericclass.py", + "test_grammar.py", + "test_import/__init__.py", + "test_keywordonlyarg.py", + "test_pkg.py", + "test_subclassinit.py", + "test_typing.py", + "test_unittest/testmock/testpatch.py", + "test_yield_from.py", + "time_hashlib.py", + # Pending https://github.com/python/cpython/pull/109139 + "test_monitoring.py", +] From b303d3ad3e80e1d9b3befe6650f61f38b72179a4 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Tue, 12 Sep 2023 16:45:35 +0100 Subject: [PATCH 181/357] gh-109319: deprecate dis.HAVE_ARGUMENT (#109320) --- Doc/library/dis.rst | 2 ++ Doc/whatsnew/3.13.rst | 5 +++++ .../Library/2023-09-12-13-01-55.gh-issue-109319.YaCMtW.rst | 1 + 3 files changed, 8 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2023-09-12-13-01-55.gh-issue-109319.YaCMtW.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index d929242ede743d..72e55cd81d42f6 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1623,6 +1623,8 @@ iterations of the loop. it is not true that comparison with ``HAVE_ARGUMENT`` indicates whether they use their arg. + .. deprecated:: 3.13 + Use :data:`hasarg` instead. .. opcode:: CALL_INTRINSIC_1 diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index 8c6467562aeb62..c18e15e0448f05 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -301,6 +301,11 @@ Deprecated (Contributed by Erlend E. Aasland in :gh:`107948` and :gh:`108278`.) +* The ``dis.HAVE_ARGUMENT`` separator is deprecated. Check membership + in :data:`~dis.hasarg` instead. + (Contributed by Irit Katriel in :gh:`109319`.) + + Pending Removal in Python 3.14 ------------------------------ diff --git a/Misc/NEWS.d/next/Library/2023-09-12-13-01-55.gh-issue-109319.YaCMtW.rst b/Misc/NEWS.d/next/Library/2023-09-12-13-01-55.gh-issue-109319.YaCMtW.rst new file mode 100644 index 00000000000000..d3cd86b040821a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-12-13-01-55.gh-issue-109319.YaCMtW.rst @@ -0,0 +1 @@ +Deprecate the ``dis.HAVE_ARGUMENT`` field in favour of ``dis.hasarg``. From d12b3e3152b1858e91c4890d0bf3a3b574a3ff6f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 12 Sep 2023 18:43:32 +0200 Subject: [PATCH 182/357] gh-109276: test.pythoninfo gets more test.support data (#109337) Collect data from: * test.support * test.support.os_helper * test.support.socket_helper * test.support.threading_helper --- Lib/test/pythoninfo.py | 77 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 9 deletions(-) diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index e52fa6bdf05f71..ea3a78a341c43f 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -717,26 +717,82 @@ def collect_test_socket(info_add): copy_attributes(info_add, test_socket, 'test_socket.%s', attributes) -def collect_test_support(info_add): +def collect_support(info_add): try: from test import support except ImportError: return - attributes = ('IPV6_ENABLED',) - copy_attributes(info_add, support, 'test_support.%s', attributes) + attributes = ( + 'has_fork_support', + 'has_socket_support', + 'has_strftime_extensions', + 'has_subprocess_support', + 'is_android', + 'is_emscripten', + 'is_jython', + 'is_wasi', + ) + copy_attributes(info_add, support, 'support.%s', attributes) - call_func(info_add, 'test_support._is_gui_available', support, '_is_gui_available') - call_func(info_add, 'test_support.python_is_optimized', support, 'python_is_optimized') + call_func(info_add, 'support._is_gui_available', support, '_is_gui_available') + call_func(info_add, 'support.python_is_optimized', support, 'python_is_optimized') - info_add('test_support.check_sanitizer(address=True)', + info_add('support.check_sanitizer(address=True)', support.check_sanitizer(address=True)) - info_add('test_support.check_sanitizer(memory=True)', + info_add('support.check_sanitizer(memory=True)', support.check_sanitizer(memory=True)) - info_add('test_support.check_sanitizer(ub=True)', + info_add('support.check_sanitizer(ub=True)', support.check_sanitizer(ub=True)) +def collect_support_os_helper(info_add): + try: + from test.support import os_helper + except ImportError: + return + + for name in ( + 'can_symlink', + 'can_xattr', + 'can_chmod', + 'can_dac_override', + ): + func = getattr(os_helper, name) + info_add(f'support_os_helper.{name}', func()) + + +def collect_support_socket_helper(info_add): + try: + from test.support import socket_helper + except ImportError: + return + + attributes = ( + 'IPV6_ENABLED', + 'has_gethostname', + ) + copy_attributes(info_add, socket_helper, 'support_socket_helper.%s', attributes) + + for name in ( + 'tcp_blackhole', + ): + func = getattr(socket_helper, name) + info_add(f'support_socket_helper.{name}', func()) + + +def collect_support_threading_helper(info_add): + try: + from test.support import threading_helper + except ImportError: + return + + attributes = ( + 'can_start_thread', + ) + copy_attributes(info_add, threading_helper, 'support_threading_helper.%s', attributes) + + def collect_cc(info_add): import subprocess import sysconfig @@ -938,7 +994,10 @@ def collect_info(info): # Collecting from tests should be last as they have side effects. collect_test_socket, - collect_test_support, + collect_support, + collect_support_os_helper, + collect_support_socket_helper, + collect_support_threading_helper, ): try: collect_func(info_add) From b86ce91bfeeb0437a38ee6b59fb86d5d37d529ee Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 12 Sep 2023 10:58:40 -0700 Subject: [PATCH 183/357] gh-106581: Honor 'always_exits' in write_components() (#109338) I must have overlooked this when refactoring the code generator. The Tier 1 interpreter contained a few silly things like ``` goto resume_frame; STACK_SHRINK(1); ``` (and other variations, some where the unconditional `goto` was hidden in a macro). --- Python/generated_cases.c.h | 14 -------------- Tools/cases_generator/stacking.py | 2 +- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index b86e35f84fda09..9742c95c407554 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -803,7 +803,6 @@ SKIP_OVER(INLINE_CACHE_ENTRIES_BINARY_SUBSCR); frame->return_offset = 0; DISPATCH_INLINED(new_frame); - STACK_SHRINK(1); } TARGET(LIST_APPEND) { @@ -969,7 +968,6 @@ break; } if (true) { STACK_SHRINK(oparg); goto error; } - STACK_SHRINK(oparg); } TARGET(INTERPRETER_EXIT) { @@ -982,7 +980,6 @@ assert(!_PyErr_Occurred(tstate)); tstate->c_recursion_remaining += PY_EVAL_C_STACK_UNITS; return retval; - STACK_SHRINK(1); } TARGET(RETURN_VALUE) { @@ -1044,7 +1041,6 @@ frame->prev_instr += frame->return_offset; _PyFrame_StackPush(frame, retval); goto resume_frame; - STACK_SHRINK(1); } TARGET(RETURN_CONST) { @@ -1388,7 +1384,6 @@ _PyErr_SetRaisedException(tstate, exc); monitor_reraise(tstate, frame, next_instr-1); goto exception_unwind; - STACK_SHRINK(1); } TARGET(END_ASYNC_FOR) { @@ -2210,8 +2205,6 @@ // don't want to specialize instrumented instructions INCREMENT_ADAPTIVE_COUNTER(cache->counter); GO_TO_INSTRUCTION(LOAD_SUPER_ATTR); - STACK_SHRINK(2); - STACK_GROW(((oparg & 1) ? 1 : 0)); } TARGET(LOAD_SUPER_ATTR) { @@ -3422,7 +3415,6 @@ next_instr[oparg].op.code == INSTRUMENTED_END_FOR); frame->return_offset = oparg; DISPATCH_INLINED(gen_frame); - STACK_GROW(1); } TARGET(BEFORE_ASYNC_WITH) { @@ -4032,8 +4024,6 @@ SKIP_OVER(INLINE_CACHE_ENTRIES_CALL); frame->return_offset = 0; DISPATCH_INLINED(new_frame); - STACK_SHRINK(oparg); - STACK_SHRINK(1); } TARGET(CALL_NO_KW_TYPE_1) { @@ -4169,8 +4159,6 @@ * as it will be checked after start_frame */ tstate->py_recursion_remaining--; goto start_frame; - STACK_SHRINK(oparg); - STACK_SHRINK(1); } TARGET(EXIT_INIT_CHECK) { @@ -4453,8 +4441,6 @@ SKIP_OVER(INLINE_CACHE_ENTRIES_CALL + 1); assert(next_instr[-1].op.code == POP_TOP); DISPATCH(); - STACK_SHRINK(oparg); - STACK_SHRINK(1); } TARGET(CALL_NO_KW_METHOD_DESCRIPTOR_O) { diff --git a/Tools/cases_generator/stacking.py b/Tools/cases_generator/stacking.py index 026f0392eff1d7..9cf9ad1a6c9e6d 100644 --- a/Tools/cases_generator/stacking.py +++ b/Tools/cases_generator/stacking.py @@ -457,7 +457,7 @@ def write_components( with out.block(""): mgr.instr.write_body(out, -4, mgr.active_caches, tier) - if mgr is managers[-1] and not next_instr_is_set: + if mgr is managers[-1] and not next_instr_is_set and not mgr.instr.always_exits: # Adjust the stack to its final depth, *then* write the # pokes for all preceding uops. # Note that for array output effects we may still write From 44c8699196c1951037bc549c895ea5af26c7254e Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 12 Sep 2023 12:03:55 -0700 Subject: [PATCH 184/357] Update workflow permissions in require-pr-label Action (#109342) Change the permission from `read` to `write`. --- .github/workflows/require-pr-label.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/require-pr-label.yml b/.github/workflows/require-pr-label.yml index 9327b43ae02710..080204bcfd3b94 100644 --- a/.github/workflows/require-pr-label.yml +++ b/.github/workflows/require-pr-label.yml @@ -5,8 +5,8 @@ on: types: [opened, reopened, labeled, unlabeled, synchronize] permissions: - issues: read - pull-requests: read + issues: write + pull-requests: write jobs: label: From 90cf345ed42ae4d17d2a073718985eb3432a7c20 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Tue, 12 Sep 2023 21:32:13 +0100 Subject: [PATCH 185/357] GH-104395: Add a link in 'Meta Information' to the docs download page (#104443) Co-authored-by: Hugo van Kemenade --- Doc/tools/templates/indexcontent.html | 1 + 1 file changed, 1 insertion(+) diff --git a/Doc/tools/templates/indexcontent.html b/Doc/tools/templates/indexcontent.html index a96746b69fd41b..1e3ab7cfe02fee 100644 --- a/Doc/tools/templates/indexcontent.html +++ b/Doc/tools/templates/indexcontent.html @@ -62,6 +62,7 @@

{{ docstitle|e }}

+ {% endblock %} From 5dcbbd8861e618488d95416dee8ea94577e3f4f0 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 12 Sep 2023 17:12:57 -0400 Subject: [PATCH 186/357] GH-109330: Dump and compare stats using opcode names, not numbers (GH-109335) --- Python/specialize.c | 16 +++---- Tools/scripts/summarize_stats.py | 72 ++++++++++++-------------------- 2 files changed, 35 insertions(+), 53 deletions(-) diff --git a/Python/specialize.c b/Python/specialize.c index 91243419ec6fb0..47e0bd7a69dfea 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -123,7 +123,7 @@ _Py_GetSpecializationStats(void) { #define PRINT_STAT(i, field) \ if (stats[i].field) { \ - fprintf(out, " opcode[%d]." #field " : %" PRIu64 "\n", i, stats[i].field); \ + fprintf(out, " opcode[%s]." #field " : %" PRIu64 "\n", _PyOpcode_OpName[i], stats[i].field); \ } static void @@ -131,11 +131,11 @@ print_spec_stats(FILE *out, OpcodeStats *stats) { /* Mark some opcodes as specializable for stats, * even though we don't specialize them yet. */ - fprintf(out, "opcode[%d].specializable : 1\n", BINARY_SLICE); - fprintf(out, "opcode[%d].specializable : 1\n", STORE_SLICE); + fprintf(out, "opcode[BINARY_SLICE].specializable : 1\n"); + fprintf(out, "opcode[STORE_SLICE].specializable : 1\n"); for (int i = 0; i < 256; i++) { if (_PyOpcode_Caches[i]) { - fprintf(out, "opcode[%d].specializable : 1\n", i); + fprintf(out, "opcode[%s].specializable : 1\n", _PyOpcode_OpName[i]); } PRINT_STAT(i, specialization.success); PRINT_STAT(i, specialization.failure); @@ -147,14 +147,14 @@ print_spec_stats(FILE *out, OpcodeStats *stats) for (int j = 0; j < SPECIALIZATION_FAILURE_KINDS; j++) { uint64_t val = stats[i].specialization.failure_kinds[j]; if (val) { - fprintf(out, " opcode[%d].specialization.failure_kinds[%d] : %" - PRIu64 "\n", i, j, val); + fprintf(out, " opcode[%s].specialization.failure_kinds[%d] : %" + PRIu64 "\n", _PyOpcode_OpName[i], j, val); } } for (int j = 0; j < 256; j++) { if (stats[i].pair_count[j]) { - fprintf(out, "opcode[%d].pair_count[%d] : %" PRIu64 "\n", - i, j, stats[i].pair_count[j]); + fprintf(out, "opcode[%s].pair_count[%s] : %" PRIu64 "\n", + _PyOpcode_OpName[i], _PyOpcode_OpName[j], stats[i].pair_count[j]); } } } diff --git a/Tools/scripts/summarize_stats.py b/Tools/scripts/summarize_stats.py index 55b67643977a00..484dfe8a2b7dbd 100644 --- a/Tools/scripts/summarize_stats.py +++ b/Tools/scripts/summarize_stats.py @@ -16,22 +16,6 @@ else: DEFAULT_DIR = "/tmp/py_stats/" -#Create list of all instruction names -specialized = iter(opcode._specialized_opmap.keys()) -opname = ["<0>"] -for name in opcode.opname[1:]: - if name.startswith("<"): - try: - name = next(specialized) - except StopIteration: - pass - opname.append(name) - -# opcode_name --> opcode -# Sort alphabetically. -opmap = {name: i for i, name in enumerate(opname)} -opmap = dict(sorted(opmap.items())) - TOTAL = "specialization.hit", "specialization.miss", "execution_count" def format_ratio(num, den): @@ -200,12 +184,12 @@ def gather_stats(input): raise ValueError(f"{input:r} is not a file or directory path") def extract_opcode_stats(stats): - opcode_stats = [ {} for _ in range(256) ] + opcode_stats = collections.defaultdict(dict) for key, value in stats.items(): if not key.startswith("opcode"): continue - n, _, rest = key[7:].partition("]") - opcode_stats[int(n)][rest.strip(".")] = value + name, _, rest = key[7:].partition("]") + opcode_stats[name][rest.strip(".")] = value return opcode_stats def parse_kinds(spec_src, prefix="SPEC_FAIL"): @@ -246,11 +230,10 @@ def categorized_counts(opcode_stats): specialized_instructions = { op for op in opcode._specialized_opmap.keys() if "__" not in op} - for i, opcode_stat in enumerate(opcode_stats): + for name, opcode_stat in opcode_stats.items(): if "execution_count" not in opcode_stat: continue count = opcode_stat['execution_count'] - name = opname[i] if "specializable" in opcode_stat: not_specialized += count elif name in specialized_instructions: @@ -314,13 +297,13 @@ def emit_table(header, rows): def calculate_execution_counts(opcode_stats, total): counts = [] - for i, opcode_stat in enumerate(opcode_stats): + for name, opcode_stat in opcode_stats.items(): if "execution_count" in opcode_stat: count = opcode_stat['execution_count'] miss = 0 if "specializable" not in opcode_stat: miss = opcode_stat.get("specialization.miss") - counts.append((count, opname[i], miss)) + counts.append((count, name, miss)) counts.sort(reverse=True) cumulative = 0 rows = [] @@ -381,16 +364,17 @@ def get_defines(): def emit_specialization_stats(opcode_stats): defines = get_defines() with Section("Specialization stats", summary="specialization stats by family"): - for i, opcode_stat in enumerate(opcode_stats): - name = opname[i] + for name, opcode_stat in opcode_stats.items(): print_specialization_stats(name, opcode_stat, defines) def emit_comparative_specialization_stats(base_opcode_stats, head_opcode_stats): defines = get_defines() with Section("Specialization stats", summary="specialization stats by family"): - for i, (base_opcode_stat, head_opcode_stat) in enumerate(zip(base_opcode_stats, head_opcode_stats)): - name = opname[i] - print_comparative_specialization_stats(name, base_opcode_stat, head_opcode_stat, defines) + opcodes = set(base_opcode_stats.keys()) & set(head_opcode_stats.keys()) + for opcode in opcodes: + print_comparative_specialization_stats( + opcode, base_opcode_stats[opcode], head_opcode_stats[opcode], defines + ) def calculate_specialization_effectiveness(opcode_stats, total): basic, not_specialized, specialized = categorized_counts(opcode_stats) @@ -407,12 +391,12 @@ def emit_specialization_overview(opcode_stats, total): for title, field in (("Deferred", "specialization.deferred"), ("Misses", "specialization.miss")): total = 0 counts = [] - for i, opcode_stat in enumerate(opcode_stats): + for name, opcode_stat in opcode_stats.items(): # Avoid double counting misses if title == "Misses" and "specializable" in opcode_stat: continue value = opcode_stat.get(field, 0) - counts.append((value, opname[i])) + counts.append((value, name)) total += value counts.sort(reverse=True) if total: @@ -539,29 +523,27 @@ def emit_comparative_gc_stats(base_stats, head_stats): def get_total(opcode_stats): total = 0 - for opcode_stat in opcode_stats: + for opcode_stat in opcode_stats.values(): if "execution_count" in opcode_stat: total += opcode_stat['execution_count'] return total def emit_pair_counts(opcode_stats, total): pair_counts = [] - for i, opcode_stat in enumerate(opcode_stats): - if i == 0: - continue + for name_i, opcode_stat in opcode_stats.items(): for key, value in opcode_stat.items(): if key.startswith("pair_count"): - x, _, _ = key[11:].partition("]") + name_j, _, _ = key[11:].partition("]") if value: - pair_counts.append((value, (i, int(x)))) + pair_counts.append((value, (name_i, name_j))) with Section("Pair counts", summary="Pair counts for top 100 pairs"): pair_counts.sort(reverse=True) cumulative = 0 rows = [] for (count, pair) in itertools.islice(pair_counts, 100): - i, j = pair + name_i, name_j = pair cumulative += count - rows.append((opname[i] + " " + opname[j], count, format_ratio(count, total), + rows.append((f"{name_i} {name_j}", count, format_ratio(count, total), format_ratio(cumulative, total))) emit_table(("Pair", "Count:", "Self:", "Cumulative:"), rows @@ -577,18 +559,18 @@ def emit_pair_counts(opcode_stats, total): successors[first][second] = count total_predecessors[second] += count total_successors[first] += count - for name, i in opmap.items(): - total1 = total_predecessors[i] - total2 = total_successors[i] + for name in opcode_stats.keys(): + total1 = total_predecessors[name] + total2 = total_successors[name] if total1 == 0 and total2 == 0: continue pred_rows = succ_rows = () if total1: - pred_rows = [(opname[pred], count, f"{count/total1:.1%}") - for (pred, count) in predecessors[i].most_common(5)] + pred_rows = [(pred, count, f"{count/total1:.1%}") + for (pred, count) in predecessors[name].most_common(5)] if total2: - succ_rows = [(opname[succ], count, f"{count/total2:.1%}") - for (succ, count) in successors[i].most_common(5)] + succ_rows = [(succ, count, f"{count/total2:.1%}") + for (succ, count) in successors[name].most_common(5)] with Section(name, 3, f"Successors and predecessors for {name}"): emit_table(("Predecessors", "Count:", "Percentage:"), pred_rows From 75cdd9a904bbed9ac3bf02ef53b1c4c58aeee4d0 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 13 Sep 2023 00:41:25 +0200 Subject: [PATCH 187/357] gh-109276: libregrtest: WASM use filename for JSON (#109340) On Emscripten and WASI platforms, or if --python command line option is used, libregrtest now uses a filename for the JSON file. Emscripten and WASI buildbot workers run the main test process with a different Python (Linux) which spawns Emscripten/WASI processes using the command specified in --python command line option. Passing a file descriptor from the parent process to the child process doesn't work in this case. * Add JsonFile and JsonFileType classes * Add RunTests.json_file_use_filename() method. * Add a test in test_regrtest on the --python command line option. * test_regrtest: add parallel=False parameter. * Split long RunWorkers._runtest() function into sub-functions. --- Lib/test/libregrtest/main.py | 2 +- Lib/test/libregrtest/run_workers.py | 249 +++++++++++++++++----------- Lib/test/libregrtest/runtests.py | 68 +++++++- Lib/test/libregrtest/utils.py | 12 +- Lib/test/libregrtest/worker.py | 43 ++--- Lib/test/test_regrtest.py | 39 ++++- 6 files changed, 273 insertions(+), 140 deletions(-) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index dd9a10764b075a..ba493ae1796fe0 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -406,7 +406,7 @@ def create_run_tests(self, tests: TestTuple): python_cmd=self.python_cmd, randomize=self.randomize, random_seed=self.random_seed, - json_fd=None, + json_file=None, ) def _run_tests(self, selected: TestTuple, tests: TestList | None) -> int: diff --git a/Lib/test/libregrtest/run_workers.py b/Lib/test/libregrtest/run_workers.py index eaca0af17ea13a..a6bebccd0c7585 100644 --- a/Lib/test/libregrtest/run_workers.py +++ b/Lib/test/libregrtest/run_workers.py @@ -1,3 +1,4 @@ +import contextlib import dataclasses import faulthandler import os.path @@ -9,7 +10,7 @@ import threading import time import traceback -from typing import Literal +from typing import Literal, TextIO from test import support from test.support import os_helper @@ -17,10 +18,10 @@ from .logger import Logger from .result import TestResult, State from .results import TestResults -from .runtests import RunTests +from .runtests import RunTests, JsonFile, JsonFileType from .single import PROGRESS_MIN_TIME from .utils import ( - StrPath, StrJSON, TestName, MS_WINDOWS, + StrPath, StrJSON, TestName, MS_WINDOWS, TMP_PREFIX, format_duration, print_warning, count, plural) from .worker import create_worker_process, USE_PROCESS_GROUP @@ -83,6 +84,17 @@ class ExitThread(Exception): pass +class WorkerError(Exception): + def __init__(self, + test_name: TestName, + err_msg: str | None, + stdout: str | None, + state: str = State.MULTIPROCESSING_ERROR): + result = TestResult(test_name, state=state) + self.mp_result = MultiprocessResult(result, stdout, err_msg) + super().__init__() + + class WorkerThread(threading.Thread): def __init__(self, worker_id: int, runner: "RunWorkers") -> None: super().__init__() @@ -92,7 +104,7 @@ def __init__(self, worker_id: int, runner: "RunWorkers") -> None: self.output = runner.output self.timeout = runner.worker_timeout self.log = runner.log - self.current_test_name = None + self.test_name = None self.start_time = None self._popen = None self._killed = False @@ -104,7 +116,7 @@ def __repr__(self) -> str: info.append("running") else: info.append('stopped') - test = self.current_test_name + test = self.test_name if test: info.append(f'test={test}') popen = self._popen @@ -147,25 +159,11 @@ def stop(self) -> None: self._stopped = True self._kill() - def mp_result_error( - self, - test_result: TestResult, - stdout: str | None = None, - err_msg=None - ) -> MultiprocessResult: - return MultiprocessResult(test_result, stdout, err_msg) - - def _run_process(self, runtests: RunTests, output_fd: int, json_fd: int, + def _run_process(self, runtests: RunTests, output_fd: int, tmp_dir: StrPath | None = None) -> int: - try: - popen = create_worker_process(runtests, output_fd, json_fd, - tmp_dir) - - self._killed = False - self._popen = popen - except: - self.current_test_name = None - raise + popen = create_worker_process(runtests, output_fd, tmp_dir) + self._popen = popen + self._killed = False try: if self._stopped: @@ -206,10 +204,9 @@ def _run_process(self, runtests: RunTests, output_fd: int, json_fd: int, finally: self._wait_completed() self._popen = None - self.current_test_name = None - def _runtest(self, test_name: TestName) -> MultiprocessResult: - self.current_test_name = test_name + def create_stdout(self, stack: contextlib.ExitStack) -> TextIO: + """Create stdout temporay file (file descriptor).""" if MS_WINDOWS: # gh-95027: When stdout is not a TTY, Python uses the ANSI code @@ -219,85 +216,135 @@ def _runtest(self, test_name: TestName) -> MultiprocessResult: else: encoding = sys.stdout.encoding + # gh-94026: Write stdout+stderr to a tempfile as workaround for + # non-blocking pipes on Emscripten with NodeJS. + stdout_file = tempfile.TemporaryFile('w+', encoding=encoding) + stack.enter_context(stdout_file) + return stdout_file + + def create_json_file(self, stack: contextlib.ExitStack) -> tuple[JsonFile, TextIO | None]: + """Create JSON file.""" + + json_file_use_filename = self.runtests.json_file_use_filename() + if json_file_use_filename: + # create an empty file to make the creation atomic + # (to prevent races with other worker threads) + prefix = TMP_PREFIX + 'json_' + json_fd, json_filename = tempfile.mkstemp(prefix=prefix) + os.close(json_fd) + + stack.callback(os_helper.unlink, json_filename) + json_file = JsonFile(json_filename, JsonFileType.FILENAME) + json_tmpfile = None + else: + json_tmpfile = tempfile.TemporaryFile('w+', encoding='utf8') + stack.enter_context(json_tmpfile) + + json_fd = json_tmpfile.fileno() + if MS_WINDOWS: + json_handle = msvcrt.get_osfhandle(json_fd) + json_file = JsonFile(json_handle, + JsonFileType.WINDOWS_HANDLE) + else: + json_file = JsonFile(json_fd, JsonFileType.UNIX_FD) + return (json_file, json_tmpfile) + + def create_worker_runtests(self, test_name: TestName, json_file: JsonFile) -> RunTests: + """Create the worker RunTests.""" + tests = (test_name,) if self.runtests.rerun: match_tests = self.runtests.get_match_tests(test_name) else: match_tests = None - err_msg = None - # gh-94026: Write stdout+stderr to a tempfile as workaround for - # non-blocking pipes on Emscripten with NodeJS. - with (tempfile.TemporaryFile('w+', encoding=encoding) as stdout_file, - tempfile.TemporaryFile('w+', encoding='utf8') as json_file): - stdout_fd = stdout_file.fileno() - json_fd = json_file.fileno() - if MS_WINDOWS: - json_fd = msvcrt.get_osfhandle(json_fd) - - kwargs = {} - if match_tests: - kwargs['match_tests'] = match_tests - worker_runtests = self.runtests.copy( - tests=tests, - json_fd=json_fd, - **kwargs) - - # gh-93353: Check for leaked temporary files in the parent process, - # since the deletion of temporary files can happen late during - # Python finalization: too late for libregrtest. - if not support.is_wasi: - # Don't check for leaked temporary files and directories if Python is - # run on WASI. WASI don't pass environment variables like TMPDIR to - # worker processes. - tmp_dir = tempfile.mkdtemp(prefix="test_python_") - tmp_dir = os.path.abspath(tmp_dir) - try: - retcode = self._run_process(worker_runtests, - stdout_fd, json_fd, tmp_dir) - finally: - tmp_files = os.listdir(tmp_dir) - os_helper.rmtree(tmp_dir) - else: + kwargs = {} + if match_tests: + kwargs['match_tests'] = match_tests + return self.runtests.copy( + tests=tests, + json_file=json_file, + **kwargs) + + def run_tmp_files(self, worker_runtests: RunTests, + stdout_fd: int) -> (int, list[StrPath]): + # gh-93353: Check for leaked temporary files in the parent process, + # since the deletion of temporary files can happen late during + # Python finalization: too late for libregrtest. + if not support.is_wasi: + # Don't check for leaked temporary files and directories if Python is + # run on WASI. WASI don't pass environment variables like TMPDIR to + # worker processes. + tmp_dir = tempfile.mkdtemp(prefix="test_python_") + tmp_dir = os.path.abspath(tmp_dir) + try: retcode = self._run_process(worker_runtests, - stdout_fd, json_fd) - tmp_files = () - stdout_file.seek(0) + stdout_fd, tmp_dir) + finally: + tmp_files = os.listdir(tmp_dir) + os_helper.rmtree(tmp_dir) + else: + retcode = self._run_process(worker_runtests, stdout_fd) + tmp_files = [] - try: - stdout = stdout_file.read().strip() - except Exception as exc: - # gh-101634: Catch UnicodeDecodeError if stdout cannot be - # decoded from encoding - err_msg = f"Cannot read process stdout: {exc}" - result = TestResult(test_name, state=State.MULTIPROCESSING_ERROR) - return self.mp_result_error(result, err_msg=err_msg) + return (retcode, tmp_files) - try: - # deserialize run_tests_worker() output - json_file.seek(0) - worker_json: StrJSON = json_file.read() - if worker_json: - result = TestResult.from_json(worker_json) - else: - err_msg = "empty JSON" - except Exception as exc: - # gh-101634: Catch UnicodeDecodeError if stdout cannot be - # decoded from encoding - err_msg = f"Fail to read or parser worker process JSON: {exc}" - result = TestResult(test_name, state=State.MULTIPROCESSING_ERROR) - return self.mp_result_error(result, stdout, err_msg=err_msg) - - if retcode is None: - result = TestResult(test_name, state=State.TIMEOUT) - return self.mp_result_error(result, stdout) + def read_stdout(self, stdout_file: TextIO) -> str: + stdout_file.seek(0) + try: + return stdout_file.read().strip() + except Exception as exc: + # gh-101634: Catch UnicodeDecodeError if stdout cannot be + # decoded from encoding + raise WorkerError(self.test_name, + f"Cannot read process stdout: {exc}", None) + + def read_json(self, json_file: JsonFile, json_tmpfile: TextIO | None, + stdout: str) -> TestResult: + try: + if json_tmpfile is not None: + json_tmpfile.seek(0) + worker_json: StrJSON = json_tmpfile.read() + else: + with json_file.open(encoding='utf8') as json_fp: + worker_json: StrJSON = json_fp.read() + except Exception as exc: + # gh-101634: Catch UnicodeDecodeError if stdout cannot be + # decoded from encoding + err_msg = f"Failed to read worker process JSON: {exc}" + raise WorkerError(self.test_name, err_msg, stdout, + state=State.MULTIPROCESSING_ERROR) + + if not worker_json: + raise WorkerError(self.test_name, "empty JSON", stdout) - if retcode != 0: - err_msg = "Exit code %s" % retcode + try: + return TestResult.from_json(worker_json) + except Exception as exc: + # gh-101634: Catch UnicodeDecodeError if stdout cannot be + # decoded from encoding + err_msg = f"Failed to parse worker process JSON: {exc}" + raise WorkerError(self.test_name, err_msg, stdout, + state=State.MULTIPROCESSING_ERROR) + + def _runtest(self, test_name: TestName) -> MultiprocessResult: + with contextlib.ExitStack() as stack: + stdout_file = self.create_stdout(stack) + json_file, json_tmpfile = self.create_json_file(stack) + worker_runtests = self.create_worker_runtests(test_name, json_file) + + retcode, tmp_files = self.run_tmp_files(worker_runtests, + stdout_file.fileno()) + + stdout = self.read_stdout(stdout_file) - if err_msg: - result = TestResult(test_name, state=State.MULTIPROCESSING_ERROR) - return self.mp_result_error(result, stdout, err_msg) + if retcode is None: + raise WorkerError(self.test_name, None, stdout, state=State.TIMEOUT) + + result = self.read_json(json_file, json_tmpfile, stdout) + + if retcode != 0: + raise WorkerError(self.test_name, f"Exit code {retcode}", stdout) if tmp_files: msg = (f'\n\n' @@ -319,7 +366,13 @@ def run(self) -> None: break self.start_time = time.monotonic() - mp_result = self._runtest(test_name) + self.test_name = test_name + try: + mp_result = self._runtest(test_name) + except WorkerError as exc: + mp_result = exc.mp_result + finally: + self.test_name = None mp_result.result.duration = time.monotonic() - self.start_time self.output.put((False, mp_result)) @@ -367,12 +420,12 @@ def wait_stopped(self, start_time: float) -> None: def get_running(workers: list[WorkerThread]) -> list[str]: running = [] for worker in workers: - current_test_name = worker.current_test_name - if not current_test_name: + test_name = worker.test_name + if not test_name: continue dt = time.monotonic() - worker.start_time if dt >= PROGRESS_MIN_TIME: - text = '%s (%s)' % (current_test_name, format_duration(dt)) + text = f'{test_name} ({format_duration(dt)})' running.append(text) if not running: return None diff --git a/Lib/test/libregrtest/runtests.py b/Lib/test/libregrtest/runtests.py index 5c68df126e2a8f..62a0a7e20c7b8b 100644 --- a/Lib/test/libregrtest/runtests.py +++ b/Lib/test/libregrtest/runtests.py @@ -1,11 +1,62 @@ +import contextlib import dataclasses import json +import os +import subprocess from typing import Any +from test import support + from .utils import ( StrPath, StrJSON, TestTuple, FilterTuple, FilterDict) +class JsonFileType: + UNIX_FD = "UNIX_FD" + WINDOWS_HANDLE = "WINDOWS_HANDLE" + FILENAME = "FILENAME" + + +@dataclasses.dataclass(slots=True, frozen=True) +class JsonFile: + # See RunTests.json_file_use_filename() + file: int | StrPath + file_type: str + + def configure_subprocess(self, popen_kwargs: dict) -> None: + match self.file_type: + case JsonFileType.UNIX_FD: + # Unix file descriptor + popen_kwargs['pass_fds'] = [self.file] + case JsonFileType.WINDOWS_HANDLE: + # Windows handle + startupinfo = subprocess.STARTUPINFO() + startupinfo.lpAttributeList = {"handle_list": [self.file]} + popen_kwargs['startupinfo'] = startupinfo + case JsonFileType.FILENAME: + # Filename: nothing to do to + pass + + @contextlib.contextmanager + def inherit_subprocess(self): + if self.file_type == JsonFileType.WINDOWS_HANDLE: + os.set_handle_inheritable(self.file, True) + try: + yield + finally: + os.set_handle_inheritable(self.file, False) + else: + yield + + def open(self, mode='r', *, encoding): + file = self.file + if self.file_type == JsonFileType.WINDOWS_HANDLE: + import msvcrt + # Create a file descriptor from the handle + file = msvcrt.open_osfhandle(file, os.O_WRONLY) + return open(file, mode, encoding=encoding) + + @dataclasses.dataclass(slots=True, frozen=True) class HuntRefleak: warmups: int @@ -38,9 +89,7 @@ class RunTests: python_cmd: tuple[str] | None randomize: bool random_seed: int | None - # On Unix, it's a file descriptor. - # On Windows, it's a handle. - json_fd: int | None + json_file: JsonFile | None def copy(self, **override): state = dataclasses.asdict(self) @@ -74,6 +123,17 @@ def as_json(self) -> StrJSON: def from_json(worker_json: StrJSON) -> 'RunTests': return json.loads(worker_json, object_hook=_decode_runtests) + def json_file_use_filename(self) -> bool: + # json_file type depends on the platform: + # - Unix: file descriptor (int) + # - Windows: handle (int) + # - Emscripten/WASI or if --python is used: filename (str) + return ( + bool(self.python_cmd) + or support.is_emscripten + or support.is_wasi + ) + class _EncodeRunTests(json.JSONEncoder): def default(self, o: Any) -> dict[str, Any]: @@ -90,6 +150,8 @@ def _decode_runtests(data: dict[str, Any]) -> RunTests | dict[str, Any]: data.pop('__runtests__') if data['hunt_refleak']: data['hunt_refleak'] = HuntRefleak(**data['hunt_refleak']) + if data['json_file']: + data['json_file'] = JsonFile(**data['json_file']) return RunTests(**data) else: return data diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 03c27b9fe17053..ce7342aabfffbe 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -17,8 +17,12 @@ MS_WINDOWS = (sys.platform == 'win32') -WORK_DIR_PREFIX = 'test_python_' -WORKER_WORK_DIR_PREFIX = f'{WORK_DIR_PREFIX}worker_' + +# All temporary files and temporary directories created by libregrtest should +# use TMP_PREFIX so cleanup_temp_dir() can remove them all. +TMP_PREFIX = 'test_python_' +WORK_DIR_PREFIX = TMP_PREFIX +WORKER_WORK_DIR_PREFIX = WORK_DIR_PREFIX + 'worker_' # bpo-38203: Maximum delay in seconds to exit Python (call Py_Finalize()). # Used to protect against threading._shutdown() hang. @@ -387,7 +391,7 @@ def get_work_dir(parent_dir: StrPath, worker: bool = False) -> StrPath: # testing (see the -j option). # Emscripten and WASI have stubbed getpid(), Emscripten has only # milisecond clock resolution. Use randint() instead. - if sys.platform in {"emscripten", "wasi"}: + if support.is_emscripten or support.is_wasi: nounce = random.randint(0, 1_000_000) else: nounce = os.getpid() @@ -580,7 +584,7 @@ def display_header(): def cleanup_temp_dir(tmp_dir: StrPath): import glob - path = os.path.join(glob.escape(tmp_dir), WORK_DIR_PREFIX + '*') + path = os.path.join(glob.escape(tmp_dir), TMP_PREFIX + '*') print("Cleanup %s directory" % tmp_dir) for name in glob.glob(path): if os.path.isdir(name): diff --git a/Lib/test/libregrtest/worker.py b/Lib/test/libregrtest/worker.py index 0963faa2e4d2a1..ae3dcb2b06ed36 100644 --- a/Lib/test/libregrtest/worker.py +++ b/Lib/test/libregrtest/worker.py @@ -7,18 +7,17 @@ from test.support import os_helper from .setup import setup_process, setup_test_dir -from .runtests import RunTests +from .runtests import RunTests, JsonFile from .single import run_single_test from .utils import ( - StrPath, StrJSON, FilterTuple, MS_WINDOWS, + StrPath, StrJSON, FilterTuple, get_temp_dir, get_work_dir, exit_timeout) USE_PROCESS_GROUP = (hasattr(os, "setsid") and hasattr(os, "killpg")) -def create_worker_process(runtests: RunTests, - output_fd: int, json_fd: int, +def create_worker_process(runtests: RunTests, output_fd: int, tmp_dir: StrPath | None = None) -> subprocess.Popen: python_cmd = runtests.python_cmd worker_json = runtests.as_json() @@ -55,34 +54,24 @@ def create_worker_process(runtests: RunTests, close_fds=True, cwd=work_dir, ) - if not MS_WINDOWS: - kwargs['pass_fds'] = [json_fd] - else: - startupinfo = subprocess.STARTUPINFO() - startupinfo.lpAttributeList = {"handle_list": [json_fd]} - kwargs['startupinfo'] = startupinfo - if USE_PROCESS_GROUP: - kwargs['start_new_session'] = True - - if MS_WINDOWS: - os.set_handle_inheritable(json_fd, True) - try: + + # Pass json_file to the worker process + json_file = runtests.json_file + json_file.configure_subprocess(kwargs) + + with json_file.inherit_subprocess(): return subprocess.Popen(cmd, **kwargs) - finally: - if MS_WINDOWS: - os.set_handle_inheritable(json_fd, False) def worker_process(worker_json: StrJSON) -> NoReturn: runtests = RunTests.from_json(worker_json) test_name = runtests.tests[0] match_tests: FilterTuple | None = runtests.match_tests - json_fd: int = runtests.json_fd - - if MS_WINDOWS: - import msvcrt - json_fd = msvcrt.open_osfhandle(json_fd, os.O_WRONLY) - + # json_file type depends on the platform: + # - Unix: file descriptor (int) + # - Windows: handle (int) + # - Emscripten/WASI or if --python is used: filename (str) + json_file: JsonFile = runtests.json_file setup_test_dir(runtests.test_dir) setup_process() @@ -96,8 +85,8 @@ def worker_process(worker_json: StrJSON) -> NoReturn: result = run_single_test(test_name, runtests) - with open(json_fd, 'w', encoding='utf-8') as json_file: - result.write_json_into(json_file) + with json_file.open('w', encoding='utf-8') as json_fp: + result.write_json_into(json_fp) sys.exit(0) diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 7cf3d05a6e6d70..55cf9e7f020721 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -13,6 +13,7 @@ import platform import random import re +import shlex import subprocess import sys import sysconfig @@ -432,13 +433,14 @@ def parse_executed_tests(self, output): parser = re.finditer(regex, output, re.MULTILINE) return list(match.group(1) for match in parser) - def check_executed_tests(self, output, tests, skipped=(), failed=(), + def check_executed_tests(self, output, tests, *, stats, + skipped=(), failed=(), env_changed=(), omitted=(), rerun=None, run_no_tests=(), resource_denied=(), - randomize=False, interrupted=False, + randomize=False, parallel=False, interrupted=False, fail_env_changed=False, - *, stats, forever=False, filtered=False): + forever=False, filtered=False): if isinstance(tests, str): tests = [tests] if isinstance(skipped, str): @@ -455,6 +457,8 @@ def check_executed_tests(self, output, tests, skipped=(), failed=(), run_no_tests = [run_no_tests] if isinstance(stats, int): stats = TestStats(stats) + if parallel: + randomize = True rerun_failed = [] if rerun is not None: @@ -1120,7 +1124,7 @@ def test_crashed(self): tests = [crash_test] output = self.run_tests("-j2", *tests, exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, tests, failed=crash_test, - randomize=True, stats=0) + parallel=True, stats=0) def parse_methods(self, output): regex = re.compile("^(test[^ ]+).*ok$", flags=re.MULTILINE) @@ -1744,7 +1748,7 @@ def test_leak_tmp_file(self): self.check_executed_tests(output, testnames, env_changed=testnames, fail_env_changed=True, - randomize=True, + parallel=True, stats=len(testnames)) for testname in testnames: self.assertIn(f"Warning -- {testname} leaked temporary " @@ -1784,7 +1788,7 @@ def test_mp_decode_error(self): exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, [testname], failed=[testname], - randomize=True, + parallel=True, stats=0) def test_doctest(self): @@ -1823,7 +1827,7 @@ def load_tests(loader, tests, pattern): exitcode=EXITCODE_BAD_TEST) self.check_executed_tests(output, [testname], failed=[testname], - randomize=True, + parallel=True, stats=TestStats(1, 1, 0)) def _check_random_seed(self, run_workers: bool): @@ -1866,6 +1870,27 @@ def test_random_seed(self): def test_random_seed_workers(self): self._check_random_seed(run_workers=True) + def test_python_command(self): + code = textwrap.dedent(r""" + import sys + import unittest + + class WorkerTests(unittest.TestCase): + def test_dev_mode(self): + self.assertTrue(sys.flags.dev_mode) + """) + tests = [self.create_test(code=code) for _ in range(3)] + + # Custom Python command: "python -X dev" + python_cmd = [sys.executable, '-X', 'dev'] + # test.libregrtest.cmdline uses shlex.split() to parse the Python + # command line string + python_cmd = shlex.join(python_cmd) + + output = self.run_tests("--python", python_cmd, "-j0", *tests) + self.check_executed_tests(output, tests, + stats=len(tests), parallel=True) + class TestUtils(unittest.TestCase): def test_format_duration(self): From 715f6632589fc69595ed7fde847e5405925fb94b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 13 Sep 2023 02:24:43 +0200 Subject: [PATCH 188/357] gh-109276: libregrtest: WASM use stdout for JSON (#109355) On Emscripten and WASI, or if --python command line is used, libregrtest now writes JSON into stdout, instead of using a name file. * Add JsonFileType.STDOUT. * Remove JsonFileType.FILENAME. * test.pythoninfo logs environment variables related to cross-compilation and running Python on Emscripten/WASI. --- Lib/test/libregrtest/run_workers.py | 26 ++++++++++++-------------- Lib/test/libregrtest/runtests.py | 27 ++++++++++++++++----------- Lib/test/libregrtest/worker.py | 14 +++++++------- Lib/test/pythoninfo.py | 6 +++++- 4 files changed, 40 insertions(+), 33 deletions(-) diff --git a/Lib/test/libregrtest/run_workers.py b/Lib/test/libregrtest/run_workers.py index a6bebccd0c7585..f99ca343eefb06 100644 --- a/Lib/test/libregrtest/run_workers.py +++ b/Lib/test/libregrtest/run_workers.py @@ -21,7 +21,7 @@ from .runtests import RunTests, JsonFile, JsonFileType from .single import PROGRESS_MIN_TIME from .utils import ( - StrPath, StrJSON, TestName, MS_WINDOWS, TMP_PREFIX, + StrPath, StrJSON, TestName, MS_WINDOWS, format_duration, print_warning, count, plural) from .worker import create_worker_process, USE_PROCESS_GROUP @@ -225,16 +225,9 @@ def create_stdout(self, stack: contextlib.ExitStack) -> TextIO: def create_json_file(self, stack: contextlib.ExitStack) -> tuple[JsonFile, TextIO | None]: """Create JSON file.""" - json_file_use_filename = self.runtests.json_file_use_filename() - if json_file_use_filename: - # create an empty file to make the creation atomic - # (to prevent races with other worker threads) - prefix = TMP_PREFIX + 'json_' - json_fd, json_filename = tempfile.mkstemp(prefix=prefix) - os.close(json_fd) - - stack.callback(os_helper.unlink, json_filename) - json_file = JsonFile(json_filename, JsonFileType.FILENAME) + json_file_use_stdout = self.runtests.json_file_use_stdout() + if json_file_use_stdout: + json_file = JsonFile(None, JsonFileType.STDOUT) json_tmpfile = None else: json_tmpfile = tempfile.TemporaryFile('w+', encoding='utf8') @@ -300,11 +293,14 @@ def read_stdout(self, stdout_file: TextIO) -> str: f"Cannot read process stdout: {exc}", None) def read_json(self, json_file: JsonFile, json_tmpfile: TextIO | None, - stdout: str) -> TestResult: + stdout: str) -> tuple[TestResult, str]: try: if json_tmpfile is not None: json_tmpfile.seek(0) worker_json: StrJSON = json_tmpfile.read() + elif json_file.file_type == JsonFileType.STDOUT: + stdout, _, worker_json = stdout.rpartition("\n") + stdout = stdout.rstrip() else: with json_file.open(encoding='utf8') as json_fp: worker_json: StrJSON = json_fp.read() @@ -319,7 +315,7 @@ def read_json(self, json_file: JsonFile, json_tmpfile: TextIO | None, raise WorkerError(self.test_name, "empty JSON", stdout) try: - return TestResult.from_json(worker_json) + result = TestResult.from_json(worker_json) except Exception as exc: # gh-101634: Catch UnicodeDecodeError if stdout cannot be # decoded from encoding @@ -327,6 +323,8 @@ def read_json(self, json_file: JsonFile, json_tmpfile: TextIO | None, raise WorkerError(self.test_name, err_msg, stdout, state=State.MULTIPROCESSING_ERROR) + return (result, stdout) + def _runtest(self, test_name: TestName) -> MultiprocessResult: with contextlib.ExitStack() as stack: stdout_file = self.create_stdout(stack) @@ -341,7 +339,7 @@ def _runtest(self, test_name: TestName) -> MultiprocessResult: if retcode is None: raise WorkerError(self.test_name, None, stdout, state=State.TIMEOUT) - result = self.read_json(json_file, json_tmpfile, stdout) + result, stdout = self.read_json(json_file, json_tmpfile, stdout) if retcode != 0: raise WorkerError(self.test_name, f"Exit code {retcode}", stdout) diff --git a/Lib/test/libregrtest/runtests.py b/Lib/test/libregrtest/runtests.py index 62a0a7e20c7b8b..aee0ab6fd6e38f 100644 --- a/Lib/test/libregrtest/runtests.py +++ b/Lib/test/libregrtest/runtests.py @@ -14,13 +14,16 @@ class JsonFileType: UNIX_FD = "UNIX_FD" WINDOWS_HANDLE = "WINDOWS_HANDLE" - FILENAME = "FILENAME" + STDOUT = "STDOUT" @dataclasses.dataclass(slots=True, frozen=True) class JsonFile: - # See RunTests.json_file_use_filename() - file: int | StrPath + # file type depends on file_type: + # - UNIX_FD: file descriptor (int) + # - WINDOWS_HANDLE: handle (int) + # - STDOUT: use process stdout (None) + file: int | None file_type: str def configure_subprocess(self, popen_kwargs: dict) -> None: @@ -33,9 +36,6 @@ def configure_subprocess(self, popen_kwargs: dict) -> None: startupinfo = subprocess.STARTUPINFO() startupinfo.lpAttributeList = {"handle_list": [self.file]} popen_kwargs['startupinfo'] = startupinfo - case JsonFileType.FILENAME: - # Filename: nothing to do to - pass @contextlib.contextmanager def inherit_subprocess(self): @@ -49,6 +49,9 @@ def inherit_subprocess(self): yield def open(self, mode='r', *, encoding): + if self.file_type == JsonFileType.STDOUT: + raise ValueError("for STDOUT file type, just use sys.stdout") + file = self.file if self.file_type == JsonFileType.WINDOWS_HANDLE: import msvcrt @@ -123,11 +126,13 @@ def as_json(self) -> StrJSON: def from_json(worker_json: StrJSON) -> 'RunTests': return json.loads(worker_json, object_hook=_decode_runtests) - def json_file_use_filename(self) -> bool: - # json_file type depends on the platform: - # - Unix: file descriptor (int) - # - Windows: handle (int) - # - Emscripten/WASI or if --python is used: filename (str) + def json_file_use_stdout(self) -> bool: + # Use STDOUT in two cases: + # + # - If --python command line option is used; + # - On Emscripten and WASI. + # + # On other platforms, UNIX_FD or WINDOWS_HANDLE can be used. return ( bool(self.python_cmd) or support.is_emscripten diff --git a/Lib/test/libregrtest/worker.py b/Lib/test/libregrtest/worker.py index ae3dcb2b06ed36..168803c5d9451f 100644 --- a/Lib/test/libregrtest/worker.py +++ b/Lib/test/libregrtest/worker.py @@ -7,7 +7,7 @@ from test.support import os_helper from .setup import setup_process, setup_test_dir -from .runtests import RunTests, JsonFile +from .runtests import RunTests, JsonFile, JsonFileType from .single import run_single_test from .utils import ( StrPath, StrJSON, FilterTuple, @@ -67,10 +67,6 @@ def worker_process(worker_json: StrJSON) -> NoReturn: runtests = RunTests.from_json(worker_json) test_name = runtests.tests[0] match_tests: FilterTuple | None = runtests.match_tests - # json_file type depends on the platform: - # - Unix: file descriptor (int) - # - Windows: handle (int) - # - Emscripten/WASI or if --python is used: filename (str) json_file: JsonFile = runtests.json_file setup_test_dir(runtests.test_dir) @@ -85,8 +81,12 @@ def worker_process(worker_json: StrJSON) -> NoReturn: result = run_single_test(test_name, runtests) - with json_file.open('w', encoding='utf-8') as json_fp: - result.write_json_into(json_fp) + if json_file.file_type == JsonFileType.STDOUT: + print() + result.write_json_into(sys.stdout) + else: + with json_file.open('w', encoding='utf-8') as json_fp: + result.write_json_into(json_fp) sys.exit(0) diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index ea3a78a341c43f..f16b7986995c38 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -268,6 +268,7 @@ def format_groups(groups): "ARCHFLAGS", "ARFLAGS", "AUDIODEV", + "BUILDPYTHON", "CC", "CFLAGS", "COLUMNS", @@ -320,6 +321,7 @@ def format_groups(groups): "VIRTUAL_ENV", "WAYLAND_DISPLAY", "WINDIR", + "_PYTHON_HOSTRUNNER", "_PYTHON_HOST_PLATFORM", "_PYTHON_PROJECT_BASE", "_PYTHON_SYSCONFIGDATA_NAME", @@ -335,7 +337,8 @@ def format_groups(groups): for name, value in os.environ.items(): uname = name.upper() if (uname in ENV_VARS - # Copy PYTHON* and LC_* variables + # Copy PYTHON* variables like PYTHONPATH + # Copy LC_* variables like LC_ALL or uname.startswith(("PYTHON", "LC_")) # Visual Studio: VS140COMNTOOLS or (uname.startswith("VS") and uname.endswith("COMNTOOLS"))): @@ -500,6 +503,7 @@ def collect_sysconfig(info_add): 'CFLAGS', 'CFLAGSFORSHARED', 'CONFIG_ARGS', + 'HOSTRUNNER', 'HOST_GNU_TYPE', 'MACHDEP', 'MULTIARCH', From b544c2b1355571a36fe0c212f92e9b163ceb16af Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 13 Sep 2023 03:40:44 +0200 Subject: [PATCH 189/357] gh-109276: libregrtest: fix work dir on WASI (#109356) On WASI platform, get_temp_dir() should behave differently since the parent process is a WASI process and uses a different get_temp_dir() path. Fix also WorkerThread._runtest(): don't read JSON file if the worker process exit code is non-zero. --- Lib/test/libregrtest/run_workers.py | 5 ++--- Lib/test/libregrtest/utils.py | 27 +++++++++++++++++++-------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/Lib/test/libregrtest/run_workers.py b/Lib/test/libregrtest/run_workers.py index f99ca343eefb06..45b2f424ce4e5d 100644 --- a/Lib/test/libregrtest/run_workers.py +++ b/Lib/test/libregrtest/run_workers.py @@ -338,12 +338,11 @@ def _runtest(self, test_name: TestName) -> MultiprocessResult: if retcode is None: raise WorkerError(self.test_name, None, stdout, state=State.TIMEOUT) + if retcode != 0: + raise WorkerError(self.test_name, f"Exit code {retcode}", stdout) result, stdout = self.read_json(json_file, json_tmpfile, stdout) - if retcode != 0: - raise WorkerError(self.test_name, f"Exit code {retcode}", stdout) - if tmp_files: msg = (f'\n\n' f'Warning -- {test_name} leaked temporary files ' diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index ce7342aabfffbe..880cec5cc50f4a 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -360,14 +360,25 @@ def get_temp_dir(tmp_dir: StrPath | None = None) -> StrPath: # 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(): - tmp_dir = sysconfig.get_config_var('abs_builddir') - if 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. - tmp_dir = sysconfig.get_config_var('srcdir') - tmp_dir = os.path.join(tmp_dir, 'build') + if not support.is_wasi: + tmp_dir = sysconfig.get_config_var('abs_builddir') + if 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. + tmp_dir = sysconfig.get_config_var('srcdir') + tmp_dir = os.path.join(tmp_dir, 'build') + else: + # WASI platform + tmp_dir = sysconfig.get_config_var('projectbase') + tmp_dir = os.path.join(tmp_dir, 'build') + + # When get_temp_dir() is called in a worker process, + # get_temp_dir() path is different than in the parent process + # which is not a WASI process. So the parent does not create + # the same "tmp_dir" than the test worker process. + os.makedirs(tmp_dir, exist_ok=True) else: tmp_dir = tempfile.gettempdir() From 388d91cd474de80355f5a8f6a26e8962813a3128 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 13 Sep 2023 03:54:28 +0200 Subject: [PATCH 190/357] gh-109357: Fix test_monitoring.test_gh108976() (#109358) The test now calls free_tool_id() so it can be run multiple times in the same process. For example, the following command no longer fails: python -m test test_monitoring -R 3:3 --- Lib/test/test_monitoring.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py index a4725be21706ff..575862b13d7f99 100644 --- a/Lib/test/test_monitoring.py +++ b/Lib/test/test_monitoring.py @@ -1721,6 +1721,7 @@ def make_foo_optimized_then_set_event(): def test_gh108976(self): sys.monitoring.use_tool_id(0, "test") + self.addCleanup(sys.monitoring.free_tool_id, 0) sys.monitoring.set_events(0, 0) sys.monitoring.register_callback(0, E.LINE, lambda *args: sys.monitoring.set_events(0, 0)) sys.monitoring.register_callback(0, E.INSTRUCTION, lambda *args: 0) From b39f65a495b3300caa4144089ef7cb20a0bb5bd0 Mon Sep 17 00:00:00 2001 From: Charlie Zhao Date: Wed, 13 Sep 2023 12:17:55 +0800 Subject: [PATCH 191/357] gh-108346: Fix failed benchmark in decimal (#108353) Fix benchmark in decimal to work again after the int str conversion limits. --- Modules/_decimal/tests/bench.py | 127 +++++++++++++++++++------------- 1 file changed, 74 insertions(+), 53 deletions(-) diff --git a/Modules/_decimal/tests/bench.py b/Modules/_decimal/tests/bench.py index 24e091b6887ccd..640290f2ec7962 100644 --- a/Modules/_decimal/tests/bench.py +++ b/Modules/_decimal/tests/bench.py @@ -7,6 +7,8 @@ import time +import sys +from functools import wraps from test.support.import_helper import import_fresh_module C = import_fresh_module('decimal', fresh=['_decimal']) @@ -64,66 +66,85 @@ def factorial(n, m): else: return factorial(n, (n+m)//2) * factorial((n+m)//2 + 1, m) +# Fix failed test cases caused by CVE-2020-10735 patch. +# See gh-95778 for details. +def increase_int_max_str_digits(maxdigits): + def _increase_int_max_str_digits(func, maxdigits=maxdigits): + @wraps(func) + def wrapper(*args, **kwargs): + previous_int_limit = sys.get_int_max_str_digits() + sys.set_int_max_str_digits(maxdigits) + ans = func(*args, **kwargs) + sys.set_int_max_str_digits(previous_int_limit) + return ans + return wrapper + return _increase_int_max_str_digits + +def test_calc_pi(): + print("\n# ======================================================================") + print("# Calculating pi, 10000 iterations") + print("# ======================================================================\n") + + to_benchmark = [pi_float, pi_decimal] + if C is not None: + to_benchmark.insert(1, pi_cdecimal) + + for prec in [9, 19]: + print("\nPrecision: %d decimal digits\n" % prec) + for func in to_benchmark: + start = time.time() + if C is not None: + C.getcontext().prec = prec + P.getcontext().prec = prec + for i in range(10000): + x = func() + print("%s:" % func.__name__.replace("pi_", "")) + print("result: %s" % str(x)) + print("time: %fs\n" % (time.time()-start)) + +@increase_int_max_str_digits(maxdigits=10000000) +def test_factorial(): + print("\n# ======================================================================") + print("# Factorial") + print("# ======================================================================\n") -print("\n# ======================================================================") -print("# Calculating pi, 10000 iterations") -print("# ======================================================================\n") - -to_benchmark = [pi_float, pi_decimal] -if C is not None: - to_benchmark.insert(1, pi_cdecimal) - -for prec in [9, 19]: - print("\nPrecision: %d decimal digits\n" % prec) - for func in to_benchmark: - start = time.time() - if C is not None: - C.getcontext().prec = prec - P.getcontext().prec = prec - for i in range(10000): - x = func() - print("%s:" % func.__name__.replace("pi_", "")) - print("result: %s" % str(x)) - print("time: %fs\n" % (time.time()-start)) - - -print("\n# ======================================================================") -print("# Factorial") -print("# ======================================================================\n") - -if C is not None: - c = C.getcontext() - c.prec = C.MAX_PREC - c.Emax = C.MAX_EMAX - c.Emin = C.MIN_EMIN + if C is not None: + c = C.getcontext() + c.prec = C.MAX_PREC + c.Emax = C.MAX_EMAX + c.Emin = C.MIN_EMIN -for n in [100000, 1000000]: + for n in [100000, 1000000]: - print("n = %d\n" % n) + print("n = %d\n" % n) - if C is not None: - # C version of decimal + if C is not None: + # C version of decimal + start_calc = time.time() + x = factorial(C.Decimal(n), 0) + end_calc = time.time() + start_conv = time.time() + sx = str(x) + end_conv = time.time() + print("cdecimal:") + print("calculation time: %fs" % (end_calc-start_calc)) + print("conversion time: %fs\n" % (end_conv-start_conv)) + + # Python integers start_calc = time.time() - x = factorial(C.Decimal(n), 0) + y = factorial(n, 0) end_calc = time.time() start_conv = time.time() - sx = str(x) - end_conv = time.time() - print("cdecimal:") - print("calculation time: %fs" % (end_calc-start_calc)) - print("conversion time: %fs\n" % (end_conv-start_conv)) + sy = str(y) + end_conv = time.time() - # Python integers - start_calc = time.time() - y = factorial(n, 0) - end_calc = time.time() - start_conv = time.time() - sy = str(y) - end_conv = time.time() + print("int:") + print("calculation time: %fs" % (end_calc-start_calc)) + print("conversion time: %fs\n\n" % (end_conv-start_conv)) - print("int:") - print("calculation time: %fs" % (end_calc-start_calc)) - print("conversion time: %fs\n\n" % (end_conv-start_conv)) + if C is not None: + assert(sx == sy) - if C is not None: - assert(sx == sy) +if __name__ == "__main__": + test_calc_pi() + test_factorial() From 44d9a71ea246e7c3fb478d9be62c16914be6c545 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 13 Sep 2023 06:24:32 +0200 Subject: [PATCH 192/357] gh-104736: Fix test_gdb tests on ppc64le with clang (#109360) Fix test_gdb on Python built with LLVM clang 16 on Linux ppc64le (ex: Fedora 38). Search patterns in gdb "bt" command output to detect when gdb fails to retrieve the traceback. For example, skip a test if "Backtrace stopped: frame did not save the PC" is found. --- Lib/test/test_gdb.py | 8 ++++++++ .../Tests/2023-09-13-05-58-09.gh-issue-104736.lA25Fu.rst | 4 ++++ 2 files changed, 12 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-13-05-58-09.gh-issue-104736.lA25Fu.rst diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index ca50574e46660d..914ef942feab12 100644 --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -246,6 +246,14 @@ def get_stack_trace(self, source=None, script=None, # gh-91960: On Python built with "clang -Og", gdb gets # "frame=" for _PyEval_EvalFrameDefault() parameter '(unable to read python frame information)', + # gh-104736: On Python built with "clang -Og" on ppc64le, + # "py-bt" displays a truncated or not traceback, but "where" + # logs this error message: + 'Backtrace stopped: frame did not save the PC', + # gh-104736: When "bt" command displays something like: + # "#1 0x0000000000000000 in ?? ()", the traceback is likely + # truncated or wrong. + ' ?? ()', ): if pattern in out: raise unittest.SkipTest(f"{pattern!r} found in gdb output") diff --git a/Misc/NEWS.d/next/Tests/2023-09-13-05-58-09.gh-issue-104736.lA25Fu.rst b/Misc/NEWS.d/next/Tests/2023-09-13-05-58-09.gh-issue-104736.lA25Fu.rst new file mode 100644 index 00000000000000..85c370fc87ac41 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-13-05-58-09.gh-issue-104736.lA25Fu.rst @@ -0,0 +1,4 @@ +Fix test_gdb on Python built with LLVM clang 16 on Linux ppc64le (ex: Fedora +38). Search patterns in gdb "bt" command output to detect when gdb fails to +retrieve the traceback. For example, skip a test if ``Backtrace stopped: frame +did not save the PC`` is found. Patch by Victor Stinner. From 6c0ddca409c1ed27b11c70386cd6c88be5d00115 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Tue, 12 Sep 2023 21:42:26 -0700 Subject: [PATCH 193/357] gh-105189: fix importlib.resources.abc deprecation docs (#105232) Co-authored-by: Hugo van Kemenade Co-authored-by: Alex Waygood --- Doc/library/importlib.resources.abc.rst | 12 -- Doc/library/importlib.rst | 154 ++++++++++++++++++++++++ 2 files changed, 154 insertions(+), 12 deletions(-) diff --git a/Doc/library/importlib.resources.abc.rst b/Doc/library/importlib.resources.abc.rst index 65c42858bbbb7d..c508b6ba965cc0 100644 --- a/Doc/library/importlib.resources.abc.rst +++ b/Doc/library/importlib.resources.abc.rst @@ -43,8 +43,6 @@ :const:`None`. An object compatible with this ABC should only be returned when the specified module is a package. - .. versionadded:: 3.7 - .. deprecated-removed:: 3.12 3.14 Use :class:`importlib.resources.abc.TraversableResources` instead. @@ -95,11 +93,6 @@ For a representation of the object on the file-system, use :meth:`importlib.resources.as_file`. - .. versionadded:: 3.9 - - .. deprecated-removed:: 3.12 3.14 - Use :class:`importlib.resources.abc.Traversable` instead. - .. attribute:: name Abstract. The base name of this object without any parent references. @@ -153,11 +146,6 @@ Loaders that wish to support resource reading are expected to implement this interface. - .. versionadded:: 3.9 - - .. deprecated-removed:: 3.12 3.14 - Use :class:`importlib.resources.abc.TraversableResources` instead. - .. abstractmethod:: files() Returns a :class:`importlib.resources.abc.Traversable` object for the loaded diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index d8cc7079a1d812..fc954724bb72fe 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -645,6 +645,160 @@ ABC hierarchy:: itself does not end in ``__init__``. +.. class:: ResourceReader + + *Superseded by TraversableResources* + + An :term:`abstract base class` to provide the ability to read + *resources*. + + From the perspective of this ABC, a *resource* is a binary + artifact that is shipped within a package. Typically this is + something like a data file that lives next to the ``__init__.py`` + file of the package. The purpose of this class is to help abstract + out the accessing of such data files so that it does not matter if + the package and its data file(s) are stored in a e.g. zip file + versus on the file system. + + For any of methods of this class, a *resource* argument is + expected to be a :term:`path-like object` which represents + conceptually just a file name. This means that no subdirectory + paths should be included in the *resource* argument. This is + because the location of the package the reader is for, acts as the + "directory". Hence the metaphor for directories and file + names is packages and resources, respectively. This is also why + instances of this class are expected to directly correlate to + a specific package (instead of potentially representing multiple + packages or a module). + + Loaders that wish to support resource reading are expected to + provide a method called ``get_resource_reader(fullname)`` which + returns an object implementing this ABC's interface. If the module + specified by fullname is not a package, this method should return + :const:`None`. An object compatible with this ABC should only be + returned when the specified module is a package. + + .. versionadded:: 3.7 + + .. deprecated-removed:: 3.12 3.14 + Use :class:`importlib.resources.abc.TraversableResources` instead. + + .. abstractmethod:: open_resource(resource) + + Returns an opened, :term:`file-like object` for binary reading + of the *resource*. + + If the resource cannot be found, :exc:`FileNotFoundError` is + raised. + + .. abstractmethod:: resource_path(resource) + + Returns the file system path to the *resource*. + + If the resource does not concretely exist on the file system, + raise :exc:`FileNotFoundError`. + + .. abstractmethod:: is_resource(name) + + Returns ``True`` if the named *name* is considered a resource. + :exc:`FileNotFoundError` is raised if *name* does not exist. + + .. abstractmethod:: contents() + + Returns an :term:`iterable` of strings over the contents of + the package. Do note that it is not required that all names + returned by the iterator be actual resources, e.g. it is + acceptable to return names for which :meth:`is_resource` would + be false. + + Allowing non-resource names to be returned is to allow for + situations where how a package and its resources are stored + are known a priori and the non-resource names would be useful. + For instance, returning subdirectory names is allowed so that + when it is known that the package and resources are stored on + the file system then those subdirectory names can be used + directly. + + The abstract method returns an iterable of no items. + + +.. class:: Traversable + + An object with a subset of :class:`pathlib.Path` methods suitable for + traversing directories and opening files. + + For a representation of the object on the file-system, use + :meth:`importlib.resources.as_file`. + + .. versionadded:: 3.9 + + .. deprecated-removed:: 3.12 3.14 + Use :class:`importlib.resources.abc.Traversable` instead. + + .. attribute:: name + + Abstract. The base name of this object without any parent references. + + .. abstractmethod:: iterdir() + + Yield ``Traversable`` objects in ``self``. + + .. abstractmethod:: is_dir() + + Return ``True`` if ``self`` is a directory. + + .. abstractmethod:: is_file() + + Return ``True`` if ``self`` is a file. + + .. abstractmethod:: joinpath(child) + + Return Traversable child in ``self``. + + .. abstractmethod:: __truediv__(child) + + Return ``Traversable`` child in ``self``. + + .. abstractmethod:: open(mode='r', *args, **kwargs) + + *mode* may be 'r' or 'rb' to open as text or binary. Return a handle + suitable for reading (same as :attr:`pathlib.Path.open`). + + When opening as text, accepts encoding parameters such as those + accepted by :attr:`io.TextIOWrapper`. + + .. method:: read_bytes() + + Read contents of ``self`` as bytes. + + .. method:: read_text(encoding=None) + + Read contents of ``self`` as text. + + +.. class:: TraversableResources + + An abstract base class for resource readers capable of serving + the :meth:`importlib.resources.files` interface. Subclasses + :class:`importlib.resources.abc.ResourceReader` and provides + concrete implementations of the :class:`importlib.resources.abc.ResourceReader`'s + abstract methods. Therefore, any loader supplying + :class:`importlib.abc.TraversableResources` also supplies ResourceReader. + + Loaders that wish to support resource reading are expected to + implement this interface. + + .. versionadded:: 3.9 + + .. deprecated-removed:: 3.12 3.14 + Use :class:`importlib.resources.abc.TraversableResources` instead. + + .. abstractmethod:: files() + + Returns a :class:`importlib.resources.abc.Traversable` object for the loaded + package. + + :mod:`importlib.machinery` -- Importers and path hooks ------------------------------------------------------ From a0c06a4f933faccd7f8201701b2491d38464212c Mon Sep 17 00:00:00 2001 From: Oleksandr Kravets <73752159+olekskrav@users.noreply.github.com> Date: Wed, 13 Sep 2023 01:07:56 -0400 Subject: [PATCH 194/357] Fix variable name in dis documentation example (GH-109343) BINARY_SUBSCR example erroneously uses two different names `key` and `index` to refer to the same variable. STORE_SUBSCR and DELETE_SUBSCR use only `key` in the same context. Changing `index` to `key` for consistency. --- Doc/library/dis.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 72e55cd81d42f6..d087c7c1adc34d 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -597,7 +597,7 @@ not have to be) the original ``STACK[-2]``. key = STACK.pop() container = STACK.pop() - STACK.append(container[index]) + STACK.append(container[key]) .. opcode:: STORE_SUBSCR From d69805b38a1815e7aaadf49bdd019c7cca105ac6 Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Wed, 13 Sep 2023 01:47:35 -0700 Subject: [PATCH 195/357] gh-109156: Add tests for de-instrumenting instructions with instrumented lines (GH-109157) --- Lib/test/test_monitoring.py | 17 +++++++++++++++++ ...23-09-08-18-31-04.gh-issue-109156.KK1EXI.rst | 1 + 2 files changed, 18 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-08-18-31-04.gh-issue-109156.KK1EXI.rst diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py index 575862b13d7f99..992d3cc8b6d7f9 100644 --- a/Lib/test/test_monitoring.py +++ b/Lib/test/test_monitoring.py @@ -1152,6 +1152,23 @@ def func1(): ('instruction', 'func1', 14), ('line', 'get_events', 11)]) + def test_turn_off_only_instruction(self): + """ + LINE events should be recorded after INSTRUCTION event is turned off + """ + events = [] + def line(*args): + events.append("line") + sys.monitoring.set_events(TEST_TOOL, 0) + sys.monitoring.register_callback(TEST_TOOL, E.LINE, line) + sys.monitoring.register_callback(TEST_TOOL, E.INSTRUCTION, lambda *args: None) + sys.monitoring.set_events(TEST_TOOL, E.LINE | E.INSTRUCTION) + sys.monitoring.set_events(TEST_TOOL, E.LINE) + events = [] + a = 0 + sys.monitoring.set_events(TEST_TOOL, 0) + self.assertGreater(len(events), 0) + class TestInstallIncrementallly(MonitoringTestBase, unittest.TestCase): def check_events(self, func, must_include, tool=TEST_TOOL, recorders=(ExceptionRecorder,)): diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-08-18-31-04.gh-issue-109156.KK1EXI.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-08-18-31-04.gh-issue-109156.KK1EXI.rst new file mode 100644 index 00000000000000..e681482c3a879e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-08-18-31-04.gh-issue-109156.KK1EXI.rst @@ -0,0 +1 @@ +Add tests for de-instrumenting instructions while keeping the instrumentation for lines From 79101edb03b7381b514126c68acabfcbbba2f842 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Wed, 13 Sep 2023 09:00:15 -0700 Subject: [PATCH 196/357] gh-109351: Fix crash when compiling AST with invalid NamedExpr (#109352) --- Lib/test/test_compile.py | 27 +++++++++++++++++++ ...-09-12-16-00-42.gh-issue-109351.kznGeR.rst | 2 ++ Python/ast.c | 5 ++++ 3 files changed, 34 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-12-16-00-42.gh-issue-109351.kznGeR.rst diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index a8a519f573e663..fa74455fe7f159 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -443,6 +443,33 @@ def f(): self.assertIn("_A__mangled_mod", A.f.__code__.co_varnames) self.assertIn("__package__", A.f.__code__.co_varnames) + def test_compile_invalid_namedexpr(self): + # gh-109351 + m = ast.Module( + body=[ + ast.Expr( + value=ast.ListComp( + elt=ast.NamedExpr( + target=ast.Constant(value=1), + value=ast.Constant(value=3), + ), + generators=[ + ast.comprehension( + target=ast.Name(id="x", ctx=ast.Store()), + iter=ast.Name(id="y", ctx=ast.Load()), + ifs=[], + is_async=0, + ) + ], + ) + ) + ], + type_ignores=[], + ) + + with self.assertRaisesRegex(TypeError, "NamedExpr target must be a Name"): + compile(ast.fix_missing_locations(m), "", "exec") + def test_compile_ast(self): fname = __file__ if fname.lower().endswith('pyc'): diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-12-16-00-42.gh-issue-109351.kznGeR.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-12-16-00-42.gh-issue-109351.kznGeR.rst new file mode 100644 index 00000000000000..23b81c1c0a3baa --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-12-16-00-42.gh-issue-109351.kznGeR.rst @@ -0,0 +1,2 @@ +Fix crash when compiling an invalid AST involving a named (walrus) +expression. diff --git a/Python/ast.c b/Python/ast.c index 21cb38f8cbfb65..a230c7eb79ba8b 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -381,6 +381,11 @@ validate_expr(struct validator *state, expr_ty exp, expr_context_ty ctx) ret = validate_exprs(state, exp->v.Tuple.elts, ctx, 0); break; case NamedExpr_kind: + if (exp->v.NamedExpr.target->kind != Name_kind) { + PyErr_SetString(PyExc_TypeError, + "NamedExpr target must be a Name"); + return 0; + } ret = validate_expr(state, exp->v.NamedExpr.value, Load); break; /* This last case doesn't have any checking. */ From 987b4bc0870e1e29a88275dc3fa39bf2c3dcc763 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Wed, 13 Sep 2023 09:00:39 -0700 Subject: [PATCH 197/357] gh-109341: Fix crash on compiling invalid AST including TypeAlias (#109349) --- Lib/test/test_compile.py | 20 +++++++++++++++++++ ...-09-12-15-45-49.gh-issue-109341.4V5bkm.rst | 1 + Python/ast.c | 5 +++++ 3 files changed, 26 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-12-15-45-49.gh-issue-109341.4V5bkm.rst diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index fa74455fe7f159..39d972c84f345e 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -505,6 +505,26 @@ def test_compile_ast(self): ast.body = [_ast.BoolOp()] self.assertRaises(TypeError, compile, ast, '', 'exec') + def test_compile_invalid_typealias(self): + # gh-109341 + m = ast.Module( + body=[ + ast.TypeAlias( + name=ast.Subscript( + value=ast.Name(id="foo", ctx=ast.Load()), + slice=ast.Constant(value="x"), + ctx=ast.Store(), + ), + type_params=[], + value=ast.Name(id="Callable", ctx=ast.Load()), + ) + ], + type_ignores=[], + ) + + with self.assertRaisesRegex(TypeError, "TypeAlias with non-Name name"): + compile(ast.fix_missing_locations(m), "", "exec") + def test_dict_evaluation_order(self): i = 0 diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-12-15-45-49.gh-issue-109341.4V5bkm.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-12-15-45-49.gh-issue-109341.4V5bkm.rst new file mode 100644 index 00000000000000..9e99ef7eb73273 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-12-15-45-49.gh-issue-109341.4V5bkm.rst @@ -0,0 +1 @@ +Fix crash when compiling an invalid AST involving a :class:`ast.TypeAlias`. diff --git a/Python/ast.c b/Python/ast.c index a230c7eb79ba8b..5f46d4149c2ed0 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -773,6 +773,11 @@ validate_stmt(struct validator *state, stmt_ty stmt) validate_expr(state, stmt->v.AnnAssign.annotation, Load); break; case TypeAlias_kind: + if (stmt->v.TypeAlias.name->kind != Name_kind) { + PyErr_SetString(PyExc_TypeError, + "TypeAlias with non-Name name"); + return 0; + } ret = validate_expr(state, stmt->v.TypeAlias.name, Store) && validate_type_params(state, stmt->v.TypeAlias.type_params) && validate_expr(state, stmt->v.TypeAlias.value, Load); From 22e65eecaad3f5337862319687047afe9861e1ef Mon Sep 17 00:00:00 2001 From: Brandt Bucher Date: Wed, 13 Sep 2023 10:25:45 -0700 Subject: [PATCH 198/357] GH-105848: Replace KW_NAMES + CALL with LOAD_CONST + CALL_KW (GH-109300) --- Doc/library/dis.rst | 58 +++--- Include/internal/pycore_code.h | 2 +- Include/internal/pycore_opcode_metadata.h | 165 ++++++++------- Include/opcode_ids.h | 103 +++++----- Lib/_opcode_metadata.py | 127 ++++++------ Lib/importlib/_bootstrap_external.py | 3 +- Lib/test/test_descr.py | 10 +- Lib/test/test_dis.py | 46 ++--- ...-09-07-20-52-27.gh-issue-105848.p799D1.rst | 3 + Objects/frameobject.c | 14 +- Programs/test_frozenmain.h | 6 +- Python/abstract_interp_cases.c.h | 41 +++- Python/bytecodes.c | 190 +++++++++++------- Python/ceval.c | 2 - Python/ceval_macros.h | 5 - Python/compile.c | 22 +- Python/executor_cases.c.h | 140 +++++++++++-- Python/flowgraph.c | 2 - Python/generated_cases.c.h | 173 +++++++++++----- Python/instrumentation.c | 5 + Python/opcode_targets.h | 28 +-- Python/specialize.c | 82 +++----- 22 files changed, 719 insertions(+), 508 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-07-20-52-27.gh-issue-105848.p799D1.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index d087c7c1adc34d..b835f1ea2b0090 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1122,7 +1122,8 @@ iterations of the loop. This bytecode distinguishes two cases: if ``STACK[-1]`` has a method with the correct name, the bytecode pushes the unbound method and ``STACK[-1]``. ``STACK[-1]`` will be used as the first argument (``self``) by :opcode:`CALL` - when calling the unbound method. Otherwise, ``NULL`` and the object returned by + or :opcode:`CALL_KW` when calling the unbound method. + Otherwise, ``NULL`` and the object returned by the attribute lookup are pushed. .. versionchanged:: 3.12 @@ -1390,25 +1391,14 @@ iterations of the loop. .. opcode:: CALL (argc) - Calls a callable object with the number of arguments specified by ``argc``, - including the named arguments specified by the preceding - :opcode:`KW_NAMES`, if any. - On the stack are (in ascending order), either: + Calls a callable object with the number of arguments specified by ``argc``. + On the stack are (in ascending order): - * NULL * The callable - * The positional arguments - * The named arguments - - or: - - * The callable - * ``self`` + * ``self`` or ``NULL`` * The remaining positional arguments - * The named arguments - ``argc`` is the total of the positional and named arguments, excluding - ``self`` when a ``NULL`` is not present. + ``argc`` is the total of the positional arguments, excluding ``self``. ``CALL`` pops all arguments and the callable object off the stack, calls the callable object with those arguments, and pushes the return value @@ -1416,6 +1406,33 @@ iterations of the loop. .. versionadded:: 3.11 + .. versionchanged:: 3.13 + The callable now always appears at the same position on the stack. + + .. versionchanged:: 3.13 + Calls with keyword arguments are now handled by :opcode:`CALL_KW`. + + +.. opcode:: CALL_KW (argc) + + Calls a callable object with the number of arguments specified by ``argc``, + including one or more named arguments. On the stack are (in ascending order): + + * The callable + * ``self`` or ``NULL`` + * The remaining positional arguments + * The named arguments + * A :class:`tuple` of keyword argument names + + ``argc`` is the total of the positional and named arguments, excluding ``self``. + The length of the tuple of keyword argument names is the number of named arguments. + + ``CALL_KW`` pops all arguments, the keyword names, and the callable object + off the stack, calls the callable object with those arguments, and pushes the + return value returned by the callable object. + + .. versionadded:: 3.13 + .. opcode:: CALL_FUNCTION_EX (flags) @@ -1441,15 +1458,6 @@ iterations of the loop. .. versionadded:: 3.11 -.. opcode:: KW_NAMES (consti) - - Prefixes :opcode:`CALL`. - Stores a reference to ``co_consts[consti]`` into an internal variable - for use by :opcode:`CALL`. ``co_consts[consti]`` must be a tuple of strings. - - .. versionadded:: 3.11 - - .. opcode:: MAKE_FUNCTION Pushes a new function object on the stack built from the code object at ``STACK[1]``. diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 257b0583edae11..a77fa11baf8413 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -253,7 +253,7 @@ extern void _Py_Specialize_BinarySubscr(PyObject *sub, PyObject *container, extern void _Py_Specialize_StoreSubscr(PyObject *container, PyObject *sub, _Py_CODEUNIT *instr); extern void _Py_Specialize_Call(PyObject *callable, _Py_CODEUNIT *instr, - int nargs, PyObject *kwnames); + int nargs); extern void _Py_Specialize_BinaryOp(PyObject *lhs, PyObject *rhs, _Py_CODEUNIT *instr, int oparg, PyObject **locals); extern void _Py_Specialize_CompareOp(PyObject *lhs, PyObject *rhs, diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index 4086b309375778..856c3acb284b23 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -480,8 +480,6 @@ int _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 1; case LOAD_ATTR_METHOD_LAZY_DICT: return 1; - case KW_NAMES: - return 0; case INSTRUMENTED_CALL: return 0; case CALL: @@ -506,38 +504,42 @@ int _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return oparg + 2; case CALL_PY_WITH_DEFAULTS: return oparg + 2; - case CALL_NO_KW_TYPE_1: + case CALL_TYPE_1: return oparg + 2; - case CALL_NO_KW_STR_1: + case CALL_STR_1: return oparg + 2; - case CALL_NO_KW_TUPLE_1: + case CALL_TUPLE_1: return oparg + 2; - case CALL_NO_KW_ALLOC_AND_ENTER_INIT: + case CALL_ALLOC_AND_ENTER_INIT: return oparg + 2; case EXIT_INIT_CHECK: return 1; case CALL_BUILTIN_CLASS: return oparg + 2; - case CALL_NO_KW_BUILTIN_O: + case CALL_BUILTIN_O: return oparg + 2; - case CALL_NO_KW_BUILTIN_FAST: + case CALL_BUILTIN_FAST: return oparg + 2; case CALL_BUILTIN_FAST_WITH_KEYWORDS: return oparg + 2; - case CALL_NO_KW_LEN: + case CALL_LEN: return oparg + 2; - case CALL_NO_KW_ISINSTANCE: + case CALL_ISINSTANCE: return oparg + 2; - case CALL_NO_KW_LIST_APPEND: + case CALL_LIST_APPEND: return oparg + 2; - case CALL_NO_KW_METHOD_DESCRIPTOR_O: + case CALL_METHOD_DESCRIPTOR_O: return oparg + 2; case CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS: return oparg + 2; - case CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS: + case CALL_METHOD_DESCRIPTOR_NOARGS: return oparg + 2; - case CALL_NO_KW_METHOD_DESCRIPTOR_FAST: + case CALL_METHOD_DESCRIPTOR_FAST: return oparg + 2; + case INSTRUMENTED_CALL_KW: + return 0; + case CALL_KW: + return oparg + 3; case INSTRUMENTED_CALL_FUNCTION_EX: return 0; case CALL_FUNCTION_EX: @@ -1010,8 +1012,6 @@ int _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 1; case LOAD_ATTR_METHOD_LAZY_DICT: return 2; - case KW_NAMES: - return 0; case INSTRUMENTED_CALL: return 0; case CALL: @@ -1036,37 +1036,41 @@ int _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 1; case CALL_PY_WITH_DEFAULTS: return 1; - case CALL_NO_KW_TYPE_1: + case CALL_TYPE_1: return 1; - case CALL_NO_KW_STR_1: + case CALL_STR_1: return 1; - case CALL_NO_KW_TUPLE_1: + case CALL_TUPLE_1: return 1; - case CALL_NO_KW_ALLOC_AND_ENTER_INIT: + case CALL_ALLOC_AND_ENTER_INIT: return 1; case EXIT_INIT_CHECK: return 0; case CALL_BUILTIN_CLASS: return 1; - case CALL_NO_KW_BUILTIN_O: + case CALL_BUILTIN_O: return 1; - case CALL_NO_KW_BUILTIN_FAST: + case CALL_BUILTIN_FAST: return 1; case CALL_BUILTIN_FAST_WITH_KEYWORDS: return 1; - case CALL_NO_KW_LEN: + case CALL_LEN: return 1; - case CALL_NO_KW_ISINSTANCE: + case CALL_ISINSTANCE: return 1; - case CALL_NO_KW_LIST_APPEND: + case CALL_LIST_APPEND: return 1; - case CALL_NO_KW_METHOD_DESCRIPTOR_O: + case CALL_METHOD_DESCRIPTOR_O: return 1; case CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS: return 1; - case CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS: + case CALL_METHOD_DESCRIPTOR_NOARGS: return 1; - case CALL_NO_KW_METHOD_DESCRIPTOR_FAST: + case CALL_METHOD_DESCRIPTOR_FAST: + return 1; + case INSTRUMENTED_CALL_KW: + return 0; + case CALL_KW: return 1; case INSTRUMENTED_CALL_FUNCTION_EX: return 0; @@ -1405,7 +1409,6 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[OPCODE_METADATA_SIZE] = { [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, [LOAD_ATTR_METHOD_LAZY_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, - [KW_NAMES] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_CONST_FLAG }, [INSTRUMENTED_CALL] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG }, [CALL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG }, [_CHECK_CALL_BOUND_METHOD_EXACT_ARGS] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, @@ -1418,22 +1421,24 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[OPCODE_METADATA_SIZE] = { [CALL_BOUND_METHOD_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, [CALL_PY_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, [CALL_PY_WITH_DEFAULTS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, - [CALL_NO_KW_TYPE_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, - [CALL_NO_KW_STR_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, - [CALL_NO_KW_TUPLE_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, - [CALL_NO_KW_ALLOC_AND_ENTER_INIT] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, + [CALL_TYPE_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, + [CALL_STR_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, + [CALL_TUPLE_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, + [CALL_ALLOC_AND_ENTER_INIT] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, [EXIT_INIT_CHECK] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG }, [CALL_BUILTIN_CLASS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, - [CALL_NO_KW_BUILTIN_O] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, - [CALL_NO_KW_BUILTIN_FAST] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, + [CALL_BUILTIN_O] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, + [CALL_BUILTIN_FAST] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, - [CALL_NO_KW_LEN] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, - [CALL_NO_KW_ISINSTANCE] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, - [CALL_NO_KW_LIST_APPEND] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, - [CALL_NO_KW_METHOD_DESCRIPTOR_O] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, + [CALL_LEN] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, + [CALL_ISINSTANCE] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, + [CALL_LIST_APPEND] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, + [CALL_METHOD_DESCRIPTOR_O] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, - [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, - [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, + [CALL_METHOD_DESCRIPTOR_NOARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, + [CALL_METHOD_DESCRIPTOR_FAST] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG }, + [INSTRUMENTED_CALL_KW] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG }, + [CALL_KW] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG }, [INSTRUMENTED_CALL_FUNCTION_EX] = { true, INSTR_FMT_IX, 0 }, [CALL_FUNCTION_EX] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG }, [MAKE_FUNCTION] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG }, @@ -1581,17 +1586,20 @@ const struct opcode_macro_expansion _PyOpcode_macro_expansion[OPCODE_MACRO_EXPAN [PUSH_EXC_INFO] = { .nuops = 1, .uops = { { PUSH_EXC_INFO, 0, 0 } } }, [CALL_BOUND_METHOD_EXACT_ARGS] = { .nuops = 9, .uops = { { _CHECK_PEP_523, 0, 0 }, { _CHECK_CALL_BOUND_METHOD_EXACT_ARGS, 0, 0 }, { _INIT_CALL_BOUND_METHOD_EXACT_ARGS, 0, 0 }, { _CHECK_FUNCTION_EXACT_ARGS, 2, 1 }, { _CHECK_STACK_SPACE, 0, 0 }, { _INIT_CALL_PY_EXACT_ARGS, 0, 0 }, { _SET_IP, 7, 3 }, { _SAVE_CURRENT_IP, 0, 0 }, { _PUSH_FRAME, 0, 0 } } }, [CALL_PY_EXACT_ARGS] = { .nuops = 7, .uops = { { _CHECK_PEP_523, 0, 0 }, { _CHECK_FUNCTION_EXACT_ARGS, 2, 1 }, { _CHECK_STACK_SPACE, 0, 0 }, { _INIT_CALL_PY_EXACT_ARGS, 0, 0 }, { _SET_IP, 7, 3 }, { _SAVE_CURRENT_IP, 0, 0 }, { _PUSH_FRAME, 0, 0 } } }, - [CALL_NO_KW_TYPE_1] = { .nuops = 1, .uops = { { CALL_NO_KW_TYPE_1, 0, 0 } } }, - [CALL_NO_KW_STR_1] = { .nuops = 1, .uops = { { CALL_NO_KW_STR_1, 0, 0 } } }, - [CALL_NO_KW_TUPLE_1] = { .nuops = 1, .uops = { { CALL_NO_KW_TUPLE_1, 0, 0 } } }, + [CALL_TYPE_1] = { .nuops = 1, .uops = { { CALL_TYPE_1, 0, 0 } } }, + [CALL_STR_1] = { .nuops = 1, .uops = { { CALL_STR_1, 0, 0 } } }, + [CALL_TUPLE_1] = { .nuops = 1, .uops = { { CALL_TUPLE_1, 0, 0 } } }, [EXIT_INIT_CHECK] = { .nuops = 1, .uops = { { EXIT_INIT_CHECK, 0, 0 } } }, - [CALL_NO_KW_BUILTIN_O] = { .nuops = 1, .uops = { { CALL_NO_KW_BUILTIN_O, 0, 0 } } }, - [CALL_NO_KW_BUILTIN_FAST] = { .nuops = 1, .uops = { { CALL_NO_KW_BUILTIN_FAST, 0, 0 } } }, - [CALL_NO_KW_LEN] = { .nuops = 1, .uops = { { CALL_NO_KW_LEN, 0, 0 } } }, - [CALL_NO_KW_ISINSTANCE] = { .nuops = 1, .uops = { { CALL_NO_KW_ISINSTANCE, 0, 0 } } }, - [CALL_NO_KW_METHOD_DESCRIPTOR_O] = { .nuops = 1, .uops = { { CALL_NO_KW_METHOD_DESCRIPTOR_O, 0, 0 } } }, - [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = { .nuops = 1, .uops = { { CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS, 0, 0 } } }, - [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = { .nuops = 1, .uops = { { CALL_NO_KW_METHOD_DESCRIPTOR_FAST, 0, 0 } } }, + [CALL_BUILTIN_CLASS] = { .nuops = 1, .uops = { { CALL_BUILTIN_CLASS, 0, 0 } } }, + [CALL_BUILTIN_O] = { .nuops = 1, .uops = { { CALL_BUILTIN_O, 0, 0 } } }, + [CALL_BUILTIN_FAST] = { .nuops = 1, .uops = { { CALL_BUILTIN_FAST, 0, 0 } } }, + [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { .nuops = 1, .uops = { { CALL_BUILTIN_FAST_WITH_KEYWORDS, 0, 0 } } }, + [CALL_LEN] = { .nuops = 1, .uops = { { CALL_LEN, 0, 0 } } }, + [CALL_ISINSTANCE] = { .nuops = 1, .uops = { { CALL_ISINSTANCE, 0, 0 } } }, + [CALL_METHOD_DESCRIPTOR_O] = { .nuops = 1, .uops = { { CALL_METHOD_DESCRIPTOR_O, 0, 0 } } }, + [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { .nuops = 1, .uops = { { CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, 0, 0 } } }, + [CALL_METHOD_DESCRIPTOR_NOARGS] = { .nuops = 1, .uops = { { CALL_METHOD_DESCRIPTOR_NOARGS, 0, 0 } } }, + [CALL_METHOD_DESCRIPTOR_FAST] = { .nuops = 1, .uops = { { CALL_METHOD_DESCRIPTOR_FAST, 0, 0 } } }, [MAKE_FUNCTION] = { .nuops = 1, .uops = { { MAKE_FUNCTION, 0, 0 } } }, [SET_FUNCTION_ATTRIBUTE] = { .nuops = 1, .uops = { { SET_FUNCTION_ATTRIBUTE, 0, 0 } } }, [BUILD_SLICE] = { .nuops = 1, .uops = { { BUILD_SLICE, 0, 0 } } }, @@ -1717,6 +1725,7 @@ const char *const _PyOpcode_OpName[268] = { [CALL_FUNCTION_EX] = "CALL_FUNCTION_EX", [CALL_INTRINSIC_1] = "CALL_INTRINSIC_1", [CALL_INTRINSIC_2] = "CALL_INTRINSIC_2", + [CALL_KW] = "CALL_KW", [COMPARE_OP] = "COMPARE_OP", [CONTAINS_OP] = "CONTAINS_OP", [CONVERT_VALUE] = "CONVERT_VALUE", @@ -1739,7 +1748,6 @@ const char *const _PyOpcode_OpName[268] = { [JUMP_BACKWARD] = "JUMP_BACKWARD", [JUMP_BACKWARD_NO_INTERRUPT] = "JUMP_BACKWARD_NO_INTERRUPT", [JUMP_FORWARD] = "JUMP_FORWARD", - [KW_NAMES] = "KW_NAMES", [LIST_APPEND] = "LIST_APPEND", [LIST_EXTEND] = "LIST_EXTEND", [LOAD_ATTR] = "LOAD_ATTR", @@ -1791,24 +1799,24 @@ const char *const _PyOpcode_OpName[268] = { [BINARY_SUBSCR_LIST_INT] = "BINARY_SUBSCR_LIST_INT", [BINARY_SUBSCR_STR_INT] = "BINARY_SUBSCR_STR_INT", [BINARY_SUBSCR_TUPLE_INT] = "BINARY_SUBSCR_TUPLE_INT", + [CALL_ALLOC_AND_ENTER_INIT] = "CALL_ALLOC_AND_ENTER_INIT", [CALL_BOUND_METHOD_EXACT_ARGS] = "CALL_BOUND_METHOD_EXACT_ARGS", [CALL_BUILTIN_CLASS] = "CALL_BUILTIN_CLASS", + [CALL_BUILTIN_FAST] = "CALL_BUILTIN_FAST", [CALL_BUILTIN_FAST_WITH_KEYWORDS] = "CALL_BUILTIN_FAST_WITH_KEYWORDS", + [CALL_BUILTIN_O] = "CALL_BUILTIN_O", + [CALL_ISINSTANCE] = "CALL_ISINSTANCE", + [CALL_LEN] = "CALL_LEN", + [CALL_LIST_APPEND] = "CALL_LIST_APPEND", + [CALL_METHOD_DESCRIPTOR_FAST] = "CALL_METHOD_DESCRIPTOR_FAST", [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", - [CALL_NO_KW_ALLOC_AND_ENTER_INIT] = "CALL_NO_KW_ALLOC_AND_ENTER_INIT", - [CALL_NO_KW_BUILTIN_FAST] = "CALL_NO_KW_BUILTIN_FAST", - [CALL_NO_KW_BUILTIN_O] = "CALL_NO_KW_BUILTIN_O", - [CALL_NO_KW_ISINSTANCE] = "CALL_NO_KW_ISINSTANCE", - [CALL_NO_KW_LEN] = "CALL_NO_KW_LEN", - [CALL_NO_KW_LIST_APPEND] = "CALL_NO_KW_LIST_APPEND", - [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = "CALL_NO_KW_METHOD_DESCRIPTOR_FAST", - [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = "CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS", - [CALL_NO_KW_METHOD_DESCRIPTOR_O] = "CALL_NO_KW_METHOD_DESCRIPTOR_O", - [CALL_NO_KW_STR_1] = "CALL_NO_KW_STR_1", - [CALL_NO_KW_TUPLE_1] = "CALL_NO_KW_TUPLE_1", - [CALL_NO_KW_TYPE_1] = "CALL_NO_KW_TYPE_1", + [CALL_METHOD_DESCRIPTOR_NOARGS] = "CALL_METHOD_DESCRIPTOR_NOARGS", + [CALL_METHOD_DESCRIPTOR_O] = "CALL_METHOD_DESCRIPTOR_O", [CALL_PY_EXACT_ARGS] = "CALL_PY_EXACT_ARGS", [CALL_PY_WITH_DEFAULTS] = "CALL_PY_WITH_DEFAULTS", + [CALL_STR_1] = "CALL_STR_1", + [CALL_TUPLE_1] = "CALL_TUPLE_1", + [CALL_TYPE_1] = "CALL_TYPE_1", [COMPARE_OP_FLOAT] = "COMPARE_OP_FLOAT", [COMPARE_OP_INT] = "COMPARE_OP_INT", [COMPARE_OP_STR] = "COMPARE_OP_STR", @@ -1857,6 +1865,7 @@ const char *const _PyOpcode_OpName[268] = { [INSTRUMENTED_LOAD_SUPER_ATTR] = "INSTRUMENTED_LOAD_SUPER_ATTR", [INSTRUMENTED_FOR_ITER] = "INSTRUMENTED_FOR_ITER", [INSTRUMENTED_CALL] = "INSTRUMENTED_CALL", + [INSTRUMENTED_CALL_KW] = "INSTRUMENTED_CALL_KW", [INSTRUMENTED_CALL_FUNCTION_EX] = "INSTRUMENTED_CALL_FUNCTION_EX", [INSTRUMENTED_INSTRUCTION] = "INSTRUMENTED_INSTRUCTION", [INSTRUMENTED_JUMP_FORWARD] = "INSTRUMENTED_JUMP_FORWARD", @@ -1935,27 +1944,28 @@ const uint8_t _PyOpcode_Deopt[256] = { [BUILD_TUPLE] = BUILD_TUPLE, [CACHE] = CACHE, [CALL] = CALL, + [CALL_ALLOC_AND_ENTER_INIT] = CALL, [CALL_BOUND_METHOD_EXACT_ARGS] = CALL, [CALL_BUILTIN_CLASS] = CALL, + [CALL_BUILTIN_FAST] = CALL, [CALL_BUILTIN_FAST_WITH_KEYWORDS] = CALL, + [CALL_BUILTIN_O] = CALL, [CALL_FUNCTION_EX] = CALL_FUNCTION_EX, [CALL_INTRINSIC_1] = CALL_INTRINSIC_1, [CALL_INTRINSIC_2] = CALL_INTRINSIC_2, + [CALL_ISINSTANCE] = CALL, + [CALL_KW] = CALL_KW, + [CALL_LEN] = CALL, + [CALL_LIST_APPEND] = CALL, + [CALL_METHOD_DESCRIPTOR_FAST] = CALL, [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = CALL, - [CALL_NO_KW_ALLOC_AND_ENTER_INIT] = CALL, - [CALL_NO_KW_BUILTIN_FAST] = CALL, - [CALL_NO_KW_BUILTIN_O] = CALL, - [CALL_NO_KW_ISINSTANCE] = CALL, - [CALL_NO_KW_LEN] = CALL, - [CALL_NO_KW_LIST_APPEND] = CALL, - [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = CALL, - [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = CALL, - [CALL_NO_KW_METHOD_DESCRIPTOR_O] = CALL, - [CALL_NO_KW_STR_1] = CALL, - [CALL_NO_KW_TUPLE_1] = CALL, - [CALL_NO_KW_TYPE_1] = CALL, + [CALL_METHOD_DESCRIPTOR_NOARGS] = CALL, + [CALL_METHOD_DESCRIPTOR_O] = CALL, [CALL_PY_EXACT_ARGS] = CALL, [CALL_PY_WITH_DEFAULTS] = CALL, + [CALL_STR_1] = CALL, + [CALL_TUPLE_1] = CALL, + [CALL_TYPE_1] = CALL, [CHECK_EG_MATCH] = CHECK_EG_MATCH, [CHECK_EXC_MATCH] = CHECK_EXC_MATCH, [CLEANUP_THROW] = CLEANUP_THROW, @@ -1998,6 +2008,7 @@ const uint8_t _PyOpcode_Deopt[256] = { [IMPORT_NAME] = IMPORT_NAME, [INSTRUMENTED_CALL] = INSTRUMENTED_CALL, [INSTRUMENTED_CALL_FUNCTION_EX] = INSTRUMENTED_CALL_FUNCTION_EX, + [INSTRUMENTED_CALL_KW] = INSTRUMENTED_CALL_KW, [INSTRUMENTED_END_FOR] = INSTRUMENTED_END_FOR, [INSTRUMENTED_END_SEND] = INSTRUMENTED_END_SEND, [INSTRUMENTED_FOR_ITER] = INSTRUMENTED_FOR_ITER, @@ -2019,7 +2030,6 @@ const uint8_t _PyOpcode_Deopt[256] = { [JUMP_BACKWARD] = JUMP_BACKWARD, [JUMP_BACKWARD_NO_INTERRUPT] = JUMP_BACKWARD_NO_INTERRUPT, [JUMP_FORWARD] = JUMP_FORWARD, - [KW_NAMES] = KW_NAMES, [LIST_APPEND] = LIST_APPEND, [LIST_EXTEND] = LIST_EXTEND, [LOAD_ASSERTION_ERROR] = LOAD_ASSERTION_ERROR, @@ -2166,7 +2176,6 @@ const uint8_t _PyOpcode_Deopt[256] = { case 233: \ case 234: \ case 235: \ - case 236: \ case 255: \ ; diff --git a/Include/opcode_ids.h b/Include/opcode_ids.h index 8af9684ebb18c1..ba25bd459c1bcd 100644 --- a/Include/opcode_ids.h +++ b/Include/opcode_ids.h @@ -68,29 +68,29 @@ extern "C" { #define CALL_FUNCTION_EX 54 #define CALL_INTRINSIC_1 55 #define CALL_INTRINSIC_2 56 -#define COMPARE_OP 57 -#define CONTAINS_OP 58 -#define CONVERT_VALUE 59 -#define COPY 60 -#define COPY_FREE_VARS 61 -#define DELETE_ATTR 62 -#define DELETE_DEREF 63 -#define DELETE_FAST 64 -#define DELETE_GLOBAL 65 -#define DELETE_NAME 66 -#define DICT_MERGE 67 -#define DICT_UPDATE 68 -#define ENTER_EXECUTOR 69 -#define EXTENDED_ARG 70 -#define FOR_ITER 71 -#define GET_AWAITABLE 72 -#define IMPORT_FROM 73 -#define IMPORT_NAME 74 -#define IS_OP 75 -#define JUMP_BACKWARD 76 -#define JUMP_BACKWARD_NO_INTERRUPT 77 -#define JUMP_FORWARD 78 -#define KW_NAMES 79 +#define CALL_KW 57 +#define COMPARE_OP 58 +#define CONTAINS_OP 59 +#define CONVERT_VALUE 60 +#define COPY 61 +#define COPY_FREE_VARS 62 +#define DELETE_ATTR 63 +#define DELETE_DEREF 64 +#define DELETE_FAST 65 +#define DELETE_GLOBAL 66 +#define DELETE_NAME 67 +#define DICT_MERGE 68 +#define DICT_UPDATE 69 +#define ENTER_EXECUTOR 70 +#define EXTENDED_ARG 71 +#define FOR_ITER 72 +#define GET_AWAITABLE 73 +#define IMPORT_FROM 74 +#define IMPORT_NAME 75 +#define IS_OP 76 +#define JUMP_BACKWARD 77 +#define JUMP_BACKWARD_NO_INTERRUPT 78 +#define JUMP_FORWARD 79 #define LIST_APPEND 80 #define LIST_EXTEND 81 #define LOAD_ATTR 82 @@ -143,24 +143,24 @@ extern "C" { #define BINARY_SUBSCR_LIST_INT 159 #define BINARY_SUBSCR_STR_INT 160 #define BINARY_SUBSCR_TUPLE_INT 161 -#define CALL_BOUND_METHOD_EXACT_ARGS 162 -#define CALL_BUILTIN_CLASS 163 -#define CALL_BUILTIN_FAST_WITH_KEYWORDS 164 -#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 165 -#define CALL_NO_KW_ALLOC_AND_ENTER_INIT 166 -#define CALL_NO_KW_BUILTIN_FAST 167 -#define CALL_NO_KW_BUILTIN_O 168 -#define CALL_NO_KW_ISINSTANCE 169 -#define CALL_NO_KW_LEN 170 -#define CALL_NO_KW_LIST_APPEND 171 -#define CALL_NO_KW_METHOD_DESCRIPTOR_FAST 172 -#define CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS 173 -#define CALL_NO_KW_METHOD_DESCRIPTOR_O 174 -#define CALL_NO_KW_STR_1 175 -#define CALL_NO_KW_TUPLE_1 176 -#define CALL_NO_KW_TYPE_1 177 -#define CALL_PY_EXACT_ARGS 178 -#define CALL_PY_WITH_DEFAULTS 179 +#define CALL_ALLOC_AND_ENTER_INIT 162 +#define CALL_BOUND_METHOD_EXACT_ARGS 163 +#define CALL_BUILTIN_CLASS 164 +#define CALL_BUILTIN_FAST 165 +#define CALL_BUILTIN_FAST_WITH_KEYWORDS 166 +#define CALL_BUILTIN_O 167 +#define CALL_ISINSTANCE 168 +#define CALL_LEN 169 +#define CALL_LIST_APPEND 170 +#define CALL_METHOD_DESCRIPTOR_FAST 171 +#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 172 +#define CALL_METHOD_DESCRIPTOR_NOARGS 173 +#define CALL_METHOD_DESCRIPTOR_O 174 +#define CALL_PY_EXACT_ARGS 175 +#define CALL_PY_WITH_DEFAULTS 176 +#define CALL_STR_1 177 +#define CALL_TUPLE_1 178 +#define CALL_TYPE_1 179 #define COMPARE_OP_FLOAT 180 #define COMPARE_OP_INT 181 #define COMPARE_OP_STR 182 @@ -200,16 +200,17 @@ extern "C" { #define UNPACK_SEQUENCE_LIST 216 #define UNPACK_SEQUENCE_TUPLE 217 #define UNPACK_SEQUENCE_TWO_TUPLE 218 -#define MIN_INSTRUMENTED_OPCODE 237 -#define INSTRUMENTED_RESUME 237 -#define INSTRUMENTED_END_FOR 238 -#define INSTRUMENTED_END_SEND 239 -#define INSTRUMENTED_RETURN_VALUE 240 -#define INSTRUMENTED_RETURN_CONST 241 -#define INSTRUMENTED_YIELD_VALUE 242 -#define INSTRUMENTED_LOAD_SUPER_ATTR 243 -#define INSTRUMENTED_FOR_ITER 244 -#define INSTRUMENTED_CALL 245 +#define MIN_INSTRUMENTED_OPCODE 236 +#define INSTRUMENTED_RESUME 236 +#define INSTRUMENTED_END_FOR 237 +#define INSTRUMENTED_END_SEND 238 +#define INSTRUMENTED_RETURN_VALUE 239 +#define INSTRUMENTED_RETURN_CONST 240 +#define INSTRUMENTED_YIELD_VALUE 241 +#define INSTRUMENTED_LOAD_SUPER_ATTR 242 +#define INSTRUMENTED_FOR_ITER 243 +#define INSTRUMENTED_CALL 244 +#define INSTRUMENTED_CALL_KW 245 #define INSTRUMENTED_CALL_FUNCTION_EX 246 #define INSTRUMENTED_INSTRUCTION 247 #define INSTRUMENTED_JUMP_FORWARD 248 diff --git a/Lib/_opcode_metadata.py b/Lib/_opcode_metadata.py index 4f76371dae28d1..5dd06ae487dfcf 100644 --- a/Lib/_opcode_metadata.py +++ b/Lib/_opcode_metadata.py @@ -85,21 +85,21 @@ "CALL_BOUND_METHOD_EXACT_ARGS", "CALL_PY_EXACT_ARGS", "CALL_PY_WITH_DEFAULTS", - "CALL_NO_KW_TYPE_1", - "CALL_NO_KW_STR_1", - "CALL_NO_KW_TUPLE_1", + "CALL_TYPE_1", + "CALL_STR_1", + "CALL_TUPLE_1", "CALL_BUILTIN_CLASS", - "CALL_NO_KW_BUILTIN_O", - "CALL_NO_KW_BUILTIN_FAST", + "CALL_BUILTIN_O", + "CALL_BUILTIN_FAST", "CALL_BUILTIN_FAST_WITH_KEYWORDS", - "CALL_NO_KW_LEN", - "CALL_NO_KW_ISINSTANCE", - "CALL_NO_KW_LIST_APPEND", - "CALL_NO_KW_METHOD_DESCRIPTOR_O", + "CALL_LEN", + "CALL_ISINSTANCE", + "CALL_LIST_APPEND", + "CALL_METHOD_DESCRIPTOR_O", "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", - "CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS", - "CALL_NO_KW_METHOD_DESCRIPTOR_FAST", - "CALL_NO_KW_ALLOC_AND_ENTER_INIT", + "CALL_METHOD_DESCRIPTOR_NOARGS", + "CALL_METHOD_DESCRIPTOR_FAST", + "CALL_ALLOC_AND_ENTER_INIT", ], } @@ -120,24 +120,24 @@ 'BINARY_SUBSCR_LIST_INT': 159, 'BINARY_SUBSCR_STR_INT': 160, 'BINARY_SUBSCR_TUPLE_INT': 161, - 'CALL_BOUND_METHOD_EXACT_ARGS': 162, - 'CALL_BUILTIN_CLASS': 163, - 'CALL_BUILTIN_FAST_WITH_KEYWORDS': 164, - 'CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS': 165, - 'CALL_NO_KW_ALLOC_AND_ENTER_INIT': 166, - 'CALL_NO_KW_BUILTIN_FAST': 167, - 'CALL_NO_KW_BUILTIN_O': 168, - 'CALL_NO_KW_ISINSTANCE': 169, - 'CALL_NO_KW_LEN': 170, - 'CALL_NO_KW_LIST_APPEND': 171, - 'CALL_NO_KW_METHOD_DESCRIPTOR_FAST': 172, - 'CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS': 173, - 'CALL_NO_KW_METHOD_DESCRIPTOR_O': 174, - 'CALL_NO_KW_STR_1': 175, - 'CALL_NO_KW_TUPLE_1': 176, - 'CALL_NO_KW_TYPE_1': 177, - 'CALL_PY_EXACT_ARGS': 178, - 'CALL_PY_WITH_DEFAULTS': 179, + 'CALL_ALLOC_AND_ENTER_INIT': 162, + 'CALL_BOUND_METHOD_EXACT_ARGS': 163, + 'CALL_BUILTIN_CLASS': 164, + 'CALL_BUILTIN_FAST': 165, + 'CALL_BUILTIN_FAST_WITH_KEYWORDS': 166, + 'CALL_BUILTIN_O': 167, + 'CALL_ISINSTANCE': 168, + 'CALL_LEN': 169, + 'CALL_LIST_APPEND': 170, + 'CALL_METHOD_DESCRIPTOR_FAST': 171, + 'CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS': 172, + 'CALL_METHOD_DESCRIPTOR_NOARGS': 173, + 'CALL_METHOD_DESCRIPTOR_O': 174, + 'CALL_PY_EXACT_ARGS': 175, + 'CALL_PY_WITH_DEFAULTS': 176, + 'CALL_STR_1': 177, + 'CALL_TUPLE_1': 178, + 'CALL_TYPE_1': 179, 'COMPARE_OP_FLOAT': 180, 'COMPARE_OP_INT': 181, 'COMPARE_OP_STR': 182, @@ -236,29 +236,29 @@ 'CALL_FUNCTION_EX': 54, 'CALL_INTRINSIC_1': 55, 'CALL_INTRINSIC_2': 56, - 'COMPARE_OP': 57, - 'CONTAINS_OP': 58, - 'CONVERT_VALUE': 59, - 'COPY': 60, - 'COPY_FREE_VARS': 61, - 'DELETE_ATTR': 62, - 'DELETE_DEREF': 63, - 'DELETE_FAST': 64, - 'DELETE_GLOBAL': 65, - 'DELETE_NAME': 66, - 'DICT_MERGE': 67, - 'DICT_UPDATE': 68, - 'ENTER_EXECUTOR': 69, - 'EXTENDED_ARG': 70, - 'FOR_ITER': 71, - 'GET_AWAITABLE': 72, - 'IMPORT_FROM': 73, - 'IMPORT_NAME': 74, - 'IS_OP': 75, - 'JUMP_BACKWARD': 76, - 'JUMP_BACKWARD_NO_INTERRUPT': 77, - 'JUMP_FORWARD': 78, - 'KW_NAMES': 79, + 'CALL_KW': 57, + 'COMPARE_OP': 58, + 'CONTAINS_OP': 59, + 'CONVERT_VALUE': 60, + 'COPY': 61, + 'COPY_FREE_VARS': 62, + 'DELETE_ATTR': 63, + 'DELETE_DEREF': 64, + 'DELETE_FAST': 65, + 'DELETE_GLOBAL': 66, + 'DELETE_NAME': 67, + 'DICT_MERGE': 68, + 'DICT_UPDATE': 69, + 'ENTER_EXECUTOR': 70, + 'EXTENDED_ARG': 71, + 'FOR_ITER': 72, + 'GET_AWAITABLE': 73, + 'IMPORT_FROM': 74, + 'IMPORT_NAME': 75, + 'IS_OP': 76, + 'JUMP_BACKWARD': 77, + 'JUMP_BACKWARD_NO_INTERRUPT': 78, + 'JUMP_FORWARD': 79, 'LIST_APPEND': 80, 'LIST_EXTEND': 81, 'LOAD_ATTR': 82, @@ -299,15 +299,16 @@ 'UNPACK_SEQUENCE': 117, 'YIELD_VALUE': 118, 'RESUME': 149, - 'INSTRUMENTED_RESUME': 237, - 'INSTRUMENTED_END_FOR': 238, - 'INSTRUMENTED_END_SEND': 239, - 'INSTRUMENTED_RETURN_VALUE': 240, - 'INSTRUMENTED_RETURN_CONST': 241, - 'INSTRUMENTED_YIELD_VALUE': 242, - 'INSTRUMENTED_LOAD_SUPER_ATTR': 243, - 'INSTRUMENTED_FOR_ITER': 244, - 'INSTRUMENTED_CALL': 245, + 'INSTRUMENTED_RESUME': 236, + 'INSTRUMENTED_END_FOR': 237, + 'INSTRUMENTED_END_SEND': 238, + 'INSTRUMENTED_RETURN_VALUE': 239, + 'INSTRUMENTED_RETURN_CONST': 240, + 'INSTRUMENTED_YIELD_VALUE': 241, + 'INSTRUMENTED_LOAD_SUPER_ATTR': 242, + 'INSTRUMENTED_FOR_ITER': 243, + 'INSTRUMENTED_CALL': 244, + 'INSTRUMENTED_CALL_KW': 245, 'INSTRUMENTED_CALL_FUNCTION_EX': 246, 'INSTRUMENTED_INSTRUCTION': 247, 'INSTRUMENTED_JUMP_FORWARD': 248, @@ -330,5 +331,5 @@ 'SETUP_WITH': 266, 'STORE_FAST_MAYBE_NULL': 267, } -MIN_INSTRUMENTED_OPCODE = 237 +MIN_INSTRUMENTED_OPCODE = 236 HAVE_ARGUMENT = 45 diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index d671d1799884e2..0019897c943e14 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -458,6 +458,7 @@ def _write_atomic(path, data, mode=0o666): # Python 3.13a1 3560 (Add RESUME_CHECK instruction) # Python 3.13a1 3561 (Add cache entry to branch instructions) # Python 3.13a1 3562 (Assign opcode IDs for internal ops in separate range) +# Python 3.13a1 3563 (Add CALL_KW and remove KW_NAMES) # Python 3.14 will start with 3600 @@ -474,7 +475,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3562).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3563).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index f6bd9094e8fece..35ddb7915eb5c7 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4757,24 +4757,24 @@ class Thing: thing = Thing() for i in range(20): with self.assertRaises(TypeError): - # PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS + # CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS list.sort(thing) for i in range(20): with self.assertRaises(TypeError): - # PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS + # CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS str.split(thing) for i in range(20): with self.assertRaises(TypeError): - # PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS + # CALL_METHOD_DESCRIPTOR_NOARGS str.upper(thing) for i in range(20): with self.assertRaises(TypeError): - # PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST + # CALL_METHOD_DESCRIPTOR_FAST str.strip(thing) from collections import deque for i in range(20): with self.assertRaises(TypeError): - # PRECALL_NO_KW_METHOD_DESCRIPTOR_O + # CALL_METHOD_DESCRIPTOR_O deque.append(thing, thing) def test_repr_as_str(self): diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 0f066d8294261d..568200c9c86c7e 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -240,8 +240,8 @@ def wrap_func_w_kwargs(): LOAD_CONST 1 (1) LOAD_CONST 2 (2) LOAD_CONST 3 (5) - KW_NAMES 4 (('c',)) - CALL 3 + LOAD_CONST 4 (('c',)) + CALL_KW 3 POP_TOP RETURN_CONST 0 (None) """ % (wrap_func_w_kwargs.__code__.co_firstlineno, @@ -1003,7 +1003,7 @@ def test_bug_46724(self): self.do_disassembly_test(bug46724, dis_bug46724) def test_kw_names(self): - # Test that value is displayed for KW_NAMES + # Test that value is displayed for keyword argument names: self.do_disassembly_test(wrap_func_w_kwargs, dis_kw_names) def test_intrinsic_1(self): @@ -1256,7 +1256,7 @@ def test_call_specialize(self): 1 LOAD_NAME 0 (str) PUSH_NULL LOAD_CONST 0 (1) - CALL_NO_KW_STR_1 1 + CALL_STR_1 1 RETURN_VALUE """ co = compile("str(1)", "", "eval") @@ -1636,7 +1636,7 @@ def _prepare_test_cases(): result = result.replace(repr(code_object_inner), "code_object_inner") print(result) -# _prepare_test_cases() +# from test.test_dis import _prepare_test_cases; _prepare_test_cases() Instruction = dis.Instruction @@ -1668,7 +1668,7 @@ def _prepare_test_cases(): ] expected_opinfo_f = [ - Instruction(opname='COPY_FREE_VARS', opcode=61, arg=2, argval=2, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='COPY_FREE_VARS', opcode=62, arg=2, argval=2, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), Instruction(opname='MAKE_CELL', opcode=94, arg=0, argval='c', argrepr='c', offset=2, start_offset=2, starts_line=False, line_number=None, is_jump_target=False, positions=None), Instruction(opname='MAKE_CELL', opcode=94, arg=1, argval='d', argrepr='d', offset=4, start_offset=4, starts_line=False, line_number=None, is_jump_target=False, positions=None), Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=6, start_offset=6, starts_line=True, line_number=2, is_jump_target=False, positions=None), @@ -1695,7 +1695,7 @@ def _prepare_test_cases(): ] expected_opinfo_inner = [ - Instruction(opname='COPY_FREE_VARS', opcode=61, arg=4, argval=4, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='COPY_FREE_VARS', opcode=62, arg=4, argval=4, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None, is_jump_target=False, positions=None), Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=2, start_offset=2, starts_line=True, line_number=3, is_jump_target=False, positions=None), Instruction(opname='LOAD_GLOBAL', opcode=91, arg=1, argval='print', argrepr='print + NULL', offset=4, start_offset=4, starts_line=True, line_number=4, is_jump_target=False, positions=None), Instruction(opname='LOAD_DEREF', opcode=84, arg=2, argval='a', argrepr='a', offset=14, start_offset=14, starts_line=False, line_number=4, is_jump_target=False, positions=None), @@ -1714,7 +1714,7 @@ def _prepare_test_cases(): Instruction(opname='LOAD_CONST', opcode=83, arg=1, argval=10, argrepr='10', offset=12, start_offset=12, starts_line=False, line_number=3, is_jump_target=False, positions=None), Instruction(opname='CALL', opcode=53, arg=1, argval=1, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=3, is_jump_target=False, positions=None), Instruction(opname='GET_ITER', opcode=19, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, is_jump_target=False, positions=None), - Instruction(opname='FOR_ITER', opcode=71, arg=30, argval=88, argrepr='to 88', offset=24, start_offset=24, starts_line=False, line_number=3, is_jump_target=True, positions=None), + Instruction(opname='FOR_ITER', opcode=72, arg=30, argval=88, argrepr='to 88', offset=24, start_offset=24, starts_line=False, line_number=3, is_jump_target=True, positions=None), Instruction(opname='STORE_FAST', opcode=110, arg=0, argval='i', argrepr='i', offset=28, start_offset=28, starts_line=False, line_number=3, is_jump_target=False, positions=None), Instruction(opname='LOAD_GLOBAL', opcode=91, arg=3, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=4, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='i', argrepr='i', offset=40, start_offset=40, starts_line=False, line_number=4, is_jump_target=False, positions=None), @@ -1722,16 +1722,16 @@ def _prepare_test_cases(): Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=50, start_offset=50, starts_line=False, line_number=4, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='i', argrepr='i', offset=52, start_offset=52, starts_line=True, line_number=5, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=83, arg=2, argval=4, argrepr='4', offset=54, start_offset=54, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=57, arg=18, argval='<', argrepr='bool(<)', offset=56, start_offset=56, starts_line=False, line_number=5, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=58, arg=18, argval='<', argrepr='bool(<)', offset=56, start_offset=56, starts_line=False, line_number=5, is_jump_target=False, positions=None), Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=2, argval=68, argrepr='to 68', offset=60, start_offset=60, starts_line=False, line_number=5, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=76, arg=22, argval=24, argrepr='to 24', offset=64, start_offset=64, starts_line=True, line_number=6, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=77, arg=22, argval=24, argrepr='to 24', offset=64, start_offset=64, starts_line=True, line_number=6, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='i', argrepr='i', offset=68, start_offset=68, starts_line=True, line_number=7, is_jump_target=True, positions=None), Instruction(opname='LOAD_CONST', opcode=83, arg=3, argval=6, argrepr='6', offset=70, start_offset=70, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=57, arg=148, argval='>', argrepr='bool(>)', offset=72, start_offset=72, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=58, arg=148, argval='>', argrepr='bool(>)', offset=72, start_offset=72, starts_line=False, line_number=7, is_jump_target=False, positions=None), Instruction(opname='POP_JUMP_IF_TRUE', opcode=100, arg=2, argval=84, argrepr='to 84', offset=76, start_offset=76, starts_line=False, line_number=7, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=76, arg=30, argval=24, argrepr='to 24', offset=80, start_offset=80, starts_line=False, line_number=7, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=77, arg=30, argval=24, argrepr='to 24', offset=80, start_offset=80, starts_line=False, line_number=7, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=84, start_offset=84, starts_line=True, line_number=8, is_jump_target=True, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=78, arg=12, argval=112, argrepr='to 112', offset=86, start_offset=86, starts_line=False, line_number=8, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=79, arg=12, argval=112, argrepr='to 112', offset=86, start_offset=86, starts_line=False, line_number=8, is_jump_target=False, positions=None), Instruction(opname='END_FOR', opcode=11, arg=None, argval=None, argrepr='', offset=88, start_offset=88, starts_line=True, line_number=3, is_jump_target=True, positions=None), Instruction(opname='LOAD_GLOBAL', opcode=91, arg=3, argval='print', argrepr='print + NULL', offset=90, start_offset=90, starts_line=True, line_number=10, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=83, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=100, start_offset=100, starts_line=False, line_number=10, is_jump_target=False, positions=None), @@ -1750,18 +1750,18 @@ def _prepare_test_cases(): Instruction(opname='STORE_FAST', opcode=110, arg=0, argval='i', argrepr='i', offset=156, start_offset=156, starts_line=False, line_number=13, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='i', argrepr='i', offset=158, start_offset=158, starts_line=True, line_number=14, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=83, arg=3, argval=6, argrepr='6', offset=160, start_offset=160, starts_line=False, line_number=14, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=57, arg=148, argval='>', argrepr='bool(>)', offset=162, start_offset=162, starts_line=False, line_number=14, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=58, arg=148, argval='>', argrepr='bool(>)', offset=162, start_offset=162, starts_line=False, line_number=14, is_jump_target=False, positions=None), Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=2, argval=174, argrepr='to 174', offset=166, start_offset=166, starts_line=False, line_number=14, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=76, arg=31, argval=112, argrepr='to 112', offset=170, start_offset=170, starts_line=True, line_number=15, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=77, arg=31, argval=112, argrepr='to 112', offset=170, start_offset=170, starts_line=True, line_number=15, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='i', argrepr='i', offset=174, start_offset=174, starts_line=True, line_number=16, is_jump_target=True, positions=None), Instruction(opname='LOAD_CONST', opcode=83, arg=2, argval=4, argrepr='4', offset=176, start_offset=176, starts_line=False, line_number=16, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=57, arg=18, argval='<', argrepr='bool(<)', offset=178, start_offset=178, starts_line=False, line_number=16, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=58, arg=18, argval='<', argrepr='bool(<)', offset=178, start_offset=178, starts_line=False, line_number=16, is_jump_target=False, positions=None), Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=1, argval=188, argrepr='to 188', offset=182, start_offset=182, starts_line=False, line_number=16, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=78, arg=20, argval=228, argrepr='to 228', offset=186, start_offset=186, starts_line=True, line_number=17, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=79, arg=20, argval=228, argrepr='to 228', offset=186, start_offset=186, starts_line=True, line_number=17, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=85, arg=0, argval='i', argrepr='i', offset=188, start_offset=188, starts_line=True, line_number=11, is_jump_target=True, positions=None), Instruction(opname='TO_BOOL', opcode=40, arg=None, argval=None, argrepr='', offset=190, start_offset=190, starts_line=False, line_number=11, is_jump_target=False, positions=None), Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=2, argval=206, argrepr='to 206', offset=198, start_offset=198, starts_line=False, line_number=11, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=76, arg=40, argval=126, argrepr='to 126', offset=202, start_offset=202, starts_line=False, line_number=11, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=77, arg=40, argval=126, argrepr='to 126', offset=202, start_offset=202, starts_line=False, line_number=11, is_jump_target=False, positions=None), Instruction(opname='LOAD_GLOBAL', opcode=91, arg=3, argval='print', argrepr='print + NULL', offset=206, start_offset=206, starts_line=True, line_number=19, is_jump_target=True, positions=None), Instruction(opname='LOAD_CONST', opcode=83, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=216, start_offset=216, starts_line=False, line_number=19, is_jump_target=False, positions=None), Instruction(opname='CALL', opcode=53, arg=1, argval=1, argrepr='', offset=218, start_offset=218, starts_line=False, line_number=19, is_jump_target=False, positions=None), @@ -1797,8 +1797,8 @@ def _prepare_test_cases(): Instruction(opname='POP_EXCEPT', opcode=31, arg=None, argval=None, argrepr='', offset=328, start_offset=328, starts_line=False, line_number=25, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=330, start_offset=330, starts_line=False, line_number=25, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=332, start_offset=332, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=76, arg=27, argval=284, argrepr='to 284', offset=334, start_offset=334, starts_line=False, line_number=25, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=60, arg=3, argval=3, argrepr='', offset=338, start_offset=338, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=77, arg=27, argval=284, argrepr='to 284', offset=334, start_offset=334, starts_line=False, line_number=25, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=61, arg=3, argval=3, argrepr='', offset=338, start_offset=338, starts_line=True, line_number=None, is_jump_target=False, positions=None), Instruction(opname='POP_EXCEPT', opcode=31, arg=None, argval=None, argrepr='', offset=340, start_offset=340, starts_line=False, line_number=None, is_jump_target=False, positions=None), Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=342, start_offset=342, starts_line=False, line_number=None, is_jump_target=False, positions=None), Instruction(opname='PUSH_EXC_INFO', opcode=33, arg=None, argval=None, argrepr='', offset=344, start_offset=344, starts_line=False, line_number=None, is_jump_target=False, positions=None), @@ -1811,9 +1811,9 @@ def _prepare_test_cases(): Instruction(opname='CALL', opcode=53, arg=1, argval=1, argrepr='', offset=376, start_offset=376, starts_line=False, line_number=23, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=384, start_offset=384, starts_line=False, line_number=23, is_jump_target=False, positions=None), Instruction(opname='POP_EXCEPT', opcode=31, arg=None, argval=None, argrepr='', offset=386, start_offset=386, starts_line=False, line_number=23, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=76, arg=54, argval=284, argrepr='to 284', offset=388, start_offset=388, starts_line=False, line_number=23, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=77, arg=54, argval=284, argrepr='to 284', offset=388, start_offset=388, starts_line=False, line_number=23, is_jump_target=False, positions=None), Instruction(opname='RERAISE', opcode=102, arg=0, argval=0, argrepr='', offset=392, start_offset=392, starts_line=True, line_number=22, is_jump_target=True, positions=None), - Instruction(opname='COPY', opcode=60, arg=3, argval=3, argrepr='', offset=394, start_offset=394, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=61, arg=3, argval=3, argrepr='', offset=394, start_offset=394, starts_line=True, line_number=None, is_jump_target=False, positions=None), Instruction(opname='POP_EXCEPT', opcode=31, arg=None, argval=None, argrepr='', offset=396, start_offset=396, starts_line=False, line_number=None, is_jump_target=False, positions=None), Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=398, start_offset=398, starts_line=False, line_number=None, is_jump_target=False, positions=None), Instruction(opname='PUSH_EXC_INFO', opcode=33, arg=None, argval=None, argrepr='', offset=400, start_offset=400, starts_line=False, line_number=None, is_jump_target=False, positions=None), @@ -1822,7 +1822,7 @@ def _prepare_test_cases(): Instruction(opname='CALL', opcode=53, arg=1, argval=1, argrepr='', offset=414, start_offset=414, starts_line=False, line_number=28, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=422, start_offset=422, starts_line=False, line_number=28, is_jump_target=False, positions=None), Instruction(opname='RERAISE', opcode=102, arg=0, argval=0, argrepr='', offset=424, start_offset=424, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=60, arg=3, argval=3, argrepr='', offset=426, start_offset=426, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=61, arg=3, argval=3, argrepr='', offset=426, start_offset=426, starts_line=False, line_number=28, is_jump_target=False, positions=None), Instruction(opname='POP_EXCEPT', opcode=31, arg=None, argval=None, argrepr='', offset=428, start_offset=428, starts_line=False, line_number=28, is_jump_target=False, positions=None), Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=430, start_offset=430, starts_line=False, line_number=28, is_jump_target=False, positions=None), ] diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-07-20-52-27.gh-issue-105848.p799D1.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-07-20-52-27.gh-issue-105848.p799D1.rst new file mode 100644 index 00000000000000..14661d14e190ce --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-07-20-52-27.gh-issue-105848.p799D1.rst @@ -0,0 +1,3 @@ +Add a new :opcode:`CALL_KW` opcode, used for calls containing keyword +arguments. Also, fix a possible crash when jumping over method calls in a +debugger. diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 53764a41ca010a..d75444393f3697 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -411,10 +411,10 @@ mark_stacks(PyCodeObject *code_obj, int len) case LOAD_GLOBAL: { int j = oparg; + next_stack = push_value(next_stack, Object); if (j & 1) { next_stack = push_value(next_stack, Null); } - next_stack = push_value(next_stack, Object); stacks[next_i] = next_stack; break; } @@ -424,22 +424,12 @@ mark_stacks(PyCodeObject *code_obj, int len) int j = oparg; if (j & 1) { next_stack = pop_value(next_stack); - next_stack = push_value(next_stack, Null); next_stack = push_value(next_stack, Object); + next_stack = push_value(next_stack, Null); } stacks[next_i] = next_stack; break; } - case CALL: - { - int args = oparg; - for (int j = 0; j < args+2; j++) { - next_stack = pop_value(next_stack); - } - next_stack = push_value(next_stack, Object); - stacks[next_i] = next_stack; - break; - } case SWAP: { int n = oparg; diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h index c2082728aafaad..4fb78cf632d70e 100644 --- a/Programs/test_frozenmain.h +++ b/Programs/test_frozenmain.h @@ -2,16 +2,16 @@ unsigned char M_test_frozenmain[] = { 227,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0, 0,0,0,0,0,243,164,0,0,0,149,0,83,0,83,1, - 74,0,114,0,83,0,83,1,74,1,114,1,92,2,34,0, + 75,0,114,0,83,0,83,1,75,1,114,1,92,2,34,0, 83,2,53,1,0,0,0,0,0,0,32,0,92,2,34,0, 83,3,92,0,82,6,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,53,2,0,0,0,0,0,0, 32,0,92,1,82,8,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,34,0,53,0,0,0,0,0, - 0,0,83,4,5,0,0,0,114,5,83,5,19,0,71,20, + 0,0,83,4,5,0,0,0,114,5,83,5,19,0,72,20, 0,0,114,6,92,2,34,0,83,6,92,6,14,0,83,7, 92,5,92,6,5,0,0,0,14,0,51,4,53,1,0,0, - 0,0,0,0,32,0,76,22,0,0,11,0,103,1,41,8, + 0,0,0,0,32,0,77,22,0,0,11,0,103,1,41,8, 233,0,0,0,0,78,122,18,70,114,111,122,101,110,32,72, 101,108,108,111,32,87,111,114,108,100,122,8,115,121,115,46, 97,114,103,118,218,6,99,111,110,102,105,103,41,5,218,12, diff --git a/Python/abstract_interp_cases.c.h b/Python/abstract_interp_cases.c.h index 1b96ca130defcf..5a3848cd726245 100644 --- a/Python/abstract_interp_cases.c.h +++ b/Python/abstract_interp_cases.c.h @@ -661,21 +661,21 @@ break; } - case CALL_NO_KW_TYPE_1: { + case CALL_TYPE_1: { STACK_SHRINK(oparg); STACK_SHRINK(1); PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); break; } - case CALL_NO_KW_STR_1: { + case CALL_STR_1: { STACK_SHRINK(oparg); STACK_SHRINK(1); PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); break; } - case CALL_NO_KW_TUPLE_1: { + case CALL_TUPLE_1: { STACK_SHRINK(oparg); STACK_SHRINK(1); PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); @@ -687,49 +687,70 @@ break; } - case CALL_NO_KW_BUILTIN_O: { + case CALL_BUILTIN_CLASS: { STACK_SHRINK(oparg); STACK_SHRINK(1); PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); break; } - case CALL_NO_KW_BUILTIN_FAST: { + case CALL_BUILTIN_O: { STACK_SHRINK(oparg); STACK_SHRINK(1); PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); break; } - case CALL_NO_KW_LEN: { + case CALL_BUILTIN_FAST: { STACK_SHRINK(oparg); STACK_SHRINK(1); PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); break; } - case CALL_NO_KW_ISINSTANCE: { + case CALL_BUILTIN_FAST_WITH_KEYWORDS: { STACK_SHRINK(oparg); STACK_SHRINK(1); PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); break; } - case CALL_NO_KW_METHOD_DESCRIPTOR_O: { + case CALL_LEN: { STACK_SHRINK(oparg); STACK_SHRINK(1); PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); break; } - case CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS: { + case CALL_ISINSTANCE: { STACK_SHRINK(oparg); STACK_SHRINK(1); PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); break; } - case CALL_NO_KW_METHOD_DESCRIPTOR_FAST: { + case CALL_METHOD_DESCRIPTOR_O: { + STACK_SHRINK(oparg); + STACK_SHRINK(1); + PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); + break; + } + + case CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS: { + STACK_SHRINK(oparg); + STACK_SHRINK(1); + PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); + break; + } + + case CALL_METHOD_DESCRIPTOR_NOARGS: { + STACK_SHRINK(oparg); + STACK_SHRINK(1); + PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); + break; + } + + case CALL_METHOD_DESCRIPTOR_FAST: { STACK_SHRINK(oparg); STACK_SHRINK(1); PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 08d91b5efe51be..e5be62cf983f21 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -74,7 +74,6 @@ dummy_func( unsigned int oparg, _Py_CODEUNIT *next_instr, PyObject **stack_pointer, - PyObject *kwnames, int throwflag, PyObject *args[] ) @@ -2854,12 +2853,6 @@ dummy_func( self = owner; } - inst(KW_NAMES, (--)) { - ASSERT_KWNAMES_IS_NULL(); - assert(oparg < PyTuple_GET_SIZE(FRAME_CO_CONSTS)); - kwnames = GETITEM(FRAME_CO_CONSTS, oparg); - } - inst(INSTRUMENTED_CALL, ( -- )) { int is_meth = PEEK(oparg + 1) != NULL; int total_args = oparg + is_meth; @@ -2876,36 +2869,31 @@ dummy_func( } // Cache layout: counter/1, func_version/2 - // Neither CALL_INTRINSIC_1/2 nor CALL_FUNCTION_EX are members! + // CALL_INTRINSIC_1/2, CALL_KW, and CALL_FUNCTION_EX aren't members! family(CALL, INLINE_CACHE_ENTRIES_CALL) = { CALL_BOUND_METHOD_EXACT_ARGS, CALL_PY_EXACT_ARGS, CALL_PY_WITH_DEFAULTS, - CALL_NO_KW_TYPE_1, - CALL_NO_KW_STR_1, - CALL_NO_KW_TUPLE_1, + CALL_TYPE_1, + CALL_STR_1, + CALL_TUPLE_1, CALL_BUILTIN_CLASS, - CALL_NO_KW_BUILTIN_O, - CALL_NO_KW_BUILTIN_FAST, + CALL_BUILTIN_O, + CALL_BUILTIN_FAST, CALL_BUILTIN_FAST_WITH_KEYWORDS, - CALL_NO_KW_LEN, - CALL_NO_KW_ISINSTANCE, - CALL_NO_KW_LIST_APPEND, - CALL_NO_KW_METHOD_DESCRIPTOR_O, + CALL_LEN, + CALL_ISINSTANCE, + CALL_LIST_APPEND, + CALL_METHOD_DESCRIPTOR_O, CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, - CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS, - CALL_NO_KW_METHOD_DESCRIPTOR_FAST, - CALL_NO_KW_ALLOC_AND_ENTER_INIT, + CALL_METHOD_DESCRIPTOR_NOARGS, + CALL_METHOD_DESCRIPTOR_FAST, + CALL_ALLOC_AND_ENTER_INIT, }; - // On entry, the stack is either - // [NULL, callable, arg1, arg2, ...] - // or - // [method, self, arg1, arg2, ...] - // (Some args may be keywords, see KW_NAMES, which sets 'kwnames'.) - // On exit, the stack is [result]. // When calling Python, inline the call using DISPATCH_INLINED(). inst(CALL, (unused/1, unused/2, callable, self_or_null, args[oparg] -- res)) { + // oparg counts all of the args, but *not* self: int total_args = oparg; if (self_or_null != NULL) { args--; @@ -2915,7 +2903,7 @@ dummy_func( _PyCallCache *cache = (_PyCallCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { next_instr--; - _Py_Specialize_Call(callable, next_instr, total_args, kwnames); + _Py_Specialize_Call(callable, next_instr, total_args); DISPATCH_SAME_OPARG(); } STAT_INC(CALL, deferred); @@ -2931,7 +2919,6 @@ dummy_func( Py_DECREF(callable); callable = method; } - int positional_args = total_args - KWNAMES_LEN(); // Check if the call can be inlined or not if (Py_TYPE(callable) == &PyFunction_Type && tstate->interp->eval_frame == NULL && @@ -2941,9 +2928,8 @@ dummy_func( PyObject *locals = code_flags & CO_OPTIMIZED ? NULL : Py_NewRef(PyFunction_GET_GLOBALS(callable)); _PyInterpreterFrame *new_frame = _PyEvalFramePushAndInit( tstate, (PyFunctionObject *)callable, locals, - args, positional_args, kwnames + args, total_args, NULL ); - kwnames = NULL; // Manipulate stack directly since we leave using DISPATCH_INLINED(). STACK_SHRINK(oparg + 2); // The frame has stolen all the arguments from the stack, @@ -2958,8 +2944,8 @@ dummy_func( /* Callable is not a normal Python function */ res = PyObject_Vectorcall( callable, args, - positional_args | PY_VECTORCALL_ARGUMENTS_OFFSET, - kwnames); + total_args | PY_VECTORCALL_ARGUMENTS_OFFSET, + NULL); if (opcode == INSTRUMENTED_CALL) { PyObject *arg = total_args == 0 ? &_PyInstrumentation_MISSING : args[0]; @@ -2977,7 +2963,6 @@ dummy_func( } } } - kwnames = NULL; assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); Py_DECREF(callable); for (int i = 0; i < total_args; i++) { @@ -3006,7 +2991,6 @@ dummy_func( } op(_CHECK_FUNCTION_EXACT_ARGS, (func_version/2, callable, self_or_null, unused[oparg] -- callable, self_or_null, unused[oparg])) { - ASSERT_KWNAMES_IS_NULL(); DEOPT_IF(!PyFunction_Check(callable), CALL); PyFunctionObject *func = (PyFunctionObject *)callable; DEOPT_IF(func->func_version != func_version, CALL); @@ -3081,7 +3065,6 @@ dummy_func( _PUSH_FRAME; inst(CALL_PY_WITH_DEFAULTS, (unused/1, func_version/2, callable, self_or_null, args[oparg] -- unused)) { - ASSERT_KWNAMES_IS_NULL(); DEOPT_IF(tstate->interp->eval_frame, CALL); int argcount = oparg; if (self_or_null != NULL) { @@ -3116,8 +3099,7 @@ dummy_func( DISPATCH_INLINED(new_frame); } - inst(CALL_NO_KW_TYPE_1, (unused/1, unused/2, callable, null, args[oparg] -- res)) { - ASSERT_KWNAMES_IS_NULL(); + inst(CALL_TYPE_1, (unused/1, unused/2, callable, null, args[oparg] -- res)) { assert(oparg == 1); DEOPT_IF(null != NULL, CALL); PyObject *obj = args[0]; @@ -3128,8 +3110,7 @@ dummy_func( Py_DECREF(&PyType_Type); // I.e., callable } - inst(CALL_NO_KW_STR_1, (unused/1, unused/2, callable, null, args[oparg] -- res)) { - ASSERT_KWNAMES_IS_NULL(); + inst(CALL_STR_1, (unused/1, unused/2, callable, null, args[oparg] -- res)) { assert(oparg == 1); DEOPT_IF(null != NULL, CALL); DEOPT_IF(callable != (PyObject *)&PyUnicode_Type, CALL); @@ -3142,8 +3123,7 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_NO_KW_TUPLE_1, (unused/1, unused/2, callable, null, args[oparg] -- res)) { - ASSERT_KWNAMES_IS_NULL(); + inst(CALL_TUPLE_1, (unused/1, unused/2, callable, null, args[oparg] -- res)) { assert(oparg == 1); DEOPT_IF(null != NULL, CALL); DEOPT_IF(callable != (PyObject *)&PyTuple_Type, CALL); @@ -3156,13 +3136,12 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_NO_KW_ALLOC_AND_ENTER_INIT, (unused/1, unused/2, callable, null, args[oparg] -- unused)) { + inst(CALL_ALLOC_AND_ENTER_INIT, (unused/1, unused/2, callable, null, args[oparg] -- unused)) { /* This instruction does the following: * 1. Creates the object (by calling ``object.__new__``) * 2. Pushes a shim frame to the frame stack (to cleanup after ``__init__``) * 3. Pushes the frame for ``__init__`` to the frame stack * */ - ASSERT_KWNAMES_IS_NULL(); _PyCallCache *cache = (_PyCallCache *)next_instr; DEOPT_IF(null != NULL, CALL); DEOPT_IF(!PyType_Check(callable), CALL); @@ -3225,14 +3204,11 @@ dummy_func( args--; total_args++; } - int kwnames_len = KWNAMES_LEN(); DEOPT_IF(!PyType_Check(callable), CALL); PyTypeObject *tp = (PyTypeObject *)callable; DEOPT_IF(tp->tp_vectorcall == NULL, CALL); STAT_INC(CALL, hit); - res = tp->tp_vectorcall((PyObject *)tp, args, - total_args - kwnames_len, kwnames); - kwnames = NULL; + res = tp->tp_vectorcall((PyObject *)tp, args, total_args, NULL); /* Free the arguments. */ for (int i = 0; i < total_args; i++) { Py_DECREF(args[i]); @@ -3242,9 +3218,8 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_NO_KW_BUILTIN_O, (unused/1, unused/2, callable, self_or_null, args[oparg] -- res)) { + inst(CALL_BUILTIN_O, (unused/1, unused/2, callable, self_or_null, args[oparg] -- res)) { /* Builtin METH_O functions */ - ASSERT_KWNAMES_IS_NULL(); int total_args = oparg; if (self_or_null != NULL) { args--; @@ -3271,9 +3246,8 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_NO_KW_BUILTIN_FAST, (unused/1, unused/2, callable, self_or_null, args[oparg] -- res)) { + inst(CALL_BUILTIN_FAST, (unused/1, unused/2, callable, self_or_null, args[oparg] -- res)) { /* Builtin METH_FASTCALL functions, without keywords */ - ASSERT_KWNAMES_IS_NULL(); int total_args = oparg; if (self_or_null != NULL) { args--; @@ -3319,14 +3293,8 @@ dummy_func( _PyCFunctionFastWithKeywords cfunc = (_PyCFunctionFastWithKeywords)(void(*)(void)) PyCFunction_GET_FUNCTION(callable); - res = cfunc( - PyCFunction_GET_SELF(callable), - args, - total_args - KWNAMES_LEN(), - kwnames - ); + res = cfunc(PyCFunction_GET_SELF(callable), args, total_args, NULL); assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); - kwnames = NULL; /* Free the arguments. */ for (int i = 0; i < total_args; i++) { @@ -3337,8 +3305,7 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_NO_KW_LEN, (unused/1, unused/2, callable, self_or_null, args[oparg] -- res)) { - ASSERT_KWNAMES_IS_NULL(); + inst(CALL_LEN, (unused/1, unused/2, callable, self_or_null, args[oparg] -- res)) { /* len(o) */ int total_args = oparg; if (self_or_null != NULL) { @@ -3362,8 +3329,7 @@ dummy_func( ERROR_IF(res == NULL, error); } - inst(CALL_NO_KW_ISINSTANCE, (unused/1, unused/2, callable, self_or_null, args[oparg] -- res)) { - ASSERT_KWNAMES_IS_NULL(); + inst(CALL_ISINSTANCE, (unused/1, unused/2, callable, self_or_null, args[oparg] -- res)) { /* isinstance(o, o2) */ int total_args = oparg; if (self_or_null != NULL) { @@ -3390,8 +3356,7 @@ dummy_func( } // This is secretly a super-instruction - inst(CALL_NO_KW_LIST_APPEND, (unused/1, unused/2, callable, self, args[oparg] -- unused)) { - ASSERT_KWNAMES_IS_NULL(); + inst(CALL_LIST_APPEND, (unused/1, unused/2, callable, self, args[oparg] -- unused)) { assert(oparg == 1); PyInterpreterState *interp = tstate->interp; DEOPT_IF(callable != interp->callable_cache.list_append, CALL); @@ -3410,8 +3375,7 @@ dummy_func( DISPATCH(); } - inst(CALL_NO_KW_METHOD_DESCRIPTOR_O, (unused/1, unused/2, callable, self_or_null, args[oparg] -- res)) { - ASSERT_KWNAMES_IS_NULL(); + inst(CALL_METHOD_DESCRIPTOR_O, (unused/1, unused/2, callable, self_or_null, args[oparg] -- res)) { int total_args = oparg; if (self_or_null != NULL) { args--; @@ -3459,9 +3423,8 @@ dummy_func( int nargs = total_args - 1; _PyCFunctionFastWithKeywords cfunc = (_PyCFunctionFastWithKeywords)(void(*)(void))meth->ml_meth; - res = cfunc(self, args + 1, nargs - KWNAMES_LEN(), kwnames); + res = cfunc(self, args + 1, nargs, NULL); assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); - kwnames = NULL; /* Free the arguments. */ for (int i = 0; i < total_args; i++) { @@ -3472,8 +3435,7 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS, (unused/1, unused/2, callable, self_or_null, args[oparg] -- res)) { - ASSERT_KWNAMES_IS_NULL(); + inst(CALL_METHOD_DESCRIPTOR_NOARGS, (unused/1, unused/2, callable, self_or_null, args[oparg] -- res)) { assert(oparg == 0 || oparg == 1); int total_args = oparg; if (self_or_null != NULL) { @@ -3503,8 +3465,7 @@ dummy_func( CHECK_EVAL_BREAKER(); } - inst(CALL_NO_KW_METHOD_DESCRIPTOR_FAST, (unused/1, unused/2, callable, self_or_null, args[oparg] -- res)) { - ASSERT_KWNAMES_IS_NULL(); + inst(CALL_METHOD_DESCRIPTOR_FAST, (unused/1, unused/2, callable, self_or_null, args[oparg] -- res)) { int total_args = oparg; if (self_or_null != NULL) { args--; @@ -3532,6 +3493,91 @@ dummy_func( CHECK_EVAL_BREAKER(); } + inst(INSTRUMENTED_CALL_KW, ( -- )) { + int is_meth = PEEK(oparg + 2) != NULL; + int total_args = oparg + is_meth; + PyObject *function = PEEK(oparg + 3); + PyObject *arg = total_args == 0 ? &_PyInstrumentation_MISSING + : PEEK(total_args + 1); + int err = _Py_call_instrumentation_2args( + tstate, PY_MONITORING_EVENT_CALL, + frame, next_instr - 1, function, arg); + ERROR_IF(err, error); + GO_TO_INSTRUCTION(CALL_KW); + } + + inst(CALL_KW, (callable, self_or_null, args[oparg], kwnames -- res)) { + // oparg counts all of the args, but *not* self: + int total_args = oparg; + if (self_or_null != NULL) { + args--; + total_args++; + } + if (self_or_null == NULL && Py_TYPE(callable) == &PyMethod_Type) { + args--; + total_args++; + PyObject *self = ((PyMethodObject *)callable)->im_self; + args[0] = Py_NewRef(self); + PyObject *method = ((PyMethodObject *)callable)->im_func; + args[-1] = Py_NewRef(method); + Py_DECREF(callable); + callable = method; + } + int positional_args = total_args - (int)PyTuple_GET_SIZE(kwnames); + // Check if the call can be inlined or not + if (Py_TYPE(callable) == &PyFunction_Type && + tstate->interp->eval_frame == NULL && + ((PyFunctionObject *)callable)->vectorcall == _PyFunction_Vectorcall) + { + int code_flags = ((PyCodeObject*)PyFunction_GET_CODE(callable))->co_flags; + PyObject *locals = code_flags & CO_OPTIMIZED ? NULL : Py_NewRef(PyFunction_GET_GLOBALS(callable)); + _PyInterpreterFrame *new_frame = _PyEvalFramePushAndInit( + tstate, (PyFunctionObject *)callable, locals, + args, positional_args, kwnames + ); + Py_DECREF(kwnames); + // Manipulate stack directly since we leave using DISPATCH_INLINED(). + STACK_SHRINK(oparg + 3); + // The frame has stolen all the arguments from the stack, + // so there is no need to clean them up. + if (new_frame == NULL) { + goto error; + } + frame->return_offset = 0; + DISPATCH_INLINED(new_frame); + } + /* Callable is not a normal Python function */ + res = PyObject_Vectorcall( + callable, args, + positional_args | PY_VECTORCALL_ARGUMENTS_OFFSET, + kwnames); + if (opcode == INSTRUMENTED_CALL_KW) { + PyObject *arg = total_args == 0 ? + &_PyInstrumentation_MISSING : args[0]; + if (res == NULL) { + _Py_call_instrumentation_exc2( + tstate, PY_MONITORING_EVENT_C_RAISE, + frame, next_instr-1, callable, arg); + } + else { + int err = _Py_call_instrumentation_2args( + tstate, PY_MONITORING_EVENT_C_RETURN, + frame, next_instr-1, callable, arg); + if (err < 0) { + Py_CLEAR(res); + } + } + } + Py_DECREF(kwnames); + assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); + Py_DECREF(callable); + for (int i = 0; i < total_args; i++) { + Py_DECREF(args[i]); + } + ERROR_IF(res == NULL, error); + CHECK_EVAL_BREAKER(); + } + inst(INSTRUMENTED_CALL_FUNCTION_EX, ( -- )) { GO_TO_INSTRUCTION(CALL_FUNCTION_EX); } diff --git a/Python/ceval.c b/Python/ceval.c index b02bf60315b7e1..cae29e061ce5d3 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -678,7 +678,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int #endif _PyInterpreterFrame entry_frame; - PyObject *kwnames = NULL; // Borrowed reference. Reset by CALL instructions. @@ -840,7 +839,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int pop_1_error: STACK_SHRINK(1); error: - kwnames = NULL; /* Double-check exception status. */ #ifdef NDEBUG if (!_PyErr_Occurred(tstate)) { diff --git a/Python/ceval_macros.h b/Python/ceval_macros.h index f5d915554d56e7..012750df387c1c 100644 --- a/Python/ceval_macros.h +++ b/Python/ceval_macros.h @@ -311,9 +311,6 @@ GETITEM(PyObject *v, Py_ssize_t i) { " in enclosing scope" #define NAME_ERROR_MSG "name '%.200s' is not defined" -#define KWNAMES_LEN() \ - (kwnames == NULL ? 0 : ((int)PyTuple_GET_SIZE(kwnames))) - #define DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dval, result) \ do { \ if (Py_REFCNT(left) == 1) { \ @@ -356,8 +353,6 @@ static const convertion_func_ptr CONVERSION_FUNCTIONS[4] = { [FVC_ASCII] = PyObject_ASCII }; -#define ASSERT_KWNAMES_IS_NULL() assert(kwnames == NULL) - // GH-89279: Force inlining by using a macro. #if defined(_MSC_VER) && SIZEOF_INT == 4 #define _Py_atomic_load_relaxed_int32(ATOMIC_VAL) (assert(sizeof((ATOMIC_VAL)->_value) == 4), *((volatile int*)&((ATOMIC_VAL)->_value))) diff --git a/Python/compile.c b/Python/compile.c index 1f08e46023e15a..b05c1ad96be803 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -4982,9 +4982,13 @@ maybe_optimize_method_call(struct compiler *c, expr_ty e) VISIT_SEQ(c, keyword, kwds); RETURN_IF_ERROR( compiler_call_simple_kw_helper(c, loc, kwds, kwdsl)); + loc = update_start_location_to_match_attr(c, LOC(e), meth); + ADDOP_I(c, loc, CALL_KW, argsl + kwdsl); + } + else { + loc = update_start_location_to_match_attr(c, LOC(e), meth); + ADDOP_I(c, loc, CALL, argsl); } - loc = update_start_location_to_match_attr(c, LOC(e), meth); - ADDOP_I(c, loc, CALL, argsl + kwdsl); return 1; } @@ -5150,7 +5154,7 @@ compiler_subkwargs(struct compiler *c, location loc, } /* Used by compiler_call_helper and maybe_optimize_method_call to emit - * KW_NAMES before CALL. + * a tuple of keyword names before CALL. */ static int compiler_call_simple_kw_helper(struct compiler *c, location loc, @@ -5165,12 +5169,7 @@ compiler_call_simple_kw_helper(struct compiler *c, location loc, keyword_ty kw = asdl_seq_GET(keywords, i); PyTuple_SET_ITEM(names, i, Py_NewRef(kw->arg)); } - Py_ssize_t arg = compiler_add_const(c->c_const_cache, c->u, names); - if (arg < 0) { - return ERROR; - } - Py_DECREF(names); - ADDOP_I(c, loc, KW_NAMES, arg); + ADDOP_LOAD_CONST_NEW(c, loc, names); return SUCCESS; } @@ -5215,8 +5214,11 @@ compiler_call_helper(struct compiler *c, location loc, VISIT_SEQ(c, keyword, keywords); RETURN_IF_ERROR( compiler_call_simple_kw_helper(c, loc, keywords, nkwelts)); + ADDOP_I(c, loc, CALL_KW, n + nelts + nkwelts); + } + else { + ADDOP_I(c, loc, CALL, n + nelts); } - ADDOP_I(c, loc, CALL, n + nelts + nkwelts); return SUCCESS; ex_call: diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 8f3febe7d1ab95..befb972f1e90f5 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -2256,7 +2256,6 @@ self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; uint32_t func_version = (uint32_t)operand; - ASSERT_KWNAMES_IS_NULL(); DEOPT_IF(!PyFunction_Check(callable), CALL); PyFunctionObject *func = (PyFunctionObject *)callable; DEOPT_IF(func->func_version != func_version, CALL); @@ -2324,7 +2323,7 @@ break; } - case CALL_NO_KW_TYPE_1: { + case CALL_TYPE_1: { PyObject **args; PyObject *null; PyObject *callable; @@ -2332,7 +2331,6 @@ args = stack_pointer - oparg; null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); PyObject *obj = args[0]; @@ -2347,7 +2345,7 @@ break; } - case CALL_NO_KW_STR_1: { + case CALL_STR_1: { PyObject **args; PyObject *null; PyObject *callable; @@ -2355,7 +2353,6 @@ args = stack_pointer - oparg; null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); DEOPT_IF(callable != (PyObject *)&PyUnicode_Type, CALL); @@ -2372,7 +2369,7 @@ break; } - case CALL_NO_KW_TUPLE_1: { + case CALL_TUPLE_1: { PyObject **args; PyObject *null; PyObject *callable; @@ -2380,7 +2377,6 @@ args = stack_pointer - oparg; null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); DEOPT_IF(callable != (PyObject *)&PyTuple_Type, CALL); @@ -2411,7 +2407,38 @@ break; } - case CALL_NO_KW_BUILTIN_O: { + case CALL_BUILTIN_CLASS: { + PyObject **args; + PyObject *self_or_null; + PyObject *callable; + PyObject *res; + args = stack_pointer - oparg; + self_or_null = stack_pointer[-1 - oparg]; + callable = stack_pointer[-2 - oparg]; + int total_args = oparg; + if (self_or_null != NULL) { + args--; + total_args++; + } + DEOPT_IF(!PyType_Check(callable), CALL); + PyTypeObject *tp = (PyTypeObject *)callable; + DEOPT_IF(tp->tp_vectorcall == NULL, CALL); + STAT_INC(CALL, hit); + res = tp->tp_vectorcall((PyObject *)tp, args, total_args, NULL); + /* Free the arguments. */ + for (int i = 0; i < total_args; i++) { + Py_DECREF(args[i]); + } + Py_DECREF(tp); + if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } + STACK_SHRINK(oparg); + STACK_SHRINK(1); + stack_pointer[-1] = res; + CHECK_EVAL_BREAKER(); + break; + } + + case CALL_BUILTIN_O: { PyObject **args; PyObject *self_or_null; PyObject *callable; @@ -2420,7 +2447,6 @@ self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; /* Builtin METH_O functions */ - ASSERT_KWNAMES_IS_NULL(); int total_args = oparg; if (self_or_null != NULL) { args--; @@ -2451,7 +2477,7 @@ break; } - case CALL_NO_KW_BUILTIN_FAST: { + case CALL_BUILTIN_FAST: { PyObject **args; PyObject *self_or_null; PyObject *callable; @@ -2460,7 +2486,6 @@ self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; /* Builtin METH_FASTCALL functions, without keywords */ - ASSERT_KWNAMES_IS_NULL(); int total_args = oparg; if (self_or_null != NULL) { args--; @@ -2495,7 +2520,45 @@ break; } - case CALL_NO_KW_LEN: { + case CALL_BUILTIN_FAST_WITH_KEYWORDS: { + PyObject **args; + PyObject *self_or_null; + PyObject *callable; + PyObject *res; + args = stack_pointer - oparg; + self_or_null = stack_pointer[-1 - oparg]; + callable = stack_pointer[-2 - oparg]; + /* Builtin METH_FASTCALL | METH_KEYWORDS functions */ + int total_args = oparg; + if (self_or_null != NULL) { + args--; + total_args++; + } + DEOPT_IF(!PyCFunction_CheckExact(callable), CALL); + DEOPT_IF(PyCFunction_GET_FLAGS(callable) != + (METH_FASTCALL | METH_KEYWORDS), CALL); + STAT_INC(CALL, hit); + /* res = func(self, args, nargs, kwnames) */ + _PyCFunctionFastWithKeywords cfunc = + (_PyCFunctionFastWithKeywords)(void(*)(void)) + PyCFunction_GET_FUNCTION(callable); + res = cfunc(PyCFunction_GET_SELF(callable), args, total_args, NULL); + assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); + + /* Free the arguments. */ + for (int i = 0; i < total_args; i++) { + Py_DECREF(args[i]); + } + Py_DECREF(callable); + if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } + STACK_SHRINK(oparg); + STACK_SHRINK(1); + stack_pointer[-1] = res; + CHECK_EVAL_BREAKER(); + break; + } + + case CALL_LEN: { PyObject **args; PyObject *self_or_null; PyObject *callable; @@ -2503,7 +2566,6 @@ args = stack_pointer - oparg; self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); /* len(o) */ int total_args = oparg; if (self_or_null != NULL) { @@ -2531,7 +2593,7 @@ break; } - case CALL_NO_KW_ISINSTANCE: { + case CALL_ISINSTANCE: { PyObject **args; PyObject *self_or_null; PyObject *callable; @@ -2539,7 +2601,6 @@ args = stack_pointer - oparg; self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); /* isinstance(o, o2) */ int total_args = oparg; if (self_or_null != NULL) { @@ -2569,7 +2630,7 @@ break; } - case CALL_NO_KW_METHOD_DESCRIPTOR_O: { + case CALL_METHOD_DESCRIPTOR_O: { PyObject **args; PyObject *self_or_null; PyObject *callable; @@ -2577,7 +2638,6 @@ args = stack_pointer - oparg; self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); int total_args = oparg; if (self_or_null != NULL) { args--; @@ -2612,7 +2672,47 @@ break; } - case CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS: { + case CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS: { + PyObject **args; + PyObject *self_or_null; + PyObject *callable; + PyObject *res; + args = stack_pointer - oparg; + self_or_null = stack_pointer[-1 - oparg]; + callable = stack_pointer[-2 - oparg]; + int total_args = oparg; + if (self_or_null != NULL) { + args--; + total_args++; + } + PyMethodDescrObject *method = (PyMethodDescrObject *)callable; + DEOPT_IF(!Py_IS_TYPE(method, &PyMethodDescr_Type), CALL); + PyMethodDef *meth = method->d_method; + DEOPT_IF(meth->ml_flags != (METH_FASTCALL|METH_KEYWORDS), CALL); + PyTypeObject *d_type = method->d_common.d_type; + PyObject *self = args[0]; + DEOPT_IF(!Py_IS_TYPE(self, d_type), CALL); + STAT_INC(CALL, hit); + int nargs = total_args - 1; + _PyCFunctionFastWithKeywords cfunc = + (_PyCFunctionFastWithKeywords)(void(*)(void))meth->ml_meth; + res = cfunc(self, args + 1, nargs, NULL); + assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); + + /* Free the arguments. */ + for (int i = 0; i < total_args; i++) { + Py_DECREF(args[i]); + } + Py_DECREF(callable); + if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } + STACK_SHRINK(oparg); + STACK_SHRINK(1); + stack_pointer[-1] = res; + CHECK_EVAL_BREAKER(); + break; + } + + case CALL_METHOD_DESCRIPTOR_NOARGS: { PyObject **args; PyObject *self_or_null; PyObject *callable; @@ -2620,7 +2720,6 @@ args = stack_pointer - oparg; self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); assert(oparg == 0 || oparg == 1); int total_args = oparg; if (self_or_null != NULL) { @@ -2654,7 +2753,7 @@ break; } - case CALL_NO_KW_METHOD_DESCRIPTOR_FAST: { + case CALL_METHOD_DESCRIPTOR_FAST: { PyObject **args; PyObject *self_or_null; PyObject *callable; @@ -2662,7 +2761,6 @@ args = stack_pointer - oparg; self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); int total_args = oparg; if (self_or_null != NULL) { args--; diff --git a/Python/flowgraph.c b/Python/flowgraph.c index 55b871dd627364..44858b9c527388 100644 --- a/Python/flowgraph.c +++ b/Python/flowgraph.c @@ -1624,8 +1624,6 @@ optimize_basic_block(PyObject *const_cache, basicblock *bb, PyObject *consts) INSTR_SET_OP0(inst, NOP); } break; - case KW_NAMES: - break; case LOAD_GLOBAL: if (nextop == PUSH_NULL && (oparg & 1) == 0) { INSTR_SET_OP1(inst, LOAD_GLOBAL, oparg | 1); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 9742c95c407554..fff47a1b636f90 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -3688,13 +3688,6 @@ DISPATCH(); } - TARGET(KW_NAMES) { - ASSERT_KWNAMES_IS_NULL(); - assert(oparg < PyTuple_GET_SIZE(FRAME_CO_CONSTS)); - kwnames = GETITEM(FRAME_CO_CONSTS, oparg); - DISPATCH(); - } - TARGET(INSTRUMENTED_CALL) { int is_meth = PEEK(oparg + 1) != NULL; int total_args = oparg + is_meth; @@ -3720,6 +3713,7 @@ args = stack_pointer - oparg; self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; + // oparg counts all of the args, but *not* self: int total_args = oparg; if (self_or_null != NULL) { args--; @@ -3729,7 +3723,7 @@ _PyCallCache *cache = (_PyCallCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { next_instr--; - _Py_Specialize_Call(callable, next_instr, total_args, kwnames); + _Py_Specialize_Call(callable, next_instr, total_args); DISPATCH_SAME_OPARG(); } STAT_INC(CALL, deferred); @@ -3745,7 +3739,6 @@ Py_DECREF(callable); callable = method; } - int positional_args = total_args - KWNAMES_LEN(); // Check if the call can be inlined or not if (Py_TYPE(callable) == &PyFunction_Type && tstate->interp->eval_frame == NULL && @@ -3755,9 +3748,8 @@ PyObject *locals = code_flags & CO_OPTIMIZED ? NULL : Py_NewRef(PyFunction_GET_GLOBALS(callable)); _PyInterpreterFrame *new_frame = _PyEvalFramePushAndInit( tstate, (PyFunctionObject *)callable, locals, - args, positional_args, kwnames + args, total_args, NULL ); - kwnames = NULL; // Manipulate stack directly since we leave using DISPATCH_INLINED(). STACK_SHRINK(oparg + 2); // The frame has stolen all the arguments from the stack, @@ -3772,8 +3764,8 @@ /* Callable is not a normal Python function */ res = PyObject_Vectorcall( callable, args, - positional_args | PY_VECTORCALL_ARGUMENTS_OFFSET, - kwnames); + total_args | PY_VECTORCALL_ARGUMENTS_OFFSET, + NULL); if (opcode == INSTRUMENTED_CALL) { PyObject *arg = total_args == 0 ? &_PyInstrumentation_MISSING : args[0]; @@ -3791,7 +3783,6 @@ } } } - kwnames = NULL; assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); Py_DECREF(callable); for (int i = 0; i < total_args; i++) { @@ -3839,7 +3830,6 @@ callable = func; { uint32_t func_version = read_u32(&next_instr[1].cache); - ASSERT_KWNAMES_IS_NULL(); DEOPT_IF(!PyFunction_Check(callable), CALL); PyFunctionObject *func = (PyFunctionObject *)callable; DEOPT_IF(func->func_version != func_version, CALL); @@ -3918,7 +3908,6 @@ callable = stack_pointer[-2 - oparg]; { uint32_t func_version = read_u32(&next_instr[1].cache); - ASSERT_KWNAMES_IS_NULL(); DEOPT_IF(!PyFunction_Check(callable), CALL); PyFunctionObject *func = (PyFunctionObject *)callable; DEOPT_IF(func->func_version != func_version, CALL); @@ -3991,7 +3980,6 @@ self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; uint32_t func_version = read_u32(&next_instr[1].cache); - ASSERT_KWNAMES_IS_NULL(); DEOPT_IF(tstate->interp->eval_frame, CALL); int argcount = oparg; if (self_or_null != NULL) { @@ -4026,7 +4014,7 @@ DISPATCH_INLINED(new_frame); } - TARGET(CALL_NO_KW_TYPE_1) { + TARGET(CALL_TYPE_1) { PyObject **args; PyObject *null; PyObject *callable; @@ -4034,7 +4022,6 @@ args = stack_pointer - oparg; null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); PyObject *obj = args[0]; @@ -4050,7 +4037,7 @@ DISPATCH(); } - TARGET(CALL_NO_KW_STR_1) { + TARGET(CALL_STR_1) { PyObject **args; PyObject *null; PyObject *callable; @@ -4058,7 +4045,6 @@ args = stack_pointer - oparg; null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); DEOPT_IF(callable != (PyObject *)&PyUnicode_Type, CALL); @@ -4076,7 +4062,7 @@ DISPATCH(); } - TARGET(CALL_NO_KW_TUPLE_1) { + TARGET(CALL_TUPLE_1) { PyObject **args; PyObject *null; PyObject *callable; @@ -4084,7 +4070,6 @@ args = stack_pointer - oparg; null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); DEOPT_IF(callable != (PyObject *)&PyTuple_Type, CALL); @@ -4102,7 +4087,7 @@ DISPATCH(); } - TARGET(CALL_NO_KW_ALLOC_AND_ENTER_INIT) { + TARGET(CALL_ALLOC_AND_ENTER_INIT) { PyObject **args; PyObject *null; PyObject *callable; @@ -4114,7 +4099,6 @@ * 2. Pushes a shim frame to the frame stack (to cleanup after ``__init__``) * 3. Pushes the frame for ``__init__`` to the frame stack * */ - ASSERT_KWNAMES_IS_NULL(); _PyCallCache *cache = (_PyCallCache *)next_instr; DEOPT_IF(null != NULL, CALL); DEOPT_IF(!PyType_Check(callable), CALL); @@ -4188,14 +4172,11 @@ args--; total_args++; } - int kwnames_len = KWNAMES_LEN(); DEOPT_IF(!PyType_Check(callable), CALL); PyTypeObject *tp = (PyTypeObject *)callable; DEOPT_IF(tp->tp_vectorcall == NULL, CALL); STAT_INC(CALL, hit); - res = tp->tp_vectorcall((PyObject *)tp, args, - total_args - kwnames_len, kwnames); - kwnames = NULL; + res = tp->tp_vectorcall((PyObject *)tp, args, total_args, NULL); /* Free the arguments. */ for (int i = 0; i < total_args; i++) { Py_DECREF(args[i]); @@ -4210,7 +4191,7 @@ DISPATCH(); } - TARGET(CALL_NO_KW_BUILTIN_O) { + TARGET(CALL_BUILTIN_O) { PyObject **args; PyObject *self_or_null; PyObject *callable; @@ -4219,7 +4200,6 @@ self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; /* Builtin METH_O functions */ - ASSERT_KWNAMES_IS_NULL(); int total_args = oparg; if (self_or_null != NULL) { args--; @@ -4251,7 +4231,7 @@ DISPATCH(); } - TARGET(CALL_NO_KW_BUILTIN_FAST) { + TARGET(CALL_BUILTIN_FAST) { PyObject **args; PyObject *self_or_null; PyObject *callable; @@ -4260,7 +4240,6 @@ self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; /* Builtin METH_FASTCALL functions, without keywords */ - ASSERT_KWNAMES_IS_NULL(); int total_args = oparg; if (self_or_null != NULL) { args--; @@ -4318,14 +4297,8 @@ _PyCFunctionFastWithKeywords cfunc = (_PyCFunctionFastWithKeywords)(void(*)(void)) PyCFunction_GET_FUNCTION(callable); - res = cfunc( - PyCFunction_GET_SELF(callable), - args, - total_args - KWNAMES_LEN(), - kwnames - ); + res = cfunc(PyCFunction_GET_SELF(callable), args, total_args, NULL); assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); - kwnames = NULL; /* Free the arguments. */ for (int i = 0; i < total_args; i++) { @@ -4341,7 +4314,7 @@ DISPATCH(); } - TARGET(CALL_NO_KW_LEN) { + TARGET(CALL_LEN) { PyObject **args; PyObject *self_or_null; PyObject *callable; @@ -4349,7 +4322,6 @@ args = stack_pointer - oparg; self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); /* len(o) */ int total_args = oparg; if (self_or_null != NULL) { @@ -4378,7 +4350,7 @@ DISPATCH(); } - TARGET(CALL_NO_KW_ISINSTANCE) { + TARGET(CALL_ISINSTANCE) { PyObject **args; PyObject *self_or_null; PyObject *callable; @@ -4386,7 +4358,6 @@ args = stack_pointer - oparg; self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); /* isinstance(o, o2) */ int total_args = oparg; if (self_or_null != NULL) { @@ -4417,14 +4388,13 @@ DISPATCH(); } - TARGET(CALL_NO_KW_LIST_APPEND) { + TARGET(CALL_LIST_APPEND) { PyObject **args; PyObject *self; PyObject *callable; args = stack_pointer - oparg; self = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); assert(oparg == 1); PyInterpreterState *interp = tstate->interp; DEOPT_IF(callable != interp->callable_cache.list_append, CALL); @@ -4443,7 +4413,7 @@ DISPATCH(); } - TARGET(CALL_NO_KW_METHOD_DESCRIPTOR_O) { + TARGET(CALL_METHOD_DESCRIPTOR_O) { PyObject **args; PyObject *self_or_null; PyObject *callable; @@ -4451,7 +4421,6 @@ args = stack_pointer - oparg; self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); int total_args = oparg; if (self_or_null != NULL) { args--; @@ -4511,9 +4480,8 @@ int nargs = total_args - 1; _PyCFunctionFastWithKeywords cfunc = (_PyCFunctionFastWithKeywords)(void(*)(void))meth->ml_meth; - res = cfunc(self, args + 1, nargs - KWNAMES_LEN(), kwnames); + res = cfunc(self, args + 1, nargs, NULL); assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); - kwnames = NULL; /* Free the arguments. */ for (int i = 0; i < total_args; i++) { @@ -4529,7 +4497,7 @@ DISPATCH(); } - TARGET(CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS) { + TARGET(CALL_METHOD_DESCRIPTOR_NOARGS) { PyObject **args; PyObject *self_or_null; PyObject *callable; @@ -4537,7 +4505,6 @@ args = stack_pointer - oparg; self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); assert(oparg == 0 || oparg == 1); int total_args = oparg; if (self_or_null != NULL) { @@ -4572,7 +4539,7 @@ DISPATCH(); } - TARGET(CALL_NO_KW_METHOD_DESCRIPTOR_FAST) { + TARGET(CALL_METHOD_DESCRIPTOR_FAST) { PyObject **args; PyObject *self_or_null; PyObject *callable; @@ -4580,7 +4547,6 @@ args = stack_pointer - oparg; self_or_null = stack_pointer[-1 - oparg]; callable = stack_pointer[-2 - oparg]; - ASSERT_KWNAMES_IS_NULL(); int total_args = oparg; if (self_or_null != NULL) { args--; @@ -4613,6 +4579,105 @@ DISPATCH(); } + TARGET(INSTRUMENTED_CALL_KW) { + int is_meth = PEEK(oparg + 2) != NULL; + int total_args = oparg + is_meth; + PyObject *function = PEEK(oparg + 3); + PyObject *arg = total_args == 0 ? &_PyInstrumentation_MISSING + : PEEK(total_args + 1); + int err = _Py_call_instrumentation_2args( + tstate, PY_MONITORING_EVENT_CALL, + frame, next_instr - 1, function, arg); + if (err) goto error; + GO_TO_INSTRUCTION(CALL_KW); + } + + TARGET(CALL_KW) { + PREDICTED(CALL_KW); + PyObject *kwnames; + PyObject **args; + PyObject *self_or_null; + PyObject *callable; + PyObject *res; + kwnames = stack_pointer[-1]; + args = stack_pointer - 1 - oparg; + self_or_null = stack_pointer[-2 - oparg]; + callable = stack_pointer[-3 - oparg]; + // oparg counts all of the args, but *not* self: + int total_args = oparg; + if (self_or_null != NULL) { + args--; + total_args++; + } + if (self_or_null == NULL && Py_TYPE(callable) == &PyMethod_Type) { + args--; + total_args++; + PyObject *self = ((PyMethodObject *)callable)->im_self; + args[0] = Py_NewRef(self); + PyObject *method = ((PyMethodObject *)callable)->im_func; + args[-1] = Py_NewRef(method); + Py_DECREF(callable); + callable = method; + } + int positional_args = total_args - (int)PyTuple_GET_SIZE(kwnames); + // Check if the call can be inlined or not + if (Py_TYPE(callable) == &PyFunction_Type && + tstate->interp->eval_frame == NULL && + ((PyFunctionObject *)callable)->vectorcall == _PyFunction_Vectorcall) + { + int code_flags = ((PyCodeObject*)PyFunction_GET_CODE(callable))->co_flags; + PyObject *locals = code_flags & CO_OPTIMIZED ? NULL : Py_NewRef(PyFunction_GET_GLOBALS(callable)); + _PyInterpreterFrame *new_frame = _PyEvalFramePushAndInit( + tstate, (PyFunctionObject *)callable, locals, + args, positional_args, kwnames + ); + Py_DECREF(kwnames); + // Manipulate stack directly since we leave using DISPATCH_INLINED(). + STACK_SHRINK(oparg + 3); + // The frame has stolen all the arguments from the stack, + // so there is no need to clean them up. + if (new_frame == NULL) { + goto error; + } + frame->return_offset = 0; + DISPATCH_INLINED(new_frame); + } + /* Callable is not a normal Python function */ + res = PyObject_Vectorcall( + callable, args, + positional_args | PY_VECTORCALL_ARGUMENTS_OFFSET, + kwnames); + if (opcode == INSTRUMENTED_CALL_KW) { + PyObject *arg = total_args == 0 ? + &_PyInstrumentation_MISSING : args[0]; + if (res == NULL) { + _Py_call_instrumentation_exc2( + tstate, PY_MONITORING_EVENT_C_RAISE, + frame, next_instr-1, callable, arg); + } + else { + int err = _Py_call_instrumentation_2args( + tstate, PY_MONITORING_EVENT_C_RETURN, + frame, next_instr-1, callable, arg); + if (err < 0) { + Py_CLEAR(res); + } + } + } + Py_DECREF(kwnames); + assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); + Py_DECREF(callable); + for (int i = 0; i < total_args; i++) { + Py_DECREF(args[i]); + } + if (res == NULL) { STACK_SHRINK(oparg); goto pop_3_error; } + STACK_SHRINK(oparg); + STACK_SHRINK(2); + stack_pointer[-1] = res; + CHECK_EVAL_BREAKER(); + DISPATCH(); + } + TARGET(INSTRUMENTED_CALL_FUNCTION_EX) { GO_TO_INSTRUCTION(CALL_FUNCTION_EX); } diff --git a/Python/instrumentation.c b/Python/instrumentation.c index fee6eae1734394..0768c82ba29882 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -37,6 +37,8 @@ static const int8_t EVENT_FOR_OPCODE[256] = { [INSTRUMENTED_RETURN_VALUE] = PY_MONITORING_EVENT_PY_RETURN, [CALL] = PY_MONITORING_EVENT_CALL, [INSTRUMENTED_CALL] = PY_MONITORING_EVENT_CALL, + [CALL_KW] = PY_MONITORING_EVENT_CALL, + [INSTRUMENTED_CALL_KW] = PY_MONITORING_EVENT_CALL, [CALL_FUNCTION_EX] = PY_MONITORING_EVENT_CALL, [INSTRUMENTED_CALL_FUNCTION_EX] = PY_MONITORING_EVENT_CALL, [LOAD_SUPER_ATTR] = PY_MONITORING_EVENT_CALL, @@ -69,6 +71,7 @@ static const uint8_t DE_INSTRUMENT[256] = { [INSTRUMENTED_RETURN_VALUE] = RETURN_VALUE, [INSTRUMENTED_RETURN_CONST] = RETURN_CONST, [INSTRUMENTED_CALL] = CALL, + [INSTRUMENTED_CALL_KW] = CALL_KW, [INSTRUMENTED_CALL_FUNCTION_EX] = CALL_FUNCTION_EX, [INSTRUMENTED_YIELD_VALUE] = YIELD_VALUE, [INSTRUMENTED_JUMP_FORWARD] = JUMP_FORWARD, @@ -90,6 +93,8 @@ static const uint8_t INSTRUMENTED_OPCODES[256] = { [INSTRUMENTED_RETURN_VALUE] = INSTRUMENTED_RETURN_VALUE, [CALL] = INSTRUMENTED_CALL, [INSTRUMENTED_CALL] = INSTRUMENTED_CALL, + [CALL_KW] = INSTRUMENTED_CALL_KW, + [INSTRUMENTED_CALL_KW] = INSTRUMENTED_CALL_KW, [CALL_FUNCTION_EX] = INSTRUMENTED_CALL_FUNCTION_EX, [INSTRUMENTED_CALL_FUNCTION_EX] = INSTRUMENTED_CALL_FUNCTION_EX, [YIELD_VALUE] = INSTRUMENTED_YIELD_VALUE, diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index f00eb31b70e26f..bcd6ea7564f9b3 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -56,6 +56,7 @@ static void *opcode_targets[256] = { &&TARGET_CALL_FUNCTION_EX, &&TARGET_CALL_INTRINSIC_1, &&TARGET_CALL_INTRINSIC_2, + &&TARGET_CALL_KW, &&TARGET_COMPARE_OP, &&TARGET_CONTAINS_OP, &&TARGET_CONVERT_VALUE, @@ -78,7 +79,6 @@ static void *opcode_targets[256] = { &&TARGET_JUMP_BACKWARD, &&TARGET_JUMP_BACKWARD_NO_INTERRUPT, &&TARGET_JUMP_FORWARD, - &&TARGET_KW_NAMES, &&TARGET_LIST_APPEND, &&TARGET_LIST_EXTEND, &&TARGET_LOAD_ATTR, @@ -161,24 +161,24 @@ static void *opcode_targets[256] = { &&TARGET_BINARY_SUBSCR_LIST_INT, &&TARGET_BINARY_SUBSCR_STR_INT, &&TARGET_BINARY_SUBSCR_TUPLE_INT, + &&TARGET_CALL_ALLOC_AND_ENTER_INIT, &&TARGET_CALL_BOUND_METHOD_EXACT_ARGS, &&TARGET_CALL_BUILTIN_CLASS, + &&TARGET_CALL_BUILTIN_FAST, &&TARGET_CALL_BUILTIN_FAST_WITH_KEYWORDS, + &&TARGET_CALL_BUILTIN_O, + &&TARGET_CALL_ISINSTANCE, + &&TARGET_CALL_LEN, + &&TARGET_CALL_LIST_APPEND, + &&TARGET_CALL_METHOD_DESCRIPTOR_FAST, &&TARGET_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, - &&TARGET_CALL_NO_KW_ALLOC_AND_ENTER_INIT, - &&TARGET_CALL_NO_KW_BUILTIN_FAST, - &&TARGET_CALL_NO_KW_BUILTIN_O, - &&TARGET_CALL_NO_KW_ISINSTANCE, - &&TARGET_CALL_NO_KW_LEN, - &&TARGET_CALL_NO_KW_LIST_APPEND, - &&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_FAST, - &&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS, - &&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_O, - &&TARGET_CALL_NO_KW_STR_1, - &&TARGET_CALL_NO_KW_TUPLE_1, - &&TARGET_CALL_NO_KW_TYPE_1, + &&TARGET_CALL_METHOD_DESCRIPTOR_NOARGS, + &&TARGET_CALL_METHOD_DESCRIPTOR_O, &&TARGET_CALL_PY_EXACT_ARGS, &&TARGET_CALL_PY_WITH_DEFAULTS, + &&TARGET_CALL_STR_1, + &&TARGET_CALL_TUPLE_1, + &&TARGET_CALL_TYPE_1, &&TARGET_COMPARE_OP_FLOAT, &&TARGET_COMPARE_OP_INT, &&TARGET_COMPARE_OP_STR, @@ -235,7 +235,6 @@ static void *opcode_targets[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, &&TARGET_INSTRUMENTED_RESUME, &&TARGET_INSTRUMENTED_END_FOR, &&TARGET_INSTRUMENTED_END_SEND, @@ -245,6 +244,7 @@ static void *opcode_targets[256] = { &&TARGET_INSTRUMENTED_LOAD_SUPER_ATTR, &&TARGET_INSTRUMENTED_FOR_ITER, &&TARGET_INSTRUMENTED_CALL, + &&TARGET_INSTRUMENTED_CALL_KW, &&TARGET_INSTRUMENTED_CALL_FUNCTION_EX, &&TARGET_INSTRUMENTED_INSTRUCTION, &&TARGET_INSTRUMENTED_JUMP_FORWARD, diff --git a/Python/specialize.c b/Python/specialize.c index 47e0bd7a69dfea..d9b748cad78f4f 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -473,7 +473,6 @@ _PyCode_Quicken(PyCodeObject *code) #define SPEC_FAIL_CALL_STR 24 #define SPEC_FAIL_CALL_CLASS_NO_VECTORCALL 25 #define SPEC_FAIL_CALL_CLASS_MUTABLE 26 -#define SPEC_FAIL_CALL_KWNAMES 27 #define SPEC_FAIL_CALL_METHOD_WRAPPER 28 #define SPEC_FAIL_CALL_OPERATOR_WRAPPER 29 #define SPEC_FAIL_CALL_INIT_NOT_SIMPLE 30 @@ -1644,24 +1643,23 @@ get_init_for_simple_managed_python_class(PyTypeObject *tp) } static int -specialize_class_call(PyObject *callable, _Py_CODEUNIT *instr, int nargs, - PyObject *kwnames) +specialize_class_call(PyObject *callable, _Py_CODEUNIT *instr, int nargs) { assert(PyType_Check(callable)); PyTypeObject *tp = _PyType_CAST(callable); if (tp->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) { int oparg = instr->op.arg; - if (nargs == 1 && kwnames == NULL && oparg == 1) { + if (nargs == 1 && oparg == 1) { if (tp == &PyUnicode_Type) { - instr->op.code = CALL_NO_KW_STR_1; + instr->op.code = CALL_STR_1; return 0; } else if (tp == &PyType_Type) { - instr->op.code = CALL_NO_KW_TYPE_1; + instr->op.code = CALL_TYPE_1; return 0; } else if (tp == &PyTuple_Type) { - instr->op.code = CALL_NO_KW_TUPLE_1; + instr->op.code = CALL_TUPLE_1; return 0; } } @@ -1680,13 +1678,9 @@ specialize_class_call(PyObject *callable, _Py_CODEUNIT *instr, int nargs, SPECIALIZATION_FAIL(CALL, SPEC_FAIL_WRONG_NUMBER_ARGUMENTS); return -1; } - if (kwnames) { - SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_KWNAMES); - return -1; - } _PyCallCache *cache = (_PyCallCache *)(instr + 1); write_u32(cache->func_version, tp->tp_version_tag); - _Py_SET_OPCODE(*instr, CALL_NO_KW_ALLOC_AND_ENTER_INIT); + _Py_SET_OPCODE(*instr, CALL_ALLOC_AND_ENTER_INIT); return 0; } return -1; @@ -1744,13 +1738,8 @@ meth_descr_call_fail_kind(int ml_flags) static int specialize_method_descriptor(PyMethodDescrObject *descr, _Py_CODEUNIT *instr, - int nargs, PyObject *kwnames) + int nargs) { - if (kwnames) { - SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_KWNAMES); - return -1; - } - switch (descr->d_method->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { @@ -1759,7 +1748,7 @@ specialize_method_descriptor(PyMethodDescrObject *descr, _Py_CODEUNIT *instr, SPECIALIZATION_FAIL(CALL, SPEC_FAIL_WRONG_NUMBER_ARGUMENTS); return -1; } - instr->op.code = CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS; + instr->op.code = CALL_METHOD_DESCRIPTOR_NOARGS; return 0; } case METH_O: { @@ -1773,14 +1762,14 @@ specialize_method_descriptor(PyMethodDescrObject *descr, _Py_CODEUNIT *instr, bool pop = (next.op.code == POP_TOP); int oparg = instr->op.arg; if ((PyObject *)descr == list_append && oparg == 1 && pop) { - instr->op.code = CALL_NO_KW_LIST_APPEND; + instr->op.code = CALL_LIST_APPEND; return 0; } - instr->op.code = CALL_NO_KW_METHOD_DESCRIPTOR_O; + instr->op.code = CALL_METHOD_DESCRIPTOR_O; return 0; } case METH_FASTCALL: { - instr->op.code = CALL_NO_KW_METHOD_DESCRIPTOR_FAST; + instr->op.code = CALL_METHOD_DESCRIPTOR_FAST; return 0; } case METH_FASTCALL | METH_KEYWORDS: { @@ -1794,7 +1783,7 @@ specialize_method_descriptor(PyMethodDescrObject *descr, _Py_CODEUNIT *instr, static int specialize_py_call(PyFunctionObject *func, _Py_CODEUNIT *instr, int nargs, - PyObject *kwnames, bool bound_method) + bool bound_method) { _PyCallCache *cache = (_PyCallCache *)(instr + 1); PyCodeObject *code = (PyCodeObject *)func->func_code; @@ -1804,10 +1793,6 @@ specialize_py_call(PyFunctionObject *func, _Py_CODEUNIT *instr, int nargs, SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_PEP_523); return -1; } - if (kwnames) { - SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_KWNAMES); - return -1; - } if (kind != SIMPLE_FUNCTION) { SPECIALIZATION_FAIL(CALL, kind); return -1; @@ -1843,8 +1828,7 @@ specialize_py_call(PyFunctionObject *func, _Py_CODEUNIT *instr, int nargs, } static int -specialize_c_call(PyObject *callable, _Py_CODEUNIT *instr, int nargs, - PyObject *kwnames) +specialize_c_call(PyObject *callable, _Py_CODEUNIT *instr, int nargs) { if (PyCFunction_GET_FUNCTION(callable) == NULL) { return 1; @@ -1853,10 +1837,6 @@ specialize_c_call(PyObject *callable, _Py_CODEUNIT *instr, int nargs, (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { case METH_O: { - if (kwnames) { - SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_KWNAMES); - return -1; - } if (nargs != 1) { SPECIALIZATION_FAIL(CALL, SPEC_FAIL_WRONG_NUMBER_ARGUMENTS); return 1; @@ -1864,26 +1844,22 @@ specialize_c_call(PyObject *callable, _Py_CODEUNIT *instr, int nargs, /* len(o) */ PyInterpreterState *interp = _PyInterpreterState_GET(); if (callable == interp->callable_cache.len) { - instr->op.code = CALL_NO_KW_LEN; + instr->op.code = CALL_LEN; return 0; } - instr->op.code = CALL_NO_KW_BUILTIN_O; + instr->op.code = CALL_BUILTIN_O; return 0; } case METH_FASTCALL: { - if (kwnames) { - SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_KWNAMES); - return -1; - } if (nargs == 2) { /* isinstance(o1, o2) */ PyInterpreterState *interp = _PyInterpreterState_GET(); if (callable == interp->callable_cache.isinstance) { - instr->op.code = CALL_NO_KW_ISINSTANCE; + instr->op.code = CALL_ISINSTANCE; return 0; } } - instr->op.code = CALL_NO_KW_BUILTIN_FAST; + instr->op.code = CALL_BUILTIN_FAST; return 0; } case METH_FASTCALL | METH_KEYWORDS: { @@ -1924,12 +1900,8 @@ call_fail_kind(PyObject *callable) #endif // Py_STATS -/* TODO: - - Specialize calling classes. -*/ void -_Py_Specialize_Call(PyObject *callable, _Py_CODEUNIT *instr, int nargs, - PyObject *kwnames) +_Py_Specialize_Call(PyObject *callable, _Py_CODEUNIT *instr, int nargs) { assert(ENABLE_SPECIALIZATION); assert(_PyOpcode_Caches[CALL] == INLINE_CACHE_ENTRIES_CALL); @@ -1937,25 +1909,23 @@ _Py_Specialize_Call(PyObject *callable, _Py_CODEUNIT *instr, int nargs, _PyCallCache *cache = (_PyCallCache *)(instr + 1); int fail; if (PyCFunction_CheckExact(callable)) { - fail = specialize_c_call(callable, instr, nargs, kwnames); + fail = specialize_c_call(callable, instr, nargs); } else if (PyFunction_Check(callable)) { - fail = specialize_py_call((PyFunctionObject *)callable, instr, nargs, - kwnames, false); + fail = specialize_py_call((PyFunctionObject *)callable, instr, nargs, false); } else if (PyType_Check(callable)) { - fail = specialize_class_call(callable, instr, nargs, kwnames); + fail = specialize_class_call(callable, instr, nargs); } else if (Py_IS_TYPE(callable, &PyMethodDescr_Type)) { - fail = specialize_method_descriptor((PyMethodDescrObject *)callable, - instr, nargs, kwnames); + fail = specialize_method_descriptor((PyMethodDescrObject *)callable, instr, nargs); } else if (PyMethod_Check(callable)) { PyObject *func = ((PyMethodObject *)callable)->im_func; if (PyFunction_Check(func)) { - fail = specialize_py_call((PyFunctionObject *)func, - instr, nargs+1, kwnames, true); - } else { + fail = specialize_py_call((PyFunctionObject *)func, instr, nargs+1, true); + } + else { SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_BOUND_METHOD); fail = -1; } @@ -2491,7 +2461,7 @@ _Py_Specialize_ToBool(PyObject *value, _Py_CODEUNIT *instr) } /* Code init cleanup. - * CALL_NO_KW_ALLOC_AND_ENTER_INIT will set up + * CALL_ALLOC_AND_ENTER_INIT will set up * the frame to execute the EXIT_INIT_CHECK * instruction. * Ends with a RESUME so that it is not traced. From 6c13e13b13bebfdde8ad4019536499820cdfc926 Mon Sep 17 00:00:00 2001 From: Brandt Bucher Date: Wed, 13 Sep 2023 10:26:50 -0700 Subject: [PATCH 199/357] GH-104584: Don't call executors from JUMP_BACKWARD (GH-109347) --- Include/cpython/optimizer.h | 2 +- Python/bytecodes.c | 20 ++++++++------------ Python/generated_cases.c.h | 20 ++++++++------------ Python/optimizer.c | 21 ++++++--------------- 4 files changed, 23 insertions(+), 40 deletions(-) diff --git a/Include/cpython/optimizer.h b/Include/cpython/optimizer.h index 10457afc180a00..47536108a9665e 100644 --- a/Include/cpython/optimizer.h +++ b/Include/cpython/optimizer.h @@ -40,7 +40,7 @@ PyAPI_FUNC(_PyOptimizerObject *) PyUnstable_GetOptimizer(void); PyAPI_FUNC(_PyExecutorObject *) PyUnstable_GetExecutor(PyCodeObject *code, int offset); -struct _PyInterpreterFrame * +int _PyOptimizer_BackEdge(struct _PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNIT *dest, PyObject **stack_pointer); extern _PyOptimizerObject _PyOptimizer_Default; diff --git a/Python/bytecodes.c b/Python/bytecodes.c index e5be62cf983f21..402b27101dbdb6 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -2242,21 +2242,17 @@ dummy_func( here[1].cache += (1 << OPTIMIZER_BITS_IN_COUNTER); if (here[1].cache > tstate->interp->optimizer_backedge_threshold && // Double-check that the opcode isn't instrumented or something: - here->op.code == JUMP_BACKWARD && - // _PyOptimizer_BackEdge is going to change frame->prev_instr, - // which breaks line event calculations: - next_instr->op.code != INSTRUMENTED_LINE - ) + here->op.code == JUMP_BACKWARD) { OBJECT_STAT_INC(optimization_attempts); - frame = _PyOptimizer_BackEdge(frame, here, next_instr, stack_pointer); - if (frame == NULL) { - frame = tstate->current_frame; - goto resume_with_error; + int optimized = _PyOptimizer_BackEdge(frame, here, next_instr, stack_pointer); + ERROR_IF(optimized < 0, error); + if (optimized) { + // Rewind and enter the executor: + assert(here->op.code == ENTER_EXECUTOR); + next_instr = here; } - assert(frame == tstate->current_frame); - here[1].cache &= ((1 << OPTIMIZER_BITS_IN_COUNTER) -1); - goto resume_frame; + here[1].cache &= ((1 << OPTIMIZER_BITS_IN_COUNTER) - 1); } #endif /* ENABLE_SPECIALIZATION */ } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index fff47a1b636f90..ebb87a86de432e 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -2945,21 +2945,17 @@ here[1].cache += (1 << OPTIMIZER_BITS_IN_COUNTER); if (here[1].cache > tstate->interp->optimizer_backedge_threshold && // Double-check that the opcode isn't instrumented or something: - here->op.code == JUMP_BACKWARD && - // _PyOptimizer_BackEdge is going to change frame->prev_instr, - // which breaks line event calculations: - next_instr->op.code != INSTRUMENTED_LINE - ) + here->op.code == JUMP_BACKWARD) { OBJECT_STAT_INC(optimization_attempts); - frame = _PyOptimizer_BackEdge(frame, here, next_instr, stack_pointer); - if (frame == NULL) { - frame = tstate->current_frame; - goto resume_with_error; + int optimized = _PyOptimizer_BackEdge(frame, here, next_instr, stack_pointer); + if (optimized < 0) goto error; + if (optimized) { + // Rewind and enter the executor: + assert(here->op.code == ENTER_EXECUTOR); + next_instr = here; } - assert(frame == tstate->current_frame); - here[1].cache &= ((1 << OPTIMIZER_BITS_IN_COUNTER) -1); - goto resume_frame; + here[1].cache &= ((1 << OPTIMIZER_BITS_IN_COUNTER) - 1); } #endif /* ENABLE_SPECIALIZATION */ DISPATCH(); diff --git a/Python/optimizer.c b/Python/optimizer.c index 453e3e86f5a1e3..fbdbf7291784c4 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -154,7 +154,7 @@ PyUnstable_SetOptimizer(_PyOptimizerObject *optimizer) Py_DECREF(old); } -_PyInterpreterFrame * +int _PyOptimizer_BackEdge(_PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNIT *dest, PyObject **stack_pointer) { assert(src->op.code == JUMP_BACKWARD); @@ -162,18 +162,14 @@ _PyOptimizer_BackEdge(_PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNI assert(PyCode_Check(code)); PyInterpreterState *interp = _PyInterpreterState_GET(); if (!has_space_for_executor(code, src)) { - goto jump_to_destination; + return 0; } _PyOptimizerObject *opt = interp->optimizer; _PyExecutorObject *executor = NULL; int err = opt->optimize(opt, code, dest, &executor, (int)(stack_pointer - _PyFrame_Stackbase(frame))); if (err <= 0) { assert(executor == NULL); - if (err < 0) { - _PyFrame_SetStackPointer(frame, stack_pointer); - return NULL; - } - goto jump_to_destination; + return err; } int index = get_index_for_executor(code, src); if (index < 0) { @@ -184,16 +180,11 @@ _PyOptimizer_BackEdge(_PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNI * it might get confused by the executor disappearing, * but there is not much we can do about that here. */ Py_DECREF(executor); - goto jump_to_destination; + return 0; } insert_executor(code, src, index, executor); - assert(frame->prev_instr == src); - frame->prev_instr = dest - 1; - return executor->execute(executor, frame, stack_pointer); -jump_to_destination: - frame->prev_instr = dest - 1; - _PyFrame_SetStackPointer(frame, stack_pointer); - return frame; + Py_DECREF(executor); + return 1; } _PyExecutorObject * From baaac99487255da049a3712d46b769635640fc92 Mon Sep 17 00:00:00 2001 From: Sam Gross Date: Wed, 13 Sep 2023 18:28:08 -0400 Subject: [PATCH 200/357] Fix invocation of wasm_build.py for node (GH-109383) --- Tools/wasm/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/wasm/README.md b/Tools/wasm/README.md index cd749dee8920c6..e6dd4d5f00abde 100644 --- a/Tools/wasm/README.md +++ b/Tools/wasm/README.md @@ -141,7 +141,7 @@ and header files with debug builds. #### Cross compile to wasm32-emscripten for node ```shell -./Tools/wasm/wasm_build.py emscripten-browser-dl +./Tools/wasm/wasm_build.py emscripten-node-dl ``` The command is roughly equivalent to: From a806e920c41d64a442708871fba260831fedc472 Mon Sep 17 00:00:00 2001 From: James Hilton-Balfe Date: Thu, 14 Sep 2023 04:42:44 +0100 Subject: [PATCH 201/357] Add missing PyDoc_STR to GenericAlias.__parameters__ (#108811) --- Objects/genericaliasobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index bb50537461040b..ca172440a3ac01 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -814,7 +814,7 @@ ga_unpacked_tuple_args(PyObject *self, void *unused) } static PyGetSetDef ga_properties[] = { - {"__parameters__", ga_parameters, (setter)NULL, "Type variables in the GenericAlias.", NULL}, + {"__parameters__", ga_parameters, (setter)NULL, PyDoc_STR("Type variables in the GenericAlias."), NULL}, {"__typing_unpacked_tuple_args__", ga_unpacked_tuple_args, (setter)NULL, NULL}, {0} }; From 1f885df2a580360c5de69cc41191f3c6bfaaeb35 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 14 Sep 2023 09:12:17 +0300 Subject: [PATCH 202/357] gh-107782: Use _testcapi to test non-representable signatures (GH-109325) Builtin functions and methods that have non-representable signatures today will have representable signatures yesterday, and they will become unusable for testing this feature. So we need to add special functions and methods to the _testcapi module that always have non-representable signatures. --- Lib/test/test_pydoc.py | 39 ++++++++++++++++++++++-- Modules/_testcapi/docstring.c | 44 ++++++++++++++++++++++++++++ Tools/c-analyzer/cpython/ignored.tsv | 1 + 3 files changed, 82 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index 499eeb98ad6138..70c5ebd694ca88 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -24,6 +24,7 @@ from io import StringIO from collections import namedtuple from urllib.request import urlopen, urlcleanup +from test import support from test.support import import_helper from test.support import os_helper from test.support.script_helper import (assert_python_ok, @@ -1236,22 +1237,56 @@ def test_bound_builtin_classmethod_o(self): self.assertEqual(self._get_summary_line(dict.__class_getitem__), "__class_getitem__(object, /) method of builtins.type instance") + @support.cpython_only def test_module_level_callable_unrepresentable_default(self): - self.assertEqual(self._get_summary_line(getattr), - "getattr(...)") + import _testcapi + builtin = _testcapi.func_with_unrepresentable_signature + self.assertEqual(self._get_summary_line(builtin), + "func_with_unrepresentable_signature(a, b=)") + @support.cpython_only def test_builtin_staticmethod_unrepresentable_default(self): self.assertEqual(self._get_summary_line(str.maketrans), "maketrans(x, y=, z=, /)") + import _testcapi + cls = _testcapi.DocStringUnrepresentableSignatureTest + self.assertEqual(self._get_summary_line(cls.staticmeth), + "staticmeth(a, b=)") + @support.cpython_only def test_unbound_builtin_method_unrepresentable_default(self): self.assertEqual(self._get_summary_line(dict.pop), "pop(self, key, default=, /)") + import _testcapi + cls = _testcapi.DocStringUnrepresentableSignatureTest + self.assertEqual(self._get_summary_line(cls.meth), + "meth(self, /, a, b=)") + @support.cpython_only def test_bound_builtin_method_unrepresentable_default(self): self.assertEqual(self._get_summary_line({}.pop), "pop(key, default=, /) " "method of builtins.dict instance") + import _testcapi + obj = _testcapi.DocStringUnrepresentableSignatureTest() + self.assertEqual(self._get_summary_line(obj.meth), + "meth(a, b=) " + "method of _testcapi.DocStringUnrepresentableSignatureTest instance") + + @support.cpython_only + def test_unbound_builtin_classmethod_unrepresentable_default(self): + import _testcapi + cls = _testcapi.DocStringUnrepresentableSignatureTest + descr = cls.__dict__['classmeth'] + self.assertEqual(self._get_summary_line(descr), + "classmeth(type, /, a, b=)") + + @support.cpython_only + def test_bound_builtin_classmethod_unrepresentable_default(self): + import _testcapi + cls = _testcapi.DocStringUnrepresentableSignatureTest + self.assertEqual(self._get_summary_line(cls.classmeth), + "classmeth(a, b=) method of builtins.type instance") def test_overridden_text_signature(self): class C: diff --git a/Modules/_testcapi/docstring.c b/Modules/_testcapi/docstring.c index b680171cc1437a..d99fbdd904b594 100644 --- a/Modules/_testcapi/docstring.c +++ b/Modules/_testcapi/docstring.c @@ -100,6 +100,13 @@ static PyMethodDef test_methods[] = { {"test_with_docstring", test_with_docstring, METH_VARARGS, PyDoc_STR("This is a pretty normal docstring.")}, + {"func_with_unrepresentable_signature", + (PyCFunction)test_with_docstring, METH_VARARGS, + PyDoc_STR( + "func_with_unrepresentable_signature($module, /, a, b=)\n" + "--\n\n" + "This docstring has a signature with unrepresentable default." + )}, {NULL}, }; @@ -140,6 +147,40 @@ static PyTypeObject DocStringNoSignatureTest = { .tp_new = PyType_GenericNew, }; +static PyMethodDef DocStringUnrepresentableSignatureTest_methods[] = { + {"meth", + (PyCFunction)test_with_docstring, METH_VARARGS, + PyDoc_STR( + "meth($self, /, a, b=)\n" + "--\n\n" + "This docstring has a signature with unrepresentable default." + )}, + {"classmeth", + (PyCFunction)test_with_docstring, METH_VARARGS|METH_CLASS, + PyDoc_STR( + "classmeth($type, /, a, b=)\n" + "--\n\n" + "This docstring has a signature with unrepresentable default." + )}, + {"staticmeth", + (PyCFunction)test_with_docstring, METH_VARARGS|METH_STATIC, + PyDoc_STR( + "staticmeth(a, b=)\n" + "--\n\n" + "This docstring has a signature with unrepresentable default." + )}, + {NULL}, +}; + +static PyTypeObject DocStringUnrepresentableSignatureTest = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_name = "_testcapi.DocStringUnrepresentableSignatureTest", + .tp_basicsize = sizeof(PyObject), + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = DocStringUnrepresentableSignatureTest_methods, + .tp_new = PyType_GenericNew, +}; + int _PyTestCapi_Init_Docstring(PyObject *mod) { @@ -149,5 +190,8 @@ _PyTestCapi_Init_Docstring(PyObject *mod) if (PyModule_AddType(mod, &DocStringNoSignatureTest) < 0) { return -1; } + if (PyModule_AddType(mod, &DocStringUnrepresentableSignatureTest) < 0) { + return -1; + } return 0; } diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index d1ac0410619c96..8c2be44b5171e6 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -420,6 +420,7 @@ Modules/_testcapi/buffer.c - testBufType - Modules/_testcapi/code.c get_code_extra_index key - Modules/_testcapi/datetime.c - test_run_counter - Modules/_testcapi/docstring.c - DocStringNoSignatureTest - +Modules/_testcapi/docstring.c - DocStringUnrepresentableSignatureTest - Modules/_testcapi/exceptions.c - PyRecursingInfinitelyError_Type - Modules/_testcapi/heaptype.c - _testcapimodule - Modules/_testcapi/mem.c - FmData - From d7a27e527d7e669d2e45cff80ad725978226477c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 14 Sep 2023 14:56:43 +0200 Subject: [PATCH 203/357] gh-107298: Document PyMODINIT_FUNC macro (#109236) Document PyMODINIT_FUNC macro. Remove links to PyAPI_FUNC() and PyAPI_DATA() macros since they are not documented. These macros should only be used to define the Python C API. They should not be used outside Python code base. --- Doc/c-api/intro.rst | 24 ++++++++++++++++++++++++ Doc/using/configure.rst | 4 ++-- Doc/whatsnew/2.3.rst | 2 +- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 5cf9914be8c8bf..4dbca92b18b5cd 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -105,6 +105,30 @@ defined closer to where they are useful (e.g. :c:macro:`Py_RETURN_NONE`). Others of a more general utility are defined here. This is not necessarily a complete listing. +.. c:macro:: PyMODINIT_FUNC + + Declare an extension module ``PyInit`` initialization function. The function + return type is :c:expr:`PyObject*`. The macro declares any special linkage + declarations required by the platform, and for C++ declares the function as + ``extern "C"``. + + The initialization function must be named :samp:`PyInit_{name}`, where + *name* is the name of the module, and should be the only non-\ ``static`` + item defined in the module file. Example:: + + static struct PyModuleDef spam_module = { + PyModuleDef_HEAD_INIT, + .m_name = "spam", + ... + }; + + PyMODINIT_FUNC + PyInit_spam(void) + { + return PyModule_Create(&spam_module); + } + + .. c:macro:: Py_ABS(x) Return the absolute value of ``x``. diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index ba1898e35b5fbc..9d2952e0df95b8 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -855,8 +855,8 @@ Example on Linux x86-64:: At the beginning of the files, C extensions are built as built-in modules. Extensions defined after the ``*shared*`` marker are built as dynamic libraries. -The :c:macro:`PyAPI_FUNC()`, :c:macro:`PyAPI_DATA()` and -:c:macro:`PyMODINIT_FUNC` macros of :file:`Include/pyport.h` are defined +The :c:macro:`!PyAPI_FUNC()`, :c:macro:`!PyAPI_DATA()` and +:c:macro:`PyMODINIT_FUNC` macros of :file:`Include/exports.h` are defined differently depending if the ``Py_BUILD_CORE_MODULE`` macro is defined: * Use ``Py_EXPORTED_SYMBOL`` if the ``Py_BUILD_CORE_MODULE`` is defined diff --git a/Doc/whatsnew/2.3.rst b/Doc/whatsnew/2.3.rst index ba18ce343c35d1..ec1ca417ee139d 100644 --- a/Doc/whatsnew/2.3.rst +++ b/Doc/whatsnew/2.3.rst @@ -1889,7 +1889,7 @@ Changes to Python's build process and to the C API include: * The :c:macro:`!DL_EXPORT` and :c:macro:`!DL_IMPORT` macros are now deprecated. Initialization functions for Python extension modules should now be declared using the new macro :c:macro:`PyMODINIT_FUNC`, while the Python core will - generally use the :c:macro:`PyAPI_FUNC` and :c:macro:`PyAPI_DATA` macros. + generally use the :c:macro:`!PyAPI_FUNC` and :c:macro:`!PyAPI_DATA` macros. * The interpreter can be compiled without any docstrings for the built-in functions and modules by supplying :option:`!--without-doc-strings` to the From 9ccd2e6aee173615012f7b8262ec890cfb1a7eb4 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 14 Sep 2023 15:15:42 +0200 Subject: [PATCH 204/357] gh-109402: Fix regrtest findtests() (#109403) Check for the full module name in SPLITTESTDIRS, not the relative module name. --- Lib/test/libregrtest/findtests.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Lib/test/libregrtest/findtests.py b/Lib/test/libregrtest/findtests.py index f4a8b9ae26ae65..af89982d498cf4 100644 --- a/Lib/test/libregrtest/findtests.py +++ b/Lib/test/libregrtest/findtests.py @@ -38,14 +38,19 @@ def findtests(*, testdir: StrPath | None = None, exclude=(), mod, ext = os.path.splitext(name) if (not mod.startswith("test_")) or (mod in exclude): continue - if mod in split_test_dirs: + if base_mod: + fullname = f"{base_mod}.{mod}" + else: + fullname = mod + if fullname in split_test_dirs: subdir = os.path.join(testdir, mod) - mod = f"{base_mod or 'test'}.{mod}" + if not base_mod: + fullname = f"test.{mod}" tests.extend(findtests(testdir=subdir, exclude=exclude, split_test_dirs=split_test_dirs, - base_mod=mod)) + base_mod=fullname)) elif ext in (".py", ""): - tests.append(f"{base_mod}.{mod}" if base_mod else mod) + tests.append(fullname) return sorted(tests) From 1ce9ea0453f7dc69dd41684f3bc9310259513de8 Mon Sep 17 00:00:00 2001 From: Carl Meyer Date: Thu, 14 Sep 2023 08:28:21 -0600 Subject: [PATCH 205/357] dump readable opcode names in flowgraph debug utility (#109392) Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> --- Python/flowgraph.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Python/flowgraph.c b/Python/flowgraph.c index 44858b9c527388..5ad49911dfbea4 100644 --- a/Python/flowgraph.c +++ b/Python/flowgraph.c @@ -261,8 +261,8 @@ dump_instr(cfg_instr *i) if (HAS_TARGET(i->i_opcode)) { sprintf(arg, "target: %p [%d] ", i->i_target, i->i_oparg); } - fprintf(stderr, "line: %d, opcode: %d %s%s\n", - i->i_loc.lineno, i->i_opcode, arg, jump); + fprintf(stderr, "line: %d, %s (%d) %s%s\n", + i->i_loc.lineno, _PyOpcode_OpName[i->i_opcode], i->i_opcode, arg, jump); } static inline int @@ -2661,4 +2661,3 @@ _PyCfg_OptimizedCfgToInstructionSequence(cfg_builder *g, return SUCCESS; } - From 4a54074a0f5579d417445ec28427cd0ed5aa01f4 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Thu, 14 Sep 2023 17:06:08 +0100 Subject: [PATCH 206/357] gh-105658: fix excess trace events for except block ending with a conditional block (#109384) --- Lib/test/test_dis.py | 12 ++++--- Lib/test/test_sys_settrace.py | 31 ++++++++++++++++++- ...-09-13-19-16-51.gh-issue-105658.z2nR2u.rst | 2 ++ Python/compile.c | 16 ++-------- 4 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-13-19-16-51.gh-issue-105658.z2nR2u.rst diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 568200c9c86c7e..d104e5dd904999 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -642,7 +642,8 @@ def _tryfinallyconst(b): CALL 0 POP_TOP RERAISE 0 - >> COPY 3 + +None >> COPY 3 POP_EXCEPT RERAISE 1 ExceptionTable: @@ -674,7 +675,8 @@ def _tryfinallyconst(b): CALL 0 POP_TOP RERAISE 0 - >> COPY 3 + +None >> COPY 3 POP_EXCEPT RERAISE 1 ExceptionTable: @@ -1822,9 +1824,9 @@ def _prepare_test_cases(): Instruction(opname='CALL', opcode=53, arg=1, argval=1, argrepr='', offset=414, start_offset=414, starts_line=False, line_number=28, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=32, arg=None, argval=None, argrepr='', offset=422, start_offset=422, starts_line=False, line_number=28, is_jump_target=False, positions=None), Instruction(opname='RERAISE', opcode=102, arg=0, argval=0, argrepr='', offset=424, start_offset=424, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=61, arg=3, argval=3, argrepr='', offset=426, start_offset=426, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=31, arg=None, argval=None, argrepr='', offset=428, start_offset=428, starts_line=False, line_number=28, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=430, start_offset=430, starts_line=False, line_number=28, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=61, arg=3, argval=3, argrepr='', offset=426, start_offset=426, starts_line=True, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=31, arg=None, argval=None, argrepr='', offset=428, start_offset=428, starts_line=False, line_number=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=430, start_offset=430, starts_line=False, line_number=None, is_jump_target=False, positions=None), ] # One last piece of inspect fodder to check the default line number handling diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 369a276ac33a12..f02169602e4925 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -929,6 +929,35 @@ def func(): (6, 'line'), (6, 'return')]) + def test_finally_with_conditional(self): + + # See gh-105658 + condition = True + def func(): + try: + try: + raise Exception + finally: + if condition: + result = 1 + result = 2 + except: + result = 3 + return result + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (3, 'exception'), + (5, 'line'), + (6, 'line'), + (8, 'line'), + (9, 'line'), + (10, 'line'), + (10, 'return')]) + def test_break_to_continue1(self): def func(): @@ -2123,7 +2152,7 @@ def test_jump_in_nested_finally_3(output): output.append(11) output.append(12) - @jump_test(5, 11, [2, 4], (ValueError, 'exception')) + @jump_test(5, 11, [2, 4], (ValueError, 'comes after the current code block')) def test_no_jump_over_return_try_finally_in_finally_block(output): try: output.append(2) diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-13-19-16-51.gh-issue-105658.z2nR2u.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-13-19-16-51.gh-issue-105658.z2nR2u.rst new file mode 100644 index 00000000000000..e95f5b84e8e187 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-13-19-16-51.gh-issue-105658.z2nR2u.rst @@ -0,0 +1,2 @@ +Fix bug where the line trace of an except block ending with a conditional +includes an excess event with the line of the conditional expression. diff --git a/Python/compile.c b/Python/compile.c index b05c1ad96be803..1d9ae626677310 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3261,18 +3261,6 @@ compiler_continue(struct compiler *c, location loc) } -static location -location_of_last_executing_statement(asdl_stmt_seq *stmts) -{ - for (Py_ssize_t i = asdl_seq_LEN(stmts) - 1; i >= 0; i++) { - location loc = LOC((stmt_ty)asdl_seq_GET(stmts, i)); - if (loc.lineno > 0) { - return loc; - } - } - return NO_LOCATION; -} - /* Code generated for "try: finally: " is as follows: SETUP_FINALLY L @@ -3341,9 +3329,9 @@ compiler_try_finally(struct compiler *c, stmt_ty s) RETURN_IF_ERROR( compiler_push_fblock(c, loc, FINALLY_END, end, NO_LABEL, NULL)); VISIT_SEQ(c, stmt, s->v.Try.finalbody); - loc = location_of_last_executing_statement(s->v.Try.finalbody); compiler_pop_fblock(c, FINALLY_END, end); + loc = NO_LOCATION; ADDOP_I(c, loc, RERAISE, 0); USE_LABEL(c, cleanup); @@ -3392,9 +3380,9 @@ compiler_try_star_finally(struct compiler *c, stmt_ty s) compiler_push_fblock(c, loc, FINALLY_END, end, NO_LABEL, NULL)); VISIT_SEQ(c, stmt, s->v.TryStar.finalbody); - loc = location_of_last_executing_statement(s->v.Try.finalbody); compiler_pop_fblock(c, FINALLY_END, end); + loc = NO_LOCATION; ADDOP_I(c, loc, RERAISE, 0); USE_LABEL(c, cleanup); From 909adb5092c0ae9426814742d97932204b211cfb Mon Sep 17 00:00:00 2001 From: Carl Meyer Date: Thu, 14 Sep 2023 10:20:32 -0600 Subject: [PATCH 207/357] gh-109219: propagate free vars through type param scopes (#109377) Co-authored-by: Jelle Zijlstra --- Lib/test/test_type_params.py | 13 +++++++++++++ .../2023-09-13-08-42-45.gh-issue-109219.UiN8sc.rst | 2 ++ Python/symtable.c | 5 ++--- 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-13-08-42-45.gh-issue-109219.UiN8sc.rst diff --git a/Lib/test/test_type_params.py b/Lib/test/test_type_params.py index b1848aee4753a1..25ee188731f31f 100644 --- a/Lib/test/test_type_params.py +++ b/Lib/test/test_type_params.py @@ -694,6 +694,19 @@ class Cls: cls = ns["outer"]() self.assertEqual(cls.Alias.__value__, "class") + def test_nested_free(self): + ns = run_code(""" + def f(): + T = str + class C: + T = int + class D[U](T): + x = T + return C + """) + C = ns["f"]() + self.assertIn(int, C.D.__bases__) + self.assertIs(C.D.x, str) class TypeParamsManglingTest(unittest.TestCase): def test_mangling(self): diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-13-08-42-45.gh-issue-109219.UiN8sc.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-13-08-42-45.gh-issue-109219.UiN8sc.rst new file mode 100644 index 00000000000000..2c141f09d7e754 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-13-08-42-45.gh-issue-109219.UiN8sc.rst @@ -0,0 +1,2 @@ +Fix compiling type param scopes that use a name which is also free in an +inner scope. diff --git a/Python/symtable.c b/Python/symtable.c index d737c09203d31b..b0c7240a11e75b 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -836,8 +836,7 @@ update_symbols(PyObject *symbols, PyObject *scopes, the class that has the same name as a local or global in the class scope. */ - if (classflag && - PyLong_AS_LONG(v) & (DEF_BOUND | DEF_GLOBAL)) { + if (classflag) { long flags = PyLong_AS_LONG(v) | DEF_FREE_CLASS; v_new = PyLong_FromLong(flags); if (!v_new) { @@ -1078,7 +1077,7 @@ analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free, goto error; /* Records the results of the analysis in the symbol table entry */ if (!update_symbols(ste->ste_symbols, scopes, bound, newfree, inlined_cells, - ste->ste_type == ClassBlock)) + (ste->ste_type == ClassBlock) || ste->ste_can_see_class_scope)) goto error; temp = PyNumber_InPlaceOr(free, newfree); From 21e80f4c1925aaafae199840f8737b5c39a82c70 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Thu, 14 Sep 2023 21:24:18 +0300 Subject: [PATCH 208/357] gh-101100: Fix sphinx warnings in `turtle.rst` (#109394) --- Doc/library/turtle.rst | 8 ++++---- Doc/tools/.nitignore | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index 4c84ae6a820f02..88b1f09eb3c8b7 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -2315,7 +2315,7 @@ Public classes .. class:: RawTurtle(canvas) RawPen(canvas) - :param canvas: a :class:`tkinter.Canvas`, a :class:`ScrolledCanvas` or a + :param canvas: a :class:`!tkinter.Canvas`, a :class:`ScrolledCanvas` or a :class:`TurtleScreen` Create a turtle. The turtle has all methods described above as "methods of @@ -2330,7 +2330,7 @@ Public classes .. class:: TurtleScreen(cv) - :param cv: a :class:`tkinter.Canvas` + :param cv: a :class:`!tkinter.Canvas` Provides screen oriented methods like :func:`bgcolor` etc. that are described above. @@ -2414,7 +2414,7 @@ instance if one is not already present. ``Turtle`` is a subclass of :class:`RawTurtle`, which *doesn't* automatically create a drawing surface - a *canvas* will need to be provided or created for -it. The *canvas* can be a :class:`tkinter.Canvas`, :class:`ScrolledCanvas` +it. The *canvas* can be a :class:`!tkinter.Canvas`, :class:`ScrolledCanvas` or :class:`TurtleScreen`. @@ -2422,7 +2422,7 @@ or :class:`TurtleScreen`. turtle. :class:`Screen` is a subclass of ``TurtleScreen``, and includes :ref:`some additional methods ` for managing its appearance (including size and title) and behaviour. ``TurtleScreen``'s -constructor needs a :class:`tkinter.Canvas` or a +constructor needs a :class:`!tkinter.Canvas` or a :class:`ScrolledCanvas` as an argument. The functional interface for turtle graphics uses the various methods of diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index a6268048e143db..39a10992193ffc 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -130,7 +130,6 @@ Doc/library/tkinter.scrolledtext.rst Doc/library/tkinter.ttk.rst Doc/library/traceback.rst Doc/library/tty.rst -Doc/library/turtle.rst Doc/library/unittest.mock.rst Doc/library/unittest.rst Doc/library/urllib.parse.rst From 3b9d10b0316cdc2679ccad80563b7c7da3951388 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Thu, 14 Sep 2023 19:33:18 +0100 Subject: [PATCH 209/357] gh-109413: libregrtest: Add and improve type annotations (#109405) --- Lib/test/libregrtest/cmdline.py | 2 +- Lib/test/libregrtest/findtests.py | 2 +- Lib/test/libregrtest/logger.py | 2 +- Lib/test/libregrtest/main.py | 12 ++++---- Lib/test/libregrtest/mypy.ini | 47 +++++++++++++++++++++++++++++ Lib/test/libregrtest/refleak.py | 2 ++ Lib/test/libregrtest/results.py | 2 +- Lib/test/libregrtest/run_workers.py | 28 ++++++++--------- Lib/test/libregrtest/runtests.py | 4 +-- Lib/test/libregrtest/setup.py | 5 +-- Lib/test/libregrtest/single.py | 2 ++ Lib/test/libregrtest/utils.py | 4 ++- Lib/test/libregrtest/worker.py | 4 +-- 13 files changed, 83 insertions(+), 33 deletions(-) create mode 100644 Lib/test/libregrtest/mypy.ini diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index ab8efb427a14a5..99f28152f1a1c7 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -161,7 +161,7 @@ def __init__(self, **kwargs) -> None: self.trace = False self.coverdir = 'coverage' self.runleaks = False - self.huntrleaks = False + self.huntrleaks: tuple[int, int, str] | None = None self.rerun = False self.verbose3 = False self.print_slow = False diff --git a/Lib/test/libregrtest/findtests.py b/Lib/test/libregrtest/findtests.py index af89982d498cf4..6f554addc104fd 100644 --- a/Lib/test/libregrtest/findtests.py +++ b/Lib/test/libregrtest/findtests.py @@ -24,7 +24,7 @@ } -def findtestdir(path=None): +def findtestdir(path: StrPath | None = None) -> StrPath: return path or os.path.dirname(os.path.dirname(__file__)) or os.curdir diff --git a/Lib/test/libregrtest/logger.py b/Lib/test/libregrtest/logger.py index f74bdff6322f13..c397b21be84385 100644 --- a/Lib/test/libregrtest/logger.py +++ b/Lib/test/libregrtest/logger.py @@ -14,7 +14,7 @@ def __init__(self, results: TestResults, quiet: bool, pgo: bool): self.start_time = time.perf_counter() self.test_count_text = '' self.test_count_width = 3 - self.win_load_tracker = None + self.win_load_tracker: WindowsLoadTracker | None = None self._results: TestResults = results self._quiet: bool = quiet self._pgo: bool = pgo diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index ba493ae1796fe0..a9dd08702deb59 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -71,11 +71,11 @@ def __init__(self, ns: Namespace): # Select tests if ns.match_tests: - self.match_tests: FilterTuple = tuple(ns.match_tests) + self.match_tests: FilterTuple | None = tuple(ns.match_tests) else: self.match_tests = None if ns.ignore_tests: - self.ignore_tests: FilterTuple = tuple(ns.ignore_tests) + self.ignore_tests: FilterTuple | None = tuple(ns.ignore_tests) else: self.ignore_tests = None self.exclude: bool = ns.exclude @@ -105,16 +105,16 @@ def __init__(self, ns: Namespace): if ns.huntrleaks: warmups, runs, filename = ns.huntrleaks filename = os.path.abspath(filename) - self.hunt_refleak: HuntRefleak = HuntRefleak(warmups, runs, filename) + self.hunt_refleak: HuntRefleak | None = HuntRefleak(warmups, runs, filename) else: self.hunt_refleak = None self.test_dir: StrPath | None = ns.testdir self.junit_filename: StrPath | None = ns.xmlpath self.memory_limit: str | None = ns.memlimit self.gc_threshold: int | None = ns.threshold - self.use_resources: tuple[str] = tuple(ns.use_resources) + self.use_resources: tuple[str, ...] = tuple(ns.use_resources) if ns.python: - self.python_cmd: tuple[str] = tuple(ns.python) + self.python_cmd: tuple[str, ...] | None = tuple(ns.python) else: self.python_cmd = None self.coverage: bool = ns.trace @@ -389,7 +389,7 @@ def create_run_tests(self, tests: TestTuple): match_tests=self.match_tests, ignore_tests=self.ignore_tests, match_tests_dict=None, - rerun=None, + rerun=False, forever=self.forever, pgo=self.pgo, pgo_extended=self.pgo_extended, diff --git a/Lib/test/libregrtest/mypy.ini b/Lib/test/libregrtest/mypy.ini new file mode 100644 index 00000000000000..ac2f70c2c1f3ab --- /dev/null +++ b/Lib/test/libregrtest/mypy.ini @@ -0,0 +1,47 @@ +# Config file for running mypy on libregrtest. +# +# Note: mypy can't be run on libregrtest from the CPython repo root. +# If you try to do so, mypy will complain +# about the entire `Lib/` directory "shadowing the stdlib". +# Instead, `cd` into `Lib/test`, then run `mypy --config-file libregrtest/mypy.ini`. + +[mypy] +packages = libregrtest +python_version = 3.11 +platform = linux +pretty = True + +# Enable most stricter settings +enable_error_code = ignore-without-code +strict = True + +# Various stricter settings that we can't yet enable +# Try to enable these in the following order: +strict_optional = False +disallow_any_generics = False +disallow_incomplete_defs = False +disallow_untyped_calls = False +disallow_untyped_defs = False +check_untyped_defs = False +warn_return_any = False + +disable_error_code = return + +# Various internal modules that typeshed deliberately doesn't have stubs for: +[mypy-_abc.*] +ignore_missing_imports = True + +[mypy-_opcode.*] +ignore_missing_imports = True + +[mypy-_overlapped.*] +ignore_missing_imports = True + +[mypy-_testcapi.*] +ignore_missing_imports = True + +[mypy-_testinternalcapi.*] +ignore_missing_imports = True + +[mypy-test.*] +ignore_missing_imports = True diff --git a/Lib/test/libregrtest/refleak.py b/Lib/test/libregrtest/refleak.py index edf8569a8f95fd..ada1a65b867ee6 100644 --- a/Lib/test/libregrtest/refleak.py +++ b/Lib/test/libregrtest/refleak.py @@ -1,6 +1,7 @@ import sys import warnings from inspect import isabstract +from typing import Any from test import support from test.support import os_helper @@ -45,6 +46,7 @@ def runtest_refleak(test_name, test_func, fs = warnings.filters[:] ps = copyreg.dispatch_table.copy() pic = sys.path_importer_cache.copy() + zdc: dict[str, Any] | None try: import zipimport except ImportError: diff --git a/Lib/test/libregrtest/results.py b/Lib/test/libregrtest/results.py index 94654fd6ab23f9..f16b3373fd2afb 100644 --- a/Lib/test/libregrtest/results.py +++ b/Lib/test/libregrtest/results.py @@ -111,7 +111,7 @@ def accumulate_result(self, result: TestResult, runtests: RunTests): def need_rerun(self): return bool(self.bad_results) - def prepare_rerun(self) -> (TestTuple, FilterDict): + def prepare_rerun(self) -> tuple[TestTuple, FilterDict]: tests: TestList = [] match_tests_dict = {} for result in self.bad_results: diff --git a/Lib/test/libregrtest/run_workers.py b/Lib/test/libregrtest/run_workers.py index 45b2f424ce4e5d..b973793b2066d2 100644 --- a/Lib/test/libregrtest/run_workers.py +++ b/Lib/test/libregrtest/run_workers.py @@ -21,7 +21,7 @@ from .runtests import RunTests, JsonFile, JsonFileType from .single import PROGRESS_MIN_TIME from .utils import ( - StrPath, StrJSON, TestName, MS_WINDOWS, + StrPath, TestName, MS_WINDOWS, format_duration, print_warning, count, plural) from .worker import create_worker_process, USE_PROCESS_GROUP @@ -104,9 +104,9 @@ def __init__(self, worker_id: int, runner: "RunWorkers") -> None: self.output = runner.output self.timeout = runner.worker_timeout self.log = runner.log - self.test_name = None - self.start_time = None - self._popen = None + self.test_name: TestName | None = None + self.start_time: float | None = None + self._popen: subprocess.Popen[str] | None = None self._killed = False self._stopped = False @@ -160,7 +160,7 @@ def stop(self) -> None: self._kill() def _run_process(self, runtests: RunTests, output_fd: int, - tmp_dir: StrPath | None = None) -> int: + tmp_dir: StrPath | None = None) -> int | None: popen = create_worker_process(runtests, output_fd, tmp_dir) self._popen = popen self._killed = False @@ -260,7 +260,7 @@ def create_worker_runtests(self, test_name: TestName, json_file: JsonFile) -> Ru **kwargs) def run_tmp_files(self, worker_runtests: RunTests, - stdout_fd: int) -> (int, list[StrPath]): + stdout_fd: int) -> tuple[int | None, list[StrPath]]: # gh-93353: Check for leaked temporary files in the parent process, # since the deletion of temporary files can happen late during # Python finalization: too late for libregrtest. @@ -297,13 +297,13 @@ def read_json(self, json_file: JsonFile, json_tmpfile: TextIO | None, try: if json_tmpfile is not None: json_tmpfile.seek(0) - worker_json: StrJSON = json_tmpfile.read() + worker_json = json_tmpfile.read() elif json_file.file_type == JsonFileType.STDOUT: stdout, _, worker_json = stdout.rpartition("\n") stdout = stdout.rstrip() else: with json_file.open(encoding='utf8') as json_fp: - worker_json: StrJSON = json_fp.read() + worker_json = json_fp.read() except Exception as exc: # gh-101634: Catch UnicodeDecodeError if stdout cannot be # decoded from encoding @@ -414,8 +414,8 @@ def wait_stopped(self, start_time: float) -> None: break -def get_running(workers: list[WorkerThread]) -> list[str]: - running = [] +def get_running(workers: list[WorkerThread]) -> str | None: + running: list[str] = [] for worker in workers: test_name = worker.test_name if not test_name: @@ -431,7 +431,7 @@ def get_running(workers: list[WorkerThread]) -> list[str]: class RunWorkers: def __init__(self, num_workers: int, runtests: RunTests, - logger: Logger, results: TestResult) -> None: + logger: Logger, results: TestResults) -> None: self.num_workers = num_workers self.runtests = runtests self.log = logger.log @@ -446,10 +446,10 @@ def __init__(self, num_workers: int, runtests: RunTests, # Rely on faulthandler to kill a worker process. This timouet is # when faulthandler fails to kill a worker process. Give a maximum # of 5 minutes to faulthandler to kill the worker. - self.worker_timeout = min(self.timeout * 1.5, self.timeout + 5 * 60) + self.worker_timeout: float | None = min(self.timeout * 1.5, self.timeout + 5 * 60) else: self.worker_timeout = None - self.workers = None + self.workers: list[WorkerThread] | None = None jobs = self.runtests.get_jobs() if jobs is not None: @@ -529,7 +529,7 @@ def display_result(self, mp_result: MultiprocessResult) -> None: text += f' -- {running}' self.display_progress(self.test_index, text) - def _process_result(self, item: QueueOutput) -> bool: + def _process_result(self, item: QueueOutput) -> TestResult: """Returns True if test runner must stop.""" if item[0]: # Thread got an exception diff --git a/Lib/test/libregrtest/runtests.py b/Lib/test/libregrtest/runtests.py index aee0ab6fd6e38f..4da312db4cb02e 100644 --- a/Lib/test/libregrtest/runtests.py +++ b/Lib/test/libregrtest/runtests.py @@ -88,8 +88,8 @@ class RunTests: use_junit: bool memory_limit: str | None gc_threshold: int | None - use_resources: tuple[str] - python_cmd: tuple[str] | None + use_resources: tuple[str, ...] + python_cmd: tuple[str, ...] | None randomize: bool random_seed: int | None json_file: JsonFile | None diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index 1c40b7c7b3bbfd..204f10fe839792 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -1,4 +1,5 @@ import faulthandler +import gc import os import random import signal @@ -6,10 +7,6 @@ import unittest from test import support from test.support.os_helper import TESTFN_UNDECODABLE, FS_NONASCII -try: - import gc -except ImportError: - gc = None from .runtests import RunTests from .utils import ( diff --git a/Lib/test/libregrtest/single.py b/Lib/test/libregrtest/single.py index de6056628738bc..bc6021acb34aad 100644 --- a/Lib/test/libregrtest/single.py +++ b/Lib/test/libregrtest/single.py @@ -51,6 +51,8 @@ def regrtest_runner(result: TestResult, test_func, runtests: RunTests) -> None: if refleak: result.state = State.REFLEAK + stats: TestStats | None + match test_result: case TestStats(): stats = test_result diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 880cec5cc50f4a..2f3bc3c6019caa 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -10,6 +10,7 @@ import sysconfig import tempfile import textwrap +from collections.abc import Callable from test import support from test.support import os_helper @@ -67,7 +68,7 @@ def format_duration(seconds): return ' '.join(parts) -def strip_py_suffix(names: list[str]): +def strip_py_suffix(names: list[str] | None) -> None: if not names: return for idx, name in enumerate(names): @@ -441,6 +442,7 @@ def remove_testfn(test_name: TestName, verbose: int) -> None: if not os.path.exists(name): return + nuker: Callable[[str], None] if os.path.isdir(name): import shutil kind, nuker = "directory", shutil.rmtree diff --git a/Lib/test/libregrtest/worker.py b/Lib/test/libregrtest/worker.py index 168803c5d9451f..b93670c1c28e8e 100644 --- a/Lib/test/libregrtest/worker.py +++ b/Lib/test/libregrtest/worker.py @@ -1,7 +1,7 @@ import subprocess import sys import os -from typing import NoReturn +from typing import Any, NoReturn from test import support from test.support import os_helper @@ -45,7 +45,7 @@ def create_worker_process(runtests: RunTests, output_fd: int, # Running the child from the same working directory as regrtest's original # invocation ensures that TEMPDIR for the child is the same when # sysconfig.is_python_build() is true. See issue 15300. - kwargs = dict( + kwargs: dict[str, Any] = dict( env=env, stdout=output_fd, # bpo-45410: Write stderr into stdout to keep messages order From d7dc3d9455de93310ccde13ceafe84d426790a5c Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Thu, 14 Sep 2023 23:38:31 +0300 Subject: [PATCH 210/357] gh-109418: Fix hypothesis strategy for b2a_roundtrip test (#109419) --- Lib/test/test_binascii.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py index 3d3e0746e9bfdf..ef744f6b97259c 100644 --- a/Lib/test/test_binascii.py +++ b/Lib/test/test_binascii.py @@ -230,7 +230,7 @@ def test_uu(self): binascii.b2a_uu(b"", True) @hypothesis.given( - binary=hypothesis.strategies.binary(), + binary=hypothesis.strategies.binary(max_size=45), backtick=hypothesis.strategies.booleans(), ) def test_b2a_roundtrip(self, binary, backtick): From e091b9f20fa8e409003af79f3c468b8225e6dcd3 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 14 Sep 2023 23:24:11 +0200 Subject: [PATCH 211/357] gh-109396: Fix test_socket.test_hmac_sha1() in FIPS mode (#109423) Use a longer key: FIPS mode requires at least of at least 112 bits. The previous key was only 32 bits. --- Lib/test/test_socket.py | 10 +++++++--- .../2023-09-14-22-58-47.gh-issue-109396.J1a4jR.rst | 3 +++ 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-14-22-58-47.gh-issue-109396.J1a4jR.rst diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index f35618e0281e70..99c4c5cbc4902d 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -6474,12 +6474,16 @@ def test_sha256(self): self.assertEqual(op.recv(512), expected) def test_hmac_sha1(self): - expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79") + # gh-109396: In FIPS mode, Linux 6.5 requires a key + # of at least 112 bits. Use a key of 152 bits. + key = b"Python loves AF_ALG" + data = b"what do ya want for nothing?" + expected = bytes.fromhex("193dbb43c6297b47ea6277ec0ce67119a3f3aa66") with self.create_alg('hash', 'hmac(sha1)') as algo: - algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe") + algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key) op, _ = algo.accept() with op: - op.sendall(b"what do ya want for nothing?") + op.sendall(data) self.assertEqual(op.recv(512), expected) # Although it should work with 3.19 and newer the test blocks on diff --git a/Misc/NEWS.d/next/Tests/2023-09-14-22-58-47.gh-issue-109396.J1a4jR.rst b/Misc/NEWS.d/next/Tests/2023-09-14-22-58-47.gh-issue-109396.J1a4jR.rst new file mode 100644 index 00000000000000..71150ecae76434 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-14-22-58-47.gh-issue-109396.J1a4jR.rst @@ -0,0 +1,3 @@ +Fix ``test_socket.test_hmac_sha1()`` in FIPS mode. Use a longer key: FIPS +mode requires at least of at least 112 bits. The previous key was only 32 +bits. Patch by Victor Stinner. From 68a6f21f47e779ddd70e33cf04d170a63f077fcd Mon Sep 17 00:00:00 2001 From: buermarc <44375277+buermarc@users.noreply.github.com> Date: Thu, 14 Sep 2023 23:31:30 +0200 Subject: [PATCH 212/357] gh-109375: Fix bug where pdb registers an alias without an associated command (#109376) --- Lib/pdb.py | 7 +++++-- Lib/test/test_pdb.py | 6 ++++++ Misc/ACKS | 1 + .../Library/2023-09-13-17-22-44.gh-issue-109375.ijJHZ9.rst | 1 + 4 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-13-17-22-44.gh-issue-109375.ijJHZ9.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index e231d3d7eae475..a391bc1df74d8e 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1753,8 +1753,11 @@ def do_alias(self, arg): for alias in keys: self.message("%s = %s" % (alias, self.aliases[alias])) return - if args[0] in self.aliases and len(args) == 1: - self.message("%s = %s" % (args[0], self.aliases[args[0]])) + if len(args) == 1: + if args[0] in self.aliases: + self.message("%s = %s" % (args[0], self.aliases[args[0]])) + else: + self.error(f"Unknown alias '{args[0]}'") else: self.aliases[args[0]] = ' '.join(args[1:]) diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index f337656121643c..8fed1d0f7162fd 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -664,8 +664,10 @@ def test_pdb_alias_command(): ... o.method() >>> with PdbTestInput([ # doctest: +ELLIPSIS + ... 'alias pi', ... 'alias pi for k in %1.__dict__.keys(): print(f"%1.{k} = {%1.__dict__[k]}")', ... 'alias ps pi self', + ... 'alias ps', ... 'pi o', ... 's', ... 'ps', @@ -674,8 +676,12 @@ def test_pdb_alias_command(): ... test_function() > (4)test_function() -> o.method() + (Pdb) alias pi + *** Unknown alias 'pi' (Pdb) alias pi for k in %1.__dict__.keys(): print(f"%1.{k} = {%1.__dict__[k]}") (Pdb) alias ps pi self + (Pdb) alias ps + ps = pi self (Pdb) pi o o.attr1 = 10 o.attr2 = str diff --git a/Misc/ACKS b/Misc/ACKS index e52208a41cc9f7..fd3c68b58a180c 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -254,6 +254,7 @@ Curtis Bucher Colm Buckley Erik de Bueger Jan-Hein Bührman +Marc Bürg Lars Buitinck Artem Bulgakov Dick Bulterman diff --git a/Misc/NEWS.d/next/Library/2023-09-13-17-22-44.gh-issue-109375.ijJHZ9.rst b/Misc/NEWS.d/next/Library/2023-09-13-17-22-44.gh-issue-109375.ijJHZ9.rst new file mode 100644 index 00000000000000..9b7a85d05f66ca --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-13-17-22-44.gh-issue-109375.ijJHZ9.rst @@ -0,0 +1 @@ +The :mod:`pdb` ``alias`` command now prevents registering aliases without arguments. From 74c72a2fc73941394839bd912c4814398b461446 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 15 Sep 2023 01:37:37 +0200 Subject: [PATCH 213/357] gh-109425: regrtest decodes worker stdout with backslashreplace (#109428) libregrtest now decodes stdout of test worker processes with the "backslashreplace" error handler to log corrupted stdout, instead of failing with an error and not logging the stdout. --- Lib/test/libregrtest/run_workers.py | 7 ++- Lib/test/test_regrtest.py | 43 ++++++++++++------- ...-09-14-23-27-40.gh-issue-109425.j-uFep.rst | 3 ++ 3 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-14-23-27-40.gh-issue-109425.j-uFep.rst diff --git a/Lib/test/libregrtest/run_workers.py b/Lib/test/libregrtest/run_workers.py index b973793b2066d2..89cc50b7c158d2 100644 --- a/Lib/test/libregrtest/run_workers.py +++ b/Lib/test/libregrtest/run_workers.py @@ -218,7 +218,12 @@ def create_stdout(self, stack: contextlib.ExitStack) -> TextIO: # gh-94026: Write stdout+stderr to a tempfile as workaround for # non-blocking pipes on Emscripten with NodeJS. - stdout_file = tempfile.TemporaryFile('w+', encoding=encoding) + # gh-109425: Use "backslashreplace" error handler: log corrupted + # stdout+stderr, instead of failing with a UnicodeDecodeError and not + # logging stdout+stderr at all. + stdout_file = tempfile.TemporaryFile('w+', + encoding=encoding, + errors='backslashreplace') stack.enter_context(stdout_file) return stdout_file diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 55cf9e7f020721..408e667fffa0f0 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -421,10 +421,12 @@ def regex_search(self, regex, output): self.fail("%r not found in %r" % (regex, output)) return match - def check_line(self, output, regex, full=False): + def check_line(self, output, pattern, full=False, regex=True): + if not regex: + pattern = re.escape(pattern) if full: - regex += '\n' - regex = re.compile(r'^' + regex, re.MULTILINE) + pattern += '\n' + regex = re.compile(r'^' + pattern, re.MULTILINE) self.assertRegex(output, regex) def parse_executed_tests(self, output): @@ -1755,9 +1757,8 @@ def test_leak_tmp_file(self): f"files (1): mytmpfile", output) - def test_mp_decode_error(self): - # gh-101634: If a worker stdout cannot be decoded, report a failed test - # and a non-zero exit code. + def test_worker_decode_error(self): + # gh-109425: Use "backslashreplace" error handler to decode stdout. if sys.platform == 'win32': encoding = locale.getencoding() else: @@ -1767,29 +1768,41 @@ def test_mp_decode_error(self): if encoding is None: self.skipTest("cannot get regrtest worker encoding") - nonascii = b"byte:\xa0\xa9\xff\n" + nonascii = bytes(ch for ch in range(128, 256)) + corrupted_output = b"nonascii:%s\n" % (nonascii,) + # gh-108989: On Windows, assertion errors are written in UTF-16: when + # decoded each letter is follow by a NUL character. + assertion_failed = 'Assertion failed: tstate_is_alive(tstate)\n' + corrupted_output += assertion_failed.encode('utf-16-le') try: - nonascii.decode(encoding) + corrupted_output.decode(encoding) except UnicodeDecodeError: pass else: - self.skipTest(f"{encoding} can decode non-ASCII bytes {nonascii!a}") + self.skipTest(f"{encoding} can decode non-ASCII bytes") + + expected_line = corrupted_output.decode(encoding, 'backslashreplace') code = textwrap.dedent(fr""" import sys + import unittest + + class Tests(unittest.TestCase): + def test_pass(self): + pass + # bytes which cannot be decoded from UTF-8 - nonascii = {nonascii!a} - sys.stdout.buffer.write(nonascii) + corrupted_output = {corrupted_output!a} + sys.stdout.buffer.write(corrupted_output) sys.stdout.buffer.flush() """) testname = self.create_test(code=code) - output = self.run_tests("--fail-env-changed", "-v", "-j1", testname, - exitcode=EXITCODE_BAD_TEST) + output = self.run_tests("--fail-env-changed", "-v", "-j1", testname) self.check_executed_tests(output, [testname], - failed=[testname], parallel=True, - stats=0) + stats=1) + self.check_line(output, expected_line, regex=False) def test_doctest(self): code = textwrap.dedent(r''' diff --git a/Misc/NEWS.d/next/Tests/2023-09-14-23-27-40.gh-issue-109425.j-uFep.rst b/Misc/NEWS.d/next/Tests/2023-09-14-23-27-40.gh-issue-109425.j-uFep.rst new file mode 100644 index 00000000000000..bfe18569ae97f3 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-14-23-27-40.gh-issue-109425.j-uFep.rst @@ -0,0 +1,3 @@ +libregrtest now decodes stdout of test worker processes with the +"backslashreplace" error handler to log corrupted stdout, instead of failing +with an error and not logging the stdout. Patch by Victor Stinner. From fa493900fbf19cbfac44164f3d8acb4f598ff3c1 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 14 Sep 2023 23:27:47 -0600 Subject: [PATCH 214/357] gh-109395: Remove skipped coverage job from Azure Pipelines (#109412) --- .azure-pipelines/ci.yml | 30 ------------------- .azure-pipelines/posix-steps.yml | 50 ++++++-------------------------- .azure-pipelines/pr.yml | 30 ------------------- 3 files changed, 9 insertions(+), 101 deletions(-) diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index 63252a76abb69f..ad1576a88fdff7 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -1,6 +1,3 @@ -variables: - coverage: false - trigger: ['main', '3.11', '3.10', '3.9', '3.8', '3.7'] jobs: @@ -51,33 +48,6 @@ jobs: dependencies: apt -- job: Ubuntu_Coverage_CI_Tests - displayName: Ubuntu CI Tests (coverage) - dependsOn: Prebuild - condition: | - and( - and( - succeeded(), - eq(variables['coverage'], 'true') - ), - eq(dependencies.Prebuild.outputs['tests.run'], 'true') - ) - - pool: - vmImage: ubuntu-22.04 - - variables: - testRunTitle: '$(Build.SourceBranchName)-linux-coverage' - testRunPlatform: linux-coverage - openssl_version: 1.1.1u - - steps: - - template: ./posix-steps.yml - parameters: - dependencies: apt - coverage: true - - - job: Windows_CI_Tests displayName: Windows CI Tests dependsOn: Prebuild diff --git a/.azure-pipelines/posix-steps.yml b/.azure-pipelines/posix-steps.yml index 9d7c5e1279f46d..65c29f60413d6a 100644 --- a/.azure-pipelines/posix-steps.yml +++ b/.azure-pipelines/posix-steps.yml @@ -1,5 +1,4 @@ parameters: - coverage: false sudo_dependencies: sudo dependencies: apt patchcheck: true @@ -23,47 +22,16 @@ steps: - script: make -j4 displayName: 'Build CPython' -- ${{ if eq(parameters.coverage, 'true') }}: - - script: ./python -m venv venv && ./venv/bin/python -m pip install -U coverage - displayName: 'Set up virtual environment' +- script: make pythoninfo + displayName: 'Display build info' - - script: ./venv/bin/python -m test.pythoninfo - displayName: 'Display build info' - - - script: | - $COMMAND -m coverage run --pylib -m test \ - --fail-env-changed \ - -uall,-cpu \ - --junit-xml=$(build.binariesDirectory)/test-results.xml \ - -x test_multiprocessing_fork \ - -x test_multiprocessing_forkserver \ - -x test_multiprocessing_spawn \ - -x test_concurrent_futures - displayName: 'Tests with coverage' - env: - ${{ if eq(parameters.xvfb, 'true') }}: - COMMAND: xvfb-run ./venv/bin/python - ${{ if ne(parameters.xvfb, 'true') }}: - COMMAND: ./venv/bin/python - - - script: ./venv/bin/python -m coverage xml - displayName: 'Generate coverage.xml' - - - script: source ./venv/bin/activate && bash <(curl -s https://codecov.io/bash) -y .github/codecov.yml - displayName: 'Publish code coverage results' - - -- ${{ if ne(parameters.coverage, 'true') }}: - - script: make pythoninfo - displayName: 'Display build info' - - - script: $COMMAND buildbottest TESTOPTS="-j4 -uall,-cpu --junit-xml=$(build.binariesDirectory)/test-results.xml" - displayName: 'Tests' - env: - ${{ if eq(parameters.xvfb, 'true') }}: - COMMAND: xvfb-run make - ${{ if ne(parameters.xvfb, 'true') }}: - COMMAND: make +- script: $COMMAND buildbottest TESTOPTS="-j4 -uall,-cpu --junit-xml=$(build.binariesDirectory)/test-results.xml" + displayName: 'Tests' + env: + ${{ if eq(parameters.xvfb, 'true') }}: + COMMAND: xvfb-run make + ${{ if ne(parameters.xvfb, 'true') }}: + COMMAND: make - ${{ if eq(parameters.patchcheck, 'true') }}: - script: | diff --git a/.azure-pipelines/pr.yml b/.azure-pipelines/pr.yml index 939c9b4249a3c2..5f052368a469c7 100644 --- a/.azure-pipelines/pr.yml +++ b/.azure-pipelines/pr.yml @@ -1,6 +1,3 @@ -variables: - coverage: false - pr: ['main', '3.11', '3.10', '3.9', '3.8', '3.7'] jobs: @@ -53,33 +50,6 @@ jobs: dependencies: apt -- job: Ubuntu_Coverage_PR_Tests - displayName: Ubuntu PR Tests (coverage) - dependsOn: Prebuild - condition: | - and( - and( - succeeded(), - eq(variables['coverage'], 'true') - ), - eq(dependencies.Prebuild.outputs['tests.run'], 'true') - ) - - pool: - vmImage: ubuntu-22.04 - - variables: - testRunTitle: '$(Build.SourceBranchName)-linux-coverage' - testRunPlatform: linux-coverage - openssl_version: 1.1.1u - - steps: - - template: ./posix-steps.yml - parameters: - dependencies: apt - coverage: true - - - job: Windows_PR_Tests displayName: Windows PR Tests dependsOn: Prebuild From 82505dc351b2f7e37aa395218709b432d83292cd Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Fri, 15 Sep 2023 10:52:24 +0300 Subject: [PATCH 215/357] gh-108303: Move `test_future` into its own test_future_stmt subdir (#109368) --- Lib/test/libregrtest/findtests.py | 1 + Lib/test/test_future_stmt/__init__.py | 6 +++ .../badsyntax_future10.py | 0 .../badsyntax_future3.py | 0 .../badsyntax_future4.py | 0 .../badsyntax_future5.py | 0 .../badsyntax_future6.py | 0 .../badsyntax_future7.py | 0 .../badsyntax_future8.py | 0 .../badsyntax_future9.py | 0 .../{ => test_future_stmt}/future_test1.py | 0 .../{ => test_future_stmt}/future_test2.py | 0 .../{ => test_future_stmt}/test_future.py | 48 +++++++++++-------- .../test_future_flags.py} | 0 .../test_future_multiple_features.py} | 0 .../test_future_multiple_imports.py} | 0 .../test_future_single_import.py} | 0 Makefile.pre.in | 1 + 18 files changed, 37 insertions(+), 19 deletions(-) create mode 100644 Lib/test/test_future_stmt/__init__.py rename Lib/test/{ => test_future_stmt}/badsyntax_future10.py (100%) rename Lib/test/{ => test_future_stmt}/badsyntax_future3.py (100%) rename Lib/test/{ => test_future_stmt}/badsyntax_future4.py (100%) rename Lib/test/{ => test_future_stmt}/badsyntax_future5.py (100%) rename Lib/test/{ => test_future_stmt}/badsyntax_future6.py (100%) rename Lib/test/{ => test_future_stmt}/badsyntax_future7.py (100%) rename Lib/test/{ => test_future_stmt}/badsyntax_future8.py (100%) rename Lib/test/{ => test_future_stmt}/badsyntax_future9.py (100%) rename Lib/test/{ => test_future_stmt}/future_test1.py (100%) rename Lib/test/{ => test_future_stmt}/future_test2.py (100%) rename Lib/test/{ => test_future_stmt}/test_future.py (91%) rename Lib/test/{test___future__.py => test_future_stmt/test_future_flags.py} (100%) rename Lib/test/{test_future5.py => test_future_stmt/test_future_multiple_features.py} (100%) rename Lib/test/{test_future4.py => test_future_stmt/test_future_multiple_imports.py} (100%) rename Lib/test/{test_future3.py => test_future_stmt/test_future_single_import.py} (100%) diff --git a/Lib/test/libregrtest/findtests.py b/Lib/test/libregrtest/findtests.py index 6f554addc104fd..60f21980c10dd0 100644 --- a/Lib/test/libregrtest/findtests.py +++ b/Lib/test/libregrtest/findtests.py @@ -18,6 +18,7 @@ SPLITTESTDIRS: set[TestName] = { "test_asyncio", "test_concurrent_futures", + "test_future_stmt", "test_multiprocessing_fork", "test_multiprocessing_forkserver", "test_multiprocessing_spawn", diff --git a/Lib/test/test_future_stmt/__init__.py b/Lib/test/test_future_stmt/__init__.py new file mode 100644 index 00000000000000..f2a39a3fe29c7f --- /dev/null +++ b/Lib/test/test_future_stmt/__init__.py @@ -0,0 +1,6 @@ +import os +from test import support + + +def load_tests(*args): + return support.load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/badsyntax_future10.py b/Lib/test/test_future_stmt/badsyntax_future10.py similarity index 100% rename from Lib/test/badsyntax_future10.py rename to Lib/test/test_future_stmt/badsyntax_future10.py diff --git a/Lib/test/badsyntax_future3.py b/Lib/test/test_future_stmt/badsyntax_future3.py similarity index 100% rename from Lib/test/badsyntax_future3.py rename to Lib/test/test_future_stmt/badsyntax_future3.py diff --git a/Lib/test/badsyntax_future4.py b/Lib/test/test_future_stmt/badsyntax_future4.py similarity index 100% rename from Lib/test/badsyntax_future4.py rename to Lib/test/test_future_stmt/badsyntax_future4.py diff --git a/Lib/test/badsyntax_future5.py b/Lib/test/test_future_stmt/badsyntax_future5.py similarity index 100% rename from Lib/test/badsyntax_future5.py rename to Lib/test/test_future_stmt/badsyntax_future5.py diff --git a/Lib/test/badsyntax_future6.py b/Lib/test/test_future_stmt/badsyntax_future6.py similarity index 100% rename from Lib/test/badsyntax_future6.py rename to Lib/test/test_future_stmt/badsyntax_future6.py diff --git a/Lib/test/badsyntax_future7.py b/Lib/test/test_future_stmt/badsyntax_future7.py similarity index 100% rename from Lib/test/badsyntax_future7.py rename to Lib/test/test_future_stmt/badsyntax_future7.py diff --git a/Lib/test/badsyntax_future8.py b/Lib/test/test_future_stmt/badsyntax_future8.py similarity index 100% rename from Lib/test/badsyntax_future8.py rename to Lib/test/test_future_stmt/badsyntax_future8.py diff --git a/Lib/test/badsyntax_future9.py b/Lib/test/test_future_stmt/badsyntax_future9.py similarity index 100% rename from Lib/test/badsyntax_future9.py rename to Lib/test/test_future_stmt/badsyntax_future9.py diff --git a/Lib/test/future_test1.py b/Lib/test/test_future_stmt/future_test1.py similarity index 100% rename from Lib/test/future_test1.py rename to Lib/test/test_future_stmt/future_test1.py diff --git a/Lib/test/future_test2.py b/Lib/test/test_future_stmt/future_test2.py similarity index 100% rename from Lib/test/future_test2.py rename to Lib/test/test_future_stmt/future_test2.py diff --git a/Lib/test/test_future.py b/Lib/test/test_future_stmt/test_future.py similarity index 91% rename from Lib/test/test_future.py rename to Lib/test/test_future_stmt/test_future.py index 4730bfafbd9cfe..8e67bcd72c91c5 100644 --- a/Lib/test/test_future.py +++ b/Lib/test/test_future_stmt/test_future.py @@ -25,57 +25,71 @@ def check_syntax_error(self, err, basename, lineno, offset=1): self.assertEqual(err.offset, offset) def test_future1(self): - with import_helper.CleanImport('future_test1'): - from test import future_test1 + with import_helper.CleanImport('test.test_future_stmt.future_test1'): + from test.test_future_stmt import future_test1 self.assertEqual(future_test1.result, 6) def test_future2(self): - with import_helper.CleanImport('future_test2'): - from test import future_test2 + with import_helper.CleanImport('test.test_future_stmt.future_test2'): + from test.test_future_stmt import future_test2 self.assertEqual(future_test2.result, 6) - def test_future3(self): - with import_helper.CleanImport('test_future3'): - from test import test_future3 + def test_future_single_import(self): + with import_helper.CleanImport( + 'test.test_future_stmt.test_future_single_import', + ): + from test.test_future_stmt import test_future_single_import + + def test_future_multiple_imports(self): + with import_helper.CleanImport( + 'test.test_future_stmt.test_future_multiple_imports', + ): + from test.test_future_stmt import test_future_multiple_imports + + def test_future_multiple_features(self): + with import_helper.CleanImport( + "test.test_future_stmt.test_future_multiple_features", + ): + from test.test_future_stmt import test_future_multiple_features def test_badfuture3(self): with self.assertRaises(SyntaxError) as cm: - from test import badsyntax_future3 + from test.test_future_stmt import badsyntax_future3 self.check_syntax_error(cm.exception, "badsyntax_future3", 3) def test_badfuture4(self): with self.assertRaises(SyntaxError) as cm: - from test import badsyntax_future4 + from test.test_future_stmt import badsyntax_future4 self.check_syntax_error(cm.exception, "badsyntax_future4", 3) def test_badfuture5(self): with self.assertRaises(SyntaxError) as cm: - from test import badsyntax_future5 + from test.test_future_stmt import badsyntax_future5 self.check_syntax_error(cm.exception, "badsyntax_future5", 4) def test_badfuture6(self): with self.assertRaises(SyntaxError) as cm: - from test import badsyntax_future6 + from test.test_future_stmt import badsyntax_future6 self.check_syntax_error(cm.exception, "badsyntax_future6", 3) def test_badfuture7(self): with self.assertRaises(SyntaxError) as cm: - from test import badsyntax_future7 + from test.test_future_stmt import badsyntax_future7 self.check_syntax_error(cm.exception, "badsyntax_future7", 3, 54) def test_badfuture8(self): with self.assertRaises(SyntaxError) as cm: - from test import badsyntax_future8 + from test.test_future_stmt import badsyntax_future8 self.check_syntax_error(cm.exception, "badsyntax_future8", 3) def test_badfuture9(self): with self.assertRaises(SyntaxError) as cm: - from test import badsyntax_future9 + from test.test_future_stmt import badsyntax_future9 self.check_syntax_error(cm.exception, "badsyntax_future9", 3) def test_badfuture10(self): with self.assertRaises(SyntaxError) as cm: - from test import badsyntax_future10 + from test.test_future_stmt import badsyntax_future10 self.check_syntax_error(cm.exception, "badsyntax_future10", 3) def test_ensure_flags_dont_clash(self): @@ -113,10 +127,6 @@ def test_parserhack(self): else: self.fail("syntax error didn't occur") - def test_multiple_features(self): - with import_helper.CleanImport("test.test_future5"): - from test import test_future5 - def test_unicode_literals_exec(self): scope = {} exec("from __future__ import unicode_literals; x = ''", {}, scope) diff --git a/Lib/test/test___future__.py b/Lib/test/test_future_stmt/test_future_flags.py similarity index 100% rename from Lib/test/test___future__.py rename to Lib/test/test_future_stmt/test_future_flags.py diff --git a/Lib/test/test_future5.py b/Lib/test/test_future_stmt/test_future_multiple_features.py similarity index 100% rename from Lib/test/test_future5.py rename to Lib/test/test_future_stmt/test_future_multiple_features.py diff --git a/Lib/test/test_future4.py b/Lib/test/test_future_stmt/test_future_multiple_imports.py similarity index 100% rename from Lib/test/test_future4.py rename to Lib/test/test_future_stmt/test_future_multiple_imports.py diff --git a/Lib/test/test_future3.py b/Lib/test/test_future_stmt/test_future_single_import.py similarity index 100% rename from Lib/test/test_future3.py rename to Lib/test/test_future_stmt/test_future_single_import.py diff --git a/Makefile.pre.in b/Makefile.pre.in index 922c9d7598003b..ba35e1b563ce26 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -2160,6 +2160,7 @@ TESTSUBDIRS= idlelib/idle_test \ test/test_dataclasses \ test/test_email \ test/test_email/data \ + test/test_future_stmt \ test/test_import \ test/test_import/data \ test/test_import/data/circular_imports \ From 1ece084be3684e06101aa1efa82d3ed98c99c432 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Fri, 15 Sep 2023 11:55:09 +0300 Subject: [PATCH 216/357] gh-109395: Remove skipped macOS builds from Azure Pipelines (#109400) --- .azure-pipelines/ci.yml | 18 ------------------ .azure-pipelines/macos-steps.yml | 27 --------------------------- .azure-pipelines/pr.yml | 20 -------------------- 3 files changed, 65 deletions(-) delete mode 100644 .azure-pipelines/macos-steps.yml diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index ad1576a88fdff7..246e059f5d1842 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -11,24 +11,6 @@ jobs: - template: ./prebuild-checks.yml -- job: macOS_CI_Tests - displayName: macOS CI Tests - dependsOn: Prebuild - #condition: and(succeeded(), eq(dependencies.Prebuild.outputs['tests.run'], 'true')) - # bpo-39837: macOS tests on Azure Pipelines are disabled - condition: false - - variables: - testRunTitle: '$(build.sourceBranchName)-macos' - testRunPlatform: macos - - pool: - vmImage: macos-10.15 - - steps: - - template: ./macos-steps.yml - - - job: Ubuntu_CI_Tests displayName: Ubuntu CI Tests dependsOn: Prebuild diff --git a/.azure-pipelines/macos-steps.yml b/.azure-pipelines/macos-steps.yml deleted file mode 100644 index fa38a0df8c87b8..00000000000000 --- a/.azure-pipelines/macos-steps.yml +++ /dev/null @@ -1,27 +0,0 @@ -steps: -- checkout: self - clean: true - fetchDepth: 5 - -- script: ./configure --with-pydebug --with-openssl=/usr/local/opt/openssl --prefix=/opt/python-azdev - displayName: 'Configure CPython (debug)' - -- script: make -j4 - displayName: 'Build CPython' - -- script: make pythoninfo - displayName: 'Display build info' - -- script: make buildbottest TESTOPTS="-j4 -uall,-cpu --junit-xml=$(build.binariesDirectory)/test-results.xml" - displayName: 'Tests' - continueOnError: true - timeoutInMinutes: 30 - -- task: PublishTestResults@2 - displayName: 'Publish Test Results' - inputs: - testResultsFiles: '$(build.binariesDirectory)/test-results.xml' - mergeTestResults: true - testRunTitle: $(testRunTitle) - platform: $(testRunPlatform) - condition: succeededOrFailed() diff --git a/.azure-pipelines/pr.yml b/.azure-pipelines/pr.yml index 5f052368a469c7..0836c780c1cf95 100644 --- a/.azure-pipelines/pr.yml +++ b/.azure-pipelines/pr.yml @@ -11,26 +11,6 @@ jobs: - template: ./prebuild-checks.yml -- job: macOS_PR_Tests - displayName: macOS PR Tests - dependsOn: Prebuild - #condition: and(succeeded(), eq(dependencies.Prebuild.outputs['tests.run'], 'true')) - # bpo-39837: macOS tests on Azure Pipelines are disabled - condition: false - - variables: - testRunTitle: '$(system.pullRequest.TargetBranch)-macos' - testRunPlatform: macos - - pool: - vmImage: macos-10.15 - - steps: - - template: ./macos-steps.yml - parameters: - targetBranch: $(System.PullRequest.TargetBranch) - - - job: Ubuntu_PR_Tests displayName: Ubuntu PR Tests dependsOn: Prebuild From b434dd7e3625d442392b4adf952685c8adf769f7 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Fri, 15 Sep 2023 06:56:23 -0600 Subject: [PATCH 217/357] Docs: Superseded modules: list only module names (#109439) --- Doc/library/superseded.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/Doc/library/superseded.rst b/Doc/library/superseded.rst index bd17039bc6f6b6..d43e2e530e430b 100644 --- a/Doc/library/superseded.rst +++ b/Doc/library/superseded.rst @@ -9,5 +9,6 @@ backwards compatibility. They have been superseded by other modules. .. toctree:: + :maxdepth: 1 optparse.rst From 5eec58a9e57383128ade7b527965b1efc474735b Mon Sep 17 00:00:00 2001 From: Christopher Yeh Date: Fri, 15 Sep 2023 06:05:19 -0700 Subject: [PATCH 218/357] Fix date.__repr__() docstring (#109422) --- Lib/_pydatetime.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/Lib/_pydatetime.py b/Lib/_pydatetime.py index 4ffef65c577e1f..88275481e7002b 100644 --- a/Lib/_pydatetime.py +++ b/Lib/_pydatetime.py @@ -1015,13 +1015,9 @@ def fromisocalendar(cls, year, week, day): def __repr__(self): """Convert to formal string, for repr(). - >>> dt = datetime(2010, 1, 1) - >>> repr(dt) - 'datetime.datetime(2010, 1, 1, 0, 0)' - - >>> dt = datetime(2010, 1, 1, tzinfo=timezone.utc) - >>> repr(dt) - 'datetime.datetime(2010, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)' + >>> d = date(2010, 1, 1) + >>> repr(d) + 'datetime.date(2010, 1, 1)' """ return "%s.%s(%d, %d, %d)" % (_get_class_module(self), self.__class__.__qualname__, From 47af18859385fd996bf7f8fa4b33600c59a6d626 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Fri, 15 Sep 2023 16:10:48 +0300 Subject: [PATCH 219/357] Add missing `PyDoc_STR` calls (#109393) In files: * Modules/_ctypes/cfield.c * Modules/_struct.c * Objects/dictobject.c * Objects/typevarobject.c * Objects/unionobject.c --- Modules/_ctypes/cfield.c | 4 ++-- Modules/_struct.c | 4 ++-- Objects/dictobject.c | 2 +- Objects/typevarobject.c | 4 ++-- Objects/unionobject.c | 3 ++- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 128506a9eed920..bfb40e5c5393fc 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -250,8 +250,8 @@ PyCField_get_size(PyObject *self, void *data) } static PyGetSetDef PyCField_getset[] = { - { "offset", PyCField_get_offset, NULL, "offset in bytes of this field" }, - { "size", PyCField_get_size, NULL, "size in bytes of this field" }, + { "offset", PyCField_get_offset, NULL, PyDoc_STR("offset in bytes of this field") }, + { "size", PyCField_get_size, NULL, PyDoc_STR("size in bytes of this field") }, { NULL, NULL, NULL, NULL }, }; diff --git a/Modules/_struct.c b/Modules/_struct.c index 1f8f9c44dd69aa..ff1bf4e96c5f21 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -2198,8 +2198,8 @@ static PyMemberDef s_members[] = { }; static PyGetSetDef s_getsetlist[] = { - {"format", (getter)s_get_format, (setter)NULL, "struct format string", NULL}, - {"size", (getter)s_get_size, (setter)NULL, "struct size in bytes", NULL}, + {"format", (getter)s_get_format, (setter)NULL, PyDoc_STR("struct format string"), NULL}, + {"size", (getter)s_get_size, (setter)NULL, PyDoc_STR("struct size in bytes"), NULL}, {NULL} /* sentinel */ }; diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 7cbc49f96994f7..329581c8692c40 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -4643,7 +4643,7 @@ dictview_mapping(PyObject *view, void *Py_UNUSED(ignored)) { static PyGetSetDef dictview_getset[] = { {"mapping", dictview_mapping, (setter)NULL, - "dictionary that this view refers to", NULL}, + PyDoc_STR("dictionary that this view refers to"), NULL}, {0} }; diff --git a/Objects/typevarobject.c b/Objects/typevarobject.c index 3adae3e14c9103..0f04523b0032ed 100644 --- a/Objects/typevarobject.c +++ b/Objects/typevarobject.c @@ -806,8 +806,8 @@ paramspec_kwargs(PyObject *self, void *unused) } static PyGetSetDef paramspec_getset[] = { - {"args", (getter)paramspec_args, NULL, "Represents positional arguments.", NULL}, - {"kwargs", (getter)paramspec_kwargs, NULL, "Represents keyword arguments.", NULL}, + {"args", (getter)paramspec_args, NULL, PyDoc_STR("Represents positional arguments."), NULL}, + {"kwargs", (getter)paramspec_kwargs, NULL, PyDoc_STR("Represents keyword arguments."), NULL}, {0}, }; diff --git a/Objects/unionobject.c b/Objects/unionobject.c index 347945a4c45972..3493ab3f240abc 100644 --- a/Objects/unionobject.c +++ b/Objects/unionobject.c @@ -331,7 +331,8 @@ union_parameters(PyObject *self, void *Py_UNUSED(unused)) } static PyGetSetDef union_properties[] = { - {"__parameters__", union_parameters, (setter)NULL, "Type variables in the types.UnionType.", NULL}, + {"__parameters__", union_parameters, (setter)NULL, + PyDoc_STR("Type variables in the types.UnionType."), NULL}, {0} }; From a7a079798d1c3542ecbb041a868429d515639e35 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 15 Sep 2023 08:39:05 -0700 Subject: [PATCH 220/357] gh-109287: Desugar inst(X) to op(X); macro(X) = X (#109294) This makes the internal representation in the code generator simpler: there's a list of ops, and a list of macros, and there's no special-casing needed for ops that aren't macros. (There's now special-casing for ops that are also macros, but that's simpler.) --- Include/internal/pycore_opcode_metadata.h | 20 +- Tools/cases_generator/analysis.py | 37 ++-- Tools/cases_generator/generate_cases.py | 212 ++++++++-------------- Tools/cases_generator/instructions.py | 2 - Tools/cases_generator/stacking.py | 2 + 5 files changed, 110 insertions(+), 163 deletions(-) diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index 856c3acb284b23..bb37e9a1d1b6b6 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -170,6 +170,8 @@ int _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 2; case BINARY_OP_ADD_UNICODE: return 2; + case _BINARY_OP_INPLACE_ADD_UNICODE: + return 2; case BINARY_OP_INPLACE_ADD_UNICODE: return 2; case BINARY_SUBSCR: @@ -430,6 +432,8 @@ int _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 0; case _ITER_CHECK_LIST: return 1; + case _ITER_JUMP_LIST: + return 1; case _IS_ITER_EXHAUSTED_LIST: return 1; case _ITER_NEXT_LIST: @@ -438,6 +442,8 @@ int _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 1; case _ITER_CHECK_TUPLE: return 1; + case _ITER_JUMP_TUPLE: + return 1; case _IS_ITER_EXHAUSTED_TUPLE: return 1; case _ITER_NEXT_TUPLE: @@ -446,6 +452,8 @@ int _PyOpcode_num_popped(int opcode, int oparg, bool jump) { return 1; case _ITER_CHECK_RANGE: return 1; + case _ITER_JUMP_RANGE: + return 1; case _IS_ITER_EXHAUSTED_RANGE: return 1; case _ITER_NEXT_RANGE: @@ -702,6 +710,8 @@ int _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 1; case BINARY_OP_ADD_UNICODE: return 1; + case _BINARY_OP_INPLACE_ADD_UNICODE: + return 0; case BINARY_OP_INPLACE_ADD_UNICODE: return 0; case BINARY_SUBSCR: @@ -962,6 +972,8 @@ int _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 0; case _ITER_CHECK_LIST: return 1; + case _ITER_JUMP_LIST: + return 1; case _IS_ITER_EXHAUSTED_LIST: return 2; case _ITER_NEXT_LIST: @@ -970,6 +982,8 @@ int _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 2; case _ITER_CHECK_TUPLE: return 1; + case _ITER_JUMP_TUPLE: + return 1; case _IS_ITER_EXHAUSTED_TUPLE: return 2; case _ITER_NEXT_TUPLE: @@ -978,6 +992,8 @@ int _PyOpcode_num_pushed(int opcode, int oparg, bool jump) { return 2; case _ITER_CHECK_RANGE: return 1; + case _ITER_JUMP_RANGE: + return 1; case _IS_ITER_EXHAUSTED_RANGE: return 2; case _ITER_NEXT_RANGE: @@ -1905,11 +1921,11 @@ const uint8_t _PyOpcode_Caches[256] = { [COMPARE_OP] = 1, [POP_JUMP_IF_FALSE] = 1, [POP_JUMP_IF_TRUE] = 1, + [POP_JUMP_IF_NONE] = 1, + [POP_JUMP_IF_NOT_NONE] = 1, [FOR_ITER] = 1, [CALL] = 3, [BINARY_OP] = 1, - [POP_JUMP_IF_NONE] = 1, - [POP_JUMP_IF_NOT_NONE] = 1, [JUMP_BACKWARD] = 1, }; #endif // NEED_OPCODE_METADATA diff --git a/Tools/cases_generator/analysis.py b/Tools/cases_generator/analysis.py index 9e0124bd90878e..b920c0aa8c1c8a 100644 --- a/Tools/cases_generator/analysis.py +++ b/Tools/cases_generator/analysis.py @@ -94,13 +94,8 @@ def parse(self) -> None: self.parse_file(filename, instrs_idx) files = " + ".join(self.input_filenames) - n_instrs = 0 - n_ops = 0 - for instr in self.instrs.values(): - if instr.kind == "op": - n_ops += 1 - else: - n_instrs += 1 + n_instrs = len(set(self.instrs) & set(self.macros)) + n_ops = len(self.instrs) - n_instrs print( f"Read {n_instrs} instructions, {n_ops} ops, " f"{len(self.macros)} macros, {len(self.pseudos)} pseudos, " @@ -145,6 +140,9 @@ def parse_file(self, filename: str, instrs_idx: dict[str, int]) -> None: match thing: case parsing.InstDef(name=name): + macro: parsing.Macro | None = None + if thing.kind == "inst": + macro = parsing.Macro(name, [parsing.OpName(name)]) if name in self.instrs: if not thing.override: raise psr.make_syntax_error( @@ -152,9 +150,12 @@ def parse_file(self, filename: str, instrs_idx: dict[str, int]) -> None: f"previous definition @ {self.instrs[name].inst.context}", thing_first_token, ) - self.everything[ - instrs_idx[name] - ] = OverriddenInstructionPlaceHolder(name=name) + placeholder = OverriddenInstructionPlaceHolder(name=name) + self.everything[instrs_idx[name]] = placeholder + if macro is not None: + self.warning( + f"Overriding desugared {macro.name} may not work", thing + ) if name not in self.instrs and thing.override: raise psr.make_syntax_error( f"Definition of '{name}' @ {thing.context} is supposed to be " @@ -164,6 +165,9 @@ def parse_file(self, filename: str, instrs_idx: dict[str, int]) -> None: self.instrs[name] = Instruction(thing) instrs_idx[name] = len(self.everything) self.everything.append(thing) + if macro is not None: + self.macros[macro.name] = macro + self.everything.append(macro) case parsing.Macro(name): self.macros[name] = thing self.everything.append(thing) @@ -197,9 +201,9 @@ def find_predictions(self) -> None: for target in targets: if target_instr := self.instrs.get(target): target_instr.predicted = True - elif target_macro := self.macro_instrs.get(target): + if target_macro := self.macro_instrs.get(target): target_macro.predicted = True - else: + if not target_instr and not target_macro: self.error( f"Unknown instruction {target!r} predicted in {instr.name!r}", instr.inst, # TODO: Use better location @@ -263,11 +267,7 @@ def check_families(self) -> None: ) def effect_counts(self, name: str) -> tuple[int, int, int]: - if instr := self.instrs.get(name): - cache = instr.cache_offset - input = len(instr.input_effects) - output = len(instr.output_effects) - elif mac := self.macro_instrs.get(name): + if mac := self.macro_instrs.get(name): cache = mac.cache_offset input, output = 0, 0 for part in mac.parts: @@ -407,7 +407,8 @@ def check_macro_components( case parsing.OpName(name): if name not in self.instrs: self.error(f"Unknown instruction {name!r}", macro) - components.append(self.instrs[name]) + else: + components.append(self.instrs[name]) case parsing.CacheEffect(): components.append(uop) case _: diff --git a/Tools/cases_generator/generate_cases.py b/Tools/cases_generator/generate_cases.py index 3a738da6c05a51..5ddcd6ef7bf274 100644 --- a/Tools/cases_generator/generate_cases.py +++ b/Tools/cases_generator/generate_cases.py @@ -160,14 +160,9 @@ def effect_str(effects: list[StackEffect]) -> str: pushed: str | None = None match thing: case parsing.InstDef(): - if thing.kind != "op" or self.instrs[thing.name].is_viable_uop(): - instr = self.instrs[thing.name] - popped = effect_str(instr.input_effects) - pushed = effect_str(instr.output_effects) - else: - instr = None - popped = "" - pushed = "" + instr = self.instrs[thing.name] + popped = effect_str(instr.input_effects) + pushed = effect_str(instr.output_effects) case parsing.Macro(): instr = self.macro_instrs[thing.name] popped, pushed = stacking.get_stack_effect_info_for_macro(instr) @@ -208,6 +203,8 @@ def write_stack_effect_functions(self) -> None: for thing in self.everything: if isinstance(thing, OverriddenInstructionPlaceHolder): continue + if isinstance(thing, parsing.Macro) and thing.name in self.instrs: + continue instr, popped, pushed = self.get_stack_effect_info(thing) if instr is not None: popped_data.append((instr, popped)) @@ -255,15 +252,11 @@ def assign_opcode_ids(self) -> None: ops: list[tuple[bool, str]] = [] # (has_arg, name) for each opcode instrumented_ops: list[str] = [] - specialized_ops = set() + specialized_ops: set[str] = set() for name, family in self.families.items(): specialized_ops.update(family.members) - for instr in itertools.chain( - [instr for instr in self.instrs.values() if instr.kind != "op"], - self.macro_instrs.values(), - ): - assert isinstance(instr, (Instruction, MacroInstruction, PseudoInstruction)) + for instr in self.macro_instrs.values(): name = instr.name if name in specialized_ops: continue @@ -320,7 +313,7 @@ def map_op(op: int, name: str) -> None: while opname[next_opcode] is not None: next_opcode += 1 - assert next_opcode < min_internal + assert next_opcode < min_internal, next_opcode for i, op in enumerate(sorted(specialized_ops)): map_op(min_internal + i, op) @@ -421,13 +414,12 @@ def write_metadata(self, metadata_filename: str, pymetadata_filename: str) -> No self.write_provenance_header() - self.out.emit("\n" + textwrap.dedent(""" - #ifndef Py_BUILD_CORE - # error "this header requires Py_BUILD_CORE define" - #endif - """).strip()) - - self.out.emit("\n#include // bool") + self.out.emit("") + self.out.emit("#ifndef Py_BUILD_CORE") + self.out.emit('# error "this header requires Py_BUILD_CORE define"') + self.out.emit("#endif") + self.out.emit("") + self.out.emit("#include // bool") self.write_pseudo_instrs() @@ -498,7 +490,10 @@ def write_metadata(self, metadata_filename: str, pymetadata_filename: str) -> No case parsing.InstDef(): self.write_metadata_for_inst(self.instrs[thing.name]) case parsing.Macro(): - self.write_metadata_for_macro(self.macro_instrs[thing.name]) + if thing.name not in self.instrs: + self.write_metadata_for_macro( + self.macro_instrs[thing.name] + ) case parsing.Pseudo(): self.write_metadata_for_pseudo( self.pseudo_instrs[thing.name] @@ -513,35 +508,14 @@ def write_metadata(self, metadata_filename: str, pymetadata_filename: str) -> No ";", ): # Write macro expansion for each non-pseudo instruction - for thing in self.everything: - match thing: - case OverriddenInstructionPlaceHolder(): - pass - case parsing.InstDef(name=name): - instr = self.instrs[name] - # Since an 'op' is not a bytecode, it has no expansion; but 'inst' is - if instr.kind == "inst" and instr.is_viable_uop(): - # Construct a dummy Component -- input/output mappings are not used - part = Component(instr, instr.active_caches) - self.write_macro_expansions( - instr.name, [part], instr.cache_offset - ) - elif instr.kind == "inst" and variable_used( - instr.inst, "oparg1" - ): - assert variable_used( - instr.inst, "oparg2" - ), "Half super-instr?" - self.write_super_expansions(instr.name) - case parsing.Macro(): - mac = self.macro_instrs[thing.name] - self.write_macro_expansions( - mac.name, mac.parts, mac.cache_offset - ) - case parsing.Pseudo(): - pass - case _: - assert_never(thing) + for mac in self.macro_instrs.values(): + if is_super_instruction(mac): + # Special-case the heck out of super-instructions + self.write_super_expansions(mac.name) + else: + self.write_macro_expansions( + mac.name, mac.parts, mac.cache_offset + ) with self.metadata_item( "const char * const _PyOpcode_uop_name[OPCODE_UOP_NAME_SIZE]", "=", ";" @@ -564,19 +538,15 @@ def write_metadata(self, metadata_filename: str, pymetadata_filename: str) -> No family_member_names: set[str] = set() for family in self.families.values(): family_member_names.update(family.members) - for instr in self.instrs.values(): + for mac in self.macro_instrs.values(): if ( - instr.name not in family_member_names - and instr.cache_offset > 0 - and instr.kind == "inst" - and not instr.name.startswith("INSTRUMENTED_") + mac.cache_offset > 0 + and mac.name not in family_member_names + and not mac.name.startswith("INSTRUMENTED_") ): - self.out.emit(f"[{instr.name}] = {instr.cache_offset},") - for mac in self.macro_instrs.values(): - if mac.name not in family_member_names and mac.cache_offset > 0: self.out.emit(f"[{mac.name}] = {mac.cache_offset},") # Irregular case: - self.out.emit('[JUMP_BACKWARD] = 1,') + self.out.emit("[JUMP_BACKWARD] = 1,") deoptcodes = {} for name, op in self.opmap.items(): @@ -674,7 +644,8 @@ def add(name: str) -> None: add("_SET_IP") for instr in self.instrs.values(): - if instr.kind == "op": + # Skip ops that are also macros -- those are desugared inst()s + if instr.name not in self.macros: add(instr.name) def write_macro_expansions( @@ -693,10 +664,11 @@ def write_macro_expansions( # It is sometimes emitted for macros that have a # manual translation in translate_bytecode_to_trace() # in Python/optimizer.c. - self.note( - f"Part {part.instr.name} of {name} is not a viable uop", - part.instr.inst, - ) + if len(parts) > 1 or part.instr.name != name: + self.note( + f"Part {part.instr.name} of {name} is not a viable uop", + part.instr.inst, + ) return if not part.active_caches: if part.instr.name == "_SET_IP": @@ -792,31 +764,26 @@ def write_instructions( self.write_provenance_header() # Write and count instructions of all kinds - n_instrs = 0 n_macros = 0 for thing in self.everything: match thing: case OverriddenInstructionPlaceHolder(): self.write_overridden_instr_place_holder(thing) case parsing.InstDef(): - if thing.kind != "op": - n_instrs += 1 - self.write_instr(self.instrs[thing.name]) + pass case parsing.Macro(): n_macros += 1 mac = self.macro_instrs[thing.name] stacking.write_macro_instr( mac, self.out, self.families.get(mac.name) ) - # self.write_macro(self.macro_instrs[thing.name]) case parsing.Pseudo(): pass case _: assert_never(thing) print( - f"Wrote {n_instrs} instructions and {n_macros} macros " - f"to {output_filename}", + f"Wrote {n_macros} cases to {output_filename}", file=sys.stderr, ) @@ -824,41 +791,21 @@ def write_executor_instructions( self, executor_filename: str, emit_line_directives: bool ) -> None: """Generate cases for the Tier 2 interpreter.""" - n_instrs = 0 n_uops = 0 with open(executor_filename, "w") as f: self.out = Formatter(f, 8, emit_line_directives) self.write_provenance_header() - for thing in self.everything: - match thing: - case OverriddenInstructionPlaceHolder(): - # TODO: Is this helpful? - self.write_overridden_instr_place_holder(thing) - case parsing.InstDef(): - instr = self.instrs[thing.name] - if instr.is_viable_uop(): - if instr.kind == "op": - n_uops += 1 - else: - n_instrs += 1 - self.out.emit("") - with self.out.block(f"case {thing.name}:"): - stacking.write_single_instr( - instr, self.out, tier=TIER_TWO - ) - if instr.check_eval_breaker: - self.out.emit("CHECK_EVAL_BREAKER();") - self.out.emit("break;") - # elif instr.kind != "op": - # print(f"NOTE: {thing.name} is not a viable uop") - case parsing.Macro(): - pass - case parsing.Pseudo(): - pass - case _: - assert_never(thing) + for instr in self.instrs.values(): + if instr.is_viable_uop(): + n_uops += 1 + self.out.emit("") + with self.out.block(f"case {instr.name}:"): + stacking.write_single_instr(instr, self.out, tier=TIER_TWO) + if instr.check_eval_breaker: + self.out.emit("CHECK_EVAL_BREAKER();") + self.out.emit("break;") print( - f"Wrote {n_instrs} instructions and {n_uops} ops to {executor_filename}", + f"Wrote {n_uops} cases to {executor_filename}", file=sys.stderr, ) @@ -869,26 +816,16 @@ def write_abstract_interpreter_instructions( with open(abstract_interpreter_filename, "w") as f: self.out = Formatter(f, 8, emit_line_directives) self.write_provenance_header() - for thing in self.everything: - match thing: - case OverriddenInstructionPlaceHolder(): - pass - case parsing.InstDef(): - instr = AbstractInstruction(self.instrs[thing.name].inst) - if ( - instr.is_viable_uop() - and instr.name not in SPECIALLY_HANDLED_ABSTRACT_INSTR - ): - self.out.emit("") - with self.out.block(f"case {thing.name}:"): - instr.write(self.out, tier=TIER_TWO) - self.out.emit("break;") - case parsing.Macro(): - pass - case parsing.Pseudo(): - pass - case _: - assert_never(thing) + for instr in self.instrs.values(): + instr = AbstractInstruction(instr.inst) + if ( + instr.is_viable_uop() + and instr.name not in SPECIALLY_HANDLED_ABSTRACT_INSTR + ): + self.out.emit("") + with self.out.block(f"case {instr.name}:"): + instr.write(self.out, tier=TIER_TWO) + self.out.emit("break;") print( f"Wrote some stuff to {abstract_interpreter_filename}", file=sys.stderr, @@ -902,24 +839,17 @@ def write_overridden_instr_place_holder( f"{self.out.comment} TARGET({place_holder.name}) overridden by later definition" ) - def write_instr(self, instr: Instruction) -> None: - name = instr.name - self.out.emit("") - if instr.inst.override: - self.out.emit("{self.out.comment} Override") - with self.out.block(f"TARGET({name})"): - if instr.predicted: - self.out.emit(f"PREDICTED({name});") - self.out.static_assert_family_size( - instr.name, instr.family, instr.cache_offset - ) - stacking.write_single_instr(instr, self.out, tier=TIER_ONE) - if not instr.always_exits: - if instr.cache_offset: - self.out.emit(f"next_instr += {instr.cache_offset};") - if instr.check_eval_breaker: - self.out.emit("CHECK_EVAL_BREAKER();") - self.out.emit(f"DISPATCH();") + +def is_super_instruction(mac: MacroInstruction) -> bool: + if ( + len(mac.parts) == 1 + and isinstance(mac.parts[0], Component) + and variable_used(mac.parts[0].instr.inst, "oparg1") + ): + assert variable_used(mac.parts[0].instr.inst, "oparg2") + return True + else: + return False def main() -> None: diff --git a/Tools/cases_generator/instructions.py b/Tools/cases_generator/instructions.py index 78b3c290a49273..6fbf7d93f42fde 100644 --- a/Tools/cases_generator/instructions.py +++ b/Tools/cases_generator/instructions.py @@ -53,7 +53,6 @@ class Instruction: # Parts of the underlying instruction definition inst: parsing.InstDef - kind: typing.Literal["inst", "op"] name: str block: parsing.Block block_text: list[str] # Block.text, less curlies, less PREDICT() calls @@ -77,7 +76,6 @@ class Instruction: def __init__(self, inst: parsing.InstDef): self.inst = inst - self.kind = inst.kind self.name = inst.name self.block = inst.block self.block_text, self.check_eval_breaker, self.block_line = extract_block_text( diff --git a/Tools/cases_generator/stacking.py b/Tools/cases_generator/stacking.py index 9cf9ad1a6c9e6d..1f9fda66a5f034 100644 --- a/Tools/cases_generator/stacking.py +++ b/Tools/cases_generator/stacking.py @@ -376,6 +376,8 @@ def write_macro_instr( if not parts[-1].instr.always_exits: if not next_instr_is_set and mac.cache_offset: out.emit(f"next_instr += {mac.cache_offset};") + if parts[-1].instr.check_eval_breaker: + out.emit("CHECK_EVAL_BREAKER();") out.emit("DISPATCH();") From 8ea4ad4d2d856a109f98357ceea65dc64cfb1d27 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 15 Sep 2023 18:41:25 +0200 Subject: [PATCH 221/357] gh-91960: Disable Cirrus CI for now (#109457) Python is out of free credit and so all jobs are reported as failure. Rename .cirrus.yml to .cirrus-DISABLED.yml to disable the job. --- .cirrus.yml => .cirrus-DISABLED.yml | 3 +++ 1 file changed, 3 insertions(+) rename .cirrus.yml => .cirrus-DISABLED.yml (82%) diff --git a/.cirrus.yml b/.cirrus-DISABLED.yml similarity index 82% rename from .cirrus.yml rename to .cirrus-DISABLED.yml index ca41c2e9092fa6..f20835cb6cac2a 100644 --- a/.cirrus.yml +++ b/.cirrus-DISABLED.yml @@ -1,3 +1,6 @@ +# gh-91960: Job disabled since Python is out of free credit (September 2023): +# https://discuss.python.org/t/freebsd-gets-a-new-cirrus-ci-github-action-job-and-a-new-buildbot/33122/26 + freebsd_task: freebsd_instance: matrix: From 92ed7e4df1af84fb29e678d111e8561ffcd14581 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Fri, 15 Sep 2023 18:01:28 +0100 Subject: [PATCH 222/357] gh-109413: Fix some trivial mypy nitpicks in libregrtest (#109454) --- Lib/test/libregrtest/logger.py | 8 ++++---- Lib/test/libregrtest/results.py | 6 ++---- Lib/test/libregrtest/single.py | 8 ++++---- Lib/test/libregrtest/worker.py | 2 +- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Lib/test/libregrtest/logger.py b/Lib/test/libregrtest/logger.py index c397b21be84385..2f0c4bf1c84b5c 100644 --- a/Lib/test/libregrtest/logger.py +++ b/Lib/test/libregrtest/logger.py @@ -28,13 +28,13 @@ def log(self, line: str = '') -> None: line = f"load avg: {load_avg:.2f} {line}" # add the timestamp prefix: "0:01:05 " - test_time = time.perf_counter() - self.start_time + log_time = time.perf_counter() - self.start_time - mins, secs = divmod(int(test_time), 60) + mins, secs = divmod(int(log_time), 60) hours, mins = divmod(mins, 60) - test_time = "%d:%02d:%02d" % (hours, mins, secs) + formatted_log_time = "%d:%02d:%02d" % (hours, mins, secs) - line = f"{test_time} {line}" + line = f"{formatted_log_time} {line}" if empty: line = line[:-1] diff --git a/Lib/test/libregrtest/results.py b/Lib/test/libregrtest/results.py index f16b3373fd2afb..6e7d65880f7347 100644 --- a/Lib/test/libregrtest/results.py +++ b/Lib/test/libregrtest/results.py @@ -231,8 +231,7 @@ def display_summary(self, first_runtests: RunTests, filtered: bool): report.append(f'failures={stats.failures:,}') if stats.skipped: report.append(f'skipped={stats.skipped:,}') - report = ' '.join(report) - print(f"Total tests: {report}") + print(f"Total tests: {' '.join(report)}") # Total test files all_tests = [self.good, self.bad, self.rerun, @@ -256,5 +255,4 @@ def display_summary(self, first_runtests: RunTests, filtered: bool): ): if tests: report.append(f'{name}={len(tests)}') - report = ' '.join(report) - print(f"Total test files: {report}") + print(f"Total test files: {' '.join(report)}") diff --git a/Lib/test/libregrtest/single.py b/Lib/test/libregrtest/single.py index bc6021acb34aad..0304f858edf42c 100644 --- a/Lib/test/libregrtest/single.py +++ b/Lib/test/libregrtest/single.py @@ -136,14 +136,14 @@ def _runtest_env_changed_exc(result: TestResult, runtests: RunTests, with saved_test_environment(test_name, runtests.verbose, quiet, pgo=pgo): _load_run_test(result, runtests) - except support.ResourceDenied as msg: + except support.ResourceDenied as exc: if not quiet and not pgo: - print(f"{test_name} skipped -- {msg}", flush=True) + print(f"{test_name} skipped -- {exc}", flush=True) result.state = State.RESOURCE_DENIED return - except unittest.SkipTest as msg: + except unittest.SkipTest as exc: if not quiet and not pgo: - print(f"{test_name} skipped -- {msg}", flush=True) + print(f"{test_name} skipped -- {exc}", flush=True) result.state = State.SKIPPED return except support.TestFailedWithDetails as exc: diff --git a/Lib/test/libregrtest/worker.py b/Lib/test/libregrtest/worker.py index b93670c1c28e8e..610e0a8437839d 100644 --- a/Lib/test/libregrtest/worker.py +++ b/Lib/test/libregrtest/worker.py @@ -25,7 +25,7 @@ def create_worker_process(runtests: RunTests, output_fd: int, if python_cmd is not None: executable = python_cmd else: - executable = [sys.executable] + executable = (sys.executable,) cmd = [*executable, *support.args_from_interpreter_flags(), '-u', # Unbuffered stdout and stderr '-m', 'test.libregrtest.worker', From 3d881453d32101855cd083ef79641da5e437df3d Mon Sep 17 00:00:00 2001 From: Egil Martinsson Date: Fri, 15 Sep 2023 20:25:16 +0200 Subject: [PATCH 223/357] gh-109350: Fix outdated captured output in unittest.mock documentation (#109353) --- Doc/library/unittest.mock-examples.rst | 15 +++++++++------ Doc/library/unittest.mock.rst | 10 ++++++---- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/Doc/library/unittest.mock-examples.rst b/Doc/library/unittest.mock-examples.rst index 34f343ebacdbb7..f2bdde80bdbd64 100644 --- a/Doc/library/unittest.mock-examples.rst +++ b/Doc/library/unittest.mock-examples.rst @@ -339,7 +339,7 @@ instantiate the class in those tests. >>> mock.old_method() Traceback (most recent call last): ... - AttributeError: object has no attribute 'old_method' + AttributeError: Mock object has no attribute 'old_method'. Did you mean: 'class_method'? Using a specification also enables a smarter matching of calls made to the mock, regardless of whether some parameters were passed as positional or @@ -798,7 +798,8 @@ If your mock is only being called once you can use the >>> mock.foo_bar.assert_called_once_with('baz', spam='eggs') Traceback (most recent call last): ... - AssertionError: Expected to be called once. Called 2 times. + AssertionError: Expected 'foo_bar' to be called once. Called 2 times. + Calls: [call('baz', spam='eggs'), call()]. Both ``assert_called_with`` and ``assert_called_once_with`` make assertions about the *most recent* call. If your mock is going to be called several times, and @@ -927,8 +928,9 @@ Here's an example implementation: >>> c.assert_called_with(arg) Traceback (most recent call last): ... - AssertionError: Expected call: mock({1}) - Actual call: mock(set()) + AssertionError: expected call not found. + Expected: mock({1}) + Actual: mock(set()) >>> c.foo @@ -1292,8 +1294,9 @@ sufficient: >>> mock.assert_called_with(Foo(1, 2)) Traceback (most recent call last): ... - AssertionError: Expected: call(<__main__.Foo object at 0x...>) - Actual call: call(<__main__.Foo object at 0x...>) + AssertionError: expected call not found. + Expected: mock(<__main__.Foo object at 0x...>) + Actual: mock(<__main__.Foo object at 0x...>) A comparison function for our ``Foo`` class might look something like this: diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 836fd42ab71c81..1452276436099b 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -189,7 +189,7 @@ code if they are used incorrectly: >>> mock_function('wrong arguments') Traceback (most recent call last): ... - TypeError: () takes exactly 3 arguments (1 given) + TypeError: missing a required argument: 'b' :func:`create_autospec` can also be used on classes, where it copies the signature of the ``__init__`` method, and on callable objects where it copies the signature of @@ -315,6 +315,7 @@ the *new_callable* argument to :func:`patch`. Traceback (most recent call last): ... AssertionError: Expected 'method' to have been called once. Called 2 times. + Calls: [call(), call()]. .. versionadded:: 3.6 @@ -342,7 +343,7 @@ the *new_callable* argument to :func:`patch`. Traceback (most recent call last): ... AssertionError: Expected 'mock' to be called once. Called 2 times. - + Calls: [call('foo', bar='baz'), call('other', bar='values')]. .. method:: assert_any_call(*args, **kwargs) @@ -392,6 +393,7 @@ the *new_callable* argument to :func:`patch`. Traceback (most recent call last): ... AssertionError: Expected 'hello' to not have been called. Called 1 times. + Calls: [call()]. .. versionadded:: 3.5 @@ -954,7 +956,7 @@ object:: >>> asyncio.run(main()) >>> mock.assert_awaited_once() >>> asyncio.run(main()) - >>> mock.method.assert_awaited_once() + >>> mock.assert_awaited_once() Traceback (most recent call last): ... AssertionError: Expected mock to have been awaited once. Awaited 2 times. @@ -972,7 +974,7 @@ object:: >>> mock.assert_awaited_with('other') Traceback (most recent call last): ... - AssertionError: expected call not found. + AssertionError: expected await not found. Expected: mock('other') Actual: mock('foo', bar='bar') From 19f5effc27bc47d76b2f484a1fcb4ccdd7dc9d67 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 15 Sep 2023 16:10:46 -0400 Subject: [PATCH 224/357] GH-109373: Store metadata required for pystats comparison in the JSON (GH-109374) --- Tools/scripts/summarize_stats.py | 97 +++++++++++++++++++++----------- 1 file changed, 65 insertions(+), 32 deletions(-) diff --git a/Tools/scripts/summarize_stats.py b/Tools/scripts/summarize_stats.py index 484dfe8a2b7dbd..3b2bdd8015be4a 100644 --- a/Tools/scripts/summarize_stats.py +++ b/Tools/scripts/summarize_stats.py @@ -2,11 +2,14 @@ default stats folders. """ +# NOTE: Bytecode introspection modules (opcode, dis, etc.) should only +# happen when loading a single dataset. When comparing datasets, it +# could get it wrong, leading to subtle errors. + import argparse import collections import json import os.path -import opcode from datetime import date import itertools import sys @@ -28,6 +31,16 @@ def format_ratio(num, den): else: return f"{num/den:.01%}" +def percentage_to_float(s): + """ + Converts a percentage string to a float. The empty string is returned as 0.0 + """ + if s == "": + return 0.0 + else: + assert s[-1] == "%" + return float(s[:-1]) + def join_rows(a_rows, b_rows): """ Joins two tables together, side-by-side, where the first column in each is a @@ -164,7 +177,12 @@ def gather_stats(input): if os.path.isfile(input): with open(input, "r") as fd: - return json.load(fd) + stats = json.load(fd) + + stats["_stats_defines"] = {int(k): v for k, v in stats["_stats_defines"].items()} + stats["_defines"] = {int(k): v for k, v in stats["_defines"].items()} + return stats + elif os.path.isdir(input): stats = collections.Counter() for filename in os.listdir(input): @@ -179,6 +197,16 @@ def gather_stats(input): value = int(value) stats[key] += value stats['__nfiles__'] += 1 + + import opcode + + stats["_specialized_instructions"] = [ + op for op in opcode._specialized_opmap.keys() + if "__" not in op + ] + stats["_stats_defines"] = get_stats_defines() + stats["_defines"] = get_defines() + return stats else: raise ValueError(f"{input:r} is not a file or directory path") @@ -223,13 +251,10 @@ def kind_to_text(kind, defines, opname): return pretty(name[len(opname)+1:]) return "kind " + str(kind) -def categorized_counts(opcode_stats): +def categorized_counts(opcode_stats, specialized_instructions): basic = 0 specialized = 0 not_specialized = 0 - specialized_instructions = { - op for op in opcode._specialized_opmap.keys() - if "__" not in op} for name, opcode_stat in opcode_stats.items(): if "execution_count" not in opcode_stat: continue @@ -348,7 +373,7 @@ def emit_comparative_execution_counts( (opcode, base_entry[0], head_entry[0], f"{100*change:0.1f}%")) - rows.sort(key=lambda x: -abs(float(x[-1][:-1]))) + rows.sort(key=lambda x: -abs(percentage_to_float(x[-1]))) emit_table( ("Name", "Base Count:", "Head Count:", "Change:"), @@ -361,14 +386,12 @@ def get_defines(): defines = parse_kinds(spec_src) return defines -def emit_specialization_stats(opcode_stats): - defines = get_defines() +def emit_specialization_stats(opcode_stats, defines): with Section("Specialization stats", summary="specialization stats by family"): for name, opcode_stat in opcode_stats.items(): print_specialization_stats(name, opcode_stat, defines) -def emit_comparative_specialization_stats(base_opcode_stats, head_opcode_stats): - defines = get_defines() +def emit_comparative_specialization_stats(base_opcode_stats, head_opcode_stats, defines): with Section("Specialization stats", summary="specialization stats by family"): opcodes = set(base_opcode_stats.keys()) & set(head_opcode_stats.keys()) for opcode in opcodes: @@ -376,17 +399,21 @@ def emit_comparative_specialization_stats(base_opcode_stats, head_opcode_stats): opcode, base_opcode_stats[opcode], head_opcode_stats[opcode], defines ) -def calculate_specialization_effectiveness(opcode_stats, total): - basic, not_specialized, specialized = categorized_counts(opcode_stats) +def calculate_specialization_effectiveness( + opcode_stats, total, specialized_instructions +): + basic, not_specialized, specialized = categorized_counts( + opcode_stats, specialized_instructions + ) return [ ("Basic", basic, format_ratio(basic, total)), ("Not specialized", not_specialized, format_ratio(not_specialized, total)), ("Specialized", specialized, format_ratio(specialized, total)), ] -def emit_specialization_overview(opcode_stats, total): +def emit_specialization_overview(opcode_stats, total, specialized_instructions): with Section("Specialization effectiveness"): - rows = calculate_specialization_effectiveness(opcode_stats, total) + rows = calculate_specialization_effectiveness(opcode_stats, total, specialized_instructions) emit_table(("Instructions", "Count:", "Ratio:"), rows) for title, field in (("Deferred", "specialization.deferred"), ("Misses", "specialization.miss")): total = 0 @@ -404,10 +431,16 @@ def emit_specialization_overview(opcode_stats, total): rows = [ (name, count, format_ratio(count, total)) for (count, name) in counts[:10] ] emit_table(("Name", "Count:", "Ratio:"), rows) -def emit_comparative_specialization_overview(base_opcode_stats, base_total, head_opcode_stats, head_total): +def emit_comparative_specialization_overview( + base_opcode_stats, base_total, head_opcode_stats, head_total, specialized_instructions +): with Section("Specialization effectiveness"): - base_rows = calculate_specialization_effectiveness(base_opcode_stats, base_total) - head_rows = calculate_specialization_effectiveness(head_opcode_stats, head_total) + base_rows = calculate_specialization_effectiveness( + base_opcode_stats, base_total, specialized_instructions + ) + head_rows = calculate_specialization_effectiveness( + head_opcode_stats, head_total, specialized_instructions + ) emit_table( ("Instructions", "Base Count:", "Base Ratio:", "Head Count:", "Head Ratio:"), join_rows(base_rows, head_rows) @@ -419,8 +452,7 @@ def get_stats_defines(): defines = parse_kinds(stats_src, prefix="EVAL_CALL") return defines -def calculate_call_stats(stats): - defines = get_stats_defines() +def calculate_call_stats(stats, defines): total = 0 for key, value in stats.items(): if "Calls to" in key: @@ -439,17 +471,17 @@ def calculate_call_stats(stats): rows.append((key, value, format_ratio(value, total))) return rows -def emit_call_stats(stats): +def emit_call_stats(stats, defines): with Section("Call stats", summary="Inlined calls and frame stats"): - rows = calculate_call_stats(stats) + rows = calculate_call_stats(stats, defines) emit_table(("", "Count:", "Ratio:"), rows) -def emit_comparative_call_stats(base_stats, head_stats): +def emit_comparative_call_stats(base_stats, head_stats, defines): with Section("Call stats", summary="Inlined calls and frame stats"): - base_rows = calculate_call_stats(base_stats) - head_rows = calculate_call_stats(head_stats) + base_rows = calculate_call_stats(base_stats, defines) + head_rows = calculate_call_stats(head_stats, defines) rows = join_rows(base_rows, head_rows) - rows.sort(key=lambda x: -float(x[-1][:-1])) + rows.sort(key=lambda x: -percentage_to_float(x[-1])) emit_table( ("", "Base Count:", "Base Ratio:", "Head Count:", "Head Ratio:"), rows @@ -584,9 +616,9 @@ def output_single_stats(stats): total = get_total(opcode_stats) emit_execution_counts(opcode_stats, total) emit_pair_counts(opcode_stats, total) - emit_specialization_stats(opcode_stats) - emit_specialization_overview(opcode_stats, total) - emit_call_stats(stats) + emit_specialization_stats(opcode_stats, stats["_defines"]) + emit_specialization_overview(opcode_stats, total, stats["_specialized_instructions"]) + emit_call_stats(stats, stats["_stats_defines"]) emit_object_stats(stats) emit_gc_stats(stats) with Section("Meta stats", summary="Meta statistics"): @@ -604,12 +636,13 @@ def output_comparative_stats(base_stats, head_stats): base_opcode_stats, base_total, head_opcode_stats, head_total ) emit_comparative_specialization_stats( - base_opcode_stats, head_opcode_stats + base_opcode_stats, head_opcode_stats, head_stats["_defines"] ) emit_comparative_specialization_overview( - base_opcode_stats, base_total, head_opcode_stats, head_total + base_opcode_stats, base_total, head_opcode_stats, head_total, + head_stats["_specialized_instructions"] ) - emit_comparative_call_stats(base_stats, head_stats) + emit_comparative_call_stats(base_stats, head_stats, head_stats["_stats_defines"]) emit_comparative_object_stats(base_stats, head_stats) emit_comparative_gc_stats(base_stats, head_stats) From 59073c9ab8eb8db9304f16c46086ccc525e82570 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Fri, 15 Sep 2023 14:26:45 -0700 Subject: [PATCH 225/357] gh-109096: Deprecate `http.server.CGIHTTPRequestHandler` (#109387) Deprecate `http.server.CGIHTTPRequestHandler`. Co-authored-by: Jelle Zijlstra --- Doc/library/http.server.rst | 13 +++++++++++++ Doc/whatsnew/3.13.rst | 12 ++++++++++++ Lib/http/server.py | 18 ++++++++++++------ Lib/test/test_httpservers.py | 12 +++++++++++- ...3-09-15-12-20-23.gh-issue-109096.VksX1D.rst | 3 +++ 5 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-15-12-20-23.gh-issue-109096.VksX1D.rst diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index ae75e6dc5fdcf3..efe87497b371d0 100644 --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -502,11 +502,24 @@ following command runs an HTTP/1.1 conformant server:: Note that CGI scripts will be run with UID of user nobody, for security reasons. Problems with the CGI script will be translated to error 403. + .. deprecated-removed:: 3.13 3.15 + + :class:`CGIHTTPRequestHandler` is being removed in 3.15. CGI has not + been considered a good way to do things for well over a decade. This code + has been unmaintained for a while now and sees very little practical use. + Retaining it could lead to further :ref:`security considerations + `. + :class:`CGIHTTPRequestHandler` can be enabled in the command line by passing the ``--cgi`` option:: python -m http.server --cgi +.. deprecated-removed:: 3.13 3.15 + + :mod:`http.server` command line ``--cgi`` support is being removed + because :class:`CGIHTTPRequestHandler` is being removed. + .. _http.server-security: Security Considerations diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index c18e15e0448f05..43d06b886e59e4 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -248,6 +248,13 @@ Deprecated practice. (Contributed by Victor Stinner in :gh:`106535`.) +* :mod:`http.server`: :class:`http.server.CGIHTTPRequestHandler` now emits a + :exc:`DeprecationWarning` as it will be removed in 3.15. Process based CGI + http servers have been out of favor for a very long time. This code was + outdated, unmaintained, and rarely used. It has a high potential for both + security and functionality bugs. This includes removal of the ``--cgi`` + flag to the ``python -m http.server`` command line in 3.15. + * :mod:`typing`: Creating a :class:`typing.NamedTuple` class using keyword arguments to denote the fields (``NT = NamedTuple("NT", x=int, y=int)``) is deprecated, and will be disallowed in Python 3.15. Use the class-based syntax or the functional @@ -414,6 +421,11 @@ Pending Removal in Python 3.14 Pending Removal in Python 3.15 ------------------------------ +* :class:`http.server.CGIHTTPRequestHandler` will be removed along with its + related ``--cgi`` flag to ``python -m http.server``. It was obsolete and + rarely used. No direct replacement exists. *Anything* is better than CGI + to interface a web server with a request handler. + * :class:`typing.NamedTuple`: * The undocumented keyword argument syntax for creating NamedTuple classes diff --git a/Lib/http/server.py b/Lib/http/server.py index ca6240d9a921e6..ee7a9b6aa55b88 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -2,18 +2,18 @@ Note: BaseHTTPRequestHandler doesn't implement any HTTP request; see SimpleHTTPRequestHandler for simple implementations of GET, HEAD and POST, -and CGIHTTPRequestHandler for CGI scripts. +and (deprecated) CGIHTTPRequestHandler for CGI scripts. -It does, however, optionally implement HTTP/1.1 persistent connections, -as of version 0.3. +It does, however, optionally implement HTTP/1.1 persistent connections. Notes on CGIHTTPRequestHandler ------------------------------ -This class implements GET and POST requests to cgi-bin scripts. +This class is deprecated. It implements GET and POST requests to cgi-bin scripts. -If the os.fork() function is not present (e.g. on Windows), -subprocess.Popen() is used as a fallback, with slightly altered semantics. +If the os.fork() function is not present (Windows), subprocess.Popen() is used, +with slightly altered but never documented semantics. Use from a threaded +process is likely to trigger a warning at os.fork() time. In all cases, the implementation is intentionally naive -- all requests are executed synchronously. @@ -986,6 +986,12 @@ class CGIHTTPRequestHandler(SimpleHTTPRequestHandler): """ + def __init__(self, *args, **kwargs): + import warnings + warnings._deprecated("http.server.CGIHTTPRequestHandler", + remove=(3, 15)) + super().__init__(*args, **kwargs) + # Determine platform specifics have_fork = hasattr(os, 'fork') diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index cfd8a101dcc1c1..9fa6ecf9c08e27 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -699,11 +699,20 @@ def test_html_escape_filename(self): "This test can't be run reliably as root (issue #13308).") class CGIHTTPServerTestCase(BaseTestCase): class request_handler(NoLogRequestHandler, CGIHTTPRequestHandler): - pass + _test_case_self = None # populated by each setUp() method call. + + def __init__(self, *args, **kwargs): + with self._test_case_self.assertWarnsRegex( + DeprecationWarning, + r'http\.server\.CGIHTTPRequestHandler'): + # This context also happens to catch and silence the + # threading DeprecationWarning from os.fork(). + super().__init__(*args, **kwargs) linesep = os.linesep.encode('ascii') def setUp(self): + self.request_handler._test_case_self = self # practical, but yuck. BaseTestCase.setUp(self) self.cwd = os.getcwd() self.parent_dir = tempfile.mkdtemp() @@ -780,6 +789,7 @@ def setUp(self): os.chdir(self.parent_dir) def tearDown(self): + self.request_handler._test_case_self = None try: os.chdir(self.cwd) if self._pythonexe_symlink: diff --git a/Misc/NEWS.d/next/Library/2023-09-15-12-20-23.gh-issue-109096.VksX1D.rst b/Misc/NEWS.d/next/Library/2023-09-15-12-20-23.gh-issue-109096.VksX1D.rst new file mode 100644 index 00000000000000..bf1308498a8eb0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-15-12-20-23.gh-issue-109096.VksX1D.rst @@ -0,0 +1,3 @@ +:class:`http.server.CGIHTTPRequestHandler` has been deprecated for removal +in 3.15. Its design is old and the web world has long since moved beyond +CGI. From 6b179adb8c05801bf069121b360531d135ee3f44 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Fri, 15 Sep 2023 15:04:21 -0700 Subject: [PATCH 226/357] gh-106213: Make Emscripten trampolines work with JSPI (GH-106219) There is a WIP proposal to enable webassembly stack switching which have been implemented in v8: https://github.com/WebAssembly/js-promise-integration It is not possible to switch stacks that contain JS frames so the Emscripten JS trampolines that allow calling functions with the wrong number of arguments don't work in this case. However, the js-promise-integration proposal requires the [type reflection for Wasm/JS API](https://github.com/WebAssembly/js-types) proposal, which allows us to actually count the number of arguments a function expects. For better compatibility with stack switching, this PR checks if type reflection is available, and if so we use a switch block to decide the appropriate signature. If type reflection is unavailable, we should use the current EMJS trampoline. We cache the function argument counts since when I didn't cache them performance was negatively affected. Co-authored-by: T. Wouters Co-authored-by: Brett Cannon --- .../internal/pycore_emscripten_trampoline.h | 81 ++++++++++++++++++ Include/internal/pycore_object.h | 1 + Include/internal/pycore_runtime.h | 7 ++ ...-06-29-09-42-56.gh-issue-106213.TCUgzM.rst | 2 + Objects/descrobject.c | 20 +---- Objects/methodobject.c | 7 -- Python/emscripten_trampoline.c | 82 +++++++++++++++++++ Python/pystate.c | 5 ++ configure | 4 +- configure.ac | 4 +- 10 files changed, 183 insertions(+), 30 deletions(-) create mode 100644 Include/internal/pycore_emscripten_trampoline.h create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-06-29-09-42-56.gh-issue-106213.TCUgzM.rst create mode 100644 Python/emscripten_trampoline.c diff --git a/Include/internal/pycore_emscripten_trampoline.h b/Include/internal/pycore_emscripten_trampoline.h new file mode 100644 index 00000000000000..e519c99ad86cce --- /dev/null +++ b/Include/internal/pycore_emscripten_trampoline.h @@ -0,0 +1,81 @@ +#ifndef Py_EMSCRIPTEN_TRAMPOLINE_H +#define Py_EMSCRIPTEN_TRAMPOLINE_H + +#include "pycore_runtime.h" // _PyRuntimeState + +/** + * C function call trampolines to mitigate bad function pointer casts. + * + * Section 6.3.2.3, paragraph 8 reads: + * + * A pointer to a function of one type may be converted to a pointer to a + * function of another type and back again; the result shall compare equal to + * the original pointer. If a converted pointer is used to call a function + * whose type is not compatible with the pointed-to type, the behavior is + * undefined. + * + * Typical native ABIs ignore additional arguments or fill in missing values + * with 0/NULL in function pointer cast. Compilers do not show warnings when a + * function pointer is explicitly casted to an incompatible type. + * + * Bad fpcasts are an issue in WebAssembly. WASM's indirect_call has strict + * function signature checks. Argument count, types, and return type must match. + * + * Third party code unintentionally rely on problematic fpcasts. The call + * trampoline mitigates common occurrences of bad fpcasts on Emscripten. + */ + +#if defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE) + +void _Py_EmscriptenTrampoline_Init(_PyRuntimeState *runtime); + +PyObject* +_PyEM_TrampolineCall_JavaScript(PyCFunctionWithKeywords func, + PyObject* self, + PyObject* args, + PyObject* kw); + +PyObject* +_PyEM_TrampolineCall_Reflection(PyCFunctionWithKeywords func, + PyObject* self, + PyObject* args, + PyObject* kw); + +#define _PyEM_TrampolineCall(meth, self, args, kw) \ + ((_PyRuntime.wasm_type_reflection_available) ? \ + (_PyEM_TrampolineCall_Reflection((PyCFunctionWithKeywords)(meth), (self), (args), (kw))) : \ + (_PyEM_TrampolineCall_JavaScript((PyCFunctionWithKeywords)(meth), (self), (args), (kw)))) + +#define _PyCFunction_TrampolineCall(meth, self, args) \ + _PyEM_TrampolineCall( \ + (*(PyCFunctionWithKeywords)(void(*)(void))(meth)), (self), (args), NULL) + +#define _PyCFunctionWithKeywords_TrampolineCall(meth, self, args, kw) \ + _PyEM_TrampolineCall((meth), (self), (args), (kw)) + +#define descr_set_trampoline_call(set, obj, value, closure) \ + ((int)_PyEM_TrampolineCall((PyCFunctionWithKeywords)(set), (obj), (value), (PyObject*)(closure))) + +#define descr_get_trampoline_call(get, obj, closure) \ + _PyEM_TrampolineCall((PyCFunctionWithKeywords)(get), (obj), (PyObject*)(closure), NULL) + + +#else // defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE) + +#define _Py_EmscriptenTrampoline_Init(runtime) + +#define _PyCFunction_TrampolineCall(meth, self, args) \ + (meth)((self), (args)) + +#define _PyCFunctionWithKeywords_TrampolineCall(meth, self, args, kw) \ + (meth)((self), (args), (kw)) + +#define descr_set_trampoline_call(set, obj, value, closure) \ + (set)((obj), (value), (closure)) + +#define descr_get_trampoline_call(get, obj, closure) \ + (get)((obj), (closure)) + +#endif // defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE) + +#endif // ndef Py_EMSCRIPTEN_SIGNAL_H diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index daa06ebfbf91a4..2d50f42c9c614d 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -10,6 +10,7 @@ extern "C" { #include #include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() +#include "pycore_emscripten_trampoline.h" // _PyCFunction_TrampolineCall() #include "pycore_interp.h" // PyInterpreterState.gc #include "pycore_pystate.h" // _PyInterpreterState_GET() diff --git a/Include/internal/pycore_runtime.h b/Include/internal/pycore_runtime.h index 2ce46f3201d8af..0ddc405f221a1c 100644 --- a/Include/internal/pycore_runtime.h +++ b/Include/internal/pycore_runtime.h @@ -267,6 +267,13 @@ typedef struct pyruntimestate { /* PyInterpreterState.interpreters.main */ PyInterpreterState _main_interpreter; + +#if defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE) + // Used in "Python/emscripten_trampoline.c" to choose between type + // reflection trampoline and EM_JS trampoline. + bool wasm_type_reflection_available; +#endif + } _PyRuntimeState; diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-06-29-09-42-56.gh-issue-106213.TCUgzM.rst b/Misc/NEWS.d/next/Core and Builtins/2023-06-29-09-42-56.gh-issue-106213.TCUgzM.rst new file mode 100644 index 00000000000000..431f9cc0e4bb7d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-06-29-09-42-56.gh-issue-106213.TCUgzM.rst @@ -0,0 +1,2 @@ +Changed the way that Emscripten call trampolines work for compatibility with +Wasm/JS Promise integration. diff --git a/Objects/descrobject.c b/Objects/descrobject.c index a744c3d1e58658..56ce34f80ca8e9 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -4,6 +4,7 @@ #include "pycore_abstract.h" // _PyObject_RealIsSubclass() #include "pycore_call.h" // _PyStack_AsDict() #include "pycore_ceval.h" // _Py_EnterRecursiveCallTstate() +#include "pycore_emscripten_trampoline.h" // descr_set_trampoline_call(), descr_get_trampoline_call() #include "pycore_descrobject.h" // _PyMethodWrapper_Type #include "pycore_object.h" // _PyObject_GC_UNTRACK() #include "pycore_pystate.h" // _PyThreadState_GET() @@ -16,25 +17,6 @@ class property "propertyobject *" "&PyProperty_Type" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=556352653fd4c02e]*/ -// see pycore_object.h -#if defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE) -#include -EM_JS(int, descr_set_trampoline_call, (setter set, PyObject *obj, PyObject *value, void *closure), { - return wasmTable.get(set)(obj, value, closure); -}); - -EM_JS(PyObject*, descr_get_trampoline_call, (getter get, PyObject *obj, void *closure), { - return wasmTable.get(get)(obj, closure); -}); -#else -#define descr_set_trampoline_call(set, obj, value, closure) \ - (set)((obj), (value), (closure)) - -#define descr_get_trampoline_call(get, obj, closure) \ - (get)((obj), (closure)) - -#endif // __EMSCRIPTEN__ && PY_CALL_TRAMPOLINE - static void descr_dealloc(PyDescrObject *descr) { diff --git a/Objects/methodobject.c b/Objects/methodobject.c index 521c9059770acb..b40b2821c3880d 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -553,10 +553,3 @@ cfunction_call(PyObject *func, PyObject *args, PyObject *kwargs) return _Py_CheckFunctionResult(tstate, func, result, NULL); } -#if defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE) -#include - -EM_JS(PyObject*, _PyCFunctionWithKeywords_TrampolineCall, (PyCFunctionWithKeywords func, PyObject *self, PyObject *args, PyObject *kw), { - return wasmTable.get(func)(self, args, kw); -}); -#endif diff --git a/Python/emscripten_trampoline.c b/Python/emscripten_trampoline.c new file mode 100644 index 00000000000000..2a80ec4f18d757 --- /dev/null +++ b/Python/emscripten_trampoline.c @@ -0,0 +1,82 @@ +#if defined(PY_CALL_TRAMPOLINE) + +#include // EM_JS +#include +#include "pycore_runtime.h" // _PyRuntime + + +/** + * This is the GoogleChromeLabs approved way to feature detect type-reflection: + * https://github.com/GoogleChromeLabs/wasm-feature-detect/blob/main/src/detectors/type-reflection/index.js + */ +EM_JS(int, _PyEM_detect_type_reflection, (), { + return "Function" in WebAssembly; +}); + +void +_Py_EmscriptenTrampoline_Init(_PyRuntimeState *runtime) +{ + runtime->wasm_type_reflection_available = _PyEM_detect_type_reflection(); +} + +/** + * Backwards compatible trampoline works with all JS runtimes + */ +EM_JS(PyObject*, +_PyEM_TrampolineCall_JavaScript, (PyCFunctionWithKeywords func, + PyObject *arg1, + PyObject *arg2, + PyObject *arg3), +{ + return wasmTable.get(func)(arg1, arg2, arg3); +} +); + +/** + * In runtimes with WebAssembly type reflection, count the number of parameters + * and cast to the appropriate signature + */ +EM_JS(int, _PyEM_CountFuncParams, (PyCFunctionWithKeywords func), +{ + let n = _PyEM_CountFuncParams.cache.get(func); + + if (n !== undefined) { + return n; + } + n = WebAssembly.Function.type(wasmTable.get(func)).parameters.length; + _PyEM_CountFuncParams.cache.set(func, n); + return n; +} +_PyEM_CountFuncParams.cache = new Map(); +) + + +typedef PyObject* (*zero_arg)(void); +typedef PyObject* (*one_arg)(PyObject*); +typedef PyObject* (*two_arg)(PyObject*, PyObject*); +typedef PyObject* (*three_arg)(PyObject*, PyObject*, PyObject*); + + +PyObject* +_PyEM_TrampolineCall_Reflection(PyCFunctionWithKeywords func, + PyObject* self, + PyObject* args, + PyObject* kw) +{ + switch (_PyEM_CountFuncParams(func)) { + case 0: + return ((zero_arg)func)(); + case 1: + return ((one_arg)func)(self); + case 2: + return ((two_arg)func)(self, args); + case 3: + return ((three_arg)func)(self, args, kw); + default: + PyErr_SetString(PyExc_SystemError, + "Handler takes too many arguments"); + return NULL; + } +} + +#endif diff --git a/Python/pystate.c b/Python/pystate.c index b5c4fd7fb50616..08cf6f0bb7c97a 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -5,6 +5,7 @@ #include "pycore_ceval.h" #include "pycore_code.h" // stats #include "pycore_dtoa.h" // _dtoa_state_INIT() +#include "pycore_emscripten_trampoline.h" // _Py_EmscriptenTrampoline_Init() #include "pycore_frame.h" #include "pycore_initconfig.h" // _PyStatus_OK() #include "pycore_object.h" // _PyType_InitCache() @@ -449,6 +450,10 @@ init_runtime(_PyRuntimeState *runtime, runtime->unicode_state.ids.next_index = unicode_next_index; +#if defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE) + _Py_EmscriptenTrampoline_Init(runtime); +#endif + runtime->_initialized = 1; } diff --git a/configure b/configure index 8326a1db06c2da..17b9e7f532a827 100755 --- a/configure +++ b/configure @@ -16941,8 +16941,8 @@ PLATFORM_OBJS= case $ac_sys_system in #( Emscripten) : - as_fn_append PLATFORM_OBJS ' Python/emscripten_signal.o' - as_fn_append PLATFORM_HEADERS ' $(srcdir)/Include/internal/pycore_emscripten_signal.h' + as_fn_append PLATFORM_OBJS ' Python/emscripten_signal.o Python/emscripten_trampoline.o' + as_fn_append PLATFORM_HEADERS ' $(srcdir)/Include/internal/pycore_emscripten_signal.h $(srcdir)/Include/internal/pycore_emscripten_trampoline.h' ;; #( *) : ;; diff --git a/configure.ac b/configure.ac index 843f2b267a5253..34958a1cdf1528 100644 --- a/configure.ac +++ b/configure.ac @@ -4593,8 +4593,8 @@ PLATFORM_OBJS= AS_CASE([$ac_sys_system], [Emscripten], [ - AS_VAR_APPEND([PLATFORM_OBJS], [' Python/emscripten_signal.o']) - AS_VAR_APPEND([PLATFORM_HEADERS], [' $(srcdir)/Include/internal/pycore_emscripten_signal.h']) + AS_VAR_APPEND([PLATFORM_OBJS], [' Python/emscripten_signal.o Python/emscripten_trampoline.o']) + AS_VAR_APPEND([PLATFORM_HEADERS], [' $(srcdir)/Include/internal/pycore_emscripten_signal.h $(srcdir)/Include/internal/pycore_emscripten_trampoline.h']) ], ) AC_SUBST([PLATFORM_HEADERS]) From e218e5022eef369573808a4f8dda9aeeab663750 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 15 Sep 2023 15:38:08 -0700 Subject: [PATCH 227/357] GH-83417: Allow `venv` to add a `.gitignore` file to environments via a new `scm_ignore_file` parameter (GH-108125) This feature is off by default via code but on by default via the CLI. The `.gitignore` file contains `*` which causes the entire directory to be ignored. Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Hugo van Kemenade --- Doc/library/venv.rst | 24 ++- Doc/using/venv-create.inc | 73 ++++--- Doc/whatsnew/3.13.rst | 10 + Lib/test/test_venv.py | 180 ++++++++++++------ Lib/venv/__init__.py | 36 +++- Lib/venv/__main__.py | 2 +- ...3-08-18-22-58-07.gh-issue-83417.61J4yM.rst | 3 + 7 files changed, 233 insertions(+), 95 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-08-18-22-58-07.gh-issue-83417.61J4yM.rst diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index 2482441d649790..b72f3041f1da11 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -143,7 +143,8 @@ creation according to their needs, the :class:`EnvBuilder` class. .. class:: EnvBuilder(system_site_packages=False, clear=False, \ symlinks=False, upgrade=False, with_pip=False, \ - prompt=None, upgrade_deps=False) + prompt=None, upgrade_deps=False, \ + *, scm_ignore_files=frozenset()) The :class:`EnvBuilder` class accepts the following keyword arguments on instantiation: @@ -172,6 +173,12 @@ creation according to their needs, the :class:`EnvBuilder` class. * ``upgrade_deps`` -- Update the base venv modules to the latest on PyPI + * ``scm_ignore_files`` -- Create ignore files based for the specified source + control managers (SCM) in the iterable. Support is defined by having a + method named ``create_{scm}_ignore_file``. The only value supported by + default is ``"git"`` via :meth:`create_git_ignore_file`. + + .. versionchanged:: 3.4 Added the ``with_pip`` parameter @@ -181,6 +188,9 @@ creation according to their needs, the :class:`EnvBuilder` class. .. versionadded:: 3.9 Added the ``upgrade_deps`` parameter + .. versionadded:: 3.13 + Added the ``scm_ignore_files`` parameter + Creators of third-party virtual environment tools will be free to use the provided :class:`EnvBuilder` class as a base class. @@ -339,11 +349,18 @@ creation according to their needs, the :class:`EnvBuilder` class. The directories are allowed to exist (for when an existing environment is being upgraded). + .. method:: create_git_ignore_file(context) + + Creates a ``.gitignore`` file within the virtual environment that causes + the entire directory to be ignored by the ``git`` source control manager. + + .. versionadded:: 3.13 + There is also a module-level convenience function: .. function:: create(env_dir, system_site_packages=False, clear=False, \ symlinks=False, with_pip=False, prompt=None, \ - upgrade_deps=False) + upgrade_deps=False, *, scm_ignore_files=frozenset()) Create an :class:`EnvBuilder` with the given keyword arguments, and call its :meth:`~EnvBuilder.create` method with the *env_dir* argument. @@ -359,6 +376,9 @@ There is also a module-level convenience function: .. versionchanged:: 3.9 Added the ``upgrade_deps`` parameter + .. versionchanged:: 3.13 + Added the ``scm_ignore_files`` parameter + An example of extending ``EnvBuilder`` -------------------------------------- diff --git a/Doc/using/venv-create.inc b/Doc/using/venv-create.inc index 2fc90126482268..1cf438b198a9af 100644 --- a/Doc/using/venv-create.inc +++ b/Doc/using/venv-create.inc @@ -35,37 +35,48 @@ your :ref:`Python installation `:: The command, if run with ``-h``, will show the available options:: - usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] - [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps] - ENV_DIR [ENV_DIR ...] - - Creates virtual Python environments in one or more target directories. - - positional arguments: - ENV_DIR A directory to create the environment in. - - optional arguments: - -h, --help show this help message and exit - --system-site-packages - Give the virtual environment access to the system - site-packages dir. - --symlinks Try to use symlinks rather than copies, when symlinks - are not the default for the platform. - --copies Try to use copies rather than symlinks, even when - symlinks are the default for the platform. - --clear Delete the contents of the environment directory if it - already exists, before environment creation. - --upgrade Upgrade the environment directory to use this version - of Python, assuming Python has been upgraded in-place. - --without-pip Skips installing or upgrading pip in the virtual - environment (pip is bootstrapped by default) - --prompt PROMPT Provides an alternative prompt prefix for this - environment. - --upgrade-deps Upgrade core dependencies (pip) to the - latest version in PyPI - - Once an environment has been created, you may wish to activate it, e.g. by - sourcing an activate script in its bin directory. + usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] + [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps] + [--without-scm-ignore-file] + ENV_DIR [ENV_DIR ...] + + Creates virtual Python environments in one or more target directories. + + positional arguments: + ENV_DIR A directory to create the environment in. + + options: + -h, --help show this help message and exit + --system-site-packages + Give the virtual environment access to the system + site-packages dir. + --symlinks Try to use symlinks rather than copies, when + symlinks are not the default for the platform. + --copies Try to use copies rather than symlinks, even when + symlinks are the default for the platform. + --clear Delete the contents of the environment directory if + it already exists, before environment creation. + --upgrade Upgrade the environment directory to use this + version of Python, assuming Python has been upgraded + in-place. + --without-pip Skips installing or upgrading pip in the virtual + environment (pip is bootstrapped by default) + --prompt PROMPT Provides an alternative prompt prefix for this + environment. + --upgrade-deps Upgrade core dependencies (pip) to the latest + version in PyPI + --without-scm-ignore-file + Skips adding the default SCM ignore file to the + environment directory (the default is a .gitignore + file). + + Once an environment has been created, you may wish to activate it, e.g. by + sourcing an activate script in its bin directory. + +.. versionchanged:: 3.13 + + ``--without-scm-ignore-file`` was added along with creating an ignore file + for ``git`` by default. .. versionchanged:: 3.12 diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index 43d06b886e59e4..f71bdabd31f1d3 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -220,6 +220,16 @@ typing check whether a class is a :class:`typing.Protocol`. (Contributed by Jelle Zijlstra in :gh:`104873`.) +venv +---- + +* Add support for adding source control management (SCM) ignore files to a + virtual environment's directory. By default, Git is supported. This is + implemented as opt-in via the API which can be extended to support other SCMs + (:class:`venv.EnvBuilder` and :func:`venv.create`), and opt-out via the CLI + (using ``--without-scm-ignore-files``). (Contributed by Brett Cannon in + :gh:`108125`.) + Optimizations ============= diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index aa6a8fbf8cfd17..a894bb10bd04da 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -82,6 +82,13 @@ def setUp(self): def tearDown(self): rmtree(self.env_dir) + def envpy(self, *, real_env_dir=False): + if real_env_dir: + env_dir = os.path.realpath(self.env_dir) + else: + env_dir = self.env_dir + return os.path.join(env_dir, self.bindir, self.exe) + def run_with_capture(self, func, *args, **kwargs): with captured_stdout() as output: with captured_stderr() as error: @@ -138,7 +145,8 @@ def _check_output_of_default_create(self): self.assertIn('executable = %s' % os.path.realpath(sys.executable), data) copies = '' if os.name=='nt' else ' --copies' - cmd = f'command = {sys.executable} -m venv{copies} --without-pip {self.env_dir}' + cmd = (f'command = {sys.executable} -m venv{copies} --without-pip ' + f'--without-scm-ignore-files {self.env_dir}') self.assertIn(cmd, data) fn = self.get_env_file(self.bindir, self.exe) if not os.path.exists(fn): # diagnostics for Windows buildbot failures @@ -148,35 +156,37 @@ def _check_output_of_default_create(self): self.assertTrue(os.path.exists(fn), 'File %r should exist.' % fn) def test_config_file_command_key(self): - attrs = [ - (None, None), - ('symlinks', '--copies'), - ('with_pip', '--without-pip'), - ('system_site_packages', '--system-site-packages'), - ('clear', '--clear'), - ('upgrade', '--upgrade'), - ('upgrade_deps', '--upgrade-deps'), - ('prompt', '--prompt'), + options = [ + (None, None, None), # Default case. + ('--copies', 'symlinks', False), + ('--without-pip', 'with_pip', False), + ('--system-site-packages', 'system_site_packages', True), + ('--clear', 'clear', True), + ('--upgrade', 'upgrade', True), + ('--upgrade-deps', 'upgrade_deps', True), + ('--prompt', 'prompt', True), + ('--without-scm-ignore-files', 'scm_ignore_files', frozenset()), ] - for attr, opt in attrs: - rmtree(self.env_dir) - if not attr: - b = venv.EnvBuilder() - else: - b = venv.EnvBuilder( - **{attr: False if attr in ('with_pip', 'symlinks') else True}) - b.upgrade_dependencies = Mock() # avoid pip command to upgrade deps - b._setup_pip = Mock() # avoid pip setup - self.run_with_capture(b.create, self.env_dir) - data = self.get_text_file_contents('pyvenv.cfg') - if not attr: - for opt in ('--system-site-packages', '--clear', '--upgrade', - '--upgrade-deps', '--prompt'): - self.assertNotRegex(data, rf'command = .* {opt}') - elif os.name=='nt' and attr=='symlinks': - pass - else: - self.assertRegex(data, rf'command = .* {opt}') + for opt, attr, value in options: + with self.subTest(opt=opt, attr=attr, value=value): + rmtree(self.env_dir) + if not attr: + kwargs = {} + else: + kwargs = {attr: value} + b = venv.EnvBuilder(**kwargs) + b.upgrade_dependencies = Mock() # avoid pip command to upgrade deps + b._setup_pip = Mock() # avoid pip setup + self.run_with_capture(b.create, self.env_dir) + data = self.get_text_file_contents('pyvenv.cfg') + if not attr or opt.endswith('git'): + for opt in ('--system-site-packages', '--clear', '--upgrade', + '--upgrade-deps', '--prompt'): + self.assertNotRegex(data, rf'command = .* {opt}') + elif os.name=='nt' and attr=='symlinks': + pass + else: + self.assertRegex(data, rf'command = .* {opt}') def test_prompt(self): env_name = os.path.split(self.env_dir)[1] @@ -243,8 +253,7 @@ def test_prefixes(self): # check a venv's prefixes rmtree(self.env_dir) self.run_with_capture(venv.create, self.env_dir) - envpy = os.path.join(self.env_dir, self.bindir, self.exe) - cmd = [envpy, '-c', None] + cmd = [self.envpy(), '-c', None] for prefix, expected in ( ('prefix', self.env_dir), ('exec_prefix', self.env_dir), @@ -261,8 +270,7 @@ def test_sysconfig(self): """ rmtree(self.env_dir) self.run_with_capture(venv.create, self.env_dir, symlinks=False) - envpy = os.path.join(self.env_dir, self.bindir, self.exe) - cmd = [envpy, '-c', None] + cmd = [self.envpy(), '-c', None] for call, expected in ( # installation scheme ('get_preferred_scheme("prefix")', 'venv'), @@ -284,8 +292,7 @@ def test_sysconfig_symlinks(self): """ rmtree(self.env_dir) self.run_with_capture(venv.create, self.env_dir, symlinks=True) - envpy = os.path.join(self.env_dir, self.bindir, self.exe) - cmd = [envpy, '-c', None] + cmd = [self.envpy(), '-c', None] for call, expected in ( # installation scheme ('get_preferred_scheme("prefix")', 'venv'), @@ -424,8 +431,7 @@ def test_executable(self): """ rmtree(self.env_dir) self.run_with_capture(venv.create, self.env_dir) - envpy = os.path.join(os.path.realpath(self.env_dir), - self.bindir, self.exe) + envpy = self.envpy(real_env_dir=True) out, err = check_output([envpy, '-c', 'import sys; print(sys.executable)']) self.assertEqual(out.strip(), envpy.encode()) @@ -438,8 +444,7 @@ def test_executable_symlinks(self): rmtree(self.env_dir) builder = venv.EnvBuilder(clear=True, symlinks=True) builder.create(self.env_dir) - envpy = os.path.join(os.path.realpath(self.env_dir), - self.bindir, self.exe) + envpy = self.envpy(real_env_dir=True) out, err = check_output([envpy, '-c', 'import sys; print(sys.executable)']) self.assertEqual(out.strip(), envpy.encode()) @@ -454,7 +459,6 @@ def test_unicode_in_batch_file(self): builder = venv.EnvBuilder(clear=True) builder.create(env_dir) activate = os.path.join(env_dir, self.bindir, 'activate.bat') - envpy = os.path.join(env_dir, self.bindir, self.exe) out, err = check_output( [activate, '&', self.exe, '-c', 'print(0)'], encoding='oem', @@ -473,9 +477,7 @@ def test_multiprocessing(self): rmtree(self.env_dir) self.run_with_capture(venv.create, self.env_dir) - envpy = os.path.join(os.path.realpath(self.env_dir), - self.bindir, self.exe) - out, err = check_output([envpy, '-c', + out, err = check_output([self.envpy(real_env_dir=True), '-c', 'from multiprocessing import Pool; ' 'pool = Pool(1); ' 'print(pool.apply_async("Python".lower).get(3)); ' @@ -491,10 +493,8 @@ def test_multiprocessing_recursion(self): rmtree(self.env_dir) self.run_with_capture(venv.create, self.env_dir) - envpy = os.path.join(os.path.realpath(self.env_dir), - self.bindir, self.exe) script = os.path.join(TEST_HOME_DIR, '_test_venv_multiprocessing.py') - subprocess.check_call([envpy, script]) + subprocess.check_call([self.envpy(real_env_dir=True), script]) @unittest.skipIf(os.name == 'nt', 'not relevant on Windows') def test_deactivate_with_strict_bash_opts(self): @@ -521,9 +521,7 @@ def test_macos_env(self): builder = venv.EnvBuilder() builder.create(self.env_dir) - envpy = os.path.join(os.path.realpath(self.env_dir), - self.bindir, self.exe) - out, err = check_output([envpy, '-c', + out, err = check_output([self.envpy(real_env_dir=True), '-c', 'import os; print("__PYVENV_LAUNCHER__" in os.environ)']) self.assertEqual(out.strip(), 'False'.encode()) @@ -585,6 +583,7 @@ def test_zippath_from_non_installed_posix(self): "-m", "venv", "--without-pip", + "--without-scm-ignore-files", self.env_dir] # Our fake non-installed python is not fully functional because # it cannot find the extensions. Set PYTHONPATH so it can run the @@ -609,13 +608,13 @@ def test_zippath_from_non_installed_posix(self): # prevent https://github.com/python/cpython/issues/104839 child_env["ASAN_OPTIONS"] = asan_options subprocess.check_call(cmd, env=child_env) - envpy = os.path.join(self.env_dir, self.bindir, self.exe) # Now check the venv created from the non-installed python has # correct zip path in pythonpath. - cmd = [envpy, '-S', '-c', 'import sys; print(sys.path)'] + cmd = [self.envpy(), '-S', '-c', 'import sys; print(sys.path)'] out, err = check_output(cmd) self.assertTrue(zip_landmark.encode() in out) + @requireVenvCreate def test_activate_shell_script_has_no_dos_newlines(self): """ Test that the `activate` shell script contains no CR LF. @@ -632,13 +631,80 @@ def test_activate_shell_script_has_no_dos_newlines(self): error_message = f"CR LF found in line {i}" self.assertFalse(line.endswith(b'\r\n'), error_message) + @requireVenvCreate + def test_scm_ignore_files_git(self): + """ + Test that a .gitignore file is created when "git" is specified. + The file should contain a `*\n` line. + """ + self.run_with_capture(venv.create, self.env_dir, + scm_ignore_files={'git'}) + file_lines = self.get_text_file_contents('.gitignore').splitlines() + self.assertIn('*', file_lines) + + @requireVenvCreate + def test_create_scm_ignore_files_multiple(self): + """ + Test that ``scm_ignore_files`` can work with multiple SCMs. + """ + bzrignore_name = ".bzrignore" + contents = "# For Bazaar.\n*\n" + + class BzrEnvBuilder(venv.EnvBuilder): + def create_bzr_ignore_file(self, context): + gitignore_path = os.path.join(context.env_dir, bzrignore_name) + with open(gitignore_path, 'w', encoding='utf-8') as file: + file.write(contents) + + builder = BzrEnvBuilder(scm_ignore_files={'git', 'bzr'}) + self.run_with_capture(builder.create, self.env_dir) + + gitignore_lines = self.get_text_file_contents('.gitignore').splitlines() + self.assertIn('*', gitignore_lines) + + bzrignore = self.get_text_file_contents(bzrignore_name) + self.assertEqual(bzrignore, contents) + + @requireVenvCreate + def test_create_scm_ignore_files_empty(self): + """ + Test that no default ignore files are created when ``scm_ignore_files`` + is empty. + """ + # scm_ignore_files is set to frozenset() by default. + self.run_with_capture(venv.create, self.env_dir) + with self.assertRaises(FileNotFoundError): + self.get_text_file_contents('.gitignore') + + self.assertIn("--without-scm-ignore-files", + self.get_text_file_contents('pyvenv.cfg')) + + @requireVenvCreate + def test_cli_with_scm_ignore_files(self): + """ + Test that default SCM ignore files are created by default via the CLI. + """ + self.run_with_capture(venv.main, ['--without-pip', self.env_dir]) + + gitignore_lines = self.get_text_file_contents('.gitignore').splitlines() + self.assertIn('*', gitignore_lines) + + @requireVenvCreate + def test_cli_without_scm_ignore_files(self): + """ + Test that ``--without-scm-ignore-files`` doesn't create SCM ignore files. + """ + args = ['--without-pip', '--without-scm-ignore-files', self.env_dir] + self.run_with_capture(venv.main, args) + + with self.assertRaises(FileNotFoundError): + self.get_text_file_contents('.gitignore') + @requireVenvCreate class EnsurePipTest(BaseTest): """Test venv module installation of pip.""" def assert_pip_not_installed(self): - envpy = os.path.join(os.path.realpath(self.env_dir), - self.bindir, self.exe) - out, err = check_output([envpy, '-c', + out, err = check_output([self.envpy(real_env_dir=True), '-c', 'try:\n import pip\nexcept ImportError:\n print("OK")']) # We force everything to text, so unittest gives the detailed diff # if we get unexpected results @@ -705,9 +771,9 @@ def do_test_with_pip(self, system_site_packages): system_site_packages=system_site_packages, with_pip=True) # Ensure pip is available in the virtual environment - envpy = os.path.join(os.path.realpath(self.env_dir), self.bindir, self.exe) # Ignore DeprecationWarning since pip code is not part of Python - out, err = check_output([envpy, '-W', 'ignore::DeprecationWarning', + out, err = check_output([self.envpy(real_env_dir=True), + '-W', 'ignore::DeprecationWarning', '-W', 'ignore::ImportWarning', '-I', '-m', 'pip', '--version']) # We force everything to text, so unittest gives the detailed diff @@ -728,7 +794,7 @@ def do_test_with_pip(self, system_site_packages): # It seems ensurepip._uninstall calls subprocesses which do not # inherit the interpreter settings. envvars["PYTHONWARNINGS"] = "ignore" - out, err = check_output([envpy, + out, err = check_output([self.envpy(real_env_dir=True), '-W', 'ignore::DeprecationWarning', '-W', 'ignore::ImportWarning', '-I', '-m', 'ensurepip._uninstall']) diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 2173c9b13e5cf7..d960bf3bd82ac5 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -41,11 +41,13 @@ class EnvBuilder: environment :param prompt: Alternative terminal prefix for the environment. :param upgrade_deps: Update the base venv modules to the latest on PyPI + :param scm_ignore_files: Create ignore files for the SCMs specified by the + iterable. """ def __init__(self, system_site_packages=False, clear=False, symlinks=False, upgrade=False, with_pip=False, prompt=None, - upgrade_deps=False): + upgrade_deps=False, *, scm_ignore_files=frozenset()): self.system_site_packages = system_site_packages self.clear = clear self.symlinks = symlinks @@ -56,6 +58,7 @@ def __init__(self, system_site_packages=False, clear=False, prompt = os.path.basename(os.getcwd()) self.prompt = prompt self.upgrade_deps = upgrade_deps + self.scm_ignore_files = frozenset(map(str.lower, scm_ignore_files)) def create(self, env_dir): """ @@ -66,6 +69,8 @@ def create(self, env_dir): """ env_dir = os.path.abspath(env_dir) context = self.ensure_directories(env_dir) + for scm in self.scm_ignore_files: + getattr(self, f"create_{scm}_ignore_file")(context) # See issue 24875. We need system_site_packages to be False # until after pip is installed. true_system_site_packages = self.system_site_packages @@ -210,6 +215,8 @@ def create_configuration(self, context): args.append('--upgrade-deps') if self.orig_prompt is not None: args.append(f'--prompt="{self.orig_prompt}"') + if not self.scm_ignore_files: + args.append('--without-scm-ignore-files') args.append(context.env_dir) args = ' '.join(args) @@ -278,6 +285,19 @@ def symlink_or_copy(self, src, dst, relative_symlinks_ok=False): shutil.copyfile(src, dst) + def create_git_ignore_file(self, context): + """ + Create a .gitignore file in the environment directory. + + The contents of the file cause the entire environment directory to be + ignored by git. + """ + gitignore_path = os.path.join(context.env_dir, '.gitignore') + with open(gitignore_path, 'w', encoding='utf-8') as file: + file.write('# Created by venv; ' + 'see https://docs.python.org/3/library/venv.html\n') + file.write('*\n') + def setup_python(self, context): """ Set up a Python executable in the environment. @@ -461,11 +481,13 @@ def upgrade_dependencies(self, context): def create(env_dir, system_site_packages=False, clear=False, - symlinks=False, with_pip=False, prompt=None, upgrade_deps=False): + symlinks=False, with_pip=False, prompt=None, upgrade_deps=False, + *, scm_ignore_files=frozenset()): """Create a virtual environment in a directory.""" builder = EnvBuilder(system_site_packages=system_site_packages, clear=clear, symlinks=symlinks, with_pip=with_pip, - prompt=prompt, upgrade_deps=upgrade_deps) + prompt=prompt, upgrade_deps=upgrade_deps, + scm_ignore_files=scm_ignore_files) builder.create(env_dir) @@ -525,6 +547,11 @@ def main(args=None): dest='upgrade_deps', help=f'Upgrade core dependencies ({", ".join(CORE_VENV_DEPS)}) ' 'to the latest version in PyPI') + parser.add_argument('--without-scm-ignore-files', dest='scm_ignore_files', + action='store_const', const=frozenset(), + default=frozenset(['git']), + help='Skips adding SCM ignore files to the environment ' + 'directory (Git is supported by default).') options = parser.parse_args(args) if options.upgrade and options.clear: raise ValueError('you cannot supply --upgrade and --clear together.') @@ -534,7 +561,8 @@ def main(args=None): upgrade=options.upgrade, with_pip=options.with_pip, prompt=options.prompt, - upgrade_deps=options.upgrade_deps) + upgrade_deps=options.upgrade_deps, + scm_ignore_files=options.scm_ignore_files) for d in options.dirs: builder.create(d) diff --git a/Lib/venv/__main__.py b/Lib/venv/__main__.py index 912423e4a78198..88f55439dc210c 100644 --- a/Lib/venv/__main__.py +++ b/Lib/venv/__main__.py @@ -6,5 +6,5 @@ main() rc = 0 except Exception as e: - print('Error: %s' % e, file=sys.stderr) + print('Error:', e, file=sys.stderr) sys.exit(rc) diff --git a/Misc/NEWS.d/next/Library/2023-08-18-22-58-07.gh-issue-83417.61J4yM.rst b/Misc/NEWS.d/next/Library/2023-08-18-22-58-07.gh-issue-83417.61J4yM.rst new file mode 100644 index 00000000000000..fbb8bdb2073efa --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-08-18-22-58-07.gh-issue-83417.61J4yM.rst @@ -0,0 +1,3 @@ +Add the ability for venv to create a ``.gitignore`` file which causes the +created environment to be ignored by Git. It is on by default when venv is +called via its CLI. From 0b38ce440bd76b3d25b6d042ee9613841fb4a947 Mon Sep 17 00:00:00 2001 From: partev Date: Sat, 16 Sep 2023 03:46:09 -0400 Subject: [PATCH 228/357] gh-109474: Update two Unix packaging URLs (#109307) update packaging URLs fix a broken URL for fedora RPM packaging guide and fix a URL redirect for Slackware packaging guide. --- Doc/using/unix.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/using/unix.rst b/Doc/using/unix.rst index 0044eb07f56eec..58838c28e6eb86 100644 --- a/Doc/using/unix.rst +++ b/Doc/using/unix.rst @@ -30,9 +30,9 @@ following links: for Debian users https://en.opensuse.org/Portal:Packaging for OpenSuse users - https://docs-old.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch-creating-rpms.html + https://docs.fedoraproject.org/en-US/package-maintainers/Packaging_Tutorial_GNU_Hello/ for Fedora users - http://www.slackbook.org/html/package-management-making-packages.html + https://slackbook.org/html/package-management-making-packages.html for Slackware users From a6846d45ff3c836bc859c40e7684b57df991dc05 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Sat, 16 Sep 2023 09:49:02 +0100 Subject: [PATCH 229/357] gh-109414: Add some basic information about venvs in the introduction. (GH-109440) Co-authored-by: Victor Stinner --- Doc/library/venv.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index b72f3041f1da11..da8942c554dea1 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -30,6 +30,25 @@ When used from within a virtual environment, common installation tools such as `pip`_ will install Python packages into a virtual environment without needing to be told to do so explicitly. +A virtual environment is (amongst other things): + +* Used to contain a specific Python interpreter and software libraries and + binaries which are needed to support a project (library or application). These + are by default isolated from software in other virtual environments and Python + interpreters and libraries installed in the operating system. + +* Contained in a directory, conventionally either named ``venv`` or ``.venv`` in + the project directory, or under a container directory for lots of virtual + environments, such as ``~/.virtualenvs``. + +* Not checked into source control systems such as Git. + +* Considered as disposable -- it should be simple to delete and recreate it from + scratch. You don't place any project code in the environment + +* Not considered as movable or copyable -- you just recreate the same + environment in the target location. + See :pep:`405` for more background on Python virtual environments. .. seealso:: From 929cc4e4a0999b777e1aa94f9c007db720e67f43 Mon Sep 17 00:00:00 2001 From: AlberLC <37489786+AlberLC@users.noreply.github.com> Date: Sat, 16 Sep 2023 11:06:04 +0200 Subject: [PATCH 230/357] gh-109451: Fix wrong format specifier in logging documentation (GH-109465) --- Doc/library/logging.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index cf3dcb96a4c412..acdeb88a546261 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -907,7 +907,7 @@ you want to use. In the case of {}-formatting, you can specify formatting flags by placing them after the attribute name, separated from it with a colon. For example: a -placeholder of ``{msecs:03d}`` would format a millisecond value of ``4`` as +placeholder of ``{msecs:03.0f}`` would format a millisecond value of ``4`` as ``004``. Refer to the :meth:`str.format` documentation for full details on the options available to you. From e57ecf6bbc59f999d27b125ea51b042c24a07bd9 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Sat, 16 Sep 2023 19:47:18 +0300 Subject: [PATCH 231/357] gh-108303: Move all certificates to `Lib/test/certdata/` (#109489) --- Lib/test/{ => certdata}/allsans.pem | 0 Lib/test/{ => certdata}/badcert.pem | 0 Lib/test/{ => certdata}/badkey.pem | 0 Lib/test/{ => certdata}/capath/4e1295a3.0 | 0 Lib/test/{ => certdata}/capath/5ed36f99.0 | 0 Lib/test/{ => certdata}/capath/6e88d7b8.0 | 0 Lib/test/{ => certdata}/capath/99d0fa06.0 | 0 Lib/test/{ => certdata}/capath/b1930218.0 | 0 Lib/test/{ => certdata}/capath/ceff1710.0 | 0 Lib/test/{ => certdata}/ffdh3072.pem | 0 Lib/test/{ => certdata}/idnsans.pem | 0 Lib/test/{ => certdata}/keycert.passwd.pem | 0 Lib/test/{ => certdata}/keycert.pem | 0 Lib/test/{ => certdata}/keycert2.pem | 0 Lib/test/{ => certdata}/keycert3.pem | 0 Lib/test/{ => certdata}/keycert4.pem | 0 Lib/test/{ => certdata}/keycertecc.pem | 0 Lib/test/{ => certdata}/make_ssl_certs.py | 0 Lib/test/{ => certdata}/nokia.pem | 0 Lib/test/{ => certdata}/nosan.pem | 0 Lib/test/{ => certdata}/nullbytecert.pem | 0 Lib/test/{ => certdata}/nullcert.pem | 0 Lib/test/{ => certdata}/pycacert.pem | 0 Lib/test/{ => certdata}/pycakey.pem | 0 Lib/test/{ => certdata}/revocation.crl | 0 Lib/test/{ => certdata}/secp384r1.pem | 0 .../selfsigned_pythontestdotnet.pem | 0 Lib/test/{ => certdata}/ssl_cert.pem | 0 Lib/test/{ => certdata}/ssl_key.passwd.pem | 0 Lib/test/{ => certdata}/ssl_key.pem | 0 Lib/test/{ => certdata}/talos-2019-0758.pem | 0 Lib/test/ssl_servers.py | 2 +- Lib/test/test_asyncio/utils.py | 16 ++++++++-------- Lib/test/test_ftplib.py | 4 ++-- Lib/test/test_httplib.py | 8 +++++--- Lib/test/test_imaplib.py | 4 ++-- Lib/test/test_logging.py | 2 +- Lib/test/test_poplib.py | 4 ++-- Lib/test/test_ssl.py | 12 ++++++------ Lib/test/test_urllib2_localnet.py | 4 ++-- Makefile.pre.in | 3 ++- 41 files changed, 31 insertions(+), 28 deletions(-) rename Lib/test/{ => certdata}/allsans.pem (100%) rename Lib/test/{ => certdata}/badcert.pem (100%) rename Lib/test/{ => certdata}/badkey.pem (100%) rename Lib/test/{ => certdata}/capath/4e1295a3.0 (100%) rename Lib/test/{ => certdata}/capath/5ed36f99.0 (100%) rename Lib/test/{ => certdata}/capath/6e88d7b8.0 (100%) rename Lib/test/{ => certdata}/capath/99d0fa06.0 (100%) rename Lib/test/{ => certdata}/capath/b1930218.0 (100%) rename Lib/test/{ => certdata}/capath/ceff1710.0 (100%) rename Lib/test/{ => certdata}/ffdh3072.pem (100%) rename Lib/test/{ => certdata}/idnsans.pem (100%) rename Lib/test/{ => certdata}/keycert.passwd.pem (100%) rename Lib/test/{ => certdata}/keycert.pem (100%) rename Lib/test/{ => certdata}/keycert2.pem (100%) rename Lib/test/{ => certdata}/keycert3.pem (100%) rename Lib/test/{ => certdata}/keycert4.pem (100%) rename Lib/test/{ => certdata}/keycertecc.pem (100%) rename Lib/test/{ => certdata}/make_ssl_certs.py (100%) rename Lib/test/{ => certdata}/nokia.pem (100%) rename Lib/test/{ => certdata}/nosan.pem (100%) rename Lib/test/{ => certdata}/nullbytecert.pem (100%) rename Lib/test/{ => certdata}/nullcert.pem (100%) rename Lib/test/{ => certdata}/pycacert.pem (100%) rename Lib/test/{ => certdata}/pycakey.pem (100%) rename Lib/test/{ => certdata}/revocation.crl (100%) rename Lib/test/{ => certdata}/secp384r1.pem (100%) rename Lib/test/{ => certdata}/selfsigned_pythontestdotnet.pem (100%) rename Lib/test/{ => certdata}/ssl_cert.pem (100%) rename Lib/test/{ => certdata}/ssl_key.passwd.pem (100%) rename Lib/test/{ => certdata}/ssl_key.pem (100%) rename Lib/test/{ => certdata}/talos-2019-0758.pem (100%) diff --git a/Lib/test/allsans.pem b/Lib/test/certdata/allsans.pem similarity index 100% rename from Lib/test/allsans.pem rename to Lib/test/certdata/allsans.pem diff --git a/Lib/test/badcert.pem b/Lib/test/certdata/badcert.pem similarity index 100% rename from Lib/test/badcert.pem rename to Lib/test/certdata/badcert.pem diff --git a/Lib/test/badkey.pem b/Lib/test/certdata/badkey.pem similarity index 100% rename from Lib/test/badkey.pem rename to Lib/test/certdata/badkey.pem diff --git a/Lib/test/capath/4e1295a3.0 b/Lib/test/certdata/capath/4e1295a3.0 similarity index 100% rename from Lib/test/capath/4e1295a3.0 rename to Lib/test/certdata/capath/4e1295a3.0 diff --git a/Lib/test/capath/5ed36f99.0 b/Lib/test/certdata/capath/5ed36f99.0 similarity index 100% rename from Lib/test/capath/5ed36f99.0 rename to Lib/test/certdata/capath/5ed36f99.0 diff --git a/Lib/test/capath/6e88d7b8.0 b/Lib/test/certdata/capath/6e88d7b8.0 similarity index 100% rename from Lib/test/capath/6e88d7b8.0 rename to Lib/test/certdata/capath/6e88d7b8.0 diff --git a/Lib/test/capath/99d0fa06.0 b/Lib/test/certdata/capath/99d0fa06.0 similarity index 100% rename from Lib/test/capath/99d0fa06.0 rename to Lib/test/certdata/capath/99d0fa06.0 diff --git a/Lib/test/capath/b1930218.0 b/Lib/test/certdata/capath/b1930218.0 similarity index 100% rename from Lib/test/capath/b1930218.0 rename to Lib/test/certdata/capath/b1930218.0 diff --git a/Lib/test/capath/ceff1710.0 b/Lib/test/certdata/capath/ceff1710.0 similarity index 100% rename from Lib/test/capath/ceff1710.0 rename to Lib/test/certdata/capath/ceff1710.0 diff --git a/Lib/test/ffdh3072.pem b/Lib/test/certdata/ffdh3072.pem similarity index 100% rename from Lib/test/ffdh3072.pem rename to Lib/test/certdata/ffdh3072.pem diff --git a/Lib/test/idnsans.pem b/Lib/test/certdata/idnsans.pem similarity index 100% rename from Lib/test/idnsans.pem rename to Lib/test/certdata/idnsans.pem diff --git a/Lib/test/keycert.passwd.pem b/Lib/test/certdata/keycert.passwd.pem similarity index 100% rename from Lib/test/keycert.passwd.pem rename to Lib/test/certdata/keycert.passwd.pem diff --git a/Lib/test/keycert.pem b/Lib/test/certdata/keycert.pem similarity index 100% rename from Lib/test/keycert.pem rename to Lib/test/certdata/keycert.pem diff --git a/Lib/test/keycert2.pem b/Lib/test/certdata/keycert2.pem similarity index 100% rename from Lib/test/keycert2.pem rename to Lib/test/certdata/keycert2.pem diff --git a/Lib/test/keycert3.pem b/Lib/test/certdata/keycert3.pem similarity index 100% rename from Lib/test/keycert3.pem rename to Lib/test/certdata/keycert3.pem diff --git a/Lib/test/keycert4.pem b/Lib/test/certdata/keycert4.pem similarity index 100% rename from Lib/test/keycert4.pem rename to Lib/test/certdata/keycert4.pem diff --git a/Lib/test/keycertecc.pem b/Lib/test/certdata/keycertecc.pem similarity index 100% rename from Lib/test/keycertecc.pem rename to Lib/test/certdata/keycertecc.pem diff --git a/Lib/test/make_ssl_certs.py b/Lib/test/certdata/make_ssl_certs.py similarity index 100% rename from Lib/test/make_ssl_certs.py rename to Lib/test/certdata/make_ssl_certs.py diff --git a/Lib/test/nokia.pem b/Lib/test/certdata/nokia.pem similarity index 100% rename from Lib/test/nokia.pem rename to Lib/test/certdata/nokia.pem diff --git a/Lib/test/nosan.pem b/Lib/test/certdata/nosan.pem similarity index 100% rename from Lib/test/nosan.pem rename to Lib/test/certdata/nosan.pem diff --git a/Lib/test/nullbytecert.pem b/Lib/test/certdata/nullbytecert.pem similarity index 100% rename from Lib/test/nullbytecert.pem rename to Lib/test/certdata/nullbytecert.pem diff --git a/Lib/test/nullcert.pem b/Lib/test/certdata/nullcert.pem similarity index 100% rename from Lib/test/nullcert.pem rename to Lib/test/certdata/nullcert.pem diff --git a/Lib/test/pycacert.pem b/Lib/test/certdata/pycacert.pem similarity index 100% rename from Lib/test/pycacert.pem rename to Lib/test/certdata/pycacert.pem diff --git a/Lib/test/pycakey.pem b/Lib/test/certdata/pycakey.pem similarity index 100% rename from Lib/test/pycakey.pem rename to Lib/test/certdata/pycakey.pem diff --git a/Lib/test/revocation.crl b/Lib/test/certdata/revocation.crl similarity index 100% rename from Lib/test/revocation.crl rename to Lib/test/certdata/revocation.crl diff --git a/Lib/test/secp384r1.pem b/Lib/test/certdata/secp384r1.pem similarity index 100% rename from Lib/test/secp384r1.pem rename to Lib/test/certdata/secp384r1.pem diff --git a/Lib/test/selfsigned_pythontestdotnet.pem b/Lib/test/certdata/selfsigned_pythontestdotnet.pem similarity index 100% rename from Lib/test/selfsigned_pythontestdotnet.pem rename to Lib/test/certdata/selfsigned_pythontestdotnet.pem diff --git a/Lib/test/ssl_cert.pem b/Lib/test/certdata/ssl_cert.pem similarity index 100% rename from Lib/test/ssl_cert.pem rename to Lib/test/certdata/ssl_cert.pem diff --git a/Lib/test/ssl_key.passwd.pem b/Lib/test/certdata/ssl_key.passwd.pem similarity index 100% rename from Lib/test/ssl_key.passwd.pem rename to Lib/test/certdata/ssl_key.passwd.pem diff --git a/Lib/test/ssl_key.pem b/Lib/test/certdata/ssl_key.pem similarity index 100% rename from Lib/test/ssl_key.pem rename to Lib/test/certdata/ssl_key.pem diff --git a/Lib/test/talos-2019-0758.pem b/Lib/test/certdata/talos-2019-0758.pem similarity index 100% rename from Lib/test/talos-2019-0758.pem rename to Lib/test/certdata/talos-2019-0758.pem diff --git a/Lib/test/ssl_servers.py b/Lib/test/ssl_servers.py index a4bd7455d47e76..15b071e04dda1f 100644 --- a/Lib/test/ssl_servers.py +++ b/Lib/test/ssl_servers.py @@ -14,7 +14,7 @@ here = os.path.dirname(__file__) HOST = socket_helper.HOST -CERTFILE = os.path.join(here, 'keycert.pem') +CERTFILE = os.path.join(here, 'certdata', 'keycert.pem') # This one's based on HTTPServer, which is based on socketserver diff --git a/Lib/test/test_asyncio/utils.py b/Lib/test/test_asyncio/utils.py index 6dee5bb33b2560..64eb4410bfb5dc 100644 --- a/Lib/test/test_asyncio/utils.py +++ b/Lib/test/test_asyncio/utils.py @@ -36,21 +36,21 @@ from test.support import threading_helper -def data_file(filename): +def data_file(*filename): if hasattr(support, 'TEST_HOME_DIR'): - fullname = os.path.join(support.TEST_HOME_DIR, filename) + fullname = os.path.join(support.TEST_HOME_DIR, *filename) if os.path.isfile(fullname): return fullname - fullname = os.path.join(os.path.dirname(__file__), '..', filename) + fullname = os.path.join(os.path.dirname(__file__), '..', *filename) if os.path.isfile(fullname): return fullname - raise FileNotFoundError(filename) + raise FileNotFoundError(os.path.join(filename)) -ONLYCERT = data_file('ssl_cert.pem') -ONLYKEY = data_file('ssl_key.pem') -SIGNED_CERTFILE = data_file('keycert3.pem') -SIGNING_CA = data_file('pycacert.pem') +ONLYCERT = data_file('certdata', 'ssl_cert.pem') +ONLYKEY = data_file('certdata', 'ssl_key.pem') +SIGNED_CERTFILE = data_file('certdata', 'keycert3.pem') +SIGNING_CA = data_file('certdata', 'pycacert.pem') PEERCERT = { 'OCSP': ('http://testca.pythontest.net/testca/ocsp/',), 'caIssuers': ('http://testca.pythontest.net/testca/pycacert.cer',), diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py index 544228e3bab47b..bebd1bbb9e2703 100644 --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -325,8 +325,8 @@ def handle_error(self): if ssl is not None: - CERTFILE = os.path.join(os.path.dirname(__file__), "keycert3.pem") - CAFILE = os.path.join(os.path.dirname(__file__), "pycacert.pem") + CERTFILE = os.path.join(os.path.dirname(__file__), "certdata", "keycert3.pem") + CAFILE = os.path.join(os.path.dirname(__file__), "certdata", "pycacert.pem") class SSLConnection(asyncore.dispatcher): """An asyncore.dispatcher subclass supporting TLS/SSL.""" diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index 676725c46ec694..5d5832b62b2f94 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -21,11 +21,13 @@ here = os.path.dirname(__file__) # Self-signed cert file for 'localhost' -CERT_localhost = os.path.join(here, 'keycert.pem') +CERT_localhost = os.path.join(here, 'certdata', 'keycert.pem') # Self-signed cert file for 'fakehostname' -CERT_fakehostname = os.path.join(here, 'keycert2.pem') +CERT_fakehostname = os.path.join(here, 'certdata', 'keycert2.pem') # Self-signed cert file for self-signed.pythontest.net -CERT_selfsigned_pythontestdotnet = os.path.join(here, 'selfsigned_pythontestdotnet.pem') +CERT_selfsigned_pythontestdotnet = os.path.join( + here, 'certdata', 'selfsigned_pythontestdotnet.pem', +) # constants for testing chunked encoding chunked_start = ( diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py index a1eaf2169fe227..b97474acca370f 100644 --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -23,8 +23,8 @@ support.requires_working_socket(module=True) -CERTFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "keycert3.pem") -CAFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "pycacert.pem") +CERTFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "certdata", "keycert3.pem") +CAFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "certdata", "pycacert.pem") class TestImaplib(unittest.TestCase): diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 2305e5162f901e..375f65f9d16182 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -2170,7 +2170,7 @@ def test_output(self): sslctx = None else: here = os.path.dirname(__file__) - localhost_cert = os.path.join(here, "keycert.pem") + localhost_cert = os.path.join(here, "certdata", "keycert.pem") sslctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) sslctx.load_cert_chain(localhost_cert) diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py index fa41ba0b6e4637..869f9431b928bb 100644 --- a/Lib/test/test_poplib.py +++ b/Lib/test/test_poplib.py @@ -29,8 +29,8 @@ import ssl SUPPORTS_SSL = True - CERTFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "keycert3.pem") - CAFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "pycacert.pem") + CERTFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "certdata", "keycert3.pem") + CAFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "certdata", "pycacert.pem") requires_ssl = skipUnless(SUPPORTS_SSL, 'SSL not supported') diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 2c32fec5104c23..06304dcb4ec7b8 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -60,10 +60,10 @@ PROTOCOL_TO_TLS_VERSION[proto] = ver def data_file(*name): - return os.path.join(os.path.dirname(__file__), *name) + return os.path.join(os.path.dirname(__file__), "certdata", *name) # The custom key and certificate files used in test_ssl are generated -# using Lib/test/make_ssl_certs.py. +# using Lib/test/certdata/make_ssl_certs.py. # Other certificates are simply fetched from the internet servers they # are meant to authenticate. @@ -641,7 +641,7 @@ def test_openssl111_deprecations(self): def bad_cert_test(self, certfile): """Check that trying to use the given client certificate fails""" certfile = os.path.join(os.path.dirname(__file__) or os.curdir, - certfile) + "certdata", certfile) sock = socket.socket() self.addCleanup(sock.close) with self.assertRaises(ssl.SSLError): @@ -3309,12 +3309,12 @@ def test_socketserver(self): # try to connect if support.verbose: sys.stdout.write('\n') - with open(CERTFILE, 'rb') as f: + # Get this test file itself: + with open(__file__, 'rb') as f: d1 = f.read() d2 = '' # now fetch the same data from the HTTPS server - url = 'https://localhost:%d/%s' % ( - server.port, os.path.split(CERTFILE)[1]) + url = f'https://localhost:{server.port}/test_ssl.py' context = ssl.create_default_context(cafile=SIGNING_CA) f = urllib.request.urlopen(url, context=context) try: diff --git a/Lib/test/test_urllib2_localnet.py b/Lib/test/test_urllib2_localnet.py index 0dcdbac76b50f2..50c491a3cfd3d0 100644 --- a/Lib/test/test_urllib2_localnet.py +++ b/Lib/test/test_urllib2_localnet.py @@ -21,9 +21,9 @@ here = os.path.dirname(__file__) # Self-signed cert file for 'localhost' -CERT_localhost = os.path.join(here, 'keycert.pem') +CERT_localhost = os.path.join(here, 'certdata', 'keycert.pem') # Self-signed cert file for 'fakehostname' -CERT_fakehostname = os.path.join(here, 'keycert2.pem') +CERT_fakehostname = os.path.join(here, 'certdata', 'keycert2.pem') # Loopback http server infrastructure diff --git a/Makefile.pre.in b/Makefile.pre.in index ba35e1b563ce26..35f254508579bf 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -2141,7 +2141,8 @@ LIBSUBDIRS= asyncio \ TESTSUBDIRS= idlelib/idle_test \ test \ test/audiodata \ - test/capath \ + test/certdata \ + test/certdata/capath \ test/cjkencodings \ test/crashers \ test/data \ From add16f1a5e4013f97d33cc677dc008e8199f5b11 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 17 Sep 2023 14:23:31 +0300 Subject: [PATCH 232/357] gh-108511: Add C API functions which do not silently ignore errors (GH-109025) Add the following functions: * PyObject_HasAttrWithError() * PyObject_HasAttrStringWithError() * PyMapping_HasKeyWithError() * PyMapping_HasKeyStringWithError() --- Doc/c-api/mapping.rst | 25 ++++++- Doc/c-api/object.rst | 25 ++++++- Doc/data/stable_abi.dat | 4 ++ Doc/whatsnew/3.13.rst | 12 ++++ Include/abstract.h | 31 +++++++++ Include/object.h | 4 ++ Lib/test/test_capi/test_abstract.py | 66 +++++++++++++++++++ Lib/test/test_stable_abi_ctypes.py | 4 ++ ...-09-01-16-28-09.gh-issue-108511.gg-QDG.rst | 4 ++ Misc/stable_abi.toml | 8 +++ Modules/_ctypes/stgdict.c | 6 +- Modules/_elementtree.c | 3 +- Modules/_io/iobase.c | 6 +- Modules/_io/textio.c | 3 +- Modules/_pickle.c | 7 +- Modules/_testcapi/abstract.c | 54 +++++++++++++++ Modules/_xxinterpchannelsmodule.c | 2 +- Modules/_xxsubinterpretersmodule.c | 2 +- Objects/abstract.c | 18 +++++ Objects/dictobject.c | 7 +- Objects/genericaliasobject.c | 35 ++++------ Objects/object.c | 47 ++++++------- Objects/typeobject.c | 8 +-- Objects/unionobject.c | 27 +++----- PC/python3dll.c | 4 ++ Python/errors.c | 16 ++--- Python/import.c | 7 +- Python/suggestions.c | 6 +- 28 files changed, 330 insertions(+), 111 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2023-09-01-16-28-09.gh-issue-108511.gg-QDG.rst diff --git a/Doc/c-api/mapping.rst b/Doc/c-api/mapping.rst index 5b909ef8f5e2ce..1f55c0aa955c75 100644 --- a/Doc/c-api/mapping.rst +++ b/Doc/c-api/mapping.rst @@ -76,6 +76,24 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and rather than a :c:expr:`PyObject*`. +.. c:function:: int PyMapping_HasKeyWithError(PyObject *o, PyObject *key) + + Return ``1`` if the mapping object has the key *key* and ``0`` otherwise. + This is equivalent to the Python expression ``key in o``. + On failure, return ``-1``. + + .. versionadded:: 3.13 + + +.. c:function:: int PyMapping_HasKeyStringWithError(PyObject *o, const char *key) + + This is the same as :c:func:`PyMapping_HasKeyWithError`, but *key* is + specified as a :c:expr:`const char*` UTF-8 encoded bytes string, + rather than a :c:expr:`PyObject*`. + + .. versionadded:: 3.13 + + .. c:function:: int PyMapping_HasKey(PyObject *o, PyObject *key) Return ``1`` if the mapping object has the key *key* and ``0`` otherwise. @@ -86,8 +104,8 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and Exceptions which occur when this calls :meth:`~object.__getitem__` method are silently ignored. - For proper error handling, use :c:func:`PyMapping_GetOptionalItem` or - :c:func:`PyObject_GetItem()` instead. + For proper error handling, use :c:func:`PyMapping_HasKeyWithError`, + :c:func:`PyMapping_GetOptionalItem` or :c:func:`PyObject_GetItem()` instead. .. c:function:: int PyMapping_HasKeyString(PyObject *o, const char *key) @@ -101,7 +119,8 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and Exceptions that occur when this calls :meth:`~object.__getitem__` method or while creating the temporary :class:`str` object are silently ignored. - For proper error handling, use :c:func:`PyMapping_GetOptionalItemString` or + For proper error handling, use :c:func:`PyMapping_HasKeyStringWithError`, + :c:func:`PyMapping_GetOptionalItemString` or :c:func:`PyMapping_GetItemString` instead. diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index 2572c087738fe3..bf55b5788efa47 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -27,6 +27,24 @@ Object Protocol instead of the :func:`repr`. +.. c:function:: int PyObject_HasAttrWithError(PyObject *o, const char *attr_name) + + Returns ``1`` if *o* has the attribute *attr_name*, and ``0`` otherwise. + This is equivalent to the Python expression ``hasattr(o, attr_name)``. + On failure, return ``-1``. + + .. versionadded:: 3.13 + + +.. c:function:: int PyObject_HasAttrStringWithError(PyObject *o, const char *attr_name) + + This is the same as :c:func:`PyObject_HasAttrWithError`, but *attr_name* is + specified as a :c:expr:`const char*` UTF-8 encoded bytes string, + rather than a :c:expr:`PyObject*`. + + .. versionadded:: 3.13 + + .. c:function:: int PyObject_HasAttr(PyObject *o, PyObject *attr_name) Returns ``1`` if *o* has the attribute *attr_name*, and ``0`` otherwise. This @@ -37,8 +55,8 @@ Object Protocol Exceptions that occur when this calls :meth:`~object.__getattr__` and :meth:`~object.__getattribute__` methods are silently ignored. - For proper error handling, use :c:func:`PyObject_GetOptionalAttr` or - :c:func:`PyObject_GetAttr` instead. + For proper error handling, use :c:func:`PyObject_HasAttrWithError`, + :c:func:`PyObject_GetOptionalAttr` or :c:func:`PyObject_GetAttr` instead. .. c:function:: int PyObject_HasAttrString(PyObject *o, const char *attr_name) @@ -52,7 +70,8 @@ Object Protocol Exceptions that occur when this calls :meth:`~object.__getattr__` and :meth:`~object.__getattribute__` methods or while creating the temporary :class:`str` object are silently ignored. - For proper error handling, use :c:func:`PyObject_GetOptionalAttrString` + For proper error handling, use :c:func:`PyObject_HasAttrStringWithError`, + :c:func:`PyObject_GetOptionalAttrString` or :c:func:`PyObject_GetAttrString` instead. diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index cc6349a0330e8c..c189c78238f40f 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -377,6 +377,8 @@ function,PyMapping_GetOptionalItem,3.13,, function,PyMapping_GetOptionalItemString,3.13,, function,PyMapping_HasKey,3.2,, function,PyMapping_HasKeyString,3.2,, +function,PyMapping_HasKeyStringWithError,3.13,, +function,PyMapping_HasKeyWithError,3.13,, function,PyMapping_Items,3.2,, function,PyMapping_Keys,3.2,, function,PyMapping_Length,3.2,, @@ -523,6 +525,8 @@ function,PyObject_GetOptionalAttrString,3.13,, function,PyObject_GetTypeData,3.12,, function,PyObject_HasAttr,3.2,, function,PyObject_HasAttrString,3.2,, +function,PyObject_HasAttrStringWithError,3.13,, +function,PyObject_HasAttrWithError,3.13,, function,PyObject_Hash,3.2,, function,PyObject_HashNotImplemented,3.2,, function,PyObject_Init,3.2,, diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index f71bdabd31f1d3..fa24dc072ddefd 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -926,6 +926,18 @@ New Features be treated as a failure. (Contributed by Serhiy Storchaka in :gh:`106307`.) +* Add fixed variants of functions which silently ignore errors: + + - :c:func:`PyObject_HasAttrWithError` replaces :c:func:`PyObject_HasAttr`. + - :c:func:`PyObject_HasAttrStringWithError` replaces :c:func:`PyObject_HasAttrString`. + - :c:func:`PyMapping_HasKeyWithError` replaces :c:func:`PyMapping_HasKey`. + - :c:func:`PyMapping_HasKeyStringWithError` replaces :c:func:`PyMapping_HasKeyString`. + + New functions return not only ``1`` for true and ``0`` for false, but also + ``-1`` for error. + + (Contributed by Serhiy Storchaka in :gh:`108511`.) + * If Python is built in :ref:`debug mode ` or :option:`with assertions <--with-assertions>`, :c:func:`PyTuple_SET_ITEM` and :c:func:`PyList_SET_ITEM` now check the index argument with an assertion. diff --git a/Include/abstract.h b/Include/abstract.h index dd915004e7834e..bd12a54963c13f 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -50,6 +50,25 @@ extern "C" { This function always succeeds. */ + +/* Implemented elsewhere: + + int PyObject_HasAttrStringWithError(PyObject *o, const char *attr_name); + + Returns 1 if object 'o' has the attribute attr_name, and 0 otherwise. + This is equivalent to the Python expression: hasattr(o,attr_name). + Returns -1 on failure. */ + + +/* Implemented elsewhere: + + int PyObject_HasAttrWithError(PyObject *o, PyObject *attr_name); + + Returns 1 if o has the attribute attr_name, and 0 otherwise. + This is equivalent to the Python expression: hasattr(o,attr_name). + Returns -1 on failure. */ + + /* Implemented elsewhere: PyObject* PyObject_GetAttr(PyObject *o, PyObject *attr_name); @@ -821,6 +840,18 @@ PyAPI_FUNC(int) PyMapping_HasKeyString(PyObject *o, const char *key); This function always succeeds. */ PyAPI_FUNC(int) PyMapping_HasKey(PyObject *o, PyObject *key); +/* Return 1 if the mapping object has the key 'key', and 0 otherwise. + This is equivalent to the Python expression: key in o. + On failure, return -1. */ + +PyAPI_FUNC(int) PyMapping_HasKeyWithError(PyObject *o, PyObject *key); + +/* Return 1 if the mapping object has the key 'key', and 0 otherwise. + This is equivalent to the Python expression: key in o. + On failure, return -1. */ + +PyAPI_FUNC(int) PyMapping_HasKeyStringWithError(PyObject *o, const char *key); + /* On success, return a list or tuple of the keys in mapping object 'o'. On failure, return NULL. */ PyAPI_FUNC(PyObject *) PyMapping_Keys(PyObject *o); diff --git a/Include/object.h b/Include/object.h index b94b2907e4f163..5bcb3937b8c896 100644 --- a/Include/object.h +++ b/Include/object.h @@ -394,6 +394,10 @@ PyAPI_FUNC(int) PyObject_GetOptionalAttrString(PyObject *, const char *, PyObjec PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *); PyAPI_FUNC(int) PyObject_DelAttr(PyObject *v, PyObject *name); PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +PyAPI_FUNC(int) PyObject_HasAttrWithError(PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_HasAttrStringWithError(PyObject *, const char *); +#endif PyAPI_FUNC(PyObject *) PyObject_SelfIter(PyObject *); PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *); PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, PyObject *, PyObject *); diff --git a/Lib/test/test_capi/test_abstract.py b/Lib/test/test_capi/test_abstract.py index 671f62b977d2aa..7fad853ff54fe3 100644 --- a/Lib/test/test_capi/test_abstract.py +++ b/Lib/test/test_capi/test_abstract.py @@ -129,6 +129,34 @@ def test_object_hasattrstring(self): # CRASHES hasattrstring(obj, NULL) # CRASHES hasattrstring(NULL, b'a') + def test_object_hasattrwitherror(self): + xhasattr = _testcapi.object_hasattrwitherror + obj = TestObject() + obj.a = 1 + setattr(obj, '\U0001f40d', 2) + self.assertTrue(xhasattr(obj, 'a')) + self.assertFalse(xhasattr(obj, 'b')) + self.assertTrue(xhasattr(obj, '\U0001f40d')) + + self.assertRaises(RuntimeError, xhasattr, obj, 'evil') + self.assertRaises(TypeError, xhasattr, obj, 1) + # CRASHES xhasattr(obj, NULL) + # CRASHES xhasattr(NULL, 'a') + + def test_object_hasattrstringwitherror(self): + hasattrstring = _testcapi.object_hasattrstringwitherror + obj = TestObject() + obj.a = 1 + setattr(obj, '\U0001f40d', 2) + self.assertTrue(hasattrstring(obj, b'a')) + self.assertFalse(hasattrstring(obj, b'b')) + self.assertTrue(hasattrstring(obj, '\U0001f40d'.encode())) + + self.assertRaises(RuntimeError, hasattrstring, obj, b'evil') + self.assertRaises(UnicodeDecodeError, hasattrstring, obj, b'\xff') + # CRASHES hasattrstring(obj, NULL) + # CRASHES hasattrstring(NULL, b'a') + def test_object_setattr(self): xsetattr = _testcapi.object_setattr obj = TestObject() @@ -339,6 +367,44 @@ def test_mapping_haskeystring(self): self.assertFalse(haskeystring([], b'a')) self.assertFalse(haskeystring(NULL, b'a')) + def test_mapping_haskeywitherror(self): + haskey = _testcapi.mapping_haskeywitherror + dct = {'a': 1, '\U0001f40d': 2} + self.assertTrue(haskey(dct, 'a')) + self.assertFalse(haskey(dct, 'b')) + self.assertTrue(haskey(dct, '\U0001f40d')) + + dct2 = ProxyGetItem(dct) + self.assertTrue(haskey(dct2, 'a')) + self.assertFalse(haskey(dct2, 'b')) + + self.assertTrue(haskey(['a', 'b', 'c'], 1)) + + self.assertRaises(TypeError, haskey, 42, 'a') + self.assertRaises(TypeError, haskey, {}, []) # unhashable + self.assertRaises(IndexError, haskey, [], 1) + self.assertRaises(TypeError, haskey, [], 'a') + + # CRASHES haskey({}, NULL)) + # CRASHES haskey(NULL, 'a')) + + def test_mapping_haskeystringwitherror(self): + haskeystring = _testcapi.mapping_haskeystringwitherror + dct = {'a': 1, '\U0001f40d': 2} + self.assertTrue(haskeystring(dct, b'a')) + self.assertFalse(haskeystring(dct, b'b')) + self.assertTrue(haskeystring(dct, '\U0001f40d'.encode())) + + dct2 = ProxyGetItem(dct) + self.assertTrue(haskeystring(dct2, b'a')) + self.assertFalse(haskeystring(dct2, b'b')) + + self.assertRaises(TypeError, haskeystring, 42, b'a') + self.assertRaises(UnicodeDecodeError, haskeystring, {}, b'\xff') + self.assertRaises(SystemError, haskeystring, {}, NULL) + self.assertRaises(TypeError, haskeystring, [], b'a') + # CRASHES haskeystring(NULL, b'a') + def test_object_setitem(self): setitem = _testcapi.object_setitem dct = {} diff --git a/Lib/test/test_stable_abi_ctypes.py b/Lib/test/test_stable_abi_ctypes.py index 1f3cf612c18f6d..94f817f8e1d159 100644 --- a/Lib/test/test_stable_abi_ctypes.py +++ b/Lib/test/test_stable_abi_ctypes.py @@ -405,6 +405,8 @@ def test_windows_feature_macros(self): "PyMapping_GetOptionalItemString", "PyMapping_HasKey", "PyMapping_HasKeyString", + "PyMapping_HasKeyStringWithError", + "PyMapping_HasKeyWithError", "PyMapping_Items", "PyMapping_Keys", "PyMapping_Length", @@ -542,6 +544,8 @@ def test_windows_feature_macros(self): "PyObject_GetTypeData", "PyObject_HasAttr", "PyObject_HasAttrString", + "PyObject_HasAttrStringWithError", + "PyObject_HasAttrWithError", "PyObject_Hash", "PyObject_HashNotImplemented", "PyObject_Init", diff --git a/Misc/NEWS.d/next/C API/2023-09-01-16-28-09.gh-issue-108511.gg-QDG.rst b/Misc/NEWS.d/next/C API/2023-09-01-16-28-09.gh-issue-108511.gg-QDG.rst new file mode 100644 index 00000000000000..1e5f32905aa24d --- /dev/null +++ b/Misc/NEWS.d/next/C API/2023-09-01-16-28-09.gh-issue-108511.gg-QDG.rst @@ -0,0 +1,4 @@ +Add functions :c:func:`PyObject_HasAttrWithError`, +:c:func:`PyObject_HasAttrStringWithError`, +:c:func:`PyMapping_HasKeyWithError` and +:c:func:`PyMapping_HasKeyStringWithError`. diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml index 2030a085abf27c..8df3f85e61eec6 100644 --- a/Misc/stable_abi.toml +++ b/Misc/stable_abi.toml @@ -2452,3 +2452,11 @@ added = '3.13' [function.PyLong_AsInt] added = '3.13' +[function.PyObject_HasAttrWithError] + added = '3.13' +[function.PyObject_HasAttrStringWithError] + added = '3.13' +[function.PyMapping_HasKeyWithError] + added = '3.13' +[function.PyMapping_HasKeyStringWithError] + added = '3.13' diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c index 9b0ca73a8b1751..6fbcf77a115371 100644 --- a/Modules/_ctypes/stgdict.c +++ b/Modules/_ctypes/stgdict.c @@ -386,11 +386,11 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct if (fields == NULL) return 0; - if (PyObject_GetOptionalAttr(type, &_Py_ID(_swappedbytes_), &tmp) < 0) { + int rc = PyObject_HasAttrWithError(type, &_Py_ID(_swappedbytes_)); + if (rc < 0) { return -1; } - if (tmp) { - Py_DECREF(tmp); + if (rc) { big_endian = !PY_BIG_ENDIAN; } else { diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 8cb57e693d81d7..f9d5793f9b6497 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -3532,12 +3532,11 @@ expat_start_doctype_handler(XMLParserObject *self, sysid_obj, NULL); Py_XDECREF(res); } - else if (PyObject_GetOptionalAttr((PyObject *)self, st->str_doctype, &res) > 0) { + else if (PyObject_HasAttrWithError((PyObject *)self, st->str_doctype) > 0) { (void)PyErr_WarnEx(PyExc_RuntimeWarning, "The doctype() method of XMLParser is ignored. " "Define doctype() method on the TreeBuilder target.", 1); - Py_DECREF(res); } Py_DECREF(doctype_name_obj); diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 34fcd702391f32..78f0f949b68c06 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -148,13 +148,9 @@ _io__IOBase_truncate_impl(PyObject *self, PyTypeObject *cls, static int iobase_is_closed(PyObject *self) { - PyObject *res; - int ret; /* This gets the derived attribute, which is *not* __IOBase_closed in most cases! */ - ret = PyObject_GetOptionalAttr(self, &_Py_ID(__IOBase_closed), &res); - Py_XDECREF(res); - return ret; + return PyObject_HasAttrWithError(self, &_Py_ID(__IOBase_closed)); } /* Flush and close methods */ diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 0a727a6e0ecd8a..91b677bde77dde 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -1223,11 +1223,10 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, goto error; self->seekable = self->telling = r; - r = PyObject_GetOptionalAttr(buffer, &_Py_ID(read1), &res); + r = PyObject_HasAttrWithError(buffer, &_Py_ID(read1)); if (r < 0) { goto error; } - Py_XDECREF(res); self->has_read1 = r; self->encoding_start_of_stream = 0; diff --git a/Modules/_pickle.c b/Modules/_pickle.c index b97524856eeca8..a3cf34699ba509 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -5799,14 +5799,13 @@ instantiate(PyObject *cls, PyObject *args) into a newly created tuple. */ assert(PyTuple_Check(args)); if (!PyTuple_GET_SIZE(args) && PyType_Check(cls)) { - PyObject *func; - if (PyObject_GetOptionalAttr(cls, &_Py_ID(__getinitargs__), &func) < 0) { + int rc = PyObject_HasAttrWithError(cls, &_Py_ID(__getinitargs__)); + if (rc < 0) { return NULL; } - if (func == NULL) { + if (!rc) { return PyObject_CallMethodOneArg(cls, &_Py_ID(__new__), cls); } - Py_DECREF(func); } return PyObject_CallObject(cls, args); } diff --git a/Modules/_testcapi/abstract.c b/Modules/_testcapi/abstract.c index bde0d2848954ed..81a3dea4c1dfde 100644 --- a/Modules/_testcapi/abstract.c +++ b/Modules/_testcapi/abstract.c @@ -105,6 +105,31 @@ object_hasattrstring(PyObject *self, PyObject *args) return PyLong_FromLong(PyObject_HasAttrString(obj, attr_name)); } +static PyObject * +object_hasattrwitherror(PyObject *self, PyObject *args) +{ + PyObject *obj, *attr_name; + if (!PyArg_ParseTuple(args, "OO", &obj, &attr_name)) { + return NULL; + } + NULLABLE(obj); + NULLABLE(attr_name); + RETURN_INT(PyObject_HasAttrWithError(obj, attr_name)); +} + +static PyObject * +object_hasattrstringwitherror(PyObject *self, PyObject *args) +{ + PyObject *obj; + const char *attr_name; + Py_ssize_t size; + if (!PyArg_ParseTuple(args, "Oz#", &obj, &attr_name, &size)) { + return NULL; + } + NULLABLE(obj); + RETURN_INT(PyObject_HasAttrStringWithError(obj, attr_name)); +} + static PyObject * object_setattr(PyObject *self, PyObject *args) { @@ -280,6 +305,31 @@ mapping_haskeystring(PyObject *self, PyObject *args) return PyLong_FromLong(PyMapping_HasKeyString(mapping, key)); } +static PyObject * +mapping_haskeywitherror(PyObject *self, PyObject *args) +{ + PyObject *mapping, *key; + if (!PyArg_ParseTuple(args, "OO", &mapping, &key)) { + return NULL; + } + NULLABLE(mapping); + NULLABLE(key); + RETURN_INT(PyMapping_HasKeyWithError(mapping, key)); +} + +static PyObject * +mapping_haskeystringwitherror(PyObject *self, PyObject *args) +{ + PyObject *mapping; + const char *key; + Py_ssize_t size; + if (!PyArg_ParseTuple(args, "Oz#", &mapping, &key, &size)) { + return NULL; + } + NULLABLE(mapping); + RETURN_INT(PyMapping_HasKeyStringWithError(mapping, key)); +} + static PyObject * object_setitem(PyObject *self, PyObject *args) { @@ -568,6 +618,8 @@ static PyMethodDef test_methods[] = { {"object_getoptionalattrstring", object_getoptionalattrstring, METH_VARARGS}, {"object_hasattr", object_hasattr, METH_VARARGS}, {"object_hasattrstring", object_hasattrstring, METH_VARARGS}, + {"object_hasattrwitherror", object_hasattrwitherror, METH_VARARGS}, + {"object_hasattrstringwitherror", object_hasattrstringwitherror, METH_VARARGS}, {"object_setattr", object_setattr, METH_VARARGS}, {"object_setattrstring", object_setattrstring, METH_VARARGS}, {"object_delattr", object_delattr, METH_VARARGS}, @@ -582,6 +634,8 @@ static PyMethodDef test_methods[] = { {"mapping_getoptionalitemstring", mapping_getoptionalitemstring, METH_VARARGS}, {"mapping_haskey", mapping_haskey, METH_VARARGS}, {"mapping_haskeystring", mapping_haskeystring, METH_VARARGS}, + {"mapping_haskeywitherror", mapping_haskeywitherror, METH_VARARGS}, + {"mapping_haskeystringwitherror", mapping_haskeystringwitherror, METH_VARARGS}, {"object_setitem", object_setitem, METH_VARARGS}, {"mapping_setitemstring", mapping_setitemstring, METH_VARARGS}, {"object_delitem", object_delitem, METH_VARARGS}, diff --git a/Modules/_xxinterpchannelsmodule.c b/Modules/_xxinterpchannelsmodule.c index 1e418414767db8..60ac8ed1b38ff2 100644 --- a/Modules/_xxinterpchannelsmodule.c +++ b/Modules/_xxinterpchannelsmodule.c @@ -123,7 +123,7 @@ get_module_from_type(PyTypeObject *cls) static PyObject * add_new_exception(PyObject *mod, const char *name, PyObject *base) { - assert(!PyObject_HasAttrString(mod, name)); + assert(!PyObject_HasAttrStringWithError(mod, name)); PyObject *exctype = PyErr_NewException(name, base, NULL); if (exctype == NULL) { return NULL; diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 6638c2c8e0636b..2dd8d9a6f3eb7d 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -41,7 +41,7 @@ _get_current_interp(void) static PyObject * add_new_exception(PyObject *mod, const char *name, PyObject *base) { - assert(!PyObject_HasAttrString(mod, name)); + assert(!PyObject_HasAttrStringWithError(mod, name)); PyObject *exctype = PyErr_NewException(name, base, NULL); if (exctype == NULL) { return NULL; diff --git a/Objects/abstract.c b/Objects/abstract.c index b57190d2521e11..55d3b3ada296be 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2426,6 +2426,24 @@ PyMapping_SetItemString(PyObject *o, const char *key, PyObject *value) return r; } +int +PyMapping_HasKeyStringWithError(PyObject *obj, const char *key) +{ + PyObject *res; + int rc = PyMapping_GetOptionalItemString(obj, key, &res); + Py_XDECREF(res); + return rc; +} + +int +PyMapping_HasKeyWithError(PyObject *obj, PyObject *key) +{ + PyObject *res; + int rc = PyMapping_GetOptionalItem(obj, key, &res); + Py_XDECREF(res); + return rc; +} + int PyMapping_HasKeyString(PyObject *o, const char *key) { diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 329581c8692c40..1fb795f5097897 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2688,12 +2688,11 @@ dict_update_arg(PyObject *self, PyObject *arg) if (PyDict_CheckExact(arg)) { return PyDict_Merge(self, arg, 1); } - PyObject *func; - if (PyObject_GetOptionalAttr(arg, &_Py_ID(keys), &func) < 0) { + int has_keys = PyObject_HasAttrWithError(arg, &_Py_ID(keys)); + if (has_keys < 0) { return -1; } - if (func != NULL) { - Py_DECREF(func); + if (has_keys) { return PyDict_Merge(self, arg, 1); } return PyDict_MergeFromSeq2(self, arg, 1); diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index ca172440a3ac01..bf13ed3650bac5 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -55,8 +55,7 @@ ga_repr_item(_PyUnicodeWriter *writer, PyObject *p) PyObject *qualname = NULL; PyObject *module = NULL; PyObject *r = NULL; - PyObject *tmp; - int err; + int rc; if (p == Py_Ellipsis) { // The Ellipsis object @@ -64,19 +63,14 @@ ga_repr_item(_PyUnicodeWriter *writer, PyObject *p) goto done; } - if (PyObject_GetOptionalAttr(p, &_Py_ID(__origin__), &tmp) < 0) { - goto done; + if ((rc = PyObject_HasAttrWithError(p, &_Py_ID(__origin__))) > 0 && + (rc = PyObject_HasAttrWithError(p, &_Py_ID(__args__))) > 0) + { + // It looks like a GenericAlias + goto use_repr; } - if (tmp != NULL) { - Py_DECREF(tmp); - if (PyObject_GetOptionalAttr(p, &_Py_ID(__args__), &tmp) < 0) { - goto done; - } - if (tmp != NULL) { - Py_DECREF(tmp); - // It looks like a GenericAlias - goto use_repr; - } + if (rc < 0) { + goto done; } if (PyObject_GetOptionalAttr(p, &_Py_ID(__qualname__), &qualname) < 0) { @@ -113,13 +107,13 @@ ga_repr_item(_PyUnicodeWriter *writer, PyObject *p) Py_XDECREF(module); if (r == NULL) { // error if any of the above PyObject_Repr/PyUnicode_From* fail - err = -1; + rc = -1; } else { - err = _PyUnicodeWriter_WriteStr(writer, r); + rc = _PyUnicodeWriter_WriteStr(writer, r); Py_DECREF(r); } - return err; + return rc; } static int @@ -253,18 +247,17 @@ _Py_make_parameters(PyObject *args) Py_ssize_t iparam = 0; for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) { PyObject *t = PyTuple_GET_ITEM(args, iarg); - PyObject *subst; // We don't want __parameters__ descriptor of a bare Python class. if (PyType_Check(t)) { continue; } - if (PyObject_GetOptionalAttr(t, &_Py_ID(__typing_subst__), &subst) < 0) { + int rc = PyObject_HasAttrWithError(t, &_Py_ID(__typing_subst__)); + if (rc < 0) { Py_DECREF(parameters); return NULL; } - if (subst) { + if (rc) { iparam += tuple_add(parameters, iparam, t); - Py_DECREF(subst); } else { PyObject *subparams; diff --git a/Objects/object.c b/Objects/object.c index 7aeda50e9b2757..15c2bf65de6acf 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -911,26 +911,24 @@ PyObject_GetAttrString(PyObject *v, const char *name) } int -PyObject_HasAttrString(PyObject *v, const char *name) +PyObject_HasAttrStringWithError(PyObject *obj, const char *name) { - if (Py_TYPE(v)->tp_getattr != NULL) { - PyObject *res = (*Py_TYPE(v)->tp_getattr)(v, (char*)name); - if (res != NULL) { - Py_DECREF(res); - return 1; - } - PyErr_Clear(); - return 0; - } + PyObject *res; + int rc = PyObject_GetOptionalAttrString(obj, name, &res); + Py_XDECREF(res); + return rc; +} + - PyObject *attr_name = PyUnicode_FromString(name); - if (attr_name == NULL) { +int +PyObject_HasAttrString(PyObject *obj, const char *name) +{ + int rc = PyObject_HasAttrStringWithError(obj, name); + if (rc < 0) { PyErr_Clear(); return 0; } - int ok = PyObject_HasAttr(v, attr_name); - Py_DECREF(attr_name); - return ok; + return rc; } int @@ -1149,18 +1147,23 @@ PyObject_GetOptionalAttrString(PyObject *obj, const char *name, PyObject **resul } int -PyObject_HasAttr(PyObject *v, PyObject *name) +PyObject_HasAttrWithError(PyObject *obj, PyObject *name) { PyObject *res; - if (PyObject_GetOptionalAttr(v, name, &res) < 0) { + int rc = PyObject_GetOptionalAttr(obj, name, &res); + Py_XDECREF(res); + return rc; +} + +int +PyObject_HasAttr(PyObject *obj, PyObject *name) +{ + int rc = PyObject_HasAttrWithError(obj, name); + if (rc < 0) { PyErr_Clear(); return 0; } - if (res == NULL) { - return 0; - } - Py_DECREF(res); - return 1; + return rc; } int diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 84c50507691cbe..893d8420bba4c4 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -3879,16 +3879,14 @@ type_new_get_bases(type_new_ctx *ctx, PyObject **type) if (PyType_Check(base)) { continue; } - PyObject *mro_entries; - if (PyObject_GetOptionalAttr(base, &_Py_ID(__mro_entries__), - &mro_entries) < 0) { + int rc = PyObject_HasAttrWithError(base, &_Py_ID(__mro_entries__)); + if (rc < 0) { return -1; } - if (mro_entries != NULL) { + if (rc) { PyErr_SetString(PyExc_TypeError, "type() doesn't support MRO entry resolution; " "use types.new_class()"); - Py_DECREF(mro_entries); return -1; } } diff --git a/Objects/unionobject.c b/Objects/unionobject.c index 3493ab3f240abc..bf5605686f8df7 100644 --- a/Objects/unionobject.c +++ b/Objects/unionobject.c @@ -186,28 +186,21 @@ union_repr_item(_PyUnicodeWriter *writer, PyObject *p) { PyObject *qualname = NULL; PyObject *module = NULL; - PyObject *tmp; PyObject *r = NULL; - int err; + int rc; if (p == (PyObject *)&_PyNone_Type) { return _PyUnicodeWriter_WriteASCIIString(writer, "None", 4); } - if (PyObject_GetOptionalAttr(p, &_Py_ID(__origin__), &tmp) < 0) { - goto exit; + if ((rc = PyObject_HasAttrWithError(p, &_Py_ID(__origin__))) > 0 && + (rc = PyObject_HasAttrWithError(p, &_Py_ID(__args__))) > 0) + { + // It looks like a GenericAlias + goto use_repr; } - - if (tmp) { - Py_DECREF(tmp); - if (PyObject_GetOptionalAttr(p, &_Py_ID(__args__), &tmp) < 0) { - goto exit; - } - if (tmp) { - // It looks like a GenericAlias - Py_DECREF(tmp); - goto use_repr; - } + if (rc < 0) { + goto exit; } if (PyObject_GetOptionalAttr(p, &_Py_ID(__qualname__), &qualname) < 0) { @@ -244,9 +237,9 @@ union_repr_item(_PyUnicodeWriter *writer, PyObject *p) if (r == NULL) { return -1; } - err = _PyUnicodeWriter_WriteStr(writer, r); + rc = _PyUnicodeWriter_WriteStr(writer, r); Py_DECREF(r); - return err; + return rc; } static PyObject * diff --git a/PC/python3dll.c b/PC/python3dll.c index ee3a7d7b4e5be1..2c1cc8098ce856 100755 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -359,6 +359,8 @@ EXPORT_FUNC(PyMapping_GetOptionalItem) EXPORT_FUNC(PyMapping_GetOptionalItemString) EXPORT_FUNC(PyMapping_HasKey) EXPORT_FUNC(PyMapping_HasKeyString) +EXPORT_FUNC(PyMapping_HasKeyStringWithError) +EXPORT_FUNC(PyMapping_HasKeyWithError) EXPORT_FUNC(PyMapping_Items) EXPORT_FUNC(PyMapping_Keys) EXPORT_FUNC(PyMapping_Length) @@ -480,6 +482,8 @@ EXPORT_FUNC(PyObject_GetOptionalAttrString) EXPORT_FUNC(PyObject_GetTypeData) EXPORT_FUNC(PyObject_HasAttr) EXPORT_FUNC(PyObject_HasAttrString) +EXPORT_FUNC(PyObject_HasAttrStringWithError) +EXPORT_FUNC(PyObject_HasAttrWithError) EXPORT_FUNC(PyObject_Hash) EXPORT_FUNC(PyObject_HashNotImplemented) EXPORT_FUNC(PyObject_Init) diff --git a/Python/errors.c b/Python/errors.c index f670b78c1f14ef..e6fa15f92b5315 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -1776,13 +1776,11 @@ PyErr_SyntaxLocationObjectEx(PyObject *filename, int lineno, int col_offset, } } if ((PyObject *)Py_TYPE(exc) != PyExc_SyntaxError) { - if (PyObject_GetOptionalAttr(exc, &_Py_ID(msg), &tmp) < 0) { + int rc = PyObject_HasAttrWithError(exc, &_Py_ID(msg)); + if (rc < 0) { _PyErr_Clear(tstate); } - else if (tmp) { - Py_DECREF(tmp); - } - else { + else if (!rc) { tmp = PyObject_Str(exc); if (tmp) { if (PyObject_SetAttr(exc, &_Py_ID(msg), tmp)) { @@ -1795,13 +1793,11 @@ PyErr_SyntaxLocationObjectEx(PyObject *filename, int lineno, int col_offset, } } - if (PyObject_GetOptionalAttr(exc, &_Py_ID(print_file_and_line), &tmp) < 0) { + rc = PyObject_HasAttrWithError(exc, &_Py_ID(print_file_and_line)); + if (rc < 0) { _PyErr_Clear(tstate); } - else if (tmp) { - Py_DECREF(tmp); - } - else { + else if (!rc) { if (PyObject_SetAttr(exc, &_Py_ID(print_file_and_line), Py_None)) { _PyErr_Clear(tstate); } diff --git a/Python/import.c b/Python/import.c index 126eb5e162a9e1..9b0be026f36bc3 100644 --- a/Python/import.c +++ b/Python/import.c @@ -2887,12 +2887,11 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, } } else { - PyObject *path; - if (PyObject_GetOptionalAttr(mod, &_Py_ID(__path__), &path) < 0) { + int has_path = PyObject_HasAttrWithError(mod, &_Py_ID(__path__)); + if (has_path < 0) { goto error; } - if (path) { - Py_DECREF(path); + if (has_path) { final_mod = PyObject_CallMethodObjArgs( IMPORTLIB(interp), &_Py_ID(_handle_fromlist), mod, fromlist, IMPORT_FUNC(interp), NULL); diff --git a/Python/suggestions.c b/Python/suggestions.c index 9247da4c7037a2..1ad359b18923f3 100644 --- a/Python/suggestions.c +++ b/Python/suggestions.c @@ -245,14 +245,12 @@ get_suggestions_for_name_error(PyObject* name, PyFrameObject* frame) goto error; } - PyObject *value; - res = PyObject_GetOptionalAttr(self, name, &value); + res = PyObject_HasAttrWithError(self, name); Py_DECREF(locals); if (res < 0) { goto error; } - if (value) { - Py_DECREF(value); + if (res) { Py_DECREF(dir); return PyUnicode_FromFormat("self.%U", name); } From a75daed7e004ee9a53b160307c4c072656176a02 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sun, 17 Sep 2023 11:46:15 -0600 Subject: [PATCH 233/357] gh-109408: Remove Ubuntu unit tests from Azure Pipelines (#109452) --- .azure-pipelines/ci.yml | 19 ---------------- .azure-pipelines/posix-steps.yml | 37 ++++++-------------------------- .azure-pipelines/pr.yml | 6 ++---- 3 files changed, 8 insertions(+), 54 deletions(-) diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index 246e059f5d1842..42eb448bc1c66b 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -11,25 +11,6 @@ jobs: - template: ./prebuild-checks.yml -- job: Ubuntu_CI_Tests - displayName: Ubuntu CI Tests - dependsOn: Prebuild - condition: and(succeeded(), eq(dependencies.Prebuild.outputs['tests.run'], 'true')) - - pool: - vmImage: ubuntu-22.04 - - variables: - testRunTitle: '$(build.sourceBranchName)-linux' - testRunPlatform: linux - openssl_version: 1.1.1u - - steps: - - template: ./posix-steps.yml - parameters: - dependencies: apt - - - job: Windows_CI_Tests displayName: Windows CI Tests dependsOn: Prebuild diff --git a/.azure-pipelines/posix-steps.yml b/.azure-pipelines/posix-steps.yml index 65c29f60413d6a..e23c7b1dcb55c1 100644 --- a/.azure-pipelines/posix-steps.yml +++ b/.azure-pipelines/posix-steps.yml @@ -1,9 +1,3 @@ -parameters: - sudo_dependencies: sudo - dependencies: apt - patchcheck: true - xvfb: true - steps: - checkout: self clean: true @@ -13,7 +7,7 @@ steps: - script: sudo setfacl -Rb /home/vsts displayName: 'Workaround ACL issue' -- script: ${{ parameters.sudo_dependencies }} ./.azure-pipelines/posix-deps-${{ parameters.dependencies }}.sh $(openssl_version) +- script: sudo ./.azure-pipelines/posix-deps-apt.sh $(openssl_version) displayName: 'Install dependencies' - script: ./configure --with-pydebug @@ -25,27 +19,8 @@ steps: - script: make pythoninfo displayName: 'Display build info' -- script: $COMMAND buildbottest TESTOPTS="-j4 -uall,-cpu --junit-xml=$(build.binariesDirectory)/test-results.xml" - displayName: 'Tests' - env: - ${{ if eq(parameters.xvfb, 'true') }}: - COMMAND: xvfb-run make - ${{ if ne(parameters.xvfb, 'true') }}: - COMMAND: make - -- ${{ if eq(parameters.patchcheck, 'true') }}: - - script: | - git fetch origin - ./python Tools/patchcheck/patchcheck.py --ci true - displayName: 'Run patchcheck.py' - condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest')) - - -- task: PublishTestResults@2 - displayName: 'Publish Test Results' - inputs: - testResultsFiles: '$(build.binariesDirectory)/test-results.xml' - mergeTestResults: true - testRunTitle: $(testRunTitle) - platform: $(testRunPlatform) - condition: succeededOrFailed() +- script: | + git fetch origin + ./python Tools/patchcheck/patchcheck.py --ci true + displayName: 'Run patchcheck.py' + condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest')) diff --git a/.azure-pipelines/pr.yml b/.azure-pipelines/pr.yml index 0836c780c1cf95..3a8728bcda9272 100644 --- a/.azure-pipelines/pr.yml +++ b/.azure-pipelines/pr.yml @@ -11,8 +11,8 @@ jobs: - template: ./prebuild-checks.yml -- job: Ubuntu_PR_Tests - displayName: Ubuntu PR Tests +- job: Ubuntu_Patchcheck + displayName: Ubuntu patchcheck dependsOn: Prebuild condition: and(succeeded(), eq(dependencies.Prebuild.outputs['tests.run'], 'true')) @@ -26,8 +26,6 @@ jobs: steps: - template: ./posix-steps.yml - parameters: - dependencies: apt - job: Windows_PR_Tests From 54fbfa8d5e52ed315d10640c875a8b8dd2c30cec Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Mon, 18 Sep 2023 01:35:51 +0100 Subject: [PATCH 234/357] gh-109413: Improve mypy config for libregrtest (#109518) Improve the mypy config file for libregrtest --- Lib/test/libregrtest/mypy.ini | 32 +++++++++----------------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/Lib/test/libregrtest/mypy.ini b/Lib/test/libregrtest/mypy.ini index ac2f70c2c1f3ab..fefc347728a701 100644 --- a/Lib/test/libregrtest/mypy.ini +++ b/Lib/test/libregrtest/mypy.ini @@ -1,12 +1,10 @@ # Config file for running mypy on libregrtest. -# -# Note: mypy can't be run on libregrtest from the CPython repo root. -# If you try to do so, mypy will complain -# about the entire `Lib/` directory "shadowing the stdlib". -# Instead, `cd` into `Lib/test`, then run `mypy --config-file libregrtest/mypy.ini`. +# Run mypy by invoking `mypy --config-file Lib/test/libregrtest/mypy.ini` +# on the command-line from the repo root [mypy] -packages = libregrtest +files = Lib/test/libregrtest +explicit_package_bases = True python_version = 3.11 platform = linux pretty = True @@ -17,7 +15,6 @@ strict = True # Various stricter settings that we can't yet enable # Try to enable these in the following order: -strict_optional = False disallow_any_generics = False disallow_incomplete_defs = False disallow_untyped_calls = False @@ -27,21 +24,10 @@ warn_return_any = False disable_error_code = return -# Various internal modules that typeshed deliberately doesn't have stubs for: -[mypy-_abc.*] -ignore_missing_imports = True - -[mypy-_opcode.*] -ignore_missing_imports = True - -[mypy-_overlapped.*] -ignore_missing_imports = True - -[mypy-_testcapi.*] -ignore_missing_imports = True - -[mypy-_testinternalcapi.*] -ignore_missing_imports = True +# Enable --strict-optional for these ASAP: +[mypy-Lib.test.libregrtest.main.*,Lib.test.libregrtest.run_workers.*,Lib.test.libregrtest.worker.*,Lib.test.libregrtest.single.*,Lib.test.libregrtest.results.*,Lib.test.libregrtest.utils.*] +strict_optional = False -[mypy-test.*] +# Various internal modules that typeshed deliberately doesn't have stubs for: +[mypy-_abc.*,_opcode.*,_overlapped.*,_testcapi.*,_testinternalcapi.*,test.*] ignore_missing_imports = True From ce5b3e19e6fb940fa72db1b98a8df80f6e464265 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Mon, 18 Sep 2023 03:25:33 -0400 Subject: [PATCH 235/357] Fix extraneous backslashes in hashlib docs (#109468) --- Doc/library/hashlib.rst | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst index 69fb79b49ca2a0..eb650c180ddbb4 100644 --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -136,16 +136,16 @@ Using :func:`new` with an algorithm name: '031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406' -.. function:: md5([, data], \*, usedforsecurity=True) -.. function:: sha1([, data], \*, usedforsecurity=True) -.. function:: sha224([, data], \*, usedforsecurity=True) -.. function:: sha256([, data], \*, usedforsecurity=True) -.. function:: sha384([, data], \*, usedforsecurity=True) -.. function:: sha512([, data], \*, usedforsecurity=True) -.. function:: sha3_224([, data], \*, usedforsecurity=True) -.. function:: sha3_256([, data], \*, usedforsecurity=True) -.. function:: sha3_384([, data], \*, usedforsecurity=True) -.. function:: sha3_512([, data], \*, usedforsecurity=True) +.. function:: md5([, data], *, usedforsecurity=True) +.. function:: sha1([, data], *, usedforsecurity=True) +.. function:: sha224([, data], *, usedforsecurity=True) +.. function:: sha256([, data], *, usedforsecurity=True) +.. function:: sha384([, data], *, usedforsecurity=True) +.. function:: sha512([, data], *, usedforsecurity=True) +.. function:: sha3_224([, data], *, usedforsecurity=True) +.. function:: sha3_256([, data], *, usedforsecurity=True) +.. function:: sha3_384([, data], *, usedforsecurity=True) +.. function:: sha3_512([, data], *, usedforsecurity=True) Named constructors such as these are faster than passing an algorithm name to :func:`new`. @@ -234,8 +234,8 @@ A hash object has the following methods: SHAKE variable length digests ----------------------------- -.. function:: shake_128([, data], \*, usedforsecurity=True) -.. function:: shake_256([, data], \*, usedforsecurity=True) +.. function:: shake_128([, data], *, usedforsecurity=True) +.. function:: shake_256([, data], *, usedforsecurity=True) The :func:`shake_128` and :func:`shake_256` algorithms provide variable length digests with length_in_bits//2 up to 128 or 256 bits of security. From df8b3a46a7aa369f246a09ffd11ceedf1d34e921 Mon Sep 17 00:00:00 2001 From: DongWoo Son <99868561+dnd-qodqks@users.noreply.github.com> Date: Mon, 18 Sep 2023 16:27:54 +0900 Subject: [PATCH 236/357] Fix a typo in c-analyzer (#109213) Co-authored-by: sunmy2019 <59365878+sunmy2019@users.noreply.github.com> Co-authored-by: Dale Collison <92315623+dcollison@users.noreply.github.com> --- Tools/c-analyzer/c_parser/info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/c-analyzer/c_parser/info.py b/Tools/c-analyzer/c_parser/info.py index 799f9237877447..f96172e8ca8dfb 100644 --- a/Tools/c-analyzer/c_parser/info.py +++ b/Tools/c-analyzer/c_parser/info.py @@ -206,7 +206,7 @@ def from_row(cls, row, **markers): row = _tables.fix_row(row, **markers) return cls(*row) - # We have to provde _make() becaose we implemented __new__(). + # We have to provide _make() because we implemented __new__(). @classmethod def _make(cls, iterable): From 2209d814cab7630189faa0b9f9854986bd32f41c Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 18 Sep 2023 04:45:59 -0600 Subject: [PATCH 237/357] Docs: getopt is deprecated in Python 3.13 (#109438) --- Doc/library/superseded.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/library/superseded.rst b/Doc/library/superseded.rst index d43e2e530e430b..17bfa66f043302 100644 --- a/Doc/library/superseded.rst +++ b/Doc/library/superseded.rst @@ -4,11 +4,12 @@ Superseded Modules ****************** -The modules described in this chapter are deprecated and only kept for +The modules described in this chapter are deprecated or :term:`soft deprecated` and only kept for backwards compatibility. They have been superseded by other modules. .. toctree:: :maxdepth: 1 + getopt.rst optparse.rst From dd5d2141abf78fcd787f12654f08bf1ee92288bf Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 18 Sep 2023 06:37:23 -0600 Subject: [PATCH 238/357] gh-109408: Azure Pipelines: test 3.12 branch (#109453) --- .azure-pipelines/ci.yml | 2 +- .azure-pipelines/pr.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index 42eb448bc1c66b..b5b2765e43844f 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -1,4 +1,4 @@ -trigger: ['main', '3.11', '3.10', '3.9', '3.8', '3.7'] +trigger: ['main', '3.12', '3.11', '3.10', '3.9', '3.8', '3.7'] jobs: - job: Prebuild diff --git a/.azure-pipelines/pr.yml b/.azure-pipelines/pr.yml index 3a8728bcda9272..daa2c7ca97df6a 100644 --- a/.azure-pipelines/pr.yml +++ b/.azure-pipelines/pr.yml @@ -1,4 +1,4 @@ -pr: ['main', '3.11', '3.10', '3.9', '3.8', '3.7'] +pr: ['main', '3.12', '3.11', '3.10', '3.9', '3.8', '3.7'] jobs: - job: Prebuild From 4dd47c63a97b3c39cd964ad12431fcdaf76dc823 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Mon, 18 Sep 2023 16:04:17 +0300 Subject: [PATCH 239/357] gh-108303: Fix and move `badsyntax_pep3120.py` (#109513) Co-authored-by: Alex Waygood --- Lib/test/.ruff.toml | 4 ++-- Lib/test/test_utf8source.py | 4 +--- Lib/test/{ => tokenizedata}/badsyntax_pep3120.py | 0 3 files changed, 3 insertions(+), 5 deletions(-) rename Lib/test/{ => tokenizedata}/badsyntax_pep3120.py (100%) diff --git a/Lib/test/.ruff.toml b/Lib/test/.ruff.toml index a9a4a013dabec9..e202766b147e6d 100644 --- a/Lib/test/.ruff.toml +++ b/Lib/test/.ruff.toml @@ -3,12 +3,12 @@ select = [ "F811", # Redefinition of unused variable (useful for finding test methods with the same name) ] extend-exclude = [ + # Excluded (these aren't actually executed, they're just "data files") + "tokenizedata/*.py", # Failed to lint - "badsyntax_pep3120.py", "encoded_modules/module_iso_8859_1.py", "encoded_modules/module_koi8_r.py", # Failed to parse - "badsyntax_3131.py", "support/socket_helper.py", "test_fstring.py", # TODO Fix: F811 Redefinition of unused name diff --git a/Lib/test/test_utf8source.py b/Lib/test/test_utf8source.py index 97dced8a622889..c42b6aaaab579d 100644 --- a/Lib/test/test_utf8source.py +++ b/Lib/test/test_utf8source.py @@ -1,5 +1,3 @@ -# This file is marked as binary in the CVS, to prevent MacCVS from recoding it. - import unittest class PEP3120Test(unittest.TestCase): @@ -16,7 +14,7 @@ def test_pep3120(self): def test_badsyntax(self): try: - import test.badsyntax_pep3120 + import test.tokenizedata.badsyntax_pep3120 except SyntaxError as msg: msg = str(msg).lower() self.assertTrue('utf-8' in msg) diff --git a/Lib/test/badsyntax_pep3120.py b/Lib/test/tokenizedata/badsyntax_pep3120.py similarity index 100% rename from Lib/test/badsyntax_pep3120.py rename to Lib/test/tokenizedata/badsyntax_pep3120.py From 23f9f6f46454455bc6015e83ae5b5e946dae7698 Mon Sep 17 00:00:00 2001 From: Shantanu <12621235+hauntsaninja@users.noreply.github.com> Date: Mon, 18 Sep 2023 06:56:19 -0700 Subject: [PATCH 240/357] gh-108843: fix ast.unparse for f-string with many quotes (#108981) --- Lib/ast.py | 21 ++++++++++++++++++- Lib/test/test_unparse.py | 14 +++++++++++++ ...-09-06-06-17-23.gh-issue-108843.WJMhsS.rst | 1 + 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-06-06-17-23.gh-issue-108843.WJMhsS.rst diff --git a/Lib/ast.py b/Lib/ast.py index 17ec7ff6f8bc12..1f54309c8450d8 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -1236,17 +1236,36 @@ def visit_JoinedStr(self, node): new_fstring_parts = [] quote_types = list(_ALL_QUOTES) + fallback_to_repr = False for value, is_constant in fstring_parts: if is_constant: - value, quote_types = self._str_literal_helper( + value, new_quote_types = self._str_literal_helper( value, quote_types=quote_types, escape_special_whitespace=True, ) + if set(new_quote_types).isdisjoint(quote_types): + fallback_to_repr = True + break + quote_types = new_quote_types elif "\n" in value: quote_types = [q for q in quote_types if q in _MULTI_QUOTES] + assert quote_types new_fstring_parts.append(value) + if fallback_to_repr: + # If we weren't able to find a quote type that works for all parts + # of the JoinedStr, fallback to using repr and triple single quotes. + quote_types = ["'''"] + new_fstring_parts.clear() + for value, is_constant in fstring_parts: + if is_constant: + value = repr('"' + value) # force repr to use single quotes + expected_prefix = "'\"" + assert value.startswith(expected_prefix), repr(value) + value = value[len(expected_prefix):-1] + new_fstring_parts.append(value) + value = "".join(new_fstring_parts) quote_type = quote_types[0] self.write(f"{quote_type}{value}{quote_type}") diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index 38c59e6d430b58..bdf7b0588bee67 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -635,6 +635,20 @@ def test_star_expr_assign_target_multiple(self): self.check_src_roundtrip("[a, b] = [c, d] = [e, f] = g") self.check_src_roundtrip("a, b = [c, d] = e, f = g") + def test_multiquote_joined_string(self): + self.check_ast_roundtrip("f\"'''{1}\\\"\\\"\\\"\" ") + self.check_ast_roundtrip("""f"'''{1}""\\"" """) + self.check_ast_roundtrip("""f'""\"{1}''' """) + self.check_ast_roundtrip("""f'""\"{1}""\\"' """) + + self.check_ast_roundtrip("""f"'''{"\\n"}""\\"" """) + self.check_ast_roundtrip("""f'""\"{"\\n"}''' """) + self.check_ast_roundtrip("""f'""\"{"\\n"}""\\"' """) + + self.check_ast_roundtrip("""f'''""\"''\\'{"\\n"}''' """) + self.check_ast_roundtrip("""f'''""\"''\\'{"\\n\\"'"}''' """) + self.check_ast_roundtrip("""f'''""\"''\\'{""\"\\n\\"'''""\" '''\\n'''}''' """) + class ManualASTCreationTestCase(unittest.TestCase): """Test that AST nodes created without a type_params field unparse correctly.""" diff --git a/Misc/NEWS.d/next/Library/2023-09-06-06-17-23.gh-issue-108843.WJMhsS.rst b/Misc/NEWS.d/next/Library/2023-09-06-06-17-23.gh-issue-108843.WJMhsS.rst new file mode 100644 index 00000000000000..0f15761c14bb7d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-06-06-17-23.gh-issue-108843.WJMhsS.rst @@ -0,0 +1 @@ +Fix an issue in :func:`ast.unparse` when unparsing f-strings containing many quote types. From 412f5e85d6b9f2e90c57c54539d06c7a025a472a Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Mon, 18 Sep 2023 07:30:08 -0700 Subject: [PATCH 241/357] gh-109371: Fix monitoring with instruction events set (gh-109385) --- Lib/test/test_monitoring.py | 16 ++++++++++++++++ Lib/test/test_sys_setprofile.py | 13 ++++++++++++- ...023-09-13-21-04-04.gh-issue-109371.HPEJr8.rst | 1 + Python/instrumentation.c | 5 ++++- 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-13-21-04-04.gh-issue-109371.HPEJr8.rst diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py index 992d3cc8b6d7f9..2100d998ff0808 100644 --- a/Lib/test/test_monitoring.py +++ b/Lib/test/test_monitoring.py @@ -501,6 +501,22 @@ def test_two_with_disable(self): self.assertEqual(sys.monitoring._all_events(), {}) sys.monitoring.restart_events() + def test_with_instruction_event(self): + """Test that the second tool can set events with instruction events set by the first tool.""" + def f(): + pass + code = f.__code__ + + try: + self.assertEqual(sys.monitoring._all_events(), {}) + sys.monitoring.set_local_events(TEST_TOOL, code, E.INSTRUCTION | E.LINE) + sys.monitoring.set_local_events(TEST_TOOL2, code, E.LINE) + finally: + sys.monitoring.set_events(TEST_TOOL, 0) + sys.monitoring.set_events(TEST_TOOL2, 0) + self.assertEqual(sys.monitoring._all_events(), {}) + + class LineMonitoringTest(MonitoringTestBase, unittest.TestCase): def test_lines_single(self): diff --git a/Lib/test/test_sys_setprofile.py b/Lib/test/test_sys_setprofile.py index 49e076c77d167a..34c70d6c8de0c4 100644 --- a/Lib/test/test_sys_setprofile.py +++ b/Lib/test/test_sys_setprofile.py @@ -439,7 +439,6 @@ def __del__(self): sys.setprofile(foo) self.assertEqual(sys.getprofile(), bar) - def test_same_object(self): def foo(*args): ... @@ -448,6 +447,18 @@ def foo(*args): del foo sys.setprofile(sys.getprofile()) + def test_profile_after_trace_opcodes(self): + def f(): + ... + + sys._getframe().f_trace_opcodes = True + prev_trace = sys.gettrace() + sys.settrace(lambda *args: None) + f() + sys.settrace(prev_trace) + sys.setprofile(lambda *args: None) + f() + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-13-21-04-04.gh-issue-109371.HPEJr8.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-13-21-04-04.gh-issue-109371.HPEJr8.rst new file mode 100644 index 00000000000000..2fb18d5ae88347 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-13-21-04-04.gh-issue-109371.HPEJr8.rst @@ -0,0 +1 @@ +Deopted instructions correctly for tool initialization and modified the incorrect assertion in instrumentation, when a previous tool already sets INSTRUCTION events diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 0768c82ba29882..df8943b1f9a721 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -664,7 +664,7 @@ instrument(PyCodeObject *code, int i) if (opcode == INSTRUMENTED_INSTRUCTION) { opcode_ptr = &code->_co_monitoring->per_instruction_opcodes[i]; opcode = *opcode_ptr; - CHECK(!is_instrumented(opcode)); + CHECK(opcode != INSTRUMENTED_INSTRUCTION && opcode != INSTRUMENTED_LINE); CHECK(opcode == _PyOpcode_Deopt[opcode]); } CHECK(opcode != 0); @@ -1295,6 +1295,9 @@ initialize_tools(PyCodeObject *code) if (opcode == INSTRUMENTED_LINE) { opcode = code->_co_monitoring->lines[i].original_opcode; } + if (opcode == INSTRUMENTED_INSTRUCTION) { + opcode = code->_co_monitoring->per_instruction_opcodes[i]; + } bool instrumented = is_instrumented(opcode); if (instrumented) { opcode = DE_INSTRUMENT[opcode]; From ef659b96169888e52b6ff03ce28fffaaa8f76818 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 18 Sep 2023 16:45:48 +0200 Subject: [PATCH 242/357] gh-109508: Fix libregrtest formatting of getcwd() (#109537) --- Lib/test/libregrtest/utils.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 2f3bc3c6019caa..7675fbe16a2141 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -556,12 +556,21 @@ def adjust_rlimit_nofile(): def display_header(): + encoding = sys.stdout.encoding + # Print basic platform information print("==", platform.python_implementation(), *sys.version.split()) print("==", platform.platform(aliased=True), "%s-endian" % sys.byteorder) print("== Python build:", ' '.join(get_build_info())) - print("== cwd:", os.getcwd()) + + cwd = os.getcwd() + # gh-109508: support.os_helper.FS_NONASCII, used by get_work_dir(), cannot + # be encoded to the filesystem encoding on purpose, escape non-encodable + # characters with backslashreplace error handler. + formatted_cwd = cwd.encode(encoding, "backslashreplace").decode(encoding) + print("== cwd:", formatted_cwd) + cpu_count = os.cpu_count() if cpu_count: print("== CPU count:", cpu_count) From 0bb0d88e2d4e300946e399e088e2ff60de2ccf8c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 18 Sep 2023 16:59:09 +0200 Subject: [PATCH 243/357] gh-109496: Detect Py_DECREF() after dealloc in debug mode (#109539) On a Python built in debug mode, Py_DECREF() now calls _Py_NegativeRefcount() if the object is a dangling pointer to deallocated memory: memory filled with 0xDD "dead byte" by the debug hook on memory allocators. The fix is to check the reference count *before* checking for _Py_IsImmortal(). Add test_decref_freed_object() to test_capi.test_misc. --- Include/object.h | 10 +++--- Lib/test/test_capi/test_misc.py | 36 +++++++++++++------ ...-09-18-15-35-08.gh-issue-109496.Kleoz3.rst | 5 +++ Modules/_testcapimodule.c | 21 +++++++++++ 4 files changed, 56 insertions(+), 16 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-18-15-35-08.gh-issue-109496.Kleoz3.rst diff --git a/Include/object.h b/Include/object.h index 5bcb3937b8c896..9058558e3cd4d9 100644 --- a/Include/object.h +++ b/Include/object.h @@ -660,17 +660,15 @@ static inline void Py_DECREF(PyObject *op) { #elif defined(Py_REF_DEBUG) static inline void Py_DECREF(const char *filename, int lineno, PyObject *op) { + if (op->ob_refcnt <= 0) { + _Py_NegativeRefcount(filename, lineno, op); + } if (_Py_IsImmortal(op)) { return; } _Py_DECREF_STAT_INC(); _Py_DECREF_DecRefTotal(); - if (--op->ob_refcnt != 0) { - if (op->ob_refcnt < 0) { - _Py_NegativeRefcount(filename, lineno, op); - } - } - else { + if (--op->ob_refcnt == 0) { _Py_Dealloc(op); } } diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py index c9cc76a4c80ae8..57edacbae35634 100644 --- a/Lib/test/test_capi/test_misc.py +++ b/Lib/test/test_capi/test_misc.py @@ -301,24 +301,40 @@ def test_getitem_with_error(self): def test_buildvalue_N(self): _testcapi.test_buildvalue_N() - @unittest.skipUnless(hasattr(_testcapi, 'negative_refcount'), - 'need _testcapi.negative_refcount') - def test_negative_refcount(self): + def check_negative_refcount(self, code): # bpo-35059: Check that Py_DECREF() reports the correct filename # when calling _Py_NegativeRefcount() to abort Python. - code = textwrap.dedent(""" - import _testcapi - from test import support - - with support.SuppressCrashReport(): - _testcapi.negative_refcount() - """) + code = textwrap.dedent(code) rc, out, err = assert_python_failure('-c', code) self.assertRegex(err, br'_testcapimodule\.c:[0-9]+: ' br'_Py_NegativeRefcount: Assertion failed: ' br'object has negative ref count') + @unittest.skipUnless(hasattr(_testcapi, 'negative_refcount'), + 'need _testcapi.negative_refcount()') + def test_negative_refcount(self): + code = """ + import _testcapi + from test import support + + with support.SuppressCrashReport(): + _testcapi.negative_refcount() + """ + self.check_negative_refcount(code) + + @unittest.skipUnless(hasattr(_testcapi, 'decref_freed_object'), + 'need _testcapi.decref_freed_object()') + def test_decref_freed_object(self): + code = """ + import _testcapi + from test import support + + with support.SuppressCrashReport(): + _testcapi.decref_freed_object() + """ + self.check_negative_refcount(code) + 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 diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-18-15-35-08.gh-issue-109496.Kleoz3.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-18-15-35-08.gh-issue-109496.Kleoz3.rst new file mode 100644 index 00000000000000..51b2144fed7841 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-18-15-35-08.gh-issue-109496.Kleoz3.rst @@ -0,0 +1,5 @@ +On a Python built in debug mode, :c:func:`Py_DECREF()` now calls +``_Py_NegativeRefcount()`` if the object is a dangling pointer to +deallocated memory: memory filled with ``0xDD`` "dead byte" by the debug +hook on memory allocators. The fix is to check the reference count *before* +checking for ``_Py_IsImmortal()``. Patch by Victor Stinner. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 85d8401435e1b5..f356fc5a6a016e 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -2034,6 +2034,26 @@ negative_refcount(PyObject *self, PyObject *Py_UNUSED(args)) Py_RETURN_NONE; } + +static PyObject * +decref_freed_object(PyObject *self, PyObject *Py_UNUSED(args)) +{ + PyObject *obj = PyUnicode_FromString("decref_freed_object"); + if (obj == NULL) { + return NULL; + } + assert(Py_REFCNT(obj) == 1); + + // Deallocate the memory + Py_DECREF(obj); + // obj is a now a dangling pointer + + // gh-109496: If Python is built in debug mode, Py_DECREF() must call + // _Py_NegativeRefcount() and abort Python. + Py_DECREF(obj); + + Py_RETURN_NONE; +} #endif @@ -3299,6 +3319,7 @@ static PyMethodDef TestMethods[] = { {"bad_get", _PyCFunction_CAST(bad_get), METH_FASTCALL}, #ifdef Py_REF_DEBUG {"negative_refcount", negative_refcount, METH_NOARGS}, + {"decref_freed_object", decref_freed_object, METH_NOARGS}, #endif {"meth_varargs", meth_varargs, METH_VARARGS}, {"meth_varargs_keywords", _PyCFunction_CAST(meth_varargs_keywords), METH_VARARGS|METH_KEYWORDS}, From 74f315edd01b4d6c6c99e50c03a90116820d8d47 Mon Sep 17 00:00:00 2001 From: Xuehai Pan Date: Tue, 19 Sep 2023 00:42:58 +0800 Subject: [PATCH 244/357] gh-102757: fix function signature mismatch for `functools.reduce` between code and documentation (#102759) --- Doc/library/functools.rst | 14 ++++++++------ Lib/functools.py | 2 +- .../2023-03-16-15-39-26.gh-issue-102759.ehpHw6.rst | 2 ++ Modules/_functoolsmodule.c | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2023-03-16-15-39-26.gh-issue-102759.ehpHw6.rst diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index f736eb0aca1ac5..69ec1eb3ecd89d 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -403,25 +403,27 @@ The :mod:`functools` module defines the following functions: .. versionadded:: 3.4 -.. function:: reduce(function, iterable[, initializer]) +.. function:: reduce(function, iterable[, initial], /) Apply *function* of two arguments cumulatively to the items of *iterable*, from left to right, so as to reduce the iterable to a single value. For example, ``reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])`` calculates ``((((1+2)+3)+4)+5)``. The left argument, *x*, is the accumulated value and the right argument, *y*, is - the update value from the *iterable*. If the optional *initializer* is present, + the update value from the *iterable*. If the optional *initial* is present, it is placed before the items of the iterable in the calculation, and serves as - a default when the iterable is empty. If *initializer* is not given and + a default when the iterable is empty. If *initial* is not given and *iterable* contains only one item, the first item is returned. Roughly equivalent to:: - def reduce(function, iterable, initializer=None): + initial_missing = object() + + def reduce(function, iterable, initial=initial_missing, /): it = iter(iterable) - if initializer is None: + if initial is initial_missing: value = next(it) else: - value = initializer + value = initial for element in it: value = function(value, element) return value diff --git a/Lib/functools.py b/Lib/functools.py index a2fc28779dbddc..6cb532323b1d67 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -236,7 +236,7 @@ def __ge__(self, other): def reduce(function, sequence, initial=_initial_missing): """ - reduce(function, iterable[, initial]) -> value + reduce(function, iterable[, initial], /) -> value Apply a function of two arguments cumulatively to the items of a sequence or iterable, from left to right, so as to reduce the iterable to a single diff --git a/Misc/NEWS.d/next/Documentation/2023-03-16-15-39-26.gh-issue-102759.ehpHw6.rst b/Misc/NEWS.d/next/Documentation/2023-03-16-15-39-26.gh-issue-102759.ehpHw6.rst new file mode 100644 index 00000000000000..d3df6c8997aa35 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2023-03-16-15-39-26.gh-issue-102759.ehpHw6.rst @@ -0,0 +1,2 @@ +Align function signature for ``functools.reduce`` in documentation and docstring +with the C implementation. diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index 389ff4391de0be..8ea493ad9ab278 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -725,7 +725,7 @@ functools_reduce(PyObject *self, PyObject *args) } PyDoc_STRVAR(functools_reduce_doc, -"reduce(function, iterable[, initial]) -> value\n\ +"reduce(function, iterable[, initial], /) -> value\n\ \n\ Apply a function of two arguments cumulatively to the items of a sequence\n\ or iterable, from left to right, so as to reduce the iterable to a single\n\ From c829975428253568d47ebfc3104fa7386b5e0b58 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 18 Sep 2023 20:09:59 +0300 Subject: [PATCH 245/357] Fix error handling in _PySys_UpdateConfig() (GH-109524) --- Python/sysmodule.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Python/sysmodule.c b/Python/sysmodule.c index fed12812a77089..9c1ee0215d7cf6 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -3502,7 +3502,9 @@ _PySys_UpdateConfig(PyThreadState *tstate) if (config->pycache_prefix != NULL) { SET_SYS_FROM_WSTR("pycache_prefix", config->pycache_prefix); } else { - PyDict_SetItemString(sysdict, "pycache_prefix", Py_None); + if (PyDict_SetItemString(sysdict, "pycache_prefix", Py_None) < 0) { + return -1; + } } COPY_LIST("argv", config->argv); @@ -3516,7 +3518,9 @@ _PySys_UpdateConfig(PyThreadState *tstate) SET_SYS_FROM_WSTR("_stdlib_dir", stdlibdir); } else { - PyDict_SetItemString(sysdict, "_stdlib_dir", Py_None); + if (PyDict_SetItemString(sysdict, "_stdlib_dir", Py_None) < 0) { + return -1; + } } #undef SET_SYS_FROM_WSTR @@ -3526,6 +3530,9 @@ _PySys_UpdateConfig(PyThreadState *tstate) // sys.flags PyObject *flags = _PySys_GetObject(interp, "flags"); // borrowed ref if (flags == NULL) { + if (!_PyErr_Occurred(tstate)) { + _PyErr_SetString(tstate, PyExc_RuntimeError, "lost sys.flags"); + } return -1; } if (set_flags_from_config(interp, flags) < 0) { From beb5ec5817b645562ebbdd59f25683a93061c32c Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 19 Sep 2023 08:09:11 +0300 Subject: [PATCH 246/357] gh-109546: Add more tests for formatting floats and fractions (GH-109548) --- Lib/test/test_float.py | 9 +++++++-- Lib/test/test_fractions.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index c4ee1e08251d63..84270ce7dd4780 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -733,8 +733,13 @@ def test_format_testfile(self): lhs, rhs = map(str.strip, line.split('->')) fmt, arg = lhs.split() - self.assertEqual(fmt % float(arg), rhs) - self.assertEqual(fmt % -float(arg), '-' + rhs) + f = float(arg) + self.assertEqual(fmt % f, rhs) + self.assertEqual(fmt % -f, '-' + rhs) + if fmt != '%r': + fmt2 = fmt[1:] + self.assertEqual(format(f, fmt2), rhs) + self.assertEqual(format(-f, fmt2), '-' + rhs) def test_issue5864(self): self.assertEqual(format(123.456, '.4'), '123.5') diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index e112f49d2e7944..4f4ea7c03f9a4c 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -7,6 +7,7 @@ import operator import fractions import functools +import os import sys import typing import unittest @@ -15,6 +16,9 @@ from pickle import dumps, loads F = fractions.Fraction +#locate file with float format test values +test_dir = os.path.dirname(__file__) or os.curdir +format_testfile = os.path.join(test_dir, 'formatfloat_testcases.txt') class DummyFloat(object): """Dummy float class for testing comparisons with Fractions""" @@ -1220,6 +1224,30 @@ def test_invalid_formats(self): with self.assertRaises(ValueError): format(fraction, spec) + @requires_IEEE_754 + def test_float_format_testfile(self): + with open(format_testfile, encoding="utf-8") as testfile: + for line in testfile: + if line.startswith('--'): + continue + line = line.strip() + if not line: + continue + + lhs, rhs = map(str.strip, line.split('->')) + fmt, arg = lhs.split() + if fmt == '%r': + continue + fmt2 = fmt[1:] + with self.subTest(fmt=fmt, arg=arg): + f = F(float(arg)) + self.assertEqual(format(f, fmt2), rhs) + if f: # skip negative zero + self.assertEqual(format(-f, fmt2), '-' + rhs) + f = F(arg) + self.assertEqual(float(format(f, fmt2)), float(rhs)) + self.assertEqual(float(format(-f, fmt2)), float('-' + rhs)) + if __name__ == '__main__': unittest.main() From ed582a2ed980efba2d0da365ae37bff4a2b99873 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 19 Sep 2023 08:12:29 +0300 Subject: [PATCH 247/357] gh-109469: Silence compiler warnings on string comparisons in _testcapi (GH-109533) --- Modules/_testcapi/util.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/_testcapi/util.h b/Modules/_testcapi/util.h index 4cf7e226382bfc..f26d7656a10138 100644 --- a/Modules/_testcapi/util.h +++ b/Modules/_testcapi/util.h @@ -25,7 +25,8 @@ } while (0) /* Marker to check that pointer value was set. */ -#define UNINITIALIZED_PTR ((void *)"uninitialized") +static const char uninitialized[] = "uninitialized"; +#define UNINITIALIZED_PTR ((void *)uninitialized) /* Marker to check that Py_ssize_t value was set. */ #define UNINITIALIZED_SIZE ((Py_ssize_t)236892191) /* Marker to check that integer value was set. */ From f65497fd252a4a4df960da04d68e8316b58624c0 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Tue, 19 Sep 2023 08:49:26 +0300 Subject: [PATCH 248/357] gh-109125: Run mypy on `Tools/wasm` (#109126) --- .github/workflows/mypy.yml | 6 ++- Tools/wasm/mypy.ini | 14 +++++++ Tools/wasm/wasm_assets.py | 10 +++-- Tools/wasm/wasm_build.py | 73 +++++++++++++++++++++--------------- Tools/wasm/wasm_webserver.py | 8 ++-- 5 files changed, 71 insertions(+), 40 deletions(-) create mode 100644 Tools/wasm/mypy.ini diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index fef7b02f47cdb7..405511ca6820b3 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -7,11 +7,12 @@ on: - main pull_request: paths: - - "Tools/clinic/**" + - ".github/workflows/mypy.yml" - "Tools/cases_generator/**" + - "Tools/clinic/**" - "Tools/peg_generator/**" - "Tools/requirements-dev.txt" - - ".github/workflows/mypy.yml" + - "Tools/wasm/**" workflow_dispatch: permissions: @@ -34,6 +35,7 @@ jobs: "Tools/cases_generator", "Tools/clinic", "Tools/peg_generator", + "Tools/wasm", ] name: Run mypy on ${{ matrix.target }} runs-on: ubuntu-latest diff --git a/Tools/wasm/mypy.ini b/Tools/wasm/mypy.ini new file mode 100644 index 00000000000000..c62598f89eba69 --- /dev/null +++ b/Tools/wasm/mypy.ini @@ -0,0 +1,14 @@ +[mypy] +files = Tools/wasm +pretty = True +show_traceback = True + +# Make sure the wasm can be run using Python 3.8: +python_version = 3.8 + +# Be strict... +strict = True +enable_error_code = truthy-bool,ignore-without-code + +# except for incomplete defs, which are useful for module authors: +disallow_incomplete_defs = False diff --git a/Tools/wasm/wasm_assets.py b/Tools/wasm/wasm_assets.py index f1c8e0bf007f4c..ffa5e303412c46 100755 --- a/Tools/wasm/wasm_assets.py +++ b/Tools/wasm/wasm_assets.py @@ -16,6 +16,7 @@ import sys import sysconfig import zipfile +from typing import Dict # source directory SRCDIR = pathlib.Path(__file__).parent.parent.parent.absolute() @@ -110,7 +111,8 @@ def get_builddir(args: argparse.Namespace) -> pathlib.Path: def get_sysconfigdata(args: argparse.Namespace) -> pathlib.Path: """Get path to sysconfigdata relative to build root""" - data_name = sysconfig._get_sysconfigdata_name() + assert isinstance(args.builddir, pathlib.Path) + data_name: str = sysconfig._get_sysconfigdata_name() # type: ignore[attr-defined] if not data_name.startswith(SYSCONFIG_NAMES): raise ValueError( f"Invalid sysconfig data name '{data_name}'.", SYSCONFIG_NAMES @@ -146,7 +148,7 @@ def filterfunc(filename: str) -> bool: pzf.writepy(entry, filterfunc=filterfunc) -def detect_extension_modules(args: argparse.Namespace): +def detect_extension_modules(args: argparse.Namespace) -> Dict[str, bool]: modules = {} # disabled by Modules/Setup.local ? @@ -161,7 +163,7 @@ def detect_extension_modules(args: argparse.Namespace): # disabled by configure? with open(args.sysconfig_data) as f: data = f.read() - loc = {} + loc: Dict[str, Dict[str, str]] = {} exec(data, globals(), loc) for key, value in loc["build_time_vars"].items(): @@ -195,7 +197,7 @@ def path(val: str) -> pathlib.Path: ) -def main(): +def main() -> None: args = parser.parse_args() relative_prefix = args.prefix.relative_to(pathlib.Path("/")) diff --git a/Tools/wasm/wasm_build.py b/Tools/wasm/wasm_build.py index c9947057a90754..3558ecd869dfc5 100755 --- a/Tools/wasm/wasm_build.py +++ b/Tools/wasm/wasm_build.py @@ -40,7 +40,17 @@ import webbrowser # for Python 3.8 -from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple, Union +from typing import ( + cast, + Any, + Callable, + Dict, + Iterable, + List, + Optional, + Tuple, + Union, +) logger = logging.getLogger("wasm_build") @@ -64,7 +74,7 @@ (3, 1, 16): "https://github.com/emscripten-core/emscripten/issues/17393", (3, 1, 20): "https://github.com/emscripten-core/emscripten/issues/17720", } -_MISSING = pathlib.PurePath("MISSING") +_MISSING = pathlib.Path("MISSING") WASM_WEBSERVER = WASMTOOLS / "wasm_webserver.py" @@ -109,7 +119,7 @@ def parse_emconfig( emconfig: pathlib.Path = EM_CONFIG, -) -> Tuple[pathlib.PurePath, pathlib.PurePath]: +) -> Tuple[pathlib.Path, pathlib.Path]: """Parse EM_CONFIG file and lookup EMSCRIPTEN_ROOT and NODE_JS. The ".emscripten" config file is a Python snippet that uses "EM_CONFIG" @@ -150,11 +160,11 @@ def read_python_version(configure: pathlib.Path = CONFIGURE) -> str: class ConditionError(ValueError): - def __init__(self, info: str, text: str): + def __init__(self, info: str, text: str) -> None: self.info = info self.text = text - def __str__(self): + def __str__(self) -> str: return f"{type(self).__name__}: '{self.info}'\n{self.text}" @@ -180,19 +190,19 @@ class Platform: name: str pythonexe: str config_site: Optional[pathlib.PurePath] - configure_wrapper: Optional[pathlib.PurePath] + configure_wrapper: Optional[pathlib.Path] make_wrapper: Optional[pathlib.PurePath] - environ: dict + environ: Dict[str, Any] check: Callable[[], None] # Used for build_emports(). ports: Optional[pathlib.PurePath] cc: Optional[pathlib.PurePath] - def getenv(self, profile: "BuildProfile") -> dict: + def getenv(self, profile: "BuildProfile") -> Dict[str, Any]: return self.environ.copy() -def _check_clean_src(): +def _check_clean_src() -> None: candidates = [ SRCDIR / "Programs" / "python.o", SRCDIR / "Python" / "frozen_modules" / "importlib._bootstrap.h", @@ -202,7 +212,7 @@ def _check_clean_src(): raise DirtySourceDirectory(os.fspath(candidate), CLEAN_SRCDIR) -def _check_native(): +def _check_native() -> None: if not any(shutil.which(cc) for cc in ["cc", "gcc", "clang"]): raise MissingDependency("cc", INSTALL_NATIVE) if not shutil.which("make"): @@ -234,12 +244,12 @@ def _check_native(): ) -def _check_emscripten(): +def _check_emscripten() -> None: if EMSCRIPTEN_ROOT is _MISSING: raise MissingDependency("Emscripten SDK EM_CONFIG", INSTALL_EMSDK) # sanity check emconfigure = EMSCRIPTEN.configure_wrapper - if not emconfigure.exists(): + if emconfigure is not None and not emconfigure.exists(): raise MissingDependency(os.fspath(emconfigure), INSTALL_EMSDK) # version check version_txt = EMSCRIPTEN_ROOT / "emscripten-version.txt" @@ -250,7 +260,10 @@ def _check_emscripten(): if version.endswith("-git"): # git / upstream / tot-upstream installation version = version[:-4] - version_tuple = tuple(int(v) for v in version.split(".")) + version_tuple = cast( + Tuple[int, int, int], + tuple(int(v) for v in version.split(".")) + ) if version_tuple < EMSDK_MIN_VERSION: raise ConditionError( os.fspath(version_txt), @@ -293,7 +306,7 @@ def _check_emscripten(): ) -def _check_wasi(): +def _check_wasi() -> None: wasm_ld = WASI_SDK_PATH / "bin" / "wasm-ld" if not wasm_ld.exists(): raise MissingDependency(os.fspath(wasm_ld), INSTALL_WASI_SDK) @@ -400,7 +413,7 @@ class EmscriptenTarget(enum.Enum): node_debug = "node-debug" @property - def is_browser(self): + def is_browser(self) -> bool: cls = type(self) return self in {cls.browser, cls.browser_debug} @@ -421,7 +434,7 @@ class SupportLevel(enum.Enum): experimental = "experimental, may be broken" broken = "broken / unavailable" - def __bool__(self): + def __bool__(self) -> bool: cls = type(self) return self in {cls.supported, cls.working} @@ -500,7 +513,7 @@ def make_cmd(self) -> List[str]: cmd.insert(0, os.fspath(platform.make_wrapper)) return cmd - def getenv(self) -> dict: + def getenv(self) -> Dict[str, Any]: """Generate environ dict for platform""" env = os.environ.copy() env.setdefault("MAKEFLAGS", f"-j{os.cpu_count()}") @@ -529,7 +542,7 @@ def _run_cmd( cmd: Iterable[str], args: Iterable[str] = (), cwd: Optional[pathlib.Path] = None, - ): + ) -> int: cmd = list(cmd) cmd.extend(args) if cwd is None: @@ -541,46 +554,46 @@ def _run_cmd( env=self.getenv(), ) - def _check_execute(self): + def _check_execute(self) -> None: if self.is_browser: raise ValueError(f"Cannot execute on {self.target}") - def run_build(self, *args): + def run_build(self, *args: str) -> None: """Run configure (if necessary) and make""" if not self.makefile.exists(): logger.info("Makefile not found, running configure") self.run_configure(*args) self.run_make("all", *args) - def run_configure(self, *args): + def run_configure(self, *args: str) -> int: """Run configure script to generate Makefile""" os.makedirs(self.builddir, exist_ok=True) return self._run_cmd(self.configure_cmd, args) - def run_make(self, *args): + def run_make(self, *args: str) -> int: """Run make (defaults to build all)""" return self._run_cmd(self.make_cmd, args) - def run_pythoninfo(self, *args): + def run_pythoninfo(self, *args: str) -> int: """Run 'make pythoninfo'""" self._check_execute() return self.run_make("pythoninfo", *args) - def run_test(self, target: str, testopts: Optional[str] = None): + def run_test(self, target: str, testopts: Optional[str] = None) -> int: """Run buildbottests""" self._check_execute() if testopts is None: testopts = self.default_testopts return self.run_make(target, f"TESTOPTS={testopts}") - def run_py(self, *args): + def run_py(self, *args: str) -> int: """Run Python with hostrunner""" self._check_execute() - self.run_make( + return self.run_make( "--eval", f"run: all; $(HOSTRUNNER) ./$(PYTHON) {shlex.join(args)}", "run" ) - def run_browser(self, bind="127.0.0.1", port=8000): + def run_browser(self, bind: str = "127.0.0.1", port: int = 8000) -> None: """Run WASM webserver and open build in browser""" relbuilddir = self.builddir.relative_to(SRCDIR) url = f"http://{bind}:{port}/{relbuilddir}/python.html" @@ -611,7 +624,7 @@ def run_browser(self, bind="127.0.0.1", port=8000): except KeyboardInterrupt: pass - def clean(self, all: bool = False): + def clean(self, all: bool = False) -> None: """Clean build directory""" if all: if self.builddir.exists(): @@ -619,7 +632,7 @@ def clean(self, all: bool = False): elif self.makefile.exists(): self.run_make("clean") - def build_emports(self, force: bool = False): + def build_emports(self, force: bool = False) -> None: """Pre-build emscripten ports.""" platform = self.host.platform if platform.ports is None or platform.cc is None: @@ -829,7 +842,7 @@ def build_emports(self, force: bool = False): ) -def main(): +def main() -> None: args = parser.parse_args() logging.basicConfig( level=logging.INFO if args.verbose else logging.ERROR, diff --git a/Tools/wasm/wasm_webserver.py b/Tools/wasm/wasm_webserver.py index 186bd57fc2067d..3d1d5d42a1e8c4 100755 --- a/Tools/wasm/wasm_webserver.py +++ b/Tools/wasm/wasm_webserver.py @@ -21,21 +21,21 @@ class MyHTTPRequestHandler(server.SimpleHTTPRequestHandler): } ) - def end_headers(self): + def end_headers(self) -> None: self.send_my_headers() super().end_headers() - def send_my_headers(self): + def send_my_headers(self) -> None: self.send_header("Cross-Origin-Opener-Policy", "same-origin") self.send_header("Cross-Origin-Embedder-Policy", "require-corp") -def main(): +def main() -> None: args = parser.parse_args() if not args.bind: args.bind = None - server.test( + server.test( # type: ignore[attr-defined] HandlerClass=MyHTTPRequestHandler, protocol="HTTP/1.1", port=args.port, From afa7b0d743d9b7172d58d1e4c28da8324b9be2eb Mon Sep 17 00:00:00 2001 From: Jenner <42169001+jenner9212@users.noreply.github.com> Date: Tue, 19 Sep 2023 18:50:35 +0900 Subject: [PATCH 249/357] no-issue: Fix typo TestContentTyopeHeader to TestContentTypeHeader (gh-109069) --- Lib/test/test_email/test_email.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index 2a237095b9080c..512464f87162cd 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -2236,7 +2236,7 @@ def test_multipart_valid_cte_no_defect(self): "\nContent-Transfer-Encoding: {}".format(cte))) self.assertEqual(len(msg.defects), 0) - # test_headerregistry.TestContentTyopeHeader invalid_1 and invalid_2. + # test_headerregistry.TestContentTypeHeader invalid_1 and invalid_2. def test_invalid_content_type(self): eq = self.assertEqual neq = self.ndiffAssertEqual From 59f32a785fbce76a0fa02fe6d671813057714a0a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 19 Sep 2023 13:57:28 +0200 Subject: [PATCH 250/357] gh-109435: Add Doc/library/cmdline.rst (#109436) Document modules providing a command-line interface (CLI). --- Doc/library/asyncio.rst | 2 ++ Doc/library/cmdline.rst | 57 +++++++++++++++++++++++++++++++++++++ Doc/library/compileall.rst | 2 ++ Doc/library/gzip.rst | 2 ++ Doc/library/index.rst | 1 + Doc/library/pickletools.rst | 2 ++ Doc/library/profile.rst | 2 ++ Doc/library/py_compile.rst | 1 + Doc/library/sysconfig.rst | 1 + 9 files changed, 70 insertions(+) create mode 100644 Doc/library/cmdline.rst diff --git a/Doc/library/asyncio.rst b/Doc/library/asyncio.rst index c6a046f534e9a1..c75ab47404c1e4 100644 --- a/Doc/library/asyncio.rst +++ b/Doc/library/asyncio.rst @@ -56,6 +56,8 @@ Additionally, there are **low-level** APIs for * :ref:`bridge ` callback-based libraries and code with async/await syntax. +.. _asyncio-cli: + You can experiment with an ``asyncio`` concurrent context in the REPL: .. code-block:: pycon diff --git a/Doc/library/cmdline.rst b/Doc/library/cmdline.rst new file mode 100644 index 00000000000000..4a295e069287d8 --- /dev/null +++ b/Doc/library/cmdline.rst @@ -0,0 +1,57 @@ +++++++++++++++++++++++++++++++++++++ +Modules command-line interface (CLI) +++++++++++++++++++++++++++++++++++++ + +The following modules have a command-line interface. + +* :ref:`ast ` +* :ref:`asyncio ` +* :mod:`base64` +* :ref:`calendar ` +* :mod:`code` +* :ref:`compileall ` +* :mod:`cProfile`: see :ref:`profile ` +* :ref:`difflib ` +* :mod:`dis` +* :mod:`doctest` +* :mod:`!encodings.rot_13` +* :mod:`ensurepip` +* :mod:`filecmp` +* :mod:`fileinput` +* :mod:`ftplib` +* :ref:`gzip ` +* :ref:`http.server ` +* :mod:`!idlelib` +* :ref:`inspect ` +* :ref:`json.tool ` +* :mod:`mimetypes` +* :mod:`pdb` +* :mod:`pickle` +* :ref:`pickletools ` +* :mod:`platform` +* :mod:`poplib` +* :ref:`profile ` +* :mod:`pstats` +* :ref:`py_compile ` +* :mod:`pyclbr` +* :mod:`pydoc` +* :mod:`quopri` +* :mod:`runpy` +* :ref:`site ` +* :ref:`sqlite3 ` +* :ref:`sysconfig ` +* :mod:`tabnanny` +* :ref:`tarfile ` +* :mod:`!this` +* :ref:`timeit ` +* :ref:`tokenize ` +* :ref:`trace ` +* :mod:`turtledemo` +* :ref:`unittest ` +* :ref:`uuid ` +* :mod:`venv` +* :mod:`webbrowser` +* :ref:`zipapp ` +* :ref:`zipfile ` + +See also the :ref:`Python command-line interface `. diff --git a/Doc/library/compileall.rst b/Doc/library/compileall.rst index 4226348a17240a..80d96eca71f275 100644 --- a/Doc/library/compileall.rst +++ b/Doc/library/compileall.rst @@ -16,6 +16,8 @@ have write permission to the library directories. .. include:: ../includes/wasm-notavail.rst +.. _compileall-cli: + Command-line use ---------------- diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst index 60236a1190e423..6a4f2c76ae4e10 100644 --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -250,6 +250,8 @@ Example of how to GZIP compress a binary string:: .. program:: gzip +.. _gzip-cli: + Command Line Interface ---------------------- diff --git a/Doc/library/index.rst b/Doc/library/index.rst index d064b680f9aaa4..0b348ae6f5c8c0 100644 --- a/Doc/library/index.rst +++ b/Doc/library/index.rst @@ -73,5 +73,6 @@ the `Python Package Index `_. language.rst windows.rst unix.rst + cmdline.rst superseded.rst security_warnings.rst diff --git a/Doc/library/pickletools.rst b/Doc/library/pickletools.rst index 480f4a6d320815..76f5b0cadf975a 100644 --- a/Doc/library/pickletools.rst +++ b/Doc/library/pickletools.rst @@ -17,6 +17,8 @@ are useful for Python core developers who are working on the :mod:`pickle`; ordinary users of the :mod:`pickle` module probably won't find the :mod:`pickletools` module relevant. +.. _pickletools-cli: + Command line usage ------------------ diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index 723f927135a0f4..69274b0c354a25 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -121,6 +121,8 @@ results to a file by specifying a filename to the :func:`run` function:: The :class:`pstats.Stats` class reads profile results from a file and formats them in various ways. +.. _profile-cli: + The files :mod:`cProfile` and :mod:`profile` can also be invoked as a script to profile another script. For example:: diff --git a/Doc/library/py_compile.rst b/Doc/library/py_compile.rst index 69b93a3bdfcb26..5501db8f87de81 100644 --- a/Doc/library/py_compile.rst +++ b/Doc/library/py_compile.rst @@ -125,6 +125,7 @@ byte-code cache files in the directory containing the source code. This option is useful when the ``.pycs`` are kept up to date by some system external to Python like a build system. +.. _py_compile-cli: Command-Line Interface ---------------------- diff --git a/Doc/library/sysconfig.rst b/Doc/library/sysconfig.rst index 26344ea4e7e2ab..c625c1e1d72954 100644 --- a/Doc/library/sysconfig.rst +++ b/Doc/library/sysconfig.rst @@ -278,6 +278,7 @@ Other functions Return the path of :file:`Makefile`. +.. _sysconfig-cli: Using :mod:`sysconfig` as a script ---------------------------------- From 94c95d42a3b74729ee775f583fb7951f05d16c77 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Tue, 19 Sep 2023 15:01:59 +0300 Subject: [PATCH 251/357] gh-109485: Further improve `test_future_stmt` tests (#109486) Add assertSyntaxError() which run tests with an additional docstring and without docstring, and checks for the error message. --- ...syntax_future10.py => badsyntax_future.py} | 0 .../test_future_stmt/badsyntax_future3.py | 10 -- .../test_future_stmt/badsyntax_future4.py | 10 -- .../test_future_stmt/badsyntax_future5.py | 12 -- .../test_future_stmt/badsyntax_future6.py | 10 -- .../test_future_stmt/badsyntax_future7.py | 11 -- .../test_future_stmt/badsyntax_future8.py | 10 -- .../test_future_stmt/badsyntax_future9.py | 10 -- ..._test1.py => import_nested_scope_twice.py} | 0 .../{future_test2.py => nested_scope.py} | 0 Lib/test/test_future_stmt/test_future.py | 148 +++++++++++++----- 11 files changed, 106 insertions(+), 115 deletions(-) rename Lib/test/test_future_stmt/{badsyntax_future10.py => badsyntax_future.py} (100%) delete mode 100644 Lib/test/test_future_stmt/badsyntax_future3.py delete mode 100644 Lib/test/test_future_stmt/badsyntax_future4.py delete mode 100644 Lib/test/test_future_stmt/badsyntax_future5.py delete mode 100644 Lib/test/test_future_stmt/badsyntax_future6.py delete mode 100644 Lib/test/test_future_stmt/badsyntax_future7.py delete mode 100644 Lib/test/test_future_stmt/badsyntax_future8.py delete mode 100644 Lib/test/test_future_stmt/badsyntax_future9.py rename Lib/test/test_future_stmt/{future_test1.py => import_nested_scope_twice.py} (100%) rename Lib/test/test_future_stmt/{future_test2.py => nested_scope.py} (100%) diff --git a/Lib/test/test_future_stmt/badsyntax_future10.py b/Lib/test/test_future_stmt/badsyntax_future.py similarity index 100% rename from Lib/test/test_future_stmt/badsyntax_future10.py rename to Lib/test/test_future_stmt/badsyntax_future.py diff --git a/Lib/test/test_future_stmt/badsyntax_future3.py b/Lib/test/test_future_stmt/badsyntax_future3.py deleted file mode 100644 index f1c8417edaa297..00000000000000 --- a/Lib/test/test_future_stmt/badsyntax_future3.py +++ /dev/null @@ -1,10 +0,0 @@ -"""This is a test""" -from __future__ import nested_scopes -from __future__ import rested_snopes - -def f(x): - def g(y): - return x + y - return g - -result = f(2)(4) diff --git a/Lib/test/test_future_stmt/badsyntax_future4.py b/Lib/test/test_future_stmt/badsyntax_future4.py deleted file mode 100644 index b5f4c98e922ac2..00000000000000 --- a/Lib/test/test_future_stmt/badsyntax_future4.py +++ /dev/null @@ -1,10 +0,0 @@ -"""This is a test""" -import __future__ -from __future__ import nested_scopes - -def f(x): - def g(y): - return x + y - return g - -result = f(2)(4) diff --git a/Lib/test/test_future_stmt/badsyntax_future5.py b/Lib/test/test_future_stmt/badsyntax_future5.py deleted file mode 100644 index 8a7e5fcb70ff2e..00000000000000 --- a/Lib/test/test_future_stmt/badsyntax_future5.py +++ /dev/null @@ -1,12 +0,0 @@ -"""This is a test""" -from __future__ import nested_scopes -import foo -from __future__ import nested_scopes - - -def f(x): - def g(y): - return x + y - return g - -result = f(2)(4) diff --git a/Lib/test/test_future_stmt/badsyntax_future6.py b/Lib/test/test_future_stmt/badsyntax_future6.py deleted file mode 100644 index 5a8b55a02c41bf..00000000000000 --- a/Lib/test/test_future_stmt/badsyntax_future6.py +++ /dev/null @@ -1,10 +0,0 @@ -"""This is a test""" -"this isn't a doc string" -from __future__ import nested_scopes - -def f(x): - def g(y): - return x + y - return g - -result = f(2)(4) diff --git a/Lib/test/test_future_stmt/badsyntax_future7.py b/Lib/test/test_future_stmt/badsyntax_future7.py deleted file mode 100644 index 131db2c2164cf2..00000000000000 --- a/Lib/test/test_future_stmt/badsyntax_future7.py +++ /dev/null @@ -1,11 +0,0 @@ -"""This is a test""" - -from __future__ import nested_scopes; import string; from __future__ import \ - nested_scopes - -def f(x): - def g(y): - return x + y - return g - -result = f(2)(4) diff --git a/Lib/test/test_future_stmt/badsyntax_future8.py b/Lib/test/test_future_stmt/badsyntax_future8.py deleted file mode 100644 index ca45289e2e5a4f..00000000000000 --- a/Lib/test/test_future_stmt/badsyntax_future8.py +++ /dev/null @@ -1,10 +0,0 @@ -"""This is a test""" - -from __future__ import * - -def f(x): - def g(y): - return x + y - return g - -print(f(2)(4)) diff --git a/Lib/test/test_future_stmt/badsyntax_future9.py b/Lib/test/test_future_stmt/badsyntax_future9.py deleted file mode 100644 index 916de06ab71e97..00000000000000 --- a/Lib/test/test_future_stmt/badsyntax_future9.py +++ /dev/null @@ -1,10 +0,0 @@ -"""This is a test""" - -from __future__ import nested_scopes, braces - -def f(x): - def g(y): - return x + y - return g - -print(f(2)(4)) diff --git a/Lib/test/test_future_stmt/future_test1.py b/Lib/test/test_future_stmt/import_nested_scope_twice.py similarity index 100% rename from Lib/test/test_future_stmt/future_test1.py rename to Lib/test/test_future_stmt/import_nested_scope_twice.py diff --git a/Lib/test/test_future_stmt/future_test2.py b/Lib/test/test_future_stmt/nested_scope.py similarity index 100% rename from Lib/test/test_future_stmt/future_test2.py rename to Lib/test/test_future_stmt/nested_scope.py diff --git a/Lib/test/test_future_stmt/test_future.py b/Lib/test/test_future_stmt/test_future.py index 8e67bcd72c91c5..2c8ceb664cb362 100644 --- a/Lib/test/test_future_stmt/test_future.py +++ b/Lib/test/test_future_stmt/test_future.py @@ -10,6 +10,8 @@ import re import sys +TOP_LEVEL_MSG = 'from __future__ imports must occur at the beginning of the file' + rx = re.compile(r'\((\S+).py, line (\d+)') def get_error_location(msg): @@ -18,21 +20,48 @@ def get_error_location(msg): class FutureTest(unittest.TestCase): - def check_syntax_error(self, err, basename, lineno, offset=1): - self.assertIn('%s.py, line %d' % (basename, lineno), str(err)) - self.assertEqual(os.path.basename(err.filename), basename + '.py') + def check_syntax_error(self, err, basename, + *, + lineno, + message=TOP_LEVEL_MSG, offset=1): + if basename != '': + basename += '.py' + + self.assertEqual(f'{message} ({basename}, line {lineno})', str(err)) + self.assertEqual(os.path.basename(err.filename), basename) self.assertEqual(err.lineno, lineno) self.assertEqual(err.offset, offset) - def test_future1(self): - with import_helper.CleanImport('test.test_future_stmt.future_test1'): - from test.test_future_stmt import future_test1 - self.assertEqual(future_test1.result, 6) + def assertSyntaxError(self, code, + *, + lineno=1, + message=TOP_LEVEL_MSG, offset=1, + parametrize_docstring=True): + code = dedent(code.lstrip('\n')) + for add_docstring in ([False, True] if parametrize_docstring else [False]): + with self.subTest(code=code, add_docstring=add_docstring): + if add_docstring: + code = '"""Docstring"""\n' + code + lineno += 1 + with self.assertRaises(SyntaxError) as cm: + exec(code) + self.check_syntax_error(cm.exception, "", + lineno=lineno, + message=message, + offset=offset) + + def test_import_nested_scope_twice(self): + # Import the name nested_scopes twice to trigger SF bug #407394 + with import_helper.CleanImport( + 'test.test_future_stmt.import_nested_scope_twice', + ): + from test.test_future_stmt import import_nested_scope_twice + self.assertEqual(import_nested_scope_twice.result, 6) - def test_future2(self): - with import_helper.CleanImport('test.test_future_stmt.future_test2'): - from test.test_future_stmt import future_test2 - self.assertEqual(future_test2.result, 6) + def test_nested_scope(self): + with import_helper.CleanImport('test.test_future_stmt.nested_scope'): + from test.test_future_stmt import nested_scope + self.assertEqual(nested_scope.result, 6) def test_future_single_import(self): with import_helper.CleanImport( @@ -52,45 +81,80 @@ def test_future_multiple_features(self): ): from test.test_future_stmt import test_future_multiple_features - def test_badfuture3(self): - with self.assertRaises(SyntaxError) as cm: - from test.test_future_stmt import badsyntax_future3 - self.check_syntax_error(cm.exception, "badsyntax_future3", 3) + def test_unknown_future_flag(self): + code = """ + from __future__ import nested_scopes + from __future__ import rested_snopes # typo error here: nested => rested + """ + self.assertSyntaxError( + code, lineno=2, + message='future feature rested_snopes is not defined', + ) - def test_badfuture4(self): - with self.assertRaises(SyntaxError) as cm: - from test.test_future_stmt import badsyntax_future4 - self.check_syntax_error(cm.exception, "badsyntax_future4", 3) + def test_future_import_not_on_top(self): + code = """ + import some_module + from __future__ import annotations + """ + self.assertSyntaxError(code, lineno=2) - def test_badfuture5(self): - with self.assertRaises(SyntaxError) as cm: - from test.test_future_stmt import badsyntax_future5 - self.check_syntax_error(cm.exception, "badsyntax_future5", 4) + code = """ + import __future__ + from __future__ import annotations + """ + self.assertSyntaxError(code, lineno=2) - def test_badfuture6(self): - with self.assertRaises(SyntaxError) as cm: - from test.test_future_stmt import badsyntax_future6 - self.check_syntax_error(cm.exception, "badsyntax_future6", 3) + code = """ + from __future__ import absolute_import + "spam, bar, blah" + from __future__ import print_function + """ + self.assertSyntaxError(code, lineno=3) - def test_badfuture7(self): - with self.assertRaises(SyntaxError) as cm: - from test.test_future_stmt import badsyntax_future7 - self.check_syntax_error(cm.exception, "badsyntax_future7", 3, 54) + def test_future_import_with_extra_string(self): + code = """ + '''Docstring''' + "this isn't a doc string" + from __future__ import nested_scopes + """ + self.assertSyntaxError(code, lineno=3, parametrize_docstring=False) - def test_badfuture8(self): - with self.assertRaises(SyntaxError) as cm: - from test.test_future_stmt import badsyntax_future8 - self.check_syntax_error(cm.exception, "badsyntax_future8", 3) + def test_multiple_import_statements_on_same_line(self): + # With `\`: + code = """ + from __future__ import nested_scopes; import string; from __future__ import \ + nested_scopes + """ + self.assertSyntaxError(code, offset=54) - def test_badfuture9(self): - with self.assertRaises(SyntaxError) as cm: - from test.test_future_stmt import badsyntax_future9 - self.check_syntax_error(cm.exception, "badsyntax_future9", 3) + # Without `\`: + code = """ + from __future__ import nested_scopes; import string; from __future__ import nested_scopes + """ + self.assertSyntaxError(code, offset=54) + + def test_future_import_star(self): + code = """ + from __future__ import * + """ + self.assertSyntaxError(code, message='future feature * is not defined') + + def test_future_import_braces(self): + code = """ + from __future__ import braces + """ + # Congrats, you found an easter egg! + self.assertSyntaxError(code, message='not a chance') + + code = """ + from __future__ import nested_scopes, braces + """ + self.assertSyntaxError(code, message='not a chance') - def test_badfuture10(self): + def test_module_with_future_import_not_on_top(self): with self.assertRaises(SyntaxError) as cm: - from test.test_future_stmt import badsyntax_future10 - self.check_syntax_error(cm.exception, "badsyntax_future10", 3) + from test.test_future_stmt import badsyntax_future + self.check_syntax_error(cm.exception, "badsyntax_future", lineno=3) def test_ensure_flags_dont_clash(self): # bpo-39562: test that future flags and compiler flags doesn't clash From f2636d2c45aae0a04960dcfbc7d9a2a8a36ba3bc Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 19 Sep 2023 07:39:44 -0500 Subject: [PATCH 252/357] Misc itertool recipe improvements, mostly docstrings and comments (gh-109555) --- Doc/library/itertools.rst | 76 +++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 34 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 5e187aea441bb9..bd347e6448f1a0 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -844,6 +844,7 @@ which incur interpreter overhead. return next(islice(iterable, n, None), default) def quantify(iterable, pred=bool): + "Given a predicate that returns True or False, count the True results." "Count how many times the predicate is True" return sum(map(pred, iterable)) @@ -1028,34 +1029,6 @@ The following recipes have a more mathematical flavor: s = list(iterable) return chain.from_iterable(combinations(s, r) for r in range(len(s)+1)) - def sieve(n): - "Primes less than n." - # sieve(30) --> 2 3 5 7 11 13 17 19 23 29 - if n > 2: - yield 2 - start = 3 - data = bytearray((0, 1)) * (n // 2) - limit = math.isqrt(n) + 1 - for p in iter_index(data, 1, start, limit): - yield from iter_index(data, 1, start, p*p) - data[p*p : n : p+p] = bytes(len(range(p*p, n, p+p))) - start = p*p - yield from iter_index(data, 1, start) - - def factor(n): - "Prime factors of n." - # factor(99) --> 3 3 11 - # factor(1_000_000_000_000_007) --> 47 59 360620266859 - # factor(1_000_000_000_000_403) --> 1000000000000403 - for prime in sieve(math.isqrt(n) + 1): - while not n % prime: - yield prime - n //= prime - if n == 1: - return - if n > 1: - yield n - def sum_of_squares(it): "Add up the squares of the input values." # sum_of_squares([10, 20, 30]) -> 1400 @@ -1073,14 +1046,21 @@ The following recipes have a more mathematical flavor: return batched(starmap(math.sumprod, product(m1, transpose(m2))), n) def convolve(signal, kernel): - """Linear convolution of two iterables. + """Discrete linear convolution of two iterables. + + The kernel is fully consumed before the calculations begin. + The signal is consumed lazily and can be infinite. + + Convolutions are mathematically commutative. + If the signal and kernel are swapped, + the output will be the same. Article: https://betterexplained.com/articles/intuitive-convolution/ Video: https://www.youtube.com/watch?v=KuXjwB4LzSA """ # convolve(data, [0.25, 0.25, 0.25, 0.25]) --> Moving average (blur) - # convolve(data, [1, -1]) --> 1st finite difference (1st derivative) - # convolve(data, [1, -2, 1]) --> 2nd finite difference (2nd derivative) + # convolve(data, [1/2, 0, -1/2]) --> 1st derivative estimate + # convolve(data, [1, -2, 1]) --> 2nd derivative estimate kernel = tuple(kernel)[::-1] n = len(kernel) padded_signal = chain(repeat(0, n-1), signal, repeat(0, n-1)) @@ -1104,8 +1084,8 @@ The following recipes have a more mathematical flavor: # Evaluate x³ -4x² -17x + 60 at x = 2.5 # polynomial_eval([1, -4, -17, 60], x=2.5) --> 8.125 n = len(coefficients) - if n == 0: - return x * 0 # coerce zero to the type of x + if not n: + return type(x)(0) powers = map(pow, repeat(x), reversed(range(n))) return math.sumprod(coefficients, powers) @@ -1120,6 +1100,34 @@ The following recipes have a more mathematical flavor: powers = reversed(range(1, n)) return list(map(operator.mul, coefficients, powers)) + def sieve(n): + "Primes less than n." + # sieve(30) --> 2 3 5 7 11 13 17 19 23 29 + if n > 2: + yield 2 + start = 3 + data = bytearray((0, 1)) * (n // 2) + limit = math.isqrt(n) + 1 + for p in iter_index(data, 1, start, limit): + yield from iter_index(data, 1, start, p*p) + data[p*p : n : p+p] = bytes(len(range(p*p, n, p+p))) + start = p*p + yield from iter_index(data, 1, start) + + def factor(n): + "Prime factors of n." + # factor(99) --> 3 3 11 + # factor(1_000_000_000_000_007) --> 47 59 360620266859 + # factor(1_000_000_000_000_403) --> 1000000000000403 + for prime in sieve(math.isqrt(n) + 1): + while not n % prime: + yield prime + n //= prime + if n == 1: + return + if n > 1: + yield n + def nth_combination(iterable, r, index): "Equivalent to list(combinations(iterable, r))[index]" pool = tuple(iterable) @@ -1295,7 +1303,7 @@ The following recipes have a more mathematical flavor: >>> polynomial_eval([], Fraction(2, 3)) Fraction(0, 1) >>> polynomial_eval([], Decimal('1.75')) - Decimal('0.00') + Decimal('0') >>> polynomial_eval([11], 7) == 11 True >>> polynomial_eval([11, 2], 7) == 11 * 7 + 2 From 67d9363372d9b214d9aa1812163866c9804aa55a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 19 Sep 2023 15:50:27 +0200 Subject: [PATCH 253/357] gh-109566: Run GHA and buildbot tests with --fail-rerun (#109567) --- Makefile.pre.in | 2 +- PCbuild/rt.bat | 2 +- Tools/buildbot/test.bat | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 35f254508579bf..7b03dd233e6231 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1887,7 +1887,7 @@ buildbottest: all -@if which pybuildbot.identify >/dev/null 2>&1; then \ pybuildbot.identify "CC='$(CC)'" "CXX='$(CXX)'"; \ fi - $(TESTRUNNER) -j 1 -u all -W --slowest --fail-env-changed --timeout=$(TESTTIMEOUT) $(TESTOPTS) + $(TESTRUNNER) -j 1 -u all -W --slowest --fail-env-changed --fail-rerun --timeout=$(TESTTIMEOUT) $(TESTOPTS) # Like testall, but run Python tests with HOSTRUNNER directly. .PHONY: hostrunnertest diff --git a/PCbuild/rt.bat b/PCbuild/rt.bat index 29813c5a87fca7..cd32a386f0366b 100644 --- a/PCbuild/rt.bat +++ b/PCbuild/rt.bat @@ -32,7 +32,7 @@ set pcbuild=%~dp0 set suffix= set qmode= set dashO= -set regrtestargs= +set regrtestargs--fail-env-changed --fail-rerun set exe= :CheckOpts diff --git a/Tools/buildbot/test.bat b/Tools/buildbot/test.bat index 25c796a60e173d..c1b2605a4b2c7e 100644 --- a/Tools/buildbot/test.bat +++ b/Tools/buildbot/test.bat @@ -23,7 +23,7 @@ if "%PROCESSOR_ARCHITECTURE%"=="ARM" if "%arm32_ssh%"=="true" goto NativeExecuti if "%arm32_ssh%"=="true" goto :Arm32Ssh :NativeExecution -call "%here%..\..\PCbuild\rt.bat" %rt_opts% -uall -rwW --slowest --timeout=1200 --fail-env-changed %regrtest_args% +call "%here%..\..\PCbuild\rt.bat" %rt_opts% -uall -rwW --slowest --timeout=1200 %regrtest_args% exit /b %ERRORLEVEL% :Arm32Ssh @@ -35,7 +35,7 @@ if NOT "%REMOTE_PYTHON_DIR:~-1,1%"=="\" (set REMOTE_PYTHON_DIR=%REMOTE_PYTHON_DI set TEMP_ARGS=--temp %REMOTE_PYTHON_DIR%temp -set rt_args=%rt_opts% %dashU% -rwW --slowest --timeout=1200 --fail-env-changed %regrtest_args% %TEMP_ARGS% +set rt_args=%rt_opts% %dashU% -rwW --slowest --timeout=1200 %regrtest_args% %TEMP_ARGS% ssh %SSH_SERVER% "set TEMP=%REMOTE_PYTHON_DIR%temp& cd %REMOTE_PYTHON_DIR% & %REMOTE_PYTHON_DIR%PCbuild\rt.bat" %rt_args% set ERR=%ERRORLEVEL% scp %SSH_SERVER%:"%REMOTE_PYTHON_DIR%test-results.xml" "%PYTHON_SOURCE%\test-results.xml" From 0a31ff0050eec5079fd4c9cafd33b4e3e9afd9ab Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 19 Sep 2023 16:42:08 +0200 Subject: [PATCH 254/357] gh-109496: Skip test_capi.test_decref_freed_object() on ASAN (#109573) Skip test_decref_freed_object() of test_capi.test_misc if Python is built with ASAN, MSAN or UBSAN sanitizers. --- Lib/test/test_capi/test_misc.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py index 57edacbae35634..11cb1983b0fa20 100644 --- a/Lib/test/test_capi/test_misc.py +++ b/Lib/test/test_capi/test_misc.py @@ -325,6 +325,8 @@ def test_negative_refcount(self): @unittest.skipUnless(hasattr(_testcapi, 'decref_freed_object'), 'need _testcapi.decref_freed_object()') + @support.skip_if_sanitizer("use after free on purpose", + address=True, memory=True, ub=True) def test_decref_freed_object(self): code = """ import _testcapi From 0c89056fe59ac42f09978582479d40e58a236856 Mon Sep 17 00:00:00 2001 From: Sam Gross Date: Tue, 19 Sep 2023 11:54:29 -0400 Subject: [PATCH 255/357] gh-108724: Add PyMutex and _PyParkingLot APIs (gh-109344) PyMutex is a one byte lock with fast, inlineable lock and unlock functions for the common uncontended case. The design is based on WebKit's WTF::Lock. PyMutex is built using the _PyParkingLot APIs, which provides a cross-platform futex-like API (based on WebKit's WTF::ParkingLot). This internal API will be used for building other synchronization primitives used to implement PEP 703, such as one-time initialization and events. This also includes tests and a mini benchmark in Tools/lockbench/lockbench.py to compare with the existing PyThread_type_lock. Uncontended acquisition + release: * Linux (x86-64): PyMutex: 11 ns, PyThread_type_lock: 44 ns * macOS (arm64): PyMutex: 13 ns, PyThread_type_lock: 18 ns * Windows (x86-64): PyMutex: 13 ns, PyThread_type_lock: 38 ns PR Overview: The primary purpose of this PR is to implement PyMutex, but there are a number of support pieces (described below). * PyMutex: A 1-byte lock that doesn't require memory allocation to initialize and is generally faster than the existing PyThread_type_lock. The API is internal only for now. * _PyParking_Lot: A futex-like API based on the API of the same name in WebKit. Used to implement PyMutex. * _PyRawMutex: A word sized lock used to implement _PyParking_Lot. * PyEvent: A one time event. This was used a bunch in the "nogil" fork and is useful for testing the PyMutex implementation, so I've included it as part of the PR. * pycore_llist.h: Defines common operations on doubly-linked list. Not strictly necessary (could do the list operations manually), but they come up frequently in the "nogil" fork. ( Similar to https://man.freebsd.org/cgi/man.cgi?queue) --------- Co-authored-by: Eric Snow --- Include/Python.h | 1 + Include/cpython/pyatomic.h | 9 +- Include/cpython/pyatomic_msc.h | 2 +- Include/internal/pycore_llist.h | 107 +++++ Include/internal/pycore_lock.h | 158 ++++++++ Include/internal/pycore_parking_lot.h | 99 +++++ Include/internal/pycore_semaphore.h | 63 +++ Include/pyatomic.h | 16 + Lib/test/test_capi/test_misc.py | 10 +- Makefile.pre.in | 6 + ...-09-12-13-09-36.gh-issue-108724.-yMsC8.rst | 1 + Modules/Setup.stdlib.in | 2 +- Modules/_testcapi/pyatomic.c | 1 - Modules/_testinternalcapi.c | 3 + .../_testinternalcapi/clinic/test_lock.c.h | 74 ++++ Modules/_testinternalcapi/parts.h | 1 + Modules/_testinternalcapi/test_lock.c | 353 +++++++++++++++++ PCbuild/_testinternalcapi.vcxproj | 1 + PCbuild/_testinternalcapi.vcxproj.filters | 3 + PCbuild/pythoncore.vcxproj | 7 + PCbuild/pythoncore.vcxproj.filters | 21 + Python/lock.c | 297 ++++++++++++++ Python/parking_lot.c | 370 ++++++++++++++++++ Python/pystate.c | 5 + Tools/c-analyzer/cpython/_parser.py | 1 + Tools/c-analyzer/cpython/ignored.tsv | 3 + Tools/lockbench/lockbench.py | 53 +++ configure | 8 +- configure.ac | 11 +- 29 files changed, 1665 insertions(+), 21 deletions(-) create mode 100644 Include/internal/pycore_llist.h create mode 100644 Include/internal/pycore_lock.h create mode 100644 Include/internal/pycore_parking_lot.h create mode 100644 Include/internal/pycore_semaphore.h create mode 100644 Include/pyatomic.h create mode 100644 Misc/NEWS.d/next/C API/2023-09-12-13-09-36.gh-issue-108724.-yMsC8.rst create mode 100644 Modules/_testinternalcapi/clinic/test_lock.c.h create mode 100644 Modules/_testinternalcapi/test_lock.c create mode 100644 Python/lock.c create mode 100644 Python/parking_lot.c create mode 100644 Tools/lockbench/lockbench.py diff --git a/Include/Python.h b/Include/Python.h index 8b28200000ab56..7312cc87d5cc33 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -48,6 +48,7 @@ #include "pytypedefs.h" #include "pybuffer.h" #include "pystats.h" +#include "pyatomic.h" #include "object.h" #include "objimpl.h" #include "typeslots.h" diff --git a/Include/cpython/pyatomic.h b/Include/cpython/pyatomic.h index 73712db847087d..ab182381b39f00 100644 --- a/Include/cpython/pyatomic.h +++ b/Include/cpython/pyatomic.h @@ -83,9 +83,9 @@ // # release // ... -#ifndef Py_ATOMIC_H -#define Py_ATOMIC_H - +#ifndef Py_CPYTHON_ATOMIC_H +# error "this header file must not be included directly" +#endif // --- _Py_atomic_add -------------------------------------------------------- // Atomically adds `value` to `obj` and returns the previous value @@ -501,6 +501,3 @@ static inline void _Py_atomic_fence_release(void); #else # error "no available pyatomic implementation for this platform/compiler" #endif - -#endif /* Py_ATOMIC_H */ - diff --git a/Include/cpython/pyatomic_msc.h b/Include/cpython/pyatomic_msc.h index c88bb03cc8f94a..287ed43b5714cd 100644 --- a/Include/cpython/pyatomic_msc.h +++ b/Include/cpython/pyatomic_msc.h @@ -906,7 +906,7 @@ _Py_atomic_store_ptr_release(void *obj, void *value) #if defined(_M_X64) || defined(_M_IX86) *(void * volatile *)obj = value; #elif defined(_M_ARM64) - __stlr64(obj, (uintptr_t)value); + __stlr64((unsigned __int64 volatile *)obj, (uintptr_t)value); #else # error "no implementation of _Py_atomic_store_ptr_release" #endif diff --git a/Include/internal/pycore_llist.h b/Include/internal/pycore_llist.h new file mode 100644 index 00000000000000..5fd261da05fa5d --- /dev/null +++ b/Include/internal/pycore_llist.h @@ -0,0 +1,107 @@ +// A doubly-linked list that can be embedded in a struct. +// +// Usage: +// struct llist_node head = LLIST_INIT(head); +// typedef struct { +// ... +// struct llist_node node; +// ... +// } MyObj; +// +// llist_insert_tail(&head, &obj->node); +// llist_remove(&obj->node); +// +// struct llist_node *node; +// llist_for_each(node, &head) { +// MyObj *obj = llist_data(node, MyObj, node); +// ... +// } +// + +#ifndef Py_INTERNAL_LLIST_H +#define Py_INTERNAL_LLIST_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "Py_BUILD_CORE must be defined to include this header" +#endif + +struct llist_node { + struct llist_node *next; + struct llist_node *prev; +}; + +// Get the struct containing a node. +#define llist_data(node, type, member) \ + (type*)((char*)node - offsetof(type, member)) + +// Iterate over a list. +#define llist_for_each(node, head) \ + for (node = (head)->next; node != (head); node = node->next) + +// Iterate over a list, but allow removal of the current node. +#define llist_for_each_safe(node, head) \ + for (struct llist_node *_next = (node = (head)->next, node->next); \ + node != (head); node = _next, _next = node->next) + +#define LLIST_INIT(head) { &head, &head } + +static inline void +llist_init(struct llist_node *head) +{ + head->next = head; + head->prev = head; +} + +// Returns 1 if the list is empty, 0 otherwise. +static inline int +llist_empty(struct llist_node *head) +{ + return head->next == head; +} + +// Appends to the tail of the list. +static inline void +llist_insert_tail(struct llist_node *head, struct llist_node *node) +{ + node->prev = head->prev; + node->next = head; + head->prev->next = node; + head->prev = node; +} + +// Remove a node from the list. +static inline void +llist_remove(struct llist_node *node) +{ + struct llist_node *prev = node->prev; + struct llist_node *next = node->next; + prev->next = next; + next->prev = prev; + node->prev = NULL; + node->next = NULL; +} + +// Append all nodes from head2 onto head1. head2 is left empty. +static inline void +llist_concat(struct llist_node *head1, struct llist_node *head2) +{ + if (!llist_empty(head2)) { + head1->prev->next = head2->next; + head2->next->prev = head1->prev; + + head1->prev = head2->prev; + head2->prev->next = head1; + llist_init(head2); + } +} + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_LLIST_H */ diff --git a/Include/internal/pycore_lock.h b/Include/internal/pycore_lock.h new file mode 100644 index 00000000000000..c4bb76a40e7b12 --- /dev/null +++ b/Include/internal/pycore_lock.h @@ -0,0 +1,158 @@ +// Lightweight locks and other synchronization mechanisms. +// +// These implementations are based on WebKit's WTF::Lock. See +// https://webkit.org/blog/6161/locking-in-webkit/ for a description of the +// design. +#ifndef Py_INTERNAL_LOCK_H +#define Py_INTERNAL_LOCK_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_time.h" // _PyTime_t + + +// A mutex that occupies one byte. The lock can be zero initialized. +// +// Only the two least significant bits are used. The remaining bits should be +// zero: +// 0b00: unlocked +// 0b01: locked +// 0b10: unlocked and has parked threads +// 0b11: locked and has parked threads +// +// Typical initialization: +// PyMutex m = (PyMutex){0}; +// +// Typical usage: +// PyMutex_Lock(&m); +// ... +// PyMutex_Unlock(&m); +typedef struct _PyMutex { + uint8_t v; +} PyMutex; + +#define _Py_UNLOCKED 0 +#define _Py_LOCKED 1 +#define _Py_HAS_PARKED 2 + +// (private) slow path for locking the mutex +PyAPI_FUNC(void) _PyMutex_LockSlow(PyMutex *m); + +// (private) slow path for unlocking the mutex +PyAPI_FUNC(void) _PyMutex_UnlockSlow(PyMutex *m); + +// Locks the mutex. +// +// If the mutex is currently locked, the calling thread will be parked until +// the mutex is unlocked. If the current thread holds the GIL, then the GIL +// will be released while the thread is parked. +static inline void +PyMutex_Lock(PyMutex *m) +{ + uint8_t expected = _Py_UNLOCKED; + if (!_Py_atomic_compare_exchange_uint8(&m->v, &expected, _Py_LOCKED)) { + _PyMutex_LockSlow(m); + } +} + +// Unlocks the mutex. +static inline void +PyMutex_Unlock(PyMutex *m) +{ + uint8_t expected = _Py_LOCKED; + if (!_Py_atomic_compare_exchange_uint8(&m->v, &expected, _Py_UNLOCKED)) { + _PyMutex_UnlockSlow(m); + } +} + +// Checks if the mutex is currently locked. +static inline int +PyMutex_IsLocked(PyMutex *m) +{ + return (_Py_atomic_load_uint8(&m->v) & _Py_LOCKED) != 0; +} + +typedef enum _PyLockFlags { + // Do not detach/release the GIL when waiting on the lock. + _Py_LOCK_DONT_DETACH = 0, + + // Detach/release the GIL while waiting on the lock. + _PY_LOCK_DETACH = 1, + + // Handle signals if interrupted while waiting on the lock. + _PY_LOCK_HANDLE_SIGNALS = 2, +} _PyLockFlags; + +// Lock a mutex with an optional timeout and additional options. See +// _PyLockFlags for details. +extern PyLockStatus +_PyMutex_LockTimed(PyMutex *m, _PyTime_t timeout_ns, _PyLockFlags flags); + +// Unlock a mutex, returns 0 if the mutex is not locked (used for improved +// error messages). +extern int _PyMutex_TryUnlock(PyMutex *m); + + +// PyEvent is a one-time event notification +typedef struct { + uint8_t v; +} PyEvent; + +// Set the event and notify any waiting threads. +// Export for '_testinternalcapi' shared extension +PyAPI_FUNC(void) _PyEvent_Notify(PyEvent *evt); + +// Wait for the event to be set. If the event is already set, then this returns +// immediately. +PyAPI_FUNC(void) PyEvent_Wait(PyEvent *evt); + +// Wait for the event to be set, or until the timeout expires. If the event is +// already set, then this returns immediately. Returns 1 if the event was set, +// and 0 if the timeout expired or thread was interrupted. +PyAPI_FUNC(int) PyEvent_WaitTimed(PyEvent *evt, _PyTime_t timeout_ns); + + +// _PyRawMutex implements a word-sized mutex that that does not depend on the +// parking lot API, and therefore can be used in the parking lot +// implementation. +// +// The mutex uses a packed representation: the least significant bit is used to +// indicate whether the mutex is locked or not. The remaining bits are either +// zero or a pointer to a `struct raw_mutex_entry` (see lock.c). +typedef struct { + uintptr_t v; +} _PyRawMutex; + +// Slow paths for lock/unlock +extern void _PyRawMutex_LockSlow(_PyRawMutex *m); +extern void _PyRawMutex_UnlockSlow(_PyRawMutex *m); + +static inline void +_PyRawMutex_Lock(_PyRawMutex *m) +{ + uintptr_t unlocked = _Py_UNLOCKED; + if (_Py_atomic_compare_exchange_uintptr(&m->v, &unlocked, _Py_LOCKED)) { + return; + } + _PyRawMutex_LockSlow(m); +} + +static inline void +_PyRawMutex_Unlock(_PyRawMutex *m) +{ + uintptr_t locked = _Py_LOCKED; + if (_Py_atomic_compare_exchange_uintptr(&m->v, &locked, _Py_UNLOCKED)) { + return; + } + _PyRawMutex_UnlockSlow(m); +} + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_LOCK_H */ diff --git a/Include/internal/pycore_parking_lot.h b/Include/internal/pycore_parking_lot.h new file mode 100644 index 00000000000000..f444da730055e8 --- /dev/null +++ b/Include/internal/pycore_parking_lot.h @@ -0,0 +1,99 @@ +// ParkingLot is an internal API for building efficient synchronization +// primitives like mutexes and events. +// +// The API and name is inspired by WebKit's WTF::ParkingLot, which in turn +// is inspired Linux's futex API. +// See https://webkit.org/blog/6161/locking-in-webkit/. +// +// The core functionality is an atomic "compare-and-sleep" operation along with +// an atomic "wake-up" operation. + +#ifndef Py_INTERNAL_PARKING_LOT_H +#define Py_INTERNAL_PARKING_LOT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_time.h" // _PyTime_t + + +enum { + // The thread was unparked by another thread. + Py_PARK_OK = 0, + + // The value of `address` did not match `expected`. + Py_PARK_AGAIN = -1, + + // The thread was unparked due to a timeout. + Py_PARK_TIMEOUT = -2, + + // The thread was interrupted by a signal. + Py_PARK_INTR = -3, +}; + +// Checks that `*address == *expected` and puts the thread to sleep until an +// unpark operation is called on the same `address`. Otherwise, the function +// returns `Py_PARK_AGAIN`. The comparison behaves like memcmp, but is +// performed atomically with respect to unpark operations. +// +// The `address_size` argument is the size of the data pointed to by the +// `address` and `expected` pointers (i.e., sizeof(*address)). It must be +// 1, 2, 4, or 8. +// +// The `timeout_ns` argument specifies the maximum amount of time to wait, with +// -1 indicating an infinite wait. +// +// `park_arg`, which can be NULL, is passed to the unpark operation. +// +// If `detach` is true, then the thread will detach/release the GIL while +// waiting. +// +// Example usage: +// +// if (_Py_atomic_compare_exchange_uint8(address, &expected, new_value)) { +// int res = _PyParkingLot_Park(address, &new_value, sizeof(*address), +// timeout_ns, NULL, 1); +// ... +// } +PyAPI_FUNC(int) +_PyParkingLot_Park(const void *address, const void *expected, + size_t address_size, _PyTime_t timeout_ns, + void *park_arg, int detach); + +// Callback for _PyParkingLot_Unpark: +// +// `arg` is the data of the same name provided to the _PyParkingLot_Unpark() +// call. +// `park_arg` is the data provided to _PyParkingLot_Park() call or NULL if +// no waiting thread was found. +// `has_more_waiters` is true if there are more threads waiting on the same +// address. May be true in cases where threads are waiting on a different +// address that map to the same internal bucket. +typedef void _Py_unpark_fn_t(void *arg, void *park_arg, int has_more_waiters); + +// Unparks a single thread waiting on `address`. +// +// Note that fn() is called regardless of whether a thread was unparked. If +// no threads are waiting on `address` then the `park_arg` argument to fn() +// will be NULL. +// +// Example usage: +// void callback(void *arg, void *park_arg, int has_more_waiters); +// _PyParkingLot_Unpark(address, &callback, arg); +PyAPI_FUNC(void) +_PyParkingLot_Unpark(const void *address, _Py_unpark_fn_t *fn, void *arg); + +// Unparks all threads waiting on `address`. +PyAPI_FUNC(void) _PyParkingLot_UnparkAll(const void *address); + +// Resets the parking lot state after a fork. Forgets all parked threads. +PyAPI_FUNC(void) _PyParkingLot_AfterFork(void); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_PARKING_LOT_H */ diff --git a/Include/internal/pycore_semaphore.h b/Include/internal/pycore_semaphore.h new file mode 100644 index 00000000000000..c1df8333629066 --- /dev/null +++ b/Include/internal/pycore_semaphore.h @@ -0,0 +1,63 @@ +// The _PySemaphore API a simplified cross-platform semaphore used to implement +// wakeup/sleep. +#ifndef Py_INTERNAL_SEMAPHORE_H +#define Py_INTERNAL_SEMAPHORE_H + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_time.h" // _PyTime_t + +#ifdef MS_WINDOWS +# define WIN32_LEAN_AND_MEAN +# include +#elif defined(HAVE_PTHREAD_H) +# include +#elif defined(HAVE_PTHREAD_STUBS) +# include "cpython/pthread_stubs.h" +#else +# error "Require native threads. See https://bugs.python.org/issue31370" +#endif + +#if defined(_POSIX_SEMAPHORES) && (_POSIX_SEMAPHORES+0) != -1 +# define _Py_USE_SEMAPHORES +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _PySemaphore { +#if defined(MS_WINDOWS) + HANDLE platform_sem; +#elif defined(_Py_USE_SEMAPHORES) + sem_t platform_sem; +#else + pthread_mutex_t mutex; + pthread_cond_t cond; + int counter; +#endif +} _PySemaphore; + +// Puts the current thread to sleep until _PySemaphore_Wakeup() is called. +// If `detach` is true, then the thread will detach/release the GIL while +// sleeping. +PyAPI_FUNC(int) +_PySemaphore_Wait(_PySemaphore *sema, _PyTime_t timeout_ns, int detach); + +// Wakes up a single thread waiting on sema. Note that _PySemaphore_Wakeup() +// can be called before _PySemaphore_Wait(). +PyAPI_FUNC(void) +_PySemaphore_Wakeup(_PySemaphore *sema); + +// Initializes/destroys a semaphore +PyAPI_FUNC(void) _PySemaphore_Init(_PySemaphore *sema); +PyAPI_FUNC(void) _PySemaphore_Destroy(_PySemaphore *sema); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_SEMAPHORE_H */ diff --git a/Include/pyatomic.h b/Include/pyatomic.h new file mode 100644 index 00000000000000..2ce2c81cf5251a --- /dev/null +++ b/Include/pyatomic.h @@ -0,0 +1,16 @@ +#ifndef Py_ATOMIC_H +#define Py_ATOMIC_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +# define Py_CPYTHON_ATOMIC_H +# include "cpython/pyatomic.h" +# undef Py_CPYTHON_ATOMIC_H +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ATOMIC_H */ diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py index 11cb1983b0fa20..cf1cba3e693ef6 100644 --- a/Lib/test/test_capi/test_misc.py +++ b/Lib/test/test_capi/test_misc.py @@ -2085,7 +2085,15 @@ def test_version_api_data(self): class Test_testinternalcapi(unittest.TestCase): locals().update((name, getattr(_testinternalcapi, name)) for name in dir(_testinternalcapi) - if name.startswith('test_')) + if name.startswith('test_') + and not name.startswith('test_lock_')) + + +@threading_helper.requires_working_threading() +class Test_PyLock(unittest.TestCase): + locals().update((name, getattr(_testinternalcapi, name)) + for name in dir(_testinternalcapi) + if name.startswith('test_lock_')) @unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module") diff --git a/Makefile.pre.in b/Makefile.pre.in index 7b03dd233e6231..c94ffcb5f15402 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -400,12 +400,14 @@ PYTHON_OBJS= \ Python/instrumentation.o \ Python/intrinsics.o \ Python/legacy_tracing.o \ + Python/lock.o \ Python/marshal.o \ Python/modsupport.o \ Python/mysnprintf.o \ Python/mystrtoul.o \ Python/optimizer.o \ Python/optimizer_analysis.o \ + Python/parking_lot.o \ Python/pathconfig.o \ Python/preconfig.o \ Python/pyarena.o \ @@ -1779,6 +1781,8 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_interp.h \ $(srcdir)/Include/internal/pycore_intrinsics.h \ $(srcdir)/Include/internal/pycore_list.h \ + $(srcdir)/Include/internal/pycore_llist.h \ + $(srcdir)/Include/internal/pycore_lock.h \ $(srcdir)/Include/internal/pycore_long.h \ $(srcdir)/Include/internal/pycore_modsupport.h \ $(srcdir)/Include/internal/pycore_moduleobject.h \ @@ -1790,6 +1794,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_opcode_metadata.h \ $(srcdir)/Include/internal/pycore_opcode_utils.h \ $(srcdir)/Include/internal/pycore_optimizer.h \ + $(srcdir)/Include/internal/pycore_parking_lot.h \ $(srcdir)/Include/internal/pycore_pathconfig.h \ $(srcdir)/Include/internal/pycore_pyarena.h \ $(srcdir)/Include/internal/pycore_pyerrors.h \ @@ -1805,6 +1810,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_runtime.h \ $(srcdir)/Include/internal/pycore_runtime_init_generated.h \ $(srcdir)/Include/internal/pycore_runtime_init.h \ + $(srcdir)/Include/internal/pycore_semaphore.h \ $(srcdir)/Include/internal/pycore_setobject.h \ $(srcdir)/Include/internal/pycore_signal.h \ $(srcdir)/Include/internal/pycore_sliceobject.h \ diff --git a/Misc/NEWS.d/next/C API/2023-09-12-13-09-36.gh-issue-108724.-yMsC8.rst b/Misc/NEWS.d/next/C API/2023-09-12-13-09-36.gh-issue-108724.-yMsC8.rst new file mode 100644 index 00000000000000..5cddf9bc239700 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2023-09-12-13-09-36.gh-issue-108724.-yMsC8.rst @@ -0,0 +1 @@ +Add :c:type:`PyMutex` internal-only lightweight locking API. diff --git a/Modules/Setup.stdlib.in b/Modules/Setup.stdlib.in index 56c1badf6b44a0..7b3216a50bb284 100644 --- a/Modules/Setup.stdlib.in +++ b/Modules/Setup.stdlib.in @@ -158,7 +158,7 @@ @MODULE_XXSUBTYPE_TRUE@xxsubtype xxsubtype.c @MODULE__XXTESTFUZZ_TRUE@_xxtestfuzz _xxtestfuzz/_xxtestfuzz.c _xxtestfuzz/fuzzer.c @MODULE__TESTBUFFER_TRUE@_testbuffer _testbuffer.c -@MODULE__TESTINTERNALCAPI_TRUE@_testinternalcapi _testinternalcapi.c _testinternalcapi/pytime.c +@MODULE__TESTINTERNALCAPI_TRUE@_testinternalcapi _testinternalcapi.c _testinternalcapi/test_lock.c _testinternalcapi/pytime.c @MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/vectorcall_limited.c _testcapi/heaptype.c _testcapi/abstract.c _testcapi/unicode.c _testcapi/dict.c _testcapi/getargs.c _testcapi/datetime.c _testcapi/docstring.c _testcapi/mem.c _testcapi/watchers.c _testcapi/long.c _testcapi/float.c _testcapi/structmember.c _testcapi/exceptions.c _testcapi/code.c _testcapi/buffer.c _testcapi/pyatomic.c _testcapi/pyos.c _testcapi/immortal.c _testcapi/heaptype_relative.c _testcapi/gc.c @MODULE__TESTCLINIC_TRUE@_testclinic _testclinic.c @MODULE__TESTCLINIC_LIMITED_TRUE@_testclinic_limited _testclinic_limited.c diff --git a/Modules/_testcapi/pyatomic.c b/Modules/_testcapi/pyatomic.c index 15602ce3f4ab3b..f0be2cfccccc98 100644 --- a/Modules/_testcapi/pyatomic.c +++ b/Modules/_testcapi/pyatomic.c @@ -8,7 +8,6 @@ #undef NDEBUG #include "Python.h" -#include "cpython/pyatomic.h" #include "parts.h" // We define atomic bitwise operations on these types diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 922672d1a9f915..934e3637a9164d 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -1543,6 +1543,9 @@ static PyMethodDef module_functions[] = { static int module_exec(PyObject *module) { + if (_PyTestInternalCapi_Init_Lock(module) < 0) { + return 1; + } if (_PyTestInternalCapi_Init_PyTime(module) < 0) { return 1; } diff --git a/Modules/_testinternalcapi/clinic/test_lock.c.h b/Modules/_testinternalcapi/clinic/test_lock.c.h new file mode 100644 index 00000000000000..3cbe5ef12c5fa6 --- /dev/null +++ b/Modules/_testinternalcapi/clinic/test_lock.c.h @@ -0,0 +1,74 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +#include "pycore_abstract.h" // _PyNumber_Index() + +PyDoc_STRVAR(_testinternalcapi_benchmark_locks__doc__, +"benchmark_locks($module, num_threads, use_pymutex=True,\n" +" critical_section_length=1, time_ms=1000, /)\n" +"--\n" +"\n"); + +#define _TESTINTERNALCAPI_BENCHMARK_LOCKS_METHODDEF \ + {"benchmark_locks", _PyCFunction_CAST(_testinternalcapi_benchmark_locks), METH_FASTCALL, _testinternalcapi_benchmark_locks__doc__}, + +static PyObject * +_testinternalcapi_benchmark_locks_impl(PyObject *module, + Py_ssize_t num_threads, + int use_pymutex, + int critical_section_length, + int time_ms); + +static PyObject * +_testinternalcapi_benchmark_locks(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + Py_ssize_t num_threads; + int use_pymutex = 1; + int critical_section_length = 1; + int time_ms = 1000; + + if (!_PyArg_CheckPositional("benchmark_locks", nargs, 1, 4)) { + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[0]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + num_threads = ival; + } + if (nargs < 2) { + goto skip_optional; + } + use_pymutex = PyObject_IsTrue(args[1]); + if (use_pymutex < 0) { + goto exit; + } + if (nargs < 3) { + goto skip_optional; + } + critical_section_length = PyLong_AsInt(args[2]); + if (critical_section_length == -1 && PyErr_Occurred()) { + goto exit; + } + if (nargs < 4) { + goto skip_optional; + } + time_ms = PyLong_AsInt(args[3]); + if (time_ms == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional: + return_value = _testinternalcapi_benchmark_locks_impl(module, num_threads, use_pymutex, critical_section_length, time_ms); + +exit: + return return_value; +} +/*[clinic end generated code: output=97c85dff601fed4b input=a9049054013a1b77]*/ diff --git a/Modules/_testinternalcapi/parts.h b/Modules/_testinternalcapi/parts.h index 43e7714b235156..bbb8e62ddaf7a2 100644 --- a/Modules/_testinternalcapi/parts.h +++ b/Modules/_testinternalcapi/parts.h @@ -10,6 +10,7 @@ #include "Python.h" +int _PyTestInternalCapi_Init_Lock(PyObject *module); int _PyTestInternalCapi_Init_PyTime(PyObject *module); #endif // Py_TESTINTERNALCAPI_PARTS_H diff --git a/Modules/_testinternalcapi/test_lock.c b/Modules/_testinternalcapi/test_lock.c new file mode 100644 index 00000000000000..33b49dacaa946e --- /dev/null +++ b/Modules/_testinternalcapi/test_lock.c @@ -0,0 +1,353 @@ +// C Extension module to test pycore_lock.h API + +#include "parts.h" + +#include "pycore_lock.h" +#include "clinic/test_lock.c.h" + +#ifdef MS_WINDOWS +#define WIN32_LEAN_AND_MEAN +#include +#else +#include // usleep() +#endif + +/*[clinic input] +module _testinternalcapi +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=7bb583d8c9eb9a78]*/ + + +static void +pysleep(int ms) +{ +#ifdef MS_WINDOWS + Sleep(ms); +#else + usleep(ms * 1000); +#endif +} + +static PyObject * +test_lock_basic(PyObject *self, PyObject *obj) +{ + PyMutex m = (PyMutex){0}; + + // uncontended lock and unlock + PyMutex_Lock(&m); + assert(m.v == 1); + PyMutex_Unlock(&m); + assert(m.v == 0); + + Py_RETURN_NONE; +} + +struct test_lock2_data { + PyMutex m; + PyEvent done; + int started; +}; + +static void +lock_thread(void *arg) +{ + struct test_lock2_data *test_data = arg; + PyMutex *m = &test_data->m; + _Py_atomic_store_int(&test_data->started, 1); + + PyMutex_Lock(m); + assert(m->v == 1); + + PyMutex_Unlock(m); + assert(m->v == 0); + + _PyEvent_Notify(&test_data->done); +} + +static PyObject * +test_lock_two_threads(PyObject *self, PyObject *obj) +{ + // lock attempt by two threads + struct test_lock2_data test_data; + memset(&test_data, 0, sizeof(test_data)); + + PyMutex_Lock(&test_data.m); + assert(test_data.m.v == 1); + + PyThread_start_new_thread(lock_thread, &test_data); + while (!_Py_atomic_load_int(&test_data.started)) { + pysleep(10); + } + pysleep(10); // allow some time for the other thread to try to lock + assert(test_data.m.v == 3); + + PyMutex_Unlock(&test_data.m); + PyEvent_Wait(&test_data.done); + assert(test_data.m.v == 0); + + Py_RETURN_NONE; +} + +#define COUNTER_THREADS 5 +#define COUNTER_ITERS 10000 + +struct test_data_counter { + PyMutex m; + Py_ssize_t counter; +}; + +struct thread_data_counter { + struct test_data_counter *test_data; + PyEvent done_event; +}; + +static void +counter_thread(void *arg) +{ + struct thread_data_counter *thread_data = arg; + struct test_data_counter *test_data = thread_data->test_data; + + for (Py_ssize_t i = 0; i < COUNTER_ITERS; i++) { + PyMutex_Lock(&test_data->m); + test_data->counter++; + PyMutex_Unlock(&test_data->m); + } + _PyEvent_Notify(&thread_data->done_event); +} + +static PyObject * +test_lock_counter(PyObject *self, PyObject *obj) +{ + // Test with rapidly locking and unlocking mutex + struct test_data_counter test_data; + memset(&test_data, 0, sizeof(test_data)); + + struct thread_data_counter thread_data[COUNTER_THREADS]; + memset(&thread_data, 0, sizeof(thread_data)); + + for (Py_ssize_t i = 0; i < COUNTER_THREADS; i++) { + thread_data[i].test_data = &test_data; + PyThread_start_new_thread(counter_thread, &thread_data[i]); + } + + for (Py_ssize_t i = 0; i < COUNTER_THREADS; i++) { + PyEvent_Wait(&thread_data[i].done_event); + } + + assert(test_data.counter == COUNTER_THREADS * COUNTER_ITERS); + Py_RETURN_NONE; +} + +#define SLOW_COUNTER_ITERS 100 + +static void +slow_counter_thread(void *arg) +{ + struct thread_data_counter *thread_data = arg; + struct test_data_counter *test_data = thread_data->test_data; + + for (Py_ssize_t i = 0; i < SLOW_COUNTER_ITERS; i++) { + PyMutex_Lock(&test_data->m); + if (i % 7 == 0) { + pysleep(2); + } + test_data->counter++; + PyMutex_Unlock(&test_data->m); + } + _PyEvent_Notify(&thread_data->done_event); +} + +static PyObject * +test_lock_counter_slow(PyObject *self, PyObject *obj) +{ + // Test lock/unlock with occasional "long" critical section, which will + // trigger handoff of the lock. + struct test_data_counter test_data; + memset(&test_data, 0, sizeof(test_data)); + + struct thread_data_counter thread_data[COUNTER_THREADS]; + memset(&thread_data, 0, sizeof(thread_data)); + + for (Py_ssize_t i = 0; i < COUNTER_THREADS; i++) { + thread_data[i].test_data = &test_data; + PyThread_start_new_thread(slow_counter_thread, &thread_data[i]); + } + + for (Py_ssize_t i = 0; i < COUNTER_THREADS; i++) { + PyEvent_Wait(&thread_data[i].done_event); + } + + assert(test_data.counter == COUNTER_THREADS * SLOW_COUNTER_ITERS); + Py_RETURN_NONE; +} + +struct bench_data_locks { + int stop; + int use_pymutex; + int critical_section_length; + char padding[200]; + PyThread_type_lock lock; + PyMutex m; + double value; + Py_ssize_t total_iters; +}; + +struct bench_thread_data { + struct bench_data_locks *bench_data; + Py_ssize_t iters; + PyEvent done; +}; + +static void +thread_benchmark_locks(void *arg) +{ + struct bench_thread_data *thread_data = arg; + struct bench_data_locks *bench_data = thread_data->bench_data; + int use_pymutex = bench_data->use_pymutex; + int critical_section_length = bench_data->critical_section_length; + + double my_value = 1.0; + Py_ssize_t iters = 0; + while (!_Py_atomic_load_int_relaxed(&bench_data->stop)) { + if (use_pymutex) { + PyMutex_Lock(&bench_data->m); + for (int i = 0; i < critical_section_length; i++) { + bench_data->value += my_value; + my_value = bench_data->value; + } + PyMutex_Unlock(&bench_data->m); + } + else { + PyThread_acquire_lock(bench_data->lock, 1); + for (int i = 0; i < critical_section_length; i++) { + bench_data->value += my_value; + my_value = bench_data->value; + } + PyThread_release_lock(bench_data->lock); + } + iters++; + } + + thread_data->iters = iters; + _Py_atomic_add_ssize(&bench_data->total_iters, iters); + _PyEvent_Notify(&thread_data->done); +} + +/*[clinic input] +_testinternalcapi.benchmark_locks + + num_threads: Py_ssize_t + use_pymutex: bool = True + critical_section_length: int = 1 + time_ms: int = 1000 + / + +[clinic start generated code]*/ + +static PyObject * +_testinternalcapi_benchmark_locks_impl(PyObject *module, + Py_ssize_t num_threads, + int use_pymutex, + int critical_section_length, + int time_ms) +/*[clinic end generated code: output=381df8d7e9a74f18 input=f3aeaf688738c121]*/ +{ + // Run from Tools/lockbench/lockbench.py + // Based on the WebKit lock benchmarks: + // https://github.com/WebKit/WebKit/blob/main/Source/WTF/benchmarks/LockSpeedTest.cpp + // See also https://webkit.org/blog/6161/locking-in-webkit/ + PyObject *thread_iters = NULL; + PyObject *res = NULL; + + struct bench_data_locks bench_data; + memset(&bench_data, 0, sizeof(bench_data)); + bench_data.use_pymutex = use_pymutex; + bench_data.critical_section_length = critical_section_length; + + bench_data.lock = PyThread_allocate_lock(); + if (bench_data.lock == NULL) { + return PyErr_NoMemory(); + } + + struct bench_thread_data *thread_data = NULL; + thread_data = PyMem_Calloc(num_threads, sizeof(*thread_data)); + if (thread_data == NULL) { + PyErr_NoMemory(); + goto exit; + } + + thread_iters = PyList_New(num_threads); + if (thread_iters == NULL) { + goto exit; + } + + _PyTime_t start = _PyTime_GetMonotonicClock(); + + for (Py_ssize_t i = 0; i < num_threads; i++) { + thread_data[i].bench_data = &bench_data; + PyThread_start_new_thread(thread_benchmark_locks, &thread_data[i]); + } + + // Let the threads run for `time_ms` milliseconds + pysleep(time_ms); + _Py_atomic_store_int(&bench_data.stop, 1); + + // Wait for the threads to finish + for (Py_ssize_t i = 0; i < num_threads; i++) { + PyEvent_Wait(&thread_data[i].done); + } + + Py_ssize_t total_iters = bench_data.total_iters; + _PyTime_t end = _PyTime_GetMonotonicClock(); + + // Return the total number of acquisitions and the number of acquisitions + // for each thread. + for (Py_ssize_t i = 0; i < num_threads; i++) { + PyObject *iter = PyLong_FromSsize_t(thread_data[i].iters); + if (iter == NULL) { + goto exit; + } + PyList_SET_ITEM(thread_iters, i, iter); + } + + double rate = total_iters * 1000000000.0 / (end - start); + res = Py_BuildValue("(dO)", rate, thread_iters); + +exit: + PyThread_free_lock(bench_data.lock); + PyMem_Free(thread_data); + Py_XDECREF(thread_iters); + return res; +} + +static PyObject * +test_lock_benchmark(PyObject *module, PyObject *obj) +{ + // Just make sure the benchmark runs without crashing + PyObject *res = _testinternalcapi_benchmark_locks_impl( + module, 1, 1, 1, 100); + if (res == NULL) { + return NULL; + } + Py_DECREF(res); + Py_RETURN_NONE; +} + +static PyMethodDef test_methods[] = { + {"test_lock_basic", test_lock_basic, METH_NOARGS}, + {"test_lock_two_threads", test_lock_two_threads, METH_NOARGS}, + {"test_lock_counter", test_lock_counter, METH_NOARGS}, + {"test_lock_counter_slow", test_lock_counter_slow, METH_NOARGS}, + _TESTINTERNALCAPI_BENCHMARK_LOCKS_METHODDEF + {"test_lock_benchmark", test_lock_benchmark, METH_NOARGS}, + {NULL, NULL} /* sentinel */ +}; + +int +_PyTestInternalCapi_Init_Lock(PyObject *mod) +{ + if (PyModule_AddFunctions(mod, test_methods) < 0) { + return -1; + } + return 0; +} diff --git a/PCbuild/_testinternalcapi.vcxproj b/PCbuild/_testinternalcapi.vcxproj index 59491c644b6655..fb474f06f38fe8 100644 --- a/PCbuild/_testinternalcapi.vcxproj +++ b/PCbuild/_testinternalcapi.vcxproj @@ -95,6 +95,7 @@ + diff --git a/PCbuild/_testinternalcapi.vcxproj.filters b/PCbuild/_testinternalcapi.vcxproj.filters index 21a66a2aa79f76..9c8a5d793ee0f4 100644 --- a/PCbuild/_testinternalcapi.vcxproj.filters +++ b/PCbuild/_testinternalcapi.vcxproj.filters @@ -15,6 +15,9 @@ Source Files + + Source Files + diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 04752a8029acc2..190eaa16daa8af 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -245,6 +245,8 @@ + + @@ -254,6 +256,7 @@ + @@ -269,6 +272,7 @@ + @@ -307,6 +311,7 @@ + @@ -552,12 +557,14 @@ + + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 4ad02778466925..f4fddfdd11f4c1 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -144,6 +144,9 @@ Include + + Include + Include @@ -645,6 +648,12 @@ Include\internal + + Include\internal + + + Include\internal + Include\internal @@ -672,6 +681,9 @@ Include\internal + + Include\internal + Include\internal @@ -717,6 +729,9 @@ Include\internal + + Include\internal + Include\internal @@ -1241,6 +1256,9 @@ Source Files + + Source Files + Python @@ -1259,6 +1277,9 @@ Python + + Python + Python diff --git a/Python/lock.c b/Python/lock.c new file mode 100644 index 00000000000000..3dad2aa93b5cc9 --- /dev/null +++ b/Python/lock.c @@ -0,0 +1,297 @@ +// Lock implementation + +#include "Python.h" + +#include "pycore_lock.h" +#include "pycore_parking_lot.h" +#include "pycore_semaphore.h" + +#ifdef MS_WINDOWS +#define WIN32_LEAN_AND_MEAN +#include // SwitchToThread() +#elif defined(HAVE_SCHED_H) +#include // sched_yield() +#endif + +// If a thread waits on a lock for longer than TIME_TO_BE_FAIR_NS (1 ms), then +// the unlocking thread directly hands off ownership of the lock. This avoids +// starvation. +static const _PyTime_t TIME_TO_BE_FAIR_NS = 1000*1000; + +// Spin for a bit before parking the thread. This is only enabled for +// `--disable-gil` builds because it is unlikely to be helpful if the GIL is +// enabled. +#if Py_NOGIL +static const int MAX_SPIN_COUNT = 40; +#else +static const int MAX_SPIN_COUNT = 0; +#endif + +struct mutex_entry { + // The time after which the unlocking thread should hand off lock ownership + // directly to the waiting thread. Written by the waiting thread. + _PyTime_t time_to_be_fair; + + // Set to 1 if the lock was handed off. Written by the unlocking thread. + int handed_off; +}; + +static void +_Py_yield(void) +{ +#ifdef MS_WINDOWS + SwitchToThread(); +#elif defined(HAVE_SCHED_H) + sched_yield(); +#endif +} + +void +_PyMutex_LockSlow(PyMutex *m) +{ + _PyMutex_LockTimed(m, -1, _PY_LOCK_DETACH); +} + +PyLockStatus +_PyMutex_LockTimed(PyMutex *m, _PyTime_t timeout, _PyLockFlags flags) +{ + uint8_t v = _Py_atomic_load_uint8_relaxed(&m->v); + if ((v & _Py_LOCKED) == 0) { + if (_Py_atomic_compare_exchange_uint8(&m->v, &v, v|_Py_LOCKED)) { + return PY_LOCK_ACQUIRED; + } + } + else if (timeout == 0) { + return PY_LOCK_FAILURE; + } + + _PyTime_t now = _PyTime_GetMonotonicClock(); + _PyTime_t endtime = 0; + if (timeout > 0) { + endtime = _PyTime_Add(now, timeout); + } + + struct mutex_entry entry = { + .time_to_be_fair = now + TIME_TO_BE_FAIR_NS, + .handed_off = 0, + }; + + Py_ssize_t spin_count = 0; + for (;;) { + if ((v & _Py_LOCKED) == 0) { + // The lock is unlocked. Try to grab it. + if (_Py_atomic_compare_exchange_uint8(&m->v, &v, v|_Py_LOCKED)) { + return PY_LOCK_ACQUIRED; + } + continue; + } + + if (!(v & _Py_HAS_PARKED) && spin_count < MAX_SPIN_COUNT) { + // Spin for a bit. + _Py_yield(); + spin_count++; + continue; + } + + if (timeout == 0) { + return PY_LOCK_FAILURE; + } + + uint8_t newv = v; + if (!(v & _Py_HAS_PARKED)) { + // We are the first waiter. Set the _Py_HAS_PARKED flag. + newv = v | _Py_HAS_PARKED; + if (!_Py_atomic_compare_exchange_uint8(&m->v, &v, newv)) { + continue; + } + } + + int ret = _PyParkingLot_Park(&m->v, &newv, sizeof(newv), timeout, + &entry, (flags & _PY_LOCK_DETACH) != 0); + if (ret == Py_PARK_OK) { + if (entry.handed_off) { + // We own the lock now. + assert(_Py_atomic_load_uint8_relaxed(&m->v) & _Py_LOCKED); + return PY_LOCK_ACQUIRED; + } + } + else if (ret == Py_PARK_INTR && (flags & _PY_LOCK_HANDLE_SIGNALS)) { + if (Py_MakePendingCalls() < 0) { + return PY_LOCK_INTR; + } + } + else if (ret == Py_PARK_TIMEOUT) { + assert(timeout >= 0); + return PY_LOCK_FAILURE; + } + + if (timeout > 0) { + timeout = _PyDeadline_Get(endtime); + if (timeout <= 0) { + // Avoid negative values because those mean block forever. + timeout = 0; + } + } + + v = _Py_atomic_load_uint8_relaxed(&m->v); + } +} + +static void +mutex_unpark(PyMutex *m, struct mutex_entry *entry, int has_more_waiters) +{ + uint8_t v = 0; + if (entry) { + _PyTime_t now = _PyTime_GetMonotonicClock(); + int should_be_fair = now > entry->time_to_be_fair; + + entry->handed_off = should_be_fair; + if (should_be_fair) { + v |= _Py_LOCKED; + } + if (has_more_waiters) { + v |= _Py_HAS_PARKED; + } + } + _Py_atomic_store_uint8(&m->v, v); +} + +int +_PyMutex_TryUnlock(PyMutex *m) +{ + uint8_t v = _Py_atomic_load_uint8(&m->v); + for (;;) { + if ((v & _Py_LOCKED) == 0) { + // error: the mutex is not locked + return -1; + } + else if ((v & _Py_HAS_PARKED)) { + // wake up a single thread + _PyParkingLot_Unpark(&m->v, (_Py_unpark_fn_t *)mutex_unpark, m); + return 0; + } + else if (_Py_atomic_compare_exchange_uint8(&m->v, &v, _Py_UNLOCKED)) { + // fast-path: no waiters + return 0; + } + } +} + +void +_PyMutex_UnlockSlow(PyMutex *m) +{ + if (_PyMutex_TryUnlock(m) < 0) { + Py_FatalError("unlocking mutex that is not locked"); + } +} + +// _PyRawMutex stores a linked list of `struct raw_mutex_entry`, one for each +// thread waiting on the mutex, directly in the mutex itself. +struct raw_mutex_entry { + struct raw_mutex_entry *next; + _PySemaphore sema; +}; + +void +_PyRawMutex_LockSlow(_PyRawMutex *m) +{ + struct raw_mutex_entry waiter; + _PySemaphore_Init(&waiter.sema); + + uintptr_t v = _Py_atomic_load_uintptr(&m->v); + for (;;) { + if ((v & _Py_LOCKED) == 0) { + // Unlocked: try to grab it (even if it has a waiter). + if (_Py_atomic_compare_exchange_uintptr(&m->v, &v, v|_Py_LOCKED)) { + break; + } + continue; + } + + // Locked: try to add ourselves as a waiter. + waiter.next = (struct raw_mutex_entry *)(v & ~1); + uintptr_t desired = ((uintptr_t)&waiter)|_Py_LOCKED; + if (!_Py_atomic_compare_exchange_uintptr(&m->v, &v, desired)) { + continue; + } + + // Wait for us to be woken up. Note that we still have to lock the + // mutex ourselves: it is NOT handed off to us. + _PySemaphore_Wait(&waiter.sema, -1, /*detach=*/0); + } + + _PySemaphore_Destroy(&waiter.sema); +} + +void +_PyRawMutex_UnlockSlow(_PyRawMutex *m) +{ + uintptr_t v = _Py_atomic_load_uintptr(&m->v); + for (;;) { + if ((v & _Py_LOCKED) == 0) { + Py_FatalError("unlocking mutex that is not locked"); + } + + struct raw_mutex_entry *waiter = (struct raw_mutex_entry *)(v & ~1); + if (waiter) { + uintptr_t next_waiter = (uintptr_t)waiter->next; + if (_Py_atomic_compare_exchange_uintptr(&m->v, &v, next_waiter)) { + _PySemaphore_Wakeup(&waiter->sema); + return; + } + } + else { + if (_Py_atomic_compare_exchange_uintptr(&m->v, &v, _Py_UNLOCKED)) { + return; + } + } + } +} + +void +_PyEvent_Notify(PyEvent *evt) +{ + uintptr_t v = _Py_atomic_exchange_uint8(&evt->v, _Py_LOCKED); + if (v == _Py_UNLOCKED) { + // no waiters + return; + } + else if (v == _Py_LOCKED) { + // event already set + return; + } + else { + assert(v == _Py_HAS_PARKED); + _PyParkingLot_UnparkAll(&evt->v); + } +} + +void +PyEvent_Wait(PyEvent *evt) +{ + while (!PyEvent_WaitTimed(evt, -1)) + ; +} + +int +PyEvent_WaitTimed(PyEvent *evt, _PyTime_t timeout_ns) +{ + for (;;) { + uint8_t v = _Py_atomic_load_uint8(&evt->v); + if (v == _Py_LOCKED) { + // event already set + return 1; + } + if (v == _Py_UNLOCKED) { + if (!_Py_atomic_compare_exchange_uint8(&evt->v, &v, _Py_HAS_PARKED)) { + continue; + } + } + + uint8_t expected = _Py_HAS_PARKED; + (void) _PyParkingLot_Park(&evt->v, &expected, sizeof(evt->v), + timeout_ns, NULL, 1); + + return _Py_atomic_load_uint8(&evt->v) == _Py_LOCKED; + } +} diff --git a/Python/parking_lot.c b/Python/parking_lot.c new file mode 100644 index 00000000000000..664e622cc17474 --- /dev/null +++ b/Python/parking_lot.c @@ -0,0 +1,370 @@ +#include "Python.h" + +#include "pycore_llist.h" +#include "pycore_lock.h" // _PyRawMutex +#include "pycore_parking_lot.h" +#include "pycore_pyerrors.h" // _Py_FatalErrorFormat +#include "pycore_pystate.h" // _PyThreadState_GET +#include "pycore_semaphore.h" // _PySemaphore + +#include + + +typedef struct { + // The mutex protects the waiter queue and the num_waiters counter. + _PyRawMutex mutex; + + // Linked list of `struct wait_entry` waiters in this bucket. + struct llist_node root; + size_t num_waiters; +} Bucket; + +struct wait_entry { + void *park_arg; + uintptr_t addr; + _PySemaphore sema; + struct llist_node node; + bool is_unparking; +}; + +// Prime number to avoid correlations with memory addresses. +// We want this to be roughly proportional to the number of CPU cores +// to minimize contention on the bucket locks, but not too big to avoid +// wasting memory. The exact choice does not matter much. +#define NUM_BUCKETS 257 + +#define BUCKET_INIT(b, i) [i] = { .root = LLIST_INIT(b[i].root) } +#define BUCKET_INIT_2(b, i) BUCKET_INIT(b, i), BUCKET_INIT(b, i+1) +#define BUCKET_INIT_4(b, i) BUCKET_INIT_2(b, i), BUCKET_INIT_2(b, i+2) +#define BUCKET_INIT_8(b, i) BUCKET_INIT_4(b, i), BUCKET_INIT_4(b, i+4) +#define BUCKET_INIT_16(b, i) BUCKET_INIT_8(b, i), BUCKET_INIT_8(b, i+8) +#define BUCKET_INIT_32(b, i) BUCKET_INIT_16(b, i), BUCKET_INIT_16(b, i+16) +#define BUCKET_INIT_64(b, i) BUCKET_INIT_32(b, i), BUCKET_INIT_32(b, i+32) +#define BUCKET_INIT_128(b, i) BUCKET_INIT_64(b, i), BUCKET_INIT_64(b, i+64) +#define BUCKET_INIT_256(b, i) BUCKET_INIT_128(b, i), BUCKET_INIT_128(b, i+128) + +// Table of waiters (hashed by address) +static Bucket buckets[NUM_BUCKETS] = { + BUCKET_INIT_256(buckets, 0), + BUCKET_INIT(buckets, 256), +}; + +void +_PySemaphore_Init(_PySemaphore *sema) +{ +#if defined(MS_WINDOWS) + sema->platform_sem = CreateSemaphore( + NULL, // attributes + 0, // initial count + 10, // maximum count + NULL // unnamed + ); + if (!sema->platform_sem) { + Py_FatalError("parking_lot: CreateSemaphore failed"); + } +#elif defined(_Py_USE_SEMAPHORES) + if (sem_init(&sema->platform_sem, /*pshared=*/0, /*value=*/0) < 0) { + Py_FatalError("parking_lot: sem_init failed"); + } +#else + if (pthread_mutex_init(&sema->mutex, NULL) != 0) { + Py_FatalError("parking_lot: pthread_mutex_init failed"); + } + if (pthread_cond_init(&sema->cond, NULL)) { + Py_FatalError("parking_lot: pthread_cond_init failed"); + } + sema->counter = 0; +#endif +} + +void +_PySemaphore_Destroy(_PySemaphore *sema) +{ +#if defined(MS_WINDOWS) + CloseHandle(sema->platform_sem); +#elif defined(_Py_USE_SEMAPHORES) + sem_destroy(&sema->platform_sem); +#else + pthread_mutex_destroy(&sema->mutex); + pthread_cond_destroy(&sema->cond); +#endif +} + +static int +_PySemaphore_PlatformWait(_PySemaphore *sema, _PyTime_t timeout) +{ + int res; +#if defined(MS_WINDOWS) + DWORD wait; + DWORD millis = 0; + if (timeout < 0) { + millis = INFINITE; + } + else { + millis = (DWORD) (timeout / 1000000); + } + wait = WaitForSingleObjectEx(sema->platform_sem, millis, FALSE); + if (wait == WAIT_OBJECT_0) { + res = Py_PARK_OK; + } + else if (wait == WAIT_TIMEOUT) { + res = Py_PARK_TIMEOUT; + } + else { + res = Py_PARK_INTR; + } +#elif defined(_Py_USE_SEMAPHORES) + int err; + if (timeout >= 0) { + struct timespec ts; + + _PyTime_t deadline = _PyTime_Add(_PyTime_GetSystemClock(), timeout); + _PyTime_AsTimespec(deadline, &ts); + + err = sem_timedwait(&sema->platform_sem, &ts); + } + else { + err = sem_wait(&sema->platform_sem); + } + if (err == -1) { + err = errno; + if (err == EINTR) { + res = Py_PARK_INTR; + } + else if (err == ETIMEDOUT) { + res = Py_PARK_TIMEOUT; + } + else { + _Py_FatalErrorFormat(__func__, + "unexpected error from semaphore: %d", + err); + } + } + else { + res = Py_PARK_OK; + } +#else + pthread_mutex_lock(&sema->mutex); + int err = 0; + if (sema->counter == 0) { + if (timeout >= 0) { + struct timespec ts; + + _PyTime_t deadline = _PyTime_Add(_PyTime_GetSystemClock(), timeout); + _PyTime_AsTimespec(deadline, &ts); + + err = pthread_cond_timedwait(&sema->cond, &sema->mutex, &ts); + } + else { + err = pthread_cond_wait(&sema->cond, &sema->mutex); + } + } + if (sema->counter > 0) { + sema->counter--; + res = Py_PARK_OK; + } + else if (err) { + res = Py_PARK_TIMEOUT; + } + else { + res = Py_PARK_INTR; + } + pthread_mutex_unlock(&sema->mutex); +#endif + return res; +} + +int +_PySemaphore_Wait(_PySemaphore *sema, _PyTime_t timeout, int detach) +{ + PyThreadState *tstate = NULL; + if (detach) { + tstate = _PyThreadState_GET(); + if (tstate) { + PyEval_ReleaseThread(tstate); + } + } + + int res = _PySemaphore_PlatformWait(sema, timeout); + + if (detach && tstate) { + PyEval_AcquireThread(tstate); + } + return res; +} + +void +_PySemaphore_Wakeup(_PySemaphore *sema) +{ +#if defined(MS_WINDOWS) + if (!ReleaseSemaphore(sema->platform_sem, 1, NULL)) { + Py_FatalError("parking_lot: ReleaseSemaphore failed"); + } +#elif defined(_Py_USE_SEMAPHORES) + int err = sem_post(&sema->platform_sem); + if (err != 0) { + Py_FatalError("parking_lot: sem_post failed"); + } +#else + pthread_mutex_lock(&sema->mutex); + sema->counter++; + pthread_cond_signal(&sema->cond); + pthread_mutex_unlock(&sema->mutex); +#endif +} + +static void +enqueue(Bucket *bucket, const void *address, struct wait_entry *wait) +{ + llist_insert_tail(&bucket->root, &wait->node); + ++bucket->num_waiters; +} + +static struct wait_entry * +dequeue(Bucket *bucket, const void *address) +{ + // find the first waiter that is waiting on `address` + struct llist_node *root = &bucket->root; + struct llist_node *node; + llist_for_each(node, root) { + struct wait_entry *wait = llist_data(node, struct wait_entry, node); + if (wait->addr == (uintptr_t)address) { + llist_remove(node); + --bucket->num_waiters; + return wait; + } + } + return NULL; +} + +static void +dequeue_all(Bucket *bucket, const void *address, struct llist_node *dst) +{ + // remove and append all matching waiters to dst + struct llist_node *root = &bucket->root; + struct llist_node *node; + llist_for_each_safe(node, root) { + struct wait_entry *wait = llist_data(node, struct wait_entry, node); + if (wait->addr == (uintptr_t)address) { + llist_remove(node); + llist_insert_tail(dst, node); + --bucket->num_waiters; + } + } +} + +// Checks that `*addr == *expected` (only works for 1, 2, 4, or 8 bytes) +static int +atomic_memcmp(const void *addr, const void *expected, size_t addr_size) +{ + switch (addr_size) { + case 1: return _Py_atomic_load_uint8(addr) == *(const uint8_t *)expected; + case 2: return _Py_atomic_load_uint16(addr) == *(const uint16_t *)expected; + case 4: return _Py_atomic_load_uint32(addr) == *(const uint32_t *)expected; + case 8: return _Py_atomic_load_uint64(addr) == *(const uint64_t *)expected; + default: Py_UNREACHABLE(); + } +} + +int +_PyParkingLot_Park(const void *addr, const void *expected, size_t size, + _PyTime_t timeout_ns, void *park_arg, int detach) +{ + struct wait_entry wait = { + .park_arg = park_arg, + .addr = (uintptr_t)addr, + .is_unparking = false, + }; + + Bucket *bucket = &buckets[((uintptr_t)addr) % NUM_BUCKETS]; + + _PyRawMutex_Lock(&bucket->mutex); + if (!atomic_memcmp(addr, expected, size)) { + _PyRawMutex_Unlock(&bucket->mutex); + return Py_PARK_AGAIN; + } + _PySemaphore_Init(&wait.sema); + enqueue(bucket, addr, &wait); + _PyRawMutex_Unlock(&bucket->mutex); + + int res = _PySemaphore_Wait(&wait.sema, timeout_ns, detach); + if (res == Py_PARK_OK) { + goto done; + } + + // timeout or interrupt + _PyRawMutex_Lock(&bucket->mutex); + if (wait.is_unparking) { + _PyRawMutex_Unlock(&bucket->mutex); + // Another thread has started to unpark us. Wait until we process the + // wakeup signal. + do { + res = _PySemaphore_Wait(&wait.sema, -1, detach); + } while (res != Py_PARK_OK); + goto done; + } + else { + llist_remove(&wait.node); + --bucket->num_waiters; + } + _PyRawMutex_Unlock(&bucket->mutex); + +done: + _PySemaphore_Destroy(&wait.sema); + return res; + +} + +void +_PyParkingLot_Unpark(const void *addr, _Py_unpark_fn_t *fn, void *arg) +{ + Bucket *bucket = &buckets[((uintptr_t)addr) % NUM_BUCKETS]; + + // Find the first waiter that is waiting on `addr` + _PyRawMutex_Lock(&bucket->mutex); + struct wait_entry *waiter = dequeue(bucket, addr); + if (waiter) { + waiter->is_unparking = true; + + int has_more_waiters = (bucket->num_waiters > 0); + fn(arg, waiter->park_arg, has_more_waiters); + } + else { + fn(arg, NULL, 0); + } + _PyRawMutex_Unlock(&bucket->mutex); + + if (waiter) { + // Wakeup the waiter outside of the bucket lock + _PySemaphore_Wakeup(&waiter->sema); + } +} + +void +_PyParkingLot_UnparkAll(const void *addr) +{ + struct llist_node head = LLIST_INIT(head); + Bucket *bucket = &buckets[((uintptr_t)addr) % NUM_BUCKETS]; + + _PyRawMutex_Lock(&bucket->mutex); + dequeue_all(bucket, addr, &head); + _PyRawMutex_Unlock(&bucket->mutex); + + struct llist_node *node; + llist_for_each_safe(node, &head) { + struct wait_entry *waiter = llist_data(node, struct wait_entry, node); + llist_remove(node); + _PySemaphore_Wakeup(&waiter->sema); + } +} + +void +_PyParkingLot_AfterFork(void) +{ + // After a fork only one thread remains. That thread cannot be blocked + // so all entries in the parking lot are for dead threads. + memset(buckets, 0, sizeof(buckets)); + for (Py_ssize_t i = 0; i < NUM_BUCKETS; i++) { + llist_init(&buckets[i].root); + } +} diff --git a/Python/pystate.c b/Python/pystate.c index 08cf6f0bb7c97a..71ff3e5a6aec76 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -9,6 +9,7 @@ #include "pycore_frame.h" #include "pycore_initconfig.h" // _PyStatus_OK() #include "pycore_object.h" // _PyType_InitCache() +#include "pycore_parking_lot.h" // _PyParkingLot_AfterFork() #include "pycore_pyerrors.h" // _PyErr_Clear() #include "pycore_pylifecycle.h" // _PyAST_Fini() #include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() @@ -554,6 +555,10 @@ _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime) PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + // Clears the parking lot. Any waiting threads are dead. This must be + // called before releasing any locks that use the parking lot. + _PyParkingLot_AfterFork(); + /* bpo-42540: id_mutex is freed by _PyInterpreterState_Delete, which does * not force the default allocator. */ reinit_err += _PyThread_at_fork_reinit(&runtime->interpreters.main->id_mutex); diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py index 90334d0e79da80..4523b2ed5b9fdf 100644 --- a/Tools/c-analyzer/cpython/_parser.py +++ b/Tools/c-analyzer/cpython/_parser.py @@ -314,6 +314,7 @@ def clean_lines(text): _abs('Objects/stringlib/unicode_format.h'): (10_000, 400), _abs('Objects/typeobject.c'): (35_000, 200), _abs('Python/compile.c'): (20_000, 500), + _abs('Python/parking_lot.c'): (40_000, 1000), _abs('Python/pylifecycle.c'): (500_000, 5000), _abs('Python/pystate.c'): (500_000, 5000), diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 8c2be44b5171e6..336b0281bda85d 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -50,6 +50,9 @@ Python/getversion.c - version - Python/bootstrap_hash.c - _Py_HashSecret_Initialized - Python/pyhash.c - _Py_HashSecret - +## thread-safe hashtable (internal locks) +Python/parking_lot.c - buckets - + ################################## ## state tied to Py_Main() diff --git a/Tools/lockbench/lockbench.py b/Tools/lockbench/lockbench.py new file mode 100644 index 00000000000000..9833d703e00cbb --- /dev/null +++ b/Tools/lockbench/lockbench.py @@ -0,0 +1,53 @@ +# Measure the performance of PyMutex and PyThread_type_lock locks +# with short critical sections. +# +# Usage: python Tools/lockbench/lockbench.py [CRITICAL_SECTION_LENGTH] +# +# How to interpret the results: +# +# Acquisitions (kHz): Reports the total number of lock acquisitions in +# thousands of acquisitions per second. This is the most important metric, +# particularly for the 1 thread case because even in multithreaded programs, +# most locks acquisitions are not contended. Values for 2+ threads are +# only meaningful for `--disable-gil` builds, because the GIL prevents most +# situations where there is lock contention with short critical sections. +# +# Fairness: A measure of how evenly the lock acquisitions are distributed. +# A fairness of 1.0 means that all threads acquired the lock the same number +# of times. A fairness of 1/N means that only one thread ever acquired the +# lock. +# See https://en.wikipedia.org/wiki/Fairness_measure#Jain's_fairness_index + +from _testinternalcapi import benchmark_locks +import sys + +# Max number of threads to test +MAX_THREADS = 10 + +# How much "work" to do while holding the lock +CRITICAL_SECTION_LENGTH = 1 + + +def jains_fairness(values): + # Jain's fairness index + # See https://en.wikipedia.org/wiki/Fairness_measure + return (sum(values) ** 2) / (len(values) * sum(x ** 2 for x in values)) + +def main(): + print("Lock Type Threads Acquisitions (kHz) Fairness") + for lock_type in ["PyMutex", "PyThread_type_lock"]: + use_pymutex = (lock_type == "PyMutex") + for num_threads in range(1, MAX_THREADS + 1): + acquisitions, thread_iters = benchmark_locks( + num_threads, use_pymutex, CRITICAL_SECTION_LENGTH) + + acquisitions /= 1000 # report in kHz for readability + fairness = jains_fairness(thread_iters) + + print(f"{lock_type: <20}{num_threads: <18}{acquisitions: >5.0f}{fairness: >20.2f}") + + +if __name__ == "__main__": + if len(sys.argv) > 1: + CRITICAL_SECTION_LENGTH = int(sys.argv[1]) + main() diff --git a/configure b/configure index 17b9e7f532a827..abae542b528a23 100755 --- a/configure +++ b/configure @@ -27760,7 +27760,7 @@ fi # # Avoid #include or #include . The header # requires header which is only written below by AC_OUTPUT below. -# If the check is done after AC_OUTPUT, modifying LIBATOMIC has no effect +# If the check is done after AC_OUTPUT, modifying LIBS has no effect # anymore. cannot be included alone, it's designed to be included # by : it expects other includes and macros to be defined. save_CPPFLAGS=$CPPFLAGS @@ -27793,7 +27793,7 @@ typedef intptr_t Py_ssize_t; # error "unable to define Py_ssize_t" #endif -#include "cpython/pyatomic.h" +#include "pyatomic.h" int main() { @@ -27825,7 +27825,7 @@ printf "%s\n" "$ac_cv_libatomic_needed" >&6; } if test "x$ac_cv_libatomic_needed" = xyes then : - LIBATOMIC=${LIBATOMIC-"-latomic"} + LIBS="${LIBS} -latomic" fi CPPFLAGS=$save_CPPFLAGS @@ -29979,7 +29979,7 @@ fi then : - as_fn_append MODULE_BLOCK "MODULE__TESTCAPI_LDFLAGS=$LIBATOMIC$as_nl" + fi if test "$py_cv_module__testcapi" = yes; then diff --git a/configure.ac b/configure.ac index 34958a1cdf1528..205a98a992279c 100644 --- a/configure.ac +++ b/configure.ac @@ -6970,7 +6970,7 @@ fi # # Avoid #include or #include . The header # requires header which is only written below by AC_OUTPUT below. -# If the check is done after AC_OUTPUT, modifying LIBATOMIC has no effect +# If the check is done after AC_OUTPUT, modifying LIBS has no effect # anymore. cannot be included alone, it's designed to be included # by : it expects other includes and macros to be defined. _SAVE_VAR([CPPFLAGS]) @@ -6993,7 +6993,7 @@ typedef intptr_t Py_ssize_t; # error "unable to define Py_ssize_t" #endif -#include "cpython/pyatomic.h" +#include "pyatomic.h" int main() { @@ -7014,7 +7014,7 @@ int main() ]) AS_VAR_IF([ac_cv_libatomic_needed], [yes], - [LIBATOMIC=${LIBATOMIC-"-latomic"}]) + [LIBS="${LIBS} -latomic"]) _RESTORE_VAR([CPPFLAGS]) @@ -7286,10 +7286,7 @@ PY_STDLIB_MOD([_hashlib], [], [test "$ac_cv_working_openssl_hashlib" = yes], [$OPENSSL_INCLUDES], [$OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH $LIBCRYPTO_LIBS]) dnl test modules -PY_STDLIB_MOD([_testcapi], - [test "$TEST_MODULES" = yes], [] - dnl Modules/_testcapi/pyatomic.c uses header - [], [], [$LIBATOMIC]) +PY_STDLIB_MOD([_testcapi], [test "$TEST_MODULES" = yes]) PY_STDLIB_MOD([_testclinic], [test "$TEST_MODULES" = yes]) PY_STDLIB_MOD([_testclinic_limited], [test "$TEST_MODULES" = yes]) PY_STDLIB_MOD([_testinternalcapi], [test "$TEST_MODULES" = yes]) From 9df6712c122b621dc5a1053ff1eccf0debfb2148 Mon Sep 17 00:00:00 2001 From: Sam Gross Date: Tue, 19 Sep 2023 13:35:11 -0400 Subject: [PATCH 256/357] gh-108724: Fix _PySemaphore compile error on WASM (gh-109583) Some WASM platforms have POSIX semaphores, but not sem_timedwait. --- Include/internal/pycore_semaphore.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Include/internal/pycore_semaphore.h b/Include/internal/pycore_semaphore.h index c1df8333629066..2a4ecb7147acee 100644 --- a/Include/internal/pycore_semaphore.h +++ b/Include/internal/pycore_semaphore.h @@ -20,7 +20,8 @@ # error "Require native threads. See https://bugs.python.org/issue31370" #endif -#if defined(_POSIX_SEMAPHORES) && (_POSIX_SEMAPHORES+0) != -1 +#if (defined(_POSIX_SEMAPHORES) && (_POSIX_SEMAPHORES+0) != -1 && \ + defined(HAVE_SEM_TIMEDWAIT)) # define _Py_USE_SEMAPHORES # include #endif From 754519a9f8c2bb06d85ff9b3e9fe6f967ac46d5c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 19 Sep 2023 19:42:51 +0200 Subject: [PATCH 257/357] gh-109580: Skip test_perf_profiler on ASAN build (#109584) Skip test_perf_profiler if Python is built with ASAN, MSAN or UBSAN sanitizer. Python does crash randomly in this test on such build. --- Lib/test/test_perf_profiler.py | 6 +++++- .../Tests/2023-09-19-19-08-22.gh-issue-109580.G02Zam.rst | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-19-19-08-22.gh-issue-109580.G02Zam.rst diff --git a/Lib/test/test_perf_profiler.py b/Lib/test/test_perf_profiler.py index 5418f9f35485f8..fe8707a156e9dc 100644 --- a/Lib/test/test_perf_profiler.py +++ b/Lib/test/test_perf_profiler.py @@ -17,6 +17,11 @@ if not support.has_subprocess_support: raise unittest.SkipTest("test module requires subprocess") +if support.check_sanitizer(address=True, memory=True, ub=True): + # gh-109580: Skip the test because it does crash randomly if Python is + # built with ASAN. + raise unittest.SkipTest("test crash randomly on ASAN/MSAN/UBSAN build") + def supports_trampoline_profiling(): perf_trampoline = sysconfig.get_config_var("PY_HAVE_PERF_TRAMPOLINE") @@ -287,7 +292,6 @@ def run_perf(cwd, *args, **env_vars): @unittest.skipUnless(perf_command_works(), "perf command doesn't work") @unittest.skipUnless(is_unwinding_reliable(), "Unwinding is unreliable") -@support.skip_if_sanitizer(address=True, memory=True, ub=True) class TestPerfProfiler(unittest.TestCase): def setUp(self): super().setUp() diff --git a/Misc/NEWS.d/next/Tests/2023-09-19-19-08-22.gh-issue-109580.G02Zam.rst b/Misc/NEWS.d/next/Tests/2023-09-19-19-08-22.gh-issue-109580.G02Zam.rst new file mode 100644 index 00000000000000..b917cbf6fd0a05 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-19-19-08-22.gh-issue-109580.G02Zam.rst @@ -0,0 +1,3 @@ +Skip ``test_perf_profiler`` if Python is built with ASAN, MSAN or UBSAN +sanitizer. Python does crash randomly in this test on such build. Patch by +Victor Stinner. From fd7e08a6f35581e1189b9bf12feb51f7167a86c5 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 19 Sep 2023 15:01:34 -0600 Subject: [PATCH 258/357] gh-76785: Use Pending Calls When Releasing Cross-Interpreter Data (gh-109556) This fixes some crashes in the _xxinterpchannels module, due to a race between interpreters. --- Include/cpython/pystate.h | 1 + Include/internal/pycore_ceval.h | 2 +- Include/internal/pycore_ceval_state.h | 4 +- Modules/_xxinterpchannelsmodule.c | 30 ++++++--- Modules/_xxsubinterpretersmodule.c | 29 ++++----- Python/ceval_gil.c | 8 +-- Python/pystate.c | 91 +++++++++++++++++---------- 7 files changed, 98 insertions(+), 67 deletions(-) diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index e1a15cddd3d723..5e184d0ca0944b 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -309,6 +309,7 @@ PyAPI_FUNC(void) _PyCrossInterpreterData_Clear( PyAPI_FUNC(int) _PyObject_GetCrossInterpreterData(PyObject *, _PyCrossInterpreterData *); PyAPI_FUNC(PyObject *) _PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *); PyAPI_FUNC(int) _PyCrossInterpreterData_Release(_PyCrossInterpreterData *); +PyAPI_FUNC(int) _PyCrossInterpreterData_ReleaseAndRawFree(_PyCrossInterpreterData *); PyAPI_FUNC(int) _PyObject_CheckCrossInterpreterData(PyObject *); diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index e9535023cec46b..23d0fa399d7e6f 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -44,7 +44,7 @@ extern void _PyEval_SignalReceived(PyInterpreterState *interp); // Export for '_testinternalcapi' shared extension PyAPI_FUNC(int) _PyEval_AddPendingCall( PyInterpreterState *interp, - int (*func)(void *), + _Py_pending_call_func func, void *arg, int mainthreadonly); diff --git a/Include/internal/pycore_ceval_state.h b/Include/internal/pycore_ceval_state.h index 6e3d669dc646af..d0af5b542233e0 100644 --- a/Include/internal/pycore_ceval_state.h +++ b/Include/internal/pycore_ceval_state.h @@ -11,6 +11,8 @@ extern "C" { #include "pycore_gil.h" // struct _gil_runtime_state +typedef int (*_Py_pending_call_func)(void *); + struct _pending_calls { int busy; PyThread_type_lock lock; @@ -22,7 +24,7 @@ struct _pending_calls { int async_exc; #define NPENDINGCALLS 32 struct _pending_call { - int (*func)(void *); + _Py_pending_call_func func; void *arg; } calls[NPENDINGCALLS]; int first; diff --git a/Modules/_xxinterpchannelsmodule.c b/Modules/_xxinterpchannelsmodule.c index 60ac8ed1b38ff2..6096f88421a73a 100644 --- a/Modules/_xxinterpchannelsmodule.c +++ b/Modules/_xxinterpchannelsmodule.c @@ -160,14 +160,24 @@ add_new_type(PyObject *mod, PyType_Spec *spec, crossinterpdatafunc shared) return cls; } +#define XID_IGNORE_EXC 1 +#define XID_FREE 2 + static int -_release_xid_data(_PyCrossInterpreterData *data, int ignoreexc) +_release_xid_data(_PyCrossInterpreterData *data, int flags) { + int ignoreexc = flags & XID_IGNORE_EXC; PyObject *exc; if (ignoreexc) { exc = PyErr_GetRaisedException(); } - int res = _PyCrossInterpreterData_Release(data); + int res; + if (flags & XID_FREE) { + res = _PyCrossInterpreterData_ReleaseAndRawFree(data); + } + else { + res = _PyCrossInterpreterData_Release(data); + } if (res < 0) { /* The owning interpreter is already destroyed. */ if (ignoreexc) { @@ -175,6 +185,9 @@ _release_xid_data(_PyCrossInterpreterData *data, int ignoreexc) PyErr_Clear(); } } + if (flags & XID_FREE) { + /* Either way, we free the data. */ + } if (ignoreexc) { PyErr_SetRaisedException(exc); } @@ -366,9 +379,8 @@ static void _channelitem_clear(_channelitem *item) { if (item->data != NULL) { - (void)_release_xid_data(item->data, 1); // It was allocated in _channel_send(). - GLOBAL_FREE(item->data); + (void)_release_xid_data(item->data, XID_IGNORE_EXC & XID_FREE); item->data = NULL; } item->next = NULL; @@ -1439,14 +1451,12 @@ _channel_recv(_channels *channels, int64_t id, PyObject **res) PyObject *obj = _PyCrossInterpreterData_NewObject(data); if (obj == NULL) { assert(PyErr_Occurred()); - (void)_release_xid_data(data, 1); - // It was allocated in _channel_send(). - GLOBAL_FREE(data); + // It was allocated in _channel_send(), so we free it. + (void)_release_xid_data(data, XID_IGNORE_EXC | XID_FREE); return -1; } - int release_res = _release_xid_data(data, 0); - // It was allocated in _channel_send(). - GLOBAL_FREE(data); + // It was allocated in _channel_send(), so we free it. + int release_res = _release_xid_data(data, XID_FREE); if (release_res < 0) { // The source interpreter has been destroyed already. assert(PyErr_Occurred()); diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 2dd8d9a6f3eb7d..1ddf64909bf18a 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -58,24 +58,17 @@ add_new_exception(PyObject *mod, const char *name, PyObject *base) add_new_exception(MOD, MODULE_NAME "." Py_STRINGIFY(NAME), BASE) static int -_release_xid_data(_PyCrossInterpreterData *data, int ignoreexc) +_release_xid_data(_PyCrossInterpreterData *data) { - PyObject *exc; - if (ignoreexc) { - exc = PyErr_GetRaisedException(); - } + PyObject *exc = PyErr_GetRaisedException(); int res = _PyCrossInterpreterData_Release(data); if (res < 0) { /* The owning interpreter is already destroyed. */ _PyCrossInterpreterData_Clear(NULL, data); - if (ignoreexc) { - // XXX Emit a warning? - PyErr_Clear(); - } - } - if (ignoreexc) { - PyErr_SetRaisedException(exc); + // XXX Emit a warning? + PyErr_Clear(); } + PyErr_SetRaisedException(exc); return res; } @@ -145,7 +138,7 @@ _sharednsitem_clear(struct _sharednsitem *item) PyMem_RawFree((void *)item->name); item->name = NULL; } - (void)_release_xid_data(&item->data, 1); + (void)_release_xid_data(&item->data); } static int @@ -174,16 +167,16 @@ typedef struct _sharedns { static _sharedns * _sharedns_new(Py_ssize_t len) { - _sharedns *shared = PyMem_NEW(_sharedns, 1); + _sharedns *shared = PyMem_RawCalloc(sizeof(_sharedns), 1); if (shared == NULL) { PyErr_NoMemory(); return NULL; } shared->len = len; - shared->items = PyMem_NEW(struct _sharednsitem, len); + shared->items = PyMem_RawCalloc(sizeof(struct _sharednsitem), len); if (shared->items == NULL) { PyErr_NoMemory(); - PyMem_Free(shared); + PyMem_RawFree(shared); return NULL; } return shared; @@ -195,8 +188,8 @@ _sharedns_free(_sharedns *shared) for (Py_ssize_t i=0; i < shared->len; i++) { _sharednsitem_clear(&shared->items[i]); } - PyMem_Free(shared->items); - PyMem_Free(shared); + PyMem_RawFree(shared->items); + PyMem_RawFree(shared); } static _sharedns * diff --git a/Python/ceval_gil.c b/Python/ceval_gil.c index 3b7e6cb1bda3ff..ba16f5eb9bfe74 100644 --- a/Python/ceval_gil.c +++ b/Python/ceval_gil.c @@ -763,7 +763,7 @@ _PyEval_SignalReceived(PyInterpreterState *interp) /* Push one item onto the queue while holding the lock. */ static int _push_pending_call(struct _pending_calls *pending, - int (*func)(void *), void *arg) + _Py_pending_call_func func, void *arg) { int i = pending->last; int j = (i + 1) % NPENDINGCALLS; @@ -810,7 +810,7 @@ _pop_pending_call(struct _pending_calls *pending, int _PyEval_AddPendingCall(PyInterpreterState *interp, - int (*func)(void *), void *arg, + _Py_pending_call_func func, void *arg, int mainthreadonly) { assert(!mainthreadonly || _Py_IsMainInterpreter(interp)); @@ -834,7 +834,7 @@ _PyEval_AddPendingCall(PyInterpreterState *interp, } int -Py_AddPendingCall(int (*func)(void *), void *arg) +Py_AddPendingCall(_Py_pending_call_func func, void *arg) { /* Legacy users of this API will continue to target the main thread (of the main interpreter). */ @@ -878,7 +878,7 @@ _make_pending_calls(struct _pending_calls *pending) { /* perform a bounded number of calls, in case of recursion */ for (int i=0; ifree != NULL) { - data->free(data->data); + // _PyCrossInterpreterData only has two members that need to be + // cleaned up, if set: "data" must be freed and "obj" must be decref'ed. + // In both cases the original (owning) interpreter must be used, + // which is the caller's responsibility to ensure. + if (data->data != NULL) { + if (data->free != NULL) { + data->free(data->data); + } + data->data = NULL; } - data->data = NULL; Py_CLEAR(data->obj); } @@ -2457,40 +2463,32 @@ _PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *data) return data->new_object(data); } -typedef void (*releasefunc)(PyInterpreterState *, void *); - -static void -_call_in_interpreter(PyInterpreterState *interp, releasefunc func, void *arg) +static int +_release_xidata_pending(void *data) { - /* We would use Py_AddPendingCall() if it weren't specific to the - * main interpreter (see bpo-33608). In the meantime we take a - * naive approach. - */ - _PyRuntimeState *runtime = interp->runtime; - PyThreadState *save_tstate = NULL; - if (interp != current_fast_get(runtime)->interp) { - // XXX Using the "head" thread isn't strictly correct. - PyThreadState *tstate = PyInterpreterState_ThreadHead(interp); - // XXX Possible GILState issues? - save_tstate = _PyThreadState_Swap(runtime, tstate); - } - - // XXX Once the GIL is per-interpreter, this should be called with the - // calling interpreter's GIL released and the target interpreter's held. - func(interp, arg); + _xidata_clear((_PyCrossInterpreterData *)data); + return 0; +} - // Switch back. - if (save_tstate != NULL) { - _PyThreadState_Swap(runtime, save_tstate); - } +static int +_xidata_release_and_rawfree_pending(void *data) +{ + _xidata_clear((_PyCrossInterpreterData *)data); + PyMem_RawFree(data); + return 0; } -int -_PyCrossInterpreterData_Release(_PyCrossInterpreterData *data) +static int +_xidata_release(_PyCrossInterpreterData *data, int rawfree) { - if (data->free == NULL && data->obj == NULL) { + if ((data->data == NULL || data->free == NULL) && data->obj == NULL) { // Nothing to release! - data->data = NULL; + if (rawfree) { + PyMem_RawFree(data); + } + else { + data->data = NULL; + } return 0; } @@ -2501,15 +2499,42 @@ _PyCrossInterpreterData_Release(_PyCrossInterpreterData *data) // This function shouldn't have been called. // XXX Someone leaked some memory... assert(PyErr_Occurred()); + if (rawfree) { + PyMem_RawFree(data); + } return -1; } // "Release" the data and/or the object. - _call_in_interpreter(interp, - (releasefunc)_PyCrossInterpreterData_Clear, data); + if (interp == current_fast_get(interp->runtime)->interp) { + _xidata_clear(data); + if (rawfree) { + PyMem_RawFree(data); + } + } + else { + _Py_pending_call_func func = _release_xidata_pending; + if (rawfree) { + func = _xidata_release_and_rawfree_pending; + } + // XXX Emit a warning if this fails? + _PyEval_AddPendingCall(interp, func, data, 0); + } return 0; } +int +_PyCrossInterpreterData_Release(_PyCrossInterpreterData *data) +{ + return _xidata_release(data, 0); +} + +int +_PyCrossInterpreterData_ReleaseAndRawFree(_PyCrossInterpreterData *data) +{ + return _xidata_release(data, 1); +} + /* registry of {type -> crossinterpdatafunc} */ /* For now we use a global registry of shareable classes. An From ddf2e953c27d529b7e321c972ede2afce5dfb0b0 Mon Sep 17 00:00:00 2001 From: Ronan Pigott Date: Tue, 19 Sep 2023 16:18:23 -0700 Subject: [PATCH 259/357] gh-109033: Return filename with os.utime errors (#109034) The filename was previously intentionally omitted from exception because "it might confuse the user". Uncaught exceptions are not generally a replacement for user-facing error messages, so obscuring this information only has the effect of making the programmer's life more difficult. --- Lib/test/test_os.py | 7 +++++++ .../2023-09-06-14-47-28.gh-issue-109033.piUzDx.rst | 2 ++ Modules/posixmodule.c | 9 ++------- 3 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-06-14-47-28.gh-issue-109033.piUzDx.rst diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 34cd27b143f231..66aece2c4b3eb9 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -913,6 +913,13 @@ def set_time(filename): os.utime(self.fname, None) self._test_utime_current(set_time) + def test_utime_nonexistent(self): + now = time.time() + filename = 'nonexistent' + with self.assertRaises(FileNotFoundError) as cm: + os.utime(filename, (now, now)) + self.assertEqual(cm.exception.filename, filename) + def get_file_system(self, path): if sys.platform == 'win32': root = os.path.splitdrive(os.path.abspath(path))[0] + '\\' diff --git a/Misc/NEWS.d/next/Library/2023-09-06-14-47-28.gh-issue-109033.piUzDx.rst b/Misc/NEWS.d/next/Library/2023-09-06-14-47-28.gh-issue-109033.piUzDx.rst new file mode 100644 index 00000000000000..15ec0b437d4339 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-06-14-47-28.gh-issue-109033.piUzDx.rst @@ -0,0 +1,2 @@ +Exceptions raised by os.utime builtin function now include the related +filename diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index c4340397fbe577..2c89a68fa57f2e 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6307,11 +6307,7 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, _Py_time_t_to_FILE_TIME(utime.mtime_s, utime.mtime_ns, &mtime); } if (!SetFileTime(hFile, NULL, &atime, &mtime)) { - /* Avoid putting the file name into the error here, - as that may confuse the user into believing that - something is wrong with the file, when it also - could be the time stamp that gives a problem. */ - PyErr_SetFromWindowsErr(0); + path_error(path); CloseHandle(hFile); return NULL; } @@ -6351,8 +6347,7 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, #endif if (result < 0) { - /* see previous comment about not putting filename in error here */ - posix_error(); + path_error(path); return NULL; } From 5a740cd06ec1191767edcc6d3a7d5eca7873cb7b Mon Sep 17 00:00:00 2001 From: Mateusz Nowak Date: Wed, 20 Sep 2023 03:20:54 +0200 Subject: [PATCH 260/357] gh-109109: Expose retrieving certificate chains in SSL module (#109113) Adds APIs to get the TLS certificate chains, verified or full unverified, from SSLSocket and SSLObject. Co-authored-by: Gregory P. Smith [Google LLC] --- Doc/library/ssl.rst | 29 +++++++++++++--- Lib/ssl.py | 33 +++++++++++++++++++ ...-09-19-17-56-24.gh-issue-109109.WJvvX2.rst | 5 +++ 3 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-19-17-56-24.gh-issue-109109.WJvvX2.rst diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index 5d6bc829d68878..92cf3de2a7b4cf 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -43,8 +43,10 @@ This module provides a class, :class:`ssl.SSLSocket`, which is derived from the :class:`socket.socket` type, and provides a socket-like wrapper that also encrypts and decrypts the data going over the socket with SSL. It supports additional methods such as :meth:`getpeercert`, which retrieves the -certificate of the other side of the connection, and :meth:`cipher`, which -retrieves the cipher being used for the secure connection. +certificate of the other side of the connection, :meth:`cipher`, which +retrieves the cipher being used for the secure connection or +:meth:`get_verified_chain`, :meth:`get_unverified_chain` which retrieves +certificate chain. For more sophisticated applications, the :class:`ssl.SSLContext` class helps manage settings and certificates, which can then be inherited @@ -1210,6 +1212,22 @@ SSL sockets also have the following additional methods and attributes: .. versionchanged:: 3.9 IPv6 address strings no longer have a trailing new line. +.. method:: SSLSocket.get_verified_chain() + + Returns verified certificate chain provided by the other + end of the SSL channel as a list of DER-encoded bytes. + If certificate verification was disabled method acts the same as + :meth:`~SSLSocket.get_unverified_chain`. + + .. versionadded:: 3.13 + +.. method:: SSLSocket.get_unverified_chain() + + Returns raw certificate chain provided by the other + end of the SSL channel as a list of DER-encoded bytes. + + .. versionadded:: 3.13 + .. method:: SSLSocket.cipher() Returns a three-value tuple containing the name of the cipher being used, the @@ -1656,8 +1674,9 @@ to speed up repeated connections from the same clients. Due to the early negotiation phase of the TLS connection, only limited methods and attributes are usable like :meth:`SSLSocket.selected_alpn_protocol` and :attr:`SSLSocket.context`. - The :meth:`SSLSocket.getpeercert`, - :meth:`SSLSocket.cipher` and :meth:`SSLSocket.compression` methods require that + The :meth:`SSLSocket.getpeercert`, :meth:`SSLSocket.get_verified_chain`, + :meth:`SSLSocket.get_unverified_chain` :meth:`SSLSocket.cipher` + and :meth:`SSLSocket.compression` methods require that the TLS connection has progressed beyond the TLS Client Hello and therefore will not return meaningful values nor can they be called safely. @@ -2414,6 +2433,8 @@ provided. - :meth:`~SSLSocket.read` - :meth:`~SSLSocket.write` - :meth:`~SSLSocket.getpeercert` + - :meth:`~SSLSocket.get_verified_chain` + - :meth:`~SSLSocket.get_unverified_chain` - :meth:`~SSLSocket.selected_alpn_protocol` - :meth:`~SSLSocket.selected_npn_protocol` - :meth:`~SSLSocket.cipher` diff --git a/Lib/ssl.py b/Lib/ssl.py index c4c5a4ca894ee5..62e55857141dfc 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -876,6 +876,31 @@ def getpeercert(self, binary_form=False): """ return self._sslobj.getpeercert(binary_form) + def get_verified_chain(self): + """Returns verified certificate chain provided by the other + end of the SSL channel as a list of DER-encoded bytes. + + If certificate verification was disabled method acts the same as + ``SSLSocket.get_unverified_chain``. + """ + chain = self._sslobj.get_verified_chain() + + if chain is None: + return [] + + return [cert.public_bytes(_ssl.ENCODING_DER) for cert in chain] + + def get_unverified_chain(self): + """Returns raw certificate chain provided by the other + end of the SSL channel as a list of DER-encoded bytes. + """ + chain = self._sslobj.get_unverified_chain() + + if chain is None: + return [] + + return [cert.public_bytes(_ssl.ENCODING_DER) for cert in chain] + def selected_npn_protocol(self): """Return the currently selected NPN protocol as a string, or ``None`` if a next protocol was not negotiated or if NPN is not supported by one @@ -1129,6 +1154,14 @@ def getpeercert(self, binary_form=False): self._check_connected() return self._sslobj.getpeercert(binary_form) + @_sslcopydoc + def get_verified_chain(self): + return self._sslobj.get_verified_chain() + + @_sslcopydoc + def get_unverified_chain(self): + return self._sslobj.get_unverified_chain() + @_sslcopydoc def selected_npn_protocol(self): self._checkClosed() diff --git a/Misc/NEWS.d/next/Library/2023-09-19-17-56-24.gh-issue-109109.WJvvX2.rst b/Misc/NEWS.d/next/Library/2023-09-19-17-56-24.gh-issue-109109.WJvvX2.rst new file mode 100644 index 00000000000000..e741e60ff41a9b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-19-17-56-24.gh-issue-109109.WJvvX2.rst @@ -0,0 +1,5 @@ +You can now get the raw TLS certificate chains from TLS connections via +:meth:`ssl.SSLSocket.get_verified_chain` and +:meth:`ssl.SSLSocket.get_unverified_chain` methods. + +Contributed by Mateusz Nowak. From 3e3a7da590e1c3e5f03802e538f26c5204889c82 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 20 Sep 2023 03:40:32 +0200 Subject: [PATCH 261/357] gh-90108: Disable LTO on _freeze_module and _testembed (#109581) LTO optimization is nice to make Python faster, but _freeze_module and _testembed performance is not important. Using LTO to build these two programs make a whole Python build way slower, especially combined with a sanitizer (like ASAN). --- Makefile.pre.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index c94ffcb5f15402..363be687d5a432 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1062,7 +1062,7 @@ regen-re: $(BUILDPYTHON) $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/build/generate_re_casefix.py $(srcdir)/Lib/re/_casefix.py Programs/_testembed: Programs/_testembed.o $(LINK_PYTHON_DEPS) - $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(LINK_PYTHON_OBJS) $(LIBS) $(MODLIBS) $(SYSLIBS) + $(LINKCC) $(PY_LDFLAGS_NOLTO) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(LINK_PYTHON_OBJS) $(LIBS) $(MODLIBS) $(SYSLIBS) ############################################################################ # "Bootstrap Python" used to run deepfreeze.py @@ -1163,7 +1163,7 @@ Programs/_freeze_module.o: Programs/_freeze_module.c Makefile Modules/getpath_noop.o: $(srcdir)/Modules/getpath_noop.c Makefile Programs/_freeze_module: Programs/_freeze_module.o Modules/getpath_noop.o $(LIBRARY_OBJS_OMIT_FROZEN) - $(LINKCC) $(PY_CORE_LDFLAGS) -o $@ Programs/_freeze_module.o Modules/getpath_noop.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LIBS) $(MODLIBS) $(SYSLIBS) + $(LINKCC) $(PY_LDFLAGS_NOLTO) -o $@ Programs/_freeze_module.o Modules/getpath_noop.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LIBS) $(MODLIBS) $(SYSLIBS) # We manually freeze getpath.py rather than through freeze_modules Python/frozen_modules/getpath.h: Modules/getpath.py $(FREEZE_MODULE_BOOTSTRAP_DEPS) From 81cd1bd713624c3d26b647f3d28f2fd905887a0d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 20 Sep 2023 03:58:34 +0200 Subject: [PATCH 262/357] gh-103053: Skip test_freeze_simple_script() on PGO build (#109591) Skip test_freeze_simple_script() of test_tools.test_freeze if Python is built with "./configure --enable-optimizations", which means with Profile Guided Optimization (PGO): it just makes the test too slow. The freeze tool is tested by many other CIs with other (faster) compiler flags. test.pythoninfo now gets also get_build_info() of test.libregrtests.utils. --- Lib/test/libregrtest/utils.py | 12 ++---------- Lib/test/pythoninfo.py | 11 +++++++++++ Lib/test/support/__init__.py | 15 +++++++++++++++ Lib/test/test_tools/test_freeze.py | 4 ++++ ...2023-09-20-02-32-17.gh-issue-103053.AoUJuK.rst | 4 ++++ 5 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-20-02-32-17.gh-issue-103053.AoUJuK.rst diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 7675fbe16a2141..6af949cea9c926 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -310,16 +310,8 @@ def get_build_info(): elif '-flto' in ldflags_nodist: optimizations.append('LTO') - # --enable-optimizations - pgo_options = ( - # GCC - '-fprofile-use', - # clang: -fprofile-instr-use=code.profclangd - '-fprofile-instr-use', - # ICC - "-prof-use", - ) - if any(option in cflags_nodist for option in pgo_options): + if support.check_cflags_pgo(): + # PGO (--enable-optimizations) optimizations.append('PGO') if optimizations: build.append('+'.join(optimizations)) diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index f16b7986995c38..c372efaedd313b 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -956,6 +956,16 @@ def collect_tempfile(info_add): info_add('tempfile.gettempdir', tempfile.gettempdir()) + +def collect_libregrtest_utils(info_add): + try: + from test.libregrtest import utils + except ImportError: + return + + info_add('libregrtests.build_info', ' '.join(utils.get_build_info())) + + def collect_info(info): error = False info_add = info.add @@ -995,6 +1005,7 @@ def collect_info(info): collect_tkinter, collect_windows, collect_zlib, + collect_libregrtest_utils, # Collecting from tests should be last as they have side effects. collect_test_socket, diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 0d9efe10c6504c..8a4555ce16fbb6 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -773,6 +773,21 @@ def python_is_optimized(): return final_opt not in ('', '-O0', '-Og') +def check_cflags_pgo(): + # Check if Python was built with ./configure --enable-optimizations: + # with Profile Guided Optimization (PGO). + cflags_nodist = sysconfig.get_config_var('PY_CFLAGS_NODIST') or '' + pgo_options = ( + # GCC + '-fprofile-use', + # clang: -fprofile-instr-use=code.profclangd + '-fprofile-instr-use', + # ICC + "-prof-use", + ) + return any(option in cflags_nodist for option in pgo_options) + + _header = 'nP' _align = '0n' _vheader = _header + 'n' diff --git a/Lib/test/test_tools/test_freeze.py b/Lib/test/test_tools/test_freeze.py index 922e74b441457a..671ec2961e7f8f 100644 --- a/Lib/test/test_tools/test_freeze.py +++ b/Lib/test/test_tools/test_freeze.py @@ -15,6 +15,10 @@ @support.requires_zlib() @unittest.skipIf(sys.platform.startswith('win'), 'not supported on Windows') @support.skip_if_buildbot('not all buildbots have enough space') +# gh-103053: Skip test if Python is built with Profile Guided Optimization +# (PGO), since the test is just too slow in this case. +@unittest.skipIf(support.check_cflags_pgo(), + 'test is too slow with PGO') class TestFreeze(unittest.TestCase): @support.requires_resource('cpu') # Building Python is slow diff --git a/Misc/NEWS.d/next/Tests/2023-09-20-02-32-17.gh-issue-103053.AoUJuK.rst b/Misc/NEWS.d/next/Tests/2023-09-20-02-32-17.gh-issue-103053.AoUJuK.rst new file mode 100644 index 00000000000000..6d67bf237bdbb2 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-20-02-32-17.gh-issue-103053.AoUJuK.rst @@ -0,0 +1,4 @@ +Skip test_freeze_simple_script() of test_tools.test_freeze if Python is built +with ``./configure --enable-optimizations``, which means with Profile Guided +Optimization (PGO): it just makes the test too slow. The freeze tool is tested +by many other CIs with other (faster) compiler flags. Patch by Victor Stinner. From 1293fcc3c6b67b7e8d0081863ec6387e162341eb Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Tue, 19 Sep 2023 20:15:52 -0700 Subject: [PATCH 263/357] gh-109543: Remove unnecessary hasattr check (#109544) Also added a new test case covering the scenario I thought this might be about. --- Lib/test/test_typing.py | 11 +++++++++++ Lib/typing.py | 3 +-- .../2023-09-18-07-43-22.gh-issue-109543.1tOGoV.rst | 2 ++ 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-18-07-43-22.gh-issue-109543.1tOGoV.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 69f5ff913c57bb..4d1c0f2c724b86 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -7586,6 +7586,17 @@ def test_total(self): self.assertEqual(Options.__required_keys__, frozenset()) self.assertEqual(Options.__optional_keys__, {'log_level', 'log_path'}) + def test_total_inherits_non_total(self): + class TD1(TypedDict, total=False): + a: int + + self.assertIs(TD1.__total__, False) + + class TD2(TD1): + b: str + + self.assertIs(TD2.__total__, True) + def test_optional_keys(self): class Point2Dor3D(Point2D, total=False): z: int diff --git a/Lib/typing.py b/Lib/typing.py index 8655b756a9fd13..183d5b29a23362 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -2886,8 +2886,7 @@ def __new__(cls, name, bases, ns, total=True): tp_dict.__annotations__ = annotations tp_dict.__required_keys__ = frozenset(required_keys) tp_dict.__optional_keys__ = frozenset(optional_keys) - if not hasattr(tp_dict, '__total__'): - tp_dict.__total__ = total + tp_dict.__total__ = total return tp_dict __call__ = dict # static method diff --git a/Misc/NEWS.d/next/Library/2023-09-18-07-43-22.gh-issue-109543.1tOGoV.rst b/Misc/NEWS.d/next/Library/2023-09-18-07-43-22.gh-issue-109543.1tOGoV.rst new file mode 100644 index 00000000000000..e790f7750c332a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-18-07-43-22.gh-issue-109543.1tOGoV.rst @@ -0,0 +1,2 @@ +Remove unnecessary :func:`hasattr` check during :data:`typing.TypedDict` +creation. From def828995a35a289c9f03500903b5917df93465f Mon Sep 17 00:00:00 2001 From: James Gerity Date: Wed, 20 Sep 2023 01:07:47 -0400 Subject: [PATCH 264/357] fixes gh-109559: Update `unicodedata` for Unicode 15.1.0 (GH-109560) --------- Co-authored-by: Benjamin Peterson --- Doc/library/stdtypes.rst | 8 +- Doc/library/unicodedata.rst | 8 +- Doc/reference/lexical_analysis.rst | 8 +- ...-09-19-01-22-43.gh-issue-109559.ijaycU.rst | 1 + Modules/unicodedata.c | 1 + Modules/unicodedata_db.h | 2630 +- Modules/unicodename_db.h | 32946 ++++++++-------- Objects/unicodetype_db.h | 1963 +- Tools/unicode/makeunicodedata.py | 29 +- 9 files changed, 19006 insertions(+), 18588 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-19-01-22-43.gh-issue-109559.ijaycU.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 652ed147af8422..a351559a84f1ce 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1641,7 +1641,7 @@ expression support in the :mod:`re` module). The casefolding algorithm is `described in section 3.13 'Default Case Folding' of the Unicode Standard - `__. + `__. .. versionadded:: 3.3 @@ -1805,7 +1805,7 @@ expression support in the :mod:`re` module). property being one of "Lm", "Lt", "Lu", "Ll", or "Lo". Note that this is different from the `Alphabetic property defined in the section 4.10 'Letters, Alphabetic, and Ideographic' of the Unicode Standard - `_. + `_. .. method:: str.isascii() @@ -1941,7 +1941,7 @@ expression support in the :mod:`re` module). The lowercasing algorithm used is `described in section 3.13 'Default Case Folding' of the Unicode Standard - `__. + `__. .. method:: str.lstrip([chars]) @@ -2290,7 +2290,7 @@ expression support in the :mod:`re` module). The uppercasing algorithm used is `described in section 3.13 'Default Case Folding' of the Unicode Standard - `__. + `__. .. method:: str.zfill(width) diff --git a/Doc/library/unicodedata.rst b/Doc/library/unicodedata.rst index 3a094f9c64d4a0..7db47d48022a0e 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 15.0.0 -`_. +this database is compiled from the `UCD version 15.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 -.. [#] https://www.unicode.org/Public/15.0.0/ucd/NameAliases.txt +.. [#] https://www.unicode.org/Public/15.1.0/ucd/NameAliases.txt -.. [#] https://www.unicode.org/Public/15.0.0/ucd/NamedSequences.txt +.. [#] https://www.unicode.org/Public/15.1.0/ucd/NamedSequences.txt diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index 83cd4402a36cf6..41f12fd57fbd57 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -315,7 +315,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 @@ -323,8 +323,8 @@ All identifiers are converted into the normal form NFKC while parsing; compariso of identifiers is based on NFKC. A non-normative HTML file listing all valid identifier characters for Unicode -15.0.0 can be found at -https://www.unicode.org/Public/15.0.0/ucd/DerivedCoreProperties.txt +15.1.0 can be found at +https://www.unicode.org/Public/15.1.0/ucd/DerivedCoreProperties.txt .. _keywords: @@ -1045,4 +1045,4 @@ occurrence outside string literals and comments is an unconditional error: .. rubric:: Footnotes -.. [#] https://www.unicode.org/Public/15.0.0/ucd/NameAliases.txt +.. [#] https://www.unicode.org/Public/15.1.0/ucd/NameAliases.txt diff --git a/Misc/NEWS.d/next/Library/2023-09-19-01-22-43.gh-issue-109559.ijaycU.rst b/Misc/NEWS.d/next/Library/2023-09-19-01-22-43.gh-issue-109559.ijaycU.rst new file mode 100644 index 00000000000000..2c25a7b302dd02 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-19-01-22-43.gh-issue-109559.ijaycU.rst @@ -0,0 +1 @@ +Update :mod:`unicodedata` database to Unicode 15.1.0. diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index c1e22f3868931f..875a9c18c4e340 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1035,6 +1035,7 @@ is_unified_ideograph(Py_UCS4 code) (0x2B740 <= code && code <= 0x2B81D) || /* CJK Ideograph Extension D */ (0x2B820 <= code && code <= 0x2CEA1) || /* CJK Ideograph Extension E */ (0x2CEB0 <= code && code <= 0x2EBE0) || /* CJK Ideograph Extension F */ + (0x2EBF0 <= code && code <= 0x2EE5D) || /* CJK Ideograph Extension I */ (0x30000 <= code && code <= 0x3134A) || /* CJK Ideograph Extension G */ (0x31350 <= code && code <= 0x323AF); /* CJK Ideograph Extension H */ } diff --git a/Modules/unicodedata_db.h b/Modules/unicodedata_db.h index 4c4b2f589c50bf..ed4b0eea9a6c59 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 "15.0.0" +#define UNIDATA_VERSION "15.1.0" /* a list of unique database records */ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { {0, 0, 0, 0, 0, 0}, @@ -810,46 +810,46 @@ static const unsigned short index1[] = { 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 271, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 121, 121, 121, 121, 273, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 274, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 271, 101, 101, 101, 101, 272, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 121, 121, 121, 121, 274, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 275, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 275, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 276, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 276, 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, 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, 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, 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, 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, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 274, 137, 137, 137, 137, + 101, 101, 101, 277, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 275, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, @@ -1215,7 +1215,7 @@ static const unsigned short index1[] = { 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 277, 137, 278, 279, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 278, 137, 279, 280, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, @@ -1288,7 +1288,7 @@ static const unsigned short index1[] = { 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 280, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 281, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, @@ -1325,7 +1325,7 @@ static const unsigned short index1[] = { 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 280, + 120, 281, }; static const unsigned short index2[] = { @@ -2016,58 +2016,57 @@ static const unsigned short index2[] = { 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 0, 0, 0, 0, 252, 253, 253, 253, 243, 254, 172, 255, 256, 257, 256, - 257, 256, 257, 256, 257, 256, 257, 243, 243, 256, 257, 256, 257, 256, - 257, 256, 257, 258, 259, 260, 260, 243, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 261, 262, 263, 264, 265, 265, 258, 254, 254, 254, 254, - 254, 251, 243, 266, 266, 266, 254, 172, 253, 243, 26, 0, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 267, 172, 267, 172, 267, 172, + 243, 243, 243, 243, 243, 252, 253, 253, 253, 243, 254, 172, 255, 256, + 257, 256, 257, 256, 257, 256, 257, 256, 257, 243, 243, 256, 257, 256, + 257, 256, 257, 256, 257, 258, 259, 260, 260, 243, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 261, 262, 263, 264, 265, 265, 258, 254, 254, + 254, 254, 254, 251, 243, 266, 266, 266, 254, 172, 253, 243, 26, 0, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 267, 172, 267, 172, 267, 172, 267, 172, 267, 172, 267, 172, 267, 172, 267, 172, 267, 172, - 267, 172, 267, 172, 172, 267, 172, 267, 172, 267, 172, 172, 172, 172, - 172, 172, 267, 267, 172, 267, 267, 172, 267, 267, 172, 267, 267, 172, - 267, 267, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 267, 172, 172, 0, 0, - 268, 268, 269, 269, 254, 270, 271, 258, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 267, 172, 267, 172, 267, 172, 267, 172, 267, + 267, 172, 267, 172, 267, 172, 172, 267, 172, 267, 172, 267, 172, 172, + 172, 172, 172, 172, 267, 267, 172, 267, 267, 172, 267, 267, 172, 267, + 267, 172, 267, 267, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 267, 172, + 172, 0, 0, 268, 268, 269, 269, 254, 270, 271, 258, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 267, 172, 267, 172, 267, 172, 267, 172, 267, 172, 267, 172, 267, 172, 267, 172, 267, 172, 267, 172, 267, - 172, 172, 267, 172, 267, 172, 267, 172, 172, 172, 172, 172, 172, 267, - 267, 172, 267, 267, 172, 267, 267, 172, 267, 267, 172, 267, 267, 172, + 172, 267, 172, 172, 267, 172, 267, 172, 267, 172, 172, 172, 172, 172, + 172, 267, 267, 172, 267, 267, 172, 267, 267, 172, 267, 267, 172, 267, + 267, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 267, 172, 172, 267, 267, + 267, 267, 253, 254, 254, 270, 271, 0, 0, 0, 0, 0, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 267, 172, 172, 267, 267, 267, 267, - 253, 254, 254, 270, 271, 0, 0, 0, 0, 0, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 0, 271, 271, 271, 271, 271, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 0, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, - 271, 271, 271, 271, 271, 0, 272, 272, 273, 273, 273, 273, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 172, 172, 172, 172, 172, 172, 172, + 271, 271, 271, 271, 271, 271, 271, 0, 272, 272, 273, 273, 273, 273, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 243, 243, 243, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 243, 243, 243, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 172, + 243, 243, 243, 243, 243, 243, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 251, 251, 0, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 251, 251, 0, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 275, 275, 275, 275, 275, 275, 275, 275, 251, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 251, 251, 251, - 272, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 274, 274, 274, + 274, 274, 274, 275, 275, 275, 275, 275, 275, 275, 275, 251, 276, 276, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 251, + 251, 251, 272, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 251, 251, 251, 251, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 276, 276, 276, 276, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 251, 251, 251, 251, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, @@ -2078,17 +2077,18 @@ static const unsigned short index2[] = { 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 251, 251, 251, 251, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 251, 251, + 251, 251, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 251, 251, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 251, 251, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 251, 172, 172, 172, 172, 172, 172, 172, + 274, 274, 274, 274, 274, 274, 274, 274, 251, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, @@ -2102,12 +2102,12 @@ static const unsigned short index2[] = { 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 172, 172, 172, 172, 172, 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, 172, 172, 172, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 254, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 254, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, @@ -2115,12 +2115,12 @@ static const unsigned short index2[] = { 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 0, 0, 0, 243, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 0, 0, 0, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 53, 53, 53, 53, 53, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 138, 138, 138, 48, 48, 48, @@ -3339,6 +3339,15 @@ static const unsigned short index2[] = { 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, @@ -3350,9 +3359,9 @@ static const unsigned short index2[] = { 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, - 281, 281, 281, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 281, 281, 281, 281, 281, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, - 280, 280, 280, 280, 280, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 280, 280, 280, 280, 280, 280, 280, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, @@ -3368,33 +3377,33 @@ static const unsigned short index2[] = { 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, - 281, 281, 281, 281, 281, 0, 0, 172, 172, 172, 172, 172, 172, 172, 172, + 281, 281, 281, 281, 281, 281, 281, 0, 0, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 281, 281, 281, - 281, 281, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 281, + 281, 281, 281, 281, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, - 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, - 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 0, 177, 0, 0, 0, 0, 0, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 0, 0, 0, 0, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, - 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 71, 71, 71, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, @@ -3408,7 +3417,7 @@ static const unsigned short index2[] = { 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 279, 279, + 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, @@ -3417,7 +3426,7 @@ static const unsigned short index2[] = { 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, - 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 0, 0, + 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 0, 0, }; /* decomposition data */ @@ -6027,385 +6036,199 @@ static const change_record change_records_3_2_0[] = { { 9, 255, 255, 255, 255, 0 }, { 255, 255, 255, 1, 255, 0 }, { 255, 20, 255, 255, 255, 0 }, - { 255, 255, 255, 255, 255, 1e+16 }, + { 255, 255, 255, 255, 255, 1000000000000.0 }, { 255, 255, 255, 255, 255, 1e+20 }, { 255, 19, 255, 255, 255, -1 }, { 1, 255, 255, 0, 255, 0 }, }; static const unsigned char changes_3_2_0_index[] = { - 0, 1, 2, 2, 3, 4, 5, 6, 2, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 2, 2, 2, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 52, 2, 53, 2, 2, 54, 55, 56, 57, 58, 2, 59, 60, 61, 62, 2, 63, 64, - 65, 66, 67, 68, 68, 2, 69, 2, 2, 70, 71, 52, 72, 73, 74, 75, 2, 2, 2, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 2, 2, 2, 2, 2, 2, 86, 2, 2, 2, 2, 2, - 87, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 88, 2, 89, 2, 2, 2, 2, 2, 2, 2, 2, - 90, 91, 2, 2, 2, 2, 2, 2, 2, 92, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 93, - 94, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 95, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 96, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 97, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 98, 99, 2, 2, 2, 2, 2, 2, 2, 2, 100, 52, - 52, 101, 102, 52, 103, 104, 105, 106, 107, 108, 109, 110, 111, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 112, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 113, 114, 115, 116, 117, 118, 2, 2, 119, 120, 121, - 2, 122, 123, 124, 125, 126, 127, 2, 128, 129, 130, 131, 132, 133, 134, - 52, 52, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 2, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 2, 159, 160, 2, - 161, 162, 163, 164, 2, 165, 166, 167, 168, 169, 170, 171, 2, 172, 173, - 174, 175, 2, 176, 177, 178, 52, 52, 52, 52, 52, 52, 52, 179, 180, 52, - 181, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 182, 52, - 52, 52, 52, 52, 52, 52, 52, 183, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 52, 52, 52, 52, - 184, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 52, 52, 52, - 52, 185, 186, 187, 188, 2, 2, 2, 2, 189, 190, 191, 192, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 102, 52, 52, 52, 52, 52, 52, 52, 52, 52, 183, - 193, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 194, 52, - 52, 195, 52, 52, 196, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 197, 198, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 199, 181, 2, 2, 200, 201, - 202, 203, 204, 2, 2, 205, 2, 2, 2, 206, 207, 208, 52, 52, 52, 52, 52, - 209, 2, 2, 2, 2, 2, 2, 2, 2, 210, 2, 211, 212, 213, 2, 2, 214, 2, 2, 2, - 215, 2, 2, 2, 2, 2, 216, 52, 217, 218, 2, 2, 2, 2, 2, 219, 220, 221, 2, - 222, 223, 2, 2, 224, 225, 52, 226, 227, 2, 52, 52, 52, 52, 52, 52, 52, - 228, 229, 230, 231, 232, 52, 52, 233, 234, 52, 235, 2, 2, 2, 2, 2, 2, 2, - 2, 236, 237, 97, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 86, 238, 2, - 239, 240, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 241, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 242, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 243, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 244, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 245, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 246, - 52, 247, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 248, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 249, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 241, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 250, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 251, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 52, 252, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 1, 21, 22, 23, 24, 25, 26, 27, 28, 29, 1, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 1, 1, 1, 50, 1, 1, 51, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 52, 53, 54, 55, 56, 1, + 57, 1, 1, 1, 58, 1, 1, 1, 1, 1, 1, 59, 1, 1, 1, 60, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 61, 1, 55, 1, 1, 1, 1, 1, 1, 62, 1, 1, 63, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 64, 1, 1, 1, 1, 1, 65, 1, 66, 1, 67, 1, + 1, 1, 1, 1, 1, 1, 1, 68, 69, 1, 1, 1, 70, 28, 71, 72, 73, 74, 75, 76, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 77, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 78, 79, 80, 1, 81, 82, 83, 84, 85, 86, 87, 88, 89, 28, 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, 28, 28, 28, 115, 116, 117, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 118, 28, 28, 28, 28, 119, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 28, 28, 120, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 28, 121, + 122, 1, 1, 123, 124, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 125, 28, 28, 28, 28, 126, 127, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 128, 28, 129, 130, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 131, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 132, 1, 133, + 134, 135, 136, 1, 137, 138, 28, 28, 139, 1, 1, 1, 1, 140, 141, 142, 143, + 1, 144, 1, 1, 145, 146, 147, 1, 1, 148, 149, 150, 1, 151, 152, 153, 28, + 28, 28, 154, 155, 156, 28, 157, 158, 1, 1, 1, 1, 159, 67, 1, 1, 1, 1, 1, + 1, 1, 160, 161, 162, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 163, 1, 1, 1, 1, 1, 164, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 165, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 166, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 167, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 168, 169, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 170, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 171, 28, 28, 43, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 163, 1, 1, 1, 1, 1, 1, 1, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 172, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 173, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 174, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static const unsigned char changes_3_2_0_data[] = { @@ -6426,153 +6249,169 @@ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 10, 0, 9, 9, 0, 0, 0, 9, 9, - 9, 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, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 4, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 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, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 10, 0, 9, 9, 0, 0, 0, 9, 9, 9, 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, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 0, 0, 0, 0, 9, 9, 9, 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, 9, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, - 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, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 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, 9, 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, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 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, 14, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 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, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 0, 0, 0, 0, 9, 9, 9, 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, 9, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 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, 9, 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, 9, 9, 9, 9, 9, 9, + 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 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, 14, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, + 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 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, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 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, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, - 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 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, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 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, 15, 16, 17, 18, 19, 0, 0, 9, - 9, 9, 9, 0, 0, 9, 0, 9, 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, 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, 15, 16, 17, 18, 19, 0, 0, 9, 9, 9, 9, 0, 0, 9, 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, 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, 9, 9, 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, 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, 9, 9, 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, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 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, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 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, 9, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 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, 9, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 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, 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, 9, 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, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 0, 0, 0, 9, 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, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 9, 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, 9, 0, 0, 0, 0, 0, 0, 0, - 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, 9, 9, 9, 0, 0, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, + 0, 0, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 0, 20, 0, 0, 0, 0, 0, 0, 20, 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, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 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, 9, 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, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 0, 20, 0, 0, 0, 0, 0, 0, 20, 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, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 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, 9, 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, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 0, 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, - 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, 9, 0, 0, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 9, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 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, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 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, 9, 0, 9, 9, 9, - 9, 9, 9, 9, 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, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 0, 0, 0, 0, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 9, 0, 0, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 9, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, + 0, 0, 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, 9, 0, 9, 9, + 9, 9, 9, 9, 9, 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, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 0, 0, 0, 0, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 0, 0, 0, 0, 0, 9, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 9, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 9, 9, 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, @@ -6618,82 +6457,98 @@ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 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, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, - 9, 9, 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, 9, 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, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 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, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 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, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 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, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 33, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 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, + 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, 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, 34, 34, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, @@ -6726,74 +6581,97 @@ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 11, 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, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 11, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 51, 51, 51, 51, 51, 51, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 0, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 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, 51, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 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, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 48, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 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, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 9, 0, 0, 0, 0, 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, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 0, 0, + 0, 0, 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, 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, 9, 0, 9, 0, + 0, 0, 0, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 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, 9, 0, 9, 0, 0, 0, 0, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 37, 37, 37, 37, 37, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 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, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0, 0, 0, 0, 0, 0, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -6802,26 +6680,31 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 9, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, - 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, - 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6829,526 +6712,984 @@ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 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, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 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, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 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, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 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, 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, 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, 19, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 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, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 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, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 9, 9, 0, 9, 0, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 49, 50, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 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, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, + 21, 21, 21, 21, 21, 0, 0, 0, 1, 1, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 0, 9, 0, 9, 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, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 0, 0, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 0, 0, 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, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 0, + 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 9, 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, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, + 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 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, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 0, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, - 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, - 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 9, 9, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 49, 50, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, - 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, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, - 21, 21, 0, 0, 0, 1, 1, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, - 14, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 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, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 19, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, - 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 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, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 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, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 0, - 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 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, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 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, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 0, 0, 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, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, + 0, 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, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 9, 9, 0, 0, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 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, 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 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, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 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, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, + 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 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, 0, 0, @@ -7356,94 +7697,66 @@ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, + 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 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, 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, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 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, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7453,317 +7766,346 @@ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 0, 0, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 9, 9, 9, 9, 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, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, - 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, + 0, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 57, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, + 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 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, 0, 0, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, + 9, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 0, 9, 0, 9, 0, 9, 9, + 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 9, 0, 9, 0, 0, + 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, - 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 9, 9, 9, 9, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 0, 9, 0, - 9, 0, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 9, - 0, 9, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 9, - 9, 9, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 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, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 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, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 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, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const change_record* get_change_3_2_0(Py_UCS4 n) @@ -7771,8 +8113,8 @@ static const change_record* get_change_3_2_0(Py_UCS4 n) int index; if (n >= 0x110000) index = 0; else { - index = changes_3_2_0_index[n>>7]; - index = changes_3_2_0_data[(index<<7)+(n & 127)]; + index = changes_3_2_0_index[n>>8]; + index = changes_3_2_0_data[(index<<8)+(n & 255)]; } return change_records_3_2_0+index; } diff --git a/Modules/unicodename_db.h b/Modules/unicodename_db.h index f6320c43e53f77..1116905308177d 100644 --- a/Modules/unicodename_db.h +++ b/Modules/unicodename_db.h @@ -53,240 +53,240 @@ static const unsigned char lexicon[] = { 200, 84, 72, 82, 69, 69, 128, 79, 86, 69, 210, 72, 65, 128, 73, 78, 68, 69, 216, 77, 65, 76, 65, 89, 65, 76, 65, 205, 83, 73, 89, 65, 209, 68, 79, 87, 206, 80, 65, 72, 65, 87, 200, 67, 72, 79, 83, 69, 79, 78, 199, - 66, 65, 76, 73, 78, 69, 83, 197, 70, 73, 86, 69, 128, 72, 65, 76, 70, 87, - 73, 68, 84, 200, 72, 65, 78, 68, 45, 70, 73, 83, 212, 77, 69, 82, 79, 73, - 84, 73, 195, 84, 85, 82, 78, 69, 196, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 73, 195, 75, 65, 128, 76, 73, 71, 72, 212, 73, 68, 69, 79, 71, 82, 65, - 205, 80, 72, 65, 83, 69, 45, 196, 84, 79, 128, 65, 76, 67, 72, 69, 77, - 73, 67, 65, 204, 78, 69, 85, 77, 197, 66, 82, 65, 72, 77, 201, 84, 79, - 78, 197, 66, 65, 82, 128, 82, 65, 128, 83, 73, 78, 72, 65, 76, 193, 78, - 85, 77, 69, 82, 73, 195, 80, 65, 128, 83, 73, 88, 128, 89, 65, 128, 69, - 73, 71, 72, 84, 128, 76, 65, 128, 77, 65, 128, 83, 69, 86, 69, 78, 128, - 84, 72, 85, 77, 194, 72, 85, 78, 71, 65, 82, 73, 65, 206, 78, 73, 78, 69, - 128, 76, 79, 78, 199, 78, 65, 128, 66, 65, 82, 194, 72, 65, 200, 82, 73, - 71, 72, 84, 128, 66, 76, 79, 67, 203, 68, 79, 84, 211, 78, 79, 82, 84, - 200, 83, 65, 128, 84, 72, 79, 85, 83, 65, 78, 68, 128, 84, 65, 128, 90, - 90, 89, 88, 128, 90, 90, 89, 84, 128, 90, 90, 89, 82, 88, 128, 90, 90, - 89, 82, 128, 90, 90, 89, 80, 128, 90, 90, 89, 65, 128, 90, 90, 89, 128, - 90, 90, 85, 88, 128, 90, 90, 85, 82, 88, 128, 90, 90, 85, 82, 128, 90, - 90, 85, 80, 128, 90, 90, 85, 128, 90, 90, 83, 89, 65, 128, 90, 90, 83, - 65, 128, 90, 90, 79, 88, 128, 90, 90, 79, 80, 128, 90, 90, 79, 128, 90, - 90, 73, 88, 128, 90, 90, 73, 84, 128, 90, 90, 73, 80, 128, 90, 90, 73, - 69, 88, 128, 90, 90, 73, 69, 84, 128, 90, 90, 73, 69, 80, 128, 90, 90, - 73, 69, 128, 90, 90, 73, 128, 90, 90, 69, 88, 128, 90, 90, 69, 80, 128, - 90, 90, 69, 69, 128, 90, 90, 69, 128, 90, 90, 65, 88, 128, 90, 90, 65, - 84, 128, 90, 90, 65, 80, 128, 90, 90, 65, 65, 128, 90, 90, 65, 128, 90, - 89, 71, 79, 83, 128, 90, 87, 83, 80, 128, 90, 87, 78, 74, 128, 90, 87, - 78, 66, 83, 80, 128, 90, 87, 74, 128, 90, 87, 202, 90, 87, 65, 82, 65, - 75, 65, 89, 128, 90, 87, 65, 128, 90, 85, 84, 128, 90, 85, 79, 88, 128, - 90, 85, 79, 80, 128, 90, 85, 79, 128, 90, 85, 77, 128, 90, 85, 66, 85, - 82, 128, 90, 85, 53, 128, 90, 85, 181, 90, 213, 90, 83, 72, 65, 128, 90, - 82, 65, 128, 90, 81, 65, 80, 72, 193, 90, 79, 84, 128, 90, 79, 79, 128, - 90, 79, 77, 66, 73, 69, 128, 90, 79, 65, 128, 90, 77, 69, 89, 84, 83, 65, - 128, 90, 76, 65, 77, 193, 90, 76, 65, 128, 90, 76, 193, 90, 74, 69, 128, - 90, 73, 90, 50, 128, 90, 73, 81, 65, 65, 128, 90, 73, 80, 80, 69, 82, 45, - 77, 79, 85, 84, 200, 90, 73, 78, 79, 82, 128, 90, 73, 76, 68, 69, 128, - 90, 73, 71, 90, 65, 199, 90, 73, 71, 128, 90, 73, 68, 193, 90, 73, 66, - 128, 90, 73, 194, 90, 73, 51, 128, 90, 201, 90, 72, 89, 88, 128, 90, 72, - 89, 84, 128, 90, 72, 89, 82, 88, 128, 90, 72, 89, 82, 128, 90, 72, 89, - 80, 128, 90, 72, 89, 128, 90, 72, 87, 69, 128, 90, 72, 87, 65, 128, 90, - 72, 85, 88, 128, 90, 72, 85, 84, 128, 90, 72, 85, 82, 88, 128, 90, 72, - 85, 82, 128, 90, 72, 85, 80, 128, 90, 72, 85, 79, 88, 128, 90, 72, 85, - 79, 80, 128, 90, 72, 85, 79, 128, 90, 72, 85, 128, 90, 72, 79, 88, 128, - 90, 72, 79, 84, 128, 90, 72, 79, 80, 128, 90, 72, 79, 79, 128, 90, 72, - 79, 73, 128, 90, 72, 79, 128, 90, 72, 73, 86, 69, 84, 69, 128, 90, 72, - 73, 76, 128, 90, 72, 73, 128, 90, 72, 69, 88, 128, 90, 72, 69, 84, 128, - 90, 72, 69, 80, 128, 90, 72, 69, 69, 128, 90, 72, 69, 128, 90, 72, 197, - 90, 72, 65, 89, 73, 78, 128, 90, 72, 65, 88, 128, 90, 72, 65, 84, 128, - 90, 72, 65, 82, 128, 90, 72, 65, 80, 128, 90, 72, 65, 73, 78, 128, 90, - 72, 65, 65, 128, 90, 72, 65, 128, 90, 72, 128, 90, 69, 86, 79, 75, 128, - 90, 69, 85, 83, 128, 90, 69, 84, 65, 128, 90, 69, 82, 79, 128, 90, 69, - 82, 207, 90, 69, 78, 128, 90, 69, 77, 76, 89, 65, 128, 90, 69, 77, 76, - 74, 65, 128, 90, 69, 76, 79, 128, 90, 69, 66, 82, 193, 90, 69, 50, 128, - 90, 197, 90, 65, 89, 78, 128, 90, 65, 89, 73, 78, 45, 89, 79, 68, 72, - 128, 90, 65, 89, 73, 78, 128, 90, 65, 89, 73, 206, 90, 65, 86, 73, 89, - 65, 78, 73, 128, 90, 65, 84, 65, 128, 90, 65, 82, 81, 65, 128, 90, 65, - 82, 76, 128, 90, 65, 81, 69, 198, 90, 65, 80, 89, 65, 84, 89, 77, 73, - 128, 90, 65, 80, 89, 65, 84, 79, 89, 128, 90, 65, 80, 89, 65, 84, 79, - 217, 90, 65, 80, 89, 65, 84, 65, 89, 65, 128, 90, 65, 78, 79, 90, 72, 69, - 75, 128, 90, 65, 78, 65, 66, 65, 90, 65, 210, 90, 65, 77, 88, 128, 90, - 65, 76, 128, 90, 65, 204, 90, 65, 75, 82, 89, 84, 79, 69, 128, 90, 65, - 75, 82, 89, 84, 65, 89, 65, 128, 90, 65, 75, 82, 89, 84, 65, 89, 193, 90, - 65, 73, 78, 128, 90, 65, 73, 206, 90, 65, 73, 128, 90, 65, 72, 128, 90, - 65, 200, 90, 65, 71, 128, 90, 65, 69, 70, 128, 90, 65, 68, 69, 82, 90, - 72, 75, 65, 128, 90, 65, 55, 128, 90, 193, 90, 48, 49, 54, 72, 128, 90, - 48, 49, 54, 71, 128, 90, 48, 49, 54, 70, 128, 90, 48, 49, 54, 69, 128, - 90, 48, 49, 54, 68, 128, 90, 48, 49, 54, 67, 128, 90, 48, 49, 54, 66, - 128, 90, 48, 49, 54, 65, 128, 90, 48, 49, 54, 128, 90, 48, 49, 53, 73, - 128, 90, 48, 49, 53, 72, 128, 90, 48, 49, 53, 71, 128, 90, 48, 49, 53, - 70, 128, 90, 48, 49, 53, 69, 128, 90, 48, 49, 53, 68, 128, 90, 48, 49, - 53, 67, 128, 90, 48, 49, 53, 66, 128, 90, 48, 49, 53, 65, 128, 90, 48, - 49, 53, 128, 90, 48, 49, 52, 128, 90, 48, 49, 51, 128, 90, 48, 49, 50, - 128, 90, 48, 49, 49, 128, 90, 48, 49, 48, 128, 90, 48, 48, 57, 128, 90, - 48, 48, 56, 128, 90, 48, 48, 55, 128, 90, 48, 48, 54, 128, 90, 48, 48, - 53, 65, 128, 90, 48, 48, 53, 128, 90, 48, 48, 52, 65, 128, 90, 48, 48, - 52, 128, 90, 48, 48, 51, 66, 128, 90, 48, 48, 51, 65, 128, 90, 48, 48, - 51, 128, 90, 48, 48, 50, 68, 128, 90, 48, 48, 50, 67, 128, 90, 48, 48, - 50, 66, 128, 90, 48, 48, 50, 65, 128, 90, 48, 48, 50, 128, 90, 48, 48, - 49, 128, 90, 128, 218, 89, 89, 88, 128, 89, 89, 84, 128, 89, 89, 82, 88, - 128, 89, 89, 82, 128, 89, 89, 80, 128, 89, 89, 69, 128, 89, 89, 65, 65, - 128, 89, 89, 65, 128, 89, 89, 128, 89, 87, 79, 79, 128, 89, 87, 79, 128, - 89, 87, 73, 73, 128, 89, 87, 73, 128, 89, 87, 69, 128, 89, 87, 65, 65, - 128, 89, 87, 65, 128, 89, 86, 128, 89, 85, 88, 128, 89, 85, 87, 79, 81, - 128, 89, 85, 85, 75, 65, 76, 69, 65, 80, 73, 78, 84, 85, 128, 89, 85, 85, - 128, 89, 85, 84, 128, 89, 85, 83, 128, 89, 85, 211, 89, 85, 82, 88, 128, - 89, 85, 82, 128, 89, 85, 81, 128, 89, 85, 209, 89, 85, 80, 128, 89, 85, - 79, 88, 128, 89, 85, 79, 84, 128, 89, 85, 79, 80, 128, 89, 85, 79, 77, - 128, 89, 85, 79, 128, 89, 85, 78, 128, 89, 85, 77, 128, 89, 85, 74, 128, - 89, 85, 73, 128, 89, 85, 69, 81, 128, 89, 85, 69, 128, 89, 85, 68, 72, - 128, 89, 85, 68, 200, 89, 85, 65, 78, 128, 89, 85, 65, 69, 78, 128, 89, - 85, 45, 89, 69, 79, 128, 89, 85, 45, 89, 69, 128, 89, 85, 45, 85, 128, - 89, 85, 45, 79, 128, 89, 85, 45, 73, 128, 89, 85, 45, 69, 79, 128, 89, - 85, 45, 69, 128, 89, 85, 45, 65, 69, 128, 89, 85, 45, 65, 128, 89, 85, - 45, 52, 128, 89, 85, 45, 51, 128, 89, 85, 45, 50, 128, 89, 85, 45, 49, - 128, 89, 85, 128, 89, 213, 89, 82, 89, 128, 89, 80, 83, 73, 76, 73, 128, - 89, 80, 79, 82, 82, 79, 73, 128, 89, 80, 79, 75, 82, 73, 83, 73, 83, 128, - 89, 80, 79, 75, 82, 73, 83, 73, 211, 89, 80, 79, 71, 69, 71, 82, 65, 77, - 77, 69, 78, 73, 128, 89, 79, 89, 128, 89, 79, 88, 128, 89, 79, 87, 68, - 128, 89, 79, 85, 84, 72, 70, 85, 76, 78, 69, 83, 83, 128, 89, 79, 85, 84, - 72, 70, 85, 204, 89, 79, 213, 89, 79, 84, 128, 89, 79, 212, 89, 79, 82, - 73, 128, 89, 79, 81, 128, 89, 79, 209, 89, 79, 80, 128, 89, 79, 79, 128, - 89, 79, 77, 79, 128, 89, 79, 71, 72, 128, 89, 79, 68, 128, 89, 79, 196, - 89, 79, 65, 128, 89, 79, 45, 89, 79, 128, 89, 79, 45, 89, 69, 79, 128, - 89, 79, 45, 89, 65, 69, 128, 89, 79, 45, 89, 65, 128, 89, 79, 45, 79, - 128, 89, 79, 45, 73, 128, 89, 79, 45, 69, 79, 128, 89, 79, 45, 65, 69, - 128, 89, 79, 45, 65, 128, 89, 79, 45, 54, 128, 89, 79, 45, 53, 128, 89, - 79, 45, 52, 128, 89, 79, 45, 51, 128, 89, 79, 45, 50, 128, 89, 79, 45, - 49, 128, 89, 207, 89, 73, 90, 69, 84, 128, 89, 73, 88, 128, 89, 73, 87, - 78, 128, 89, 73, 84, 128, 89, 73, 80, 128, 89, 73, 78, 71, 128, 89, 73, - 73, 128, 89, 73, 72, 128, 89, 73, 199, 89, 73, 69, 88, 128, 89, 73, 69, - 84, 128, 89, 73, 69, 80, 128, 89, 73, 69, 69, 128, 89, 73, 69, 128, 89, - 73, 68, 68, 73, 83, 200, 89, 73, 45, 85, 128, 89, 73, 128, 89, 72, 69, - 128, 89, 72, 65, 128, 89, 70, 69, 83, 73, 83, 128, 89, 70, 69, 83, 73, - 211, 89, 70, 69, 206, 89, 69, 90, 73, 68, 201, 89, 69, 89, 128, 89, 69, - 87, 128, 89, 69, 85, 88, 128, 89, 69, 85, 82, 65, 69, 128, 89, 69, 85, - 81, 128, 89, 69, 85, 77, 128, 89, 69, 85, 65, 69, 84, 128, 89, 69, 85, - 65, 69, 128, 89, 69, 84, 73, 86, 128, 89, 69, 83, 84, 85, 128, 89, 69, - 83, 73, 69, 85, 78, 71, 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, - 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 83, 73, 79, 83, 128, 89, 69, 83, - 73, 69, 85, 78, 71, 45, 80, 65, 78, 83, 73, 79, 83, 128, 89, 69, 83, 73, - 69, 85, 78, 71, 45, 77, 73, 69, 85, 77, 128, 89, 69, 83, 73, 69, 85, 78, - 71, 45, 75, 73, 89, 69, 79, 75, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, - 75, 72, 73, 69, 85, 75, 72, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 72, - 73, 69, 85, 72, 128, 89, 69, 83, 73, 69, 85, 78, 71, 128, 89, 69, 82, 85, - 128, 89, 69, 82, 213, 89, 69, 82, 73, 128, 89, 69, 82, 65, 200, 89, 69, - 82, 128, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 89, 69, 79, 45, - 89, 65, 128, 89, 69, 79, 45, 85, 128, 89, 69, 79, 45, 79, 128, 89, 69, - 78, 73, 83, 69, 201, 89, 69, 78, 65, 80, 128, 89, 69, 78, 128, 89, 69, - 206, 89, 69, 76, 76, 79, 87, 128, 89, 69, 76, 76, 79, 215, 89, 69, 73, - 78, 128, 89, 69, 72, 128, 89, 69, 69, 71, 128, 89, 69, 69, 128, 89, 69, - 65, 210, 89, 69, 65, 128, 89, 65, 90, 90, 128, 89, 65, 90, 72, 128, 89, - 65, 90, 128, 89, 65, 89, 68, 128, 89, 65, 89, 65, 78, 78, 65, 128, 89, - 65, 89, 128, 89, 65, 87, 78, 73, 78, 199, 89, 65, 87, 78, 128, 89, 65, - 87, 128, 89, 65, 86, 128, 89, 65, 85, 128, 89, 65, 84, 84, 128, 89, 65, - 84, 73, 128, 89, 65, 84, 72, 128, 89, 65, 84, 128, 89, 65, 83, 83, 128, - 89, 65, 83, 72, 128, 89, 65, 83, 128, 89, 65, 82, 82, 128, 89, 65, 82, - 78, 128, 89, 65, 82, 128, 89, 65, 210, 89, 65, 81, 128, 89, 65, 80, 128, - 89, 65, 78, 83, 65, 89, 65, 128, 89, 65, 78, 71, 128, 89, 65, 78, 199, - 89, 65, 78, 128, 89, 65, 77, 79, 75, 128, 89, 65, 77, 65, 75, 75, 65, 78, - 128, 89, 65, 77, 128, 89, 65, 76, 128, 89, 65, 75, 72, 72, 128, 89, 65, - 75, 72, 128, 89, 65, 75, 65, 83, 72, 128, 89, 65, 75, 128, 89, 65, 74, - 85, 82, 86, 69, 68, 73, 195, 89, 65, 74, 128, 89, 65, 73, 128, 89, 65, - 72, 72, 128, 89, 65, 72, 128, 89, 65, 71, 78, 128, 89, 65, 71, 72, 72, - 128, 89, 65, 71, 72, 128, 89, 65, 71, 128, 89, 65, 70, 213, 89, 65, 70, - 128, 89, 65, 69, 77, 77, 65, 69, 128, 89, 65, 68, 72, 128, 89, 65, 68, - 68, 72, 128, 89, 65, 68, 68, 128, 89, 65, 68, 128, 89, 65, 67, 72, 128, - 89, 65, 66, 72, 128, 89, 65, 66, 128, 89, 65, 65, 82, 85, 128, 89, 65, - 65, 73, 128, 89, 65, 65, 68, 79, 128, 89, 65, 45, 89, 79, 128, 89, 65, - 45, 85, 128, 89, 65, 45, 79, 128, 89, 65, 45, 53, 128, 89, 65, 45, 52, - 128, 89, 65, 45, 51, 128, 89, 65, 45, 50, 128, 89, 65, 45, 49, 128, 89, - 48, 48, 56, 128, 89, 48, 48, 55, 128, 89, 48, 48, 54, 128, 89, 48, 48, - 53, 128, 89, 48, 48, 52, 128, 89, 48, 48, 51, 128, 89, 48, 48, 50, 128, - 89, 48, 48, 49, 65, 128, 89, 48, 48, 49, 128, 89, 45, 67, 82, 69, 197, - 88, 89, 88, 128, 88, 89, 85, 128, 88, 89, 84, 128, 88, 89, 82, 88, 128, - 88, 89, 82, 128, 88, 89, 80, 128, 88, 89, 79, 79, 74, 128, 88, 89, 79, - 79, 128, 88, 89, 79, 128, 88, 89, 73, 128, 88, 89, 69, 69, 205, 88, 89, - 69, 69, 128, 88, 89, 69, 128, 88, 89, 65, 65, 128, 88, 89, 65, 128, 88, - 89, 128, 88, 87, 73, 128, 88, 87, 69, 69, 128, 88, 87, 69, 128, 88, 87, - 65, 65, 128, 88, 87, 65, 128, 88, 87, 128, 88, 215, 88, 86, 69, 128, 88, - 86, 65, 128, 88, 85, 79, 88, 128, 88, 85, 79, 128, 88, 85, 128, 88, 83, - 72, 65, 65, 89, 65, 84, 72, 73, 89, 65, 128, 88, 79, 88, 128, 88, 79, 84, - 128, 88, 79, 82, 128, 88, 79, 80, 72, 128, 88, 79, 80, 128, 88, 79, 65, - 128, 88, 79, 128, 88, 73, 88, 128, 88, 73, 84, 128, 88, 73, 82, 79, 206, - 88, 73, 80, 128, 88, 73, 69, 88, 128, 88, 73, 69, 84, 128, 88, 73, 69, - 80, 128, 88, 73, 69, 128, 88, 73, 65, 78, 71, 81, 201, 88, 73, 65, 66, - 128, 88, 73, 128, 88, 72, 69, 89, 78, 128, 88, 71, 128, 88, 69, 89, 78, - 128, 88, 69, 83, 84, 69, 211, 88, 69, 72, 128, 88, 69, 69, 128, 88, 69, - 128, 88, 65, 85, 83, 128, 88, 65, 85, 128, 88, 65, 80, 72, 128, 88, 65, - 78, 128, 88, 65, 65, 128, 88, 65, 128, 88, 48, 48, 56, 65, 128, 88, 48, - 48, 56, 128, 88, 48, 48, 55, 128, 88, 48, 48, 54, 65, 128, 88, 48, 48, - 54, 128, 88, 48, 48, 53, 128, 88, 48, 48, 52, 66, 128, 88, 48, 48, 52, - 65, 128, 88, 48, 48, 52, 128, 88, 48, 48, 51, 128, 88, 48, 48, 50, 128, - 88, 48, 48, 49, 128, 88, 45, 216, 88, 45, 82, 65, 89, 128, 87, 90, 128, - 87, 89, 78, 78, 128, 87, 89, 78, 206, 87, 86, 73, 128, 87, 86, 69, 128, - 87, 86, 65, 128, 87, 86, 128, 87, 85, 80, 128, 87, 85, 79, 88, 128, 87, - 85, 79, 80, 128, 87, 85, 79, 128, 87, 85, 78, 74, 207, 87, 85, 78, 128, - 87, 85, 76, 85, 128, 87, 85, 76, 213, 87, 85, 73, 128, 87, 85, 69, 128, - 87, 85, 65, 69, 84, 128, 87, 85, 65, 69, 78, 128, 87, 85, 128, 87, 82, - 217, 87, 82, 79, 78, 71, 128, 87, 82, 73, 83, 212, 87, 82, 73, 78, 75, - 76, 69, 83, 128, 87, 82, 73, 78, 75, 76, 69, 211, 87, 82, 73, 78, 75, 76, - 69, 68, 128, 87, 82, 69, 83, 84, 76, 69, 82, 83, 128, 87, 82, 69, 78, 67, - 72, 128, 87, 82, 69, 65, 84, 200, 87, 82, 65, 80, 80, 69, 196, 87, 82, - 65, 80, 128, 87, 79, 88, 128, 87, 79, 87, 128, 87, 79, 82, 83, 72, 73, - 80, 128, 87, 79, 82, 82, 73, 69, 196, 87, 79, 82, 77, 128, 87, 79, 82, - 76, 196, 87, 79, 82, 75, 69, 82, 128, 87, 79, 82, 75, 128, 87, 79, 82, - 203, 87, 79, 82, 68, 83, 80, 65, 67, 69, 128, 87, 79, 82, 196, 87, 79, - 80, 128, 87, 79, 79, 78, 128, 87, 79, 79, 76, 128, 87, 79, 79, 68, 83, - 45, 67, 82, 69, 197, 87, 79, 79, 68, 128, 87, 79, 78, 128, 87, 79, 206, - 87, 79, 77, 69, 78, 211, 87, 79, 77, 69, 206, 87, 79, 77, 65, 78, 211, - 87, 79, 77, 65, 78, 128, 87, 79, 77, 65, 206, 87, 79, 76, 79, 83, 79, - 128, 87, 79, 76, 198, 87, 79, 69, 128, 87, 79, 65, 128, 87, 79, 45, 55, - 128, 87, 79, 45, 54, 128, 87, 79, 45, 53, 128, 87, 79, 45, 52, 128, 87, - 79, 45, 51, 128, 87, 79, 45, 50, 128, 87, 79, 45, 49, 128, 87, 73, 84, - 72, 79, 85, 212, 87, 73, 84, 72, 73, 78, 128, 87, 73, 84, 72, 73, 206, - 87, 73, 82, 69, 76, 69, 83, 83, 128, 87, 73, 82, 69, 196, 87, 73, 78, 84, - 69, 82, 128, 87, 73, 78, 75, 73, 78, 199, 87, 73, 78, 75, 128, 87, 73, - 78, 74, 65, 128, 87, 73, 78, 71, 83, 128, 87, 73, 78, 71, 128, 87, 73, - 78, 69, 128, 87, 73, 78, 197, 87, 73, 78, 68, 85, 128, 87, 73, 78, 68, - 79, 87, 128, 87, 73, 78, 68, 128, 87, 73, 78, 196, 87, 73, 78, 128, 87, - 73, 76, 84, 69, 196, 87, 73, 71, 78, 89, 65, 78, 128, 87, 73, 71, 71, 76, - 217, 87, 73, 71, 71, 76, 69, 83, 128, 87, 73, 68, 84, 72, 128, 87, 73, - 68, 69, 78, 73, 78, 199, 87, 73, 68, 69, 45, 72, 69, 65, 68, 69, 196, 87, - 73, 68, 197, 87, 73, 65, 78, 71, 87, 65, 65, 75, 128, 87, 73, 65, 78, 71, - 128, 87, 73, 45, 53, 128, 87, 73, 45, 52, 128, 87, 73, 45, 51, 128, 87, - 73, 45, 50, 128, 87, 73, 45, 49, 128, 87, 72, 79, 76, 197, 87, 72, 73, - 84, 69, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 87, 72, 73, 84, 69, 128, - 87, 72, 69, 69, 76, 69, 196, 87, 72, 69, 69, 76, 67, 72, 65, 73, 82, 128, - 87, 72, 69, 69, 76, 67, 72, 65, 73, 210, 87, 72, 69, 69, 76, 128, 87, 72, - 69, 69, 204, 87, 72, 69, 65, 84, 128, 87, 72, 65, 76, 69, 128, 87, 72, - 128, 87, 71, 128, 87, 69, 88, 128, 87, 69, 85, 88, 128, 87, 69, 212, 87, - 69, 83, 84, 69, 82, 206, 87, 69, 83, 84, 45, 67, 82, 69, 197, 87, 69, 83, - 84, 128, 87, 69, 83, 212, 87, 69, 80, 128, 87, 69, 79, 128, 87, 69, 78, - 128, 87, 69, 76, 76, 128, 87, 69, 73, 71, 72, 212, 87, 69, 73, 69, 82, - 83, 84, 82, 65, 83, 211, 87, 69, 73, 128, 87, 69, 69, 78, 128, 87, 69, - 68, 71, 69, 45, 84, 65, 73, 76, 69, 196, 87, 69, 68, 71, 69, 128, 87, 69, - 68, 68, 73, 78, 71, 128, 87, 69, 66, 128, 87, 69, 65, 82, 217, 87, 69, - 65, 80, 79, 78, 128, 87, 69, 45, 52, 128, 87, 69, 45, 51, 128, 87, 69, - 45, 50, 128, 87, 69, 45, 49, 128, 87, 67, 128, 87, 66, 128, 87, 65, 89, - 128, 87, 65, 217, 87, 65, 88, 73, 78, 199, 87, 65, 88, 128, 87, 65, 87, - 45, 65, 89, 73, 78, 45, 82, 69, 83, 72, 128, 87, 65, 87, 128, 87, 65, - 215, 87, 65, 86, 217, 87, 65, 86, 73, 78, 199, 87, 65, 86, 69, 83, 128, - 87, 65, 86, 69, 128, 87, 65, 86, 197, 87, 65, 85, 128, 87, 65, 84, 84, - 79, 128, 87, 65, 84, 69, 82, 77, 69, 76, 79, 78, 128, 87, 65, 84, 69, 82, - 128, 87, 65, 84, 69, 210, 87, 65, 84, 67, 72, 128, 87, 65, 84, 128, 87, - 65, 83, 84, 73, 78, 71, 128, 87, 65, 83, 84, 69, 66, 65, 83, 75, 69, 84, - 128, 87, 65, 83, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 76, 65, 128, - 87, 65, 83, 76, 193, 87, 65, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 65, - 76, 76, 65, 205, 87, 65, 83, 45, 83, 65, 76, 65, 65, 77, 128, 87, 65, 82, - 78, 73, 78, 199, 87, 65, 82, 65, 78, 199, 87, 65, 81, 70, 65, 128, 87, - 65, 80, 128, 87, 65, 78, 73, 78, 199, 87, 65, 78, 71, 75, 85, 79, 81, - 128, 87, 65, 78, 68, 69, 82, 69, 82, 128, 87, 65, 78, 68, 128, 87, 65, - 78, 67, 72, 207, 87, 65, 78, 128, 87, 65, 76, 76, 80, 76, 65, 78, 197, - 87, 65, 76, 76, 69, 196, 87, 65, 76, 76, 128, 87, 65, 76, 204, 87, 65, - 76, 75, 128, 87, 65, 76, 203, 87, 65, 73, 84, 73, 78, 71, 128, 87, 65, - 73, 83, 84, 128, 87, 65, 73, 128, 87, 65, 70, 70, 76, 69, 128, 87, 65, - 69, 78, 128, 87, 65, 69, 128, 87, 65, 68, 68, 65, 128, 87, 65, 65, 86, - 85, 128, 87, 65, 65, 74, 73, 66, 128, 87, 65, 65, 65, 76, 73, 72, 69, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 73, 195, 66, 65, 76, 73, 78, 69, 83, + 197, 70, 73, 86, 69, 128, 72, 65, 76, 70, 87, 73, 68, 84, 200, 72, 65, + 78, 68, 45, 70, 73, 83, 212, 77, 69, 82, 79, 73, 84, 73, 195, 84, 85, 82, + 78, 69, 196, 75, 65, 128, 76, 73, 71, 72, 212, 73, 68, 69, 79, 71, 82, + 65, 205, 80, 72, 65, 83, 69, 45, 196, 84, 79, 128, 65, 76, 67, 72, 69, + 77, 73, 67, 65, 204, 78, 69, 85, 77, 197, 66, 82, 65, 72, 77, 201, 84, + 79, 78, 197, 66, 65, 82, 128, 82, 65, 128, 83, 73, 78, 72, 65, 76, 193, + 78, 85, 77, 69, 82, 73, 195, 80, 65, 128, 83, 73, 88, 128, 89, 65, 128, + 69, 73, 71, 72, 84, 128, 76, 65, 128, 77, 65, 128, 83, 69, 86, 69, 78, + 128, 84, 72, 85, 77, 194, 72, 85, 78, 71, 65, 82, 73, 65, 206, 78, 73, + 78, 69, 128, 82, 73, 71, 72, 84, 128, 76, 79, 78, 199, 78, 65, 128, 66, + 65, 82, 194, 72, 65, 200, 66, 76, 79, 67, 203, 68, 79, 84, 211, 78, 79, + 82, 84, 200, 83, 65, 128, 84, 72, 79, 85, 83, 65, 78, 68, 128, 84, 65, + 128, 90, 90, 89, 88, 128, 90, 90, 89, 84, 128, 90, 90, 89, 82, 88, 128, + 90, 90, 89, 82, 128, 90, 90, 89, 80, 128, 90, 90, 89, 65, 128, 90, 90, + 89, 128, 90, 90, 85, 88, 128, 90, 90, 85, 82, 88, 128, 90, 90, 85, 82, + 128, 90, 90, 85, 80, 128, 90, 90, 85, 128, 90, 90, 83, 89, 65, 128, 90, + 90, 83, 65, 128, 90, 90, 79, 88, 128, 90, 90, 79, 80, 128, 90, 90, 79, + 128, 90, 90, 73, 88, 128, 90, 90, 73, 84, 128, 90, 90, 73, 80, 128, 90, + 90, 73, 69, 88, 128, 90, 90, 73, 69, 84, 128, 90, 90, 73, 69, 80, 128, + 90, 90, 73, 69, 128, 90, 90, 73, 128, 90, 90, 69, 88, 128, 90, 90, 69, + 80, 128, 90, 90, 69, 69, 128, 90, 90, 69, 128, 90, 90, 65, 88, 128, 90, + 90, 65, 84, 128, 90, 90, 65, 80, 128, 90, 90, 65, 65, 128, 90, 90, 65, + 128, 90, 89, 71, 79, 83, 128, 90, 87, 83, 80, 128, 90, 87, 78, 74, 128, + 90, 87, 78, 66, 83, 80, 128, 90, 87, 74, 128, 90, 87, 202, 90, 87, 65, + 82, 65, 75, 65, 89, 128, 90, 87, 65, 128, 90, 85, 84, 128, 90, 85, 79, + 88, 128, 90, 85, 79, 80, 128, 90, 85, 79, 128, 90, 85, 77, 128, 90, 85, + 66, 85, 82, 128, 90, 85, 53, 128, 90, 85, 181, 90, 213, 90, 83, 72, 65, + 128, 90, 82, 65, 128, 90, 81, 65, 80, 72, 193, 90, 79, 84, 128, 90, 79, + 79, 128, 90, 79, 77, 66, 73, 69, 128, 90, 79, 65, 128, 90, 77, 69, 89, + 84, 83, 65, 128, 90, 76, 65, 77, 193, 90, 76, 65, 128, 90, 76, 193, 90, + 74, 69, 128, 90, 73, 90, 50, 128, 90, 73, 81, 65, 65, 128, 90, 73, 80, + 80, 69, 82, 45, 77, 79, 85, 84, 200, 90, 73, 78, 79, 82, 128, 90, 73, 76, + 68, 69, 128, 90, 73, 71, 90, 65, 199, 90, 73, 71, 128, 90, 73, 68, 193, + 90, 73, 66, 128, 90, 73, 194, 90, 73, 51, 128, 90, 201, 90, 72, 89, 88, + 128, 90, 72, 89, 84, 128, 90, 72, 89, 82, 88, 128, 90, 72, 89, 82, 128, + 90, 72, 89, 80, 128, 90, 72, 89, 128, 90, 72, 87, 69, 128, 90, 72, 87, + 65, 128, 90, 72, 85, 88, 128, 90, 72, 85, 84, 128, 90, 72, 85, 82, 88, + 128, 90, 72, 85, 82, 128, 90, 72, 85, 80, 128, 90, 72, 85, 79, 88, 128, + 90, 72, 85, 79, 80, 128, 90, 72, 85, 79, 128, 90, 72, 85, 128, 90, 72, + 79, 88, 128, 90, 72, 79, 84, 128, 90, 72, 79, 80, 128, 90, 72, 79, 79, + 128, 90, 72, 79, 73, 128, 90, 72, 79, 128, 90, 72, 73, 86, 69, 84, 69, + 128, 90, 72, 73, 76, 128, 90, 72, 73, 128, 90, 72, 69, 88, 128, 90, 72, + 69, 84, 128, 90, 72, 69, 80, 128, 90, 72, 69, 69, 128, 90, 72, 69, 128, + 90, 72, 197, 90, 72, 65, 89, 73, 78, 128, 90, 72, 65, 88, 128, 90, 72, + 65, 84, 128, 90, 72, 65, 82, 128, 90, 72, 65, 80, 128, 90, 72, 65, 73, + 78, 128, 90, 72, 65, 65, 128, 90, 72, 65, 128, 90, 72, 128, 90, 69, 86, + 79, 75, 128, 90, 69, 85, 83, 128, 90, 69, 84, 65, 128, 90, 69, 82, 79, + 128, 90, 69, 82, 207, 90, 69, 78, 128, 90, 69, 77, 76, 89, 65, 128, 90, + 69, 77, 76, 74, 65, 128, 90, 69, 76, 79, 128, 90, 69, 66, 82, 193, 90, + 69, 50, 128, 90, 197, 90, 65, 89, 78, 128, 90, 65, 89, 73, 78, 45, 89, + 79, 68, 72, 128, 90, 65, 89, 73, 78, 128, 90, 65, 89, 73, 206, 90, 65, + 86, 73, 89, 65, 78, 73, 128, 90, 65, 84, 65, 128, 90, 65, 82, 81, 65, + 128, 90, 65, 82, 76, 128, 90, 65, 81, 69, 198, 90, 65, 80, 89, 65, 84, + 89, 77, 73, 128, 90, 65, 80, 89, 65, 84, 79, 89, 128, 90, 65, 80, 89, 65, + 84, 79, 217, 90, 65, 80, 89, 65, 84, 65, 89, 65, 128, 90, 65, 78, 79, 90, + 72, 69, 75, 128, 90, 65, 78, 65, 66, 65, 90, 65, 210, 90, 65, 77, 88, + 128, 90, 65, 76, 128, 90, 65, 204, 90, 65, 75, 82, 89, 84, 79, 69, 128, + 90, 65, 75, 82, 89, 84, 65, 89, 65, 128, 90, 65, 75, 82, 89, 84, 65, 89, + 193, 90, 65, 73, 78, 128, 90, 65, 73, 206, 90, 65, 73, 128, 90, 65, 72, + 128, 90, 65, 200, 90, 65, 71, 128, 90, 65, 69, 70, 128, 90, 65, 68, 69, + 82, 90, 72, 75, 65, 128, 90, 65, 55, 128, 90, 193, 90, 48, 49, 54, 72, + 128, 90, 48, 49, 54, 71, 128, 90, 48, 49, 54, 70, 128, 90, 48, 49, 54, + 69, 128, 90, 48, 49, 54, 68, 128, 90, 48, 49, 54, 67, 128, 90, 48, 49, + 54, 66, 128, 90, 48, 49, 54, 65, 128, 90, 48, 49, 54, 128, 90, 48, 49, + 53, 73, 128, 90, 48, 49, 53, 72, 128, 90, 48, 49, 53, 71, 128, 90, 48, + 49, 53, 70, 128, 90, 48, 49, 53, 69, 128, 90, 48, 49, 53, 68, 128, 90, + 48, 49, 53, 67, 128, 90, 48, 49, 53, 66, 128, 90, 48, 49, 53, 65, 128, + 90, 48, 49, 53, 128, 90, 48, 49, 52, 128, 90, 48, 49, 51, 128, 90, 48, + 49, 50, 128, 90, 48, 49, 49, 128, 90, 48, 49, 48, 128, 90, 48, 48, 57, + 128, 90, 48, 48, 56, 128, 90, 48, 48, 55, 128, 90, 48, 48, 54, 128, 90, + 48, 48, 53, 65, 128, 90, 48, 48, 53, 128, 90, 48, 48, 52, 65, 128, 90, + 48, 48, 52, 128, 90, 48, 48, 51, 66, 128, 90, 48, 48, 51, 65, 128, 90, + 48, 48, 51, 128, 90, 48, 48, 50, 68, 128, 90, 48, 48, 50, 67, 128, 90, + 48, 48, 50, 66, 128, 90, 48, 48, 50, 65, 128, 90, 48, 48, 50, 128, 90, + 48, 48, 49, 128, 90, 128, 218, 89, 89, 88, 128, 89, 89, 84, 128, 89, 89, + 82, 88, 128, 89, 89, 82, 128, 89, 89, 80, 128, 89, 89, 69, 128, 89, 89, + 65, 65, 128, 89, 89, 65, 128, 89, 89, 128, 89, 87, 79, 79, 128, 89, 87, + 79, 128, 89, 87, 73, 73, 128, 89, 87, 73, 128, 89, 87, 69, 128, 89, 87, + 65, 65, 128, 89, 87, 65, 128, 89, 86, 128, 89, 85, 88, 128, 89, 85, 87, + 79, 81, 128, 89, 85, 85, 75, 65, 76, 69, 65, 80, 73, 78, 84, 85, 128, 89, + 85, 85, 128, 89, 85, 84, 128, 89, 85, 83, 128, 89, 85, 211, 89, 85, 82, + 88, 128, 89, 85, 82, 128, 89, 85, 81, 128, 89, 85, 209, 89, 85, 80, 128, + 89, 85, 79, 88, 128, 89, 85, 79, 84, 128, 89, 85, 79, 80, 128, 89, 85, + 79, 77, 128, 89, 85, 79, 128, 89, 85, 78, 128, 89, 85, 77, 128, 89, 85, + 74, 128, 89, 85, 73, 128, 89, 85, 69, 81, 128, 89, 85, 69, 128, 89, 85, + 68, 72, 128, 89, 85, 68, 200, 89, 85, 65, 78, 128, 89, 85, 65, 69, 78, + 128, 89, 85, 45, 89, 69, 79, 128, 89, 85, 45, 89, 69, 128, 89, 85, 45, + 85, 128, 89, 85, 45, 79, 128, 89, 85, 45, 73, 128, 89, 85, 45, 69, 79, + 128, 89, 85, 45, 69, 128, 89, 85, 45, 65, 69, 128, 89, 85, 45, 65, 128, + 89, 85, 45, 52, 128, 89, 85, 45, 51, 128, 89, 85, 45, 50, 128, 89, 85, + 45, 49, 128, 89, 85, 128, 89, 213, 89, 82, 89, 128, 89, 80, 83, 73, 76, + 73, 128, 89, 80, 79, 82, 82, 79, 73, 128, 89, 80, 79, 75, 82, 73, 83, 73, + 83, 128, 89, 80, 79, 75, 82, 73, 83, 73, 211, 89, 80, 79, 71, 69, 71, 82, + 65, 77, 77, 69, 78, 73, 128, 89, 79, 89, 128, 89, 79, 88, 128, 89, 79, + 87, 68, 128, 89, 79, 85, 84, 72, 70, 85, 76, 78, 69, 83, 83, 128, 89, 79, + 85, 84, 72, 70, 85, 204, 89, 79, 213, 89, 79, 84, 128, 89, 79, 212, 89, + 79, 82, 73, 128, 89, 79, 81, 128, 89, 79, 209, 89, 79, 80, 128, 89, 79, + 79, 128, 89, 79, 77, 79, 128, 89, 79, 71, 72, 128, 89, 79, 68, 128, 89, + 79, 196, 89, 79, 65, 128, 89, 79, 45, 89, 79, 128, 89, 79, 45, 89, 69, + 79, 128, 89, 79, 45, 89, 65, 69, 128, 89, 79, 45, 89, 65, 128, 89, 79, + 45, 79, 128, 89, 79, 45, 73, 128, 89, 79, 45, 69, 79, 128, 89, 79, 45, + 65, 69, 128, 89, 79, 45, 65, 128, 89, 79, 45, 54, 128, 89, 79, 45, 53, + 128, 89, 79, 45, 52, 128, 89, 79, 45, 51, 128, 89, 79, 45, 50, 128, 89, + 79, 45, 49, 128, 89, 207, 89, 73, 90, 69, 84, 128, 89, 73, 88, 128, 89, + 73, 87, 78, 128, 89, 73, 84, 128, 89, 73, 80, 128, 89, 73, 78, 71, 128, + 89, 73, 73, 128, 89, 73, 72, 128, 89, 73, 199, 89, 73, 69, 88, 128, 89, + 73, 69, 84, 128, 89, 73, 69, 80, 128, 89, 73, 69, 69, 128, 89, 73, 69, + 128, 89, 73, 68, 68, 73, 83, 200, 89, 73, 45, 85, 128, 89, 73, 128, 89, + 72, 69, 128, 89, 72, 65, 128, 89, 70, 69, 83, 73, 83, 128, 89, 70, 69, + 83, 73, 211, 89, 70, 69, 206, 89, 69, 90, 73, 68, 201, 89, 69, 89, 128, + 89, 69, 87, 128, 89, 69, 85, 88, 128, 89, 69, 85, 82, 65, 69, 128, 89, + 69, 85, 81, 128, 89, 69, 85, 77, 128, 89, 69, 85, 65, 69, 84, 128, 89, + 69, 85, 65, 69, 128, 89, 69, 84, 73, 86, 128, 89, 69, 83, 84, 85, 128, + 89, 69, 83, 73, 69, 85, 78, 71, 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, + 79, 75, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 83, 73, 79, 83, 128, 89, + 69, 83, 73, 69, 85, 78, 71, 45, 80, 65, 78, 83, 73, 79, 83, 128, 89, 69, + 83, 73, 69, 85, 78, 71, 45, 77, 73, 69, 85, 77, 128, 89, 69, 83, 73, 69, + 85, 78, 71, 45, 75, 73, 89, 69, 79, 75, 128, 89, 69, 83, 73, 69, 85, 78, + 71, 45, 75, 72, 73, 69, 85, 75, 72, 128, 89, 69, 83, 73, 69, 85, 78, 71, + 45, 72, 73, 69, 85, 72, 128, 89, 69, 83, 73, 69, 85, 78, 71, 128, 89, 69, + 82, 85, 128, 89, 69, 82, 213, 89, 69, 82, 73, 128, 89, 69, 82, 65, 200, + 89, 69, 82, 128, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 89, 69, + 79, 45, 89, 65, 128, 89, 69, 79, 45, 85, 128, 89, 69, 79, 45, 79, 128, + 89, 69, 78, 73, 83, 69, 201, 89, 69, 78, 65, 80, 128, 89, 69, 78, 128, + 89, 69, 206, 89, 69, 76, 76, 79, 87, 128, 89, 69, 76, 76, 79, 215, 89, + 69, 73, 78, 128, 89, 69, 72, 128, 89, 69, 69, 71, 128, 89, 69, 69, 128, + 89, 69, 65, 210, 89, 69, 65, 128, 89, 65, 90, 90, 128, 89, 65, 90, 72, + 128, 89, 65, 90, 128, 89, 65, 89, 68, 128, 89, 65, 89, 65, 78, 78, 65, + 128, 89, 65, 89, 128, 89, 65, 87, 78, 73, 78, 199, 89, 65, 87, 78, 128, + 89, 65, 87, 128, 89, 65, 86, 128, 89, 65, 85, 128, 89, 65, 84, 84, 128, + 89, 65, 84, 73, 128, 89, 65, 84, 72, 128, 89, 65, 84, 128, 89, 65, 83, + 83, 128, 89, 65, 83, 72, 128, 89, 65, 83, 128, 89, 65, 82, 82, 128, 89, + 65, 82, 78, 128, 89, 65, 82, 128, 89, 65, 210, 89, 65, 81, 128, 89, 65, + 80, 128, 89, 65, 78, 83, 65, 89, 65, 128, 89, 65, 78, 71, 128, 89, 65, + 78, 199, 89, 65, 78, 128, 89, 65, 77, 79, 75, 128, 89, 65, 77, 65, 75, + 75, 65, 78, 128, 89, 65, 77, 128, 89, 65, 76, 128, 89, 65, 75, 72, 72, + 128, 89, 65, 75, 72, 128, 89, 65, 75, 65, 83, 72, 128, 89, 65, 75, 128, + 89, 65, 74, 85, 82, 86, 69, 68, 73, 195, 89, 65, 74, 128, 89, 65, 73, + 128, 89, 65, 72, 72, 128, 89, 65, 72, 128, 89, 65, 71, 78, 128, 89, 65, + 71, 72, 72, 128, 89, 65, 71, 72, 128, 89, 65, 71, 128, 89, 65, 70, 213, + 89, 65, 70, 128, 89, 65, 69, 77, 77, 65, 69, 128, 89, 65, 68, 72, 128, + 89, 65, 68, 68, 72, 128, 89, 65, 68, 68, 128, 89, 65, 68, 128, 89, 65, + 67, 72, 128, 89, 65, 66, 72, 128, 89, 65, 66, 128, 89, 65, 65, 82, 85, + 128, 89, 65, 65, 73, 128, 89, 65, 65, 68, 79, 128, 89, 65, 45, 89, 79, + 128, 89, 65, 45, 85, 128, 89, 65, 45, 79, 128, 89, 65, 45, 53, 128, 89, + 65, 45, 52, 128, 89, 65, 45, 51, 128, 89, 65, 45, 50, 128, 89, 65, 45, + 49, 128, 89, 48, 48, 56, 128, 89, 48, 48, 55, 128, 89, 48, 48, 54, 128, + 89, 48, 48, 53, 128, 89, 48, 48, 52, 128, 89, 48, 48, 51, 128, 89, 48, + 48, 50, 128, 89, 48, 48, 49, 65, 128, 89, 48, 48, 49, 128, 89, 45, 67, + 82, 69, 197, 88, 89, 88, 128, 88, 89, 85, 128, 88, 89, 84, 128, 88, 89, + 82, 88, 128, 88, 89, 82, 128, 88, 89, 80, 128, 88, 89, 79, 79, 74, 128, + 88, 89, 79, 79, 128, 88, 89, 79, 128, 88, 89, 73, 128, 88, 89, 69, 69, + 205, 88, 89, 69, 69, 128, 88, 89, 69, 128, 88, 89, 65, 65, 128, 88, 89, + 65, 128, 88, 89, 128, 88, 87, 73, 128, 88, 87, 69, 69, 128, 88, 87, 69, + 128, 88, 87, 65, 65, 128, 88, 87, 65, 128, 88, 87, 128, 88, 215, 88, 86, + 69, 128, 88, 86, 65, 128, 88, 85, 79, 88, 128, 88, 85, 79, 128, 88, 85, + 128, 88, 83, 72, 65, 65, 89, 65, 84, 72, 73, 89, 65, 128, 88, 79, 88, + 128, 88, 79, 84, 128, 88, 79, 82, 128, 88, 79, 80, 72, 128, 88, 79, 80, + 128, 88, 79, 65, 128, 88, 79, 128, 88, 73, 88, 128, 88, 73, 84, 128, 88, + 73, 82, 79, 206, 88, 73, 80, 128, 88, 73, 69, 88, 128, 88, 73, 69, 84, + 128, 88, 73, 69, 80, 128, 88, 73, 69, 128, 88, 73, 65, 78, 71, 81, 201, + 88, 73, 65, 66, 128, 88, 73, 128, 88, 72, 69, 89, 78, 128, 88, 71, 128, + 88, 69, 89, 78, 128, 88, 69, 83, 84, 69, 211, 88, 69, 72, 128, 88, 69, + 69, 128, 88, 69, 128, 88, 65, 85, 83, 128, 88, 65, 85, 128, 88, 65, 80, + 72, 128, 88, 65, 78, 128, 88, 65, 65, 128, 88, 65, 128, 88, 48, 48, 56, + 65, 128, 88, 48, 48, 56, 128, 88, 48, 48, 55, 128, 88, 48, 48, 54, 65, + 128, 88, 48, 48, 54, 128, 88, 48, 48, 53, 128, 88, 48, 48, 52, 66, 128, + 88, 48, 48, 52, 65, 128, 88, 48, 48, 52, 128, 88, 48, 48, 51, 128, 88, + 48, 48, 50, 128, 88, 48, 48, 49, 128, 88, 45, 216, 88, 45, 82, 65, 89, + 128, 87, 90, 128, 87, 89, 78, 78, 128, 87, 89, 78, 206, 87, 86, 73, 128, + 87, 86, 69, 128, 87, 86, 65, 128, 87, 86, 128, 87, 85, 80, 128, 87, 85, + 79, 88, 128, 87, 85, 79, 80, 128, 87, 85, 79, 128, 87, 85, 78, 74, 207, + 87, 85, 78, 128, 87, 85, 76, 85, 128, 87, 85, 76, 213, 87, 85, 73, 128, + 87, 85, 69, 128, 87, 85, 65, 69, 84, 128, 87, 85, 65, 69, 78, 128, 87, + 85, 128, 87, 82, 217, 87, 82, 79, 78, 71, 128, 87, 82, 73, 83, 212, 87, + 82, 73, 78, 75, 76, 69, 83, 128, 87, 82, 73, 78, 75, 76, 69, 211, 87, 82, + 73, 78, 75, 76, 69, 68, 128, 87, 82, 69, 83, 84, 76, 69, 82, 83, 128, 87, + 82, 69, 78, 67, 72, 128, 87, 82, 69, 65, 84, 200, 87, 82, 65, 80, 80, 69, + 196, 87, 82, 65, 80, 128, 87, 79, 88, 128, 87, 79, 87, 128, 87, 79, 82, + 83, 72, 73, 80, 128, 87, 79, 82, 82, 73, 69, 196, 87, 79, 82, 77, 128, + 87, 79, 82, 76, 196, 87, 79, 82, 75, 69, 82, 128, 87, 79, 82, 75, 128, + 87, 79, 82, 203, 87, 79, 82, 68, 83, 80, 65, 67, 69, 128, 87, 79, 82, + 196, 87, 79, 80, 128, 87, 79, 79, 78, 128, 87, 79, 79, 76, 128, 87, 79, + 79, 68, 83, 45, 67, 82, 69, 197, 87, 79, 79, 68, 128, 87, 79, 78, 128, + 87, 79, 206, 87, 79, 77, 69, 78, 211, 87, 79, 77, 69, 206, 87, 79, 77, + 65, 78, 211, 87, 79, 77, 65, 78, 128, 87, 79, 77, 65, 206, 87, 79, 76, + 79, 83, 79, 128, 87, 79, 76, 198, 87, 79, 69, 128, 87, 79, 65, 128, 87, + 79, 45, 55, 128, 87, 79, 45, 54, 128, 87, 79, 45, 53, 128, 87, 79, 45, + 52, 128, 87, 79, 45, 51, 128, 87, 79, 45, 50, 128, 87, 79, 45, 49, 128, + 87, 73, 84, 72, 79, 85, 212, 87, 73, 84, 72, 73, 78, 128, 87, 73, 84, 72, + 73, 206, 87, 73, 82, 69, 76, 69, 83, 83, 128, 87, 73, 82, 69, 196, 87, + 73, 78, 84, 69, 82, 128, 87, 73, 78, 75, 73, 78, 199, 87, 73, 78, 75, + 128, 87, 73, 78, 74, 65, 128, 87, 73, 78, 71, 83, 128, 87, 73, 78, 71, + 128, 87, 73, 78, 69, 128, 87, 73, 78, 197, 87, 73, 78, 68, 85, 128, 87, + 73, 78, 68, 79, 87, 128, 87, 73, 78, 68, 128, 87, 73, 78, 196, 87, 73, + 78, 128, 87, 73, 76, 84, 69, 196, 87, 73, 71, 78, 89, 65, 78, 128, 87, + 73, 71, 71, 76, 217, 87, 73, 71, 71, 76, 69, 83, 128, 87, 73, 68, 84, 72, + 128, 87, 73, 68, 69, 78, 73, 78, 199, 87, 73, 68, 69, 45, 72, 69, 65, 68, + 69, 196, 87, 73, 68, 197, 87, 73, 65, 78, 71, 87, 65, 65, 75, 128, 87, + 73, 65, 78, 71, 128, 87, 73, 45, 53, 128, 87, 73, 45, 52, 128, 87, 73, + 45, 51, 128, 87, 73, 45, 50, 128, 87, 73, 45, 49, 128, 87, 72, 79, 76, + 197, 87, 72, 73, 84, 69, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 87, 72, + 73, 84, 69, 128, 87, 72, 69, 69, 76, 69, 196, 87, 72, 69, 69, 76, 67, 72, + 65, 73, 82, 128, 87, 72, 69, 69, 76, 67, 72, 65, 73, 210, 87, 72, 69, 69, + 76, 128, 87, 72, 69, 69, 204, 87, 72, 69, 65, 84, 128, 87, 72, 65, 76, + 69, 128, 87, 72, 128, 87, 71, 128, 87, 69, 88, 128, 87, 69, 85, 88, 128, + 87, 69, 212, 87, 69, 83, 84, 69, 82, 206, 87, 69, 83, 84, 45, 67, 82, 69, + 197, 87, 69, 83, 84, 128, 87, 69, 83, 212, 87, 69, 80, 128, 87, 69, 79, + 128, 87, 69, 78, 128, 87, 69, 76, 76, 128, 87, 69, 73, 71, 72, 212, 87, + 69, 73, 69, 82, 83, 84, 82, 65, 83, 211, 87, 69, 73, 128, 87, 69, 69, 78, + 128, 87, 69, 68, 71, 69, 45, 84, 65, 73, 76, 69, 196, 87, 69, 68, 71, 69, + 128, 87, 69, 68, 68, 73, 78, 71, 128, 87, 69, 66, 128, 87, 69, 65, 82, + 217, 87, 69, 65, 80, 79, 78, 128, 87, 69, 45, 52, 128, 87, 69, 45, 51, + 128, 87, 69, 45, 50, 128, 87, 69, 45, 49, 128, 87, 67, 128, 87, 66, 128, + 87, 65, 89, 128, 87, 65, 217, 87, 65, 88, 73, 78, 199, 87, 65, 88, 128, + 87, 65, 87, 45, 65, 89, 73, 78, 45, 82, 69, 83, 72, 128, 87, 65, 87, 128, + 87, 65, 215, 87, 65, 86, 217, 87, 65, 86, 73, 78, 199, 87, 65, 86, 69, + 83, 128, 87, 65, 86, 69, 128, 87, 65, 86, 197, 87, 65, 85, 128, 87, 65, + 84, 84, 79, 128, 87, 65, 84, 69, 82, 77, 69, 76, 79, 78, 128, 87, 65, 84, + 69, 82, 128, 87, 65, 84, 69, 210, 87, 65, 84, 67, 72, 128, 87, 65, 84, + 128, 87, 65, 83, 84, 73, 78, 71, 128, 87, 65, 83, 84, 69, 66, 65, 83, 75, + 69, 84, 128, 87, 65, 83, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 76, 65, + 128, 87, 65, 83, 76, 193, 87, 65, 83, 65, 76, 76, 65, 77, 128, 87, 65, + 83, 65, 76, 76, 65, 205, 87, 65, 83, 45, 83, 65, 76, 65, 65, 77, 128, 87, + 65, 82, 78, 73, 78, 199, 87, 65, 82, 65, 78, 199, 87, 65, 81, 70, 65, + 128, 87, 65, 80, 128, 87, 65, 78, 73, 78, 199, 87, 65, 78, 71, 75, 85, + 79, 81, 128, 87, 65, 78, 68, 69, 82, 69, 82, 128, 87, 65, 78, 68, 128, + 87, 65, 78, 67, 72, 207, 87, 65, 78, 128, 87, 65, 76, 76, 80, 76, 65, 78, + 197, 87, 65, 76, 76, 69, 196, 87, 65, 76, 76, 128, 87, 65, 76, 204, 87, + 65, 76, 75, 128, 87, 65, 76, 203, 87, 65, 73, 84, 73, 78, 71, 128, 87, + 65, 73, 83, 84, 128, 87, 65, 73, 128, 87, 65, 70, 70, 76, 69, 128, 87, + 65, 69, 78, 128, 87, 65, 69, 128, 87, 65, 68, 68, 65, 128, 87, 65, 65, + 86, 85, 128, 87, 65, 65, 74, 73, 66, 128, 87, 65, 65, 65, 76, 73, 72, 69, 197, 87, 65, 45, 84, 65, 65, 65, 76, 65, 65, 128, 87, 65, 45, 83, 65, 76, 76, 65, 77, 128, 87, 65, 45, 65, 65, 76, 73, 72, 128, 87, 65, 45, 53, 128, 87, 65, 45, 52, 128, 87, 65, 45, 51, 128, 87, 65, 45, 50, 128, 87, @@ -937,249 +937,250 @@ static const unsigned char lexicon[] = { 75, 73, 78, 199, 83, 85, 67, 75, 69, 68, 128, 83, 85, 67, 203, 83, 85, 67, 67, 69, 69, 68, 83, 128, 83, 85, 67, 67, 69, 69, 68, 211, 83, 85, 67, 67, 69, 69, 68, 128, 83, 85, 67, 67, 69, 69, 196, 83, 85, 66, 85, 78, 73, - 84, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 73, 79, 206, 83, 85, 66, 83, - 84, 73, 84, 85, 84, 69, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 197, 83, - 85, 66, 83, 69, 84, 128, 83, 85, 66, 83, 69, 212, 83, 85, 66, 83, 67, 82, - 73, 80, 212, 83, 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, 85, 66, 76, - 73, 78, 69, 65, 210, 83, 85, 66, 76, 73, 77, 65, 84, 73, 79, 78, 128, 83, - 85, 66, 76, 73, 77, 65, 84, 69, 45, 51, 128, 83, 85, 66, 76, 73, 77, 65, - 84, 69, 45, 50, 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 128, 83, 85, 66, - 76, 73, 77, 65, 84, 197, 83, 85, 66, 74, 79, 73, 78, 69, 82, 128, 83, 85, - 66, 74, 79, 73, 78, 69, 196, 83, 85, 66, 74, 69, 67, 84, 128, 83, 85, 66, - 73, 84, 79, 128, 83, 85, 66, 72, 65, 65, 78, 65, 72, 213, 83, 85, 66, 71, - 82, 79, 85, 80, 128, 83, 85, 66, 71, 82, 79, 85, 208, 83, 85, 66, 128, - 83, 85, 65, 77, 128, 83, 85, 65, 69, 84, 128, 83, 85, 65, 69, 78, 128, - 83, 85, 65, 69, 128, 83, 85, 65, 66, 128, 83, 85, 65, 128, 83, 85, 45, - 56, 128, 83, 85, 45, 55, 128, 83, 85, 45, 54, 128, 83, 85, 45, 53, 128, - 83, 85, 45, 52, 128, 83, 85, 45, 51, 128, 83, 85, 45, 50, 128, 83, 85, - 45, 49, 128, 83, 213, 83, 84, 88, 128, 83, 84, 87, 65, 128, 83, 84, 85, - 80, 65, 128, 83, 84, 85, 70, 70, 69, 196, 83, 84, 85, 68, 89, 128, 83, - 84, 85, 68, 73, 207, 83, 84, 85, 67, 75, 45, 79, 85, 212, 83, 84, 83, - 128, 83, 84, 82, 79, 78, 199, 83, 84, 82, 79, 75, 69, 83, 128, 83, 84, - 82, 79, 75, 69, 211, 83, 84, 82, 79, 75, 69, 45, 57, 128, 83, 84, 82, 79, - 75, 69, 45, 56, 128, 83, 84, 82, 79, 75, 69, 45, 55, 128, 83, 84, 82, 79, - 75, 69, 45, 54, 128, 83, 84, 82, 79, 75, 69, 45, 53, 128, 83, 84, 82, 79, - 75, 69, 45, 52, 128, 83, 84, 82, 79, 75, 69, 45, 51, 128, 83, 84, 82, 79, - 75, 69, 45, 50, 128, 83, 84, 82, 79, 75, 69, 45, 49, 49, 128, 83, 84, 82, - 79, 75, 69, 45, 49, 48, 128, 83, 84, 82, 79, 75, 69, 45, 49, 128, 83, 84, - 82, 79, 75, 197, 83, 84, 82, 73, 80, 69, 128, 83, 84, 82, 73, 78, 71, - 128, 83, 84, 82, 73, 78, 199, 83, 84, 82, 73, 75, 69, 84, 72, 82, 79, 85, - 71, 72, 128, 83, 84, 82, 73, 75, 197, 83, 84, 82, 73, 68, 69, 128, 83, - 84, 82, 73, 67, 84, 76, 217, 83, 84, 82, 69, 84, 67, 72, 69, 196, 83, 84, - 82, 69, 84, 67, 72, 128, 83, 84, 82, 69, 83, 211, 83, 84, 82, 69, 78, 71, - 84, 72, 128, 83, 84, 82, 69, 76, 193, 83, 84, 82, 69, 65, 77, 69, 82, - 128, 83, 84, 82, 65, 87, 66, 69, 82, 82, 89, 128, 83, 84, 82, 65, 87, - 128, 83, 84, 82, 65, 84, 85, 77, 45, 50, 128, 83, 84, 82, 65, 84, 85, 77, - 128, 83, 84, 82, 65, 84, 85, 205, 83, 84, 82, 65, 84, 73, 65, 206, 83, - 84, 82, 65, 78, 78, 79, 128, 83, 84, 82, 65, 78, 78, 207, 83, 84, 82, 65, - 73, 78, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 84, 78, 69, 83, 83, 128, - 83, 84, 82, 65, 73, 71, 72, 84, 128, 83, 84, 82, 65, 73, 71, 72, 212, 83, - 84, 82, 65, 73, 70, 128, 83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, - 128, 83, 84, 79, 86, 69, 128, 83, 84, 79, 82, 69, 128, 83, 84, 79, 80, - 87, 65, 84, 67, 72, 128, 83, 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 79, - 80, 80, 65, 71, 69, 128, 83, 84, 79, 80, 73, 84, 83, 65, 128, 83, 84, 79, - 80, 73, 84, 83, 193, 83, 84, 79, 80, 128, 83, 84, 79, 208, 83, 84, 79, - 78, 69, 128, 83, 84, 79, 67, 75, 128, 83, 84, 79, 67, 203, 83, 84, 73, - 82, 82, 85, 208, 83, 84, 73, 77, 77, 69, 128, 83, 84, 73, 76, 204, 83, - 84, 73, 76, 197, 83, 84, 73, 71, 77, 65, 128, 83, 84, 73, 67, 75, 73, 78, - 199, 83, 84, 73, 67, 203, 83, 84, 69, 84, 72, 79, 83, 67, 79, 80, 69, - 128, 83, 84, 69, 82, 69, 79, 128, 83, 84, 69, 80, 128, 83, 84, 69, 78, - 79, 71, 82, 65, 80, 72, 73, 195, 83, 84, 69, 77, 128, 83, 84, 69, 65, 77, - 217, 83, 84, 69, 65, 77, 73, 78, 199, 83, 84, 69, 65, 77, 128, 83, 84, - 69, 65, 205, 83, 84, 65, 86, 82, 79, 85, 128, 83, 84, 65, 86, 82, 79, 83, - 128, 83, 84, 65, 86, 82, 79, 211, 83, 84, 65, 85, 82, 79, 83, 128, 83, - 84, 65, 84, 89, 65, 128, 83, 84, 65, 84, 89, 193, 83, 84, 65, 84, 85, - 197, 83, 84, 65, 84, 73, 79, 78, 128, 83, 84, 65, 84, 69, 82, 83, 128, - 83, 84, 65, 84, 69, 128, 83, 84, 65, 82, 84, 73, 78, 199, 83, 84, 65, 82, - 84, 128, 83, 84, 65, 82, 212, 83, 84, 65, 82, 83, 128, 83, 84, 65, 82, - 82, 69, 196, 83, 84, 65, 82, 75, 128, 83, 84, 65, 82, 128, 83, 84, 65, - 210, 83, 84, 65, 78, 68, 83, 84, 73, 76, 76, 128, 83, 84, 65, 78, 68, 73, - 78, 199, 83, 84, 65, 78, 68, 65, 82, 196, 83, 84, 65, 78, 68, 128, 83, - 84, 65, 78, 128, 83, 84, 65, 77, 80, 69, 196, 83, 84, 65, 76, 76, 73, 79, - 78, 128, 83, 84, 65, 70, 70, 128, 83, 84, 65, 70, 198, 83, 84, 65, 68, - 73, 85, 77, 128, 83, 84, 65, 67, 75, 69, 196, 83, 84, 65, 67, 67, 65, 84, - 79, 128, 83, 84, 65, 67, 67, 65, 84, 73, 83, 83, 73, 77, 79, 128, 83, 84, - 50, 128, 83, 83, 89, 88, 128, 83, 83, 89, 84, 128, 83, 83, 89, 82, 88, - 128, 83, 83, 89, 82, 128, 83, 83, 89, 80, 128, 83, 83, 89, 128, 83, 83, - 85, 88, 128, 83, 83, 85, 85, 128, 83, 83, 85, 84, 128, 83, 83, 85, 80, - 128, 83, 83, 79, 88, 128, 83, 83, 79, 84, 128, 83, 83, 79, 80, 128, 83, - 83, 79, 79, 128, 83, 83, 79, 128, 83, 83, 73, 88, 128, 83, 83, 73, 84, - 128, 83, 83, 73, 80, 128, 83, 83, 73, 73, 128, 83, 83, 73, 69, 88, 128, - 83, 83, 73, 69, 80, 128, 83, 83, 73, 69, 128, 83, 83, 72, 73, 78, 128, - 83, 83, 72, 69, 128, 83, 83, 69, 88, 128, 83, 83, 69, 80, 128, 83, 83, - 69, 69, 128, 83, 83, 65, 88, 128, 83, 83, 65, 85, 128, 83, 83, 65, 84, - 128, 83, 83, 65, 80, 128, 83, 83, 65, 78, 71, 89, 69, 83, 73, 69, 85, 78, - 71, 128, 83, 83, 65, 78, 71, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, - 128, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, - 128, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 83, 83, 65, 78, 71, - 84, 72, 73, 69, 85, 84, 72, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, - 84, 73, 75, 69, 85, 84, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 80, - 73, 69, 85, 80, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 75, 73, 89, - 69, 79, 75, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 83, 65, 78, - 71, 82, 73, 69, 85, 76, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, 83, 65, - 78, 71, 82, 73, 69, 85, 76, 128, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, - 128, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, 83, 83, 65, 78, 71, 77, - 73, 69, 85, 77, 128, 83, 83, 65, 78, 71, 73, 69, 85, 78, 71, 128, 83, 83, - 65, 78, 71, 72, 73, 69, 85, 72, 128, 83, 83, 65, 78, 71, 67, 73, 69, 85, - 67, 45, 72, 73, 69, 85, 72, 128, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, - 128, 83, 83, 65, 78, 71, 65, 82, 65, 69, 65, 128, 83, 83, 65, 73, 128, - 83, 83, 65, 65, 128, 83, 83, 51, 128, 83, 83, 50, 128, 83, 82, 69, 68, - 78, 197, 83, 82, 128, 83, 81, 85, 73, 83, 200, 83, 81, 85, 73, 82, 82, - 69, 204, 83, 81, 85, 73, 71, 71, 76, 197, 83, 81, 85, 73, 68, 128, 83, - 81, 85, 69, 69, 90, 69, 68, 128, 83, 81, 85, 69, 69, 90, 197, 83, 81, 85, - 65, 212, 83, 81, 85, 65, 82, 69, 83, 128, 83, 81, 85, 65, 82, 69, 68, - 128, 83, 81, 85, 65, 82, 69, 128, 83, 80, 89, 128, 83, 80, 87, 65, 128, - 83, 80, 85, 78, 71, 211, 83, 80, 82, 79, 85, 84, 128, 83, 80, 82, 73, 78, - 71, 83, 128, 83, 80, 82, 73, 78, 71, 128, 83, 80, 82, 69, 67, 72, 71, 69, - 83, 65, 78, 199, 83, 80, 82, 69, 65, 68, 128, 83, 80, 82, 69, 65, 196, - 83, 80, 79, 85, 84, 73, 78, 199, 83, 80, 79, 84, 128, 83, 80, 79, 82, 84, - 211, 83, 80, 79, 79, 78, 128, 83, 80, 79, 79, 204, 83, 80, 79, 78, 71, - 69, 128, 83, 80, 79, 128, 83, 80, 76, 73, 84, 84, 73, 78, 199, 83, 80, - 76, 73, 84, 128, 83, 80, 76, 73, 212, 83, 80, 76, 65, 89, 69, 68, 128, - 83, 80, 76, 65, 83, 72, 73, 78, 199, 83, 80, 73, 82, 73, 84, 85, 211, 83, - 80, 73, 82, 73, 84, 128, 83, 80, 73, 82, 73, 212, 83, 80, 73, 82, 65, 78, - 84, 128, 83, 80, 73, 82, 65, 76, 128, 83, 80, 73, 82, 65, 204, 83, 80, - 73, 78, 69, 128, 83, 80, 73, 68, 69, 82, 217, 83, 80, 73, 68, 69, 82, - 128, 83, 80, 73, 68, 69, 210, 83, 80, 73, 67, 69, 128, 83, 80, 73, 128, - 83, 80, 72, 69, 82, 73, 67, 65, 204, 83, 80, 69, 83, 77, 73, 76, 207, 83, - 80, 69, 78, 212, 83, 80, 69, 69, 68, 66, 79, 65, 84, 128, 83, 80, 69, 69, - 67, 72, 128, 83, 80, 69, 69, 67, 200, 83, 80, 69, 67, 73, 65, 76, 128, - 83, 80, 69, 65, 82, 128, 83, 80, 69, 65, 75, 73, 78, 199, 83, 80, 69, 65, - 75, 69, 82, 128, 83, 80, 69, 65, 75, 69, 210, 83, 80, 69, 65, 75, 45, 78, - 79, 45, 69, 86, 73, 204, 83, 80, 69, 128, 83, 80, 65, 84, 72, 73, 128, - 83, 80, 65, 82, 75, 76, 73, 78, 199, 83, 80, 65, 82, 75, 76, 69, 83, 128, - 83, 80, 65, 82, 75, 76, 69, 82, 128, 83, 80, 65, 82, 75, 76, 69, 128, 83, - 80, 65, 71, 72, 69, 84, 84, 73, 128, 83, 80, 65, 68, 69, 83, 128, 83, 80, - 65, 68, 197, 83, 80, 65, 67, 73, 78, 199, 83, 80, 65, 67, 197, 83, 80, - 65, 128, 83, 79, 89, 79, 77, 66, 207, 83, 79, 89, 128, 83, 79, 87, 73, - 76, 207, 83, 79, 87, 128, 83, 79, 85, 84, 72, 69, 82, 206, 83, 79, 85, - 84, 72, 45, 83, 76, 65, 86, 69, 217, 83, 79, 85, 84, 200, 83, 79, 85, 82, - 67, 69, 128, 83, 79, 85, 78, 68, 128, 83, 79, 85, 78, 196, 83, 79, 85, - 78, 65, 80, 128, 83, 79, 85, 128, 83, 79, 83, 128, 83, 79, 82, 79, 67, - 72, 89, 193, 83, 79, 82, 73, 128, 83, 79, 82, 193, 83, 79, 81, 128, 83, - 79, 79, 206, 83, 79, 78, 74, 65, 77, 128, 83, 79, 78, 71, 128, 83, 79, - 78, 128, 83, 79, 77, 80, 69, 78, 199, 83, 79, 77, 128, 83, 79, 205, 83, - 79, 76, 73, 68, 85, 83, 128, 83, 79, 76, 73, 68, 85, 211, 83, 79, 76, 73, - 196, 83, 79, 76, 68, 73, 69, 82, 128, 83, 79, 72, 128, 83, 79, 71, 68, - 73, 65, 206, 83, 79, 70, 84, 87, 65, 82, 69, 45, 70, 85, 78, 67, 84, 73, - 79, 206, 83, 79, 70, 84, 78, 69, 83, 83, 128, 83, 79, 70, 84, 66, 65, 76, - 76, 128, 83, 79, 70, 212, 83, 79, 198, 83, 79, 67, 75, 83, 128, 83, 79, - 67, 73, 69, 84, 89, 128, 83, 79, 67, 67, 69, 210, 83, 79, 65, 80, 128, - 83, 79, 65, 128, 83, 79, 45, 55, 128, 83, 79, 45, 54, 128, 83, 79, 45, - 53, 128, 83, 79, 45, 52, 128, 83, 79, 45, 51, 128, 83, 79, 45, 50, 128, - 83, 79, 45, 49, 128, 83, 207, 83, 78, 79, 87, 77, 65, 78, 128, 83, 78, - 79, 87, 77, 65, 206, 83, 78, 79, 87, 70, 76, 65, 75, 69, 128, 83, 78, 79, - 87, 66, 79, 65, 82, 68, 69, 82, 128, 83, 78, 79, 87, 128, 83, 78, 79, - 215, 83, 78, 79, 85, 84, 128, 83, 78, 79, 85, 212, 83, 78, 69, 69, 90, - 73, 78, 199, 83, 78, 65, 208, 83, 78, 65, 75, 69, 128, 83, 78, 65, 75, - 197, 83, 78, 65, 73, 76, 128, 83, 78, 193, 83, 77, 79, 75, 73, 78, 199, - 83, 77, 73, 82, 75, 73, 78, 199, 83, 77, 73, 76, 73, 78, 199, 83, 77, 73, - 76, 69, 128, 83, 77, 73, 76, 197, 83, 77, 69, 65, 82, 128, 83, 77, 65, - 83, 200, 83, 77, 65, 76, 76, 69, 210, 83, 77, 65, 76, 76, 128, 83, 76, - 85, 82, 128, 83, 76, 79, 90, 72, 73, 84, 73, 69, 128, 83, 76, 79, 90, 72, - 73, 84, 73, 197, 83, 76, 79, 87, 76, 89, 128, 83, 76, 79, 87, 128, 83, - 76, 79, 215, 83, 76, 79, 86, 79, 128, 83, 76, 79, 84, 72, 128, 83, 76, - 79, 212, 83, 76, 79, 80, 73, 78, 199, 83, 76, 79, 80, 69, 128, 83, 76, - 79, 65, 206, 83, 76, 73, 78, 71, 128, 83, 76, 73, 71, 72, 84, 76, 217, - 83, 76, 73, 68, 73, 78, 71, 128, 83, 76, 73, 68, 69, 82, 128, 83, 76, 73, - 68, 69, 128, 83, 76, 73, 67, 69, 128, 83, 76, 73, 67, 197, 83, 76, 69, - 85, 84, 200, 83, 76, 69, 69, 80, 217, 83, 76, 69, 69, 80, 73, 78, 199, - 83, 76, 69, 69, 208, 83, 76, 69, 68, 128, 83, 76, 65, 86, 79, 78, 73, - 195, 83, 76, 65, 86, 69, 128, 83, 76, 65, 83, 72, 128, 83, 76, 65, 83, - 200, 83, 76, 65, 78, 84, 69, 196, 83, 75, 87, 65, 128, 83, 75, 87, 128, - 83, 75, 85, 78, 75, 128, 83, 75, 85, 76, 76, 128, 83, 75, 85, 76, 204, - 83, 75, 79, 66, 65, 128, 83, 75, 76, 73, 82, 79, 206, 83, 75, 73, 78, - 128, 83, 75, 73, 69, 82, 128, 83, 75, 201, 83, 75, 69, 87, 69, 196, 83, - 75, 65, 84, 69, 66, 79, 65, 82, 68, 128, 83, 75, 65, 84, 69, 128, 83, 75, - 65, 77, 69, 89, 84, 83, 193, 83, 75, 128, 83, 74, 69, 128, 83, 73, 90, - 197, 83, 73, 88, 84, 89, 45, 70, 79, 85, 82, 84, 72, 83, 128, 83, 73, 88, - 84, 89, 45, 70, 79, 85, 82, 84, 72, 128, 83, 73, 88, 84, 89, 45, 70, 79, - 85, 82, 84, 200, 83, 73, 88, 84, 89, 128, 83, 73, 88, 84, 217, 83, 73, - 88, 84, 72, 83, 128, 83, 73, 88, 84, 72, 211, 83, 73, 88, 84, 72, 128, - 83, 73, 88, 84, 69, 69, 78, 84, 72, 83, 128, 83, 73, 88, 84, 69, 69, 78, - 84, 72, 45, 50, 128, 83, 73, 88, 84, 69, 69, 78, 84, 72, 45, 49, 128, 83, - 73, 88, 84, 69, 69, 78, 84, 72, 128, 83, 73, 88, 84, 69, 69, 78, 84, 200, - 83, 73, 88, 84, 69, 69, 78, 128, 83, 73, 88, 84, 69, 69, 206, 83, 73, 88, - 45, 84, 72, 73, 82, 84, 89, 128, 83, 73, 88, 45, 83, 84, 82, 73, 78, 199, - 83, 73, 88, 45, 80, 69, 82, 45, 69, 205, 83, 73, 88, 45, 76, 73, 78, 197, - 83, 73, 216, 83, 73, 84, 69, 128, 83, 73, 83, 65, 128, 83, 73, 82, 82, - 65, 72, 128, 83, 73, 82, 73, 78, 71, 85, 128, 83, 73, 79, 83, 45, 84, 72, - 73, 69, 85, 84, 72, 128, 83, 73, 79, 83, 45, 83, 83, 65, 78, 71, 83, 73, - 79, 83, 128, 83, 73, 79, 83, 45, 82, 73, 69, 85, 76, 128, 83, 73, 79, 83, - 45, 80, 73, 69, 85, 80, 45, 75, 73, 89, 69, 79, 75, 128, 83, 73, 79, 83, - 45, 80, 72, 73, 69, 85, 80, 72, 128, 83, 73, 79, 83, 45, 80, 65, 78, 83, - 73, 79, 83, 128, 83, 73, 79, 83, 45, 78, 73, 69, 85, 78, 128, 83, 73, 79, - 83, 45, 77, 73, 69, 85, 77, 128, 83, 73, 79, 83, 45, 75, 72, 73, 69, 85, - 75, 72, 128, 83, 73, 79, 83, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, - 69, 85, 80, 128, 83, 73, 79, 83, 45, 73, 69, 85, 78, 71, 128, 83, 73, 79, - 83, 45, 72, 73, 69, 85, 72, 128, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, - 128, 83, 73, 79, 83, 45, 67, 72, 73, 69, 85, 67, 72, 128, 83, 73, 79, - 211, 83, 73, 78, 85, 83, 79, 73, 196, 83, 73, 78, 79, 76, 79, 71, 73, 67, - 65, 204, 83, 73, 78, 78, 89, 73, 73, 89, 72, 69, 128, 83, 73, 78, 75, 73, - 78, 71, 128, 83, 73, 78, 71, 76, 69, 45, 83, 72, 73, 70, 84, 45, 51, 128, - 83, 73, 78, 71, 76, 69, 45, 83, 72, 73, 70, 84, 45, 50, 128, 83, 73, 78, - 71, 76, 69, 45, 76, 73, 78, 197, 83, 73, 78, 71, 76, 69, 128, 83, 73, 78, - 71, 76, 197, 83, 73, 78, 71, 65, 65, 84, 128, 83, 73, 78, 197, 83, 73, - 78, 68, 72, 201, 83, 73, 78, 128, 83, 73, 206, 83, 73, 77, 85, 76, 84, - 65, 78, 69, 79, 85, 83, 128, 83, 73, 77, 85, 76, 84, 65, 78, 69, 79, 85, - 211, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 83, 73, 77, 73, 76, 65, 82, - 128, 83, 73, 77, 73, 76, 65, 210, 83, 73, 77, 65, 78, 83, 73, 211, 83, - 73, 77, 65, 76, 85, 78, 71, 85, 206, 83, 73, 77, 65, 128, 83, 73, 76, 86, - 69, 82, 128, 83, 73, 76, 75, 128, 83, 73, 76, 73, 81, 85, 193, 83, 73, - 76, 72, 79, 85, 69, 84, 84, 69, 128, 83, 73, 76, 72, 79, 85, 69, 84, 84, - 197, 83, 73, 76, 65, 51, 128, 83, 73, 75, 73, 128, 83, 73, 75, 50, 128, - 83, 73, 75, 178, 83, 73, 71, 78, 83, 128, 83, 73, 71, 77, 79, 73, 196, - 83, 73, 71, 77, 65, 128, 83, 73, 71, 77, 193, 83, 73, 71, 69, 204, 83, - 73, 71, 52, 128, 83, 73, 71, 180, 83, 73, 71, 128, 83, 73, 69, 69, 128, - 83, 73, 68, 69, 87, 65, 89, 211, 83, 73, 68, 69, 128, 83, 73, 68, 197, - 83, 73, 68, 68, 72, 73, 128, 83, 73, 68, 68, 72, 65, 77, 128, 83, 73, 68, - 68, 72, 65, 205, 83, 73, 67, 75, 78, 69, 83, 83, 128, 83, 73, 67, 75, 76, - 69, 128, 83, 73, 66, 197, 83, 73, 65, 128, 83, 73, 45, 54, 128, 83, 73, - 45, 53, 128, 83, 73, 45, 52, 128, 83, 73, 45, 51, 128, 83, 73, 45, 50, - 128, 83, 73, 45, 49, 128, 83, 201, 83, 72, 89, 88, 128, 83, 72, 89, 84, - 128, 83, 72, 89, 82, 88, 128, 83, 72, 89, 82, 128, 83, 72, 89, 80, 128, - 83, 72, 89, 69, 128, 83, 72, 89, 65, 128, 83, 72, 89, 128, 83, 72, 87, - 79, 89, 128, 83, 72, 87, 79, 79, 128, 83, 72, 87, 79, 128, 83, 72, 87, - 73, 73, 128, 83, 72, 87, 73, 128, 83, 72, 87, 69, 128, 83, 72, 87, 197, - 83, 72, 87, 65, 65, 128, 83, 72, 87, 65, 128, 83, 72, 86, 128, 83, 72, - 85, 88, 128, 83, 72, 85, 85, 128, 83, 72, 85, 84, 84, 76, 69, 67, 79, 67, - 75, 128, 83, 72, 85, 84, 128, 83, 72, 85, 82, 88, 128, 83, 72, 85, 82, - 128, 83, 72, 85, 80, 128, 83, 72, 85, 79, 88, 128, 83, 72, 85, 79, 80, - 128, 83, 72, 85, 79, 128, 83, 72, 85, 77, 128, 83, 72, 85, 76, 128, 83, - 72, 85, 70, 70, 76, 197, 83, 72, 85, 69, 81, 128, 83, 72, 85, 69, 78, 83, - 72, 85, 69, 84, 128, 83, 72, 85, 66, 85, 82, 128, 83, 72, 85, 65, 78, 71, - 88, 73, 128, 83, 72, 85, 50, 128, 83, 72, 85, 178, 83, 72, 85, 128, 83, - 72, 84, 65, 80, 73, 67, 128, 83, 72, 84, 65, 128, 83, 72, 82, 85, 71, - 128, 83, 72, 82, 79, 79, 128, 83, 72, 82, 79, 128, 83, 72, 82, 73, 78, - 69, 128, 83, 72, 82, 73, 77, 80, 128, 83, 72, 82, 73, 73, 128, 83, 72, - 82, 73, 128, 83, 72, 82, 65, 65, 128, 83, 72, 82, 65, 128, 83, 72, 79, - 89, 128, 83, 72, 79, 88, 128, 83, 72, 79, 87, 69, 82, 128, 83, 72, 79, - 85, 76, 68, 69, 82, 69, 196, 83, 72, 79, 85, 76, 68, 69, 210, 83, 72, 79, - 85, 128, 83, 72, 79, 84, 128, 83, 72, 79, 82, 84, 83, 128, 83, 72, 79, - 82, 84, 211, 83, 72, 79, 82, 84, 72, 65, 78, 196, 83, 72, 79, 82, 84, 69, - 78, 69, 82, 128, 83, 72, 79, 82, 84, 67, 65, 75, 69, 128, 83, 72, 79, 82, - 84, 45, 84, 87, 73, 71, 45, 89, 82, 128, 83, 72, 79, 82, 84, 45, 84, 87, - 73, 71, 45, 84, 89, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 83, - 79, 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 79, 83, 211, 83, 72, - 79, 82, 84, 45, 84, 87, 73, 71, 45, 78, 65, 85, 196, 83, 72, 79, 82, 84, - 45, 84, 87, 73, 71, 45, 77, 65, 68, 210, 83, 72, 79, 82, 84, 45, 84, 87, - 73, 71, 45, 72, 65, 71, 65, 76, 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, - 71, 45, 66, 74, 65, 82, 75, 65, 206, 83, 72, 79, 82, 84, 45, 84, 87, 73, - 71, 45, 65, 210, 83, 72, 79, 82, 84, 128, 83, 72, 79, 82, 212, 83, 72, - 79, 81, 128, 83, 72, 79, 209, 83, 72, 79, 80, 80, 73, 78, 199, 83, 72, - 79, 80, 128, 83, 72, 79, 79, 84, 73, 78, 199, 83, 72, 79, 79, 84, 128, - 83, 72, 79, 79, 73, 128, 83, 72, 79, 79, 128, 83, 72, 79, 71, 201, 83, - 72, 79, 199, 83, 72, 79, 69, 83, 128, 83, 72, 79, 69, 128, 83, 72, 79, - 197, 83, 72, 79, 67, 75, 69, 196, 83, 72, 79, 65, 128, 83, 72, 79, 128, - 83, 72, 73, 89, 89, 65, 65, 76, 65, 65, 128, 83, 72, 73, 84, 65, 128, 83, - 72, 73, 84, 193, 83, 72, 73, 82, 212, 83, 72, 73, 82, 65, 69, 128, 83, - 72, 73, 82, 128, 83, 72, 73, 210, 83, 72, 73, 81, 128, 83, 72, 73, 78, - 84, 207, 83, 72, 73, 78, 73, 71, 128, 83, 72, 73, 78, 68, 193, 83, 72, - 73, 206, 83, 72, 73, 77, 65, 128, 83, 72, 73, 77, 193, 83, 72, 73, 77, - 128, 83, 72, 73, 205, 83, 72, 73, 73, 78, 128, 83, 72, 73, 73, 128, 83, - 72, 73, 70, 212, 83, 72, 73, 69, 76, 68, 128, 83, 72, 73, 68, 128, 83, - 72, 73, 196, 83, 72, 72, 65, 128, 83, 72, 72, 193, 83, 72, 69, 88, 128, - 83, 72, 69, 86, 65, 128, 83, 72, 69, 85, 88, 128, 83, 72, 69, 85, 79, 81, + 84, 128, 83, 85, 66, 84, 82, 65, 67, 84, 73, 79, 78, 128, 83, 85, 66, 83, + 84, 73, 84, 85, 84, 73, 79, 206, 83, 85, 66, 83, 84, 73, 84, 85, 84, 69, + 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 197, 83, 85, 66, 83, 69, 84, + 128, 83, 85, 66, 83, 69, 212, 83, 85, 66, 83, 67, 82, 73, 80, 212, 83, + 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, 85, 66, 76, 73, 78, 69, 65, + 210, 83, 85, 66, 76, 73, 77, 65, 84, 73, 79, 78, 128, 83, 85, 66, 76, 73, + 77, 65, 84, 69, 45, 51, 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 45, 50, + 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 128, 83, 85, 66, 76, 73, 77, 65, + 84, 197, 83, 85, 66, 74, 79, 73, 78, 69, 82, 128, 83, 85, 66, 74, 79, 73, + 78, 69, 196, 83, 85, 66, 74, 69, 67, 84, 128, 83, 85, 66, 73, 84, 79, + 128, 83, 85, 66, 72, 65, 65, 78, 65, 72, 213, 83, 85, 66, 71, 82, 79, 85, + 80, 128, 83, 85, 66, 71, 82, 79, 85, 208, 83, 85, 66, 128, 83, 85, 65, + 77, 128, 83, 85, 65, 69, 84, 128, 83, 85, 65, 69, 78, 128, 83, 85, 65, + 69, 128, 83, 85, 65, 66, 128, 83, 85, 65, 128, 83, 85, 45, 56, 128, 83, + 85, 45, 55, 128, 83, 85, 45, 54, 128, 83, 85, 45, 53, 128, 83, 85, 45, + 52, 128, 83, 85, 45, 51, 128, 83, 85, 45, 50, 128, 83, 85, 45, 49, 128, + 83, 213, 83, 84, 88, 128, 83, 84, 87, 65, 128, 83, 84, 85, 80, 65, 128, + 83, 84, 85, 70, 70, 69, 196, 83, 84, 85, 68, 89, 128, 83, 84, 85, 68, 73, + 207, 83, 84, 85, 67, 75, 45, 79, 85, 212, 83, 84, 83, 128, 83, 84, 82, + 79, 78, 199, 83, 84, 82, 79, 75, 69, 83, 128, 83, 84, 82, 79, 75, 69, + 211, 83, 84, 82, 79, 75, 69, 45, 57, 128, 83, 84, 82, 79, 75, 69, 45, 56, + 128, 83, 84, 82, 79, 75, 69, 45, 55, 128, 83, 84, 82, 79, 75, 69, 45, 54, + 128, 83, 84, 82, 79, 75, 69, 45, 53, 128, 83, 84, 82, 79, 75, 69, 45, 52, + 128, 83, 84, 82, 79, 75, 69, 45, 51, 128, 83, 84, 82, 79, 75, 69, 45, 50, + 128, 83, 84, 82, 79, 75, 69, 45, 49, 49, 128, 83, 84, 82, 79, 75, 69, 45, + 49, 48, 128, 83, 84, 82, 79, 75, 69, 45, 49, 128, 83, 84, 82, 79, 75, + 197, 83, 84, 82, 73, 80, 69, 128, 83, 84, 82, 73, 78, 71, 128, 83, 84, + 82, 73, 78, 199, 83, 84, 82, 73, 75, 69, 84, 72, 82, 79, 85, 71, 72, 128, + 83, 84, 82, 73, 75, 197, 83, 84, 82, 73, 68, 69, 128, 83, 84, 82, 73, 67, + 84, 76, 217, 83, 84, 82, 69, 84, 67, 72, 69, 196, 83, 84, 82, 69, 84, 67, + 72, 128, 83, 84, 82, 69, 83, 211, 83, 84, 82, 69, 78, 71, 84, 72, 128, + 83, 84, 82, 69, 76, 193, 83, 84, 82, 69, 65, 77, 69, 82, 128, 83, 84, 82, + 65, 87, 66, 69, 82, 82, 89, 128, 83, 84, 82, 65, 87, 128, 83, 84, 82, 65, + 84, 85, 77, 45, 50, 128, 83, 84, 82, 65, 84, 85, 77, 128, 83, 84, 82, 65, + 84, 85, 205, 83, 84, 82, 65, 84, 73, 65, 206, 83, 84, 82, 65, 78, 78, 79, + 128, 83, 84, 82, 65, 78, 78, 207, 83, 84, 82, 65, 73, 78, 69, 82, 128, + 83, 84, 82, 65, 73, 71, 72, 84, 78, 69, 83, 83, 128, 83, 84, 82, 65, 73, + 71, 72, 84, 128, 83, 84, 82, 65, 73, 71, 72, 212, 83, 84, 82, 65, 73, 70, + 128, 83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, 128, 83, 84, 79, 86, + 69, 128, 83, 84, 79, 82, 69, 128, 83, 84, 79, 80, 87, 65, 84, 67, 72, + 128, 83, 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 79, 80, 80, 65, 71, 69, + 128, 83, 84, 79, 80, 73, 84, 83, 65, 128, 83, 84, 79, 80, 73, 84, 83, + 193, 83, 84, 79, 80, 128, 83, 84, 79, 208, 83, 84, 79, 78, 69, 128, 83, + 84, 79, 67, 75, 128, 83, 84, 79, 67, 203, 83, 84, 73, 82, 82, 85, 208, + 83, 84, 73, 77, 77, 69, 128, 83, 84, 73, 76, 204, 83, 84, 73, 76, 197, + 83, 84, 73, 71, 77, 65, 128, 83, 84, 73, 67, 75, 73, 78, 199, 83, 84, 73, + 67, 203, 83, 84, 69, 84, 72, 79, 83, 67, 79, 80, 69, 128, 83, 84, 69, 82, + 69, 79, 128, 83, 84, 69, 80, 128, 83, 84, 69, 78, 79, 71, 82, 65, 80, 72, + 73, 195, 83, 84, 69, 77, 128, 83, 84, 69, 65, 77, 217, 83, 84, 69, 65, + 77, 73, 78, 199, 83, 84, 69, 65, 77, 128, 83, 84, 69, 65, 205, 83, 84, + 65, 86, 82, 79, 85, 128, 83, 84, 65, 86, 82, 79, 83, 128, 83, 84, 65, 86, + 82, 79, 211, 83, 84, 65, 85, 82, 79, 83, 128, 83, 84, 65, 84, 89, 65, + 128, 83, 84, 65, 84, 89, 193, 83, 84, 65, 84, 85, 197, 83, 84, 65, 84, + 73, 79, 78, 128, 83, 84, 65, 84, 69, 82, 83, 128, 83, 84, 65, 84, 69, + 128, 83, 84, 65, 82, 84, 73, 78, 199, 83, 84, 65, 82, 84, 128, 83, 84, + 65, 82, 212, 83, 84, 65, 82, 83, 128, 83, 84, 65, 82, 82, 69, 196, 83, + 84, 65, 82, 75, 128, 83, 84, 65, 82, 128, 83, 84, 65, 210, 83, 84, 65, + 78, 68, 83, 84, 73, 76, 76, 128, 83, 84, 65, 78, 68, 73, 78, 199, 83, 84, + 65, 78, 68, 65, 82, 196, 83, 84, 65, 78, 68, 128, 83, 84, 65, 78, 128, + 83, 84, 65, 77, 80, 69, 196, 83, 84, 65, 76, 76, 73, 79, 78, 128, 83, 84, + 65, 70, 70, 128, 83, 84, 65, 70, 198, 83, 84, 65, 68, 73, 85, 77, 128, + 83, 84, 65, 67, 75, 69, 196, 83, 84, 65, 67, 67, 65, 84, 79, 128, 83, 84, + 65, 67, 67, 65, 84, 73, 83, 83, 73, 77, 79, 128, 83, 84, 50, 128, 83, 83, + 89, 88, 128, 83, 83, 89, 84, 128, 83, 83, 89, 82, 88, 128, 83, 83, 89, + 82, 128, 83, 83, 89, 80, 128, 83, 83, 89, 128, 83, 83, 85, 88, 128, 83, + 83, 85, 85, 128, 83, 83, 85, 84, 128, 83, 83, 85, 80, 128, 83, 83, 79, + 88, 128, 83, 83, 79, 84, 128, 83, 83, 79, 80, 128, 83, 83, 79, 79, 128, + 83, 83, 79, 128, 83, 83, 73, 88, 128, 83, 83, 73, 84, 128, 83, 83, 73, + 80, 128, 83, 83, 73, 73, 128, 83, 83, 73, 69, 88, 128, 83, 83, 73, 69, + 80, 128, 83, 83, 73, 69, 128, 83, 83, 72, 73, 78, 128, 83, 83, 72, 69, + 128, 83, 83, 69, 88, 128, 83, 83, 69, 80, 128, 83, 83, 69, 69, 128, 83, + 83, 65, 88, 128, 83, 83, 65, 85, 128, 83, 83, 65, 84, 128, 83, 83, 65, + 80, 128, 83, 83, 65, 78, 71, 89, 69, 83, 73, 69, 85, 78, 71, 128, 83, 83, + 65, 78, 71, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 83, 83, 65, + 78, 71, 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, 128, 83, 83, 65, + 78, 71, 84, 73, 75, 69, 85, 84, 128, 83, 83, 65, 78, 71, 84, 72, 73, 69, + 85, 84, 72, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 84, 73, 75, 69, + 85, 84, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, + 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, + 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 83, 65, 78, 71, 82, 73, 69, + 85, 76, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, 83, 65, 78, 71, 82, 73, + 69, 85, 76, 128, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 83, 83, 65, + 78, 71, 78, 73, 69, 85, 78, 128, 83, 83, 65, 78, 71, 77, 73, 69, 85, 77, + 128, 83, 83, 65, 78, 71, 73, 69, 85, 78, 71, 128, 83, 83, 65, 78, 71, 72, + 73, 69, 85, 72, 128, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 45, 72, 73, + 69, 85, 72, 128, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, 83, 83, 65, + 78, 71, 65, 82, 65, 69, 65, 128, 83, 83, 65, 73, 128, 83, 83, 65, 65, + 128, 83, 83, 51, 128, 83, 83, 50, 128, 83, 82, 69, 68, 78, 197, 83, 82, + 128, 83, 81, 85, 73, 83, 200, 83, 81, 85, 73, 82, 82, 69, 204, 83, 81, + 85, 73, 71, 71, 76, 197, 83, 81, 85, 73, 68, 128, 83, 81, 85, 69, 69, 90, + 69, 68, 128, 83, 81, 85, 69, 69, 90, 197, 83, 81, 85, 65, 212, 83, 81, + 85, 65, 82, 69, 83, 128, 83, 81, 85, 65, 82, 69, 68, 128, 83, 81, 85, 65, + 82, 69, 128, 83, 80, 89, 128, 83, 80, 87, 65, 128, 83, 80, 85, 78, 71, + 211, 83, 80, 82, 79, 85, 84, 128, 83, 80, 82, 73, 78, 71, 83, 128, 83, + 80, 82, 73, 78, 71, 128, 83, 80, 82, 69, 67, 72, 71, 69, 83, 65, 78, 199, + 83, 80, 82, 69, 65, 68, 128, 83, 80, 82, 69, 65, 196, 83, 80, 79, 85, 84, + 73, 78, 199, 83, 80, 79, 84, 128, 83, 80, 79, 82, 84, 211, 83, 80, 79, + 79, 78, 128, 83, 80, 79, 79, 204, 83, 80, 79, 78, 71, 69, 128, 83, 80, + 79, 128, 83, 80, 76, 73, 84, 84, 73, 78, 199, 83, 80, 76, 73, 84, 128, + 83, 80, 76, 73, 212, 83, 80, 76, 65, 89, 69, 68, 128, 83, 80, 76, 65, 83, + 72, 73, 78, 199, 83, 80, 73, 82, 73, 84, 85, 211, 83, 80, 73, 82, 73, 84, + 128, 83, 80, 73, 82, 73, 212, 83, 80, 73, 82, 65, 78, 84, 128, 83, 80, + 73, 82, 65, 76, 128, 83, 80, 73, 82, 65, 204, 83, 80, 73, 78, 69, 128, + 83, 80, 73, 68, 69, 82, 217, 83, 80, 73, 68, 69, 82, 128, 83, 80, 73, 68, + 69, 210, 83, 80, 73, 67, 69, 128, 83, 80, 73, 128, 83, 80, 72, 69, 82, + 73, 67, 65, 204, 83, 80, 69, 83, 77, 73, 76, 207, 83, 80, 69, 78, 212, + 83, 80, 69, 69, 68, 66, 79, 65, 84, 128, 83, 80, 69, 69, 67, 72, 128, 83, + 80, 69, 69, 67, 200, 83, 80, 69, 67, 73, 65, 76, 128, 83, 80, 69, 65, 82, + 128, 83, 80, 69, 65, 75, 73, 78, 199, 83, 80, 69, 65, 75, 69, 82, 128, + 83, 80, 69, 65, 75, 69, 210, 83, 80, 69, 65, 75, 45, 78, 79, 45, 69, 86, + 73, 204, 83, 80, 69, 128, 83, 80, 65, 84, 72, 73, 128, 83, 80, 65, 82, + 75, 76, 73, 78, 199, 83, 80, 65, 82, 75, 76, 69, 83, 128, 83, 80, 65, 82, + 75, 76, 69, 82, 128, 83, 80, 65, 82, 75, 76, 69, 128, 83, 80, 65, 71, 72, + 69, 84, 84, 73, 128, 83, 80, 65, 68, 69, 83, 128, 83, 80, 65, 68, 197, + 83, 80, 65, 67, 73, 78, 199, 83, 80, 65, 67, 197, 83, 80, 65, 128, 83, + 79, 89, 79, 77, 66, 207, 83, 79, 89, 128, 83, 79, 87, 73, 76, 207, 83, + 79, 87, 128, 83, 79, 85, 84, 72, 69, 82, 206, 83, 79, 85, 84, 72, 45, 83, + 76, 65, 86, 69, 217, 83, 79, 85, 84, 200, 83, 79, 85, 82, 67, 69, 128, + 83, 79, 85, 78, 68, 128, 83, 79, 85, 78, 196, 83, 79, 85, 78, 65, 80, + 128, 83, 79, 85, 128, 83, 79, 83, 128, 83, 79, 82, 79, 67, 72, 89, 193, + 83, 79, 82, 73, 128, 83, 79, 82, 193, 83, 79, 81, 128, 83, 79, 79, 206, + 83, 79, 78, 74, 65, 77, 128, 83, 79, 78, 71, 128, 83, 79, 78, 128, 83, + 79, 77, 80, 69, 78, 199, 83, 79, 77, 128, 83, 79, 205, 83, 79, 76, 73, + 68, 85, 83, 128, 83, 79, 76, 73, 68, 85, 211, 83, 79, 76, 73, 196, 83, + 79, 76, 68, 73, 69, 82, 128, 83, 79, 72, 128, 83, 79, 71, 68, 73, 65, + 206, 83, 79, 70, 84, 87, 65, 82, 69, 45, 70, 85, 78, 67, 84, 73, 79, 206, + 83, 79, 70, 84, 78, 69, 83, 83, 128, 83, 79, 70, 84, 66, 65, 76, 76, 128, + 83, 79, 70, 212, 83, 79, 198, 83, 79, 67, 75, 83, 128, 83, 79, 67, 73, + 69, 84, 89, 128, 83, 79, 67, 67, 69, 210, 83, 79, 65, 80, 128, 83, 79, + 65, 128, 83, 79, 45, 55, 128, 83, 79, 45, 54, 128, 83, 79, 45, 53, 128, + 83, 79, 45, 52, 128, 83, 79, 45, 51, 128, 83, 79, 45, 50, 128, 83, 79, + 45, 49, 128, 83, 207, 83, 78, 79, 87, 77, 65, 78, 128, 83, 78, 79, 87, + 77, 65, 206, 83, 78, 79, 87, 70, 76, 65, 75, 69, 128, 83, 78, 79, 87, 66, + 79, 65, 82, 68, 69, 82, 128, 83, 78, 79, 87, 128, 83, 78, 79, 215, 83, + 78, 79, 85, 84, 128, 83, 78, 79, 85, 212, 83, 78, 69, 69, 90, 73, 78, + 199, 83, 78, 65, 208, 83, 78, 65, 75, 69, 128, 83, 78, 65, 75, 197, 83, + 78, 65, 73, 76, 128, 83, 78, 193, 83, 77, 79, 75, 73, 78, 199, 83, 77, + 73, 82, 75, 73, 78, 199, 83, 77, 73, 76, 73, 78, 199, 83, 77, 73, 76, 69, + 128, 83, 77, 73, 76, 197, 83, 77, 69, 65, 82, 128, 83, 77, 65, 83, 200, + 83, 77, 65, 76, 76, 69, 210, 83, 77, 65, 76, 76, 128, 83, 76, 85, 82, + 128, 83, 76, 79, 90, 72, 73, 84, 73, 69, 128, 83, 76, 79, 90, 72, 73, 84, + 73, 197, 83, 76, 79, 87, 76, 89, 128, 83, 76, 79, 87, 128, 83, 76, 79, + 215, 83, 76, 79, 86, 79, 128, 83, 76, 79, 84, 72, 128, 83, 76, 79, 212, + 83, 76, 79, 80, 73, 78, 199, 83, 76, 79, 80, 69, 128, 83, 76, 79, 65, + 206, 83, 76, 73, 78, 71, 128, 83, 76, 73, 71, 72, 84, 76, 217, 83, 76, + 73, 68, 73, 78, 71, 128, 83, 76, 73, 68, 69, 82, 128, 83, 76, 73, 68, 69, + 128, 83, 76, 73, 67, 69, 128, 83, 76, 73, 67, 197, 83, 76, 69, 85, 84, + 200, 83, 76, 69, 69, 80, 217, 83, 76, 69, 69, 80, 73, 78, 199, 83, 76, + 69, 69, 208, 83, 76, 69, 68, 128, 83, 76, 65, 86, 79, 78, 73, 195, 83, + 76, 65, 86, 69, 128, 83, 76, 65, 83, 72, 128, 83, 76, 65, 83, 200, 83, + 76, 65, 78, 84, 69, 196, 83, 75, 87, 65, 128, 83, 75, 87, 128, 83, 75, + 85, 78, 75, 128, 83, 75, 85, 76, 76, 128, 83, 75, 85, 76, 204, 83, 75, + 79, 66, 65, 128, 83, 75, 76, 73, 82, 79, 206, 83, 75, 73, 78, 128, 83, + 75, 73, 69, 82, 128, 83, 75, 201, 83, 75, 69, 87, 69, 196, 83, 75, 65, + 84, 69, 66, 79, 65, 82, 68, 128, 83, 75, 65, 84, 69, 128, 83, 75, 65, 77, + 69, 89, 84, 83, 193, 83, 75, 128, 83, 74, 69, 128, 83, 73, 90, 197, 83, + 73, 88, 84, 89, 45, 70, 79, 85, 82, 84, 72, 83, 128, 83, 73, 88, 84, 89, + 45, 70, 79, 85, 82, 84, 72, 128, 83, 73, 88, 84, 89, 45, 70, 79, 85, 82, + 84, 200, 83, 73, 88, 84, 89, 128, 83, 73, 88, 84, 217, 83, 73, 88, 84, + 72, 83, 128, 83, 73, 88, 84, 72, 211, 83, 73, 88, 84, 72, 128, 83, 73, + 88, 84, 69, 69, 78, 84, 72, 83, 128, 83, 73, 88, 84, 69, 69, 78, 84, 72, + 45, 50, 128, 83, 73, 88, 84, 69, 69, 78, 84, 72, 45, 49, 128, 83, 73, 88, + 84, 69, 69, 78, 84, 72, 128, 83, 73, 88, 84, 69, 69, 78, 84, 200, 83, 73, + 88, 84, 69, 69, 78, 128, 83, 73, 88, 84, 69, 69, 206, 83, 73, 88, 45, 84, + 72, 73, 82, 84, 89, 128, 83, 73, 88, 45, 83, 84, 82, 73, 78, 199, 83, 73, + 88, 45, 80, 69, 82, 45, 69, 205, 83, 73, 88, 45, 76, 73, 78, 197, 83, 73, + 216, 83, 73, 84, 69, 128, 83, 73, 83, 65, 128, 83, 73, 82, 82, 65, 72, + 128, 83, 73, 82, 73, 78, 71, 85, 128, 83, 73, 79, 83, 45, 84, 72, 73, 69, + 85, 84, 72, 128, 83, 73, 79, 83, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, + 128, 83, 73, 79, 83, 45, 82, 73, 69, 85, 76, 128, 83, 73, 79, 83, 45, 80, + 73, 69, 85, 80, 45, 75, 73, 89, 69, 79, 75, 128, 83, 73, 79, 83, 45, 80, + 72, 73, 69, 85, 80, 72, 128, 83, 73, 79, 83, 45, 80, 65, 78, 83, 73, 79, + 83, 128, 83, 73, 79, 83, 45, 78, 73, 69, 85, 78, 128, 83, 73, 79, 83, 45, + 77, 73, 69, 85, 77, 128, 83, 73, 79, 83, 45, 75, 72, 73, 69, 85, 75, 72, + 128, 83, 73, 79, 83, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, + 80, 128, 83, 73, 79, 83, 45, 73, 69, 85, 78, 71, 128, 83, 73, 79, 83, 45, + 72, 73, 69, 85, 72, 128, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 83, + 73, 79, 83, 45, 67, 72, 73, 69, 85, 67, 72, 128, 83, 73, 79, 211, 83, 73, + 78, 85, 83, 79, 73, 196, 83, 73, 78, 79, 76, 79, 71, 73, 67, 65, 204, 83, + 73, 78, 78, 89, 73, 73, 89, 72, 69, 128, 83, 73, 78, 75, 73, 78, 71, 128, + 83, 73, 78, 71, 76, 69, 45, 83, 72, 73, 70, 84, 45, 51, 128, 83, 73, 78, + 71, 76, 69, 45, 83, 72, 73, 70, 84, 45, 50, 128, 83, 73, 78, 71, 76, 69, + 45, 76, 73, 78, 197, 83, 73, 78, 71, 76, 69, 128, 83, 73, 78, 71, 76, + 197, 83, 73, 78, 71, 65, 65, 84, 128, 83, 73, 78, 197, 83, 73, 78, 68, + 72, 201, 83, 73, 78, 128, 83, 73, 206, 83, 73, 77, 85, 76, 84, 65, 78, + 69, 79, 85, 83, 128, 83, 73, 77, 85, 76, 84, 65, 78, 69, 79, 85, 211, 83, + 73, 77, 80, 76, 73, 70, 73, 69, 196, 83, 73, 77, 73, 76, 65, 82, 128, 83, + 73, 77, 73, 76, 65, 210, 83, 73, 77, 65, 78, 83, 73, 211, 83, 73, 77, 65, + 76, 85, 78, 71, 85, 206, 83, 73, 77, 65, 128, 83, 73, 76, 86, 69, 82, + 128, 83, 73, 76, 75, 128, 83, 73, 76, 73, 81, 85, 193, 83, 73, 76, 72, + 79, 85, 69, 84, 84, 69, 128, 83, 73, 76, 72, 79, 85, 69, 84, 84, 197, 83, + 73, 76, 65, 51, 128, 83, 73, 75, 73, 128, 83, 73, 75, 50, 128, 83, 73, + 75, 178, 83, 73, 71, 78, 83, 128, 83, 73, 71, 77, 79, 73, 196, 83, 73, + 71, 77, 65, 128, 83, 73, 71, 77, 193, 83, 73, 71, 69, 204, 83, 73, 71, + 52, 128, 83, 73, 71, 180, 83, 73, 71, 128, 83, 73, 69, 69, 128, 83, 73, + 68, 69, 87, 65, 89, 211, 83, 73, 68, 69, 128, 83, 73, 68, 197, 83, 73, + 68, 68, 72, 73, 128, 83, 73, 68, 68, 72, 65, 77, 128, 83, 73, 68, 68, 72, + 65, 205, 83, 73, 67, 75, 78, 69, 83, 83, 128, 83, 73, 67, 75, 76, 69, + 128, 83, 73, 66, 197, 83, 73, 65, 128, 83, 73, 45, 54, 128, 83, 73, 45, + 53, 128, 83, 73, 45, 52, 128, 83, 73, 45, 51, 128, 83, 73, 45, 50, 128, + 83, 73, 45, 49, 128, 83, 201, 83, 72, 89, 88, 128, 83, 72, 89, 84, 128, + 83, 72, 89, 82, 88, 128, 83, 72, 89, 82, 128, 83, 72, 89, 80, 128, 83, + 72, 89, 69, 128, 83, 72, 89, 65, 128, 83, 72, 89, 128, 83, 72, 87, 79, + 89, 128, 83, 72, 87, 79, 79, 128, 83, 72, 87, 79, 128, 83, 72, 87, 73, + 73, 128, 83, 72, 87, 73, 128, 83, 72, 87, 69, 128, 83, 72, 87, 197, 83, + 72, 87, 65, 65, 128, 83, 72, 87, 65, 128, 83, 72, 86, 128, 83, 72, 85, + 88, 128, 83, 72, 85, 85, 128, 83, 72, 85, 84, 84, 76, 69, 67, 79, 67, 75, + 128, 83, 72, 85, 84, 128, 83, 72, 85, 82, 88, 128, 83, 72, 85, 82, 128, + 83, 72, 85, 80, 128, 83, 72, 85, 79, 88, 128, 83, 72, 85, 79, 80, 128, + 83, 72, 85, 79, 128, 83, 72, 85, 77, 128, 83, 72, 85, 76, 128, 83, 72, + 85, 70, 70, 76, 197, 83, 72, 85, 69, 81, 128, 83, 72, 85, 69, 78, 83, 72, + 85, 69, 84, 128, 83, 72, 85, 66, 85, 82, 128, 83, 72, 85, 65, 78, 71, 88, + 73, 128, 83, 72, 85, 50, 128, 83, 72, 85, 178, 83, 72, 85, 128, 83, 72, + 84, 65, 80, 73, 67, 128, 83, 72, 84, 65, 128, 83, 72, 82, 85, 71, 128, + 83, 72, 82, 79, 79, 128, 83, 72, 82, 79, 128, 83, 72, 82, 73, 78, 69, + 128, 83, 72, 82, 73, 77, 80, 128, 83, 72, 82, 73, 73, 128, 83, 72, 82, + 73, 128, 83, 72, 82, 65, 65, 128, 83, 72, 82, 65, 128, 83, 72, 79, 89, + 128, 83, 72, 79, 88, 128, 83, 72, 79, 87, 69, 82, 128, 83, 72, 79, 85, + 76, 68, 69, 82, 69, 196, 83, 72, 79, 85, 76, 68, 69, 210, 83, 72, 79, 85, + 128, 83, 72, 79, 84, 128, 83, 72, 79, 82, 84, 83, 128, 83, 72, 79, 82, + 84, 211, 83, 72, 79, 82, 84, 72, 65, 78, 196, 83, 72, 79, 82, 84, 69, 78, + 69, 82, 128, 83, 72, 79, 82, 84, 67, 65, 75, 69, 128, 83, 72, 79, 82, 84, + 45, 84, 87, 73, 71, 45, 89, 82, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, + 71, 45, 84, 89, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 83, 79, + 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 79, 83, 211, 83, 72, 79, + 82, 84, 45, 84, 87, 73, 71, 45, 78, 65, 85, 196, 83, 72, 79, 82, 84, 45, + 84, 87, 73, 71, 45, 77, 65, 68, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, + 71, 45, 72, 65, 71, 65, 76, 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, + 45, 66, 74, 65, 82, 75, 65, 206, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, + 45, 65, 210, 83, 72, 79, 82, 84, 128, 83, 72, 79, 82, 212, 83, 72, 79, + 81, 128, 83, 72, 79, 209, 83, 72, 79, 80, 80, 73, 78, 199, 83, 72, 79, + 80, 128, 83, 72, 79, 79, 84, 73, 78, 199, 83, 72, 79, 79, 84, 128, 83, + 72, 79, 79, 73, 128, 83, 72, 79, 79, 128, 83, 72, 79, 71, 201, 83, 72, + 79, 199, 83, 72, 79, 69, 83, 128, 83, 72, 79, 69, 128, 83, 72, 79, 197, + 83, 72, 79, 67, 75, 69, 196, 83, 72, 79, 65, 128, 83, 72, 79, 128, 83, + 72, 73, 89, 89, 65, 65, 76, 65, 65, 128, 83, 72, 73, 84, 65, 128, 83, 72, + 73, 84, 193, 83, 72, 73, 82, 212, 83, 72, 73, 82, 65, 69, 128, 83, 72, + 73, 82, 128, 83, 72, 73, 210, 83, 72, 73, 81, 128, 83, 72, 73, 78, 84, + 207, 83, 72, 73, 78, 73, 71, 128, 83, 72, 73, 78, 68, 193, 83, 72, 73, + 206, 83, 72, 73, 77, 65, 128, 83, 72, 73, 77, 193, 83, 72, 73, 77, 128, + 83, 72, 73, 205, 83, 72, 73, 73, 78, 128, 83, 72, 73, 73, 128, 83, 72, + 73, 70, 212, 83, 72, 73, 69, 76, 68, 128, 83, 72, 73, 68, 128, 83, 72, + 73, 196, 83, 72, 72, 65, 128, 83, 72, 72, 193, 83, 72, 69, 88, 128, 83, + 72, 69, 86, 65, 128, 83, 72, 69, 85, 88, 128, 83, 72, 69, 85, 79, 81, 128, 83, 72, 69, 85, 65, 69, 81, 84, 85, 128, 83, 72, 69, 85, 65, 69, 81, 128, 83, 72, 69, 85, 65, 69, 128, 83, 72, 69, 84, 128, 83, 72, 69, 212, 83, 72, 69, 83, 72, 76, 65, 77, 128, 83, 72, 69, 83, 72, 73, 71, 128, 83, @@ -1655,239 +1656,240 @@ static const unsigned char lexicon[] = { 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, 68, 73, - 78, 199, 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, 83, 69, 75, 65, 128, 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, 86, 78, 79, 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, 73, 77, 65, 72, - 85, 205, 82, 65, 72, 73, 77, 65, 72, 213, 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, 68, 68, 73, 83, 193, - 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, 79, 65, 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, 83, 82, 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, 78, 65, 89, 65, 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, 84, 65, 89, 65, - 128, 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, 90, 78, 65, 203, 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, 86, 89, 83, 72, 69, 128, 80, 79, 86, 89, 83, 72, 197, 80, - 79, 86, 79, 68, 78, 89, 128, 80, 79, 85, 82, 73, 78, 199, 80, 79, 85, 78, - 196, 80, 79, 85, 76, 84, 82, 217, 80, 79, 85, 67, 72, 128, 80, 79, 84, - 84, 69, 196, 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, 85, 80, 79, 86, 79, 68, 78, 65, 89, 65, 128, 80, 79, 76, 79, - 128, 80, 79, 76, 78, 65, 89, 65, 128, 80, 79, 76, 76, 85, 128, 80, 79, - 76, 75, 85, 76, 73, 90, 77, 89, 128, 80, 79, 76, 73, 83, 72, 128, 80, 79, - 76, 73, 83, 200, 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, 86, 69, 82, 84, 75, 65, 128, 80, 79, 68, - 67, 72, 65, 83, 72, 73, 69, 77, 128, 80, 79, 68, 67, 72, 65, 83, 72, 73, - 69, 128, 80, 79, 68, 67, 72, 65, 83, 72, 73, 197, 80, 79, 68, 65, 84, 85, - 83, 128, 80, 79, 67, 75, 69, 212, 80, 79, 65, 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, 78, 71, 69, 82, 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, - 89, 71, 82, 79, 85, 78, 196, 80, 76, 65, 84, 69, 128, 80, 76, 65, 83, 84, - 73, 67, 83, 128, 80, 76, 65, 78, 84, 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, 67, 65, 82, 68, 128, 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, - 203, 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, 67, 72, 69, 196, 80, 73, 78, 65, 84, - 65, 128, 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, 85, - 208, 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, 84, 82, 197, 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, 71, 128, 80, 72, - 82, 65, 83, 69, 128, 80, 72, 79, 78, 69, 83, 128, 80, 72, 79, 76, 85, 83, - 128, 80, 72, 79, 69, 78, 73, 67, 73, 65, 206, 80, 72, 79, 65, 128, 80, - 72, 79, 128, 80, 72, 207, 80, 72, 78, 65, 69, 203, 80, 72, 73, 78, 84, - 72, 85, 128, 80, 72, 73, 76, 79, 83, 79, 80, 72, 69, 82, 211, 80, 72, 73, - 76, 73, 80, 80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, 45, 84, 72, 73, - 69, 85, 84, 72, 128, 80, 72, 73, 69, 85, 80, 72, 45, 83, 73, 79, 83, 128, - 80, 72, 73, 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, 80, 72, 73, 69, - 85, 80, 72, 45, 72, 73, 69, 85, 72, 128, 80, 72, 73, 69, 85, 80, 200, 80, - 72, 73, 128, 80, 72, 201, 80, 72, 69, 69, 128, 80, 72, 69, 128, 80, 72, - 65, 83, 69, 45, 198, 80, 72, 65, 83, 69, 45, 195, 80, 72, 65, 83, 69, 45, - 194, 80, 72, 65, 83, 69, 45, 193, 80, 72, 65, 82, 89, 78, 71, 69, 65, - 204, 80, 72, 65, 82, 128, 80, 72, 65, 78, 128, 80, 72, 65, 77, 128, 80, - 72, 65, 73, 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, 80, 193, 80, 72, 65, - 66, 128, 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, 128, 80, - 71, 128, 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 85, 84, 65, 69, 128, - 80, 69, 85, 84, 128, 80, 69, 84, 82, 201, 80, 69, 84, 65, 83, 84, 79, 75, - 79, 85, 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 69, - 84, 65, 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, 196, 80, 69, 83, 79, + 70, 76, 69, 67, 84, 73, 79, 78, 128, 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, 68, 73, 78, 199, 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, 83, 69, 75, 65, 128, 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, 86, 78, + 79, 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, 73, 77, 65, 72, 85, 205, 82, 65, 72, + 73, 77, 65, 72, 213, 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, 68, 68, 73, 83, 193, 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, 79, 65, 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, 83, 82, 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, 78, 65, 89, 65, 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, 84, 65, 89, 65, 128, 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, 90, 78, 65, 203, 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, 86, + 89, 83, 72, 69, 128, 80, 79, 86, 89, 83, 72, 197, 80, 79, 86, 79, 68, 78, + 89, 128, 80, 79, 85, 82, 73, 78, 199, 80, 79, 85, 78, 196, 80, 79, 85, + 76, 84, 82, 217, 80, 79, 85, 67, 72, 128, 80, 79, 84, 84, 69, 196, 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, + 85, 80, 79, 86, 79, 68, 78, 65, 89, 65, 128, 80, 79, 76, 79, 128, 80, 79, + 76, 78, 65, 89, 65, 128, 80, 79, 76, 76, 85, 128, 80, 79, 76, 75, 85, 76, + 73, 90, 77, 89, 128, 80, 79, 76, 73, 83, 72, 128, 80, 79, 76, 73, 83, + 200, 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, 86, 69, 82, 84, 75, 65, 128, 80, 79, 68, 67, 72, 65, 83, + 72, 73, 69, 77, 128, 80, 79, 68, 67, 72, 65, 83, 72, 73, 69, 128, 80, 79, + 68, 67, 72, 65, 83, 72, 73, 197, 80, 79, 68, 65, 84, 85, 83, 128, 80, 79, + 67, 75, 69, 212, 80, 79, 65, 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, 78, 71, 69, 82, 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, 89, 71, + 82, 79, 85, 78, 196, 80, 76, 65, 84, 69, 128, 80, 76, 65, 83, 84, 73, 67, + 83, 128, 80, 76, 65, 78, 84, 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, + 67, 65, 82, 68, 128, 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, 203, 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, 67, 72, 69, 196, 80, 73, 78, 65, 84, 65, 128, 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, 85, 208, 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, 84, 82, 197, 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, 71, 128, 80, 72, 82, 65, 83, 69, + 128, 80, 72, 79, 78, 69, 83, 128, 80, 72, 79, 76, 85, 83, 128, 80, 72, + 79, 69, 78, 73, 67, 73, 65, 206, 80, 72, 79, 65, 128, 80, 72, 79, 128, + 80, 72, 207, 80, 72, 78, 65, 69, 203, 80, 72, 73, 78, 84, 72, 85, 128, + 80, 72, 73, 76, 79, 83, 79, 80, 72, 69, 82, 211, 80, 72, 73, 76, 73, 80, + 80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, 45, 84, 72, 73, 69, 85, 84, + 72, 128, 80, 72, 73, 69, 85, 80, 72, 45, 83, 73, 79, 83, 128, 80, 72, 73, + 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, 80, 72, 73, 69, 85, 80, 72, + 45, 72, 73, 69, 85, 72, 128, 80, 72, 73, 69, 85, 80, 200, 80, 72, 73, + 128, 80, 72, 201, 80, 72, 69, 69, 128, 80, 72, 69, 128, 80, 72, 65, 83, + 69, 45, 198, 80, 72, 65, 83, 69, 45, 195, 80, 72, 65, 83, 69, 45, 194, + 80, 72, 65, 83, 69, 45, 193, 80, 72, 65, 82, 89, 78, 71, 69, 65, 204, 80, + 72, 65, 82, 128, 80, 72, 65, 78, 128, 80, 72, 65, 77, 128, 80, 72, 65, + 73, 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, 80, 193, 80, 72, 65, 66, + 128, 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, 128, 80, 71, + 128, 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 85, 84, 65, 69, 128, 80, + 69, 85, 84, 128, 80, 69, 84, 82, 201, 80, 69, 84, 65, 83, 84, 79, 75, 79, + 85, 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 69, 84, + 65, 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, 196, 80, 69, 83, 79, 128, 80, 69, 83, 207, 80, 69, 83, 72, 50, 128, 80, 69, 83, 72, 178, 80, 69, 83, 69, 84, 193, 80, 69, 211, 80, 69, 82, 84, 72, 207, 80, 69, 82, 83, 80, 69, 67, 84, 73, 86, 69, 128, 80, 69, 82, 83, 79, 78, 65, 204, 80, @@ -7120,9 +7122,9 @@ static const unsigned int lexicon_offset[] = { 593, 598, 606, 615, 618, 625, 629, 633, 637, 642, 645, 652, 659, 666, 671, 676, 683, 692, 694, 703, 707, 715, 719, 727, 281, 736, 749, 753, 758, 761, 765, 769, 771, 776, 786, 792, 796, 802, 806, 809, 814, 823, - 828, 832, 774, 838, 846, 854, 859, 868, 877, 885, 891, 902, 905, 910, + 828, 832, 774, 838, 846, 857, 865, 870, 879, 888, 896, 902, 905, 910, 918, 925, 928, 938, 943, 949, 953, 957, 960, 967, 974, 977, 981, 984, - 657, 990, 993, 996, 1002, 1007, 1016, 1021, 1025, 1028, 1032, 1035, 1041, + 657, 990, 993, 996, 1002, 1007, 1016, 1021, 1027, 1031, 1034, 1038, 1041, 1046, 1050, 617, 1055, 1058, 1067, 1070, 1075, 1080, 1086, 1091, 1096, 1101, 1105, 1110, 1116, 1121, 1126, 1130, 1136, 1141, 1146, 1151, 1155, 1160, 1165, 1170, 1176, 1182, 1188, 1193, 1197, 1202, 1207, 1212, 1216, @@ -7177,7 +7179,7 @@ static const unsigned int lexicon_offset[] = { 2172, 4008, 4012, 4015, 4021, 4026, 4032, 4038, 4043, 4050, 4054, 4058, 4062, 4067, 4072, 4077, 4082, 4087, 4092, 634, 616, 1264, 4097, 4104, 4111, 4117, 4126, 4131, 4138, 4145, 4150, 4156, 4162, 4167, 4172, 4176, - 4182, 4189, 4194, 4198, 4202, 2181, 4208, 4216, 4222, 4230, 863, 4236, + 4182, 4189, 4194, 4198, 4202, 2181, 4208, 4216, 4222, 4230, 874, 4236, 4244, 4255, 4259, 4269, 4275, 4280, 4285, 4290, 4295, 2186, 4300, 4305, 4320, 4326, 4333, 4344, 4354, 4360, 4365, 4371, 4377, 4380, 4383, 4387, 4392, 4395, 4402, 4411, 4416, 4420, 4424, 4428, 4432, 4437, 4443, 4454, @@ -7355,9505 +7357,9508 @@ static const unsigned int lexicon_offset[] = { 15923, 15931, 15938, 15949, 15954, 15964, 15973, 15977, 15980, 15987, 15997, 16006, 16013, 16017, 16024, 16030, 16035, 16040, 16044, 15590, 16053, 16057, 16063, 16067, 16072, 16076, 16083, 16090, 16094, 16103, - 16111, 16119, 16126, 16134, 16146, 16157, 16167, 16174, 16180, 16189, - 16200, 16209, 16221, 16233, 16245, 16255, 16264, 16274, 16283, 16291, - 16298, 16308, 16317, 16325, 16329, 16334, 16340, 16346, 16351, 16356, - 16360, 16365, 16370, 16375, 16380, 16385, 16390, 16395, 8738, 16400, - 16402, 16406, 16411, 16417, 16424, 16430, 16436, 16445, 16449, 16455, - 16463, 16470, 16479, 16488, 16497, 16506, 16515, 16524, 16533, 16542, - 16552, 16562, 16571, 16577, 16584, 16591, 16597, 16611, 16617, 16624, - 16632, 16641, 16649, 16655, 16664, 16670, 16679, 16690, 16696, 16706, - 16714, 16721, 16729, 16737, 16744, 16753, 16766, 16775, 16783, 16790, - 16803, 16809, 16815, 16825, 16834, 16843, 16852, 16860, 16865, 16869, - 16875, 16881, 16886, 16893, 16900, 10242, 16905, 16910, 16917, 16925, - 16930, 16942, 16949, 16954, 16966, 14943, 16971, 16977, 16985, 16991, - 16996, 17004, 17012, 17019, 17027, 17034, 17040, 17046, 17054, 17062, - 17068, 17076, 17082, 17087, 17093, 17100, 17106, 17111, 17115, 17126, - 17134, 17142, 17148, 17153, 17160, 17169, 17175, 17180, 17188, 17195, - 17204, 17218, 4413, 17222, 17227, 17232, 17238, 17243, 17248, 17252, - 17257, 17262, 17267, 8737, 17272, 17277, 17282, 17287, 17292, 17296, - 17301, 17306, 17311, 17316, 17322, 17328, 14216, 17333, 17339, 17344, - 17349, 17354, 10643, 17359, 17364, 17369, 17374, 17379, 17393, 17410, - 17428, 17440, 17453, 17470, 17486, 17503, 17513, 17532, 17543, 17554, - 17565, 2803, 17576, 17587, 17598, 17615, 17626, 17637, 17642, 10648, - 17647, 17651, 2483, 17655, 17661, 17664, 17670, 17678, 17686, 17692, - 17701, 17708, 17713, 17721, 17729, 17736, 17740, 17745, 17751, 17758, - 17766, 17773, 17785, 17792, 17798, 17806, 17811, 17817, 17823, 17828, - 13971, 17835, 17839, 17848, 17854, 17859, 17867, 17876, 17884, 17891, - 17897, 17905, 17912, 17918, 17924, 17931, 17938, 17944, 17950, 17954, - 17963, 17971, 17976, 17986, 17993, 17999, 18007, 18013, 18021, 18029, - 18036, 18049, 18053, 18060, 18069, 18078, 18087, 18095, 18105, 18112, - 18117, 3969, 18124, 18129, 1248, 18133, 18140, 17273, 18144, 18150, - 18154, 18162, 18174, 18179, 18186, 18192, 18197, 18204, 17278, 18208, - 18212, 18220, 18225, 18229, 17283, 18233, 17288, 18237, 18244, 18249, - 18253, 18260, 18264, 18267, 18275, 18282, 18287, 18295, 18299, 18306, - 18323, 18332, 18341, 18345, 18348, 18354, 18362, 18368, 18373, 18377, - 18382, 18387, 18392, 18397, 18402, 18407, 4047, 18412, 18414, 18422, - 18429, 18439, 18451, 18456, 18460, 18466, 18471, 18479, 18483, 18489, - 18494, 18500, 18503, 18510, 18518, 18525, 18531, 18536, 18542, 18547, - 18554, 18560, 18565, 18575, 18584, 18591, 18596, 18600, 18606, 18612, - 18616, 18623, 18629, 18634, 18640, 18648, 18656, 18663, 18669, 18675, - 18680, 18686, 18692, 18700, 18705, 18710, 18718, 18724, 18730, 18735, - 18742, 18747, 18751, 18757, 18763, 18768, 18774, 18781, 18786, 18792, - 18795, 18801, 18812, 18818, 18827, 18830, 18834, 18838, 18852, 18865, - 18877, 18883, 18888, 18895, 18901, 18907, 18918, 18930, 18942, 18952, - 18961, 18969, 18976, 18987, 18997, 19007, 19015, 19018, 17302, 19023, - 19028, 19035, 17307, 17458, 19043, 19056, 19071, 19082, 17475, 19100, - 19113, 19126, 19137, 12546, 19148, 19161, 19180, 19191, 19202, 19213, - 2824, 19226, 19230, 19238, 19249, 19260, 19268, 19283, 19298, 19309, - 19316, 19322, 19330, 19334, 19340, 19344, 19347, 19360, 19372, 19382, - 19390, 19397, 19405, 19415, 19420, 19427, 19432, 19439, 19450, 19460, - 19466, 19471, 19476, 17312, 19480, 19486, 19493, 19499, 19504, 19509, - 19514, 19518, 17317, 17323, 19522, 17329, 19527, 19535, 19540, 19544, - 19551, 19559, 19566, 19575, 19582, 19586, 19590, 19595, 19600, 19605, - 19610, 19615, 10487, 19620, 19622, 19627, 19632, 19638, 19643, 19648, - 19653, 19658, 19662, 19668, 19674, 19679, 19685, 19690, 19695, 19699, - 19705, 19710, 19714, 19719, 19724, 19736, 19741, 19747, 19752, 19757, - 19763, 19769, 19774, 19779, 19784, 19791, 19797, 19808, 19815, 19824, - 19829, 19833, 279, 19837, 19845, 19850, 19856, 19862, 19867, 19874, - 19881, 19887, 19892, 19898, 19903, 19908, 19913, 19920, 19930, 19938, - 19943, 19948, 19955, 19961, 19970, 19980, 19990, 20004, 20018, 20032, - 20046, 20061, 20076, 20093, 20111, 20124, 20130, 20135, 20140, 20144, - 20152, 20157, 20165, 20171, 20177, 20182, 20187, 20191, 20197, 20202, - 20206, 20213, 20218, 20222, 20233, 20239, 20244, 20249, 20256, 20261, - 20265, 3927, 20270, 20276, 20283, 17334, 20289, 20293, 20299, 20304, - 20309, 20313, 20319, 20324, 20329, 20336, 20341, 15730, 20345, 20350, - 20354, 20359, 20365, 20371, 20378, 20388, 20396, 20403, 20408, 20412, - 20421, 20429, 20436, 20443, 20449, 20454, 20460, 20465, 20470, 20476, - 20481, 20487, 20492, 20498, 20504, 20511, 20517, 20522, 20527, 10713, - 20536, 20539, 20547, 20553, 20558, 20563, 20573, 20580, 20586, 20591, - 20596, 20602, 20607, 20613, 20618, 20624, 20631, 20637, 20643, 20648, - 20656, 20663, 20668, 20673, 20679, 20684, 20688, 20697, 20708, 20715, - 20722, 20730, 20737, 20744, 20749, 20754, 20760, 20765, 20773, 20779, - 20785, 20790, 20797, 20803, 20808, 20812, 20818, 20823, 20828, 20832, - 20837, 1321, 8762, 3112, 20841, 20845, 20849, 20853, 20857, 20861, 20864, - 20869, 20876, 20884, 20894, 20905, 20915, 20926, 20938, 20949, 20959, - 20970, 20982, 20993, 21005, 21018, 21030, 21041, 21051, 21062, 21074, - 21085, 21098, 21110, 21121, 21133, 21146, 21158, 21171, 21185, 21198, - 21210, 21221, 21231, 21242, 21254, 21265, 21277, 21290, 21302, 21313, - 21325, 21338, 21351, 21365, 21378, 21390, 21401, 21413, 21426, 21438, - 21451, 21465, 21478, 21490, 21503, 21517, 21530, 21544, 21558, 21571, - 21583, 21594, 21604, 17345, 21611, 21617, 21627, 21635, 21642, 21650, - 21660, 21669, 21682, 21687, 21692, 21700, 21707, 15839, 15848, 21714, - 21724, 21739, 21745, 21752, 21759, 21766, 21772, 21778, 21789, 21797, - 21805, 21815, 21825, 21834, 17350, 21843, 21849, 21855, 21864, 21872, - 21880, 21885, 21894, 21902, 21914, 21924, 21934, 21944, 21953, 21965, - 21975, 21985, 21996, 22003, 22008, 22015, 22027, 22039, 22051, 22063, - 22075, 22087, 22099, 22111, 22123, 22135, 22146, 22158, 22170, 22182, - 22194, 22206, 22218, 22230, 22242, 22254, 22266, 22277, 22289, 22301, - 22313, 22325, 22337, 22349, 22361, 22373, 22385, 22397, 22408, 22420, - 22432, 22444, 22456, 22468, 22480, 22492, 22504, 22516, 22528, 22539, + 16111, 16119, 16126, 16134, 16146, 16158, 16169, 16179, 16186, 16192, + 16201, 16212, 16221, 16233, 16245, 16257, 16267, 16276, 16286, 16295, + 16303, 16310, 16320, 16329, 16337, 16341, 16346, 16352, 16358, 16363, + 16368, 16372, 16377, 16382, 16387, 16392, 16397, 16402, 16407, 8738, + 16412, 16414, 16418, 16423, 16429, 16436, 16442, 16448, 16457, 16461, + 16467, 16475, 16482, 16491, 16500, 16509, 16518, 16527, 16536, 16545, + 16554, 16564, 16574, 16583, 16589, 16596, 16603, 16609, 16623, 16629, + 16636, 16644, 16653, 16661, 16667, 16676, 16682, 16691, 16702, 16708, + 16718, 16726, 16733, 16741, 16749, 16756, 16765, 16778, 16787, 16795, + 16802, 16815, 16821, 16827, 16837, 16846, 16855, 16864, 16872, 16877, + 16881, 16887, 16893, 16898, 16905, 16912, 10242, 16917, 16922, 16929, + 16937, 16942, 16954, 16961, 16966, 16978, 14943, 16983, 16989, 16997, + 17003, 17008, 17016, 17024, 17031, 17039, 17046, 17052, 17058, 17066, + 17074, 17080, 17088, 17094, 17099, 17105, 17112, 17118, 17123, 17127, + 17138, 17146, 17154, 17160, 17165, 17172, 17181, 17187, 17192, 17200, + 17207, 17216, 17230, 4413, 17234, 17239, 17244, 17250, 17255, 17260, + 17264, 17269, 17274, 17279, 8737, 17284, 17289, 17294, 17299, 17304, + 17308, 17313, 17318, 17323, 17328, 17334, 17340, 14216, 17345, 17351, + 17356, 17361, 17366, 10643, 17371, 17376, 17381, 17386, 17391, 17405, + 17422, 17440, 17452, 17465, 17482, 17498, 17515, 17525, 17544, 17555, + 17566, 17577, 2803, 17588, 17599, 17610, 17627, 17638, 17649, 17654, + 10648, 17659, 17663, 2483, 17667, 17673, 17676, 17682, 17690, 17698, + 17704, 17713, 17720, 17725, 17733, 17741, 17748, 17752, 17757, 17763, + 17770, 17778, 17785, 17797, 17804, 17810, 17818, 17823, 17829, 17835, + 17840, 13971, 17847, 17851, 17860, 17866, 17871, 17879, 17888, 17896, + 17903, 17909, 17917, 17924, 17930, 17936, 17943, 17950, 17956, 17962, + 17966, 17975, 17983, 17988, 17998, 18005, 18011, 18019, 18025, 18033, + 18041, 18048, 18061, 18065, 18072, 18081, 18090, 18099, 18107, 18117, + 18124, 18129, 3969, 18136, 18141, 1248, 18145, 18152, 17285, 18156, + 18162, 18166, 18174, 18186, 18191, 18198, 18204, 18209, 18216, 17290, + 18220, 18224, 18232, 18237, 18241, 17295, 18245, 17300, 18249, 18256, + 18261, 18265, 18272, 18276, 18279, 18287, 18294, 18299, 18307, 18311, + 18318, 18335, 18344, 18353, 18357, 18360, 18366, 18374, 18380, 18385, + 18389, 18394, 18399, 18404, 18409, 18414, 18419, 4047, 18424, 18426, + 18434, 18441, 18451, 18463, 18468, 18472, 18478, 18483, 18491, 18495, + 18501, 18506, 18512, 18515, 18522, 18530, 18537, 18543, 18548, 18554, + 18559, 18566, 18572, 18577, 18587, 18596, 18603, 18608, 18612, 18618, + 18624, 18628, 18635, 18641, 18646, 18652, 18660, 18668, 18675, 18681, + 18687, 18692, 18698, 18704, 18712, 18717, 18722, 18730, 18736, 18742, + 18747, 18754, 18759, 18763, 18769, 18775, 18780, 18786, 18793, 18798, + 18804, 18807, 18813, 18824, 18830, 18839, 18842, 18846, 18850, 18864, + 18877, 18889, 18895, 18900, 18907, 18913, 18919, 18930, 18942, 18954, + 18964, 18973, 18981, 18988, 18999, 19009, 19019, 19027, 19030, 17314, + 19035, 19040, 19047, 17319, 17470, 19055, 19068, 19083, 19094, 17487, + 19112, 19125, 19138, 19149, 12546, 19160, 19173, 19192, 19203, 19214, + 19225, 2824, 19238, 19242, 19250, 19261, 19272, 19280, 19295, 19310, + 19321, 19328, 19334, 19342, 19346, 19352, 19356, 19359, 19372, 19384, + 19394, 19402, 19409, 19417, 19427, 19432, 19439, 19444, 19451, 19462, + 19472, 19478, 19483, 19488, 17324, 19492, 19498, 19505, 19511, 19516, + 19521, 19526, 19530, 17329, 17335, 19534, 17341, 19539, 19547, 19552, + 19556, 19563, 19571, 19578, 19587, 19594, 19598, 19602, 19607, 19612, + 19617, 19622, 19627, 10487, 19632, 19634, 19639, 19644, 19650, 19655, + 19660, 19665, 19670, 19674, 19680, 19686, 19691, 19697, 19702, 19707, + 19711, 19717, 19722, 19726, 19731, 19736, 19748, 19753, 19759, 19764, + 19769, 19775, 19781, 19786, 19791, 19796, 19803, 19809, 19820, 19827, + 19836, 19841, 19845, 279, 19849, 19857, 19862, 19868, 19874, 19879, + 19886, 19893, 19899, 19904, 19910, 19915, 19920, 19925, 19932, 19942, + 19950, 19955, 19960, 19967, 19973, 19982, 19992, 20002, 20016, 20030, + 20044, 20058, 20073, 20088, 20105, 20123, 20136, 20142, 20147, 20152, + 20156, 20164, 20169, 20177, 20183, 20189, 20194, 20199, 20203, 20209, + 20214, 20218, 20225, 20230, 20234, 20245, 20251, 20256, 20261, 20268, + 20273, 20277, 3927, 20282, 20288, 20295, 17346, 20301, 20305, 20311, + 20316, 20321, 20325, 20331, 20336, 20341, 20348, 20353, 15730, 20357, + 20362, 20366, 20371, 20377, 20383, 20390, 20400, 20408, 20415, 20420, + 20424, 20433, 20441, 20448, 20455, 20461, 20466, 20472, 20477, 20482, + 20488, 20493, 20499, 20504, 20510, 20516, 20523, 20529, 20534, 20539, + 10713, 20548, 20551, 20559, 20565, 20570, 20575, 20585, 20592, 20598, + 20603, 20608, 20614, 20619, 20625, 20630, 20636, 20643, 20649, 20655, + 20660, 20668, 20675, 20680, 20685, 20691, 20696, 20700, 20709, 20720, + 20727, 20734, 20742, 20749, 20756, 20761, 20766, 20772, 20777, 20785, + 20791, 20797, 20802, 20809, 20815, 20820, 20824, 20830, 20835, 20840, + 20844, 20849, 1321, 8762, 3112, 20853, 20857, 20861, 20865, 20869, 20873, + 20876, 20881, 20888, 20896, 20906, 20917, 20927, 20938, 20950, 20961, + 20971, 20982, 20994, 21005, 21017, 21030, 21042, 21053, 21063, 21074, + 21086, 21097, 21110, 21122, 21133, 21145, 21158, 21170, 21183, 21197, + 21210, 21222, 21233, 21243, 21254, 21266, 21277, 21289, 21302, 21314, + 21325, 21337, 21350, 21363, 21377, 21390, 21402, 21413, 21425, 21438, + 21450, 21463, 21477, 21490, 21502, 21515, 21529, 21542, 21556, 21570, + 21583, 21595, 21606, 21616, 17357, 21623, 21629, 21639, 21647, 21654, + 21662, 21672, 21681, 21694, 21699, 21704, 21712, 21719, 15839, 15848, + 21726, 21736, 21751, 21757, 21764, 21771, 21778, 21784, 21790, 21801, + 21809, 21817, 21827, 21837, 21846, 17362, 21855, 21861, 21867, 21876, + 21884, 21892, 21897, 21906, 21914, 21926, 21936, 21946, 21956, 21965, + 21977, 21987, 21997, 22008, 22015, 22020, 22027, 22039, 22051, 22063, + 22075, 22087, 22099, 22111, 22123, 22135, 22147, 22158, 22170, 22182, + 22194, 22206, 22218, 22230, 22242, 22254, 22266, 22278, 22289, 22301, + 22313, 22325, 22337, 22349, 22361, 22373, 22385, 22397, 22409, 22420, + 22432, 22444, 22456, 22468, 22480, 22492, 22504, 22516, 22528, 22540, 22551, 22563, 22575, 22587, 22599, 22611, 22623, 22635, 22647, 22659, - 22670, 22682, 22694, 22706, 22718, 22730, 22742, 22754, 22766, 22778, - 22790, 22801, 22813, 22825, 22837, 22849, 22861, 22873, 22885, 22897, - 22909, 22921, 22932, 22944, 22956, 22968, 22980, 22993, 23006, 23019, - 23032, 23045, 23058, 23071, 23083, 23096, 23109, 23122, 23135, 23148, - 23161, 23174, 23187, 23200, 23213, 23225, 23238, 23251, 23264, 23277, - 23290, 23303, 23316, 23329, 23342, 23355, 23367, 23380, 23393, 23406, - 23419, 23432, 23445, 23458, 23471, 23484, 23497, 23509, 23522, 23535, - 23548, 23561, 23574, 23587, 23600, 23613, 23626, 23639, 23651, 23664, - 23677, 23690, 23703, 23716, 23729, 23742, 23755, 23768, 23781, 23793, - 23804, 23817, 23830, 23843, 23856, 23869, 23882, 23895, 23908, 23921, - 23934, 23946, 23959, 23972, 23985, 23998, 24011, 24024, 24037, 24050, - 24063, 24076, 24088, 24101, 24114, 24127, 24140, 24153, 24166, 24179, - 24192, 24205, 24218, 24230, 24243, 24256, 24269, 24282, 24295, 24308, - 24321, 24334, 24347, 24360, 24372, 24385, 24398, 24411, 24424, 24437, - 24450, 24463, 24476, 24489, 24502, 24514, 24527, 24540, 24553, 24566, - 24579, 24592, 24605, 24618, 24631, 24644, 24656, 24669, 24682, 24695, - 24708, 24721, 24734, 24747, 24760, 24773, 24786, 24798, 24811, 24824, - 24837, 24850, 24863, 24876, 24889, 24902, 24915, 24928, 24940, 24953, - 24966, 24979, 24992, 25005, 25018, 25031, 25044, 25057, 25070, 25082, - 25095, 25108, 25121, 25134, 25147, 25160, 25173, 25186, 25199, 25212, - 25224, 25235, 25244, 25252, 25260, 25267, 25273, 25277, 25283, 25289, - 25298, 25306, 25311, 25317, 25322, 25326, 25335, 10492, 25346, 25352, - 25359, 25367, 25374, 13145, 13159, 25381, 25388, 25397, 25402, 25407, - 25414, 25419, 25424, 8778, 8784, 8790, 25429, 25434, 25437, 25442, 25450, - 25457, 25464, 25476, 25483, 25489, 25498, 25503, 25512, 25521, 25527, - 25535, 25544, 25548, 25554, 25559, 25569, 25576, 25582, 25590, 25596, - 25603, 25609, 25619, 25628, 25632, 25639, 25643, 25648, 25654, 25662, - 25666, 25676, 17360, 25685, 25691, 25695, 25704, 25713, 25723, 25729, - 17365, 25736, 25743, 25754, 25762, 25772, 25781, 25789, 10207, 25797, - 25802, 25808, 25813, 25817, 25821, 25825, 11301, 25830, 25838, 25845, - 25854, 25862, 25869, 25876, 25885, 25891, 1062, 25898, 25904, 25908, - 25914, 25921, 25927, 25935, 25941, 25948, 25954, 25960, 25969, 25973, - 25981, 25989, 25996, 26005, 26012, 26017, 26021, 26031, 26042, 26053, - 26058, 26063, 26069, 26078, 26083, 26096, 9000, 26100, 26106, 26112, - 26118, 26123, 26131, 26135, 26142, 26151, 26156, 17638, 26164, 26168, - 26180, 26185, 26189, 26192, 26198, 26204, 26210, 26215, 26220, 26224, - 26227, 26238, 26243, 10769, 26250, 26255, 26260, 26265, 26270, 26275, - 26280, 26285, 26290, 10774, 26295, 26300, 26305, 26310, 26315, 26320, - 26325, 26330, 26335, 26340, 26345, 26350, 26356, 26361, 26366, 26371, - 26376, 26381, 26386, 26391, 26396, 26401, 26407, 26413, 26418, 26423, - 26428, 26433, 26438, 26443, 26448, 26453, 26458, 26464, 26469, 26474, - 26479, 26485, 26491, 26496, 26501, 26506, 26511, 26516, 26521, 26526, - 26531, 26537, 26542, 26547, 26552, 26557, 26563, 26568, 26573, 26577, - 1244, 145, 26585, 26589, 26593, 26597, 26602, 26606, 15736, 2409, 26610, - 26615, 26619, 26624, 26628, 26633, 26637, 26643, 26648, 26652, 26656, - 26664, 26668, 26672, 26679, 26684, 26689, 26693, 26699, 26704, 26708, - 26713, 26718, 26722, 26729, 26736, 26743, 26748, 26752, 26756, 26761, - 26765, 26768, 26774, 26787, 26792, 26798, 26807, 26812, 11049, 26817, - 26826, 26831, 26834, 26838, 26843, 26848, 26853, 26858, 26863, 2920, - 2925, 26868, 26874, 26878, 26884, 3888, 26889, 26894, 26899, 26905, - 26910, 16686, 26915, 26920, 26925, 26930, 26936, 26941, 26946, 26952, - 26957, 26961, 26966, 26971, 26976, 26981, 26986, 26990, 26995, 26999, - 27004, 27009, 27014, 27019, 27023, 27028, 27032, 27037, 27042, 27047, - 26962, 3121, 26967, 27052, 27060, 27067, 11395, 27079, 27087, 27097, - 27115, 27134, 27143, 27151, 26972, 27158, 27163, 27171, 26977, 27176, - 27181, 27189, 27194, 27199, 27203, 19858, 27208, 27216, 27221, 27225, - 27232, 27238, 27247, 27251, 27259, 27265, 27269, 27272, 20692, 27279, - 27283, 27287, 27292, 27298, 27305, 27310, 10234, 27314, 27319, 27324, - 27329, 27334, 27339, 1663, 1668, 27344, 27350, 27356, 27361, 27365, - 27369, 27373, 27377, 27381, 27385, 27389, 27393, 25470, 27396, 27403, - 27411, 27417, 27423, 27428, 27433, 27439, 27443, 27448, 27455, 16586, - 16593, 27461, 27473, 27476, 27483, 27487, 19883, 27494, 27502, 27513, - 27522, 27535, 27545, 27559, 27571, 27585, 27598, 27610, 27620, 27632, - 27638, 27653, 27677, 27695, 27714, 27727, 27741, 27759, 27775, 27792, - 27810, 27821, 27840, 27857, 27877, 27895, 27907, 27921, 27935, 27947, - 27964, 27983, 28001, 28013, 28031, 28050, 17518, 28063, 28083, 28095, - 12577, 28107, 28112, 28117, 28122, 28131, 28137, 28142, 28146, 28153, - 28159, 28163, 28168, 28173, 28178, 28183, 28188, 28193, 2506, 28198, - 28204, 28208, 28211, 28222, 28226, 28229, 28237, 28243, 14882, 28247, - 28256, 28267, 28273, 28279, 28294, 28303, 28311, 28318, 28323, 28327, - 28334, 28340, 28349, 28357, 28364, 28374, 28383, 28393, 28398, 28407, - 28416, 28427, 28438, 28448, 28465, 4557, 28475, 28479, 28489, 28497, - 28507, 28518, 28524, 28529, 28539, 28547, 28554, 28560, 28567, 28572, - 27010, 28576, 28585, 28589, 28592, 28597, 28605, 28612, 28621, 28629, - 28637, 28645, 28655, 28664, 28670, 28676, 28682, 28686, 27015, 27020, - 28690, 28700, 28710, 28720, 28728, 28735, 28745, 28753, 28761, 28767, - 28775, 798, 28784, 17725, 649, 28798, 28807, 28815, 28826, 28837, 28847, - 28856, 28868, 28877, 28886, 28893, 28899, 28909, 28918, 28927, 28935, - 28943, 28953, 28961, 28969, 28976, 28982, 28987, 28992, 28997, 8156, - 29002, 29005, 29009, 29014, 29022, 29028, 29033, 29037, 3751, 27033, - 29045, 27038, 29051, 29057, 29063, 29068, 29073, 29077, 29085, 29091, - 29097, 29101, 3912, 29109, 29114, 29119, 29123, 29127, 11681, 29134, - 29142, 29156, 29163, 29170, 29176, 11690, 11696, 29184, 29192, 29199, - 29204, 29209, 27043, 29215, 29226, 29235, 19031, 29243, 29248, 2755, - 29253, 29264, 29270, 29275, 29279, 29283, 29286, 29293, 29300, 29306, - 29314, 29321, 29327, 29331, 8196, 29336, 29340, 29344, 29352, 29357, - 29362, 29367, 1696, 29372, 29377, 29382, 29387, 29392, 29397, 29402, - 29407, 29412, 29417, 29422, 29427, 29432, 29437, 29443, 29448, 29453, - 29458, 29463, 29468, 29473, 29479, 29484, 29489, 29494, 29499, 29504, - 29509, 29514, 29520, 29526, 29531, 29537, 29542, 29547, 5, 29553, 29557, - 29561, 29565, 29570, 29574, 29578, 29582, 29586, 29591, 29595, 29600, - 29604, 29607, 29611, 29616, 29620, 29625, 29629, 29633, 29637, 29642, - 29646, 29650, 29660, 29665, 29669, 29673, 29678, 29683, 29692, 29697, - 29702, 29706, 29710, 29719, 29732, 29744, 29753, 29762, 29767, 29773, - 29778, 29782, 29786, 29796, 29805, 29813, 29819, 29824, 29828, 29835, - 29842, 29852, 29861, 29869, 12934, 29877, 29884, 29892, 29901, 29910, - 29918, 29928, 29933, 29937, 29941, 29944, 29946, 29950, 29954, 29959, - 29964, 29968, 29972, 29975, 29979, 29982, 29986, 29989, 29992, 29996, - 30002, 30006, 30010, 30014, 30018, 30023, 30028, 30033, 30037, 30040, - 30045, 30051, 30056, 30062, 30067, 30071, 30077, 30081, 30085, 30090, - 30094, 30099, 30104, 30108, 30112, 30119, 30123, 30126, 30130, 30134, - 30140, 30145, 30151, 30155, 30159, 30164, 30171, 30177, 30181, 30190, - 30194, 30198, 30201, 30207, 30212, 30218, 1385, 1748, 30223, 30228, - 30233, 30238, 30243, 30248, 30253, 2213, 827, 30258, 30261, 30265, 30269, - 30274, 30278, 17737, 30282, 30287, 30292, 30296, 30299, 30304, 30308, - 30313, 30317, 17741, 30322, 30325, 30328, 30334, 30338, 30343, 30347, - 30360, 30368, 30372, 30375, 30383, 30392, 30399, 30404, 30410, 30416, - 30424, 30431, 30438, 30442, 30446, 30450, 30455, 30460, 30464, 30472, - 30477, 30484, 30496, 30507, 30512, 30516, 30523, 30527, 30532, 30538, - 30541, 30546, 30551, 30558, 30562, 30566, 30569, 30575, 8900, 2413, - 30579, 30584, 30600, 11100, 30620, 30629, 30645, 30649, 30656, 30659, - 30665, 30675, 30681, 30690, 30699, 30714, 30725, 30737, 30748, 30756, - 30765, 30771, 30780, 30790, 30800, 30811, 30822, 30832, 30841, 30848, - 30857, 30865, 30872, 30879, 30886, 30894, 30901, 30908, 30921, 30928, - 30936, 30943, 30949, 30954, 30963, 30970, 30976, 30981, 30989, 30997, - 31004, 31011, 28499, 31023, 31035, 31049, 31057, 31065, 31073, 31080, - 31092, 31101, 31110, 31118, 31126, 31134, 31141, 31147, 31156, 31164, - 31174, 31183, 31193, 31202, 31211, 31219, 31224, 31228, 31231, 31235, - 31239, 31243, 31247, 31251, 31257, 31263, 31268, 31276, 31283, 31291, - 31298, 10806, 17799, 31306, 31313, 31318, 31325, 31331, 31337, 31344, - 14024, 31351, 31354, 31366, 31374, 31380, 31385, 31389, 31400, 31410, - 31420, 11620, 31429, 31438, 31446, 31456, 31465, 31472, 31479, 31487, - 31491, 17818, 31494, 31501, 31505, 4501, 31511, 31514, 31521, 31527, - 31541, 31546, 31554, 31560, 31571, 31578, 31584, 31590, 31594, 31599, - 31603, 31612, 31619, 31625, 8953, 31632, 31640, 31647, 31653, 31658, - 31664, 31670, 31680, 31692, 31703, 31713, 11252, 31721, 31727, 17836, - 31731, 31733, 31236, 11633, 31742, 31747, 31753, 31763, 31768, 31775, - 31783, 31789, 31794, 31799, 31804, 31808, 31813, 31820, 31826, 31835, - 31843, 31847, 31854, 31864, 31870, 31879, 31885, 31892, 4771, 31898, - 31904, 31909, 31916, 31928, 31939, 31944, 31952, 31956, 31966, 31972, - 31976, 31981, 31991, 32000, 32004, 32011, 32019, 32026, 32032, 32037, - 32045, 32052, 32057, 32064, 32076, 32085, 32089, 32097, 15656, 32101, - 32111, 32115, 32123, 32130, 32137, 30379, 32148, 32153, 32157, 32164, - 32171, 26695, 31161, 32176, 32180, 32183, 27827, 32188, 32202, 32218, - 32236, 32255, 32272, 32290, 27846, 32307, 32327, 27863, 32339, 32351, - 19087, 32363, 27883, 32377, 32389, 12590, 32403, 32408, 32413, 32418, - 32424, 32430, 32436, 32440, 32448, 32454, 32461, 32466, 32476, 32483, - 32489, 12128, 32495, 32497, 32502, 32510, 32514, 31816, 32520, 32527, - 13866, 13876, 32534, 32541, 32551, 32556, 32560, 32563, 32569, 32577, - 32589, 32599, 32615, 32628, 32642, 19105, 32656, 32663, 32667, 32670, - 32675, 32679, 32686, 32693, 32700, 32707, 32717, 32722, 32727, 32732, - 32740, 32748, 32753, 32762, 28520, 3561, 32767, 32770, 32773, 32778, - 32785, 32790, 32795, 32811, 32819, 32827, 10864, 32835, 32840, 32844, - 32850, 32855, 32861, 32864, 32870, 32882, 32890, 32897, 32903, 32910, - 32921, 32935, 32948, 32954, 32963, 32969, 32978, 32990, 33001, 33011, - 33020, 33029, 33037, 33047, 33056, 33067, 673, 33074, 33081, 33087, - 33092, 33098, 33105, 33111, 33122, 33132, 33142, 33151, 33157, 33164, - 33169, 33177, 33184, 33192, 33200, 33212, 7142, 33219, 33222, 33231, - 33239, 33245, 33251, 33256, 33260, 33263, 33269, 33276, 33281, 33286, - 33293, 33298, 33302, 33314, 33325, 33334, 33342, 18008, 33347, 33355, - 33360, 33368, 33374, 33380, 33385, 13859, 9802, 33388, 33392, 33396, - 33399, 33402, 33408, 33416, 33424, 33428, 33432, 33437, 33441, 33444, - 33453, 33458, 33463, 33467, 33470, 33475, 33483, 33494, 33503, 33507, - 33513, 33519, 33523, 33529, 33537, 33559, 33583, 33594, 33603, 33609, - 33616, 33623, 33629, 33637, 33643, 33648, 33659, 33677, 33684, 33692, - 33696, 33703, 33708, 33717, 33730, 33738, 33750, 33761, 33772, 33782, - 33796, 33805, 33813, 33825, 33836, 11117, 33845, 33856, 33867, 33879, - 33889, 33898, 33908, 33913, 33917, 33925, 33936, 33946, 33952, 33957, - 33961, 33964, 33967, 33975, 33983, 33992, 34002, 34011, 34017, 34022, - 34036, 2838, 34058, 34069, 34078, 34088, 34100, 34109, 34118, 34128, - 34136, 34144, 34153, 34158, 34169, 34174, 34183, 34189, 34200, 34204, - 34207, 34217, 34226, 34234, 34244, 34254, 34262, 34271, 34278, 34284, - 34292, 34299, 34308, 34317, 34322, 34327, 34331, 34339, 34346, 34352, - 34356, 34364, 34371, 34382, 34397, 34404, 34410, 34420, 34429, 34435, - 34446, 34450, 34457, 34461, 34468, 34474, 16838, 34480, 34484, 34489, - 34495, 34502, 34506, 34510, 34518, 34526, 34532, 34541, 34548, 34555, - 34560, 34565, 34575, 28574, 34579, 34582, 34587, 34592, 34597, 34602, - 34607, 34612, 34617, 34622, 34628, 34633, 34638, 34644, 1094, 770, 34649, - 34652, 34659, 34668, 1777, 34675, 34680, 34684, 34690, 1143, 643, 34695, - 347, 34699, 34709, 34718, 34726, 34735, 34743, 34750, 34761, 34769, - 34778, 34786, 34796, 34804, 34809, 11794, 34813, 34821, 34829, 34834, - 17754, 4101, 34840, 34846, 34852, 6669, 34857, 34861, 34868, 34874, - 34880, 34884, 34893, 34899, 34904, 34911, 1336, 34917, 34923, 34928, - 34935, 34939, 1243, 6677, 34944, 34954, 34962, 34968, 34978, 34987, - 34995, 35001, 35006, 35014, 35021, 13376, 35027, 35034, 35039, 35045, - 35052, 35062, 1404, 253, 2212, 35068, 35074, 35081, 35092, 35103, 35111, - 35118, 35128, 35137, 35145, 35154, 35161, 35168, 35181, 35188, 35194, - 35205, 35224, 35229, 1148, 35233, 35238, 35246, 3984, 35250, 35255, - 35259, 35263, 1340, 29973, 35273, 35277, 35282, 35286, 35292, 3846, - 35298, 35306, 35313, 35324, 35333, 35341, 35366, 35374, 35379, 3985, 401, - 35385, 35393, 35401, 35408, 35413, 35419, 35424, 2281, 12792, 35431, - 35437, 31595, 31934, 35443, 656, 106, 35447, 35451, 35457, 595, 10679, - 35462, 35467, 35474, 35480, 35484, 35488, 1549, 35491, 35495, 18296, - 35498, 35503, 35510, 35516, 8966, 35521, 35529, 35536, 35542, 27205, - 35546, 35550, 35554, 35558, 1834, 20204, 35562, 35567, 35571, 35574, - 35582, 35590, 35595, 35604, 35612, 35615, 35622, 35629, 35641, 27284, - 35651, 35663, 35671, 35676, 35680, 35688, 35695, 35702, 35711, 35717, - 35724, 35731, 35734, 35738, 35742, 1351, 35752, 35754, 35759, 35765, - 35771, 35776, 35781, 35786, 35791, 35796, 35801, 35806, 35811, 35816, - 35821, 35826, 35831, 35836, 35841, 35847, 35853, 35859, 35865, 35870, - 35875, 35880, 35886, 35891, 35896, 35901, 35907, 35912, 35918, 35923, - 35928, 35933, 35938, 35944, 35949, 35955, 35960, 35965, 35970, 35975, - 35981, 35986, 35992, 35997, 36002, 36007, 36012, 36017, 36022, 36027, - 36032, 36037, 36043, 36049, 36055, 36060, 36065, 36070, 36075, 36081, - 36087, 36093, 36099, 36105, 36111, 36116, 36122, 36127, 36132, 36137, - 36142, 36148, 2552, 36153, 2559, 2566, 2962, 36158, 2572, 2582, 36164, - 2614, 2619, 2624, 36168, 36173, 36178, 36184, 36189, 36194, 36198, 36203, - 36209, 36214, 36219, 36224, 36230, 36235, 36239, 36243, 36248, 36253, - 36258, 36263, 36268, 36274, 36280, 36285, 36289, 36294, 36300, 36304, - 36309, 36314, 36319, 36324, 36328, 36331, 36336, 36341, 36346, 36351, - 36356, 36362, 36368, 36373, 36378, 36383, 36387, 36392, 36397, 36402, - 36407, 36412, 36417, 36421, 36426, 36431, 36436, 36440, 36444, 36448, - 36453, 36461, 36466, 36471, 36477, 36483, 36489, 36494, 36502, 36506, - 36509, 36514, 36519, 36523, 36528, 36533, 36537, 36542, 36546, 36549, - 36554, 4211, 21695, 36559, 36564, 36569, 36574, 36582, 25865, 34932, - 10318, 36587, 36592, 36596, 36601, 36605, 36609, 36614, 36618, 36621, - 36624, 36628, 36633, 36637, 36645, 36649, 36652, 36657, 36661, 36665, - 36670, 36675, 36679, 36685, 36690, 36695, 36702, 36709, 36713, 36716, - 36722, 36731, 36738, 36746, 36753, 36757, 36762, 36766, 36770, 36776, - 36781, 36787, 36791, 36797, 36802, 36807, 36811, 36818, 36824, 36830, - 36836, 36842, 36849, 36855, 36861, 36867, 36873, 36879, 36885, 36891, - 36898, 36904, 36911, 36917, 36923, 36929, 36935, 36941, 36947, 36953, - 36959, 36965, 36971, 36976, 36981, 13731, 36986, 36992, 36997, 37002, - 37007, 37012, 37015, 37021, 37026, 37034, 37039, 37043, 37048, 37054, - 37063, 37069, 37074, 37079, 37084, 37088, 37093, 37097, 37102, 37107, - 37112, 37117, 37124, 37131, 37137, 37143, 37148, 19801, 37155, 37161, - 37168, 37174, 37180, 37185, 37193, 37198, 11288, 37202, 37207, 37212, - 37218, 37223, 37228, 37232, 37237, 37242, 37248, 37253, 37258, 37263, - 37267, 37272, 37277, 37281, 37286, 37291, 37295, 37300, 37304, 37309, - 37314, 37319, 37323, 37328, 37332, 37337, 37341, 37348, 37352, 37356, - 18452, 37361, 37368, 37377, 37383, 37389, 37398, 37406, 37415, 37423, - 37428, 37432, 37439, 37445, 37453, 37457, 37460, 37465, 37469, 37478, - 37486, 37504, 37510, 1403, 37516, 37519, 37523, 27351, 27357, 37529, - 37533, 37544, 37555, 37566, 37578, 37582, 37589, 37596, 37603, 37608, - 37612, 37620, 37625, 37630, 37635, 37640, 6734, 16742, 25864, 37645, - 37650, 37654, 16733, 37659, 37665, 37670, 37676, 37681, 37687, 37692, - 37698, 37703, 37709, 37715, 37721, 37726, 37682, 37688, 37730, 37735, - 37741, 37746, 37752, 37757, 37763, 37768, 37693, 12422, 37772, 37704, - 37710, 37716, 3054, 3760, 37778, 37781, 37786, 37792, 37798, 37804, - 37811, 37817, 37823, 37829, 37835, 37841, 37847, 37853, 37859, 37865, - 37871, 37877, 37883, 37890, 37896, 37902, 37908, 37914, 37920, 37923, - 37928, 37931, 37938, 37943, 37951, 37955, 37960, 37965, 37971, 37976, - 37981, 37985, 37990, 37996, 38001, 38007, 38012, 38018, 38023, 38029, - 38035, 38039, 38044, 38049, 38054, 38059, 38063, 38068, 38073, 38078, - 38084, 38090, 38096, 38102, 38107, 38111, 38114, 38120, 38126, 38135, - 38143, 38150, 38155, 38159, 38163, 38168, 18239, 38173, 38181, 38187, - 4152, 1253, 38192, 38197, 38201, 9016, 38207, 38213, 38220, 9025, 38224, - 38230, 38236, 38243, 38249, 38258, 38266, 38278, 38287, 38291, 38298, - 38304, 38309, 38313, 38317, 38320, 38330, 38339, 38347, 37683, 38352, - 38362, 38372, 38382, 38388, 38393, 38403, 38408, 38421, 38435, 38446, - 38458, 38470, 38484, 38497, 38509, 38521, 17559, 38535, 38540, 38545, - 38549, 38553, 38557, 38561, 38567, 38572, 38577, 38582, 38587, 38592, - 38597, 1737, 32999, 38602, 38607, 38612, 37731, 38617, 38620, 38625, - 38630, 38635, 38641, 38647, 19411, 11994, 38652, 38658, 38665, 19039, - 38671, 38676, 38681, 38685, 38690, 38695, 37736, 38700, 38705, 38710, - 38716, 37742, 38721, 38724, 38731, 38739, 38745, 38751, 38757, 38768, - 38773, 38780, 38787, 38794, 38802, 38811, 38820, 38826, 38832, 38840, - 37747, 38845, 38851, 38857, 37753, 38862, 38867, 38875, 38883, 38889, - 38896, 38902, 38909, 38916, 38922, 38930, 38940, 38947, 38953, 38958, - 38964, 38969, 38974, 38981, 38990, 38998, 39003, 39009, 39016, 39024, - 39030, 39035, 39041, 39050, 39057, 33997, 39063, 39067, 39072, 39081, - 39086, 39091, 39096, 14972, 39104, 39109, 39114, 39119, 39123, 39128, - 39133, 39140, 39145, 39150, 39155, 37758, 25793, 39161, 2655, 158, 39164, - 39167, 39171, 39175, 39185, 39193, 39200, 39204, 39208, 39211, 39219, - 39226, 39233, 31888, 39242, 39245, 39252, 39258, 39263, 39267, 39274, - 39278, 39286, 39294, 39301, 39316, 39320, 39324, 39327, 39333, 39340, - 39344, 39350, 39354, 39361, 39369, 39377, 39384, 37694, 39391, 39399, - 39404, 39416, 12075, 12082, 12089, 12096, 12103, 12110, 626, 434, 39422, - 39427, 39432, 39438, 39443, 39448, 4178, 39453, 39456, 39461, 39466, - 39471, 39476, 39481, 39488, 27469, 39493, 39498, 39503, 39508, 39513, - 39519, 39524, 39530, 37934, 39536, 39541, 39547, 39553, 39563, 39568, - 39573, 39577, 39582, 39587, 39592, 39597, 39610, 39615, 27083, 20286, - 1064, 39619, 39625, 39629, 39634, 39639, 39645, 39650, 39655, 39659, - 39664, 39669, 39675, 39680, 39685, 1258, 39689, 39694, 39699, 39704, - 39708, 39713, 39718, 39723, 39729, 39735, 39740, 39744, 39748, 39753, - 39758, 39763, 39767, 39772, 39780, 39784, 39790, 39794, 39801, 39810, - 20057, 37705, 39816, 39823, 39831, 39839, 39846, 39852, 39861, 39874, - 39886, 39891, 39897, 39901, 2981, 39905, 39909, 39335, 39918, 39929, - 39940, 39945, 34065, 39950, 39955, 39959, 34185, 27362, 39964, 39971, - 39975, 39980, 37711, 25900, 39984, 39989, 39995, 40000, 40004, 40008, - 40011, 40015, 40021, 40030, 40041, 40053, 37717, 40058, 40061, 40065, - 40069, 40074, 40079, 40084, 40089, 40094, 40099, 40104, 40109, 373, - 40114, 40119, 40124, 40129, 40134, 40139, 40145, 40150, 40155, 40161, - 40166, 40172, 40177, 40183, 40188, 40193, 40198, 40203, 40208, 40213, - 40218, 40223, 40229, 40234, 40239, 40244, 40249, 40254, 40259, 40264, - 40270, 40276, 40281, 40286, 40291, 40296, 40301, 40306, 40311, 40316, - 40321, 40326, 40331, 40336, 40341, 40346, 40351, 40356, 40361, 40366, - 40376, 40386, 40392, 342, 14, 40397, 40400, 40404, 40408, 40416, 40420, - 40424, 31568, 16975, 1818, 40427, 40432, 40436, 40441, 40445, 40450, - 40454, 40459, 40463, 40466, 40468, 40472, 40477, 40481, 40492, 40495, - 40497, 40501, 40513, 40525, 40534, 40538, 40548, 40552, 40558, 40563, - 40572, 40578, 40583, 40588, 40592, 40596, 40601, 40608, 40613, 40619, - 40624, 40628, 40635, 31169, 31179, 40639, 40644, 40649, 40654, 40661, - 40665, 40672, 40679, 40685, 9171, 40689, 40698, 40706, 40721, 40735, - 40744, 40752, 40763, 40772, 40777, 40784, 40794, 8165, 40804, 40809, - 40815, 40820, 40824, 40827, 40832, 40836, 40841, 40845, 40852, 40857, - 40862, 40867, 40877, 40882, 40887, 40892, 10188, 40897, 40899, 40907, - 40910, 40913, 40921, 40936, 40944, 40954, 40956, 40959, 40963, 40969, - 40973, 40978, 40983, 41001, 41015, 41034, 41051, 41060, 41068, 41073, - 41078, 1396, 41084, 41090, 41095, 41105, 41114, 41122, 41127, 41133, - 41138, 41147, 41156, 41167, 41172, 41179, 41185, 41189, 41198, 41205, - 41213, 41220, 41233, 41241, 41245, 41255, 41261, 41266, 41270, 41278, - 41286, 41291, 41295, 41299, 41308, 41314, 41319, 41327, 41337, 41346, - 41355, 41364, 41375, 41383, 41394, 41403, 41411, 41418, 41424, 41429, - 41440, 41451, 41456, 41460, 41463, 41467, 41477, 41485, 41491, 41502, - 41513, 41524, 41535, 41546, 41557, 41568, 41579, 41591, 41603, 41615, - 41627, 41639, 41651, 41663, 41672, 41676, 41684, 41690, 41696, 41703, - 41709, 41714, 41720, 41724, 41729, 41734, 41739, 40371, 40381, 2526, - 41744, 41746, 41751, 41756, 41761, 41764, 41766, 41770, 41773, 41780, - 41784, 11644, 41788, 41794, 41801, 41807, 41817, 41822, 41828, 41832, - 41837, 41850, 31758, 41856, 41862, 41871, 41880, 21918, 41887, 41896, - 41904, 38368, 41910, 41915, 41919, 41928, 41936, 41943, 41948, 41952, - 41957, 41962, 41970, 41974, 41982, 41988, 41994, 41999, 42004, 42008, - 42011, 42016, 42029, 42045, 27953, 42062, 42074, 42091, 42103, 42117, - 27970, 27989, 42129, 42141, 2855, 42155, 42160, 42165, 42170, 42174, - 42181, 42193, 42200, 42209, 42219, 42222, 42233, 42244, 42252, 42257, - 42261, 42266, 42271, 42276, 42281, 42286, 42291, 1768, 947, 42296, 42300, - 42304, 42307, 42312, 42317, 42323, 42328, 42333, 42339, 42345, 42350, - 42354, 42359, 42364, 42369, 42373, 42376, 42382, 42387, 42392, 42397, - 42401, 42406, 42412, 42420, 32069, 42425, 42430, 42437, 42443, 42449, - 42454, 42462, 27478, 42469, 42474, 42479, 42484, 42488, 42491, 42496, - 42500, 42504, 42511, 42517, 42523, 42529, 42536, 42541, 42547, 41281, - 42551, 42555, 42560, 42573, 42578, 42584, 42592, 42599, 42607, 42617, - 42623, 42629, 42635, 42639, 42648, 42656, 42663, 42668, 42673, 12445, - 42678, 42688, 42695, 42701, 42711, 42716, 42722, 42730, 4017, 42737, - 42744, 42750, 42757, 4023, 42761, 42766, 42777, 42784, 42790, 42799, - 42803, 42806, 4609, 42813, 42820, 42826, 42832, 42840, 42850, 35414, - 42857, 42865, 42871, 42876, 42882, 42887, 42891, 31517, 42897, 42904, - 42910, 42918, 42927, 42934, 42940, 42951, 28772, 42957, 42964, 42970, - 42980, 42985, 42989, 42997, 43005, 43012, 43018, 43023, 11246, 941, - 43028, 43032, 43034, 43038, 43043, 43046, 43048, 43053, 43059, 43064, - 43069, 43076, 39484, 43082, 43087, 43091, 43096, 43100, 43109, 43113, - 43119, 43126, 43132, 43139, 43144, 43153, 43158, 43162, 43167, 43174, - 43182, 43190, 43195, 25956, 43199, 43202, 43206, 43210, 12889, 1005, - 43214, 43219, 43227, 43232, 43236, 43245, 43252, 43256, 43260, 43268, - 43275, 16260, 43285, 43289, 43293, 43301, 43309, 43315, 43320, 43324, - 43333, 16008, 43339, 43348, 43355, 43360, 43367, 43374, 43382, 43389, - 43397, 43405, 43414, 43419, 43426, 43433, 43440, 43447, 43454, 43459, - 43466, 43472, 43489, 43497, 43507, 43515, 43522, 43530, 461, 43534, - 43540, 43544, 43549, 40768, 43555, 43558, 43562, 43568, 43579, 43587, - 4028, 43595, 43601, 43607, 43617, 43623, 43632, 43641, 43651, 43658, - 43664, 43669, 4034, 4040, 43678, 43686, 43693, 43697, 14356, 43705, - 43709, 43716, 43724, 43731, 43740, 43747, 43753, 43762, 43772, 43778, - 43786, 43795, 43802, 43810, 43817, 26758, 43821, 43828, 43834, 43844, - 43853, 43861, 43872, 43876, 43886, 43893, 43898, 43903, 43909, 43916, - 43924, 43933, 43942, 43952, 43963, 43970, 43975, 43982, 3269, 43990, - 43996, 44001, 44008, 44014, 44020, 44025, 44038, 44051, 44064, 44071, - 44077, 44085, 44093, 44098, 44102, 44106, 44111, 44116, 44121, 44126, - 44131, 44136, 1365, 44141, 44145, 44149, 44153, 44157, 44161, 44165, - 44169, 44173, 44177, 44181, 44185, 44189, 44193, 44197, 44201, 44205, - 44209, 44213, 44217, 44221, 44225, 44229, 44233, 44237, 44241, 44245, - 44249, 44253, 44257, 44261, 44265, 44269, 44273, 44277, 44281, 44285, - 44289, 44293, 44297, 44301, 44305, 44309, 44313, 44317, 44321, 44325, - 44329, 44333, 44337, 44341, 44345, 44349, 44353, 44357, 44361, 44365, - 44369, 44373, 44377, 44381, 44385, 44389, 44393, 44397, 44401, 44405, - 44409, 44413, 44417, 44421, 44425, 44429, 44433, 44437, 44441, 44445, - 44449, 44453, 44457, 44461, 44465, 44469, 44473, 44477, 44481, 44485, - 44489, 44493, 44497, 44501, 44505, 44509, 44513, 44517, 44521, 44525, - 44529, 44533, 44537, 44541, 44545, 44549, 44553, 44557, 44561, 44565, - 44569, 44573, 44577, 44581, 44585, 44589, 44593, 44597, 44601, 44605, - 44609, 44613, 44617, 44621, 44625, 44629, 44633, 44637, 44641, 44645, - 44649, 44653, 44657, 44661, 44665, 44669, 44673, 44677, 44681, 44685, - 44689, 44693, 44697, 44701, 44705, 44709, 44713, 44717, 44721, 44725, - 44729, 44733, 44737, 44741, 44745, 44749, 44753, 44758, 44762, 44767, - 44771, 44776, 44780, 44785, 44789, 44795, 44800, 44804, 44809, 44813, - 44818, 44822, 44827, 44831, 44836, 44840, 44845, 44849, 44854, 44858, - 44864, 44870, 44875, 44879, 44884, 44888, 44894, 44899, 44903, 44908, - 44912, 44917, 44921, 44927, 44932, 44936, 44941, 44945, 44950, 44954, - 44959, 44963, 44969, 44974, 44978, 44983, 44987, 44993, 44998, 45002, - 45007, 45011, 45016, 45020, 45025, 45029, 45034, 45038, 45044, 45049, - 45053, 45059, 45064, 45068, 45074, 45079, 45083, 45088, 45092, 45097, - 45101, 45107, 45113, 45119, 45125, 45131, 45137, 45143, 45149, 45154, - 45158, 45163, 45167, 45173, 45178, 45182, 45187, 45191, 45196, 45200, - 45205, 45209, 45214, 45218, 45223, 45227, 45232, 45236, 45242, 45247, - 45251, 45256, 45260, 45266, 45272, 45277, 127, 63, 45281, 45283, 45287, - 45291, 45295, 45300, 45304, 45308, 45313, 11153, 45318, 45324, 1677, - 7181, 45330, 45333, 45338, 45342, 45347, 45351, 45355, 45360, 12233, - 45364, 45368, 45372, 630, 45376, 18561, 45381, 45385, 45390, 45395, - 45400, 45404, 45411, 45417, 45423, 31790, 45428, 45431, 45435, 45440, - 45446, 45450, 45453, 45461, 45467, 45472, 45476, 45479, 45483, 45489, - 45493, 45497, 3811, 3816, 15084, 45500, 45504, 45508, 45512, 45516, - 45524, 45531, 45535, 15958, 45542, 45556, 45563, 45574, 361, 45579, - 45583, 45589, 45601, 45607, 45613, 45618, 45624, 18613, 45628, 45632, - 35727, 45641, 45647, 45656, 45660, 45664, 45669, 45675, 45680, 45684, - 45689, 45693, 45697, 45704, 45710, 45715, 45726, 45741, 45756, 45771, - 45787, 45805, 12140, 45819, 45826, 45832, 45836, 45839, 45848, 45853, - 45857, 45865, 19242, 45873, 45877, 45887, 45898, 35617, 1042, 45911, - 45920, 45938, 45957, 45966, 45974, 45982, 1690, 12342, 45986, 27374, - 45989, 31556, 45994, 11478, 45999, 46005, 46010, 46016, 46021, 46027, - 46032, 46038, 46043, 46049, 46055, 46061, 46066, 46022, 46028, 46070, - 46033, 46039, 46044, 46075, 46050, 46056, 9184, 4434, 46081, 46089, - 46093, 46096, 46103, 46107, 46112, 46117, 46124, 46130, 46136, 46141, - 17850, 46145, 31573, 46149, 46153, 46157, 46164, 46170, 46174, 33931, - 46183, 10351, 46187, 10780, 46190, 46197, 46203, 46207, 14381, 46214, - 46220, 46225, 46232, 46239, 46246, 34730, 9081, 46253, 46260, 46267, - 46273, 46278, 46285, 46296, 46302, 46307, 46312, 46317, 46321, 46326, - 46333, 46023, 46337, 46347, 46356, 46367, 46373, 46381, 46388, 46393, - 46398, 46403, 46408, 46413, 46417, 46421, 46428, 46434, 46442, 2416, - 30582, 12245, 12257, 12262, 12268, 46451, 12273, 12278, 12284, 46456, - 46466, 46470, 12289, 46475, 20484, 46478, 46483, 46487, 46491, 46502, - 46510, 42204, 46518, 46523, 46530, 46537, 46541, 46544, 46552, 12153, - 46559, 46562, 46568, 46578, 6767, 46587, 46592, 46598, 46602, 46610, - 46614, 46624, 46630, 46635, 46646, 46655, 46664, 46673, 46682, 46691, - 46700, 46709, 46715, 46721, 46726, 46732, 46738, 46744, 46749, 46752, - 46759, 46765, 46769, 46774, 46781, 46788, 46792, 46795, 46805, 46818, - 46827, 46836, 46847, 46860, 46872, 46883, 46892, 46903, 46908, 46917, - 46922, 12294, 46928, 46935, 46943, 46950, 46955, 46960, 31836, 46964, - 46971, 4374, 25, 46975, 46980, 20333, 46984, 46987, 46990, 34122, 46994, - 34739, 47002, 47006, 47010, 47013, 47019, 47025, 47030, 37782, 47039, - 47047, 47053, 47060, 34105, 47064, 34342, 47068, 47077, 47081, 47089, - 47095, 47101, 47106, 47110, 34765, 47116, 47119, 47127, 47135, 47143, - 4772, 47149, 47153, 47157, 47162, 47169, 47175, 47180, 47185, 47189, - 47195, 47200, 47206, 4662, 820, 47213, 47217, 47220, 47232, 47239, 47244, - 18434, 47248, 47256, 47264, 47272, 47280, 47287, 47295, 47303, 47310, - 47318, 47326, 47334, 47342, 47350, 47358, 47366, 47374, 47382, 47390, - 47398, 47405, 47413, 47421, 47429, 47437, 47445, 47453, 47461, 47469, - 47477, 47485, 47493, 47501, 47509, 47517, 47525, 47533, 47541, 47549, - 47557, 47564, 47572, 47579, 47587, 47595, 47603, 47611, 47619, 47627, - 47635, 47643, 47654, 26794, 47659, 47662, 47669, 47673, 47679, 47683, - 47689, 47694, 47700, 47705, 47710, 47714, 47718, 47725, 47733, 47738, - 47743, 47753, 47759, 47772, 47778, 47784, 47790, 47793, 47800, 47805, - 4700, 47811, 4869, 965, 47816, 47819, 47822, 47825, 37866, 37872, 47828, - 37878, 37891, 37897, 37903, 47834, 37909, 37915, 47840, 47846, 10, 47854, - 47861, 47865, 47869, 47877, 38726, 47881, 47885, 47892, 47897, 47901, - 47906, 47912, 47917, 47923, 47928, 47932, 47936, 47940, 47945, 47949, - 47954, 47958, 47962, 47969, 47974, 47978, 47982, 47987, 47991, 47996, - 48000, 48004, 48009, 48015, 18743, 18748, 48020, 48024, 48027, 48033, - 48037, 48041, 25750, 48046, 48050, 48056, 48063, 48069, 48074, 40797, - 48084, 48089, 48097, 48101, 48104, 48108, 38741, 48116, 4738, 48121, - 48126, 48130, 48135, 48139, 48144, 16026, 48155, 48159, 48162, 48166, - 48174, 48179, 48183, 48188, 48193, 48197, 48201, 48205, 48208, 48212, - 48215, 48220, 48225, 48230, 48235, 48240, 48245, 8664, 16042, 48250, - 48253, 48259, 48264, 48270, 48275, 48281, 48286, 48292, 48297, 48303, - 48309, 48315, 48320, 48324, 48328, 48339, 48347, 48354, 48360, 48365, - 48376, 48386, 48392, 48397, 48404, 48413, 48429, 48445, 48455, 34007, - 48462, 48466, 48471, 48476, 48480, 48484, 43937, 48490, 48495, 48499, - 48506, 48511, 48516, 48520, 48523, 48527, 48533, 32802, 48537, 26108, - 48542, 48549, 48557, 48563, 48569, 48576, 48584, 48590, 48594, 48599, - 48605, 48613, 48618, 48622, 48631, 11134, 48639, 48643, 48651, 48658, - 48663, 48668, 48673, 48677, 48680, 48686, 48690, 48693, 48697, 48704, - 48709, 48716, 48720, 48726, 48730, 48736, 48741, 48746, 5107, 5114, - 48751, 48760, 48768, 48773, 48779, 48791, 48804, 48818, 48825, 48831, - 48837, 48842, 48850, 48853, 48855, 48866, 48878, 48889, 48904, 48921, - 48941, 48963, 48970, 48977, 48984, 48990, 48994, 8663, 48997, 49001, - 49005, 49010, 49014, 49018, 49021, 49025, 49039, 28019, 49058, 49071, - 49084, 49097, 28037, 49112, 2808, 49127, 49133, 49137, 49147, 49151, - 49155, 49160, 49164, 49171, 49176, 49180, 49187, 49193, 49198, 49204, - 49214, 49226, 49237, 49242, 49249, 49253, 49257, 49260, 49268, 19263, - 4141, 49273, 18782, 49286, 49293, 49300, 49306, 49310, 49314, 49319, - 49325, 49330, 49336, 49340, 49344, 49347, 49352, 49356, 49361, 49366, - 49371, 49376, 49381, 49386, 49391, 49396, 49401, 8727, 18793, 49406, - 49410, 49416, 49425, 49430, 49439, 49446, 43768, 49452, 49457, 49461, - 49468, 49473, 49480, 49488, 49494, 49498, 49501, 49505, 49510, 2886, - 49517, 49524, 49528, 49531, 49536, 49541, 49547, 49552, 49557, 49561, - 49566, 49576, 49581, 49587, 49592, 49599, 47234, 49605, 49611, 49619, - 49629, 49634, 49639, 49643, 49648, 49653, 8167, 8179, 49658, 49661, - 49668, 49674, 49683, 10268, 41421, 49691, 49695, 49699, 38789, 49707, - 49718, 49726, 43985, 49733, 49738, 49743, 49754, 49761, 49772, 38813, - 26125, 49780, 4652, 49785, 16459, 49791, 34096, 49797, 49802, 49812, - 49821, 49828, 49834, 49838, 49841, 49848, 49854, 49861, 49867, 49877, - 49885, 49891, 49897, 49902, 49906, 49913, 49918, 49924, 49931, 49937, - 49006, 49942, 49946, 16501, 16510, 16519, 16528, 16537, 16566, 622, - 16575, 49952, 49957, 49960, 49966, 49974, 1275, 49979, 49983, 49988, - 49993, 49997, 50002, 50009, 50015, 50019, 50024, 50030, 50034, 37939, - 50039, 50044, 50053, 50060, 50070, 50076, 34140, 50093, 50102, 50110, - 50116, 50121, 50128, 50134, 50142, 50151, 50159, 50167, 50173, 50177, - 50182, 50190, 35288, 38822, 50196, 50215, 19166, 50229, 50245, 50259, - 50265, 50270, 50275, 50280, 50286, 38828, 50291, 50294, 50301, 50308, - 50317, 50322, 50326, 423, 3176, 50333, 50338, 50343, 33196, 50131, 50347, - 50355, 50360, 50368, 50372, 50375, 50380, 50386, 50392, 50397, 50401, - 34213, 50404, 50409, 50413, 50416, 50421, 50425, 50430, 50435, 50439, - 50444, 50448, 50455, 50459, 50463, 25746, 25757, 50468, 50473, 50479, - 50484, 50490, 50496, 32758, 50501, 50505, 50508, 50514, 50519, 50524, - 50529, 50534, 50539, 50544, 50549, 50554, 50560, 50566, 14569, 19473, - 50571, 50576, 50581, 50586, 50591, 50596, 50601, 50606, 452, 68, 37956, - 37961, 37966, 37972, 37977, 37982, 50611, 37986, 50615, 50619, 50623, - 37991, 37997, 50637, 38008, 38013, 50645, 50650, 38019, 50655, 50660, - 50669, 50674, 50679, 50688, 50694, 50700, 50706, 38036, 50719, 50728, - 50734, 38040, 50738, 38045, 50743, 38050, 38055, 50746, 50751, 50755, - 50761, 16267, 50768, 16277, 50775, 50780, 38060, 50784, 50789, 50794, - 50799, 50804, 50808, 50813, 50818, 50824, 50829, 50834, 50840, 50846, - 50851, 50855, 50860, 50865, 50870, 50874, 50879, 50884, 50889, 50895, - 50901, 50907, 50912, 50916, 50921, 50925, 38064, 38069, 38074, 50929, - 50933, 50938, 50942, 50954, 38079, 38085, 38091, 38103, 50960, 31616, - 50964, 50969, 50973, 50978, 50985, 50990, 50995, 51000, 51004, 51008, - 51018, 51023, 51028, 51032, 51042, 51046, 51049, 51057, 51062, 38151, - 51066, 1375, 51072, 51077, 51083, 51091, 51095, 51104, 51112, 51116, - 51120, 51128, 51134, 51142, 51158, 51163, 51167, 51171, 51175, 51180, - 51186, 51201, 38188, 1685, 14601, 51205, 1254, 1269, 51217, 51225, 51232, - 51237, 9230, 51244, 51249, 10765, 978, 2641, 12321, 51256, 10658, 51261, - 51264, 51273, 1162, 51278, 49177, 51285, 51294, 51299, 51303, 51311, - 51318, 27424, 2697, 51326, 12842, 51336, 51342, 2434, 2444, 51351, 51360, - 51370, 51381, 3584, 41818, 51386, 4341, 4352, 9258, 1167, 51390, 51398, - 51405, 51410, 51414, 51418, 51423, 29054, 49512, 12412, 51431, 51440, - 51449, 51457, 51470, 51477, 51488, 51493, 51506, 51519, 51531, 51543, - 51555, 51566, 51579, 51590, 51601, 51611, 51619, 51627, 51639, 51651, - 51662, 51671, 51679, 51686, 51698, 51705, 51711, 51720, 51726, 51733, - 51746, 51751, 51761, 51766, 51772, 51777, 32098, 51781, 48682, 51788, - 51795, 51803, 51810, 2654, 51817, 51828, 51838, 51847, 51855, 51865, - 51873, 51882, 51892, 51901, 51906, 51912, 51918, 4190, 51929, 51939, - 51948, 51957, 51965, 51975, 51983, 51992, 51997, 52002, 52007, 1604, 47, - 52015, 52023, 52034, 52045, 19877, 52055, 52059, 52066, 52072, 52077, - 52081, 52092, 52102, 52111, 52122, 52127, 20306, 20311, 52134, 52143, - 52148, 52158, 52163, 52171, 52179, 52186, 52192, 1566, 271, 52196, 52201, - 52207, 46085, 52212, 52215, 2182, 2663, 52223, 52227, 52230, 1420, 52236, - 16787, 1172, 52241, 52254, 2797, 2818, 52268, 52280, 52292, 2832, 2849, - 2864, 2880, 2897, 52306, 52318, 2912, 52332, 1178, 1184, 1190, 12713, - 52337, 52342, 52347, 52351, 52366, 52381, 52396, 52411, 52426, 52441, - 52456, 52471, 52486, 52501, 52516, 52531, 52546, 52561, 52576, 52591, - 52606, 52621, 52636, 52651, 52666, 52681, 52696, 52711, 52726, 52741, - 52756, 52771, 52786, 52801, 52816, 52831, 52846, 52861, 52876, 52891, - 52906, 52921, 52936, 52951, 52966, 52981, 52996, 53011, 53026, 53041, - 53056, 53071, 53086, 53101, 53116, 53131, 53146, 53161, 53176, 53191, - 53206, 53221, 53236, 53251, 53266, 53281, 53296, 53311, 53326, 53341, - 53356, 53371, 53386, 53401, 53416, 53431, 53446, 53461, 53476, 53491, - 53506, 53521, 53536, 53551, 53566, 53581, 53596, 53611, 53626, 53641, - 53656, 53671, 53686, 53701, 53716, 53731, 53746, 53761, 53776, 53791, - 53806, 53821, 53836, 53851, 53866, 53881, 53896, 53911, 53926, 53941, - 53956, 53971, 53986, 54001, 54016, 54031, 54046, 54061, 54076, 54091, - 54106, 54121, 54136, 54151, 54166, 54181, 54196, 54211, 54226, 54241, - 54256, 54271, 54286, 54301, 54316, 54331, 54346, 54361, 54376, 54391, - 54406, 54421, 54436, 54451, 54466, 54481, 54496, 54511, 54526, 54541, - 54556, 54571, 54586, 54601, 54616, 54631, 54646, 54661, 54676, 54691, - 54706, 54721, 54736, 54751, 54766, 54781, 54796, 54811, 54826, 54841, - 54856, 54871, 54886, 54901, 54916, 54931, 54946, 54961, 54976, 54991, - 55006, 55021, 55036, 55051, 55066, 55081, 55096, 55111, 55126, 55141, - 55156, 55171, 55186, 55201, 55216, 55231, 55246, 55261, 55276, 55291, - 55306, 55321, 55336, 55351, 55366, 55381, 55396, 55411, 55426, 55441, - 55456, 55471, 55486, 55501, 55516, 55531, 55546, 55561, 55576, 55591, - 55606, 55621, 55636, 55651, 55666, 55681, 55696, 55711, 55726, 55741, - 55756, 55771, 55786, 55801, 55816, 55831, 55846, 55861, 55876, 55891, - 55906, 55921, 55936, 55951, 55966, 55981, 55996, 56011, 56026, 56041, - 56056, 56071, 56086, 56101, 56116, 56131, 56146, 56161, 56176, 56191, - 56206, 56221, 56236, 56251, 56266, 56281, 56296, 56311, 56326, 56341, - 56356, 56371, 56386, 56401, 56416, 56431, 56446, 56461, 56476, 56491, - 56506, 56521, 56536, 56551, 56566, 56581, 56596, 56611, 56626, 56641, - 56656, 56671, 56686, 56701, 56716, 56731, 56746, 56761, 56776, 56791, - 56806, 56821, 56836, 56851, 56866, 56881, 56896, 56911, 56926, 56941, - 56956, 56971, 56986, 57001, 57016, 57031, 57046, 57061, 57076, 57091, - 57106, 57121, 57136, 57151, 57166, 57181, 57196, 57211, 57226, 57241, - 57256, 57271, 57286, 57301, 57316, 57331, 57346, 57361, 57376, 57391, - 57406, 57421, 57436, 57451, 57466, 57481, 57496, 57511, 57526, 57541, - 57556, 57571, 57586, 57601, 57616, 57631, 57646, 57661, 57676, 57691, - 57706, 57721, 57736, 57751, 57766, 57781, 57796, 57811, 57826, 57841, - 57856, 57871, 57886, 57901, 57916, 57931, 57946, 57961, 57976, 57991, - 58006, 58021, 58036, 58051, 58066, 58081, 58096, 58111, 58126, 58141, - 58156, 58171, 58186, 58201, 58216, 58231, 58246, 58261, 58276, 58291, - 58306, 58321, 58336, 58351, 58366, 58381, 58396, 58411, 58426, 58441, - 58456, 58471, 58486, 58501, 58516, 58531, 58546, 58561, 58576, 58591, - 58606, 58621, 58636, 58651, 58666, 58681, 58696, 58711, 58726, 58741, - 58756, 58771, 58786, 58801, 58816, 58831, 58846, 58861, 58876, 58891, - 58906, 58921, 58936, 58951, 58966, 58981, 58996, 59011, 59026, 59041, - 59056, 59071, 59086, 59101, 59116, 59131, 59146, 59161, 59176, 59191, - 59206, 59221, 59236, 59251, 59266, 59281, 59296, 59311, 59326, 59341, - 59356, 59371, 59386, 59401, 59416, 59431, 59446, 59461, 59476, 59491, - 59506, 59521, 59536, 59551, 59566, 59581, 59596, 59611, 59626, 59641, - 59656, 59671, 59686, 59701, 59716, 59731, 59746, 59761, 59776, 59791, - 59806, 59821, 59836, 59851, 59866, 59881, 59896, 59911, 59926, 59941, - 59956, 59971, 59986, 60001, 60016, 60031, 60046, 60061, 60076, 60091, - 60106, 60121, 60136, 60151, 60166, 60182, 60198, 60214, 60230, 60246, - 60262, 60278, 60294, 60310, 60326, 60342, 60358, 60374, 60390, 60406, - 60422, 60438, 60454, 60470, 60486, 60502, 60518, 60534, 60550, 60566, - 60582, 60598, 60614, 60630, 60646, 60662, 60678, 60694, 60710, 60726, - 60742, 60758, 60774, 60790, 60806, 60822, 60838, 60854, 60870, 60886, - 60902, 60918, 60934, 60950, 60966, 60982, 60998, 61014, 61030, 61046, - 61062, 61078, 61094, 61110, 61126, 61142, 61158, 61174, 61190, 61206, - 61222, 61238, 61254, 61270, 61286, 61302, 61318, 61334, 61350, 61366, - 61382, 61398, 61414, 61430, 61446, 61462, 61478, 61494, 61510, 61526, - 61542, 61558, 61574, 61590, 61606, 61622, 61638, 61654, 61670, 61686, - 61702, 61718, 61734, 61750, 61766, 61782, 61798, 61814, 61830, 61846, - 61862, 61878, 61894, 61910, 61926, 61942, 61958, 61974, 61990, 62006, - 62022, 62038, 62054, 62070, 62086, 62102, 62118, 62134, 62150, 62166, - 62182, 62198, 62214, 62230, 62246, 62262, 62278, 62294, 62310, 62326, - 62342, 62358, 62374, 62390, 62406, 62422, 62438, 62454, 62470, 62486, - 62502, 62518, 62534, 62550, 62566, 62582, 62598, 62614, 62630, 62646, - 62662, 62678, 62694, 62710, 62726, 62742, 62758, 62774, 62790, 62806, - 62822, 62838, 62854, 62870, 62886, 62902, 62918, 62934, 62950, 62966, - 62982, 62998, 63014, 63030, 63046, 63062, 63078, 63094, 63110, 63126, - 63142, 63158, 63174, 63190, 63206, 63222, 63238, 63254, 63270, 63286, - 63302, 63318, 63334, 63350, 63366, 63382, 63398, 63414, 63430, 63446, - 63462, 63478, 63494, 63510, 63526, 63542, 63558, 63574, 63590, 63606, - 63622, 63638, 63654, 63670, 63686, 63702, 63718, 63734, 63750, 63766, - 63782, 63798, 63814, 63830, 63846, 63862, 63878, 63894, 63910, 63926, - 63942, 63958, 63974, 63990, 64006, 64022, 64038, 64054, 64070, 64086, - 64102, 64118, 64134, 64150, 64166, 64182, 64198, 64214, 64230, 64246, - 64262, 64278, 64294, 64310, 64326, 64342, 64358, 64374, 64390, 64406, - 64422, 64438, 64454, 64470, 64486, 64502, 64518, 64534, 64550, 64566, - 64582, 64598, 64614, 64630, 64646, 64662, 64678, 64694, 64710, 64726, - 64742, 64758, 64774, 64790, 64806, 64822, 64838, 64854, 64870, 64886, - 64902, 64918, 64934, 64950, 64966, 64982, 64998, 65014, 65030, 65046, - 65062, 65078, 65094, 65110, 65126, 65142, 65158, 65174, 65190, 65206, - 65222, 65238, 65254, 65270, 65286, 65302, 65318, 65334, 65350, 65366, - 65382, 65398, 65414, 65430, 65446, 65462, 65478, 65494, 65510, 65526, - 65542, 65558, 65574, 65590, 65606, 65622, 65638, 65654, 65670, 65686, - 65702, 65718, 65734, 65750, 65766, 65782, 65798, 65814, 65830, 65846, - 65862, 65878, 65894, 65910, 65926, 65942, 65958, 65974, 65990, 66006, - 66022, 66038, 66054, 66070, 66086, 66102, 66118, 66134, 66150, 66166, - 66182, 66198, 66214, 66230, 66246, 66262, 66278, 66294, 66310, 66326, - 66342, 66358, 66374, 66390, 66406, 66422, 66438, 66454, 66470, 66486, - 66502, 66518, 66534, 66550, 66566, 66582, 66598, 66614, 66630, 66646, - 66662, 66678, 66694, 66710, 66726, 66742, 66758, 66774, 66790, 66806, - 66822, 66838, 66854, 66870, 66886, 66902, 66918, 66934, 66950, 66966, - 66982, 66998, 67014, 67030, 67046, 67062, 67078, 67094, 67110, 67126, - 67142, 67158, 67174, 67190, 67206, 67222, 67238, 67254, 67270, 67286, - 67302, 67318, 67334, 67350, 67366, 67382, 67398, 67414, 67430, 67446, - 67462, 67478, 67494, 67510, 67526, 67542, 67558, 67574, 67590, 67606, - 67622, 67638, 67654, 67670, 67686, 67702, 67718, 67734, 67750, 67766, - 67782, 67798, 67814, 67830, 67846, 67862, 67878, 67894, 67910, 67926, - 67942, 67958, 67974, 67990, 68006, 68022, 68038, 68054, 68070, 68086, - 68102, 68118, 68134, 68150, 68166, 68182, 68198, 68214, 68230, 68246, - 68262, 68278, 68294, 68310, 68326, 68342, 68358, 68374, 68390, 68406, - 68422, 68438, 68454, 68470, 68486, 68502, 68518, 68534, 68550, 68566, - 68582, 68598, 68614, 68630, 68646, 68662, 68678, 68694, 68710, 68726, - 68742, 68758, 68774, 68790, 68806, 68822, 68838, 68847, 68862, 68876, - 68885, 17689, 68889, 68894, 68900, 68906, 68916, 68924, 17946, 18677, - 9277, 68937, 1428, 1432, 68945, 4270, 33321, 8104, 68951, 68956, 68961, - 68966, 68971, 68977, 68982, 68988, 68993, 68999, 69004, 69009, 69014, - 69019, 69025, 69030, 69035, 69040, 69045, 69050, 69055, 69060, 69066, - 69071, 69077, 69084, 2701, 69089, 69095, 9652, 69099, 69104, 69111, - 69119, 4281, 4286, 4291, 4296, 65, 69123, 69129, 69134, 69139, 69143, - 69148, 69152, 69156, 12785, 69160, 69170, 69183, 69194, 69207, 69214, - 69220, 69228, 69235, 12246, 69244, 69249, 69255, 69261, 69267, 69272, - 69277, 69282, 69287, 69291, 69296, 69301, 69306, 69312, 69318, 69324, - 69329, 69333, 69338, 69343, 69347, 69352, 69357, 69362, 69366, 12801, - 12812, 12817, 1471, 69370, 69376, 1476, 19711, 69381, 19720, 1486, 69386, - 69392, 69397, 1507, 69403, 1513, 1519, 12847, 69408, 69417, 69425, 69433, - 69440, 69444, 69448, 69454, 69459, 37599, 69464, 69471, 69479, 69486, - 69491, 69495, 69499, 69508, 69513, 69518, 69523, 1524, 280, 69528, 69533, - 69537, 19846, 987, 69541, 69548, 69553, 69557, 19904, 1528, 46361, 69560, - 69565, 69575, 69584, 69589, 69593, 69599, 1533, 49458, 69604, 69613, - 69619, 69624, 69629, 13086, 13092, 69635, 69648, 69660, 69677, 69694, - 69711, 69728, 69745, 69762, 69779, 69796, 69813, 69830, 69847, 69864, - 69881, 69898, 69915, 69932, 69949, 69966, 69983, 70000, 70017, 70034, - 70051, 70068, 70085, 70102, 70119, 70136, 70153, 70170, 70187, 70204, - 70221, 70238, 70255, 70272, 70289, 70306, 70323, 70340, 70357, 70374, - 70391, 70408, 70425, 70442, 70459, 70476, 70493, 70504, 70514, 70519, - 1538, 70523, 70528, 70534, 70539, 70544, 70551, 10677, 1543, 70557, - 70566, 33713, 70571, 70582, 13108, 70592, 70597, 70603, 70608, 70615, - 70621, 70626, 1548, 20198, 70631, 70637, 13118, 70643, 70648, 70653, - 70658, 70663, 70668, 70673, 70678, 1553, 4761, 70683, 70688, 70694, - 70699, 70704, 70709, 70714, 70719, 70724, 70729, 70734, 70740, 70746, - 70752, 70757, 70761, 70766, 70771, 70775, 70780, 70785, 70790, 70795, - 70799, 70804, 70810, 70815, 70820, 70824, 70829, 70834, 70840, 70845, - 70850, 70856, 70862, 70867, 70871, 70876, 70881, 70886, 70890, 70895, - 70900, 70905, 70911, 70917, 70922, 70926, 70930, 70935, 70940, 70945, - 35492, 70949, 70954, 70959, 70965, 70970, 70975, 70979, 70984, 70989, - 70995, 71000, 71005, 71011, 71017, 71022, 71026, 71031, 71036, 71040, - 71045, 71050, 71055, 71061, 71067, 71072, 71076, 71081, 71086, 71090, - 71095, 71100, 71105, 71110, 71114, 71117, 71120, 71125, 71130, 38335, - 71137, 71145, 50085, 71151, 3928, 33656, 71164, 71171, 71177, 71183, - 4107, 71188, 13260, 71194, 71204, 71219, 71227, 13265, 71238, 71243, - 71254, 71266, 71278, 71290, 2903, 71302, 71307, 31699, 71319, 71325, - 71331, 71336, 71345, 71352, 71357, 71362, 71367, 71372, 71377, 71382, - 1570, 19338, 71387, 71392, 71397, 71402, 71408, 71413, 71419, 71424, - 71429, 71435, 71440, 71445, 49532, 71449, 71453, 71458, 71462, 20346, - 71467, 71470, 71475, 71483, 71491, 1574, 13301, 13307, 1579, 71499, - 71506, 71511, 71520, 71530, 71537, 71542, 71547, 1584, 71554, 71559, - 20466, 71563, 71568, 71575, 71581, 71585, 71598, 71604, 71615, 71625, - 71632, 20488, 10571, 10578, 4355, 4361, 71639, 1589, 71644, 71653, 71659, - 71667, 71674, 71680, 71687, 71699, 71705, 71710, 71717, 71729, 71740, - 71750, 71759, 71769, 71779, 4249, 71787, 37393, 37402, 20528, 71800, - 71805, 71810, 71815, 71820, 71825, 71830, 1594, 1598, 71835, 71839, - 71842, 71853, 71858, 20554, 1608, 71866, 71871, 71876, 71888, 20587, - 71895, 71898, 71904, 71910, 71915, 71923, 1613, 71928, 71933, 71941, - 71949, 71956, 71965, 71973, 71982, 71986, 1618, 71995, 1623, 25931, - 72000, 72007, 72013, 20674, 72021, 72031, 72037, 72042, 72050, 72057, - 72066, 72074, 72084, 72093, 72103, 72112, 72123, 72133, 72143, 72152, - 72162, 72176, 72189, 72198, 72206, 72216, 72225, 72237, 72248, 72259, - 72269, 19966, 72274, 13453, 72283, 72289, 72294, 72301, 72307, 72314, - 72320, 19555, 72330, 72336, 72341, 72352, 72359, 72366, 72371, 72379, - 13470, 13475, 72387, 72393, 72397, 4339, 4350, 20750, 49635, 72405, - 72411, 72416, 72424, 72431, 14582, 72436, 72442, 72448, 1634, 72453, - 72456, 72462, 72467, 72472, 72477, 72482, 72487, 72492, 72497, 72502, - 72508, 72514, 1333, 72519, 72524, 72529, 72535, 72540, 72545, 72550, - 72555, 72560, 72565, 1643, 18, 72571, 72575, 72580, 72584, 72588, 72592, - 38621, 72597, 28238, 72602, 72607, 72611, 72614, 72618, 72622, 72627, - 72631, 72636, 72640, 72643, 72649, 42308, 42313, 42318, 72652, 72659, - 72665, 72673, 49230, 72683, 72689, 42324, 38885, 38636, 38642, 42340, - 38648, 72694, 72699, 72703, 38918, 72710, 72713, 72717, 72725, 72732, - 72737, 72740, 72745, 72750, 72754, 72758, 72761, 72771, 72783, 72790, - 72796, 38653, 72803, 40604, 72806, 9669, 13815, 72809, 72813, 72818, - 4159, 72822, 72825, 16320, 72832, 72839, 72852, 72867, 72881, 72897, - 72912, 72921, 72929, 72937, 72946, 72950, 72959, 72965, 72970, 72980, - 72993, 73005, 73012, 73017, 73026, 73039, 44032, 73057, 73062, 73069, - 73075, 73080, 895, 73085, 73093, 73100, 73107, 33137, 914, 73113, 73119, - 73124, 73134, 73142, 73148, 73153, 38672, 6858, 38686, 73157, 73167, - 73172, 73180, 73190, 73205, 73211, 73217, 73224, 38696, 73229, 73235, - 37737, 73239, 73243, 73248, 73257, 73264, 73269, 73273, 73278, 73286, - 20531, 73293, 73298, 73302, 6899, 38722, 73306, 73312, 341, 73322, 73329, - 73336, 73342, 73349, 73354, 73363, 15941, 69569, 69579, 73369, 73377, - 73381, 73385, 73389, 73393, 73398, 73402, 73408, 73416, 73421, 73426, - 73433, 73438, 73442, 73447, 73451, 73455, 73461, 73467, 73478, 73484, - 73489, 73493, 73498, 73502, 38846, 73506, 38852, 38858, 73511, 73517, - 73524, 73529, 73533, 37754, 20185, 73536, 73540, 73545, 73552, 73558, - 73562, 73567, 48699, 73573, 73577, 73584, 73588, 73593, 73599, 73605, - 73611, 73623, 73632, 73642, 73648, 73655, 73660, 73665, 73669, 73672, - 73678, 73685, 73690, 73695, 73702, 73709, 73716, 73722, 73727, 73732, - 73740, 38863, 2531, 73745, 73750, 73756, 73761, 73767, 73772, 73777, - 73782, 73788, 38884, 73793, 73799, 73805, 73811, 38954, 73816, 73821, - 73826, 38965, 73831, 73836, 73841, 73847, 73853, 38970, 73858, 73863, - 73868, 39025, 39031, 73873, 73878, 39036, 39058, 33998, 39064, 39068, - 73883, 14258, 73887, 73895, 73901, 73909, 73916, 73922, 73932, 73938, - 73945, 12685, 39082, 73951, 73964, 73973, 73979, 73988, 73994, 74000, - 74007, 28581, 74015, 74022, 74032, 74040, 74043, 39026, 74048, 74055, - 74060, 74064, 74068, 74073, 74077, 4478, 74082, 74087, 74092, 42402, - 42407, 74096, 42421, 74101, 42426, 74106, 74112, 42438, 42444, 42450, - 74117, 74123, 27479, 74134, 74137, 74149, 74157, 39105, 74161, 74170, - 74180, 74189, 39115, 74194, 74201, 74210, 74216, 74224, 74231, 74238, - 6950, 5174, 74243, 39037, 74249, 74252, 74258, 74265, 74270, 74275, - 28485, 74279, 74285, 74291, 74296, 74301, 74305, 74311, 74317, 40488, - 74322, 43626, 45463, 45469, 39146, 39151, 74326, 74330, 74334, 74337, - 74350, 74356, 74360, 74363, 74368, 40870, 74372, 37759, 25872, 74378, - 6879, 6887, 10377, 74381, 74386, 74391, 74396, 74401, 74406, 74411, - 74416, 74421, 74426, 74432, 74437, 74442, 74448, 74453, 74458, 74463, - 74468, 74473, 74478, 74484, 74489, 74495, 74500, 74505, 74510, 74515, - 74520, 74525, 74530, 74535, 74540, 74545, 74551, 74556, 74561, 74566, - 74571, 74576, 74581, 74587, 74592, 74597, 74602, 74607, 74612, 74617, - 74622, 74627, 74632, 74638, 74643, 74648, 74653, 74658, 74664, 74670, - 74675, 74681, 74686, 74691, 74696, 74701, 74706, 1421, 159, 74711, 74715, - 74719, 74723, 30435, 74727, 74731, 74736, 74740, 74745, 74749, 74754, - 74759, 74764, 74769, 74773, 74777, 74782, 74786, 16020, 74791, 74795, - 74802, 74812, 18315, 74821, 74830, 74839, 74843, 74848, 74853, 74857, - 74861, 30215, 3259, 74865, 74871, 21763, 74875, 74884, 74892, 74898, - 74903, 74915, 74927, 74932, 74936, 74941, 74945, 74951, 74957, 74962, - 74972, 74982, 74988, 74996, 75001, 75005, 75011, 75016, 75023, 75029, - 75034, 75041, 75050, 75059, 75067, 75071, 18871, 75074, 75083, 75091, - 75103, 75114, 75125, 75134, 75138, 75147, 75155, 75165, 75173, 75180, - 75190, 75196, 75201, 75209, 75216, 75225, 75231, 75236, 75243, 75249, - 75260, 60, 37536, 75266, 31986, 31996, 75272, 75280, 75287, 75293, 75297, - 75307, 75318, 75326, 75335, 75340, 75345, 75350, 75354, 75358, 75366, - 21710, 75373, 75377, 75383, 75393, 75400, 75407, 75413, 75419, 42501, - 75423, 75425, 75428, 75434, 75438, 75449, 75459, 75465, 75472, 75479, - 15957, 75487, 75493, 75502, 75511, 75517, 11579, 75523, 75529, 75534, - 75539, 75546, 75551, 75558, 75564, 75569, 75577, 75590, 75599, 75608, - 72138, 72148, 75618, 75624, 75633, 75639, 75645, 75652, 75659, 75666, - 75673, 75680, 75685, 75689, 75693, 75696, 75706, 75710, 75722, 75731, - 10038, 75740, 75751, 75756, 75760, 72157, 75766, 75773, 75782, 75790, - 51037, 75798, 75802, 75807, 75812, 75822, 75830, 75842, 75847, 75851, - 75855, 75861, 75869, 75876, 75888, 75896, 75907, 75914, 75920, 75930, - 75936, 75940, 75949, 75958, 75965, 75971, 75976, 75980, 75984, 75988, - 75997, 76006, 76015, 76022, 76028, 76034, 76040, 76045, 76052, 76058, - 76066, 76073, 76079, 15046, 76084, 76090, 76094, 17172, 76098, 76103, - 76113, 76118, 76127, 76133, 76139, 76147, 76154, 76158, 76162, 76169, - 76175, 76183, 76190, 76196, 76207, 76211, 76215, 76219, 76222, 76228, - 76233, 76238, 76242, 76246, 76255, 76263, 76270, 76276, 76283, 29245, - 48840, 76288, 76296, 76300, 76304, 76307, 76315, 76322, 76328, 76337, - 76345, 76351, 76356, 76360, 76365, 76370, 76374, 76378, 76382, 76387, - 76396, 76400, 76407, 45567, 76411, 76417, 76425, 76429, 76435, 76443, - 76449, 76454, 76465, 76473, 76479, 76488, 27626, 76496, 76503, 76510, - 76517, 76524, 76531, 52526, 15772, 76538, 76545, 76550, 42537, 4721, - 76556, 76561, 76566, 76572, 76578, 76584, 76589, 76594, 76599, 76604, - 76610, 76615, 76621, 76626, 76632, 76637, 76642, 76647, 76652, 76657, - 76662, 76667, 76673, 76678, 76684, 76689, 76694, 76699, 76704, 76709, - 76714, 76720, 76725, 76730, 76735, 76740, 76745, 76750, 76755, 76760, - 76765, 76770, 76776, 76781, 76786, 76791, 76796, 76801, 76806, 76811, - 76816, 76822, 76827, 76832, 76837, 76842, 76847, 76852, 76857, 76862, - 76867, 76872, 76877, 76882, 76888, 1883, 305, 76893, 46479, 46484, 76897, - 76902, 9293, 76906, 3628, 76911, 76916, 76920, 76929, 76940, 76957, - 76975, 76983, 75794, 76990, 76993, 77003, 77010, 77019, 77035, 77044, - 77054, 77059, 77072, 77082, 77091, 77099, 77113, 77121, 77130, 77134, - 77137, 77144, 77150, 77161, 77168, 77180, 77191, 77202, 77211, 77218, - 1173, 812, 77228, 2744, 77232, 77237, 77246, 997, 9059, 25308, 77254, - 77262, 77276, 77289, 77293, 77298, 77303, 77308, 77314, 77320, 77325, - 9661, 18358, 77330, 77334, 77338, 77346, 10098, 77351, 77357, 77366, - 77374, 1657, 13314, 1179, 4393, 77378, 77382, 77391, 77401, 2482, 32836, - 77410, 77416, 20438, 32851, 77422, 4558, 13696, 77428, 77435, 71848, - 77439, 77443, 77449, 77454, 77459, 3861, 163, 3887, 77464, 77476, 77480, - 77484, 77490, 77495, 33733, 77499, 13684, 2938, 4, 77504, 77514, 77525, - 77536, 77546, 77552, 77563, 77570, 77576, 77582, 2306, 77587, 77595, - 77602, 77608, 77618, 77628, 77638, 77647, 28568, 1185, 77652, 77656, - 77660, 77666, 77670, 2961, 2967, 9658, 2337, 77674, 77678, 77687, 77695, - 77706, 77714, 77722, 77728, 77733, 77744, 77755, 77763, 77769, 77774, - 11356, 77784, 77792, 77796, 77800, 77805, 77809, 77821, 34196, 18257, - 77828, 77838, 77844, 77850, 7977, 11490, 77860, 77871, 77882, 77892, - 77901, 77905, 77912, 999, 2731, 77922, 77927, 77935, 71564, 77943, 77948, - 77959, 77966, 77980, 16968, 529, 77990, 77997, 78001, 78005, 78013, - 78022, 4433, 78030, 78036, 20483, 78041, 78055, 78062, 78068, 78076, - 78085, 78094, 78101, 78113, 78123, 78131, 78138, 78146, 78153, 4357, 116, - 78161, 78172, 78176, 78188, 78194, 1804, 227, 78199, 10709, 78204, 3006, - 78208, 78215, 78221, 78232, 78242, 78250, 78257, 10049, 78264, 78273, - 78281, 4438, 78294, 4455, 78298, 78303, 78309, 78314, 78319, 78324, 3011, - 573, 78330, 78343, 78347, 78352, 78357, 3016, 1882, 763, 78361, 4459, - 78369, 78375, 78379, 799, 78389, 78398, 78403, 3878, 78407, 78411, 17989, - 17996, 9317, 78419, 4490, 4367, 15644, 78427, 78434, 78439, 28632, 78443, - 78450, 78456, 13952, 78461, 14017, 204, 78466, 78478, 78484, 78492, 3028, - 1699, 78500, 78502, 78507, 78512, 78517, 78523, 78528, 78533, 78538, - 78543, 78548, 78553, 78559, 78564, 78569, 78574, 78579, 78584, 78589, - 78594, 78599, 78605, 78610, 78615, 78620, 78626, 78631, 78637, 78642, - 78647, 78652, 78657, 78662, 78667, 78672, 78678, 78683, 78689, 78694, - 78699, 78704, 78709, 78714, 78719, 78724, 78729, 9730, 9743, 4506, 4511, - 4516, 4521, 26, 78735, 78741, 78746, 78751, 78756, 78762, 78767, 78771, - 78775, 78780, 78786, 78790, 78796, 78801, 78806, 78812, 78817, 78821, - 78826, 78831, 78835, 78838, 78840, 78844, 78847, 78854, 78859, 78863, - 78868, 78872, 78876, 78880, 78886, 78897, 78917, 78936, 78957, 78970, - 78982, 78991, 78995, 78998, 39423, 79001, 39428, 79008, 79013, 39433, - 79022, 79031, 39439, 79036, 39444, 79045, 79050, 13941, 79054, 79059, - 79064, 39449, 79068, 79077, 50696, 79081, 79084, 79088, 9325, 79094, - 79097, 79102, 79107, 79112, 79116, 4179, 39454, 79119, 79123, 79126, - 79137, 79142, 79146, 79152, 79160, 79173, 79177, 79185, 79194, 79200, - 79205, 79211, 79215, 79221, 79227, 79235, 79240, 79244, 79251, 79257, - 79265, 79274, 79282, 39457, 79289, 79299, 79308, 79316, 79327, 79340, - 79345, 79350, 79354, 79363, 79369, 79376, 79389, 79401, 79412, 79424, - 79431, 79440, 79449, 79458, 79465, 79471, 79478, 79486, 79493, 79501, - 79510, 79518, 79525, 79533, 79542, 79550, 79559, 79569, 79578, 79586, - 79593, 79601, 79610, 79618, 79627, 79637, 79646, 79654, 79663, 79673, - 79682, 79692, 79703, 79713, 79722, 79730, 79737, 79745, 79754, 79762, - 79771, 79781, 79790, 79798, 79807, 79817, 79826, 79836, 79847, 79857, - 79866, 79874, 79883, 79893, 79902, 79912, 79923, 79933, 79942, 79952, - 79963, 79973, 79984, 79996, 80007, 80017, 80026, 80034, 80041, 80049, - 80058, 80066, 80075, 80085, 80094, 80102, 80111, 80121, 80130, 80140, - 80151, 80161, 80170, 80178, 80187, 80197, 80206, 80216, 80227, 80237, - 80246, 80256, 80267, 80277, 80288, 80300, 80311, 80321, 80330, 80338, - 80347, 80357, 80366, 80376, 80387, 80397, 80406, 80416, 80427, 80437, - 80448, 80460, 80471, 80481, 80490, 80500, 80511, 80521, 80532, 80544, - 80555, 80565, 80576, 80588, 80599, 80611, 80624, 80636, 80647, 80657, - 80666, 80674, 80681, 80689, 80698, 80706, 80715, 80725, 80734, 80742, - 80751, 80761, 80770, 80780, 80791, 80801, 80810, 80818, 80827, 80837, - 80846, 80856, 80867, 80877, 80886, 80896, 80907, 80917, 80928, 80940, - 80951, 80961, 80970, 80978, 80987, 80997, 81006, 81016, 81027, 81037, - 81046, 81056, 81067, 81077, 81088, 81100, 81111, 81121, 81130, 81140, - 81151, 81161, 81172, 81184, 81195, 81205, 81216, 81228, 81239, 81251, - 81264, 81276, 81287, 81297, 81306, 81314, 81323, 81333, 81342, 81352, - 81363, 81373, 81382, 81392, 81403, 81413, 81424, 81436, 81447, 81457, - 81466, 81476, 81487, 81497, 81508, 81520, 81531, 81541, 81552, 81564, - 81575, 81587, 81600, 81612, 81623, 81633, 81642, 81652, 81663, 81673, - 81684, 81696, 81707, 81717, 81728, 81740, 81751, 81763, 81776, 81788, - 81799, 81809, 81820, 81832, 81843, 81855, 81868, 81880, 81891, 81903, - 81916, 81928, 81941, 81955, 81968, 81980, 81991, 82001, 82010, 82018, - 82025, 82030, 9090, 82037, 82042, 39467, 82048, 82053, 39472, 82059, - 82066, 25430, 31434, 82071, 82077, 82083, 82091, 82097, 82103, 82110, - 82117, 82122, 82127, 82131, 82136, 82140, 82143, 82147, 82152, 82161, - 82170, 82178, 82184, 82196, 82207, 82211, 3321, 9065, 82216, 82219, - 82222, 82224, 82228, 82232, 82236, 82242, 82247, 31497, 82252, 82256, - 82259, 82264, 82268, 82275, 82281, 82285, 7060, 82289, 82294, 39494, - 82298, 82305, 82314, 82322, 82328, 82339, 82347, 82356, 82364, 82371, - 82378, 82384, 82389, 82400, 39499, 82405, 82416, 82428, 82436, 82447, - 82456, 82464, 82475, 82480, 82488, 2696, 82493, 82502, 41891, 82515, - 82519, 82531, 82539, 82544, 82552, 82563, 21928, 82572, 82578, 82585, - 82593, 82599, 39509, 82604, 4484, 68920, 82611, 82614, 82622, 82635, - 82648, 82661, 82674, 82681, 82692, 82701, 82706, 52343, 52348, 82710, - 82714, 82722, 82729, 82738, 82746, 82752, 82761, 82769, 82776, 82784, - 82788, 82797, 82806, 82816, 82829, 82842, 82852, 39514, 82858, 82865, - 82871, 82877, 39520, 82882, 82885, 82889, 82897, 82906, 52114, 82914, - 82923, 82931, 82938, 82946, 82956, 82965, 82974, 41043, 82983, 82994, - 83009, 83019, 10747, 26246, 83028, 83033, 83038, 83042, 19547, 83047, - 83052, 83058, 83063, 83068, 83074, 83079, 83084, 26206, 83089, 83096, - 83104, 83112, 83120, 83125, 83132, 83139, 83144, 1717, 83148, 83152, - 83160, 83168, 39537, 83174, 83180, 83192, 83198, 83205, 83209, 83216, - 83221, 83228, 83234, 83241, 83252, 83262, 83272, 83284, 83290, 83298, - 83307, 83313, 83323, 83333, 39564, 83342, 83351, 83357, 83369, 83380, - 83387, 83392, 83396, 83404, 83415, 83421, 83426, 83431, 83438, 83446, - 83458, 83468, 83477, 83486, 83494, 83501, 41705, 29006, 83507, 83512, - 83516, 83520, 83525, 83533, 83539, 83550, 83563, 83568, 83575, 39569, - 83580, 83592, 83601, 83609, 83619, 83630, 83643, 83650, 83659, 83668, - 83676, 83681, 83687, 83691, 1410, 83696, 83701, 83706, 83711, 83717, - 83722, 83727, 83733, 83739, 83744, 83748, 83753, 83758, 83763, 69504, - 83768, 83773, 83778, 83783, 83789, 83795, 83800, 83804, 83809, 19546, - 83814, 83820, 83825, 83831, 83836, 83841, 83846, 83851, 83855, 83861, - 83866, 83875, 83880, 83885, 83890, 83895, 83899, 83906, 83912, 4836, - 20800, 3286, 83917, 83921, 83926, 83930, 83934, 83938, 56143, 83942, - 83867, 83944, 83954, 39578, 83957, 83962, 83971, 83977, 7019, 39583, - 83981, 83987, 83992, 83998, 84003, 84007, 84014, 84019, 84029, 84038, - 84042, 84048, 84054, 84060, 84064, 84072, 84079, 84087, 84095, 39588, - 84102, 84105, 84116, 84123, 84129, 84134, 84138, 84144, 84152, 84159, - 84164, 84168, 84177, 84185, 84191, 84196, 84203, 84211, 39593, 84218, - 28458, 84230, 84236, 84241, 84247, 84254, 84260, 25894, 33344, 84266, - 84271, 84277, 84281, 84293, 83900, 83907, 26138, 84303, 84308, 84315, - 84321, 84328, 84334, 84345, 84350, 84358, 10447, 84363, 84366, 84372, - 84376, 84380, 84383, 84389, 84395, 39282, 4837, 1425, 16069, 84402, - 84408, 84414, 84420, 84426, 84432, 84438, 84444, 84450, 84455, 84460, - 84465, 84470, 84475, 84480, 84485, 84490, 84495, 84500, 84505, 84510, - 84515, 84521, 84526, 84531, 84537, 84542, 84547, 84553, 84559, 84565, - 84571, 84577, 84583, 84589, 84595, 84601, 84606, 84611, 84617, 84622, - 84627, 84633, 84638, 84643, 84648, 84653, 84658, 84663, 84668, 84673, - 84678, 84683, 84688, 84693, 84699, 84704, 84709, 84714, 84720, 84725, - 84730, 84735, 84740, 84746, 84751, 84756, 84761, 84766, 84771, 84776, - 84781, 84786, 84791, 84796, 84801, 84806, 84811, 84816, 84821, 84826, - 84831, 84836, 84841, 84847, 84852, 84857, 84862, 84867, 84872, 84877, - 84882, 1065, 148, 84887, 84891, 84895, 84900, 84908, 84912, 84924, 84931, - 84939, 84943, 84956, 84964, 84969, 84974, 32049, 84978, 84983, 84987, - 84992, 84996, 85004, 85008, 25438, 85013, 85017, 72401, 85021, 85024, - 85032, 85040, 85048, 85053, 85058, 85065, 85072, 85078, 85084, 85089, - 85096, 85101, 85109, 77281, 85116, 85121, 72167, 85128, 85134, 85139, - 85143, 85150, 85156, 85163, 72194, 14031, 85171, 85176, 85181, 85185, - 85188, 85199, 85208, 85214, 85219, 85223, 85233, 85242, 50487, 85246, - 85250, 85257, 85270, 85276, 85284, 85291, 85300, 85311, 85322, 85333, - 85344, 85353, 85359, 85368, 85376, 85386, 85399, 85407, 85414, 85425, - 85434, 85440, 85445, 85450, 85456, 85466, 85472, 85482, 85490, 85497, - 85507, 85516, 83582, 85524, 85530, 85538, 85544, 75834, 85551, 85556, - 85559, 85563, 85569, 85573, 85576, 85584, 85590, 85596, 85604, 85616, - 85628, 85635, 85640, 85644, 85655, 85663, 85670, 85682, 85690, 85697, - 85705, 85712, 85718, 85723, 85729, 85739, 85748, 85756, 85761, 85771, - 85780, 51375, 85787, 85791, 85796, 85804, 85811, 85817, 85821, 85831, - 85842, 85850, 85857, 85869, 85881, 85890, 82505, 85897, 85907, 85919, - 85930, 85944, 85952, 85962, 85969, 85977, 85990, 86002, 86011, 86019, - 86029, 86040, 86052, 86061, 86071, 86081, 86091, 86100, 86107, 86116, - 86131, 86139, 86149, 86158, 86166, 86179, 68890, 86194, 86204, 86213, - 86225, 86235, 86247, 86258, 86272, 86286, 86300, 86314, 86328, 86342, - 86356, 86370, 86384, 86398, 86412, 86426, 86440, 86454, 86468, 86482, - 86496, 86510, 86524, 86538, 86552, 86566, 86580, 86594, 86608, 86622, - 86636, 86650, 86664, 86678, 86692, 86706, 86720, 86734, 86748, 86762, - 86776, 86790, 86804, 86818, 86832, 86846, 86860, 86874, 86888, 86902, - 86916, 86930, 86944, 86958, 86972, 86986, 87000, 87014, 87028, 87042, - 87056, 87070, 87084, 87098, 87112, 87126, 87140, 87154, 87168, 87182, - 87196, 87210, 87224, 87238, 87252, 87266, 87280, 87294, 87308, 87322, - 87336, 87350, 87364, 87378, 87392, 87406, 87420, 87434, 87448, 87462, - 87476, 87490, 87504, 87518, 87532, 87546, 87560, 87574, 87588, 87602, - 87616, 87630, 87644, 87658, 87672, 87686, 87700, 87714, 87728, 87742, - 87756, 87770, 87784, 87798, 87812, 87826, 87840, 87854, 87868, 87882, - 87896, 87910, 87924, 87938, 87952, 87966, 87980, 87994, 88008, 88022, - 88036, 88050, 88064, 88078, 88092, 88106, 88120, 88134, 88148, 88162, - 88176, 88190, 88204, 88218, 88232, 88246, 88260, 88274, 88288, 88302, - 88316, 88330, 88344, 88358, 88372, 88386, 88400, 88414, 88428, 88442, - 88456, 88470, 88484, 88498, 88512, 88526, 88540, 88554, 88568, 88582, - 88596, 88610, 88624, 88638, 88652, 88666, 88680, 88694, 88708, 88722, - 88736, 88750, 88764, 88778, 88792, 88806, 88820, 88834, 88848, 88862, - 88876, 88890, 88904, 88918, 88932, 88946, 88960, 88974, 88988, 89002, - 89016, 89030, 89044, 89058, 89072, 89086, 89100, 89114, 89128, 89142, - 89156, 89170, 89184, 89198, 89212, 89226, 89240, 89254, 89268, 89282, - 89296, 89310, 89324, 89338, 89352, 89366, 89380, 89394, 89408, 89422, - 89436, 89450, 89464, 89478, 89492, 89506, 89520, 89534, 89548, 89562, - 89576, 89590, 89604, 89618, 89632, 89646, 89660, 89674, 89688, 89702, - 89716, 89730, 89744, 89758, 89772, 89786, 89800, 89814, 89828, 89842, - 89856, 89870, 89884, 89898, 89912, 89926, 89940, 89954, 89968, 89982, - 89996, 90010, 90024, 90038, 90052, 90066, 90080, 90094, 90108, 90122, - 90136, 90150, 90164, 90178, 90192, 90206, 90220, 90234, 90248, 90262, - 90276, 90290, 90304, 90318, 90332, 90346, 90360, 90374, 90388, 90402, - 90416, 90430, 90444, 90458, 90472, 90486, 90500, 90514, 90528, 90542, - 90556, 90570, 90584, 90598, 90612, 90626, 90640, 90654, 90668, 90682, - 90696, 90710, 90724, 90738, 90752, 90766, 90780, 90794, 90808, 90822, - 90836, 90850, 90864, 90878, 90892, 90906, 90920, 90934, 90948, 90962, - 90976, 90990, 91004, 91018, 91032, 91046, 91060, 91074, 91088, 91102, - 91116, 91130, 91144, 91158, 91172, 91186, 91200, 91214, 91228, 91242, - 91256, 91270, 91284, 91298, 91312, 91326, 91340, 91354, 91368, 91382, - 91396, 91410, 91424, 91438, 91452, 91466, 91480, 91494, 91508, 91522, - 91536, 91550, 91564, 91578, 91592, 91606, 91620, 91634, 91648, 91662, - 91676, 91690, 91704, 91718, 91732, 91746, 91760, 91774, 91788, 91802, - 91816, 91830, 91844, 91858, 91872, 91886, 91900, 91914, 91928, 91942, - 91956, 91970, 91984, 91998, 92012, 92026, 92040, 92054, 92068, 92082, - 92096, 92110, 92124, 92138, 92152, 92166, 92180, 92194, 92208, 92222, - 92236, 92250, 92264, 92278, 92292, 92306, 92320, 92334, 92348, 92362, - 92376, 92390, 92404, 92418, 92432, 92446, 92460, 92474, 92488, 92502, - 92516, 92530, 92544, 92558, 92572, 92586, 92600, 92614, 92628, 92642, - 92656, 92670, 92684, 92698, 92712, 92726, 92740, 92754, 92768, 92782, - 92796, 92810, 92824, 92838, 92852, 92866, 92880, 92894, 92908, 92922, - 92936, 92950, 92964, 92978, 92992, 93006, 93020, 93034, 93048, 93062, - 93076, 93090, 93104, 93118, 93132, 93146, 93160, 93174, 93188, 93202, - 93216, 93230, 93244, 93258, 93272, 93286, 93300, 93314, 93328, 93342, - 93356, 93370, 93384, 93398, 93412, 93426, 93440, 93454, 93468, 93482, - 93496, 93510, 93524, 93538, 93552, 93566, 93580, 93594, 93608, 93622, - 93636, 93650, 93664, 93678, 93692, 93706, 93720, 93734, 93748, 93762, - 93776, 93790, 93804, 93818, 93832, 93846, 93860, 93874, 93888, 93902, - 93916, 93930, 93944, 93958, 93972, 93986, 94000, 94014, 94028, 94042, - 94056, 94070, 94084, 94098, 94112, 94126, 94140, 94154, 94168, 94182, - 94196, 94210, 94224, 94238, 94252, 94266, 94280, 94294, 94308, 94322, - 94336, 94350, 94364, 94378, 94392, 94406, 94420, 94434, 94448, 94462, - 94476, 94490, 94504, 94518, 94532, 94546, 94560, 94574, 94588, 94602, - 94616, 94630, 94644, 94658, 94672, 94686, 94700, 94714, 94728, 94742, - 94756, 94770, 94784, 94798, 94812, 94826, 94840, 94854, 94868, 94882, - 94896, 94910, 94924, 94938, 94952, 94966, 94980, 94994, 95008, 95022, - 95036, 95050, 95064, 95078, 95092, 95106, 95120, 95134, 95148, 95162, - 95176, 95190, 95204, 95218, 95232, 95246, 95260, 95274, 95288, 95302, - 95316, 95330, 95344, 95358, 95372, 95386, 95400, 95414, 95428, 95442, - 95456, 95470, 95484, 95498, 95512, 95526, 95540, 95554, 95568, 95582, - 95596, 95610, 95624, 95638, 95652, 95666, 95680, 95694, 95708, 95722, - 95736, 95750, 95764, 95778, 95792, 95806, 95820, 95834, 95848, 95862, - 95876, 95890, 95904, 95918, 95932, 95946, 95960, 95974, 95988, 96002, - 96016, 96030, 96044, 96058, 96072, 96086, 96100, 96114, 96128, 96142, - 96156, 96170, 96184, 96198, 96212, 96226, 96240, 96254, 96268, 96282, - 96296, 96310, 96324, 96338, 96352, 96366, 96380, 96394, 96408, 96422, - 96436, 96450, 96464, 96478, 96492, 96506, 96520, 96534, 96548, 96562, - 96576, 96590, 96604, 96618, 96632, 96646, 96660, 96674, 96688, 96702, - 96716, 96730, 96744, 96758, 96772, 96786, 96800, 96814, 96828, 96842, - 96856, 96870, 96884, 96898, 96912, 96926, 96940, 96954, 96968, 96982, - 96996, 97010, 97019, 97030, 97041, 97051, 97062, 97070, 97078, 97084, - 97094, 97102, 97108, 35368, 97113, 97119, 97128, 97140, 97145, 97152, - 11370, 21948, 97158, 97167, 97172, 97176, 97181, 97188, 97194, 97199, - 97204, 97212, 97220, 97230, 97235, 97243, 14513, 97247, 97253, 97259, - 97265, 97271, 97277, 97283, 97289, 97295, 97301, 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, 97470, 97476, 97482, 97488, 97494, 97500, - 97506, 97512, 97518, 97524, 97530, 97536, 97542, 97548, 97554, 97560, - 97566, 97572, 97578, 97584, 97590, 97596, 97602, 97608, 97614, 97620, - 97626, 97632, 97638, 97644, 97650, 97656, 97662, 97668, 97674, 97680, - 97686, 97692, 97698, 97704, 97710, 97716, 97722, 97728, 97734, 97740, - 97746, 97752, 97758, 97764, 97770, 97777, 97783, 97789, 97795, 97801, - 97807, 97813, 97819, 97825, 97831, 97837, 97843, 97846, 97848, 97863, - 97876, 97883, 97889, 97900, 97905, 97909, 97914, 97921, 97927, 97932, - 97940, 77884, 77894, 97946, 97953, 97963, 12672, 97970, 97975, 35616, - 97984, 97989, 97996, 98006, 98014, 98022, 98031, 98040, 98046, 98052, - 98057, 98064, 98071, 98076, 98080, 98088, 72211, 98093, 98102, 98110, - 98117, 98122, 98126, 98135, 98141, 98144, 98148, 98157, 98167, 84951, - 98176, 98180, 98188, 98192, 98198, 98209, 98219, 21957, 98230, 98239, - 98247, 98255, 98262, 72230, 9895, 98270, 98274, 98283, 98290, 98293, - 98297, 33215, 98300, 98304, 98309, 98326, 98338, 12630, 98350, 98355, - 98360, 98365, 25545, 98369, 98374, 98379, 98385, 98390, 6640, 98395, - 25549, 98400, 98405, 98411, 98418, 98423, 98428, 98434, 98440, 98446, - 98451, 98457, 98461, 98475, 98483, 98491, 98497, 98502, 98509, 98519, - 98528, 98533, 98538, 98543, 98551, 98561, 98572, 98577, 98583, 98588, - 98597, 70639, 4760, 98602, 98620, 98639, 98652, 98666, 98682, 98689, - 98696, 98705, 98712, 98718, 98725, 98730, 98736, 98741, 98747, 98755, - 98761, 98766, 98771, 98787, 12643, 98801, 98808, 98816, 98822, 98826, - 98829, 98835, 98840, 98845, 98853, 98860, 98865, 98874, 98880, 98885, - 98891, 98897, 98906, 98915, 43462, 98920, 98931, 98938, 98946, 98955, - 14104, 98964, 98970, 98978, 98984, 98990, 98996, 99001, 99008, 99014, - 14115, 99019, 99022, 99027, 39620, 99037, 99046, 99051, 99059, 99066, - 99072, 99077, 99085, 99092, 99103, 99119, 99135, 99151, 99167, 99183, - 99199, 99215, 99231, 99247, 99263, 99279, 99295, 99311, 99327, 99343, - 99359, 99375, 99391, 99407, 99423, 99439, 99455, 99471, 99487, 99503, - 99519, 99535, 99551, 99567, 99583, 99599, 99615, 99631, 99647, 99663, - 99679, 99695, 99711, 99727, 99743, 99759, 99775, 99791, 99807, 99823, - 99839, 99855, 99871, 99887, 99903, 99919, 99935, 99951, 99967, 99983, - 99999, 100015, 100031, 100047, 100063, 100079, 100095, 100111, 100127, - 100143, 100159, 100175, 100191, 100207, 100223, 100239, 100255, 100271, - 100287, 100303, 100319, 100335, 100351, 100367, 100383, 100399, 100415, - 100431, 100447, 100463, 100479, 100495, 100511, 100527, 100543, 100559, - 100575, 100591, 100607, 100623, 100639, 100655, 100671, 100687, 100703, - 100719, 100735, 100751, 100767, 100783, 100799, 100815, 100831, 100847, - 100863, 100879, 100895, 100911, 100927, 100943, 100959, 100975, 100991, - 101007, 101023, 101039, 101055, 101071, 101087, 101103, 101119, 101135, - 101151, 101167, 101183, 101199, 101215, 101231, 101247, 101263, 101279, - 101295, 101311, 101327, 101343, 101359, 101375, 101391, 101407, 101423, - 101439, 101455, 101471, 101487, 101503, 101519, 101535, 101551, 101567, - 101583, 101599, 101615, 101631, 101647, 101663, 101679, 101695, 101711, - 101727, 101743, 101759, 101775, 101791, 101807, 101823, 101839, 101855, - 101871, 101887, 101903, 101919, 101935, 101951, 101967, 101983, 101999, - 102015, 102031, 102047, 102063, 102079, 102095, 102111, 102127, 102143, - 102159, 102175, 102191, 102207, 102223, 102239, 102255, 102271, 102287, - 102303, 102319, 102335, 102351, 102367, 102383, 102399, 102415, 102431, - 102447, 102463, 102479, 102495, 102511, 102527, 102543, 102559, 102575, - 102591, 102607, 102623, 102639, 102655, 102671, 102687, 102703, 102719, - 102735, 102751, 102767, 102783, 102799, 102815, 102831, 102847, 102863, - 102879, 102895, 102911, 102927, 102943, 102959, 102975, 102991, 103007, - 103023, 103039, 103055, 103071, 103087, 103103, 103119, 103135, 103151, - 103167, 103183, 103199, 103215, 103231, 103247, 103263, 103279, 103295, - 103311, 103327, 103343, 103359, 103375, 103391, 103407, 103423, 103439, - 103455, 103471, 103487, 103503, 103519, 103535, 103551, 103567, 103583, - 103599, 103615, 103631, 103647, 103663, 103679, 103695, 103711, 103727, - 103743, 103759, 103775, 103791, 103807, 103823, 103839, 103855, 103871, - 103887, 103903, 103919, 103935, 103951, 103967, 103983, 103999, 104015, - 104031, 104047, 104063, 104079, 104095, 104111, 104127, 104143, 104159, - 104175, 104191, 104207, 104223, 104239, 104255, 104271, 104287, 104303, - 104319, 104335, 104351, 104367, 104383, 104399, 104415, 104431, 104447, - 104463, 104479, 104495, 104511, 104527, 104543, 104559, 104575, 104591, - 104607, 104623, 104639, 104655, 104671, 104687, 104703, 104719, 104735, - 104751, 104767, 104783, 104799, 104815, 104831, 104847, 104863, 104879, - 104895, 104911, 104927, 104943, 104959, 104975, 104991, 105007, 105023, - 105039, 105055, 105071, 105087, 105103, 105119, 105135, 105151, 105167, - 105183, 105199, 105215, 105231, 105247, 105263, 105279, 105295, 105311, - 105327, 105343, 105359, 105375, 105391, 105407, 105423, 105439, 105455, - 105471, 105487, 105503, 105519, 105535, 105551, 105567, 105583, 105599, - 105615, 105631, 105647, 105663, 105679, 105695, 105711, 105727, 105743, - 105759, 105775, 105791, 105807, 105823, 105839, 105855, 105871, 105887, - 105903, 105919, 105935, 105951, 105967, 105983, 105999, 106015, 106031, - 106047, 106063, 106079, 106095, 106111, 106127, 106143, 106159, 106175, - 106191, 106207, 106223, 106239, 106255, 106271, 106287, 106303, 106319, - 106335, 106351, 106367, 106383, 106399, 106415, 106431, 106447, 106463, - 106479, 106495, 106511, 106527, 106543, 106559, 106575, 106591, 106607, - 106623, 106639, 106655, 106671, 106687, 106703, 106719, 106735, 106751, - 106767, 106783, 106799, 106815, 106831, 106847, 106863, 106879, 106895, - 106911, 106927, 106943, 106959, 106975, 106991, 107007, 107023, 107039, - 107055, 107071, 107087, 107103, 107119, 107135, 107151, 107167, 107183, - 107199, 107215, 107231, 107247, 107263, 107279, 107295, 107311, 107327, - 107343, 107359, 107375, 107391, 107407, 107423, 107439, 107455, 107471, - 107487, 107503, 107519, 107535, 107551, 107567, 107583, 107599, 107615, - 107631, 107647, 107663, 107679, 107695, 107711, 107727, 107743, 107759, - 107775, 107791, 107807, 107823, 107839, 107855, 107871, 107887, 107903, - 107919, 107935, 107951, 107967, 107983, 107999, 108015, 108031, 108047, - 108063, 108079, 108095, 108111, 108127, 108143, 108159, 108175, 108191, - 108207, 108223, 108239, 108255, 108271, 108287, 108303, 108319, 108335, - 108351, 108367, 108383, 108399, 108415, 108431, 108447, 108463, 108479, - 108495, 108511, 108527, 108543, 108559, 108575, 108591, 108607, 108623, - 108639, 108655, 108671, 108687, 108703, 108719, 108735, 108751, 108767, - 108783, 108799, 108815, 108831, 108847, 108863, 108879, 108895, 108911, - 108927, 108943, 108959, 108975, 108991, 109007, 109023, 109039, 109055, - 109071, 109087, 109103, 109119, 109135, 109151, 109167, 109183, 109199, - 109215, 109231, 109247, 109263, 109279, 109295, 109311, 109327, 109343, - 109359, 109375, 109391, 109407, 109423, 109439, 109455, 109471, 109487, - 109503, 109519, 109535, 109551, 109567, 109583, 109599, 109615, 109631, - 109647, 109663, 109679, 109695, 109711, 109727, 109743, 109759, 109775, - 109791, 109807, 109823, 109839, 109855, 109871, 109887, 109903, 109919, - 109935, 109951, 109967, 109983, 109999, 110015, 110031, 110047, 110063, - 110079, 110095, 110111, 110127, 110143, 110159, 110175, 110191, 110207, - 110223, 110239, 110255, 110271, 110287, 110303, 110319, 110335, 110351, - 110367, 110383, 110399, 110415, 110431, 110447, 110463, 110479, 110495, - 110511, 110527, 110543, 110559, 110575, 110591, 110607, 110623, 110639, - 110655, 110671, 110687, 110703, 110719, 110735, 110751, 110767, 110783, - 110799, 110815, 110831, 110847, 110863, 110879, 110895, 110911, 110927, - 110943, 110959, 110975, 110991, 111007, 111023, 111039, 111055, 111071, - 111087, 111103, 111119, 111135, 111151, 111167, 111183, 111199, 111215, - 111231, 111247, 111263, 111279, 111295, 111311, 111327, 111343, 111359, - 111375, 111391, 111407, 111423, 111439, 111455, 111471, 111487, 111503, - 111519, 111535, 111551, 111567, 111583, 111599, 111615, 111631, 111647, - 111663, 111679, 111695, 111711, 111727, 111743, 111759, 111775, 111791, - 111807, 111823, 111839, 111855, 111871, 111887, 111903, 111919, 111935, - 111951, 111967, 111983, 111999, 112015, 112031, 112047, 112063, 112079, - 112095, 112111, 112127, 112143, 112159, 112175, 112191, 112207, 112223, - 112239, 112255, 112271, 112287, 112303, 112319, 112335, 112351, 112367, - 112383, 112399, 112415, 112431, 112447, 112463, 112479, 112495, 112511, - 112527, 112543, 112559, 112575, 112591, 112607, 112623, 112639, 112655, - 112671, 112687, 112703, 112719, 112735, 112751, 112767, 112783, 112799, - 112815, 112831, 112847, 112863, 112879, 112895, 112911, 112927, 112943, - 112959, 112969, 112978, 112983, 112991, 77204, 112996, 113002, 113007, - 113014, 113023, 113031, 113035, 4338, 113041, 113048, 113054, 113058, - 20549, 46595, 3295, 113063, 113067, 113071, 113078, 113084, 113093, - 113099, 113106, 113110, 113131, 113153, 113169, 113186, 113205, 113214, - 113224, 113232, 113239, 113246, 113252, 33070, 113266, 113270, 113276, - 113284, 113296, 113302, 113310, 113317, 113322, 113327, 113331, 113339, - 113346, 113350, 113356, 113362, 113367, 3972, 52543, 113373, 113377, - 113381, 113385, 113390, 113395, 113400, 113406, 113412, 113418, 113425, - 113431, 113438, 113444, 113450, 113455, 113461, 113466, 113470, 105563, - 113475, 105627, 52558, 113480, 113485, 113493, 113497, 113502, 113509, - 113518, 113525, 113531, 113540, 113544, 113551, 113555, 113558, 113565, - 113571, 113580, 113590, 113600, 113605, 113609, 113616, 113624, 113633, - 113637, 113645, 113651, 113656, 113661, 113667, 113673, 113678, 113682, - 31947, 113688, 113692, 113696, 113699, 113704, 113712, 113722, 113728, - 113733, 113743, 49664, 113751, 113763, 113769, 113776, 113782, 113786, - 113791, 113797, 113809, 113820, 113827, 113833, 113840, 113847, 113859, - 113866, 113872, 25629, 113876, 113884, 113890, 113897, 113903, 113909, - 113915, 113920, 113925, 113930, 113934, 113943, 113951, 113962, 7934, - 113967, 19985, 113973, 113977, 113981, 113985, 113993, 114002, 114006, - 114013, 114022, 114030, 114043, 114049, 106139, 36551, 114054, 114056, - 114061, 114066, 114071, 114076, 114081, 114086, 114091, 114096, 114101, - 114106, 114111, 114116, 114121, 114126, 114132, 114137, 114142, 114147, - 114152, 114157, 114162, 114167, 114172, 114178, 114184, 114190, 114195, - 114200, 114212, 114217, 1935, 54, 114222, 114227, 39630, 114231, 39635, - 39640, 39646, 39651, 114235, 39656, 26815, 114257, 114261, 114265, - 114270, 114274, 39660, 114278, 114286, 114293, 114299, 114309, 39665, - 114316, 114319, 114324, 114328, 114337, 11168, 114345, 39670, 26659, - 114348, 114352, 114360, 1307, 114365, 39681, 114368, 114373, 114378, - 31188, 31198, 43060, 114383, 114388, 114393, 114398, 114404, 114409, - 114418, 114423, 114432, 114440, 114447, 114453, 114458, 114463, 114468, - 114478, 114487, 114495, 114500, 114508, 114512, 114520, 114524, 114531, - 114538, 114546, 114553, 39485, 46310, 114559, 114565, 114570, 114575, - 14548, 11961, 114580, 114585, 114590, 114596, 114603, 114609, 114618, - 114623, 114631, 114641, 114648, 114658, 114664, 114669, 114675, 114679, - 21979, 114686, 44045, 114699, 114704, 114711, 114717, 114732, 37615, - 75612, 114745, 114749, 114758, 114767, 114774, 114780, 114788, 114794, - 114802, 114811, 114819, 114826, 46430, 114832, 114835, 114839, 114843, - 114847, 11982, 114853, 114860, 114866, 114874, 114879, 114883, 29180, - 114889, 114892, 114900, 114907, 114915, 114928, 114942, 114949, 114955, - 114962, 114968, 39695, 114972, 114978, 114986, 114993, 115001, 115009, - 115015, 39700, 115023, 115029, 115034, 115044, 115050, 115059, 37410, - 42408, 115067, 115072, 115077, 115081, 115086, 115090, 115098, 115103, - 17981, 18806, 49686, 115107, 115112, 39705, 18138, 115116, 115128, - 115133, 115137, 115144, 115153, 115157, 115165, 115171, 115176, 115184, - 115192, 115200, 115208, 115216, 115224, 115235, 115241, 9132, 115246, - 115252, 115257, 115262, 115273, 115282, 115294, 115309, 40017, 115315, - 20104, 39709, 115319, 115326, 115332, 115336, 29317, 115343, 115349, - 115356, 48811, 115365, 115371, 115380, 115386, 115391, 115399, 115405, - 115410, 39719, 115415, 115424, 115433, 113815, 115442, 115449, 115455, - 115461, 115470, 115480, 115486, 115494, 115501, 115505, 39724, 115508, - 39730, 1346, 115513, 115521, 115529, 115539, 115548, 115556, 115563, - 115573, 39741, 115577, 115579, 115583, 115588, 115592, 115596, 115602, - 115607, 115611, 115622, 115627, 115633, 115638, 115647, 115652, 3300, - 115656, 115663, 115667, 115676, 115684, 115692, 115699, 115704, 115709, - 74113, 115713, 115716, 115722, 115730, 115736, 115740, 115745, 115752, - 115757, 115762, 115766, 115773, 115779, 115784, 42439, 115788, 115791, - 115796, 115800, 115805, 115812, 115817, 115821, 47780, 115829, 31207, - 31216, 115835, 115841, 115847, 115852, 115856, 115859, 115869, 115878, - 115883, 115889, 115896, 115902, 115906, 115914, 115919, 42445, 85210, - 115923, 115931, 115938, 115944, 115951, 115956, 115963, 115968, 115972, - 115978, 115983, 69106, 115989, 115995, 10386, 116000, 116005, 116009, - 116014, 116019, 116024, 116028, 116033, 116038, 116044, 116049, 116054, - 116060, 116066, 116071, 116075, 116080, 116085, 116090, 116094, 29316, - 116099, 116104, 116110, 116116, 116122, 116127, 116131, 116136, 116141, - 109915, 116146, 116151, 116156, 116161, 109979, 52813, 116166, 39749, - 116174, 116178, 116186, 116194, 116205, 116210, 116214, 27294, 82608, - 116219, 116225, 116230, 4649, 116240, 116247, 116252, 116260, 116269, - 116274, 116278, 116283, 116287, 116295, 116303, 116310, 77470, 116316, - 116324, 116331, 116342, 116348, 116354, 39759, 116357, 116364, 116372, - 116377, 116381, 33589, 71792, 116387, 116392, 116399, 116404, 10275, - 116408, 116416, 116423, 116430, 116439, 116446, 116452, 116466, 116474, - 6724, 116236, 116480, 116485, 116491, 116495, 116498, 116506, 116513, - 116518, 116531, 116538, 116544, 116548, 116556, 116561, 116568, 116574, - 116579, 72070, 116584, 116587, 116596, 116603, 110187, 116609, 116612, - 116620, 116626, 116635, 116645, 116655, 116664, 116675, 116683, 116694, - 116699, 116703, 116708, 116712, 43191, 116720, 18771, 43200, 116725, - 101706, 101722, 101738, 101754, 101770, 116730, 101802, 101818, 101834, - 101850, 101962, 101978, 116734, 102010, 102026, 116738, 116742, 116746, - 116750, 102266, 102298, 116754, 102330, 116758, 116762, 102474, 102490, - 102506, 102522, 116766, 102586, 102602, 116770, 102730, 102746, 102762, - 102778, 102794, 102810, 102826, 102842, 102858, 102874, 102986, 103002, - 103018, 103034, 103050, 103066, 103082, 103098, 103114, 103130, 116774, - 104922, 105034, 105098, 105114, 105130, 105146, 105162, 105178, 105290, - 105306, 105322, 116778, 105370, 116782, 105402, 105418, 105434, 116786, - 116791, 116796, 116801, 116806, 116811, 116816, 116820, 116824, 116829, - 116834, 116838, 116843, 116848, 116852, 116857, 116862, 116867, 116872, - 116876, 116881, 116886, 116890, 116895, 116899, 116903, 116907, 116911, - 116916, 116920, 116924, 116928, 116932, 116936, 116940, 116944, 116948, - 116952, 116957, 116962, 116967, 116972, 116977, 116982, 116987, 116992, - 116997, 117002, 117006, 117010, 117014, 117018, 117022, 117026, 117031, - 117035, 117040, 117044, 117049, 117054, 117058, 117062, 117067, 117071, - 117075, 117079, 117083, 117087, 117091, 117095, 117099, 117103, 117107, - 117111, 117115, 117119, 117123, 117128, 117133, 117137, 117141, 117145, - 117149, 117153, 117157, 117162, 117166, 117170, 117174, 117178, 117182, - 117186, 117191, 117195, 117200, 117204, 117208, 117212, 117216, 117220, - 117224, 117228, 117232, 117236, 117240, 117244, 117249, 117253, 117257, - 117261, 117265, 117269, 117273, 117277, 117281, 117285, 117289, 117293, - 117298, 117302, 117306, 117311, 117316, 117320, 117324, 117328, 117332, - 117336, 117340, 117344, 117348, 117353, 117357, 117362, 117366, 117371, - 117375, 117380, 117384, 117390, 117395, 117399, 117404, 117408, 117413, - 117417, 117422, 117426, 117431, 1429, 117435, 117439, 3042, 1705, 28453, - 1602, 31143, 117443, 3051, 117447, 1276, 117452, 1218, 117456, 117460, - 117464, 117468, 117472, 117476, 3075, 117480, 117488, 117495, 117502, - 117516, 3079, 8044, 117525, 117533, 117540, 117551, 117560, 117564, - 117571, 117583, 117596, 117609, 117620, 117625, 117632, 117644, 117648, - 3083, 14185, 117658, 117663, 117672, 117682, 117687, 117696, 3087, - 117704, 117708, 117713, 117720, 117726, 117731, 117740, 117748, 117760, - 117770, 1223, 15645, 117783, 117787, 117793, 117807, 117819, 117831, - 117839, 117849, 117858, 117867, 117876, 117884, 117895, 117903, 4657, - 117913, 117924, 117933, 117939, 117954, 117961, 117967, 117972, 43334, - 117977, 3111, 15649, 117981, 117986, 117993, 10206, 118002, 118008, 4695, - 118018, 3116, 39121, 118027, 71682, 118034, 118038, 118044, 118055, - 118061, 118066, 118073, 118079, 118087, 118094, 118100, 118111, 118127, - 118137, 118146, 118157, 118166, 118173, 118179, 118189, 118197, 118203, - 118218, 118224, 118229, 118233, 118240, 118248, 118252, 118255, 118261, - 118268, 118274, 118282, 118291, 118299, 118305, 118314, 52116, 118328, - 118333, 118339, 17732, 118344, 118357, 118369, 118378, 118386, 118393, - 118397, 118401, 118404, 118411, 118418, 118426, 118434, 118443, 118451, - 17631, 118459, 118464, 118468, 118480, 118487, 118494, 118503, 954, - 118513, 118522, 118533, 3137, 118537, 118541, 118547, 118560, 118572, - 118582, 118591, 118603, 32105, 118614, 118622, 118631, 118642, 118653, - 118663, 118673, 118681, 118690, 118698, 13604, 118705, 118709, 118712, - 118717, 118722, 118726, 118732, 1228, 118739, 118743, 14281, 118747, - 118751, 118762, 118771, 118779, 118788, 118796, 118812, 118823, 118832, - 118840, 118852, 118863, 118879, 118889, 118910, 118924, 118937, 118945, - 118952, 8090, 118965, 118970, 118976, 6733, 118982, 118985, 118992, - 119002, 9266, 119009, 119014, 119019, 119026, 119034, 119042, 119048, - 119053, 119059, 119063, 119071, 119080, 119088, 119093, 119102, 119109, - 11418, 11427, 119115, 119126, 119132, 119137, 119143, 3153, 3158, 119149, - 1063, 119155, 119162, 119169, 119182, 119192, 119197, 2324, 87, 119205, - 119212, 119217, 119225, 119235, 119244, 119250, 119259, 119267, 119277, - 119281, 119285, 119290, 119294, 119306, 3181, 119314, 119322, 119327, - 119338, 119349, 119361, 119372, 119382, 119391, 26013, 119396, 119402, - 119407, 119417, 119427, 119432, 34323, 119438, 119443, 119452, 26035, - 119456, 26046, 119461, 4783, 8, 119468, 119477, 119484, 119491, 119497, - 119502, 119506, 119512, 34353, 119517, 119522, 72367, 119527, 119532, - 119538, 119544, 119552, 119557, 119565, 119573, 119582, 119589, 119595, - 119602, 119608, 119615, 119620, 47649, 52010, 119626, 119636, 1822, 32, - 119643, 119648, 119661, 119666, 119674, 119679, 119685, 3207, 30884, - 3221, 119690, 119698, 119705, 119710, 119715, 119724, 4340, 4351, 73711, - 119732, 119736, 1629, 1862, 119741, 119746, 119753, 34774, 1866, 331, - 119760, 119766, 119771, 3229, 119775, 119780, 119787, 1870, 119792, - 119798, 119803, 119815, 6978, 119825, 119832, 1877, 119838, 119843, - 119850, 119857, 119872, 119879, 119890, 119895, 119903, 2772, 119907, - 119919, 119924, 119928, 119934, 34195, 2329, 119938, 119949, 119953, - 119957, 119963, 119967, 119976, 119980, 119991, 119995, 2375, 38938, - 119999, 120009, 120017, 3320, 120023, 120032, 120040, 10752, 120045, - 120053, 120058, 120062, 120071, 120078, 120084, 3290, 17796, 120088, - 120101, 44058, 120119, 120124, 120132, 120140, 120150, 11759, 15773, - 120162, 120175, 120182, 120192, 120206, 120213, 120229, 120236, 120242, - 26093, 14980, 120249, 120256, 120266, 120275, 52812, 120287, 120295, - 52947, 120302, 120305, 120311, 120317, 120323, 120329, 120335, 120342, - 120349, 120355, 120361, 120367, 120373, 120379, 120385, 120391, 120397, - 120403, 120409, 120415, 120421, 120427, 120433, 120439, 120445, 120451, - 120457, 120463, 120469, 120475, 120481, 120487, 120493, 120499, 120505, - 120511, 120517, 120523, 120529, 120535, 120541, 120547, 120553, 120559, - 120565, 120571, 120577, 120583, 120589, 120595, 120601, 120607, 120613, - 120619, 120625, 120631, 120637, 120643, 120649, 120655, 120662, 120668, - 120675, 120682, 120688, 120695, 120702, 120708, 120714, 120720, 120726, - 120732, 120738, 120744, 120750, 120756, 120762, 120768, 120774, 120780, - 120786, 120792, 3304, 10720, 120798, 120808, 120814, 120822, 120826, - 117716, 3308, 120830, 114044, 25758, 4701, 4265, 120834, 3314, 120838, - 120848, 120854, 120860, 120866, 120872, 120878, 120884, 120890, 120896, - 120902, 120908, 120914, 120920, 120926, 120932, 120938, 120944, 120950, - 120956, 120962, 120968, 120974, 120980, 120986, 120992, 120998, 121005, - 121012, 121018, 121024, 121030, 121036, 121042, 121048, 1233, 121054, - 121059, 121064, 121069, 121074, 121079, 121084, 121089, 121094, 121098, - 121102, 121106, 121110, 121114, 121118, 121122, 121126, 121130, 121136, - 121142, 121148, 121154, 121158, 121162, 121166, 121170, 121174, 121178, - 121182, 121186, 121190, 121195, 121200, 121205, 121210, 121215, 121220, - 121225, 121230, 121235, 121240, 121245, 121250, 121255, 121260, 121265, - 121270, 121275, 121280, 121285, 121290, 121295, 121300, 121305, 121310, - 121315, 121320, 121325, 121330, 121335, 121340, 121345, 121350, 121355, - 121360, 121365, 121370, 121375, 121380, 121385, 121390, 121395, 121400, - 121405, 121410, 121415, 121420, 121425, 121430, 121435, 121440, 121445, - 121450, 121455, 121460, 121465, 121470, 121475, 121480, 121485, 121490, - 121495, 121500, 121505, 121510, 121515, 121520, 121525, 121530, 121535, - 121540, 121545, 121550, 121555, 121560, 121565, 121570, 121575, 121580, - 121585, 121590, 121595, 121600, 121605, 121610, 121615, 121620, 121625, - 121630, 121635, 121640, 121645, 121650, 121655, 121660, 121665, 121670, - 121675, 121680, 121685, 121690, 121695, 121700, 121705, 121710, 121715, - 121720, 121725, 121730, 121735, 121740, 121745, 121750, 121755, 121760, - 121765, 121770, 121775, 121780, 121785, 121790, 121795, 121800, 121805, - 121810, 121815, 121820, 121825, 121830, 121835, 121840, 121845, 121850, - 121855, 121860, 121865, 121870, 121875, 121880, 121885, 121890, 121895, - 121900, 121905, 121910, 121915, 121920, 121925, 121930, 121935, 121940, - 121945, 121950, 121955, 121960, 121965, 121970, 121975, 121980, 121985, - 121990, 121995, 122000, 122005, 122010, 122015, 122020, 122025, 122030, - 122035, 122040, 122045, 122050, 122055, 122060, 122065, 122070, 122075, - 122080, 122086, 122091, 122096, 122101, 122106, 122111, 122116, 122121, - 122127, 122132, 122137, 122142, 122147, 122152, 122157, 122162, 122167, - 122172, 122177, 122182, 122187, 122192, 122197, 122202, 122207, 122212, - 122217, 122222, 122227, 122232, 122237, 122242, 122247, 122252, 122257, - 122262, 122267, 122272, 122277, 122282, 122287, 122296, 122301, 122310, - 122315, 122324, 122329, 122338, 122343, 122352, 122357, 122366, 122371, - 122380, 122385, 122394, 122399, 122404, 122413, 122417, 122426, 122431, - 122440, 122445, 122454, 122459, 122468, 122473, 122482, 122487, 122496, - 122501, 122510, 122515, 122524, 122529, 122538, 122543, 122552, 122557, - 122562, 122567, 122572, 122577, 122582, 122587, 122591, 122596, 122601, - 122606, 122611, 122616, 122621, 122627, 122632, 122637, 122642, 122648, - 122652, 122657, 122663, 122668, 122673, 122678, 122683, 122688, 122693, - 122698, 122703, 122708, 122713, 122719, 122724, 122729, 122734, 122740, - 122745, 122750, 122755, 122760, 122766, 122771, 122776, 122781, 122786, - 122791, 122797, 122802, 122807, 122812, 122817, 122822, 122827, 122832, - 122837, 122842, 122847, 122852, 122857, 122862, 122867, 122872, 122877, - 122882, 122887, 122892, 122897, 122902, 122907, 122912, 122918, 122924, - 122930, 122935, 122940, 122945, 122950, 122956, 122962, 122968, 122973, - 122978, 122983, 122989, 122994, 122999, 123004, 123009, 123014, 123019, - 123024, 123029, 123034, 123039, 123044, 123049, 123054, 123059, 123064, - 123069, 123075, 123081, 123087, 123092, 123097, 123102, 123107, 123113, - 123119, 123125, 123130, 123135, 123140, 123145, 123150, 123155, 123160, - 123165, 123170, 19463, 123175, 123181, 123186, 123191, 123196, 123201, - 123206, 123212, 123217, 123222, 123227, 123232, 123237, 123243, 123248, - 123253, 123258, 123263, 123268, 123273, 123278, 123283, 123288, 123293, - 123298, 123303, 123308, 123313, 123318, 123323, 123328, 123333, 123338, - 123343, 123348, 123353, 123359, 123364, 123369, 123374, 123379, 123384, - 123389, 123394, 123399, 123404, 123409, 123414, 123419, 123424, 123429, - 123434, 123439, 123444, 123449, 123454, 123459, 123464, 123469, 123474, - 123479, 123484, 123489, 123494, 123499, 123504, 123509, 123514, 123519, - 123524, 123529, 123534, 123539, 123544, 123549, 123554, 123559, 123565, - 123570, 123575, 123580, 123585, 123590, 123595, 123600, 123605, 123610, - 123615, 123620, 123626, 123631, 123637, 123642, 123647, 123652, 123657, - 123662, 123667, 123673, 123678, 123683, 123689, 123694, 123699, 123704, - 123709, 123714, 123720, 123726, 123731, 123736, 14614, 123741, 123746, - 123751, 123756, 123761, 123766, 123771, 123776, 123781, 123786, 123791, - 123796, 123801, 123806, 123811, 123816, 123821, 123826, 123831, 123836, - 123841, 123846, 123851, 123856, 123861, 123866, 123871, 123876, 123881, - 123886, 123891, 123896, 123901, 123906, 123911, 123916, 123921, 123926, - 123931, 123936, 123941, 123946, 123951, 123956, 123961, 123966, 123971, - 123976, 123981, 123986, 123991, 123996, 124001, 124006, 124011, 124016, - 124021, 124026, 124031, 124036, 124041, 124046, 124051, 124056, 124061, - 124067, 124072, 124077, 124082, 124087, 124093, 124098, 124103, 124108, - 124113, 124118, 124123, 124129, 124134, 124139, 124144, 124149, 124154, - 124160, 124165, 124170, 124175, 124180, 124185, 124191, 124196, 124201, - 124206, 124211, 124216, 124222, 124228, 124233, 124238, 124243, 124249, - 124255, 124261, 124266, 124271, 124277, 124283, 124288, 124294, 124300, - 124306, 124311, 124316, 124322, 124327, 124333, 124338, 124344, 124353, - 124358, 124363, 124369, 124374, 124380, 124385, 124390, 124395, 124400, - 124405, 124410, 124415, 124420, 124425, 124430, 124435, 124440, 124445, - 124450, 124455, 124460, 124465, 124470, 124475, 124480, 124485, 124490, - 124495, 124500, 124505, 124510, 124515, 124520, 124525, 124530, 124535, - 124541, 124547, 124553, 124558, 124563, 124568, 124573, 124578, 124583, - 124588, 124593, 124598, 124603, 124608, 124613, 124618, 124623, 124628, - 124633, 124638, 124643, 124648, 124653, 124659, 124665, 124670, 124676, - 124681, 124686, 124692, 124697, 124703, 124708, 124714, 124719, 124725, - 124730, 124736, 124741, 124746, 124751, 124756, 124761, 124766, 124771, - 120849, 120855, 120861, 120867, 124777, 120873, 120879, 124783, 120885, - 120891, 120897, 120903, 120909, 120915, 120921, 120927, 120933, 124789, - 120939, 120945, 120951, 124795, 120957, 120963, 120969, 120975, 124801, - 120981, 120987, 120993, 121013, 124807, 124813, 121019, 124819, 121025, - 121031, 121037, 121043, 121049, 124825, 3331, 3336, 124830, 3351, 3356, - 3361, 124835, 124838, 124844, 124850, 124857, 124862, 124867, 2380, + 22671, 22682, 22694, 22706, 22718, 22730, 22742, 22754, 22766, 22778, + 22790, 22802, 22813, 22825, 22837, 22849, 22861, 22873, 22885, 22897, + 22909, 22921, 22933, 22944, 22956, 22968, 22980, 22992, 23005, 23018, + 23031, 23044, 23057, 23070, 23083, 23095, 23108, 23121, 23134, 23147, + 23160, 23173, 23186, 23199, 23212, 23225, 23237, 23250, 23263, 23276, + 23289, 23302, 23315, 23328, 23341, 23354, 23367, 23379, 23392, 23405, + 23418, 23431, 23444, 23457, 23470, 23483, 23496, 23509, 23521, 23534, + 23547, 23560, 23573, 23586, 23599, 23612, 23625, 23638, 23651, 23663, + 23676, 23689, 23702, 23715, 23728, 23741, 23754, 23767, 23780, 23793, + 23805, 23816, 23829, 23842, 23855, 23868, 23881, 23894, 23907, 23920, + 23933, 23946, 23958, 23971, 23984, 23997, 24010, 24023, 24036, 24049, + 24062, 24075, 24088, 24100, 24113, 24126, 24139, 24152, 24165, 24178, + 24191, 24204, 24217, 24230, 24242, 24255, 24268, 24281, 24294, 24307, + 24320, 24333, 24346, 24359, 24372, 24384, 24397, 24410, 24423, 24436, + 24449, 24462, 24475, 24488, 24501, 24514, 24526, 24539, 24552, 24565, + 24578, 24591, 24604, 24617, 24630, 24643, 24656, 24668, 24681, 24694, + 24707, 24720, 24733, 24746, 24759, 24772, 24785, 24798, 24810, 24823, + 24836, 24849, 24862, 24875, 24888, 24901, 24914, 24927, 24940, 24952, + 24965, 24978, 24991, 25004, 25017, 25030, 25043, 25056, 25069, 25082, + 25094, 25107, 25120, 25133, 25146, 25159, 25172, 25185, 25198, 25211, + 25224, 25236, 25247, 25256, 25264, 25272, 25279, 25285, 25289, 25295, + 25301, 25310, 25318, 25323, 25329, 25334, 25338, 25347, 10492, 25358, + 25364, 25371, 25379, 25386, 13145, 13159, 25393, 25400, 25409, 25414, + 25419, 25426, 25431, 25436, 8778, 8784, 8790, 25441, 25446, 25449, 25454, + 25462, 25469, 25476, 25488, 25495, 25501, 25510, 25515, 25524, 25533, + 25539, 25547, 25556, 25560, 25566, 25571, 25581, 25588, 25594, 25602, + 25608, 25615, 25621, 25631, 25640, 25644, 25651, 25655, 25660, 25666, + 25674, 25678, 25688, 17372, 25697, 25703, 25707, 25716, 25725, 25735, + 25741, 17377, 25748, 25755, 25766, 25774, 25784, 25793, 25801, 10207, + 25809, 25814, 25820, 25825, 25829, 25833, 25837, 11301, 25842, 25850, + 25857, 25866, 25874, 25881, 25888, 25897, 25903, 1062, 25910, 25916, + 25920, 25926, 25933, 25939, 25947, 25953, 25960, 25966, 25972, 25981, + 25985, 25993, 26001, 26008, 26017, 26024, 26029, 26033, 26043, 26054, + 26065, 26070, 26075, 26081, 26090, 26095, 26108, 9000, 26112, 26118, + 26124, 26130, 26135, 26143, 26147, 26154, 26163, 26168, 17650, 26176, + 26180, 26192, 26197, 26201, 26204, 26210, 26216, 26222, 26227, 26232, + 26236, 26239, 26250, 26255, 10769, 26262, 26267, 26272, 26277, 26282, + 26287, 26292, 26297, 26302, 10774, 26307, 26312, 26317, 26322, 26327, + 26332, 26337, 26342, 26347, 26352, 26357, 26362, 26368, 26373, 26378, + 26383, 26388, 26393, 26398, 26403, 26408, 26413, 26419, 26425, 26430, + 26435, 26440, 26445, 26450, 26455, 26460, 26465, 26470, 26476, 26481, + 26486, 26491, 26497, 26503, 26508, 26513, 26518, 26523, 26528, 26533, + 26538, 26543, 26549, 26554, 26559, 26564, 26569, 26575, 26580, 26585, + 26589, 1244, 145, 26597, 26601, 26605, 26609, 26614, 26618, 15736, 2409, + 26622, 26627, 26631, 26636, 26640, 26645, 26649, 26655, 26660, 26664, + 26668, 26676, 26680, 26684, 26691, 26696, 26701, 26705, 26711, 26716, + 26720, 26725, 26730, 26734, 26741, 26748, 26755, 26760, 26764, 26768, + 26773, 26777, 26780, 26786, 26799, 26804, 26810, 26819, 26824, 11049, + 26829, 26838, 26843, 26846, 26850, 26855, 26860, 26865, 26870, 26875, + 2920, 2925, 26880, 26886, 26890, 26896, 3888, 26901, 26906, 26911, 26917, + 26922, 16698, 26927, 26932, 26937, 26942, 26948, 26953, 26958, 26964, + 26969, 26973, 26978, 26983, 26988, 26993, 26998, 27002, 27007, 27011, + 27016, 27021, 27026, 27031, 27035, 27040, 27044, 27049, 27054, 27059, + 26974, 3121, 26979, 27064, 27072, 27079, 11395, 27091, 27099, 27109, + 27127, 27146, 27155, 27163, 26984, 27170, 27175, 27183, 26989, 27188, + 27193, 27201, 27206, 27211, 27215, 19870, 27220, 27228, 27233, 27237, + 27244, 27250, 27259, 27263, 27271, 27277, 27281, 27284, 20704, 27291, + 27295, 27299, 27304, 27310, 27317, 27322, 10234, 27326, 27331, 27336, + 27341, 27346, 27351, 1663, 1668, 27356, 27362, 27368, 27373, 27377, + 27381, 27385, 27389, 27393, 27397, 27401, 27405, 25482, 27408, 27415, + 27423, 27429, 27435, 27440, 27445, 27451, 27455, 27460, 27467, 16598, + 16605, 27473, 27485, 27488, 27495, 27499, 19895, 27506, 27514, 27525, + 27534, 27547, 27557, 27571, 27583, 27597, 27610, 27622, 27632, 27644, + 27650, 27665, 27689, 27707, 27726, 27739, 27753, 27771, 27787, 27804, + 27822, 27833, 27852, 27869, 27889, 27907, 27919, 27933, 27947, 27959, + 27976, 27995, 28013, 28025, 28043, 28062, 17530, 28075, 28095, 28107, + 12577, 28119, 28124, 28129, 28134, 28143, 28149, 28154, 28158, 28165, + 28171, 28175, 28180, 28185, 28190, 28195, 28200, 28205, 2506, 28210, + 28216, 28220, 28223, 28234, 28238, 28241, 28249, 28255, 14882, 28259, + 28268, 28279, 28285, 28291, 28306, 28315, 28323, 28330, 28335, 28339, + 28346, 28352, 28361, 28369, 28376, 28386, 28395, 28405, 28410, 28419, + 28428, 28439, 28450, 28460, 28477, 4557, 28487, 28491, 28501, 28509, + 28519, 28530, 28536, 28541, 28551, 28559, 28566, 28572, 28579, 28584, + 27022, 28588, 28597, 28601, 28604, 28609, 28617, 28624, 28633, 28641, + 28649, 28657, 28667, 28676, 28682, 28688, 28694, 28698, 27027, 27032, + 28702, 28712, 28722, 28732, 28740, 28747, 28757, 28765, 28773, 28779, + 28787, 28798, 798, 28807, 17737, 649, 28821, 28830, 28838, 28849, 28860, + 28870, 28879, 28891, 28900, 28909, 28916, 28922, 28932, 28941, 28950, + 28958, 28966, 28976, 28984, 28992, 28999, 29005, 29010, 29015, 29020, + 8156, 29025, 29028, 29032, 29037, 29045, 29051, 29056, 29060, 3751, + 27045, 29068, 27050, 29074, 29080, 29086, 29091, 29096, 29100, 29108, + 29114, 29120, 29124, 3912, 29132, 29137, 29142, 29146, 29150, 11681, + 29157, 29165, 29179, 29186, 29193, 29199, 11690, 11696, 29207, 29215, + 29222, 29227, 29232, 27055, 29238, 29249, 29258, 19043, 29266, 29271, + 2755, 29276, 29287, 29293, 29298, 29302, 29306, 29309, 29316, 29323, + 29329, 29337, 29344, 29350, 29354, 8196, 29359, 29363, 29367, 29375, + 29380, 29385, 29390, 1696, 29395, 29400, 29405, 29410, 29415, 29420, + 29425, 29430, 29435, 29440, 29445, 29450, 29455, 29460, 29466, 29471, + 29476, 29481, 29486, 29491, 29496, 29502, 29507, 29512, 29517, 29522, + 29527, 29532, 29537, 29543, 29549, 29554, 29560, 29565, 29570, 5, 29576, + 29580, 29584, 29588, 29593, 29597, 29601, 29605, 29609, 29614, 29618, + 29623, 29627, 29630, 29634, 29639, 29643, 29648, 29652, 29656, 29660, + 29665, 29669, 29673, 29683, 29688, 29692, 29696, 29701, 29706, 29715, + 29720, 29725, 29729, 29733, 29742, 29755, 29767, 29776, 29785, 29790, + 29796, 29801, 29805, 29809, 29819, 29828, 29836, 29842, 29847, 29851, + 29858, 29865, 29875, 29884, 29892, 12934, 29900, 29907, 29915, 29924, + 29933, 29941, 29951, 29956, 29960, 29964, 29967, 29969, 29973, 29977, + 29982, 29987, 29991, 29995, 29998, 30002, 30005, 30009, 30012, 30015, + 30019, 30025, 30029, 30033, 30037, 30041, 30046, 30051, 30056, 30060, + 30063, 30068, 30074, 30079, 30085, 30090, 30094, 30100, 30104, 30108, + 30113, 30117, 30122, 30127, 30131, 30135, 30142, 30146, 30149, 30153, + 30157, 30163, 30168, 30174, 30178, 30182, 30187, 30194, 30200, 30204, + 30213, 30217, 30221, 30224, 30230, 30235, 30241, 1385, 1748, 30246, + 30251, 30256, 30261, 30266, 30271, 30276, 2213, 827, 30281, 30284, 30288, + 30292, 30297, 30301, 17749, 30305, 30310, 30315, 30319, 30322, 30327, + 30331, 30336, 30340, 17753, 30345, 30348, 30351, 30357, 30361, 30366, + 30370, 30383, 30391, 30395, 30398, 30406, 30415, 30422, 30427, 30433, + 30439, 30447, 30454, 30461, 30465, 30469, 30473, 30478, 30483, 30487, + 30495, 30500, 30507, 30519, 30530, 30535, 30539, 30546, 30550, 30555, + 30561, 30564, 30569, 30574, 30581, 30585, 30589, 30592, 30598, 8900, + 2413, 30602, 30607, 30623, 11100, 30643, 30652, 30668, 30672, 30679, + 30682, 30688, 30698, 30704, 30713, 30722, 30737, 30748, 30760, 30771, + 30779, 30788, 30794, 30803, 30813, 30823, 30834, 30845, 30855, 30864, + 30871, 30880, 30888, 30895, 30902, 30909, 30917, 30924, 30931, 30944, + 30951, 30959, 30966, 30972, 30977, 30986, 30993, 30999, 31004, 31012, + 31020, 31027, 31034, 28511, 31046, 31058, 31072, 31080, 31088, 31096, + 31103, 31115, 31124, 31133, 31141, 31149, 31157, 31164, 31170, 31179, + 31187, 31197, 31206, 31216, 31225, 31234, 31242, 31247, 31251, 31254, + 31258, 31262, 31266, 31270, 31274, 31280, 31286, 31291, 31299, 31306, + 31314, 31321, 10806, 17811, 31329, 31336, 31341, 31348, 31354, 31360, + 31367, 14024, 31374, 31377, 31389, 31397, 31403, 31408, 31412, 31423, + 31433, 31443, 11620, 31452, 31461, 31469, 31479, 31488, 31495, 31502, + 31510, 31514, 17830, 31517, 31524, 31528, 4501, 31534, 31537, 31544, + 31550, 31564, 31569, 31577, 31583, 31594, 31601, 31607, 31613, 31617, + 31622, 31626, 31635, 31642, 31648, 8953, 31655, 31663, 31670, 31676, + 31681, 31687, 31693, 31703, 31715, 31726, 31736, 11252, 31744, 31750, + 17848, 31754, 31756, 31259, 11633, 31765, 31770, 31776, 31786, 31791, + 31798, 31806, 31812, 31817, 31822, 31827, 31831, 31836, 31843, 31849, + 31858, 31866, 31870, 31877, 31887, 31893, 31902, 31908, 31915, 4771, + 31921, 31927, 31932, 31939, 31951, 31962, 31967, 31975, 31979, 31989, + 31995, 31999, 32004, 32014, 32023, 32027, 32034, 32042, 32049, 32055, + 32060, 32068, 32075, 32080, 32087, 32099, 32108, 32112, 32120, 15656, + 32124, 32134, 32138, 32146, 32153, 32160, 30402, 32171, 32176, 32180, + 32187, 32194, 26707, 31184, 32199, 32203, 32206, 27839, 32211, 32225, + 32241, 32259, 32278, 32295, 32313, 27858, 32330, 32350, 27875, 32362, + 32374, 19099, 32386, 27895, 32400, 32412, 12590, 32426, 32431, 32436, + 32441, 32447, 32453, 32459, 32463, 32471, 32477, 32484, 32489, 32499, + 32506, 32512, 12128, 32518, 32520, 32525, 32533, 32537, 31839, 32543, + 32550, 13866, 13876, 32557, 32564, 32574, 32579, 32583, 32586, 32592, + 32600, 32612, 32622, 32638, 32651, 32665, 19117, 32679, 32686, 32690, + 32693, 32698, 32702, 32709, 32716, 32723, 32730, 32740, 32745, 32750, + 32755, 32763, 32771, 32776, 32785, 28532, 3561, 32790, 32793, 32796, + 32801, 32808, 32813, 32818, 32834, 32842, 32850, 10864, 32858, 32863, + 32867, 32873, 32878, 32884, 32887, 32893, 32905, 32913, 32920, 32926, + 32933, 32944, 32958, 32971, 32977, 32986, 32992, 33001, 33013, 33024, + 33034, 33043, 33052, 33060, 33070, 33079, 33090, 673, 33097, 33104, + 33110, 33115, 33121, 33128, 33134, 33145, 33155, 33165, 33174, 33180, + 33187, 33192, 33200, 33207, 33215, 33223, 33235, 7142, 33242, 33245, + 33254, 33262, 33268, 33274, 33279, 33283, 33286, 33292, 33299, 33304, + 33309, 33316, 33321, 33325, 33337, 33348, 33357, 33365, 18020, 33370, + 33378, 33383, 33391, 33397, 33403, 33408, 13859, 9802, 33411, 33415, + 33419, 33422, 33425, 33431, 33439, 33447, 33451, 33455, 33460, 33464, + 33467, 33476, 33481, 33486, 33490, 33493, 33498, 33506, 33517, 33526, + 33530, 33536, 33542, 33546, 33552, 33560, 33582, 33606, 33617, 33626, + 33632, 33639, 33646, 33652, 33660, 33666, 33671, 33682, 33700, 33707, + 33715, 33719, 33726, 33731, 33740, 33753, 33761, 33773, 33784, 33795, + 33805, 33819, 33828, 33836, 33848, 33859, 11117, 33868, 33879, 33890, + 33902, 33912, 33921, 33931, 33936, 33940, 33948, 33959, 33969, 33975, + 33980, 33984, 33987, 33990, 33998, 34006, 34015, 34025, 34034, 34040, + 34045, 34059, 2838, 34081, 34092, 34101, 34111, 34123, 34132, 34141, + 34151, 34159, 34167, 34176, 34181, 34192, 34197, 34206, 34212, 34223, + 34227, 34230, 34240, 34249, 34257, 34267, 34277, 34285, 34294, 34301, + 34307, 34315, 34322, 34331, 34340, 34345, 34350, 34354, 34362, 34369, + 34375, 34379, 34387, 34394, 34405, 34420, 34427, 34433, 34443, 34452, + 34458, 34469, 34473, 34480, 34484, 34491, 34497, 16850, 34503, 34507, + 34512, 34518, 34525, 34529, 34533, 34541, 34549, 34555, 34564, 34571, + 34578, 34583, 34588, 34598, 28586, 34602, 34605, 34610, 34615, 34620, + 34625, 34630, 34635, 34640, 34645, 34651, 34656, 34661, 34667, 1094, 770, + 34672, 34675, 34682, 34691, 1777, 34698, 34703, 34707, 34713, 1143, 643, + 34718, 347, 34722, 34732, 34741, 34749, 34758, 34766, 34773, 34784, + 34792, 34801, 34809, 34819, 34827, 34832, 11794, 34836, 34844, 34852, + 34857, 17766, 4101, 34863, 34869, 34875, 6669, 34880, 34884, 34891, + 34897, 34903, 34907, 34916, 34922, 34927, 34934, 1336, 34940, 34946, + 34951, 34958, 34962, 1243, 6677, 34967, 34977, 34985, 34991, 35001, + 35010, 35018, 35024, 35029, 35037, 35044, 13376, 35050, 35057, 35062, + 35068, 35075, 35085, 1404, 253, 2212, 35091, 35097, 35104, 35115, 35126, + 35134, 35141, 35151, 35160, 35168, 35177, 35184, 35191, 35204, 35211, + 35217, 35228, 35247, 35252, 1148, 35256, 35261, 35269, 3984, 35273, + 35278, 35282, 35286, 1340, 29996, 35296, 35300, 35305, 35309, 35315, + 3846, 35321, 35329, 35336, 35347, 35356, 35364, 35389, 35397, 35402, + 3985, 401, 35408, 35416, 35424, 35431, 35436, 35442, 35447, 2281, 12792, + 35454, 35460, 31618, 31957, 35466, 656, 106, 35470, 35474, 35480, 595, + 10679, 35485, 35490, 35497, 35503, 35507, 35511, 1549, 35514, 35518, + 18308, 35521, 35526, 35533, 35539, 8966, 35544, 35552, 35559, 35565, + 27217, 35569, 35573, 35577, 35581, 1834, 20216, 35585, 35590, 35594, + 35597, 35605, 35613, 35618, 35627, 35635, 35638, 35645, 35652, 35664, + 27296, 35674, 35686, 35694, 35699, 35703, 35711, 35718, 35725, 35734, + 35740, 35747, 35754, 35757, 35761, 35765, 1351, 35775, 35777, 35782, + 35788, 35794, 35799, 35804, 35809, 35814, 35819, 35824, 35829, 35834, + 35839, 35844, 35849, 35854, 35859, 35864, 35870, 35876, 35882, 35888, + 35893, 35898, 35903, 35909, 35914, 35919, 35924, 35930, 35935, 35941, + 35946, 35951, 35956, 35961, 35967, 35972, 35978, 35983, 35988, 35993, + 35998, 36004, 36009, 36015, 36020, 36025, 36030, 36035, 36040, 36045, + 36050, 36055, 36060, 36066, 36072, 36078, 36083, 36088, 36093, 36098, + 36104, 36110, 36116, 36122, 36128, 36134, 36139, 36145, 36150, 36155, + 36160, 36165, 36171, 2552, 36176, 2559, 2566, 2962, 36181, 2572, 2582, + 36187, 2614, 2619, 2624, 36191, 36196, 36201, 36207, 36212, 36217, 36221, + 36226, 36232, 36237, 36242, 36247, 36253, 36258, 36262, 36266, 36271, + 36276, 36281, 36286, 36291, 36297, 36303, 36308, 36312, 36317, 36323, + 36327, 36332, 36337, 36342, 36347, 36351, 36354, 36359, 36364, 36369, + 36374, 36379, 36385, 36391, 36396, 36401, 36406, 36410, 36415, 36420, + 36425, 36430, 36435, 36440, 36444, 36449, 36454, 36459, 36463, 36467, + 36471, 36476, 36484, 36489, 36494, 36500, 36506, 36512, 36517, 36525, + 36529, 36532, 36537, 36542, 36546, 36551, 36556, 36560, 36565, 36569, + 36572, 36577, 4211, 21707, 36582, 36587, 36592, 36597, 36605, 25877, + 34955, 10318, 36610, 36615, 36619, 36624, 36628, 36632, 36637, 36641, + 36644, 36647, 36651, 36656, 36660, 36668, 36672, 36675, 36680, 36684, + 36688, 36693, 36698, 36702, 36708, 36713, 36718, 36725, 36732, 36736, + 36739, 36745, 36754, 36761, 36769, 36776, 36780, 36785, 36789, 36793, + 36799, 36804, 36810, 36814, 36820, 36825, 36830, 36834, 36841, 36847, + 36853, 36859, 36865, 36872, 36878, 36884, 36890, 36896, 36902, 36908, + 36914, 36921, 36927, 36934, 36940, 36946, 36952, 36958, 36964, 36970, + 36976, 36982, 36988, 36994, 36999, 37004, 13731, 37009, 37015, 37020, + 37025, 37030, 37035, 37038, 37044, 37049, 37057, 37062, 37066, 37071, + 37077, 37086, 37092, 37097, 37102, 37107, 37111, 37116, 37120, 37125, + 37130, 37135, 37140, 37147, 37154, 37160, 37166, 37171, 19813, 37178, + 37184, 37191, 37197, 37203, 37208, 37216, 37221, 11288, 37225, 37230, + 37235, 37241, 37246, 37251, 37255, 37260, 37265, 37271, 37276, 37281, + 37286, 37290, 37295, 37300, 37304, 37309, 37314, 37318, 37323, 37327, + 37332, 37337, 37342, 37346, 37351, 37355, 37360, 37364, 37371, 37375, + 37379, 18464, 37384, 37391, 37400, 37406, 37412, 37421, 37429, 37438, + 37446, 37451, 37455, 37462, 37468, 37476, 37480, 37483, 37488, 37492, + 37501, 37509, 37527, 37533, 1403, 37539, 37542, 37546, 27363, 27369, + 37552, 37556, 37567, 37578, 37589, 37601, 37605, 37612, 37619, 37626, + 37631, 37635, 37643, 37648, 37653, 37658, 37663, 6734, 16754, 25876, + 37668, 37673, 37677, 16745, 37682, 37688, 37693, 37699, 37704, 37710, + 37715, 37721, 37726, 37732, 37738, 37744, 37749, 37705, 37711, 37753, + 37758, 37764, 37769, 37775, 37780, 37786, 37791, 37716, 12422, 37795, + 37727, 37733, 37739, 3054, 3760, 37801, 37804, 37809, 37815, 37821, + 37827, 37834, 37840, 37846, 37852, 37858, 37864, 37870, 37876, 37882, + 37888, 37894, 37900, 37906, 37913, 37919, 37925, 37931, 37937, 37943, + 37946, 37951, 37954, 37961, 37966, 37974, 37978, 37983, 37988, 37994, + 37999, 38004, 38008, 38013, 38019, 38024, 38030, 38035, 38041, 38046, + 38052, 38058, 38062, 38067, 38072, 38077, 38082, 38086, 38091, 38096, + 38101, 38107, 38113, 38119, 38125, 38130, 38134, 38137, 38143, 38149, + 38158, 38166, 38173, 38178, 38182, 38186, 38191, 18251, 38196, 38204, + 38210, 4152, 1253, 38215, 38220, 38224, 9016, 38230, 38236, 38243, 9025, + 38247, 38253, 38259, 38266, 38272, 38281, 38289, 38301, 38310, 38314, + 38321, 38327, 38332, 38336, 38340, 38343, 38353, 38362, 38370, 37706, + 38375, 38385, 38395, 38405, 38411, 38416, 38426, 38431, 38444, 38458, + 38469, 38481, 38493, 38507, 38520, 38532, 38544, 17571, 38558, 38563, + 38568, 38572, 38576, 38580, 38584, 38590, 38595, 38600, 38605, 38610, + 38615, 38620, 1737, 33022, 38625, 38630, 38635, 37754, 38640, 38643, + 38648, 38653, 38658, 38664, 38670, 19423, 11994, 38675, 38681, 38688, + 19051, 38694, 38699, 38704, 38708, 38713, 38718, 37759, 38723, 38728, + 38733, 38739, 37765, 38744, 38747, 38754, 38762, 38768, 38774, 38780, + 38791, 38796, 38803, 38810, 38817, 38825, 38834, 38843, 38849, 38855, + 38863, 37770, 38868, 38874, 38880, 37776, 38885, 38890, 38898, 38906, + 38912, 38919, 38925, 38932, 38939, 38945, 38953, 38963, 38970, 38976, + 38981, 38987, 38992, 38997, 39004, 39013, 39021, 39026, 39032, 39039, + 39047, 39053, 39058, 39064, 39073, 39080, 34020, 39086, 39090, 39095, + 39104, 39109, 39114, 39119, 14972, 39127, 39132, 39137, 39142, 39146, + 39151, 39156, 39163, 39168, 39173, 39178, 37781, 25805, 39184, 2655, 158, + 39187, 39190, 39194, 39198, 39208, 39216, 39223, 39227, 39231, 39234, + 39242, 39249, 39256, 31911, 39265, 39268, 39275, 39281, 39286, 39290, + 39297, 39301, 39309, 39317, 39324, 39339, 39343, 39347, 39350, 39356, + 39363, 39367, 39373, 39377, 39384, 39392, 39400, 39407, 37717, 39414, + 39422, 39427, 39439, 12075, 12082, 12089, 12096, 12103, 12110, 626, 434, + 39445, 39450, 39455, 39461, 39466, 39471, 4178, 39476, 39479, 39484, + 39489, 39494, 39499, 39504, 39511, 27481, 39516, 39521, 39526, 39531, + 39536, 39542, 39547, 39553, 37957, 39559, 39564, 39570, 39576, 39586, + 39591, 39596, 39600, 39605, 39610, 39615, 39620, 39633, 39638, 27095, + 20298, 1064, 39642, 39648, 39652, 39657, 39662, 39668, 39673, 39678, + 39682, 39687, 39692, 39698, 39703, 39708, 1258, 39712, 39717, 39722, + 39727, 39731, 39736, 39741, 39746, 39752, 39758, 39763, 39767, 39771, + 39776, 39781, 39786, 39790, 39795, 39803, 39807, 39813, 39817, 39824, + 39833, 20069, 37728, 39839, 39846, 39854, 39862, 39869, 39875, 39884, + 39897, 39909, 39914, 39920, 39924, 2981, 39928, 39932, 39358, 39941, + 39952, 39963, 39968, 34088, 39973, 39978, 39982, 34208, 27374, 39987, + 39994, 39998, 40003, 37734, 25912, 40007, 40012, 40018, 40023, 40027, + 40031, 40034, 40038, 40044, 40053, 40064, 40076, 37740, 40081, 40084, + 40088, 40092, 40097, 40102, 40107, 40112, 40117, 40122, 40127, 40132, + 373, 40137, 40142, 40147, 40152, 40157, 40162, 40168, 40173, 40178, + 40184, 40189, 40195, 40200, 40206, 40211, 40216, 40221, 40226, 40231, + 40236, 40241, 40246, 40252, 40257, 40262, 40267, 40272, 40277, 40282, + 40287, 40293, 40299, 40304, 40309, 40314, 40319, 40324, 40329, 40334, + 40339, 40344, 40349, 40354, 40359, 40364, 40369, 40374, 40379, 40384, + 40389, 40399, 40409, 40415, 342, 14, 40420, 40423, 40427, 40431, 40439, + 40443, 40447, 31591, 16987, 1818, 40450, 40455, 40459, 40464, 40468, + 40473, 40477, 40482, 40486, 40489, 40491, 40495, 40500, 40504, 40515, + 40518, 40520, 40524, 40536, 40548, 40557, 40561, 40571, 40575, 40581, + 40586, 40595, 40601, 40606, 40611, 40615, 40619, 40624, 40631, 40636, + 40642, 40647, 40651, 40658, 31192, 31202, 40662, 40667, 40672, 40677, + 40684, 40688, 40695, 40702, 40708, 9171, 40712, 40721, 40729, 40744, + 40758, 40767, 40775, 40786, 40795, 40800, 40807, 40817, 8165, 40827, + 40832, 40838, 40843, 40847, 40850, 40855, 40859, 40864, 40868, 40875, + 40880, 40885, 40890, 40900, 40905, 40910, 40915, 10188, 40920, 40922, + 40930, 40933, 40936, 40944, 40959, 40967, 40977, 40979, 40982, 40986, + 40992, 40996, 41001, 41006, 41024, 41038, 41057, 41074, 41083, 41091, + 41096, 41101, 1396, 41107, 41113, 41118, 41128, 41137, 41145, 41150, + 41156, 41161, 41170, 41179, 41190, 41195, 41202, 41208, 41212, 41221, + 41228, 41236, 41243, 41256, 41264, 41268, 41278, 41284, 41289, 41293, + 41301, 41309, 41314, 41318, 41322, 41331, 41337, 41342, 41350, 41360, + 41369, 41378, 41387, 41398, 41406, 41417, 41426, 41434, 41441, 41447, + 41452, 41463, 41474, 41479, 41483, 41486, 41490, 41500, 41508, 41514, + 41525, 41536, 41547, 41558, 41569, 41580, 41591, 41602, 41614, 41626, + 41638, 41650, 41662, 41674, 41686, 41695, 41699, 41707, 41713, 41719, + 41726, 41732, 41737, 41743, 41747, 41752, 41757, 41762, 40394, 40404, + 2526, 41767, 41769, 41774, 41779, 41784, 41787, 41789, 41793, 41796, + 41803, 41807, 11644, 41811, 41817, 41824, 41830, 41840, 41845, 41851, + 41855, 41860, 41873, 31781, 41879, 41885, 41894, 41903, 21930, 41910, + 41919, 41927, 38391, 41933, 41938, 41942, 41951, 41959, 41966, 41971, + 41975, 41980, 41985, 41993, 41997, 42005, 42011, 42017, 42022, 42027, + 42031, 42034, 42039, 42052, 42068, 27965, 42085, 42097, 42114, 42126, + 42140, 27982, 28001, 42152, 42164, 2855, 42178, 42183, 42188, 42193, + 42197, 42204, 42216, 42223, 42232, 42242, 42245, 42256, 42267, 42275, + 42280, 42284, 42289, 42294, 42299, 42304, 42309, 42314, 1768, 947, 42319, + 42323, 42327, 42330, 42335, 42340, 42346, 42351, 42356, 42362, 42368, + 42373, 42377, 42382, 42387, 42392, 42396, 42399, 42405, 42410, 42415, + 42420, 42424, 42429, 42435, 42443, 32092, 42448, 42453, 42460, 42466, + 42472, 42477, 42485, 27490, 42492, 42497, 42502, 42507, 42511, 42514, + 42519, 42523, 42527, 42534, 42540, 42546, 42552, 42559, 42564, 42570, + 41304, 42574, 42578, 42583, 42596, 42601, 42607, 42615, 42622, 42630, + 42640, 42646, 42652, 42658, 42662, 42671, 42679, 42686, 42691, 42696, + 12445, 42701, 42711, 42718, 42724, 42734, 42739, 42745, 42753, 4017, + 42760, 42767, 42773, 42780, 4023, 42784, 42789, 42800, 42807, 42813, + 42822, 42826, 42829, 4609, 42836, 42843, 42849, 42855, 42863, 42873, + 35437, 42880, 42888, 42894, 42899, 42905, 42910, 42914, 31540, 42920, + 42927, 42933, 42941, 42950, 42957, 42963, 42974, 28784, 42980, 42987, + 42993, 43003, 43008, 43012, 43020, 43028, 43035, 43041, 43046, 11246, + 941, 43051, 43055, 43057, 43061, 43066, 43069, 43071, 43076, 43082, + 43087, 43092, 43099, 39507, 43105, 43110, 43114, 43119, 43123, 43132, + 43136, 43142, 43149, 43155, 43162, 43167, 43176, 43181, 43185, 43190, + 43197, 43205, 43213, 43218, 25968, 43222, 43225, 43229, 43233, 12889, + 1005, 43237, 43242, 43250, 43255, 43259, 43268, 43275, 43279, 43283, + 43291, 43298, 16272, 43308, 43312, 43316, 43324, 43332, 43338, 43343, + 43347, 43356, 16008, 43362, 43371, 43378, 43383, 43390, 43397, 43405, + 43412, 43420, 43428, 43437, 43442, 43449, 43456, 43463, 43470, 43477, + 43482, 43489, 43495, 43512, 43520, 43530, 43538, 43545, 43553, 461, + 43557, 43563, 43567, 43572, 40791, 43578, 43581, 43585, 43591, 43602, + 43610, 4028, 43618, 43624, 43630, 43640, 43646, 43655, 43664, 43674, + 43681, 43687, 43692, 4034, 4040, 43701, 43709, 43716, 43720, 14356, + 43728, 43732, 43739, 43747, 43754, 43763, 43770, 43776, 43785, 43795, + 43801, 43809, 43818, 43825, 43833, 43840, 26770, 43844, 43851, 43857, + 43867, 43876, 43884, 43895, 43899, 43909, 43916, 43921, 43926, 43932, + 43939, 43947, 43956, 43965, 43975, 43986, 43993, 43998, 44005, 3269, + 44013, 44019, 44024, 44031, 44037, 44043, 44048, 44061, 44074, 44087, + 44094, 44100, 44108, 44116, 44121, 44125, 44129, 44134, 44139, 44144, + 44149, 44154, 44159, 1365, 44164, 44168, 44172, 44176, 44180, 44184, + 44188, 44192, 44196, 44200, 44204, 44208, 44212, 44216, 44220, 44224, + 44228, 44232, 44236, 44240, 44244, 44248, 44252, 44256, 44260, 44264, + 44268, 44272, 44276, 44280, 44284, 44288, 44292, 44296, 44300, 44304, + 44308, 44312, 44316, 44320, 44324, 44328, 44332, 44336, 44340, 44344, + 44348, 44352, 44356, 44360, 44364, 44368, 44372, 44376, 44380, 44384, + 44388, 44392, 44396, 44400, 44404, 44408, 44412, 44416, 44420, 44424, + 44428, 44432, 44436, 44440, 44444, 44448, 44452, 44456, 44460, 44464, + 44468, 44472, 44476, 44480, 44484, 44488, 44492, 44496, 44500, 44504, + 44508, 44512, 44516, 44520, 44524, 44528, 44532, 44536, 44540, 44544, + 44548, 44552, 44556, 44560, 44564, 44568, 44572, 44576, 44580, 44584, + 44588, 44592, 44596, 44600, 44604, 44608, 44612, 44616, 44620, 44624, + 44628, 44632, 44636, 44640, 44644, 44648, 44652, 44656, 44660, 44664, + 44668, 44672, 44676, 44680, 44684, 44688, 44692, 44696, 44700, 44704, + 44708, 44712, 44716, 44720, 44724, 44728, 44732, 44736, 44740, 44744, + 44748, 44752, 44756, 44760, 44764, 44768, 44772, 44776, 44781, 44785, + 44790, 44794, 44799, 44803, 44808, 44812, 44818, 44823, 44827, 44832, + 44836, 44841, 44845, 44850, 44854, 44859, 44863, 44868, 44872, 44877, + 44881, 44887, 44893, 44898, 44902, 44907, 44911, 44917, 44922, 44926, + 44931, 44935, 44940, 44944, 44950, 44955, 44959, 44964, 44968, 44973, + 44977, 44982, 44986, 44992, 44997, 45001, 45006, 45010, 45016, 45021, + 45025, 45030, 45034, 45039, 45043, 45048, 45052, 45057, 45061, 45067, + 45072, 45076, 45082, 45087, 45091, 45097, 45102, 45106, 45111, 45115, + 45120, 45124, 45130, 45136, 45142, 45148, 45154, 45160, 45166, 45172, + 45177, 45181, 45186, 45190, 45196, 45201, 45205, 45210, 45214, 45219, + 45223, 45228, 45232, 45237, 45241, 45246, 45250, 45255, 45259, 45265, + 45270, 45274, 45279, 45283, 45289, 45295, 45300, 127, 63, 45304, 45306, + 45310, 45314, 45318, 45323, 45327, 45331, 45336, 11153, 45341, 45347, + 1677, 7181, 45353, 45356, 45361, 45365, 45370, 45374, 45378, 45383, + 12233, 45387, 45391, 45395, 630, 45399, 18573, 45404, 45408, 45413, + 45418, 45423, 45427, 45434, 45440, 45446, 31813, 45451, 45454, 45458, + 45463, 45469, 45473, 45476, 45484, 45490, 45495, 45499, 45502, 45506, + 45512, 45516, 45520, 3811, 3816, 15084, 45523, 45527, 45531, 45535, + 45539, 45547, 45554, 45558, 15958, 45565, 45579, 45586, 45597, 361, + 45602, 45606, 45612, 45624, 45630, 45636, 45641, 45647, 18625, 45651, + 45655, 35750, 45664, 45670, 45679, 45683, 45687, 45692, 45698, 45703, + 45707, 45712, 45716, 45720, 45727, 45733, 45738, 45749, 45764, 45779, + 45794, 45810, 45828, 12140, 45842, 45849, 45855, 45859, 45862, 45871, + 45876, 45880, 45888, 19254, 45896, 45900, 45910, 45921, 35640, 1042, + 45934, 45943, 45961, 45980, 45989, 45997, 46005, 1690, 12342, 46009, + 27386, 46012, 31579, 46017, 11478, 46022, 46028, 46033, 46039, 46044, + 46050, 46055, 46061, 46066, 46072, 46078, 46084, 46089, 46045, 46051, + 46093, 46056, 46062, 46067, 46098, 46073, 46079, 9184, 4434, 46104, + 46112, 46116, 46119, 46126, 46130, 46135, 46140, 46147, 46153, 46159, + 46164, 17862, 46168, 31596, 46172, 46176, 46180, 46187, 46193, 46197, + 33954, 46206, 10351, 46210, 10780, 46213, 46220, 46226, 46230, 14381, + 46237, 46243, 46248, 46255, 46262, 46269, 34753, 9081, 46276, 46283, + 46290, 46296, 46301, 46308, 46319, 46325, 46330, 46335, 46340, 46344, + 46349, 46356, 46046, 46360, 46370, 46379, 46390, 46396, 46404, 46411, + 46416, 46421, 46426, 46431, 46436, 46440, 46444, 46451, 46457, 46465, + 2416, 30605, 12245, 12257, 12262, 12268, 46474, 12273, 12278, 12284, + 46479, 46489, 46493, 12289, 46498, 20496, 46501, 46506, 46510, 46514, + 46525, 46533, 42227, 46541, 46546, 46553, 46560, 46564, 46567, 46575, + 12153, 46582, 46585, 46591, 46601, 6767, 46610, 46615, 46621, 46625, + 46633, 46637, 46647, 46653, 46658, 46669, 46678, 46687, 46696, 46705, + 46714, 46723, 46732, 46738, 46744, 46749, 46755, 46761, 46767, 46772, + 46775, 46782, 46788, 46792, 46797, 46804, 46811, 46815, 46818, 46828, + 46841, 46850, 46859, 46870, 46883, 46895, 46906, 46915, 46926, 46931, + 46940, 46945, 12294, 46951, 46958, 46966, 46973, 46978, 46983, 31859, + 46987, 46994, 4374, 25, 46998, 47003, 20345, 47007, 47010, 47013, 34145, + 47017, 34762, 47025, 47029, 47033, 47036, 47042, 47048, 47053, 37805, + 47062, 47070, 47076, 47083, 34128, 47087, 34365, 47091, 47100, 47104, + 47112, 47118, 47124, 47129, 47133, 34788, 47139, 47142, 47150, 47158, + 47166, 4772, 47172, 47176, 47180, 47185, 47192, 47198, 47203, 47208, + 47212, 47218, 47223, 47229, 4662, 820, 47236, 47240, 47243, 47255, 47262, + 47267, 18446, 47271, 47279, 47287, 47295, 47303, 47310, 47318, 47326, + 47333, 47341, 47349, 47357, 47365, 47373, 47381, 47389, 47397, 47405, + 47413, 47421, 47428, 47436, 47444, 47452, 47460, 47468, 47476, 47484, + 47492, 47500, 47508, 47516, 47524, 47532, 47540, 47548, 47556, 47564, + 47572, 47580, 47587, 47595, 47602, 47610, 47618, 47626, 47634, 47642, + 47650, 47658, 47666, 47677, 26806, 47682, 47685, 47692, 47696, 47702, + 47706, 47712, 47717, 47723, 47728, 47733, 47737, 47741, 47748, 47756, + 47761, 47766, 47776, 47782, 47795, 47801, 47807, 47813, 47816, 47823, + 47828, 4700, 47834, 4869, 965, 47839, 47842, 47845, 47848, 37889, 37895, + 47851, 37901, 37914, 37920, 37926, 47857, 37932, 37938, 47863, 47869, 10, + 47877, 47884, 47888, 47892, 47900, 38749, 47904, 47908, 47915, 47920, + 47924, 47929, 47935, 47940, 47946, 47951, 47955, 47959, 47963, 47968, + 47972, 47977, 47981, 47985, 47992, 47997, 48001, 48005, 48010, 48014, + 48019, 48023, 48027, 48032, 48038, 18755, 18760, 48043, 48047, 48050, + 48056, 48060, 48064, 25762, 48069, 48073, 48079, 48086, 48092, 48097, + 40820, 48107, 48112, 48120, 48124, 48127, 48131, 38764, 48139, 4738, + 48144, 48149, 48153, 48158, 48162, 48167, 16026, 48178, 48182, 48185, + 48189, 48197, 48202, 48206, 48211, 48216, 48220, 48224, 48228, 48231, + 48235, 48238, 48243, 48248, 48253, 48258, 48263, 48268, 8664, 16042, + 48273, 48276, 48282, 48287, 48293, 48298, 48304, 48309, 48315, 48320, + 48326, 48332, 48338, 48343, 48347, 48351, 48362, 48370, 48377, 48383, + 48388, 48399, 48409, 48415, 48420, 48427, 48436, 48452, 48468, 48478, + 34030, 48485, 48489, 48494, 48499, 48503, 48507, 43960, 48513, 48518, + 48522, 48529, 48534, 48539, 48543, 48546, 48550, 48556, 32825, 48560, + 26120, 48565, 48572, 48580, 48586, 48592, 48599, 48607, 48613, 48617, + 48622, 48628, 48636, 48641, 48645, 48654, 11134, 48662, 48666, 48674, + 48681, 48686, 48691, 48696, 48700, 48703, 48709, 48713, 48716, 48720, + 48727, 48732, 48739, 48743, 48749, 48753, 48759, 48764, 48769, 5107, + 5114, 48774, 48783, 48791, 48796, 48802, 48814, 48827, 48841, 48848, + 48854, 48860, 48865, 48873, 48876, 48878, 48889, 48901, 48912, 48927, + 48944, 48964, 48986, 48993, 49000, 49007, 49013, 49017, 8663, 49020, + 49024, 49028, 49033, 49037, 49041, 49044, 49048, 49062, 28031, 49081, + 49094, 49107, 49120, 28049, 49135, 2808, 49150, 49156, 49160, 49170, + 49174, 49178, 49183, 49187, 49194, 49199, 49203, 49210, 49216, 49221, + 49227, 49237, 49249, 49260, 49265, 49272, 49276, 49280, 49283, 49291, + 19275, 4141, 49296, 18794, 49309, 49316, 49323, 49329, 49333, 49337, + 49342, 49348, 49353, 49359, 49363, 49367, 49370, 49375, 49379, 49384, + 49389, 49394, 49399, 49404, 49409, 49414, 49419, 49424, 8727, 18805, + 49429, 49433, 49439, 49448, 49453, 49462, 49469, 43791, 49475, 49480, + 49484, 49491, 49496, 49503, 49511, 49517, 49521, 49524, 49528, 49533, + 2886, 49540, 49547, 49551, 49554, 49559, 49564, 49570, 49575, 49580, + 49584, 49589, 49599, 49604, 49610, 49615, 49622, 47257, 49628, 49634, + 49642, 49652, 49657, 49662, 49666, 49671, 49676, 8167, 8179, 49681, + 49684, 49691, 49697, 49706, 10268, 41444, 49714, 49718, 49722, 38812, + 49730, 49741, 49749, 44008, 49756, 49761, 49766, 49777, 49784, 49795, + 38836, 26137, 49803, 4652, 49808, 16471, 49814, 34119, 49820, 49825, + 49835, 49844, 49851, 49857, 49861, 49864, 49871, 49877, 49884, 49890, + 49900, 49908, 49914, 49920, 49925, 49929, 49936, 49941, 49947, 49954, + 49960, 49029, 49965, 49969, 16513, 16522, 16531, 16540, 16549, 16578, + 622, 16587, 49975, 49980, 49983, 49989, 49997, 1275, 50002, 50006, 50011, + 50016, 50020, 50025, 50032, 50038, 50042, 50047, 50053, 50057, 37962, + 50062, 50067, 50076, 50083, 50093, 50099, 34163, 50116, 50125, 50133, + 50139, 50144, 50151, 50157, 50165, 50174, 50182, 50190, 50196, 50200, + 50205, 50213, 35311, 38845, 50219, 50238, 19178, 50252, 50268, 50282, + 50288, 50293, 50298, 50303, 50309, 38851, 50314, 50317, 50324, 50331, + 50340, 50345, 50349, 423, 3176, 50356, 50361, 50366, 33219, 50154, 50370, + 50378, 50383, 50391, 50395, 50398, 50403, 50409, 50415, 50420, 50424, + 34236, 50427, 50432, 50436, 50439, 50444, 50448, 50453, 50458, 50462, + 50467, 50471, 50478, 50482, 50486, 25758, 25769, 50491, 50496, 50502, + 50507, 50513, 50519, 32781, 50524, 50528, 50531, 50537, 50542, 50547, + 50552, 50557, 50562, 50567, 50572, 50577, 50583, 50589, 14569, 19485, + 50594, 50599, 50604, 50609, 50614, 50619, 50624, 50629, 452, 68, 37979, + 37984, 37989, 37995, 38000, 38005, 50634, 38009, 50638, 50642, 50646, + 38014, 38020, 50660, 38031, 38036, 50668, 50673, 38042, 50678, 50683, + 50692, 50697, 50702, 50711, 50717, 50723, 50729, 38059, 50742, 50751, + 50757, 38063, 50761, 38068, 50766, 38073, 38078, 50769, 50774, 50778, + 50784, 16279, 50791, 16289, 50798, 50803, 38083, 50807, 50812, 50817, + 50822, 50827, 50831, 50836, 50841, 50847, 50852, 50857, 50863, 50869, + 50874, 50878, 50883, 50888, 50893, 50897, 50902, 50907, 50912, 50918, + 50924, 50930, 50935, 50939, 50944, 50948, 38087, 38092, 38097, 50952, + 50956, 50961, 50965, 50977, 38102, 38108, 38114, 38126, 50983, 31639, + 50987, 50992, 50996, 51001, 51008, 51013, 51018, 51023, 51027, 51031, + 51041, 51046, 51051, 51055, 51065, 51069, 51072, 51080, 51085, 38174, + 51089, 1375, 51095, 51100, 51106, 51114, 51118, 51127, 51135, 51139, + 51143, 51151, 51157, 51165, 51181, 51186, 51190, 51194, 51198, 51203, + 51209, 51224, 38211, 1685, 14601, 51228, 1254, 1269, 51240, 51248, 51255, + 51260, 9230, 51267, 51272, 10765, 978, 2641, 12321, 51279, 10658, 51284, + 51287, 51296, 1162, 51301, 49200, 51308, 51317, 51322, 51326, 51334, + 51341, 27436, 2697, 51349, 12842, 51359, 51365, 2434, 2444, 51374, 51383, + 51393, 51404, 3584, 41841, 51409, 4341, 4352, 9258, 1167, 51413, 51421, + 51428, 51433, 51437, 51441, 51446, 29077, 49535, 12412, 51454, 51463, + 51472, 51480, 51493, 51500, 51511, 51516, 51529, 51542, 51554, 51566, + 51578, 51589, 51602, 51613, 51624, 51634, 51642, 51650, 51662, 51674, + 51685, 51694, 51702, 51709, 51721, 51728, 51734, 51743, 51749, 51756, + 51769, 51774, 51784, 51789, 51795, 51800, 32121, 51804, 48705, 51811, + 51818, 51826, 51833, 2654, 51840, 51851, 51861, 51870, 51878, 51888, + 51896, 51905, 51915, 51924, 51929, 51935, 51941, 4190, 51952, 51962, + 51971, 51980, 51988, 51998, 52006, 52015, 52020, 52025, 52030, 1604, 47, + 52038, 52046, 52057, 52068, 19889, 52078, 52082, 52089, 52095, 52100, + 52104, 52115, 52125, 52134, 52145, 52150, 20318, 20323, 52157, 52166, + 52171, 52181, 52186, 52194, 52202, 52209, 52215, 1566, 271, 52219, 52224, + 52230, 46108, 52235, 52238, 2182, 2663, 52246, 52250, 52253, 1420, 52259, + 16799, 1172, 52264, 52277, 2797, 2818, 52291, 52303, 52315, 2832, 2849, + 2864, 2880, 2897, 52329, 52341, 2912, 52355, 1178, 1184, 1190, 12713, + 52360, 52365, 52370, 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, 57624, 57639, 57654, 57669, 57684, 57699, 57714, + 57729, 57744, 57759, 57774, 57789, 57804, 57819, 57834, 57849, 57864, + 57879, 57894, 57909, 57924, 57939, 57954, 57969, 57984, 57999, 58014, + 58029, 58044, 58059, 58074, 58089, 58104, 58119, 58134, 58149, 58164, + 58179, 58194, 58209, 58224, 58239, 58254, 58269, 58284, 58299, 58314, + 58329, 58344, 58359, 58374, 58389, 58404, 58419, 58434, 58449, 58464, + 58479, 58494, 58509, 58524, 58539, 58554, 58569, 58584, 58599, 58614, + 58629, 58644, 58659, 58674, 58689, 58704, 58719, 58734, 58749, 58764, + 58779, 58794, 58809, 58824, 58839, 58854, 58869, 58884, 58899, 58914, + 58929, 58944, 58959, 58974, 58989, 59004, 59019, 59034, 59049, 59064, + 59079, 59094, 59109, 59124, 59139, 59154, 59169, 59184, 59199, 59214, + 59229, 59244, 59259, 59274, 59289, 59304, 59319, 59334, 59349, 59364, + 59379, 59394, 59409, 59424, 59439, 59454, 59469, 59484, 59499, 59514, + 59529, 59544, 59559, 59574, 59589, 59604, 59619, 59634, 59649, 59664, + 59679, 59694, 59709, 59724, 59739, 59754, 59769, 59784, 59799, 59814, + 59829, 59844, 59859, 59874, 59889, 59904, 59919, 59934, 59949, 59964, + 59979, 59994, 60009, 60024, 60039, 60054, 60069, 60084, 60099, 60114, + 60129, 60144, 60159, 60174, 60189, 60205, 60221, 60237, 60253, 60269, + 60285, 60301, 60317, 60333, 60349, 60365, 60381, 60397, 60413, 60429, + 60445, 60461, 60477, 60493, 60509, 60525, 60541, 60557, 60573, 60589, + 60605, 60621, 60637, 60653, 60669, 60685, 60701, 60717, 60733, 60749, + 60765, 60781, 60797, 60813, 60829, 60845, 60861, 60877, 60893, 60909, + 60925, 60941, 60957, 60973, 60989, 61005, 61021, 61037, 61053, 61069, + 61085, 61101, 61117, 61133, 61149, 61165, 61181, 61197, 61213, 61229, + 61245, 61261, 61277, 61293, 61309, 61325, 61341, 61357, 61373, 61389, + 61405, 61421, 61437, 61453, 61469, 61485, 61501, 61517, 61533, 61549, + 61565, 61581, 61597, 61613, 61629, 61645, 61661, 61677, 61693, 61709, + 61725, 61741, 61757, 61773, 61789, 61805, 61821, 61837, 61853, 61869, + 61885, 61901, 61917, 61933, 61949, 61965, 61981, 61997, 62013, 62029, + 62045, 62061, 62077, 62093, 62109, 62125, 62141, 62157, 62173, 62189, + 62205, 62221, 62237, 62253, 62269, 62285, 62301, 62317, 62333, 62349, + 62365, 62381, 62397, 62413, 62429, 62445, 62461, 62477, 62493, 62509, + 62525, 62541, 62557, 62573, 62589, 62605, 62621, 62637, 62653, 62669, + 62685, 62701, 62717, 62733, 62749, 62765, 62781, 62797, 62813, 62829, + 62845, 62861, 62877, 62893, 62909, 62925, 62941, 62957, 62973, 62989, + 63005, 63021, 63037, 63053, 63069, 63085, 63101, 63117, 63133, 63149, + 63165, 63181, 63197, 63213, 63229, 63245, 63261, 63277, 63293, 63309, + 63325, 63341, 63357, 63373, 63389, 63405, 63421, 63437, 63453, 63469, + 63485, 63501, 63517, 63533, 63549, 63565, 63581, 63597, 63613, 63629, + 63645, 63661, 63677, 63693, 63709, 63725, 63741, 63757, 63773, 63789, + 63805, 63821, 63837, 63853, 63869, 63885, 63901, 63917, 63933, 63949, + 63965, 63981, 63997, 64013, 64029, 64045, 64061, 64077, 64093, 64109, + 64125, 64141, 64157, 64173, 64189, 64205, 64221, 64237, 64253, 64269, + 64285, 64301, 64317, 64333, 64349, 64365, 64381, 64397, 64413, 64429, + 64445, 64461, 64477, 64493, 64509, 64525, 64541, 64557, 64573, 64589, + 64605, 64621, 64637, 64653, 64669, 64685, 64701, 64717, 64733, 64749, + 64765, 64781, 64797, 64813, 64829, 64845, 64861, 64877, 64893, 64909, + 64925, 64941, 64957, 64973, 64989, 65005, 65021, 65037, 65053, 65069, + 65085, 65101, 65117, 65133, 65149, 65165, 65181, 65197, 65213, 65229, + 65245, 65261, 65277, 65293, 65309, 65325, 65341, 65357, 65373, 65389, + 65405, 65421, 65437, 65453, 65469, 65485, 65501, 65517, 65533, 65549, + 65565, 65581, 65597, 65613, 65629, 65645, 65661, 65677, 65693, 65709, + 65725, 65741, 65757, 65773, 65789, 65805, 65821, 65837, 65853, 65869, + 65885, 65901, 65917, 65933, 65949, 65965, 65981, 65997, 66013, 66029, + 66045, 66061, 66077, 66093, 66109, 66125, 66141, 66157, 66173, 66189, + 66205, 66221, 66237, 66253, 66269, 66285, 66301, 66317, 66333, 66349, + 66365, 66381, 66397, 66413, 66429, 66445, 66461, 66477, 66493, 66509, + 66525, 66541, 66557, 66573, 66589, 66605, 66621, 66637, 66653, 66669, + 66685, 66701, 66717, 66733, 66749, 66765, 66781, 66797, 66813, 66829, + 66845, 66861, 66877, 66893, 66909, 66925, 66941, 66957, 66973, 66989, + 67005, 67021, 67037, 67053, 67069, 67085, 67101, 67117, 67133, 67149, + 67165, 67181, 67197, 67213, 67229, 67245, 67261, 67277, 67293, 67309, + 67325, 67341, 67357, 67373, 67389, 67405, 67421, 67437, 67453, 67469, + 67485, 67501, 67517, 67533, 67549, 67565, 67581, 67597, 67613, 67629, + 67645, 67661, 67677, 67693, 67709, 67725, 67741, 67757, 67773, 67789, + 67805, 67821, 67837, 67853, 67869, 67885, 67901, 67917, 67933, 67949, + 67965, 67981, 67997, 68013, 68029, 68045, 68061, 68077, 68093, 68109, + 68125, 68141, 68157, 68173, 68189, 68205, 68221, 68237, 68253, 68269, + 68285, 68301, 68317, 68333, 68349, 68365, 68381, 68397, 68413, 68429, + 68445, 68461, 68477, 68493, 68509, 68525, 68541, 68557, 68573, 68589, + 68605, 68621, 68637, 68653, 68669, 68685, 68701, 68717, 68733, 68749, + 68765, 68781, 68797, 68813, 68829, 68845, 68861, 68870, 68885, 68899, + 68908, 17701, 68912, 68917, 68923, 68929, 68939, 68947, 17958, 18689, + 9277, 68960, 1428, 1432, 68968, 4270, 33344, 8104, 68974, 68979, 68984, + 68989, 68994, 69000, 69005, 69011, 69016, 69022, 69027, 69032, 69037, + 69042, 69048, 69053, 69058, 69063, 69068, 69073, 69078, 69083, 69089, + 69094, 69100, 69107, 2701, 69112, 69118, 9652, 69122, 69127, 69134, + 69142, 4281, 4286, 4291, 4296, 65, 69146, 69152, 69157, 69162, 69166, + 69171, 69175, 69179, 12785, 69183, 69193, 69206, 69217, 69230, 69237, + 69243, 69251, 69258, 12246, 69267, 69272, 69278, 69284, 69290, 69295, + 69300, 69305, 69310, 69314, 69319, 69324, 69329, 69335, 69341, 69347, + 69352, 69356, 69361, 69366, 69370, 69375, 69380, 69385, 69389, 12801, + 12812, 12817, 1471, 69393, 69399, 1476, 19723, 69404, 19732, 1486, 69409, + 69415, 69420, 1507, 69426, 1513, 1519, 12847, 69431, 69440, 69448, 69456, + 69463, 69467, 69471, 69477, 69482, 37622, 69487, 69494, 69502, 69509, + 69514, 69518, 69522, 69531, 69536, 69541, 69546, 1524, 280, 69551, 69556, + 69560, 19858, 987, 69564, 69571, 69576, 69580, 19916, 1528, 46384, 69583, + 69588, 69598, 69607, 69612, 69616, 69622, 1533, 49481, 69627, 69636, + 69642, 69647, 69652, 13086, 13092, 69658, 69671, 69683, 69700, 69717, + 69734, 69751, 69768, 69785, 69802, 69819, 69836, 69853, 69870, 69887, + 69904, 69921, 69938, 69955, 69972, 69989, 70006, 70023, 70040, 70057, + 70074, 70091, 70108, 70125, 70142, 70159, 70176, 70193, 70210, 70227, + 70244, 70261, 70278, 70295, 70312, 70329, 70346, 70363, 70380, 70397, + 70414, 70431, 70448, 70465, 70482, 70499, 70516, 70527, 70537, 70542, + 1538, 70546, 70551, 70557, 70562, 70567, 70574, 10677, 1543, 70580, + 70589, 33736, 70594, 70605, 13108, 70615, 70620, 70626, 70631, 70638, + 70644, 70649, 1548, 20210, 70654, 70660, 13118, 70666, 70671, 70676, + 70681, 70686, 70691, 70696, 70701, 1553, 4761, 70706, 70711, 70717, + 70722, 70727, 70732, 70737, 70742, 70747, 70752, 70757, 70763, 70769, + 70775, 70780, 70784, 70789, 70794, 70798, 70803, 70808, 70813, 70818, + 70822, 70827, 70833, 70838, 70843, 70847, 70852, 70857, 70863, 70868, + 70873, 70879, 70885, 70890, 70894, 70899, 70904, 70909, 70913, 70918, + 70923, 70928, 70934, 70940, 70945, 70949, 70953, 70958, 70963, 70968, + 35515, 70972, 70977, 70982, 70988, 70993, 70998, 71002, 71007, 71012, + 71018, 71023, 71028, 71034, 71040, 71045, 71049, 71054, 71059, 71063, + 71068, 71073, 71078, 71084, 71090, 71095, 71099, 71104, 71109, 71113, + 71118, 71123, 71128, 71133, 71137, 71140, 71143, 71148, 71153, 38358, + 71160, 71168, 50108, 71174, 3928, 33679, 71187, 71194, 71200, 71206, + 4107, 71211, 13260, 71217, 71227, 71242, 71250, 13265, 71261, 71266, + 71277, 71289, 71301, 71313, 2903, 71325, 71330, 31722, 71342, 71348, + 71354, 71359, 71368, 71375, 71380, 71385, 71390, 71395, 71400, 71405, + 1570, 19350, 71410, 71415, 71420, 71425, 71431, 71436, 71442, 71447, + 71452, 71458, 71463, 71468, 49555, 71472, 71476, 71481, 71485, 20358, + 71490, 71493, 71498, 71506, 71514, 1574, 13301, 13307, 1579, 71522, + 71529, 71534, 71543, 71553, 71560, 71565, 71570, 1584, 71577, 71582, + 20478, 71586, 71591, 71598, 71604, 71608, 71621, 71627, 71638, 71648, + 71655, 20500, 10571, 10578, 4355, 4361, 71662, 1589, 71667, 71676, 71682, + 71690, 71697, 71703, 71710, 71722, 71728, 71733, 71740, 71752, 71763, + 71773, 71782, 71792, 71802, 4249, 71810, 37416, 37425, 20540, 71823, + 71828, 71833, 71838, 71843, 71848, 71853, 1594, 1598, 71858, 71862, + 71865, 71876, 71881, 20566, 1608, 71889, 71894, 71899, 71911, 20599, + 71918, 71921, 71927, 71933, 71938, 71946, 1613, 71951, 71956, 71964, + 71972, 71979, 71988, 71996, 72005, 72009, 1618, 72018, 1623, 25943, + 72023, 72030, 72036, 20686, 72044, 72054, 72060, 72065, 72073, 72080, + 72089, 72097, 72107, 72116, 72126, 72135, 72146, 72156, 72166, 72175, + 72185, 72199, 72212, 72221, 72229, 72239, 72248, 72260, 72271, 72282, + 72292, 19978, 72297, 13453, 72306, 72312, 72317, 72324, 72330, 72337, + 72343, 19567, 72353, 72359, 72364, 72375, 72382, 72389, 72394, 72402, + 13470, 13475, 72410, 72416, 72420, 4339, 4350, 20762, 49658, 72428, + 72434, 72439, 72447, 72454, 14582, 72459, 72465, 72471, 1634, 72476, + 72479, 72485, 72490, 72495, 72500, 72505, 72510, 72515, 72520, 72525, + 72531, 72537, 1333, 72542, 72547, 72552, 72558, 72563, 72568, 72573, + 72578, 72583, 72588, 1643, 18, 72594, 72598, 72603, 72607, 72611, 72615, + 38644, 72620, 28250, 72625, 72630, 72634, 72637, 72641, 72645, 72650, + 72654, 72659, 72663, 72666, 72672, 42331, 42336, 42341, 72675, 72682, + 72688, 72696, 49253, 72706, 72712, 42347, 38908, 38659, 38665, 42363, + 38671, 72717, 72722, 72726, 38941, 72733, 72736, 72740, 72748, 72755, + 72760, 72763, 72768, 72773, 72777, 72781, 72784, 72794, 72806, 72813, + 72819, 38676, 72826, 40627, 72829, 9669, 13815, 72832, 72836, 72841, + 4159, 72845, 72848, 16332, 72855, 72862, 72875, 72890, 72904, 72920, + 72935, 72944, 72952, 72960, 72969, 72973, 72982, 72988, 72993, 73003, + 73016, 73028, 73035, 73040, 73049, 73062, 44055, 73080, 73085, 73092, + 73098, 73103, 850, 73108, 73116, 73123, 73130, 33160, 914, 73136, 73142, + 73147, 73157, 73165, 73171, 73176, 38695, 6858, 38709, 73180, 73190, + 73195, 73203, 73213, 73228, 73234, 73240, 73247, 38719, 73252, 73258, + 37760, 73262, 73266, 73271, 73280, 73287, 73292, 73296, 73301, 73309, + 20543, 73316, 73321, 73325, 6899, 38745, 73329, 73335, 341, 73345, 73352, + 73359, 73365, 73372, 73377, 73386, 15941, 69592, 69602, 73392, 73400, + 73404, 73408, 73412, 73416, 73421, 73425, 73431, 73439, 73444, 73449, + 73456, 73461, 73465, 73470, 73474, 73478, 73484, 73490, 73501, 73507, + 73512, 73516, 73521, 73525, 38869, 73529, 38875, 38881, 73534, 73540, + 73547, 73552, 73556, 37777, 20197, 73559, 73563, 73568, 73575, 73581, + 73585, 73590, 48722, 73596, 73600, 73607, 73611, 73616, 73622, 73628, + 73634, 73646, 73655, 73665, 73671, 73678, 73683, 73688, 73692, 73695, + 73701, 73708, 73713, 73718, 73725, 73732, 73739, 73745, 73750, 73755, + 73763, 38886, 2531, 73768, 73773, 73779, 73784, 73790, 73795, 73800, + 73805, 73811, 38907, 73816, 73822, 73828, 73834, 38977, 73839, 73844, + 73849, 38988, 73854, 73859, 73864, 73870, 73876, 38993, 73881, 73886, + 73891, 39048, 39054, 73896, 73901, 39059, 39081, 34021, 39087, 39091, + 73906, 14258, 73910, 73918, 73924, 73932, 73939, 73945, 73955, 73961, + 73968, 12685, 39105, 73974, 73987, 73996, 74002, 74011, 74017, 74023, + 74030, 28593, 74038, 74045, 74055, 74063, 74066, 39049, 74071, 74078, + 74083, 74087, 74091, 74096, 74100, 4478, 74105, 74110, 74115, 42425, + 42430, 74119, 42444, 74124, 42449, 74129, 74135, 42461, 42467, 42473, + 74140, 74146, 27491, 74157, 74160, 74172, 74180, 39128, 74184, 74193, + 74203, 74212, 39138, 74217, 74224, 74233, 74239, 74247, 74254, 74261, + 6950, 5174, 74266, 39060, 74272, 74275, 74281, 74288, 74293, 74298, + 28497, 74302, 74308, 74314, 74319, 74324, 74328, 74334, 74340, 40511, + 74345, 43649, 45486, 45492, 39169, 39174, 74349, 74353, 74357, 74360, + 74373, 74379, 74383, 74386, 74391, 40893, 74395, 37782, 25884, 74401, + 6879, 6887, 10377, 74404, 74409, 74414, 74419, 74424, 74429, 74434, + 74439, 74444, 74449, 74455, 74460, 74465, 74471, 74476, 74481, 74486, + 74491, 74496, 74501, 74507, 74512, 74518, 74523, 74528, 74533, 74538, + 74543, 74548, 74553, 74558, 74563, 74568, 74574, 74579, 74584, 74589, + 74594, 74599, 74604, 74610, 74615, 74620, 74625, 74630, 74635, 74640, + 74645, 74650, 74655, 74661, 74666, 74671, 74676, 74681, 74687, 74693, + 74698, 74704, 74709, 74714, 74719, 74724, 74729, 1421, 159, 74734, 74738, + 74742, 74746, 30458, 74750, 74754, 74759, 74763, 74768, 74772, 74777, + 74782, 74787, 74792, 74796, 74800, 74805, 74809, 16020, 74814, 74818, + 74825, 74835, 18327, 74844, 74853, 74862, 74866, 74871, 74876, 74880, + 74884, 30238, 3259, 74888, 74894, 21775, 74898, 74907, 74915, 74921, + 74926, 74938, 74950, 74955, 74959, 74964, 74968, 74974, 74980, 74985, + 74995, 75005, 75011, 75019, 75024, 75028, 75034, 75039, 75046, 75052, + 75057, 75064, 75073, 75082, 75090, 75094, 18883, 75097, 75106, 75114, + 75126, 75137, 75148, 75157, 75161, 75170, 75178, 75188, 75196, 75203, + 75213, 75219, 75224, 75232, 75239, 75248, 75254, 75259, 75266, 75272, + 75283, 60, 37559, 75289, 32009, 32019, 75295, 75303, 75310, 75316, 75320, + 75330, 75341, 75349, 75358, 75363, 75368, 75373, 75377, 75381, 75389, + 21722, 75396, 75400, 75406, 75416, 75423, 75430, 75436, 75442, 42524, + 75446, 75448, 75451, 75457, 75461, 75472, 75482, 75488, 75495, 75502, + 15957, 75510, 75516, 75525, 75534, 75540, 11579, 75546, 75552, 75557, + 75562, 75569, 75574, 75581, 75587, 75592, 75600, 75613, 75622, 75631, + 72161, 72171, 75641, 75647, 75656, 75662, 75668, 75675, 75682, 75689, + 75696, 75703, 75708, 75712, 75716, 75719, 75729, 75733, 75745, 75754, + 10038, 75763, 75774, 75779, 75783, 72180, 75789, 75796, 75805, 75813, + 51060, 75821, 75825, 75830, 75835, 75845, 75853, 75865, 75870, 75874, + 75878, 75884, 75892, 75899, 75911, 75919, 75930, 75937, 75943, 75953, + 75959, 75963, 75972, 75981, 75988, 75994, 75999, 76003, 76007, 76011, + 76020, 76029, 76038, 76045, 76051, 76057, 76063, 76068, 76075, 76081, + 76089, 76096, 76102, 15046, 76107, 76113, 76117, 17184, 76121, 76126, + 76136, 76141, 76150, 76156, 76162, 76170, 76177, 76181, 76185, 76192, + 76198, 76206, 76213, 76219, 76230, 76234, 76238, 76242, 76245, 76251, + 76256, 76261, 76265, 76269, 76278, 76286, 76293, 76299, 76306, 29268, + 48863, 76311, 76319, 76323, 76327, 76330, 76338, 76345, 76351, 76360, + 76368, 76374, 76379, 76383, 76388, 76393, 76397, 76401, 76405, 76410, + 76419, 76423, 76430, 45590, 76434, 76440, 76448, 76452, 76458, 76466, + 76472, 76477, 76488, 76496, 76502, 76511, 27638, 76519, 76526, 76533, + 76540, 76547, 76554, 52549, 15772, 76561, 76568, 76573, 42560, 4721, + 76579, 76584, 76589, 76595, 76601, 76607, 76612, 76617, 76622, 76627, + 76633, 76638, 76644, 76649, 76655, 76660, 76665, 76670, 76675, 76680, + 76685, 76690, 76696, 76701, 76707, 76712, 76717, 76722, 76727, 76732, + 76737, 76743, 76748, 76753, 76758, 76763, 76768, 76773, 76778, 76783, + 76788, 76793, 76799, 76804, 76809, 76814, 76819, 76824, 76829, 76834, + 76839, 76845, 76850, 76855, 76860, 76865, 76870, 76875, 76880, 76885, + 76890, 76895, 76900, 76905, 76911, 1883, 305, 76916, 46502, 46507, 76920, + 76925, 9293, 76929, 3628, 76934, 76939, 76943, 76952, 76963, 76980, + 76998, 77006, 75817, 77013, 77016, 77026, 77033, 77042, 77058, 77067, + 77077, 77082, 77095, 77105, 77114, 77122, 77136, 77144, 77153, 77157, + 77160, 77167, 77173, 77184, 77191, 77203, 77214, 77225, 77234, 77241, + 1173, 812, 77251, 2744, 77255, 77260, 77269, 997, 9059, 25320, 77277, + 77285, 77299, 77312, 77316, 77321, 77326, 77331, 77337, 77343, 77348, + 9661, 18370, 77353, 77357, 77361, 77369, 10098, 77374, 77380, 77389, + 77397, 1657, 13314, 1179, 4393, 77401, 77405, 77414, 77424, 2482, 32859, + 77433, 77439, 20450, 32874, 77445, 4558, 13696, 77451, 77458, 71871, + 77462, 77466, 77472, 77477, 77482, 3861, 163, 3887, 77487, 77499, 77503, + 77507, 77513, 77518, 33756, 77522, 13684, 2938, 4, 77527, 77537, 77548, + 77559, 77569, 77575, 77586, 77593, 77599, 77605, 2306, 77610, 77618, + 77625, 77631, 77641, 77651, 77661, 77670, 28580, 1185, 77675, 77679, + 77683, 77689, 77693, 2961, 2967, 9658, 2337, 77697, 77701, 77710, 77718, + 77729, 77737, 77745, 77751, 77756, 77767, 77778, 77786, 77792, 77797, + 11356, 77807, 77815, 77819, 77823, 77828, 77832, 77844, 34219, 18269, + 77851, 77861, 77867, 77873, 7977, 11490, 77883, 77894, 77905, 77915, + 77924, 77928, 77935, 999, 2731, 77945, 77950, 77958, 71587, 77966, 77971, + 77982, 77989, 78003, 16980, 529, 78013, 78020, 78024, 78028, 78036, + 78045, 4433, 78053, 78059, 20495, 78064, 78078, 78085, 78091, 78099, + 78108, 78117, 78124, 78136, 78146, 78154, 78161, 78169, 78176, 4357, 116, + 78184, 78195, 78199, 78211, 78217, 1804, 227, 78222, 10709, 78227, 3006, + 78231, 78238, 78244, 78255, 78265, 78273, 78280, 10049, 78287, 78296, + 78304, 4438, 78317, 4455, 78321, 78326, 78332, 78337, 78342, 78347, 3011, + 573, 78353, 78366, 78370, 78375, 78380, 3016, 1882, 763, 78384, 4459, + 78392, 78398, 78402, 799, 78412, 78421, 78426, 3878, 78430, 78434, 18001, + 18008, 9317, 78442, 4490, 4367, 15644, 78450, 78457, 78462, 28644, 78466, + 78473, 78479, 13952, 78484, 14017, 204, 78489, 78501, 78507, 78515, 3028, + 1699, 78523, 78525, 78530, 78535, 78540, 78546, 78551, 78556, 78561, + 78566, 78571, 78576, 78582, 78587, 78592, 78597, 78602, 78607, 78612, + 78617, 78622, 78628, 78633, 78638, 78643, 78649, 78654, 78660, 78665, + 78670, 78675, 78680, 78685, 78690, 78695, 78701, 78706, 78712, 78717, + 78722, 78727, 78732, 78737, 78742, 78747, 78752, 9730, 9743, 4506, 4511, + 4516, 4521, 26, 78758, 78764, 78769, 78774, 78779, 78785, 78790, 78794, + 78798, 78803, 78809, 78813, 78819, 78824, 78829, 78835, 78840, 78844, + 78849, 78854, 78858, 78861, 78863, 78867, 78870, 78877, 78882, 78886, + 78891, 78895, 78899, 78903, 78909, 78920, 78940, 78959, 78980, 78993, + 79005, 79014, 79018, 79021, 39446, 79024, 39451, 79031, 79036, 39456, + 79045, 79054, 39462, 79059, 39467, 79068, 79073, 13941, 79077, 79082, + 79087, 39472, 79091, 79100, 50719, 79104, 79107, 79111, 9325, 79117, + 79120, 79125, 79130, 79135, 79139, 4179, 39477, 79142, 79146, 79149, + 79160, 79165, 79169, 79175, 79183, 79196, 79200, 79208, 79217, 79223, + 79228, 79234, 79238, 79244, 79250, 79258, 79263, 79267, 79274, 79280, + 79288, 79297, 79305, 39480, 79312, 79322, 79331, 79339, 79350, 79363, + 79368, 79373, 79377, 79386, 79392, 79399, 79412, 79424, 79435, 79447, + 79454, 79463, 79472, 79481, 79488, 79494, 79501, 79509, 79516, 79524, + 79533, 79541, 79548, 79556, 79565, 79573, 79582, 79592, 79601, 79609, + 79616, 79624, 79633, 79641, 79650, 79660, 79669, 79677, 79686, 79696, + 79705, 79715, 79726, 79736, 79745, 79753, 79760, 79768, 79777, 79785, + 79794, 79804, 79813, 79821, 79830, 79840, 79849, 79859, 79870, 79880, + 79889, 79897, 79906, 79916, 79925, 79935, 79946, 79956, 79965, 79975, + 79986, 79996, 80007, 80019, 80030, 80040, 80049, 80057, 80064, 80072, + 80081, 80089, 80098, 80108, 80117, 80125, 80134, 80144, 80153, 80163, + 80174, 80184, 80193, 80201, 80210, 80220, 80229, 80239, 80250, 80260, + 80269, 80279, 80290, 80300, 80311, 80323, 80334, 80344, 80353, 80361, + 80370, 80380, 80389, 80399, 80410, 80420, 80429, 80439, 80450, 80460, + 80471, 80483, 80494, 80504, 80513, 80523, 80534, 80544, 80555, 80567, + 80578, 80588, 80599, 80611, 80622, 80634, 80647, 80659, 80670, 80680, + 80689, 80697, 80704, 80712, 80721, 80729, 80738, 80748, 80757, 80765, + 80774, 80784, 80793, 80803, 80814, 80824, 80833, 80841, 80850, 80860, + 80869, 80879, 80890, 80900, 80909, 80919, 80930, 80940, 80951, 80963, + 80974, 80984, 80993, 81001, 81010, 81020, 81029, 81039, 81050, 81060, + 81069, 81079, 81090, 81100, 81111, 81123, 81134, 81144, 81153, 81163, + 81174, 81184, 81195, 81207, 81218, 81228, 81239, 81251, 81262, 81274, + 81287, 81299, 81310, 81320, 81329, 81337, 81346, 81356, 81365, 81375, + 81386, 81396, 81405, 81415, 81426, 81436, 81447, 81459, 81470, 81480, + 81489, 81499, 81510, 81520, 81531, 81543, 81554, 81564, 81575, 81587, + 81598, 81610, 81623, 81635, 81646, 81656, 81665, 81675, 81686, 81696, + 81707, 81719, 81730, 81740, 81751, 81763, 81774, 81786, 81799, 81811, + 81822, 81832, 81843, 81855, 81866, 81878, 81891, 81903, 81914, 81926, + 81939, 81951, 81964, 81978, 81991, 82003, 82014, 82024, 82033, 82041, + 82048, 82053, 9090, 82060, 82065, 39490, 82071, 82076, 39495, 82082, + 82089, 25442, 31457, 82094, 82100, 82106, 82114, 82120, 82126, 82133, + 82140, 82145, 82150, 82154, 82159, 82163, 82166, 82170, 82175, 82184, + 82193, 82201, 82207, 82219, 82230, 82234, 3321, 9065, 82239, 82242, + 82245, 82247, 82251, 82255, 82259, 82265, 82270, 31520, 82275, 82279, + 82282, 82287, 82291, 82298, 82304, 82308, 7060, 82312, 82317, 39517, + 82321, 82328, 82337, 82345, 82351, 82362, 82370, 82379, 82387, 82394, + 82401, 82407, 82412, 82423, 39522, 82428, 82439, 82451, 82459, 82470, + 82479, 82487, 82498, 82503, 82511, 2696, 82516, 82525, 41914, 82538, + 82542, 82554, 82562, 82567, 82575, 82586, 21940, 82595, 82601, 82608, + 82616, 82622, 39532, 82627, 4484, 68943, 82634, 82637, 82645, 82658, + 82671, 82684, 82697, 82704, 82715, 82724, 82729, 52366, 52371, 82733, + 82737, 82745, 82752, 82761, 82769, 82775, 82784, 82792, 82799, 82807, + 82811, 82820, 82829, 82839, 82852, 82865, 82875, 39537, 82881, 82888, + 82894, 82900, 39543, 82905, 82908, 82912, 82920, 82929, 52137, 82937, + 82946, 82954, 82961, 82969, 82979, 82988, 82997, 41066, 83006, 83017, + 83032, 83042, 10747, 26258, 83051, 83056, 83061, 83065, 19559, 83070, + 83075, 83081, 83086, 83091, 83097, 83102, 83107, 26218, 83112, 83119, + 83127, 83135, 83143, 83148, 83155, 83162, 83167, 1717, 83171, 83175, + 83183, 83191, 39560, 83197, 83203, 83215, 83221, 83228, 83232, 83239, + 83244, 83251, 83257, 83264, 83275, 83285, 83295, 83307, 83313, 83321, + 83330, 83336, 83346, 83356, 39587, 83365, 83374, 83380, 83392, 83403, + 83410, 83415, 83419, 83427, 83438, 83444, 83449, 83454, 83461, 83469, + 83481, 83491, 83500, 83509, 83517, 83524, 41728, 29029, 83530, 83535, + 83539, 83543, 83548, 83556, 83562, 83573, 83586, 83591, 83598, 39592, + 83603, 83615, 83624, 83632, 83642, 83653, 83666, 83673, 83682, 83691, + 83699, 83704, 83710, 83714, 1410, 83719, 83724, 83729, 83734, 83740, + 83745, 83750, 83756, 83762, 83767, 83771, 83776, 83781, 83786, 69527, + 83791, 83796, 83801, 83806, 83812, 83818, 83823, 83827, 83832, 19558, + 83837, 83843, 83848, 83854, 83859, 83864, 83869, 83874, 83878, 83884, + 83889, 83898, 83903, 83908, 83913, 83918, 83922, 83929, 83935, 4836, + 20812, 3286, 83940, 83944, 83949, 83953, 83957, 83961, 56166, 83965, + 83890, 83967, 83977, 39601, 83980, 83985, 83994, 84000, 7019, 39606, + 84004, 84010, 84015, 84021, 84026, 84030, 84037, 84042, 84052, 84061, + 84065, 84071, 84077, 84083, 84087, 84095, 84102, 84110, 84118, 39611, + 84125, 84128, 84139, 84146, 84152, 84157, 84161, 84167, 84175, 84182, + 84187, 84191, 84200, 84208, 84214, 84219, 84226, 84234, 39616, 84241, + 28470, 84253, 84259, 84264, 84270, 84277, 84283, 25906, 33367, 84289, + 84294, 84300, 84304, 84316, 83923, 83930, 26150, 84326, 84331, 84338, + 84344, 84351, 84357, 84368, 84373, 84381, 10447, 84386, 84389, 84395, + 84399, 84403, 84406, 84412, 84418, 39305, 4837, 1425, 16069, 84425, + 84431, 84437, 84443, 84449, 84455, 84461, 84467, 84473, 84478, 84483, + 84488, 84493, 84498, 84503, 84508, 84513, 84518, 84523, 84528, 84533, + 84538, 84544, 84549, 84554, 84560, 84565, 84570, 84576, 84582, 84588, + 84594, 84600, 84606, 84612, 84618, 84624, 84629, 84634, 84640, 84645, + 84650, 84656, 84661, 84666, 84671, 84676, 84681, 84686, 84691, 84696, + 84701, 84706, 84711, 84716, 84722, 84727, 84732, 84737, 84743, 84748, + 84753, 84758, 84763, 84769, 84774, 84779, 84784, 84789, 84794, 84799, + 84804, 84809, 84814, 84819, 84824, 84829, 84834, 84839, 84844, 84849, + 84854, 84859, 84864, 84870, 84875, 84880, 84885, 84890, 84895, 84900, + 84905, 1065, 148, 84910, 84914, 84918, 84923, 84931, 84935, 84947, 84954, + 84962, 84966, 84979, 84987, 84992, 84997, 32072, 85001, 85006, 85010, + 85015, 85019, 85027, 85031, 25450, 85036, 85040, 72424, 85044, 85047, + 85055, 85063, 85071, 85076, 85081, 85088, 85095, 85101, 85107, 85112, + 85119, 85124, 85132, 77304, 85139, 85144, 72190, 85151, 85157, 85162, + 85166, 85173, 85179, 85186, 72217, 14031, 85194, 85199, 85204, 85208, + 85211, 85222, 85231, 85237, 85242, 85246, 85256, 85265, 50510, 85269, + 85273, 85280, 85293, 85299, 85307, 85314, 85323, 85334, 85345, 85356, + 85367, 85376, 85382, 85391, 85399, 85409, 85422, 85430, 85437, 85448, + 85457, 85463, 85468, 85473, 85479, 85489, 85495, 85505, 85513, 85520, + 85530, 85539, 83605, 85547, 85553, 85561, 85567, 75857, 85574, 85579, + 85582, 85586, 85592, 85596, 85599, 85607, 85613, 85619, 85627, 85639, + 85651, 85658, 85663, 85667, 85678, 85686, 85693, 85705, 85713, 85720, + 85728, 85735, 85741, 85746, 85752, 85762, 85771, 85779, 85784, 85794, + 85803, 51398, 85810, 85814, 85819, 85827, 85834, 85840, 85844, 85854, + 85865, 85873, 85880, 85892, 85904, 85913, 82528, 85920, 85930, 85942, + 85953, 85967, 85975, 85985, 85992, 86000, 86013, 86025, 86034, 86042, + 86052, 86063, 86075, 86084, 86094, 86104, 86114, 86123, 86130, 86139, + 86154, 86162, 86172, 86181, 86189, 86202, 68913, 86217, 86227, 86236, + 86248, 86258, 86270, 86281, 86295, 86309, 86323, 86337, 86351, 86365, + 86379, 86393, 86407, 86421, 86435, 86449, 86463, 86477, 86491, 86505, + 86519, 86533, 86547, 86561, 86575, 86589, 86603, 86617, 86631, 86645, + 86659, 86673, 86687, 86701, 86715, 86729, 86743, 86757, 86771, 86785, + 86799, 86813, 86827, 86841, 86855, 86869, 86883, 86897, 86911, 86925, + 86939, 86953, 86967, 86981, 86995, 87009, 87023, 87037, 87051, 87065, + 87079, 87093, 87107, 87121, 87135, 87149, 87163, 87177, 87191, 87205, + 87219, 87233, 87247, 87261, 87275, 87289, 87303, 87317, 87331, 87345, + 87359, 87373, 87387, 87401, 87415, 87429, 87443, 87457, 87471, 87485, + 87499, 87513, 87527, 87541, 87555, 87569, 87583, 87597, 87611, 87625, + 87639, 87653, 87667, 87681, 87695, 87709, 87723, 87737, 87751, 87765, + 87779, 87793, 87807, 87821, 87835, 87849, 87863, 87877, 87891, 87905, + 87919, 87933, 87947, 87961, 87975, 87989, 88003, 88017, 88031, 88045, + 88059, 88073, 88087, 88101, 88115, 88129, 88143, 88157, 88171, 88185, + 88199, 88213, 88227, 88241, 88255, 88269, 88283, 88297, 88311, 88325, + 88339, 88353, 88367, 88381, 88395, 88409, 88423, 88437, 88451, 88465, + 88479, 88493, 88507, 88521, 88535, 88549, 88563, 88577, 88591, 88605, + 88619, 88633, 88647, 88661, 88675, 88689, 88703, 88717, 88731, 88745, + 88759, 88773, 88787, 88801, 88815, 88829, 88843, 88857, 88871, 88885, + 88899, 88913, 88927, 88941, 88955, 88969, 88983, 88997, 89011, 89025, + 89039, 89053, 89067, 89081, 89095, 89109, 89123, 89137, 89151, 89165, + 89179, 89193, 89207, 89221, 89235, 89249, 89263, 89277, 89291, 89305, + 89319, 89333, 89347, 89361, 89375, 89389, 89403, 89417, 89431, 89445, + 89459, 89473, 89487, 89501, 89515, 89529, 89543, 89557, 89571, 89585, + 89599, 89613, 89627, 89641, 89655, 89669, 89683, 89697, 89711, 89725, + 89739, 89753, 89767, 89781, 89795, 89809, 89823, 89837, 89851, 89865, + 89879, 89893, 89907, 89921, 89935, 89949, 89963, 89977, 89991, 90005, + 90019, 90033, 90047, 90061, 90075, 90089, 90103, 90117, 90131, 90145, + 90159, 90173, 90187, 90201, 90215, 90229, 90243, 90257, 90271, 90285, + 90299, 90313, 90327, 90341, 90355, 90369, 90383, 90397, 90411, 90425, + 90439, 90453, 90467, 90481, 90495, 90509, 90523, 90537, 90551, 90565, + 90579, 90593, 90607, 90621, 90635, 90649, 90663, 90677, 90691, 90705, + 90719, 90733, 90747, 90761, 90775, 90789, 90803, 90817, 90831, 90845, + 90859, 90873, 90887, 90901, 90915, 90929, 90943, 90957, 90971, 90985, + 90999, 91013, 91027, 91041, 91055, 91069, 91083, 91097, 91111, 91125, + 91139, 91153, 91167, 91181, 91195, 91209, 91223, 91237, 91251, 91265, + 91279, 91293, 91307, 91321, 91335, 91349, 91363, 91377, 91391, 91405, + 91419, 91433, 91447, 91461, 91475, 91489, 91503, 91517, 91531, 91545, + 91559, 91573, 91587, 91601, 91615, 91629, 91643, 91657, 91671, 91685, + 91699, 91713, 91727, 91741, 91755, 91769, 91783, 91797, 91811, 91825, + 91839, 91853, 91867, 91881, 91895, 91909, 91923, 91937, 91951, 91965, + 91979, 91993, 92007, 92021, 92035, 92049, 92063, 92077, 92091, 92105, + 92119, 92133, 92147, 92161, 92175, 92189, 92203, 92217, 92231, 92245, + 92259, 92273, 92287, 92301, 92315, 92329, 92343, 92357, 92371, 92385, + 92399, 92413, 92427, 92441, 92455, 92469, 92483, 92497, 92511, 92525, + 92539, 92553, 92567, 92581, 92595, 92609, 92623, 92637, 92651, 92665, + 92679, 92693, 92707, 92721, 92735, 92749, 92763, 92777, 92791, 92805, + 92819, 92833, 92847, 92861, 92875, 92889, 92903, 92917, 92931, 92945, + 92959, 92973, 92987, 93001, 93015, 93029, 93043, 93057, 93071, 93085, + 93099, 93113, 93127, 93141, 93155, 93169, 93183, 93197, 93211, 93225, + 93239, 93253, 93267, 93281, 93295, 93309, 93323, 93337, 93351, 93365, + 93379, 93393, 93407, 93421, 93435, 93449, 93463, 93477, 93491, 93505, + 93519, 93533, 93547, 93561, 93575, 93589, 93603, 93617, 93631, 93645, + 93659, 93673, 93687, 93701, 93715, 93729, 93743, 93757, 93771, 93785, + 93799, 93813, 93827, 93841, 93855, 93869, 93883, 93897, 93911, 93925, + 93939, 93953, 93967, 93981, 93995, 94009, 94023, 94037, 94051, 94065, + 94079, 94093, 94107, 94121, 94135, 94149, 94163, 94177, 94191, 94205, + 94219, 94233, 94247, 94261, 94275, 94289, 94303, 94317, 94331, 94345, + 94359, 94373, 94387, 94401, 94415, 94429, 94443, 94457, 94471, 94485, + 94499, 94513, 94527, 94541, 94555, 94569, 94583, 94597, 94611, 94625, + 94639, 94653, 94667, 94681, 94695, 94709, 94723, 94737, 94751, 94765, + 94779, 94793, 94807, 94821, 94835, 94849, 94863, 94877, 94891, 94905, + 94919, 94933, 94947, 94961, 94975, 94989, 95003, 95017, 95031, 95045, + 95059, 95073, 95087, 95101, 95115, 95129, 95143, 95157, 95171, 95185, + 95199, 95213, 95227, 95241, 95255, 95269, 95283, 95297, 95311, 95325, + 95339, 95353, 95367, 95381, 95395, 95409, 95423, 95437, 95451, 95465, + 95479, 95493, 95507, 95521, 95535, 95549, 95563, 95577, 95591, 95605, + 95619, 95633, 95647, 95661, 95675, 95689, 95703, 95717, 95731, 95745, + 95759, 95773, 95787, 95801, 95815, 95829, 95843, 95857, 95871, 95885, + 95899, 95913, 95927, 95941, 95955, 95969, 95983, 95997, 96011, 96025, + 96039, 96053, 96067, 96081, 96095, 96109, 96123, 96137, 96151, 96165, + 96179, 96193, 96207, 96221, 96235, 96249, 96263, 96277, 96291, 96305, + 96319, 96333, 96347, 96361, 96375, 96389, 96403, 96417, 96431, 96445, + 96459, 96473, 96487, 96501, 96515, 96529, 96543, 96557, 96571, 96585, + 96599, 96613, 96627, 96641, 96655, 96669, 96683, 96697, 96711, 96725, + 96739, 96753, 96767, 96781, 96795, 96809, 96823, 96837, 96851, 96865, + 96879, 96893, 96907, 96921, 96935, 96949, 96963, 96977, 96991, 97005, + 97019, 97033, 97042, 97053, 97064, 97074, 97085, 97093, 97101, 97107, + 97117, 97125, 97131, 35391, 97136, 97142, 97151, 97163, 97168, 97175, + 11370, 21960, 97181, 97190, 97195, 97199, 97204, 97211, 97217, 97222, + 97227, 97235, 97243, 97253, 97258, 97266, 14513, 97270, 97276, 97282, + 97288, 97294, 97300, 97306, 97312, 97318, 97324, 97330, 97336, 97342, + 97348, 97354, 97360, 97366, 97372, 97378, 97384, 97390, 97396, 97402, + 97408, 97414, 97420, 97426, 97432, 97438, 97444, 97450, 97456, 97462, + 97468, 97474, 97480, 97486, 97493, 97499, 97505, 97511, 97517, 97523, + 97529, 97535, 97541, 97547, 97553, 97559, 97565, 97571, 97577, 97583, + 97589, 97595, 97601, 97607, 97613, 97619, 97625, 97631, 97637, 97643, + 97649, 97655, 97661, 97667, 97673, 97679, 97685, 97691, 97697, 97703, + 97709, 97715, 97721, 97727, 97733, 97739, 97745, 97751, 97757, 97763, + 97769, 97775, 97781, 97787, 97793, 97800, 97806, 97812, 97818, 97824, + 97830, 97836, 97842, 97848, 97854, 97860, 97866, 97869, 97871, 97886, + 97899, 97906, 97912, 97923, 97928, 97932, 97937, 97944, 97950, 97955, + 97963, 77907, 77917, 97969, 97976, 97986, 12672, 97993, 97998, 35639, + 98007, 98012, 98019, 98029, 98037, 98045, 98054, 98063, 98069, 98075, + 98080, 98087, 98094, 98099, 98103, 98111, 72234, 98116, 98125, 98133, + 98140, 98145, 98149, 98158, 98164, 98167, 98171, 98180, 98190, 84974, + 98199, 98203, 98211, 98215, 98221, 98232, 98242, 21969, 98253, 98262, + 98270, 98278, 98285, 72253, 9895, 98293, 98297, 98306, 98313, 98316, + 98320, 33238, 98323, 98327, 98332, 98349, 98361, 12630, 98373, 98378, + 98383, 98388, 25557, 98392, 98397, 98402, 98408, 98413, 6640, 98418, + 25561, 98423, 98428, 98434, 98441, 98446, 98451, 98457, 98463, 98469, + 98474, 98480, 98484, 98498, 98506, 98514, 98520, 98525, 98532, 98542, + 98551, 98556, 98561, 98566, 98574, 98584, 98595, 98600, 98606, 98611, + 98620, 70662, 4760, 98625, 98643, 98662, 98675, 98689, 98705, 98712, + 98719, 98728, 98735, 98741, 98748, 98753, 98759, 98764, 98770, 98778, + 98784, 98789, 98794, 98810, 12643, 98824, 98831, 98839, 98845, 98849, + 98852, 98858, 98863, 98868, 98876, 98883, 98888, 98897, 98903, 98908, + 98914, 98920, 98929, 98938, 43485, 98943, 98954, 98961, 98969, 98978, + 14104, 98987, 98993, 99001, 99007, 99013, 99019, 99024, 99031, 99037, + 14115, 99042, 99045, 99050, 39643, 99060, 99069, 99074, 99082, 99089, + 99095, 99100, 99108, 99115, 99126, 99142, 99158, 99174, 99190, 99206, + 99222, 99238, 99254, 99270, 99286, 99302, 99318, 99334, 99350, 99366, + 99382, 99398, 99414, 99430, 99446, 99462, 99478, 99494, 99510, 99526, + 99542, 99558, 99574, 99590, 99606, 99622, 99638, 99654, 99670, 99686, + 99702, 99718, 99734, 99750, 99766, 99782, 99798, 99814, 99830, 99846, + 99862, 99878, 99894, 99910, 99926, 99942, 99958, 99974, 99990, 100006, + 100022, 100038, 100054, 100070, 100086, 100102, 100118, 100134, 100150, + 100166, 100182, 100198, 100214, 100230, 100246, 100262, 100278, 100294, + 100310, 100326, 100342, 100358, 100374, 100390, 100406, 100422, 100438, + 100454, 100470, 100486, 100502, 100518, 100534, 100550, 100566, 100582, + 100598, 100614, 100630, 100646, 100662, 100678, 100694, 100710, 100726, + 100742, 100758, 100774, 100790, 100806, 100822, 100838, 100854, 100870, + 100886, 100902, 100918, 100934, 100950, 100966, 100982, 100998, 101014, + 101030, 101046, 101062, 101078, 101094, 101110, 101126, 101142, 101158, + 101174, 101190, 101206, 101222, 101238, 101254, 101270, 101286, 101302, + 101318, 101334, 101350, 101366, 101382, 101398, 101414, 101430, 101446, + 101462, 101478, 101494, 101510, 101526, 101542, 101558, 101574, 101590, + 101606, 101622, 101638, 101654, 101670, 101686, 101702, 101718, 101734, + 101750, 101766, 101782, 101798, 101814, 101830, 101846, 101862, 101878, + 101894, 101910, 101926, 101942, 101958, 101974, 101990, 102006, 102022, + 102038, 102054, 102070, 102086, 102102, 102118, 102134, 102150, 102166, + 102182, 102198, 102214, 102230, 102246, 102262, 102278, 102294, 102310, + 102326, 102342, 102358, 102374, 102390, 102406, 102422, 102438, 102454, + 102470, 102486, 102502, 102518, 102534, 102550, 102566, 102582, 102598, + 102614, 102630, 102646, 102662, 102678, 102694, 102710, 102726, 102742, + 102758, 102774, 102790, 102806, 102822, 102838, 102854, 102870, 102886, + 102902, 102918, 102934, 102950, 102966, 102982, 102998, 103014, 103030, + 103046, 103062, 103078, 103094, 103110, 103126, 103142, 103158, 103174, + 103190, 103206, 103222, 103238, 103254, 103270, 103286, 103302, 103318, + 103334, 103350, 103366, 103382, 103398, 103414, 103430, 103446, 103462, + 103478, 103494, 103510, 103526, 103542, 103558, 103574, 103590, 103606, + 103622, 103638, 103654, 103670, 103686, 103702, 103718, 103734, 103750, + 103766, 103782, 103798, 103814, 103830, 103846, 103862, 103878, 103894, + 103910, 103926, 103942, 103958, 103974, 103990, 104006, 104022, 104038, + 104054, 104070, 104086, 104102, 104118, 104134, 104150, 104166, 104182, + 104198, 104214, 104230, 104246, 104262, 104278, 104294, 104310, 104326, + 104342, 104358, 104374, 104390, 104406, 104422, 104438, 104454, 104470, + 104486, 104502, 104518, 104534, 104550, 104566, 104582, 104598, 104614, + 104630, 104646, 104662, 104678, 104694, 104710, 104726, 104742, 104758, + 104774, 104790, 104806, 104822, 104838, 104854, 104870, 104886, 104902, + 104918, 104934, 104950, 104966, 104982, 104998, 105014, 105030, 105046, + 105062, 105078, 105094, 105110, 105126, 105142, 105158, 105174, 105190, + 105206, 105222, 105238, 105254, 105270, 105286, 105302, 105318, 105334, + 105350, 105366, 105382, 105398, 105414, 105430, 105446, 105462, 105478, + 105494, 105510, 105526, 105542, 105558, 105574, 105590, 105606, 105622, + 105638, 105654, 105670, 105686, 105702, 105718, 105734, 105750, 105766, + 105782, 105798, 105814, 105830, 105846, 105862, 105878, 105894, 105910, + 105926, 105942, 105958, 105974, 105990, 106006, 106022, 106038, 106054, + 106070, 106086, 106102, 106118, 106134, 106150, 106166, 106182, 106198, + 106214, 106230, 106246, 106262, 106278, 106294, 106310, 106326, 106342, + 106358, 106374, 106390, 106406, 106422, 106438, 106454, 106470, 106486, + 106502, 106518, 106534, 106550, 106566, 106582, 106598, 106614, 106630, + 106646, 106662, 106678, 106694, 106710, 106726, 106742, 106758, 106774, + 106790, 106806, 106822, 106838, 106854, 106870, 106886, 106902, 106918, + 106934, 106950, 106966, 106982, 106998, 107014, 107030, 107046, 107062, + 107078, 107094, 107110, 107126, 107142, 107158, 107174, 107190, 107206, + 107222, 107238, 107254, 107270, 107286, 107302, 107318, 107334, 107350, + 107366, 107382, 107398, 107414, 107430, 107446, 107462, 107478, 107494, + 107510, 107526, 107542, 107558, 107574, 107590, 107606, 107622, 107638, + 107654, 107670, 107686, 107702, 107718, 107734, 107750, 107766, 107782, + 107798, 107814, 107830, 107846, 107862, 107878, 107894, 107910, 107926, + 107942, 107958, 107974, 107990, 108006, 108022, 108038, 108054, 108070, + 108086, 108102, 108118, 108134, 108150, 108166, 108182, 108198, 108214, + 108230, 108246, 108262, 108278, 108294, 108310, 108326, 108342, 108358, + 108374, 108390, 108406, 108422, 108438, 108454, 108470, 108486, 108502, + 108518, 108534, 108550, 108566, 108582, 108598, 108614, 108630, 108646, + 108662, 108678, 108694, 108710, 108726, 108742, 108758, 108774, 108790, + 108806, 108822, 108838, 108854, 108870, 108886, 108902, 108918, 108934, + 108950, 108966, 108982, 108998, 109014, 109030, 109046, 109062, 109078, + 109094, 109110, 109126, 109142, 109158, 109174, 109190, 109206, 109222, + 109238, 109254, 109270, 109286, 109302, 109318, 109334, 109350, 109366, + 109382, 109398, 109414, 109430, 109446, 109462, 109478, 109494, 109510, + 109526, 109542, 109558, 109574, 109590, 109606, 109622, 109638, 109654, + 109670, 109686, 109702, 109718, 109734, 109750, 109766, 109782, 109798, + 109814, 109830, 109846, 109862, 109878, 109894, 109910, 109926, 109942, + 109958, 109974, 109990, 110006, 110022, 110038, 110054, 110070, 110086, + 110102, 110118, 110134, 110150, 110166, 110182, 110198, 110214, 110230, + 110246, 110262, 110278, 110294, 110310, 110326, 110342, 110358, 110374, + 110390, 110406, 110422, 110438, 110454, 110470, 110486, 110502, 110518, + 110534, 110550, 110566, 110582, 110598, 110614, 110630, 110646, 110662, + 110678, 110694, 110710, 110726, 110742, 110758, 110774, 110790, 110806, + 110822, 110838, 110854, 110870, 110886, 110902, 110918, 110934, 110950, + 110966, 110982, 110998, 111014, 111030, 111046, 111062, 111078, 111094, + 111110, 111126, 111142, 111158, 111174, 111190, 111206, 111222, 111238, + 111254, 111270, 111286, 111302, 111318, 111334, 111350, 111366, 111382, + 111398, 111414, 111430, 111446, 111462, 111478, 111494, 111510, 111526, + 111542, 111558, 111574, 111590, 111606, 111622, 111638, 111654, 111670, + 111686, 111702, 111718, 111734, 111750, 111766, 111782, 111798, 111814, + 111830, 111846, 111862, 111878, 111894, 111910, 111926, 111942, 111958, + 111974, 111990, 112006, 112022, 112038, 112054, 112070, 112086, 112102, + 112118, 112134, 112150, 112166, 112182, 112198, 112214, 112230, 112246, + 112262, 112278, 112294, 112310, 112326, 112342, 112358, 112374, 112390, + 112406, 112422, 112438, 112454, 112470, 112486, 112502, 112518, 112534, + 112550, 112566, 112582, 112598, 112614, 112630, 112646, 112662, 112678, + 112694, 112710, 112726, 112742, 112758, 112774, 112790, 112806, 112822, + 112838, 112854, 112870, 112886, 112902, 112918, 112934, 112950, 112966, + 112982, 112992, 113001, 113006, 113014, 77227, 113019, 113025, 113030, + 113037, 113046, 113054, 113058, 4338, 113064, 113071, 113077, 113081, + 20561, 46618, 3295, 113086, 113090, 113094, 113101, 113107, 113116, + 113122, 113129, 113133, 113154, 113176, 113192, 113209, 113228, 113237, + 113247, 113255, 113262, 113269, 113275, 33093, 113289, 113293, 113299, + 113307, 113319, 113325, 113333, 113340, 113345, 113350, 113354, 113362, + 113369, 113373, 113379, 113385, 113390, 3972, 52566, 113396, 113400, + 113404, 113408, 113413, 113418, 113423, 113429, 113435, 113441, 113448, + 113454, 113461, 113467, 113473, 113478, 113484, 113489, 113493, 105586, + 113498, 105650, 52581, 113503, 113508, 113516, 113520, 113525, 113532, + 113541, 113548, 113554, 113563, 113567, 113574, 113578, 113581, 113588, + 113594, 113603, 113613, 113623, 113628, 113632, 113639, 113647, 113656, + 113660, 113668, 113674, 113679, 113684, 113690, 113696, 113701, 113705, + 31970, 113711, 113715, 113719, 113722, 113727, 113735, 113745, 113751, + 113756, 113766, 49687, 113774, 113786, 113792, 113799, 113805, 113809, + 113814, 113820, 113832, 113843, 113850, 113856, 113863, 113870, 113882, + 113889, 113895, 25641, 113899, 113907, 113913, 113920, 113926, 113932, + 113938, 113943, 113948, 113953, 113957, 113966, 113974, 113985, 7934, + 113990, 19997, 113996, 114000, 114004, 114008, 114016, 114025, 114029, + 114036, 114045, 114053, 114066, 114072, 106162, 36574, 114077, 114079, + 114084, 114089, 114094, 114099, 114104, 114109, 114114, 114119, 114124, + 114129, 114134, 114139, 114144, 114149, 114155, 114160, 114165, 114170, + 114175, 114180, 114185, 114190, 114195, 114201, 114207, 114213, 114218, + 114223, 114235, 114240, 1935, 54, 114245, 114250, 39653, 114254, 39658, + 39663, 39669, 39674, 114258, 39679, 26827, 114280, 114284, 114288, + 114293, 114297, 39683, 114301, 114309, 114316, 114322, 114332, 39688, + 114339, 114342, 114347, 114351, 114360, 11168, 114368, 39693, 26671, + 114371, 114375, 114383, 1307, 114388, 39704, 114391, 114396, 114401, + 31211, 31221, 43083, 114406, 114411, 114416, 114421, 114427, 114432, + 114441, 114446, 114455, 114463, 114470, 114476, 114481, 114486, 114491, + 114501, 114510, 114518, 114523, 114531, 114535, 114543, 114547, 114554, + 114561, 114569, 114576, 39508, 46333, 114582, 114588, 114593, 114598, + 14548, 11961, 114603, 114608, 114613, 114619, 114626, 114632, 114641, + 114646, 114654, 114664, 114671, 114681, 114687, 114692, 114698, 114702, + 21991, 114709, 44068, 114722, 114727, 114734, 114740, 114755, 37638, + 75635, 114768, 114772, 114781, 114790, 114797, 114803, 114811, 114817, + 114825, 114834, 114842, 114849, 46453, 114855, 114858, 114862, 114866, + 114870, 11982, 114876, 114883, 114889, 114897, 114902, 114906, 29203, + 114912, 114915, 114923, 114930, 114938, 114951, 114965, 114972, 114978, + 114985, 114991, 39718, 114995, 115001, 115009, 115016, 115024, 115032, + 115038, 39723, 115046, 115052, 115057, 115067, 115073, 115082, 37433, + 42431, 115090, 115095, 115100, 115104, 115109, 115113, 115121, 115126, + 17993, 18818, 49709, 115130, 115135, 39728, 18150, 115139, 115151, + 115156, 115160, 115167, 115176, 115180, 115188, 115194, 115199, 115207, + 115215, 115223, 115231, 115239, 115247, 115258, 115264, 9132, 115269, + 115275, 115280, 115285, 115296, 115305, 115317, 115332, 40040, 115338, + 20116, 39732, 115342, 115349, 115355, 115359, 29340, 115366, 115372, + 115379, 48834, 115388, 115394, 115403, 115409, 115414, 115422, 115428, + 115433, 39742, 115438, 115447, 115456, 113838, 115465, 115472, 115478, + 115484, 115493, 115503, 115509, 115517, 115524, 115528, 39747, 115531, + 39753, 1346, 115536, 115544, 115552, 115562, 115571, 115579, 115586, + 115596, 39764, 115600, 115602, 115606, 115611, 115615, 115619, 115625, + 115630, 115634, 115645, 115650, 115656, 115661, 115670, 115675, 3300, + 115679, 115686, 115690, 115699, 115707, 115715, 115722, 115727, 115732, + 74136, 115736, 115739, 115745, 115753, 115759, 115763, 115768, 115775, + 115780, 115785, 115789, 115796, 115802, 115807, 42462, 115811, 115814, + 115819, 115823, 115828, 115835, 115840, 115844, 47803, 115852, 31230, + 31239, 115858, 115864, 115870, 115875, 115879, 115882, 115892, 115901, + 115906, 115912, 115919, 115925, 115929, 115937, 115942, 42468, 85233, + 115946, 115954, 115961, 115967, 115974, 115979, 115986, 115991, 115995, + 116001, 116006, 69129, 116012, 116018, 10386, 116023, 116028, 116032, + 116037, 116042, 116047, 116051, 116056, 116061, 116067, 116072, 116077, + 116083, 116089, 116094, 116098, 116103, 116108, 116113, 116117, 29339, + 116122, 116127, 116133, 116139, 116145, 116150, 116154, 116159, 116164, + 109938, 116169, 116174, 116179, 116184, 110002, 52836, 116189, 39772, + 116197, 116201, 116209, 116217, 116228, 116233, 116237, 27306, 82631, + 116242, 116248, 116253, 4649, 116263, 116270, 116275, 116283, 116292, + 116297, 116301, 116306, 116310, 116318, 116326, 116333, 77493, 116339, + 116347, 116354, 116365, 116371, 116377, 39782, 116380, 116387, 116395, + 116400, 116404, 33612, 71815, 116410, 116415, 116422, 116427, 10275, + 116431, 116439, 116446, 116453, 116462, 116469, 116475, 116489, 116497, + 6724, 116259, 116503, 116508, 116514, 116518, 116521, 116529, 116536, + 116541, 116554, 116561, 116567, 116571, 116579, 116584, 116591, 116597, + 116602, 72093, 116607, 116610, 116619, 116626, 110210, 116632, 116635, + 116643, 116649, 116658, 116668, 116678, 116687, 116698, 116706, 116717, + 116722, 116726, 116731, 116735, 43214, 116743, 18783, 43223, 116748, + 101729, 101745, 101761, 101777, 101793, 116753, 101825, 101841, 101857, + 101873, 101985, 102001, 116757, 102033, 102049, 116761, 116765, 116769, + 116773, 102289, 102321, 116777, 102353, 116781, 116785, 102497, 102513, + 102529, 102545, 116789, 102609, 102625, 116793, 102753, 102769, 102785, + 102801, 102817, 102833, 102849, 102865, 102881, 102897, 103009, 103025, + 103041, 103057, 103073, 103089, 103105, 103121, 103137, 103153, 116797, + 104945, 105057, 105121, 105137, 105153, 105169, 105185, 105201, 105313, + 105329, 105345, 116801, 105393, 116805, 105425, 105441, 105457, 116809, + 116814, 116819, 116824, 116829, 116834, 116839, 116843, 116847, 116852, + 116857, 116861, 116866, 116871, 116875, 116880, 116885, 116890, 116895, + 116899, 116904, 116909, 116913, 116918, 116922, 116926, 116930, 116934, + 116939, 116943, 116947, 116951, 116955, 116959, 116963, 116967, 116971, + 116975, 116980, 116985, 116990, 116995, 117000, 117005, 117010, 117015, + 117020, 117025, 117029, 117033, 117037, 117041, 117045, 117049, 117054, + 117058, 117063, 117067, 117072, 117077, 117081, 117085, 117090, 117094, + 117098, 117102, 117106, 117110, 117114, 117118, 117122, 117126, 117130, + 117134, 117138, 117142, 117146, 117151, 117156, 117160, 117164, 117168, + 117172, 117176, 117180, 117185, 117189, 117193, 117197, 117201, 117205, + 117209, 117214, 117218, 117223, 117227, 117231, 117235, 117239, 117243, + 117247, 117251, 117255, 117259, 117263, 117267, 117272, 117276, 117280, + 117284, 117288, 117292, 117296, 117300, 117304, 117308, 117312, 117316, + 117321, 117325, 117329, 117334, 117339, 117343, 117347, 117351, 117355, + 117359, 117363, 117367, 117371, 117376, 117380, 117385, 117389, 117394, + 117398, 117403, 117407, 117413, 117418, 117422, 117427, 117431, 117436, + 117440, 117445, 117449, 117454, 1429, 117458, 117462, 3042, 1705, 28465, + 1602, 31166, 117466, 3051, 117470, 1276, 117475, 1218, 117479, 117483, + 117487, 117491, 117495, 117499, 3075, 117503, 117511, 117518, 117525, + 117539, 3079, 8044, 117548, 117556, 117563, 117574, 117583, 117587, + 117594, 117606, 117619, 117632, 117643, 117648, 117655, 117667, 117671, + 3083, 14185, 117681, 117686, 117695, 117705, 117710, 117719, 3087, + 117727, 117731, 117736, 117743, 117749, 117754, 117763, 117771, 117783, + 117793, 1223, 15645, 117806, 117810, 117816, 117830, 117842, 117854, + 117862, 117872, 117881, 117890, 117899, 117907, 117918, 117926, 4657, + 117936, 117947, 117956, 117962, 117977, 117984, 117990, 117995, 43357, + 118000, 3111, 15649, 118004, 118009, 118016, 10206, 118025, 118031, 4695, + 118041, 3116, 39144, 118050, 71705, 118057, 118061, 118067, 118078, + 118084, 118089, 118096, 118102, 118110, 118117, 118123, 118134, 118150, + 118160, 118169, 118180, 118189, 118196, 118202, 118212, 118220, 118226, + 118241, 118247, 118252, 118256, 118263, 118271, 118275, 118278, 118284, + 118291, 118297, 118305, 118314, 118322, 118328, 118337, 52139, 118351, + 118356, 118362, 17744, 118367, 118380, 118392, 118401, 118409, 118416, + 118420, 118424, 118427, 118434, 118441, 118449, 118457, 118466, 118474, + 17643, 118482, 118487, 118491, 118503, 118510, 118517, 118526, 954, + 118536, 118545, 118556, 3137, 118560, 118564, 118570, 118583, 118595, + 118605, 118614, 118626, 32128, 118637, 118645, 118654, 118665, 118676, + 118686, 118696, 118704, 118713, 118721, 13604, 118728, 118732, 118735, + 118740, 118745, 118749, 118755, 1228, 118762, 118766, 14281, 118770, + 118774, 118785, 118794, 118802, 118811, 118819, 118835, 118846, 118855, + 118863, 118875, 118886, 118902, 118912, 118933, 118947, 118960, 118968, + 118975, 8090, 118988, 118993, 118999, 6733, 119005, 119008, 119015, + 119025, 9266, 119032, 119037, 119042, 119049, 119057, 119065, 119071, + 119076, 119082, 119086, 119094, 119103, 119111, 119116, 119125, 119132, + 11418, 11427, 119138, 119149, 119155, 119160, 119166, 3153, 3158, 119172, + 1063, 119178, 119185, 119192, 119205, 119215, 119220, 2324, 87, 119228, + 119235, 119240, 119248, 119258, 119267, 119273, 119282, 119290, 119300, + 119304, 119308, 119313, 119317, 119329, 3181, 119337, 119345, 119350, + 119361, 119372, 119384, 119395, 119405, 119414, 26025, 119419, 119425, + 119430, 119440, 119450, 119455, 34346, 119461, 119466, 119475, 26047, + 119479, 26058, 119484, 4783, 8, 119491, 119500, 119507, 119514, 119520, + 119525, 119529, 119535, 34376, 119540, 119545, 72390, 119550, 119555, + 119561, 119567, 119575, 119580, 119588, 119596, 119605, 119612, 119618, + 119625, 119631, 119638, 119643, 47672, 52033, 119649, 119659, 1822, 32, + 119666, 119671, 119684, 119689, 119697, 119702, 119708, 3207, 30907, + 3221, 119713, 119721, 119728, 119733, 119738, 119747, 4340, 4351, 73734, + 119755, 119759, 1629, 1862, 119764, 119769, 119776, 34797, 1866, 331, + 119783, 119789, 119794, 3229, 119798, 119803, 119810, 1870, 119815, + 119821, 119826, 119838, 6978, 119848, 119855, 1877, 119861, 119866, + 119873, 119880, 119895, 119902, 119913, 119918, 119926, 2772, 119930, + 119942, 119947, 119951, 119957, 34218, 2329, 119961, 119972, 119976, + 119980, 119986, 119990, 119999, 120003, 120014, 120018, 2375, 38961, + 120022, 120032, 120040, 3320, 120046, 120055, 120063, 10752, 120068, + 120076, 120081, 120085, 120094, 120101, 120107, 3290, 17808, 120111, + 120124, 44081, 120142, 120147, 120155, 120163, 120173, 11759, 15773, + 120185, 120198, 120205, 120215, 120229, 120236, 120252, 120259, 120265, + 26105, 14980, 120272, 120279, 120289, 120298, 52835, 120310, 120318, + 52970, 120325, 120328, 120334, 120340, 120346, 120352, 120358, 120365, + 120372, 120378, 120384, 120390, 120396, 120402, 120408, 120414, 120420, + 120426, 120432, 120438, 120444, 120450, 120456, 120462, 120468, 120474, + 120480, 120486, 120492, 120498, 120504, 120510, 120516, 120522, 120528, + 120534, 120540, 120546, 120552, 120558, 120564, 120570, 120576, 120582, + 120588, 120594, 120600, 120606, 120612, 120618, 120624, 120630, 120636, + 120642, 120648, 120654, 120660, 120666, 120672, 120678, 120685, 120691, + 120698, 120705, 120711, 120718, 120725, 120731, 120737, 120743, 120749, + 120755, 120761, 120767, 120773, 120779, 120785, 120791, 120797, 120803, + 120809, 120815, 3304, 10720, 120821, 120831, 120837, 120845, 120849, + 117739, 3308, 120853, 114067, 25770, 4701, 4265, 120857, 3314, 120861, + 120871, 120877, 120883, 120889, 120895, 120901, 120907, 120913, 120919, + 120925, 120931, 120937, 120943, 120949, 120955, 120961, 120967, 120973, + 120979, 120985, 120991, 120997, 121003, 121009, 121015, 121021, 121028, + 121035, 121041, 121047, 121053, 121059, 121065, 121071, 1233, 121077, + 121082, 121087, 121092, 121097, 121102, 121107, 121112, 121117, 121121, + 121125, 121129, 121133, 121137, 121141, 121145, 121149, 121153, 121159, + 121165, 121171, 121177, 121181, 121185, 121189, 121193, 121197, 121201, + 121205, 121209, 121213, 121218, 121223, 121228, 121233, 121238, 121243, + 121248, 121253, 121258, 121263, 121268, 121273, 121278, 121283, 121288, + 121293, 121298, 121303, 121308, 121313, 121318, 121323, 121328, 121333, + 121338, 121343, 121348, 121353, 121358, 121363, 121368, 121373, 121378, + 121383, 121388, 121393, 121398, 121403, 121408, 121413, 121418, 121423, + 121428, 121433, 121438, 121443, 121448, 121453, 121458, 121463, 121468, + 121473, 121478, 121483, 121488, 121493, 121498, 121503, 121508, 121513, + 121518, 121523, 121528, 121533, 121538, 121543, 121548, 121553, 121558, + 121563, 121568, 121573, 121578, 121583, 121588, 121593, 121598, 121603, + 121608, 121613, 121618, 121623, 121628, 121633, 121638, 121643, 121648, + 121653, 121658, 121663, 121668, 121673, 121678, 121683, 121688, 121693, + 121698, 121703, 121708, 121713, 121718, 121723, 121728, 121733, 121738, + 121743, 121748, 121753, 121758, 121763, 121768, 121773, 121778, 121783, + 121788, 121793, 121798, 121803, 121808, 121813, 121818, 121823, 121828, + 121833, 121838, 121843, 121848, 121853, 121858, 121863, 121868, 121873, + 121878, 121883, 121888, 121893, 121898, 121903, 121908, 121913, 121918, + 121923, 121928, 121933, 121938, 121943, 121948, 121953, 121958, 121963, + 121968, 121973, 121978, 121983, 121988, 121993, 121998, 122003, 122008, + 122013, 122018, 122023, 122028, 122033, 122038, 122043, 122048, 122053, + 122058, 122063, 122068, 122073, 122078, 122083, 122088, 122093, 122098, + 122103, 122109, 122114, 122119, 122124, 122129, 122134, 122139, 122144, + 122150, 122155, 122160, 122165, 122170, 122175, 122180, 122185, 122190, + 122195, 122200, 122205, 122210, 122215, 122220, 122225, 122230, 122235, + 122240, 122245, 122250, 122255, 122260, 122265, 122270, 122275, 122280, + 122285, 122290, 122295, 122300, 122305, 122310, 122319, 122324, 122333, + 122338, 122347, 122352, 122361, 122366, 122375, 122380, 122389, 122394, + 122403, 122408, 122417, 122422, 122427, 122436, 122440, 122449, 122454, + 122463, 122468, 122477, 122482, 122491, 122496, 122505, 122510, 122519, + 122524, 122533, 122538, 122547, 122552, 122561, 122566, 122575, 122580, + 122585, 122590, 122595, 122600, 122605, 122610, 122614, 122619, 122624, + 122629, 122634, 122639, 122644, 122650, 122655, 122660, 122665, 122671, + 122675, 122680, 122686, 122691, 122696, 122701, 122706, 122711, 122716, + 122721, 122726, 122731, 122736, 122742, 122747, 122752, 122757, 122763, + 122768, 122773, 122778, 122783, 122789, 122794, 122799, 122804, 122809, + 122814, 122820, 122825, 122830, 122835, 122840, 122845, 122850, 122855, + 122860, 122865, 122870, 122875, 122880, 122885, 122890, 122895, 122900, + 122905, 122910, 122915, 122920, 122925, 122930, 122935, 122941, 122947, + 122953, 122958, 122963, 122968, 122973, 122979, 122985, 122991, 122996, + 123001, 123006, 123012, 123017, 123022, 123027, 123032, 123037, 123042, + 123047, 123052, 123057, 123062, 123067, 123072, 123077, 123082, 123087, + 123092, 123098, 123104, 123110, 123115, 123120, 123125, 123130, 123136, + 123142, 123148, 123153, 123158, 123163, 123168, 123173, 123178, 123183, + 123188, 123193, 19475, 123198, 123204, 123209, 123214, 123219, 123224, + 123229, 123235, 123240, 123245, 123250, 123255, 123260, 123266, 123271, + 123276, 123281, 123286, 123291, 123296, 123301, 123306, 123311, 123316, + 123321, 123326, 123331, 123336, 123341, 123346, 123351, 123356, 123361, + 123366, 123371, 123376, 123382, 123387, 123392, 123397, 123402, 123407, + 123412, 123417, 123422, 123427, 123432, 123437, 123442, 123447, 123452, + 123457, 123462, 123467, 123472, 123477, 123482, 123487, 123492, 123497, + 123502, 123507, 123512, 123517, 123522, 123527, 123532, 123537, 123542, + 123547, 123552, 123557, 123562, 123567, 123572, 123577, 123582, 123588, + 123593, 123598, 123603, 123608, 123613, 123618, 123623, 123628, 123633, + 123638, 123643, 123649, 123654, 123660, 123665, 123670, 123675, 123680, + 123685, 123690, 123696, 123701, 123706, 123712, 123717, 123722, 123727, + 123732, 123737, 123743, 123749, 123754, 123759, 14614, 123764, 123769, + 123774, 123779, 123784, 123789, 123794, 123799, 123804, 123809, 123814, + 123819, 123824, 123829, 123834, 123839, 123844, 123849, 123854, 123859, + 123864, 123869, 123874, 123879, 123884, 123889, 123894, 123899, 123904, + 123909, 123914, 123919, 123924, 123929, 123934, 123939, 123944, 123949, + 123954, 123959, 123964, 123969, 123974, 123979, 123984, 123989, 123994, + 123999, 124004, 124009, 124014, 124019, 124024, 124029, 124034, 124039, + 124044, 124049, 124054, 124059, 124064, 124069, 124074, 124079, 124084, + 124090, 124095, 124100, 124105, 124110, 124116, 124121, 124126, 124131, + 124136, 124141, 124146, 124152, 124157, 124162, 124167, 124172, 124177, + 124183, 124188, 124193, 124198, 124203, 124208, 124214, 124219, 124224, + 124229, 124234, 124239, 124245, 124251, 124256, 124261, 124266, 124272, + 124278, 124284, 124289, 124294, 124300, 124306, 124311, 124317, 124323, + 124329, 124334, 124339, 124345, 124350, 124356, 124361, 124367, 124376, + 124381, 124386, 124392, 124397, 124403, 124408, 124413, 124418, 124423, + 124428, 124433, 124438, 124443, 124448, 124453, 124458, 124463, 124468, + 124473, 124478, 124483, 124488, 124493, 124498, 124503, 124508, 124513, + 124518, 124523, 124528, 124533, 124538, 124543, 124548, 124553, 124558, + 124564, 124570, 124576, 124581, 124586, 124591, 124596, 124601, 124606, + 124611, 124616, 124621, 124626, 124631, 124636, 124641, 124646, 124651, + 124656, 124661, 124666, 124671, 124676, 124682, 124688, 124693, 124699, + 124704, 124709, 124715, 124720, 124726, 124731, 124737, 124742, 124748, + 124753, 124759, 124764, 124769, 124774, 124779, 124784, 124789, 124794, + 120872, 120878, 120884, 120890, 124800, 120896, 120902, 124806, 120908, + 120914, 120920, 120926, 120932, 120938, 120944, 120950, 120956, 124812, + 120962, 120968, 120974, 124818, 120980, 120986, 120992, 120998, 124824, + 121004, 121010, 121016, 121036, 124830, 124836, 121042, 124842, 121048, + 121054, 121060, 121066, 121072, 124848, 3331, 3336, 124853, 3351, 3356, + 3361, 124858, 124861, 124867, 124873, 124880, 124885, 124890, 2380, }; /* code->name phrasebook */ #define phrasebook_shift 7 #define phrasebook_short 190 static const unsigned char phrasebook[] = { - 0, 201, 247, 233, 216, 77, 207, 252, 77, 31, 56, 236, 155, 56, 210, 13, - 56, 251, 137, 251, 49, 45, 210, 113, 50, 210, 113, 250, 193, 108, 56, - 242, 74, 228, 87, 232, 80, 201, 63, 202, 23, 17, 191, 77, 17, 107, 17, - 109, 17, 138, 17, 134, 17, 149, 17, 169, 17, 175, 17, 171, 17, 178, 242, - 83, 204, 25, 219, 180, 56, 234, 43, 56, 230, 204, 56, 208, 13, 77, 242, - 72, 250, 182, 8, 6, 1, 65, 8, 6, 1, 250, 120, 8, 6, 1, 247, 193, 8, 6, 1, - 238, 127, 8, 6, 1, 71, 8, 6, 1, 233, 175, 8, 6, 1, 232, 51, 8, 6, 1, 230, - 116, 8, 6, 1, 68, 8, 6, 1, 223, 35, 8, 6, 1, 222, 152, 8, 6, 1, 172, 8, - 6, 1, 218, 168, 8, 6, 1, 215, 61, 8, 6, 1, 74, 8, 6, 1, 210, 236, 8, 6, - 1, 208, 104, 8, 6, 1, 146, 8, 6, 1, 206, 8, 8, 6, 1, 200, 43, 8, 6, 1, + 0, 201, 248, 233, 218, 77, 207, 254, 77, 31, 56, 236, 157, 56, 210, 15, + 56, 251, 139, 251, 51, 45, 210, 115, 50, 210, 115, 250, 195, 108, 56, + 242, 76, 228, 89, 232, 82, 201, 64, 202, 24, 17, 191, 77, 17, 107, 17, + 109, 17, 138, 17, 134, 17, 150, 17, 169, 17, 175, 17, 171, 17, 178, 242, + 85, 204, 26, 219, 182, 56, 234, 45, 56, 230, 206, 56, 208, 15, 77, 242, + 74, 250, 184, 8, 6, 1, 65, 8, 6, 1, 250, 122, 8, 6, 1, 247, 195, 8, 6, 1, + 238, 129, 8, 6, 1, 71, 8, 6, 1, 233, 177, 8, 6, 1, 232, 53, 8, 6, 1, 230, + 118, 8, 6, 1, 68, 8, 6, 1, 223, 37, 8, 6, 1, 222, 154, 8, 6, 1, 172, 8, + 6, 1, 218, 170, 8, 6, 1, 215, 63, 8, 6, 1, 74, 8, 6, 1, 210, 238, 8, 6, + 1, 208, 106, 8, 6, 1, 146, 8, 6, 1, 206, 9, 8, 6, 1, 200, 43, 8, 6, 1, 66, 8, 6, 1, 196, 12, 8, 6, 1, 193, 224, 8, 6, 1, 192, 235, 8, 6, 1, 192, - 159, 8, 6, 1, 191, 166, 45, 51, 248, 53, 207, 19, 202, 23, 50, 51, 248, - 53, 243, 2, 252, 60, 130, 219, 112, 230, 211, 252, 60, 8, 2, 1, 65, 8, 2, - 1, 250, 120, 8, 2, 1, 247, 193, 8, 2, 1, 238, 127, 8, 2, 1, 71, 8, 2, 1, - 233, 175, 8, 2, 1, 232, 51, 8, 2, 1, 230, 116, 8, 2, 1, 68, 8, 2, 1, 223, - 35, 8, 2, 1, 222, 152, 8, 2, 1, 172, 8, 2, 1, 218, 168, 8, 2, 1, 215, 61, - 8, 2, 1, 74, 8, 2, 1, 210, 236, 8, 2, 1, 208, 104, 8, 2, 1, 146, 8, 2, 1, - 206, 8, 8, 2, 1, 200, 43, 8, 2, 1, 66, 8, 2, 1, 196, 12, 8, 2, 1, 193, + 159, 8, 6, 1, 191, 166, 45, 51, 248, 55, 207, 20, 202, 24, 50, 51, 248, + 55, 243, 4, 252, 62, 130, 219, 114, 230, 213, 252, 62, 8, 2, 1, 65, 8, 2, + 1, 250, 122, 8, 2, 1, 247, 195, 8, 2, 1, 238, 129, 8, 2, 1, 71, 8, 2, 1, + 233, 177, 8, 2, 1, 232, 53, 8, 2, 1, 230, 118, 8, 2, 1, 68, 8, 2, 1, 223, + 37, 8, 2, 1, 222, 154, 8, 2, 1, 172, 8, 2, 1, 218, 170, 8, 2, 1, 215, 63, + 8, 2, 1, 74, 8, 2, 1, 210, 238, 8, 2, 1, 208, 106, 8, 2, 1, 146, 8, 2, 1, + 206, 9, 8, 2, 1, 200, 43, 8, 2, 1, 66, 8, 2, 1, 196, 12, 8, 2, 1, 193, 224, 8, 2, 1, 192, 235, 8, 2, 1, 192, 159, 8, 2, 1, 191, 166, 45, 238, - 171, 248, 53, 81, 219, 112, 50, 238, 171, 248, 53, 198, 152, 213, 37, - 201, 247, 223, 93, 233, 216, 77, 247, 24, 56, 209, 8, 56, 238, 170, 56, - 192, 71, 56, 248, 22, 164, 205, 54, 56, 237, 42, 239, 6, 56, 233, 40, - 211, 50, 223, 144, 219, 219, 55, 251, 116, 207, 252, 77, 213, 12, 56, - 202, 32, 228, 88, 207, 78, 56, 217, 146, 237, 125, 56, 209, 80, 56, 200, - 182, 109, 200, 182, 138, 252, 47, 252, 60, 216, 91, 56, 209, 142, 56, 82, - 236, 140, 247, 35, 200, 182, 107, 217, 40, 211, 50, 223, 144, 206, 203, - 55, 251, 116, 207, 252, 77, 193, 246, 232, 118, 91, 208, 22, 193, 246, - 232, 118, 91, 230, 70, 193, 246, 232, 118, 115, 208, 20, 223, 93, 208, - 13, 77, 8, 6, 1, 42, 4, 230, 210, 8, 6, 1, 42, 4, 252, 46, 8, 6, 1, 42, - 4, 243, 1, 8, 6, 1, 42, 4, 198, 152, 8, 6, 1, 42, 4, 237, 42, 8, 6, 1, - 42, 4, 206, 189, 58, 8, 6, 1, 252, 25, 8, 6, 1, 247, 194, 4, 247, 35, 8, - 6, 1, 235, 15, 4, 230, 210, 8, 6, 1, 235, 15, 4, 252, 46, 8, 6, 1, 235, - 15, 4, 243, 1, 8, 6, 1, 235, 15, 4, 237, 42, 8, 6, 1, 228, 74, 4, 230, - 210, 8, 6, 1, 228, 74, 4, 252, 46, 8, 6, 1, 228, 74, 4, 243, 1, 8, 6, 1, - 228, 74, 4, 237, 42, 8, 6, 1, 233, 248, 8, 6, 1, 215, 62, 4, 198, 152, 8, - 6, 1, 187, 4, 230, 210, 8, 6, 1, 187, 4, 252, 46, 8, 6, 1, 187, 4, 243, - 1, 8, 6, 1, 187, 4, 198, 152, 8, 6, 1, 187, 4, 237, 42, 215, 127, 56, 8, - 6, 1, 187, 4, 106, 8, 6, 1, 126, 4, 230, 210, 8, 6, 1, 126, 4, 252, 46, - 8, 6, 1, 126, 4, 243, 1, 8, 6, 1, 126, 4, 237, 42, 8, 6, 1, 192, 160, 4, - 252, 46, 8, 6, 1, 198, 233, 8, 2, 1, 203, 127, 206, 8, 8, 2, 1, 42, 4, - 230, 210, 8, 2, 1, 42, 4, 252, 46, 8, 2, 1, 42, 4, 243, 1, 8, 2, 1, 42, - 4, 198, 152, 8, 2, 1, 42, 4, 237, 42, 8, 2, 1, 42, 4, 206, 189, 58, 8, 2, - 1, 252, 25, 8, 2, 1, 247, 194, 4, 247, 35, 8, 2, 1, 235, 15, 4, 230, 210, - 8, 2, 1, 235, 15, 4, 252, 46, 8, 2, 1, 235, 15, 4, 243, 1, 8, 2, 1, 235, - 15, 4, 237, 42, 8, 2, 1, 228, 74, 4, 230, 210, 8, 2, 1, 228, 74, 4, 252, - 46, 8, 2, 1, 228, 74, 4, 243, 1, 8, 2, 1, 228, 74, 4, 237, 42, 8, 2, 1, - 233, 248, 8, 2, 1, 215, 62, 4, 198, 152, 8, 2, 1, 187, 4, 230, 210, 8, 2, - 1, 187, 4, 252, 46, 8, 2, 1, 187, 4, 243, 1, 8, 2, 1, 187, 4, 198, 152, - 8, 2, 1, 187, 4, 237, 42, 236, 200, 56, 8, 2, 1, 187, 4, 106, 8, 2, 1, - 126, 4, 230, 210, 8, 2, 1, 126, 4, 252, 46, 8, 2, 1, 126, 4, 243, 1, 8, - 2, 1, 126, 4, 237, 42, 8, 2, 1, 192, 160, 4, 252, 46, 8, 2, 1, 198, 233, - 8, 2, 1, 192, 160, 4, 237, 42, 8, 6, 1, 42, 4, 217, 146, 8, 2, 1, 42, 4, - 217, 146, 8, 6, 1, 42, 4, 248, 36, 8, 2, 1, 42, 4, 248, 36, 8, 6, 1, 42, - 4, 211, 138, 8, 2, 1, 42, 4, 211, 138, 8, 6, 1, 247, 194, 4, 252, 46, 8, - 2, 1, 247, 194, 4, 252, 46, 8, 6, 1, 247, 194, 4, 243, 1, 8, 2, 1, 247, - 194, 4, 243, 1, 8, 6, 1, 247, 194, 4, 75, 58, 8, 2, 1, 247, 194, 4, 75, - 58, 8, 6, 1, 247, 194, 4, 247, 92, 8, 2, 1, 247, 194, 4, 247, 92, 8, 6, - 1, 238, 128, 4, 247, 92, 8, 2, 1, 238, 128, 4, 247, 92, 8, 6, 1, 238, - 128, 4, 106, 8, 2, 1, 238, 128, 4, 106, 8, 6, 1, 235, 15, 4, 217, 146, 8, - 2, 1, 235, 15, 4, 217, 146, 8, 6, 1, 235, 15, 4, 248, 36, 8, 2, 1, 235, - 15, 4, 248, 36, 8, 6, 1, 235, 15, 4, 75, 58, 8, 2, 1, 235, 15, 4, 75, 58, - 8, 6, 1, 235, 15, 4, 211, 138, 8, 2, 1, 235, 15, 4, 211, 138, 8, 6, 1, - 235, 15, 4, 247, 92, 8, 2, 1, 235, 15, 4, 247, 92, 8, 6, 1, 232, 52, 4, - 243, 1, 8, 2, 1, 232, 52, 4, 243, 1, 8, 6, 1, 232, 52, 4, 248, 36, 8, 2, - 1, 232, 52, 4, 248, 36, 8, 6, 1, 232, 52, 4, 75, 58, 8, 2, 1, 232, 52, 4, - 75, 58, 8, 6, 1, 232, 52, 4, 247, 35, 8, 2, 1, 232, 52, 4, 247, 35, 8, 6, - 1, 230, 117, 4, 243, 1, 8, 2, 1, 230, 117, 4, 243, 1, 8, 6, 1, 230, 117, - 4, 106, 8, 2, 1, 230, 117, 4, 106, 8, 6, 1, 228, 74, 4, 198, 152, 8, 2, - 1, 228, 74, 4, 198, 152, 8, 6, 1, 228, 74, 4, 217, 146, 8, 2, 1, 228, 74, - 4, 217, 146, 8, 6, 1, 228, 74, 4, 248, 36, 8, 2, 1, 228, 74, 4, 248, 36, - 8, 6, 1, 228, 74, 4, 211, 138, 8, 2, 1, 228, 74, 4, 211, 138, 8, 6, 1, - 228, 74, 4, 75, 58, 8, 2, 1, 236, 139, 68, 8, 6, 34, 223, 197, 8, 2, 34, - 223, 197, 8, 6, 1, 223, 36, 4, 243, 1, 8, 2, 1, 223, 36, 4, 243, 1, 8, 6, - 1, 222, 153, 4, 247, 35, 8, 2, 1, 222, 153, 4, 247, 35, 8, 2, 1, 221, 8, - 8, 6, 1, 220, 143, 4, 252, 46, 8, 2, 1, 220, 143, 4, 252, 46, 8, 6, 1, - 220, 143, 4, 247, 35, 8, 2, 1, 220, 143, 4, 247, 35, 8, 6, 1, 220, 143, - 4, 247, 92, 8, 2, 1, 220, 143, 4, 247, 92, 8, 6, 1, 220, 143, 4, 82, 236, - 140, 8, 2, 1, 220, 143, 4, 82, 236, 140, 8, 6, 1, 220, 143, 4, 106, 8, 2, - 1, 220, 143, 4, 106, 8, 6, 1, 215, 62, 4, 252, 46, 8, 2, 1, 215, 62, 4, - 252, 46, 8, 6, 1, 215, 62, 4, 247, 35, 8, 2, 1, 215, 62, 4, 247, 35, 8, - 6, 1, 215, 62, 4, 247, 92, 8, 2, 1, 215, 62, 4, 247, 92, 8, 2, 1, 215, - 62, 208, 233, 247, 205, 251, 49, 8, 6, 1, 234, 88, 8, 2, 1, 234, 88, 8, - 6, 1, 187, 4, 217, 146, 8, 2, 1, 187, 4, 217, 146, 8, 6, 1, 187, 4, 248, - 36, 8, 2, 1, 187, 4, 248, 36, 8, 6, 1, 187, 4, 55, 252, 46, 8, 2, 1, 187, - 4, 55, 252, 46, 8, 6, 34, 211, 151, 8, 2, 34, 211, 151, 8, 6, 1, 207, - 222, 4, 252, 46, 8, 2, 1, 207, 222, 4, 252, 46, 8, 6, 1, 207, 222, 4, - 247, 35, 8, 2, 1, 207, 222, 4, 247, 35, 8, 6, 1, 207, 222, 4, 247, 92, 8, - 2, 1, 207, 222, 4, 247, 92, 8, 6, 1, 206, 9, 4, 252, 46, 8, 2, 1, 206, 9, - 4, 252, 46, 8, 6, 1, 206, 9, 4, 243, 1, 8, 2, 1, 206, 9, 4, 243, 1, 8, 6, - 1, 206, 9, 4, 247, 35, 8, 2, 1, 206, 9, 4, 247, 35, 8, 6, 1, 206, 9, 4, - 247, 92, 8, 2, 1, 206, 9, 4, 247, 92, 8, 6, 1, 200, 44, 4, 247, 35, 8, 2, - 1, 200, 44, 4, 247, 35, 8, 6, 1, 200, 44, 4, 247, 92, 8, 2, 1, 200, 44, - 4, 247, 92, 8, 6, 1, 200, 44, 4, 106, 8, 2, 1, 200, 44, 4, 106, 8, 6, 1, - 126, 4, 198, 152, 8, 2, 1, 126, 4, 198, 152, 8, 6, 1, 126, 4, 217, 146, - 8, 2, 1, 126, 4, 217, 146, 8, 6, 1, 126, 4, 248, 36, 8, 2, 1, 126, 4, - 248, 36, 8, 6, 1, 126, 4, 206, 189, 58, 8, 2, 1, 126, 4, 206, 189, 58, 8, - 6, 1, 126, 4, 55, 252, 46, 8, 2, 1, 126, 4, 55, 252, 46, 8, 6, 1, 126, 4, - 211, 138, 8, 2, 1, 126, 4, 211, 138, 8, 6, 1, 193, 225, 4, 243, 1, 8, 2, - 1, 193, 225, 4, 243, 1, 8, 6, 1, 192, 160, 4, 243, 1, 8, 2, 1, 192, 160, - 4, 243, 1, 8, 6, 1, 192, 160, 4, 237, 42, 8, 6, 1, 191, 167, 4, 252, 46, - 8, 2, 1, 191, 167, 4, 252, 46, 8, 6, 1, 191, 167, 4, 75, 58, 8, 2, 1, - 191, 167, 4, 75, 58, 8, 6, 1, 191, 167, 4, 247, 92, 8, 2, 1, 191, 167, 4, - 247, 92, 8, 2, 1, 179, 206, 8, 8, 2, 1, 78, 4, 106, 8, 6, 1, 78, 4, 102, - 8, 6, 1, 78, 4, 198, 51, 8, 2, 1, 78, 4, 198, 51, 8, 6, 1, 163, 169, 8, - 2, 1, 163, 169, 8, 6, 1, 211, 77, 74, 8, 6, 1, 247, 194, 4, 102, 8, 2, 1, - 247, 194, 4, 102, 8, 6, 1, 252, 0, 238, 127, 8, 6, 1, 238, 128, 4, 102, - 8, 6, 1, 238, 128, 4, 198, 51, 8, 2, 1, 238, 128, 4, 198, 51, 8, 2, 1, - 153, 237, 106, 8, 6, 1, 207, 18, 71, 8, 6, 1, 205, 86, 8, 6, 1, 211, 77, - 71, 8, 6, 1, 233, 176, 4, 102, 8, 2, 1, 233, 176, 4, 102, 8, 6, 1, 232, - 52, 4, 102, 8, 6, 1, 231, 211, 8, 2, 1, 228, 126, 8, 6, 1, 223, 83, 8, 6, - 1, 228, 74, 4, 106, 8, 6, 1, 222, 153, 4, 102, 8, 2, 1, 222, 153, 4, 102, - 8, 2, 1, 220, 143, 4, 164, 8, 2, 1, 220, 33, 4, 106, 8, 6, 1, 153, 218, - 168, 8, 6, 1, 215, 62, 4, 45, 102, 8, 2, 1, 215, 62, 4, 179, 50, 219, - 212, 8, 6, 1, 187, 4, 82, 198, 152, 8, 6, 1, 187, 4, 228, 187, 8, 2, 1, - 187, 4, 228, 187, 8, 6, 1, 211, 133, 8, 2, 1, 211, 133, 8, 6, 1, 210, - 237, 4, 102, 8, 2, 1, 210, 237, 4, 102, 8, 1, 191, 228, 8, 6, 1, 163, - 109, 8, 2, 1, 163, 109, 8, 6, 1, 234, 12, 8, 1, 207, 18, 234, 13, 219, 4, - 8, 2, 1, 200, 44, 4, 210, 192, 102, 8, 6, 1, 200, 44, 4, 102, 8, 2, 1, - 200, 44, 4, 102, 8, 6, 1, 200, 44, 4, 207, 24, 102, 8, 6, 1, 126, 4, 228, - 187, 8, 2, 1, 126, 4, 228, 187, 8, 6, 1, 196, 70, 8, 6, 1, 196, 13, 4, - 102, 8, 6, 1, 192, 160, 4, 102, 8, 2, 1, 192, 160, 4, 102, 8, 6, 1, 191, - 167, 4, 106, 8, 2, 1, 191, 167, 4, 106, 8, 6, 1, 233, 178, 8, 6, 1, 233, - 179, 207, 17, 8, 2, 1, 233, 179, 207, 17, 8, 2, 1, 233, 179, 4, 199, 215, - 8, 1, 105, 4, 106, 8, 6, 1, 163, 149, 8, 2, 1, 163, 149, 8, 1, 223, 93, - 231, 11, 201, 64, 4, 106, 8, 1, 192, 238, 8, 1, 237, 98, 242, 231, 8, 1, - 220, 3, 242, 231, 8, 1, 251, 150, 242, 231, 8, 1, 207, 24, 242, 231, 8, - 6, 1, 235, 37, 4, 247, 92, 8, 6, 1, 238, 128, 4, 2, 1, 191, 167, 4, 247, - 92, 8, 2, 1, 235, 37, 4, 247, 92, 8, 6, 1, 219, 77, 8, 6, 1, 220, 143, 4, - 2, 1, 223, 35, 8, 2, 1, 219, 77, 8, 6, 1, 213, 158, 8, 6, 1, 215, 62, 4, - 2, 1, 223, 35, 8, 2, 1, 213, 158, 8, 6, 1, 42, 4, 247, 92, 8, 2, 1, 42, - 4, 247, 92, 8, 6, 1, 228, 74, 4, 247, 92, 8, 2, 1, 228, 74, 4, 247, 92, - 8, 6, 1, 187, 4, 247, 92, 8, 2, 1, 187, 4, 247, 92, 8, 6, 1, 126, 4, 247, - 92, 8, 2, 1, 126, 4, 247, 92, 8, 6, 1, 126, 4, 237, 43, 23, 217, 146, 8, - 2, 1, 126, 4, 237, 43, 23, 217, 146, 8, 6, 1, 126, 4, 237, 43, 23, 252, - 46, 8, 2, 1, 126, 4, 237, 43, 23, 252, 46, 8, 6, 1, 126, 4, 237, 43, 23, - 247, 92, 8, 2, 1, 126, 4, 237, 43, 23, 247, 92, 8, 6, 1, 126, 4, 237, 43, - 23, 230, 210, 8, 2, 1, 126, 4, 237, 43, 23, 230, 210, 8, 2, 1, 153, 71, - 8, 6, 1, 42, 4, 237, 43, 23, 217, 146, 8, 2, 1, 42, 4, 237, 43, 23, 217, - 146, 8, 6, 1, 42, 4, 75, 93, 23, 217, 146, 8, 2, 1, 42, 4, 75, 93, 23, - 217, 146, 8, 6, 1, 252, 26, 4, 217, 146, 8, 2, 1, 252, 26, 4, 217, 146, - 8, 6, 1, 232, 52, 4, 106, 8, 2, 1, 232, 52, 4, 106, 8, 6, 1, 232, 52, 4, - 247, 92, 8, 2, 1, 232, 52, 4, 247, 92, 8, 6, 1, 222, 153, 4, 247, 92, 8, - 2, 1, 222, 153, 4, 247, 92, 8, 6, 1, 187, 4, 211, 138, 8, 2, 1, 187, 4, - 211, 138, 8, 6, 1, 187, 4, 211, 139, 23, 217, 146, 8, 2, 1, 187, 4, 211, - 139, 23, 217, 146, 8, 6, 1, 233, 179, 4, 247, 92, 8, 2, 1, 233, 179, 4, - 247, 92, 8, 2, 1, 223, 36, 4, 247, 92, 8, 6, 1, 235, 36, 8, 6, 1, 238, - 128, 4, 2, 1, 191, 166, 8, 2, 1, 235, 36, 8, 6, 1, 232, 52, 4, 252, 46, - 8, 2, 1, 232, 52, 4, 252, 46, 8, 6, 1, 228, 123, 8, 6, 1, 192, 238, 8, 6, - 1, 215, 62, 4, 230, 210, 8, 2, 1, 215, 62, 4, 230, 210, 8, 6, 1, 42, 4, - 206, 189, 93, 23, 252, 46, 8, 2, 1, 42, 4, 206, 189, 93, 23, 252, 46, 8, - 6, 1, 252, 26, 4, 252, 46, 8, 2, 1, 252, 26, 4, 252, 46, 8, 6, 1, 187, 4, - 201, 28, 23, 252, 46, 8, 2, 1, 187, 4, 201, 28, 23, 252, 46, 8, 6, 1, 42, - 4, 55, 230, 210, 8, 2, 1, 42, 4, 55, 230, 210, 8, 6, 1, 42, 4, 223, 93, - 248, 36, 8, 2, 1, 42, 4, 223, 93, 248, 36, 8, 6, 1, 235, 15, 4, 55, 230, - 210, 8, 2, 1, 235, 15, 4, 55, 230, 210, 8, 6, 1, 235, 15, 4, 223, 93, - 248, 36, 8, 2, 1, 235, 15, 4, 223, 93, 248, 36, 8, 6, 1, 228, 74, 4, 55, - 230, 210, 8, 2, 1, 228, 74, 4, 55, 230, 210, 8, 6, 1, 228, 74, 4, 223, - 93, 248, 36, 8, 2, 1, 228, 74, 4, 223, 93, 248, 36, 8, 6, 1, 187, 4, 55, - 230, 210, 8, 2, 1, 187, 4, 55, 230, 210, 8, 6, 1, 187, 4, 223, 93, 248, - 36, 8, 2, 1, 187, 4, 223, 93, 248, 36, 8, 6, 1, 207, 222, 4, 55, 230, - 210, 8, 2, 1, 207, 222, 4, 55, 230, 210, 8, 6, 1, 207, 222, 4, 223, 93, - 248, 36, 8, 2, 1, 207, 222, 4, 223, 93, 248, 36, 8, 6, 1, 126, 4, 55, - 230, 210, 8, 2, 1, 126, 4, 55, 230, 210, 8, 6, 1, 126, 4, 223, 93, 248, - 36, 8, 2, 1, 126, 4, 223, 93, 248, 36, 8, 6, 1, 206, 9, 4, 242, 75, 60, - 8, 2, 1, 206, 9, 4, 242, 75, 60, 8, 6, 1, 200, 44, 4, 242, 75, 60, 8, 2, - 1, 200, 44, 4, 242, 75, 60, 8, 6, 1, 191, 248, 8, 2, 1, 191, 248, 8, 6, - 1, 230, 117, 4, 247, 92, 8, 2, 1, 230, 117, 4, 247, 92, 8, 6, 1, 215, 62, - 4, 179, 50, 219, 212, 8, 2, 1, 238, 128, 4, 238, 175, 8, 6, 1, 211, 19, - 8, 2, 1, 211, 19, 8, 6, 1, 191, 167, 4, 102, 8, 2, 1, 191, 167, 4, 102, - 8, 6, 1, 42, 4, 75, 58, 8, 2, 1, 42, 4, 75, 58, 8, 6, 1, 235, 15, 4, 247, - 35, 8, 2, 1, 235, 15, 4, 247, 35, 8, 6, 1, 187, 4, 237, 43, 23, 217, 146, - 8, 2, 1, 187, 4, 237, 43, 23, 217, 146, 8, 6, 1, 187, 4, 198, 153, 23, - 217, 146, 8, 2, 1, 187, 4, 198, 153, 23, 217, 146, 8, 6, 1, 187, 4, 75, - 58, 8, 2, 1, 187, 4, 75, 58, 8, 6, 1, 187, 4, 75, 93, 23, 217, 146, 8, 2, - 1, 187, 4, 75, 93, 23, 217, 146, 8, 6, 1, 192, 160, 4, 217, 146, 8, 2, 1, - 192, 160, 4, 217, 146, 8, 2, 1, 220, 143, 4, 238, 175, 8, 2, 1, 215, 62, - 4, 238, 175, 8, 2, 1, 200, 44, 4, 238, 175, 8, 2, 1, 236, 139, 223, 35, - 8, 2, 1, 237, 201, 237, 2, 8, 2, 1, 208, 34, 237, 2, 8, 6, 1, 42, 4, 106, - 8, 6, 1, 247, 194, 4, 106, 8, 2, 1, 247, 194, 4, 106, 8, 6, 1, 220, 143, - 4, 164, 8, 6, 1, 200, 44, 4, 237, 39, 106, 8, 2, 1, 206, 9, 4, 200, 146, - 199, 215, 8, 2, 1, 191, 167, 4, 200, 146, 199, 215, 8, 6, 1, 231, 11, - 201, 63, 8, 2, 1, 231, 11, 201, 63, 8, 6, 1, 78, 4, 106, 8, 6, 1, 126, - 164, 8, 6, 1, 153, 196, 12, 8, 6, 1, 235, 15, 4, 106, 8, 2, 1, 235, 15, - 4, 106, 8, 6, 1, 223, 36, 4, 106, 8, 2, 1, 223, 36, 4, 106, 8, 6, 1, 2, - 208, 105, 4, 228, 251, 199, 215, 8, 2, 1, 208, 105, 4, 228, 251, 199, - 215, 8, 6, 1, 207, 222, 4, 106, 8, 2, 1, 207, 222, 4, 106, 8, 6, 1, 192, - 160, 4, 106, 8, 2, 1, 192, 160, 4, 106, 8, 2, 1, 153, 65, 8, 2, 1, 251, - 160, 8, 2, 1, 153, 251, 160, 8, 2, 1, 78, 4, 102, 8, 2, 1, 211, 77, 74, - 8, 2, 1, 247, 194, 4, 238, 175, 8, 2, 1, 238, 128, 4, 199, 215, 8, 2, 1, - 238, 128, 4, 102, 8, 2, 1, 207, 18, 71, 8, 2, 1, 205, 86, 8, 2, 1, 205, - 87, 4, 102, 8, 2, 1, 211, 77, 71, 8, 2, 1, 207, 18, 211, 77, 71, 8, 2, 1, - 207, 18, 211, 77, 235, 15, 4, 102, 8, 2, 1, 242, 219, 207, 18, 211, 77, - 71, 8, 2, 1, 236, 139, 223, 36, 4, 106, 8, 2, 1, 232, 52, 4, 102, 8, 2, - 1, 27, 232, 51, 8, 1, 2, 6, 232, 51, 8, 2, 1, 231, 211, 8, 2, 1, 207, - 140, 228, 187, 8, 2, 1, 153, 230, 116, 8, 2, 1, 230, 117, 4, 102, 8, 2, - 1, 229, 197, 4, 102, 8, 2, 1, 228, 74, 4, 106, 8, 2, 1, 223, 83, 8, 1, 2, - 6, 68, 8, 2, 1, 220, 143, 4, 82, 198, 152, 8, 2, 1, 220, 143, 4, 248, - 231, 8, 2, 1, 220, 143, 4, 207, 24, 102, 8, 2, 1, 219, 162, 8, 2, 1, 153, - 218, 168, 8, 2, 1, 153, 218, 169, 4, 179, 219, 212, 8, 2, 1, 218, 169, 4, - 102, 8, 2, 1, 215, 62, 4, 45, 102, 8, 2, 1, 215, 62, 4, 207, 24, 102, 8, - 1, 2, 6, 215, 61, 8, 2, 1, 249, 82, 74, 8, 1, 2, 6, 211, 151, 8, 2, 1, - 242, 219, 211, 110, 8, 2, 1, 209, 211, 8, 2, 1, 153, 146, 8, 2, 1, 153, - 207, 222, 4, 179, 219, 212, 8, 2, 1, 153, 207, 222, 4, 102, 8, 2, 1, 207, - 222, 4, 179, 219, 212, 8, 2, 1, 207, 222, 4, 199, 215, 8, 2, 1, 207, 222, - 4, 232, 233, 8, 2, 1, 207, 18, 207, 222, 4, 232, 233, 8, 1, 2, 6, 146, 8, - 1, 2, 6, 223, 93, 146, 8, 2, 1, 206, 9, 4, 102, 8, 2, 1, 234, 12, 8, 2, - 1, 236, 139, 223, 36, 4, 201, 28, 23, 102, 8, 2, 1, 201, 187, 207, 18, - 234, 12, 8, 2, 1, 234, 13, 4, 238, 175, 8, 2, 1, 153, 200, 43, 8, 2, 1, - 200, 44, 4, 207, 24, 102, 8, 2, 1, 126, 164, 8, 2, 1, 196, 70, 8, 2, 1, - 196, 13, 4, 102, 8, 2, 1, 153, 196, 12, 8, 2, 1, 153, 193, 224, 8, 2, 1, - 153, 192, 159, 8, 1, 2, 6, 192, 159, 8, 2, 1, 191, 167, 4, 207, 24, 102, - 8, 2, 1, 191, 167, 4, 238, 175, 8, 2, 1, 233, 178, 8, 2, 1, 233, 179, 4, - 238, 175, 8, 1, 231, 11, 201, 63, 8, 1, 209, 219, 195, 20, 232, 104, 8, - 1, 223, 93, 231, 11, 201, 63, 8, 1, 201, 36, 247, 193, 8, 1, 248, 172, - 242, 231, 8, 1, 2, 6, 250, 120, 8, 2, 1, 242, 219, 211, 77, 71, 8, 1, 2, - 6, 232, 52, 4, 102, 8, 1, 2, 6, 230, 116, 8, 2, 1, 223, 36, 4, 238, 212, - 8, 2, 1, 153, 222, 152, 8, 1, 2, 6, 172, 8, 2, 1, 208, 105, 4, 102, 8, 1, - 231, 11, 201, 64, 4, 106, 8, 1, 207, 18, 231, 11, 201, 64, 4, 106, 8, 2, - 1, 235, 37, 237, 2, 8, 2, 1, 237, 70, 237, 2, 8, 2, 1, 235, 37, 237, 3, - 4, 238, 175, 8, 2, 1, 197, 170, 237, 2, 8, 2, 1, 199, 79, 237, 2, 8, 2, - 1, 199, 152, 237, 3, 4, 238, 175, 8, 2, 1, 233, 37, 237, 2, 8, 2, 1, 218, - 227, 237, 2, 8, 2, 1, 218, 170, 237, 2, 8, 1, 248, 172, 210, 12, 8, 1, - 248, 180, 210, 12, 8, 2, 1, 153, 230, 117, 4, 232, 233, 8, 2, 1, 153, - 230, 117, 4, 232, 234, 23, 199, 215, 52, 1, 2, 230, 116, 52, 1, 2, 230, - 117, 4, 102, 52, 1, 2, 223, 35, 52, 1, 2, 146, 52, 1, 2, 153, 146, 52, 1, - 2, 153, 207, 222, 4, 102, 52, 1, 2, 6, 223, 93, 146, 52, 1, 2, 193, 224, - 52, 1, 2, 192, 159, 52, 1, 208, 215, 52, 1, 55, 208, 215, 52, 1, 153, - 242, 74, 52, 1, 251, 49, 52, 1, 207, 18, 242, 74, 52, 1, 50, 132, 206, - 188, 52, 1, 45, 132, 206, 188, 52, 1, 231, 11, 201, 63, 52, 1, 207, 18, - 231, 11, 201, 63, 52, 1, 45, 250, 235, 52, 1, 50, 250, 235, 52, 1, 133, - 250, 235, 52, 1, 144, 250, 235, 52, 1, 243, 2, 252, 60, 247, 92, 52, 1, - 81, 219, 112, 52, 1, 217, 146, 52, 1, 252, 47, 252, 60, 52, 1, 230, 211, - 252, 60, 52, 1, 130, 81, 219, 112, 52, 1, 130, 217, 146, 52, 1, 130, 230, - 211, 252, 60, 52, 1, 130, 252, 47, 252, 60, 52, 1, 197, 238, 242, 83, 52, - 1, 132, 197, 238, 242, 83, 52, 1, 247, 20, 50, 132, 206, 188, 52, 1, 247, - 20, 45, 132, 206, 188, 52, 1, 133, 199, 228, 52, 1, 144, 199, 228, 52, 1, - 108, 56, 52, 1, 216, 35, 56, 248, 36, 75, 58, 206, 189, 58, 211, 138, 2, - 198, 152, 55, 252, 47, 252, 60, 52, 1, 207, 2, 102, 52, 1, 238, 218, 252, - 60, 52, 1, 2, 231, 211, 52, 1, 2, 172, 52, 1, 2, 206, 8, 52, 1, 2, 192, - 235, 52, 1, 2, 207, 18, 231, 11, 201, 63, 52, 1, 233, 200, 163, 164, 52, - 1, 137, 163, 164, 52, 1, 216, 87, 163, 164, 52, 1, 130, 163, 164, 52, 1, - 233, 199, 163, 164, 52, 1, 192, 22, 237, 95, 163, 77, 52, 1, 192, 107, - 237, 95, 163, 77, 52, 1, 195, 18, 52, 1, 196, 109, 52, 1, 55, 251, 49, - 52, 1, 130, 144, 250, 235, 52, 1, 130, 133, 250, 235, 52, 1, 130, 45, - 250, 235, 52, 1, 130, 50, 250, 235, 52, 1, 130, 206, 188, 52, 1, 82, 230, - 211, 252, 60, 52, 1, 82, 55, 230, 211, 252, 60, 52, 1, 82, 55, 252, 47, - 252, 60, 52, 1, 130, 198, 152, 52, 1, 207, 147, 242, 83, 52, 1, 248, 249, - 137, 198, 79, 52, 1, 234, 95, 137, 198, 79, 52, 1, 248, 249, 130, 198, - 79, 52, 1, 234, 95, 130, 198, 79, 52, 1, 203, 104, 52, 1, 211, 77, 203, - 104, 52, 1, 130, 45, 57, 33, 230, 211, 252, 60, 33, 252, 47, 252, 60, 33, - 243, 2, 252, 60, 33, 198, 152, 33, 217, 146, 33, 210, 254, 33, 248, 36, - 33, 75, 58, 33, 237, 42, 33, 228, 251, 58, 33, 206, 189, 58, 33, 55, 252, - 47, 252, 60, 33, 247, 92, 33, 81, 219, 113, 58, 33, 55, 81, 219, 113, 58, - 33, 55, 230, 211, 252, 60, 33, 247, 119, 33, 223, 93, 248, 36, 33, 153, - 242, 75, 58, 33, 242, 75, 58, 33, 207, 18, 242, 75, 58, 33, 242, 75, 93, - 183, 33, 230, 211, 252, 61, 60, 33, 252, 47, 252, 61, 60, 33, 45, 199, - 229, 60, 33, 50, 199, 229, 60, 33, 45, 251, 116, 58, 33, 228, 187, 33, - 45, 132, 206, 189, 60, 33, 133, 199, 229, 60, 33, 144, 199, 229, 60, 33, - 108, 3, 60, 33, 216, 35, 3, 60, 33, 210, 190, 228, 251, 60, 33, 207, 24, - 228, 251, 60, 33, 75, 60, 33, 237, 43, 60, 33, 206, 189, 60, 33, 242, 75, - 60, 33, 247, 35, 33, 211, 138, 33, 81, 219, 113, 60, 33, 248, 29, 60, 33, - 223, 93, 55, 251, 15, 60, 33, 247, 93, 60, 33, 243, 2, 252, 61, 60, 33, - 248, 37, 60, 33, 223, 93, 248, 37, 60, 33, 198, 153, 60, 33, 217, 147, - 60, 33, 130, 219, 112, 33, 55, 130, 219, 112, 33, 198, 153, 210, 255, 33, - 203, 40, 201, 28, 210, 255, 33, 179, 201, 28, 210, 255, 33, 203, 40, 202, - 24, 210, 255, 33, 179, 202, 24, 210, 255, 33, 50, 132, 206, 189, 60, 33, - 223, 93, 248, 29, 60, 33, 51, 60, 33, 205, 62, 60, 33, 192, 236, 58, 33, - 81, 198, 152, 33, 55, 210, 254, 33, 230, 211, 163, 77, 33, 252, 47, 163, - 77, 33, 35, 210, 4, 33, 35, 221, 30, 33, 35, 237, 36, 198, 60, 33, 35, - 191, 233, 33, 248, 29, 58, 33, 234, 43, 3, 60, 33, 55, 81, 219, 113, 60, - 33, 45, 251, 116, 60, 33, 213, 12, 198, 153, 58, 33, 229, 1, 58, 33, 251, - 165, 234, 45, 119, 58, 33, 45, 50, 64, 60, 33, 196, 66, 64, 60, 33, 230, - 217, 222, 196, 33, 50, 250, 236, 58, 33, 45, 132, 206, 189, 58, 33, 233, - 34, 33, 192, 236, 60, 33, 45, 250, 236, 60, 33, 50, 250, 236, 60, 33, 50, - 250, 236, 23, 133, 250, 236, 60, 33, 50, 132, 206, 189, 58, 33, 75, 93, - 183, 33, 250, 194, 60, 33, 55, 206, 189, 60, 33, 191, 21, 58, 33, 55, - 248, 37, 60, 33, 55, 248, 36, 33, 55, 217, 146, 33, 55, 217, 147, 60, 33, - 55, 198, 152, 33, 55, 223, 93, 248, 36, 33, 55, 96, 64, 60, 33, 8, 2, 1, - 65, 33, 8, 2, 1, 71, 33, 8, 2, 1, 68, 33, 8, 2, 1, 74, 33, 8, 2, 1, 66, - 33, 8, 2, 1, 247, 193, 33, 8, 2, 1, 238, 127, 33, 8, 2, 1, 230, 116, 33, - 8, 2, 1, 218, 168, 33, 8, 2, 1, 146, 33, 8, 2, 1, 200, 43, 33, 8, 2, 1, - 196, 12, 33, 8, 2, 1, 192, 235, 35, 6, 1, 229, 185, 35, 2, 1, 229, 185, - 35, 6, 1, 251, 14, 205, 145, 35, 2, 1, 251, 14, 205, 145, 35, 212, 134, - 56, 35, 110, 212, 134, 56, 35, 6, 1, 210, 171, 237, 10, 35, 2, 1, 210, - 171, 237, 10, 35, 191, 233, 35, 2, 207, 18, 218, 206, 202, 197, 113, 35, - 2, 235, 138, 218, 206, 202, 197, 113, 35, 2, 207, 18, 235, 138, 218, 206, - 202, 197, 113, 35, 208, 13, 77, 35, 6, 1, 191, 240, 35, 198, 60, 35, 237, - 36, 198, 60, 35, 6, 1, 251, 161, 4, 198, 60, 35, 251, 94, 199, 108, 35, - 6, 1, 234, 48, 4, 198, 60, 35, 6, 1, 233, 254, 4, 198, 60, 35, 6, 1, 223, - 84, 4, 198, 60, 35, 6, 1, 211, 108, 4, 198, 60, 35, 6, 1, 196, 71, 4, - 198, 60, 35, 6, 1, 211, 111, 4, 198, 60, 35, 2, 1, 223, 84, 4, 237, 36, - 23, 198, 60, 35, 6, 1, 251, 160, 35, 6, 1, 248, 212, 35, 6, 1, 231, 211, - 35, 6, 1, 237, 106, 35, 6, 1, 234, 47, 35, 6, 1, 191, 76, 35, 6, 1, 233, - 253, 35, 6, 1, 199, 15, 35, 6, 1, 223, 83, 35, 6, 1, 222, 72, 35, 6, 1, - 220, 31, 35, 6, 1, 215, 155, 35, 6, 1, 212, 178, 35, 6, 1, 192, 207, 35, - 6, 1, 211, 107, 35, 6, 1, 209, 185, 35, 6, 1, 207, 3, 35, 6, 1, 202, 196, - 35, 6, 1, 199, 166, 35, 6, 1, 196, 70, 35, 6, 1, 209, 211, 35, 6, 1, 243, - 95, 35, 6, 1, 208, 176, 35, 6, 1, 211, 110, 35, 6, 1, 223, 84, 4, 237, - 35, 35, 6, 1, 196, 71, 4, 237, 35, 35, 2, 1, 251, 161, 4, 198, 60, 35, 2, - 1, 234, 48, 4, 198, 60, 35, 2, 1, 233, 254, 4, 198, 60, 35, 2, 1, 223, - 84, 4, 198, 60, 35, 2, 1, 196, 71, 4, 237, 36, 23, 198, 60, 35, 2, 1, - 251, 160, 35, 2, 1, 248, 212, 35, 2, 1, 231, 211, 35, 2, 1, 237, 106, 35, - 2, 1, 234, 47, 35, 2, 1, 191, 76, 35, 2, 1, 233, 253, 35, 2, 1, 199, 15, - 35, 2, 1, 223, 83, 35, 2, 1, 222, 72, 35, 2, 1, 220, 31, 35, 2, 1, 215, - 155, 35, 2, 1, 212, 178, 35, 2, 1, 192, 207, 35, 2, 1, 211, 107, 35, 2, - 1, 209, 185, 35, 2, 1, 207, 3, 35, 2, 1, 53, 202, 196, 35, 2, 1, 202, - 196, 35, 2, 1, 199, 166, 35, 2, 1, 196, 70, 35, 2, 1, 209, 211, 35, 2, 1, - 243, 95, 35, 2, 1, 208, 176, 35, 2, 1, 211, 110, 35, 2, 1, 223, 84, 4, - 237, 35, 35, 2, 1, 196, 71, 4, 237, 35, 35, 2, 1, 211, 108, 4, 198, 60, - 35, 2, 1, 196, 71, 4, 198, 60, 35, 2, 1, 211, 111, 4, 198, 60, 35, 6, - 222, 103, 113, 35, 248, 213, 113, 35, 199, 16, 113, 35, 196, 71, 4, 228, - 251, 113, 35, 196, 71, 4, 252, 47, 23, 228, 251, 113, 35, 196, 71, 4, - 237, 43, 23, 228, 251, 113, 35, 209, 212, 113, 35, 209, 186, 113, 35, - 222, 103, 113, 35, 1, 251, 14, 221, 35, 35, 2, 1, 251, 14, 221, 35, 35, - 1, 201, 73, 35, 2, 1, 201, 73, 35, 1, 237, 10, 35, 2, 1, 237, 10, 35, 1, - 221, 35, 35, 2, 1, 221, 35, 35, 1, 205, 145, 35, 2, 1, 205, 145, 94, 6, - 1, 203, 105, 94, 2, 1, 203, 105, 94, 6, 1, 233, 44, 94, 2, 1, 233, 44, - 94, 6, 1, 221, 195, 94, 2, 1, 221, 195, 94, 6, 1, 228, 242, 94, 2, 1, - 228, 242, 94, 6, 1, 231, 206, 94, 2, 1, 231, 206, 94, 6, 1, 203, 71, 94, - 2, 1, 203, 71, 94, 6, 1, 237, 122, 94, 2, 1, 237, 122, 35, 222, 73, 113, - 35, 207, 4, 113, 35, 218, 206, 202, 197, 113, 35, 1, 191, 240, 35, 6, - 199, 16, 113, 35, 218, 206, 234, 48, 113, 35, 207, 18, 218, 206, 234, 48, - 113, 35, 6, 1, 203, 56, 35, 2, 1, 203, 56, 35, 6, 218, 206, 202, 197, - 113, 35, 6, 1, 205, 142, 35, 2, 1, 205, 142, 35, 207, 4, 4, 201, 28, 113, - 35, 6, 207, 18, 218, 206, 202, 197, 113, 35, 6, 235, 138, 218, 206, 202, - 197, 113, 35, 6, 207, 18, 235, 138, 218, 206, 202, 197, 113, 38, 6, 1, - 223, 227, 4, 230, 210, 38, 6, 1, 223, 88, 38, 6, 1, 236, 192, 38, 6, 1, - 231, 20, 38, 6, 1, 196, 125, 223, 226, 38, 6, 1, 235, 32, 38, 6, 1, 247, - 203, 68, 38, 6, 1, 192, 33, 38, 6, 1, 223, 10, 38, 6, 1, 219, 76, 38, 6, - 1, 213, 150, 38, 6, 1, 197, 155, 38, 6, 1, 221, 103, 38, 6, 1, 228, 74, - 4, 230, 210, 38, 6, 1, 203, 40, 66, 38, 6, 1, 235, 28, 38, 6, 1, 65, 38, - 6, 1, 249, 17, 38, 6, 1, 195, 153, 38, 6, 1, 231, 77, 38, 6, 1, 237, 146, - 38, 6, 1, 223, 226, 38, 6, 1, 191, 62, 38, 6, 1, 191, 87, 38, 6, 1, 68, - 38, 6, 1, 203, 40, 68, 38, 6, 1, 155, 38, 6, 1, 234, 140, 38, 6, 1, 234, - 114, 38, 6, 1, 234, 103, 38, 6, 1, 74, 38, 6, 1, 210, 63, 38, 6, 1, 234, - 34, 38, 6, 1, 234, 22, 38, 6, 1, 199, 145, 38, 6, 1, 66, 38, 6, 1, 234, - 181, 38, 6, 1, 140, 38, 6, 1, 197, 161, 38, 6, 1, 243, 127, 38, 6, 1, - 203, 165, 38, 6, 1, 203, 116, 38, 6, 1, 230, 17, 56, 38, 6, 1, 192, 58, - 38, 6, 1, 202, 32, 56, 38, 6, 1, 71, 38, 6, 1, 191, 225, 38, 6, 1, 170, - 38, 2, 1, 65, 38, 2, 1, 249, 17, 38, 2, 1, 195, 153, 38, 2, 1, 231, 77, - 38, 2, 1, 237, 146, 38, 2, 1, 223, 226, 38, 2, 1, 191, 62, 38, 2, 1, 191, - 87, 38, 2, 1, 68, 38, 2, 1, 203, 40, 68, 38, 2, 1, 155, 38, 2, 1, 234, - 140, 38, 2, 1, 234, 114, 38, 2, 1, 234, 103, 38, 2, 1, 74, 38, 2, 1, 210, - 63, 38, 2, 1, 234, 34, 38, 2, 1, 234, 22, 38, 2, 1, 199, 145, 38, 2, 1, - 66, 38, 2, 1, 234, 181, 38, 2, 1, 140, 38, 2, 1, 197, 161, 38, 2, 1, 243, - 127, 38, 2, 1, 203, 165, 38, 2, 1, 203, 116, 38, 2, 1, 230, 17, 56, 38, - 2, 1, 192, 58, 38, 2, 1, 202, 32, 56, 38, 2, 1, 71, 38, 2, 1, 191, 225, - 38, 2, 1, 170, 38, 2, 1, 223, 227, 4, 230, 210, 38, 2, 1, 223, 88, 38, 2, - 1, 236, 192, 38, 2, 1, 231, 20, 38, 2, 1, 196, 125, 223, 226, 38, 2, 1, - 235, 32, 38, 2, 1, 247, 203, 68, 38, 2, 1, 192, 33, 38, 2, 1, 223, 10, - 38, 2, 1, 219, 76, 38, 2, 1, 213, 150, 38, 2, 1, 197, 155, 38, 2, 1, 221, - 103, 38, 2, 1, 228, 74, 4, 230, 210, 38, 2, 1, 203, 40, 66, 38, 2, 1, - 235, 28, 38, 6, 1, 211, 110, 38, 2, 1, 211, 110, 38, 6, 1, 192, 95, 38, - 2, 1, 192, 95, 38, 6, 1, 223, 81, 71, 38, 2, 1, 223, 81, 71, 38, 6, 1, - 219, 83, 191, 190, 38, 2, 1, 219, 83, 191, 190, 38, 6, 1, 223, 81, 219, - 83, 191, 190, 38, 2, 1, 223, 81, 219, 83, 191, 190, 38, 6, 1, 248, 175, - 191, 190, 38, 2, 1, 248, 175, 191, 190, 38, 6, 1, 223, 81, 248, 175, 191, - 190, 38, 2, 1, 223, 81, 248, 175, 191, 190, 38, 6, 1, 220, 248, 38, 2, 1, - 220, 248, 38, 6, 1, 208, 176, 38, 2, 1, 208, 176, 38, 6, 1, 232, 228, 38, - 2, 1, 232, 228, 38, 6, 1, 223, 37, 38, 2, 1, 223, 37, 38, 6, 1, 223, 38, - 4, 55, 230, 211, 252, 60, 38, 2, 1, 223, 38, 4, 55, 230, 211, 252, 60, - 38, 6, 1, 196, 128, 38, 2, 1, 196, 128, 38, 6, 1, 206, 115, 211, 110, 38, - 2, 1, 206, 115, 211, 110, 38, 6, 1, 211, 111, 4, 198, 122, 38, 2, 1, 211, - 111, 4, 198, 122, 38, 6, 1, 211, 30, 38, 2, 1, 211, 30, 38, 6, 1, 221, - 35, 38, 2, 1, 221, 35, 38, 198, 229, 56, 33, 38, 198, 122, 33, 38, 210, - 191, 33, 38, 237, 213, 209, 75, 33, 38, 208, 170, 209, 75, 33, 38, 209, - 54, 33, 38, 228, 141, 198, 229, 56, 33, 38, 216, 48, 56, 38, 6, 1, 203, - 40, 228, 74, 4, 199, 215, 38, 2, 1, 203, 40, 228, 74, 4, 199, 215, 38, 6, - 1, 204, 21, 56, 38, 2, 1, 204, 21, 56, 38, 6, 1, 234, 35, 4, 198, 182, - 38, 2, 1, 234, 35, 4, 198, 182, 38, 6, 1, 231, 78, 4, 196, 69, 38, 2, 1, - 231, 78, 4, 196, 69, 38, 6, 1, 231, 78, 4, 106, 38, 2, 1, 231, 78, 4, - 106, 38, 6, 1, 231, 78, 4, 82, 102, 38, 2, 1, 231, 78, 4, 82, 102, 38, 6, - 1, 191, 63, 4, 237, 87, 38, 2, 1, 191, 63, 4, 237, 87, 38, 6, 1, 191, 88, - 4, 237, 87, 38, 2, 1, 191, 88, 4, 237, 87, 38, 6, 1, 222, 142, 4, 237, - 87, 38, 2, 1, 222, 142, 4, 237, 87, 38, 6, 1, 222, 142, 4, 81, 106, 38, - 2, 1, 222, 142, 4, 81, 106, 38, 6, 1, 222, 142, 4, 106, 38, 2, 1, 222, - 142, 4, 106, 38, 6, 1, 249, 70, 155, 38, 2, 1, 249, 70, 155, 38, 6, 1, - 234, 104, 4, 237, 87, 38, 2, 1, 234, 104, 4, 237, 87, 38, 6, 34, 234, - 104, 231, 77, 38, 2, 34, 234, 104, 231, 77, 38, 6, 1, 210, 64, 4, 82, - 102, 38, 2, 1, 210, 64, 4, 82, 102, 38, 6, 1, 252, 67, 140, 38, 2, 1, - 252, 67, 140, 38, 6, 1, 234, 23, 4, 237, 87, 38, 2, 1, 234, 23, 4, 237, - 87, 38, 6, 1, 199, 146, 4, 237, 87, 38, 2, 1, 199, 146, 4, 237, 87, 38, - 6, 1, 201, 53, 66, 38, 2, 1, 201, 53, 66, 38, 6, 1, 201, 53, 126, 4, 106, - 38, 2, 1, 201, 53, 126, 4, 106, 38, 6, 1, 230, 105, 4, 237, 87, 38, 2, 1, - 230, 105, 4, 237, 87, 38, 6, 34, 199, 146, 197, 161, 38, 2, 34, 199, 146, - 197, 161, 38, 6, 1, 243, 128, 4, 237, 87, 38, 2, 1, 243, 128, 4, 237, 87, - 38, 6, 1, 243, 128, 4, 81, 106, 38, 2, 1, 243, 128, 4, 81, 106, 38, 6, 1, - 203, 82, 38, 2, 1, 203, 82, 38, 6, 1, 252, 67, 243, 127, 38, 2, 1, 252, - 67, 243, 127, 38, 6, 1, 252, 67, 243, 128, 4, 237, 87, 38, 2, 1, 252, 67, - 243, 128, 4, 237, 87, 38, 1, 210, 179, 38, 6, 1, 191, 63, 4, 248, 36, 38, - 2, 1, 191, 63, 4, 248, 36, 38, 6, 1, 222, 142, 4, 102, 38, 2, 1, 222, - 142, 4, 102, 38, 6, 1, 234, 141, 4, 199, 215, 38, 2, 1, 234, 141, 4, 199, - 215, 38, 6, 1, 234, 104, 4, 102, 38, 2, 1, 234, 104, 4, 102, 38, 6, 1, - 234, 104, 4, 199, 215, 38, 2, 1, 234, 104, 4, 199, 215, 38, 6, 1, 221, - 208, 243, 127, 38, 2, 1, 221, 208, 243, 127, 38, 6, 1, 234, 115, 4, 199, - 215, 38, 2, 1, 234, 115, 4, 199, 215, 38, 2, 1, 210, 179, 38, 6, 1, 42, - 4, 248, 36, 38, 2, 1, 42, 4, 248, 36, 38, 6, 1, 42, 4, 237, 42, 38, 2, 1, - 42, 4, 237, 42, 38, 6, 34, 42, 223, 226, 38, 2, 34, 42, 223, 226, 38, 6, - 1, 223, 227, 4, 248, 36, 38, 2, 1, 223, 227, 4, 248, 36, 38, 6, 1, 205, - 86, 38, 2, 1, 205, 86, 38, 6, 1, 205, 87, 4, 237, 42, 38, 2, 1, 205, 87, - 4, 237, 42, 38, 6, 1, 191, 63, 4, 237, 42, 38, 2, 1, 191, 63, 4, 237, 42, - 38, 6, 1, 191, 88, 4, 237, 42, 38, 2, 1, 191, 88, 4, 237, 42, 38, 6, 1, - 252, 67, 235, 32, 38, 2, 1, 252, 67, 235, 32, 38, 6, 1, 228, 74, 4, 217, - 146, 38, 2, 1, 228, 74, 4, 217, 146, 38, 6, 1, 228, 74, 4, 237, 42, 38, - 2, 1, 228, 74, 4, 237, 42, 38, 6, 1, 187, 4, 237, 42, 38, 2, 1, 187, 4, - 237, 42, 38, 6, 1, 249, 82, 74, 38, 2, 1, 249, 82, 74, 38, 6, 1, 249, 82, - 187, 4, 237, 42, 38, 2, 1, 249, 82, 187, 4, 237, 42, 38, 6, 1, 235, 15, - 4, 237, 42, 38, 2, 1, 235, 15, 4, 237, 42, 38, 6, 1, 126, 4, 217, 146, - 38, 2, 1, 126, 4, 217, 146, 38, 6, 1, 126, 4, 237, 42, 38, 2, 1, 126, 4, - 237, 42, 38, 6, 1, 126, 4, 55, 252, 46, 38, 2, 1, 126, 4, 55, 252, 46, - 38, 6, 1, 243, 128, 4, 237, 42, 38, 2, 1, 243, 128, 4, 237, 42, 38, 6, 1, - 231, 78, 4, 237, 87, 38, 2, 1, 231, 78, 4, 237, 87, 38, 6, 1, 192, 59, 4, - 237, 42, 38, 2, 1, 192, 59, 4, 237, 42, 38, 6, 1, 231, 78, 4, 201, 28, - 23, 102, 38, 2, 1, 231, 78, 4, 201, 28, 23, 102, 38, 6, 1, 230, 105, 4, - 102, 38, 2, 1, 230, 105, 4, 102, 38, 6, 1, 230, 105, 4, 106, 38, 2, 1, - 230, 105, 4, 106, 38, 6, 1, 221, 45, 237, 146, 38, 2, 1, 221, 45, 237, - 146, 38, 6, 1, 221, 45, 236, 192, 38, 2, 1, 221, 45, 236, 192, 38, 6, 1, - 221, 45, 191, 12, 38, 2, 1, 221, 45, 191, 12, 38, 6, 1, 221, 45, 235, 24, - 38, 2, 1, 221, 45, 235, 24, 38, 6, 1, 221, 45, 219, 76, 38, 2, 1, 221, - 45, 219, 76, 38, 6, 1, 221, 45, 213, 150, 38, 2, 1, 221, 45, 213, 150, - 38, 6, 1, 221, 45, 202, 115, 38, 2, 1, 221, 45, 202, 115, 38, 6, 1, 221, - 45, 198, 116, 38, 2, 1, 221, 45, 198, 116, 38, 6, 1, 207, 18, 191, 87, - 38, 2, 1, 207, 18, 191, 87, 38, 6, 1, 234, 141, 4, 102, 38, 2, 1, 234, - 141, 4, 102, 38, 6, 1, 219, 159, 38, 2, 1, 219, 159, 38, 6, 1, 207, 6, - 38, 2, 1, 207, 6, 38, 6, 1, 192, 129, 38, 2, 1, 192, 129, 38, 6, 1, 208, - 96, 38, 2, 1, 208, 96, 38, 6, 1, 193, 125, 38, 2, 1, 193, 125, 38, 6, 1, - 251, 188, 155, 38, 2, 1, 251, 188, 155, 38, 6, 1, 234, 141, 4, 82, 102, - 38, 2, 1, 234, 141, 4, 82, 102, 38, 6, 1, 234, 104, 4, 82, 102, 38, 2, 1, - 234, 104, 4, 82, 102, 38, 6, 1, 210, 64, 4, 237, 87, 38, 2, 1, 210, 64, - 4, 237, 87, 38, 6, 1, 203, 83, 4, 237, 87, 38, 2, 1, 203, 83, 4, 237, 87, - 38, 6, 1, 234, 104, 4, 45, 102, 38, 2, 1, 234, 104, 4, 45, 102, 38, 6, 1, - 235, 16, 38, 2, 1, 235, 16, 38, 6, 1, 237, 195, 38, 2, 1, 237, 195, 38, - 6, 1, 234, 141, 4, 237, 87, 38, 2, 1, 234, 141, 4, 237, 87, 250, 249, 6, - 1, 250, 128, 250, 249, 6, 1, 248, 229, 250, 249, 6, 1, 231, 40, 250, 249, - 6, 1, 238, 32, 250, 249, 6, 1, 234, 195, 250, 249, 6, 1, 191, 123, 250, - 249, 6, 1, 234, 173, 250, 249, 6, 1, 233, 255, 250, 249, 6, 1, 159, 250, - 249, 6, 1, 191, 62, 250, 249, 6, 1, 223, 131, 250, 249, 6, 1, 219, 80, - 250, 249, 6, 1, 192, 212, 250, 249, 6, 1, 247, 160, 250, 249, 6, 1, 221, - 251, 250, 249, 6, 1, 229, 23, 250, 249, 6, 1, 223, 32, 250, 249, 6, 1, - 231, 88, 250, 249, 6, 1, 243, 117, 250, 249, 6, 1, 216, 186, 250, 249, 6, - 1, 192, 33, 250, 249, 6, 1, 212, 253, 250, 249, 6, 1, 203, 165, 250, 249, - 6, 1, 195, 24, 250, 249, 6, 1, 247, 1, 250, 249, 6, 1, 210, 41, 250, 249, - 6, 1, 222, 247, 250, 249, 6, 1, 165, 250, 249, 6, 1, 205, 39, 250, 249, - 6, 1, 195, 74, 250, 249, 6, 1, 198, 119, 250, 249, 6, 1, 207, 71, 250, - 249, 6, 1, 242, 99, 250, 249, 6, 1, 192, 17, 250, 249, 6, 1, 209, 114, - 250, 249, 6, 1, 222, 6, 250, 249, 6, 1, 211, 136, 250, 249, 6, 1, 233, - 46, 250, 249, 52, 1, 45, 132, 206, 188, 250, 249, 251, 49, 250, 249, 234, - 107, 77, 250, 249, 233, 216, 77, 250, 249, 242, 74, 250, 249, 208, 13, - 77, 250, 249, 252, 68, 77, 250, 249, 2, 1, 153, 250, 128, 250, 249, 2, 1, - 250, 128, 250, 249, 2, 1, 248, 229, 250, 249, 2, 1, 231, 40, 250, 249, 2, - 1, 238, 32, 250, 249, 2, 1, 234, 195, 250, 249, 2, 1, 191, 123, 250, 249, - 2, 1, 234, 173, 250, 249, 2, 1, 233, 255, 250, 249, 2, 1, 159, 250, 249, - 2, 1, 191, 62, 250, 249, 2, 1, 223, 131, 250, 249, 2, 1, 219, 80, 250, - 249, 2, 1, 192, 212, 250, 249, 2, 1, 247, 160, 250, 249, 2, 1, 221, 251, - 250, 249, 2, 1, 229, 23, 250, 249, 2, 1, 223, 32, 250, 249, 2, 1, 231, - 88, 250, 249, 2, 1, 243, 117, 250, 249, 2, 1, 216, 186, 250, 249, 2, 1, - 192, 33, 250, 249, 2, 1, 212, 253, 250, 249, 2, 1, 203, 165, 250, 249, 2, - 1, 195, 24, 250, 249, 2, 1, 247, 1, 250, 249, 2, 1, 210, 41, 250, 249, 2, - 1, 222, 247, 250, 249, 2, 1, 165, 250, 249, 2, 1, 205, 39, 250, 249, 2, - 1, 195, 74, 250, 249, 2, 1, 198, 119, 250, 249, 2, 1, 207, 71, 250, 249, - 2, 1, 242, 99, 250, 249, 2, 1, 192, 17, 250, 249, 2, 1, 209, 114, 250, - 249, 2, 1, 222, 6, 250, 249, 2, 1, 211, 136, 250, 249, 2, 1, 233, 46, - 250, 249, 2, 34, 234, 196, 192, 17, 250, 249, 2, 1, 11, 4, 106, 250, 249, - 232, 80, 201, 63, 250, 249, 228, 88, 206, 207, 250, 249, 233, 251, 56, - 219, 223, 250, 249, 233, 251, 56, 250, 249, 235, 110, 56, 136, 252, 61, - 233, 246, 136, 252, 61, 205, 40, 136, 252, 61, 203, 141, 136, 252, 61, - 191, 99, 208, 78, 136, 252, 61, 191, 99, 231, 230, 136, 252, 61, 198, - 134, 136, 252, 61, 207, 15, 136, 252, 61, 191, 97, 136, 252, 61, 210, 97, - 136, 252, 61, 192, 48, 136, 252, 61, 199, 56, 136, 252, 61, 231, 139, - 136, 252, 61, 231, 140, 215, 110, 136, 252, 61, 231, 137, 136, 252, 61, - 208, 80, 210, 130, 136, 252, 61, 199, 103, 231, 158, 136, 252, 61, 210, - 69, 136, 252, 61, 250, 173, 230, 85, 136, 252, 61, 215, 121, 136, 252, - 61, 217, 117, 136, 252, 61, 216, 175, 136, 252, 61, 216, 176, 222, 7, - 136, 252, 61, 237, 222, 136, 252, 61, 208, 91, 136, 252, 61, 199, 103, - 208, 73, 136, 252, 61, 192, 61, 248, 230, 191, 247, 136, 252, 61, 211, - 117, 136, 252, 61, 223, 183, 136, 252, 61, 237, 123, 136, 252, 61, 191, - 19, 136, 87, 217, 34, 243, 10, 136, 209, 62, 203, 85, 136, 209, 62, 230, - 8, 205, 40, 136, 209, 62, 230, 8, 210, 88, 136, 209, 62, 230, 8, 208, 84, - 136, 209, 62, 229, 119, 136, 209, 62, 197, 158, 136, 209, 62, 205, 40, - 136, 209, 62, 210, 88, 136, 209, 62, 208, 84, 136, 209, 62, 229, 7, 136, - 209, 62, 229, 8, 230, 10, 40, 195, 158, 136, 209, 62, 208, 18, 136, 209, - 62, 238, 17, 211, 57, 217, 70, 136, 209, 62, 216, 164, 136, 208, 152, - 217, 67, 136, 209, 62, 207, 161, 136, 208, 152, 210, 99, 136, 209, 62, - 203, 70, 236, 140, 136, 209, 62, 202, 175, 236, 140, 136, 208, 152, 202, - 33, 210, 90, 136, 87, 116, 236, 140, 136, 87, 110, 236, 140, 136, 208, - 152, 212, 131, 230, 84, 136, 209, 62, 208, 85, 208, 78, 136, 1, 251, 192, - 136, 1, 248, 214, 136, 1, 231, 38, 136, 1, 237, 253, 136, 1, 229, 245, - 136, 1, 195, 158, 136, 1, 191, 91, 136, 1, 229, 186, 136, 1, 199, 73, - 136, 1, 191, 250, 136, 1, 53, 222, 106, 136, 1, 222, 106, 136, 1, 220, - 27, 136, 1, 53, 216, 193, 136, 1, 216, 193, 136, 1, 53, 212, 130, 136, 1, - 212, 130, 136, 1, 205, 148, 136, 1, 250, 126, 136, 1, 53, 210, 63, 136, - 1, 210, 63, 136, 1, 53, 197, 163, 136, 1, 197, 163, 136, 1, 208, 42, 136, - 1, 207, 38, 136, 1, 203, 69, 136, 1, 199, 162, 136, 191, 251, 197, 241, + 173, 248, 55, 81, 219, 114, 50, 238, 173, 248, 55, 198, 152, 213, 39, + 201, 248, 223, 95, 233, 218, 77, 247, 26, 56, 209, 10, 56, 238, 172, 56, + 192, 71, 56, 248, 24, 164, 205, 55, 56, 237, 44, 239, 8, 56, 233, 42, + 211, 52, 223, 146, 219, 221, 55, 251, 118, 207, 254, 77, 213, 14, 56, + 202, 33, 228, 90, 207, 79, 56, 217, 148, 237, 127, 56, 209, 82, 56, 200, + 182, 109, 200, 182, 138, 252, 49, 252, 62, 216, 93, 56, 209, 144, 56, 82, + 236, 142, 247, 37, 200, 182, 107, 217, 42, 211, 52, 223, 146, 206, 204, + 55, 251, 118, 207, 254, 77, 193, 246, 232, 120, 91, 208, 24, 193, 246, + 232, 120, 91, 230, 72, 193, 246, 232, 120, 115, 208, 22, 223, 95, 208, + 15, 77, 8, 6, 1, 42, 4, 230, 212, 8, 6, 1, 42, 4, 252, 48, 8, 6, 1, 42, + 4, 243, 3, 8, 6, 1, 42, 4, 198, 152, 8, 6, 1, 42, 4, 237, 44, 8, 6, 1, + 42, 4, 206, 190, 58, 8, 6, 1, 252, 27, 8, 6, 1, 247, 196, 4, 247, 37, 8, + 6, 1, 235, 17, 4, 230, 212, 8, 6, 1, 235, 17, 4, 252, 48, 8, 6, 1, 235, + 17, 4, 243, 3, 8, 6, 1, 235, 17, 4, 237, 44, 8, 6, 1, 228, 76, 4, 230, + 212, 8, 6, 1, 228, 76, 4, 252, 48, 8, 6, 1, 228, 76, 4, 243, 3, 8, 6, 1, + 228, 76, 4, 237, 44, 8, 6, 1, 233, 250, 8, 6, 1, 215, 64, 4, 198, 152, 8, + 6, 1, 187, 4, 230, 212, 8, 6, 1, 187, 4, 252, 48, 8, 6, 1, 187, 4, 243, + 3, 8, 6, 1, 187, 4, 198, 152, 8, 6, 1, 187, 4, 237, 44, 215, 129, 56, 8, + 6, 1, 187, 4, 106, 8, 6, 1, 126, 4, 230, 212, 8, 6, 1, 126, 4, 252, 48, + 8, 6, 1, 126, 4, 243, 3, 8, 6, 1, 126, 4, 237, 44, 8, 6, 1, 192, 160, 4, + 252, 48, 8, 6, 1, 198, 233, 8, 2, 1, 203, 128, 206, 9, 8, 2, 1, 42, 4, + 230, 212, 8, 2, 1, 42, 4, 252, 48, 8, 2, 1, 42, 4, 243, 3, 8, 2, 1, 42, + 4, 198, 152, 8, 2, 1, 42, 4, 237, 44, 8, 2, 1, 42, 4, 206, 190, 58, 8, 2, + 1, 252, 27, 8, 2, 1, 247, 196, 4, 247, 37, 8, 2, 1, 235, 17, 4, 230, 212, + 8, 2, 1, 235, 17, 4, 252, 48, 8, 2, 1, 235, 17, 4, 243, 3, 8, 2, 1, 235, + 17, 4, 237, 44, 8, 2, 1, 228, 76, 4, 230, 212, 8, 2, 1, 228, 76, 4, 252, + 48, 8, 2, 1, 228, 76, 4, 243, 3, 8, 2, 1, 228, 76, 4, 237, 44, 8, 2, 1, + 233, 250, 8, 2, 1, 215, 64, 4, 198, 152, 8, 2, 1, 187, 4, 230, 212, 8, 2, + 1, 187, 4, 252, 48, 8, 2, 1, 187, 4, 243, 3, 8, 2, 1, 187, 4, 198, 152, + 8, 2, 1, 187, 4, 237, 44, 236, 202, 56, 8, 2, 1, 187, 4, 106, 8, 2, 1, + 126, 4, 230, 212, 8, 2, 1, 126, 4, 252, 48, 8, 2, 1, 126, 4, 243, 3, 8, + 2, 1, 126, 4, 237, 44, 8, 2, 1, 192, 160, 4, 252, 48, 8, 2, 1, 198, 233, + 8, 2, 1, 192, 160, 4, 237, 44, 8, 6, 1, 42, 4, 217, 148, 8, 2, 1, 42, 4, + 217, 148, 8, 6, 1, 42, 4, 248, 38, 8, 2, 1, 42, 4, 248, 38, 8, 6, 1, 42, + 4, 211, 140, 8, 2, 1, 42, 4, 211, 140, 8, 6, 1, 247, 196, 4, 252, 48, 8, + 2, 1, 247, 196, 4, 252, 48, 8, 6, 1, 247, 196, 4, 243, 3, 8, 2, 1, 247, + 196, 4, 243, 3, 8, 6, 1, 247, 196, 4, 75, 58, 8, 2, 1, 247, 196, 4, 75, + 58, 8, 6, 1, 247, 196, 4, 247, 94, 8, 2, 1, 247, 196, 4, 247, 94, 8, 6, + 1, 238, 130, 4, 247, 94, 8, 2, 1, 238, 130, 4, 247, 94, 8, 6, 1, 238, + 130, 4, 106, 8, 2, 1, 238, 130, 4, 106, 8, 6, 1, 235, 17, 4, 217, 148, 8, + 2, 1, 235, 17, 4, 217, 148, 8, 6, 1, 235, 17, 4, 248, 38, 8, 2, 1, 235, + 17, 4, 248, 38, 8, 6, 1, 235, 17, 4, 75, 58, 8, 2, 1, 235, 17, 4, 75, 58, + 8, 6, 1, 235, 17, 4, 211, 140, 8, 2, 1, 235, 17, 4, 211, 140, 8, 6, 1, + 235, 17, 4, 247, 94, 8, 2, 1, 235, 17, 4, 247, 94, 8, 6, 1, 232, 54, 4, + 243, 3, 8, 2, 1, 232, 54, 4, 243, 3, 8, 6, 1, 232, 54, 4, 248, 38, 8, 2, + 1, 232, 54, 4, 248, 38, 8, 6, 1, 232, 54, 4, 75, 58, 8, 2, 1, 232, 54, 4, + 75, 58, 8, 6, 1, 232, 54, 4, 247, 37, 8, 2, 1, 232, 54, 4, 247, 37, 8, 6, + 1, 230, 119, 4, 243, 3, 8, 2, 1, 230, 119, 4, 243, 3, 8, 6, 1, 230, 119, + 4, 106, 8, 2, 1, 230, 119, 4, 106, 8, 6, 1, 228, 76, 4, 198, 152, 8, 2, + 1, 228, 76, 4, 198, 152, 8, 6, 1, 228, 76, 4, 217, 148, 8, 2, 1, 228, 76, + 4, 217, 148, 8, 6, 1, 228, 76, 4, 248, 38, 8, 2, 1, 228, 76, 4, 248, 38, + 8, 6, 1, 228, 76, 4, 211, 140, 8, 2, 1, 228, 76, 4, 211, 140, 8, 6, 1, + 228, 76, 4, 75, 58, 8, 2, 1, 236, 141, 68, 8, 6, 34, 223, 199, 8, 2, 34, + 223, 199, 8, 6, 1, 223, 38, 4, 243, 3, 8, 2, 1, 223, 38, 4, 243, 3, 8, 6, + 1, 222, 155, 4, 247, 37, 8, 2, 1, 222, 155, 4, 247, 37, 8, 2, 1, 221, 10, + 8, 6, 1, 220, 145, 4, 252, 48, 8, 2, 1, 220, 145, 4, 252, 48, 8, 6, 1, + 220, 145, 4, 247, 37, 8, 2, 1, 220, 145, 4, 247, 37, 8, 6, 1, 220, 145, + 4, 247, 94, 8, 2, 1, 220, 145, 4, 247, 94, 8, 6, 1, 220, 145, 4, 82, 236, + 142, 8, 2, 1, 220, 145, 4, 82, 236, 142, 8, 6, 1, 220, 145, 4, 106, 8, 2, + 1, 220, 145, 4, 106, 8, 6, 1, 215, 64, 4, 252, 48, 8, 2, 1, 215, 64, 4, + 252, 48, 8, 6, 1, 215, 64, 4, 247, 37, 8, 2, 1, 215, 64, 4, 247, 37, 8, + 6, 1, 215, 64, 4, 247, 94, 8, 2, 1, 215, 64, 4, 247, 94, 8, 2, 1, 215, + 64, 208, 235, 247, 207, 251, 51, 8, 6, 1, 234, 90, 8, 2, 1, 234, 90, 8, + 6, 1, 187, 4, 217, 148, 8, 2, 1, 187, 4, 217, 148, 8, 6, 1, 187, 4, 248, + 38, 8, 2, 1, 187, 4, 248, 38, 8, 6, 1, 187, 4, 55, 252, 48, 8, 2, 1, 187, + 4, 55, 252, 48, 8, 6, 34, 211, 153, 8, 2, 34, 211, 153, 8, 6, 1, 207, + 224, 4, 252, 48, 8, 2, 1, 207, 224, 4, 252, 48, 8, 6, 1, 207, 224, 4, + 247, 37, 8, 2, 1, 207, 224, 4, 247, 37, 8, 6, 1, 207, 224, 4, 247, 94, 8, + 2, 1, 207, 224, 4, 247, 94, 8, 6, 1, 206, 10, 4, 252, 48, 8, 2, 1, 206, + 10, 4, 252, 48, 8, 6, 1, 206, 10, 4, 243, 3, 8, 2, 1, 206, 10, 4, 243, 3, + 8, 6, 1, 206, 10, 4, 247, 37, 8, 2, 1, 206, 10, 4, 247, 37, 8, 6, 1, 206, + 10, 4, 247, 94, 8, 2, 1, 206, 10, 4, 247, 94, 8, 6, 1, 200, 44, 4, 247, + 37, 8, 2, 1, 200, 44, 4, 247, 37, 8, 6, 1, 200, 44, 4, 247, 94, 8, 2, 1, + 200, 44, 4, 247, 94, 8, 6, 1, 200, 44, 4, 106, 8, 2, 1, 200, 44, 4, 106, + 8, 6, 1, 126, 4, 198, 152, 8, 2, 1, 126, 4, 198, 152, 8, 6, 1, 126, 4, + 217, 148, 8, 2, 1, 126, 4, 217, 148, 8, 6, 1, 126, 4, 248, 38, 8, 2, 1, + 126, 4, 248, 38, 8, 6, 1, 126, 4, 206, 190, 58, 8, 2, 1, 126, 4, 206, + 190, 58, 8, 6, 1, 126, 4, 55, 252, 48, 8, 2, 1, 126, 4, 55, 252, 48, 8, + 6, 1, 126, 4, 211, 140, 8, 2, 1, 126, 4, 211, 140, 8, 6, 1, 193, 225, 4, + 243, 3, 8, 2, 1, 193, 225, 4, 243, 3, 8, 6, 1, 192, 160, 4, 243, 3, 8, 2, + 1, 192, 160, 4, 243, 3, 8, 6, 1, 192, 160, 4, 237, 44, 8, 6, 1, 191, 167, + 4, 252, 48, 8, 2, 1, 191, 167, 4, 252, 48, 8, 6, 1, 191, 167, 4, 75, 58, + 8, 2, 1, 191, 167, 4, 75, 58, 8, 6, 1, 191, 167, 4, 247, 94, 8, 2, 1, + 191, 167, 4, 247, 94, 8, 2, 1, 180, 206, 9, 8, 2, 1, 78, 4, 106, 8, 6, 1, + 78, 4, 102, 8, 6, 1, 78, 4, 198, 51, 8, 2, 1, 78, 4, 198, 51, 8, 6, 1, + 163, 169, 8, 2, 1, 163, 169, 8, 6, 1, 211, 79, 74, 8, 6, 1, 247, 196, 4, + 102, 8, 2, 1, 247, 196, 4, 102, 8, 6, 1, 252, 2, 238, 129, 8, 6, 1, 238, + 130, 4, 102, 8, 6, 1, 238, 130, 4, 198, 51, 8, 2, 1, 238, 130, 4, 198, + 51, 8, 2, 1, 154, 237, 108, 8, 6, 1, 207, 19, 71, 8, 6, 1, 205, 87, 8, 6, + 1, 211, 79, 71, 8, 6, 1, 233, 178, 4, 102, 8, 2, 1, 233, 178, 4, 102, 8, + 6, 1, 232, 54, 4, 102, 8, 6, 1, 231, 213, 8, 2, 1, 228, 128, 8, 6, 1, + 223, 85, 8, 6, 1, 228, 76, 4, 106, 8, 6, 1, 222, 155, 4, 102, 8, 2, 1, + 222, 155, 4, 102, 8, 2, 1, 220, 145, 4, 164, 8, 2, 1, 220, 35, 4, 106, 8, + 6, 1, 154, 218, 170, 8, 6, 1, 215, 64, 4, 45, 102, 8, 2, 1, 215, 64, 4, + 180, 50, 219, 214, 8, 6, 1, 187, 4, 82, 198, 152, 8, 6, 1, 187, 4, 228, + 189, 8, 2, 1, 187, 4, 228, 189, 8, 6, 1, 211, 135, 8, 2, 1, 211, 135, 8, + 6, 1, 210, 239, 4, 102, 8, 2, 1, 210, 239, 4, 102, 8, 1, 191, 228, 8, 6, + 1, 163, 109, 8, 2, 1, 163, 109, 8, 6, 1, 234, 14, 8, 1, 207, 19, 234, 15, + 219, 6, 8, 2, 1, 200, 44, 4, 210, 194, 102, 8, 6, 1, 200, 44, 4, 102, 8, + 2, 1, 200, 44, 4, 102, 8, 6, 1, 200, 44, 4, 207, 25, 102, 8, 6, 1, 126, + 4, 228, 189, 8, 2, 1, 126, 4, 228, 189, 8, 6, 1, 196, 70, 8, 6, 1, 196, + 13, 4, 102, 8, 6, 1, 192, 160, 4, 102, 8, 2, 1, 192, 160, 4, 102, 8, 6, + 1, 191, 167, 4, 106, 8, 2, 1, 191, 167, 4, 106, 8, 6, 1, 233, 180, 8, 6, + 1, 233, 181, 207, 18, 8, 2, 1, 233, 181, 207, 18, 8, 2, 1, 233, 181, 4, + 199, 215, 8, 1, 105, 4, 106, 8, 6, 1, 163, 150, 8, 2, 1, 163, 150, 8, 1, + 223, 95, 231, 13, 201, 65, 4, 106, 8, 1, 192, 238, 8, 1, 237, 100, 242, + 233, 8, 1, 220, 5, 242, 233, 8, 1, 251, 152, 242, 233, 8, 1, 207, 25, + 242, 233, 8, 6, 1, 235, 39, 4, 247, 94, 8, 6, 1, 238, 130, 4, 2, 1, 191, + 167, 4, 247, 94, 8, 2, 1, 235, 39, 4, 247, 94, 8, 6, 1, 219, 79, 8, 6, 1, + 220, 145, 4, 2, 1, 223, 37, 8, 2, 1, 219, 79, 8, 6, 1, 213, 160, 8, 6, 1, + 215, 64, 4, 2, 1, 223, 37, 8, 2, 1, 213, 160, 8, 6, 1, 42, 4, 247, 94, 8, + 2, 1, 42, 4, 247, 94, 8, 6, 1, 228, 76, 4, 247, 94, 8, 2, 1, 228, 76, 4, + 247, 94, 8, 6, 1, 187, 4, 247, 94, 8, 2, 1, 187, 4, 247, 94, 8, 6, 1, + 126, 4, 247, 94, 8, 2, 1, 126, 4, 247, 94, 8, 6, 1, 126, 4, 237, 45, 23, + 217, 148, 8, 2, 1, 126, 4, 237, 45, 23, 217, 148, 8, 6, 1, 126, 4, 237, + 45, 23, 252, 48, 8, 2, 1, 126, 4, 237, 45, 23, 252, 48, 8, 6, 1, 126, 4, + 237, 45, 23, 247, 94, 8, 2, 1, 126, 4, 237, 45, 23, 247, 94, 8, 6, 1, + 126, 4, 237, 45, 23, 230, 212, 8, 2, 1, 126, 4, 237, 45, 23, 230, 212, 8, + 2, 1, 154, 71, 8, 6, 1, 42, 4, 237, 45, 23, 217, 148, 8, 2, 1, 42, 4, + 237, 45, 23, 217, 148, 8, 6, 1, 42, 4, 75, 93, 23, 217, 148, 8, 2, 1, 42, + 4, 75, 93, 23, 217, 148, 8, 6, 1, 252, 28, 4, 217, 148, 8, 2, 1, 252, 28, + 4, 217, 148, 8, 6, 1, 232, 54, 4, 106, 8, 2, 1, 232, 54, 4, 106, 8, 6, 1, + 232, 54, 4, 247, 94, 8, 2, 1, 232, 54, 4, 247, 94, 8, 6, 1, 222, 155, 4, + 247, 94, 8, 2, 1, 222, 155, 4, 247, 94, 8, 6, 1, 187, 4, 211, 140, 8, 2, + 1, 187, 4, 211, 140, 8, 6, 1, 187, 4, 211, 141, 23, 217, 148, 8, 2, 1, + 187, 4, 211, 141, 23, 217, 148, 8, 6, 1, 233, 181, 4, 247, 94, 8, 2, 1, + 233, 181, 4, 247, 94, 8, 2, 1, 223, 38, 4, 247, 94, 8, 6, 1, 235, 38, 8, + 6, 1, 238, 130, 4, 2, 1, 191, 166, 8, 2, 1, 235, 38, 8, 6, 1, 232, 54, 4, + 252, 48, 8, 2, 1, 232, 54, 4, 252, 48, 8, 6, 1, 228, 125, 8, 6, 1, 192, + 238, 8, 6, 1, 215, 64, 4, 230, 212, 8, 2, 1, 215, 64, 4, 230, 212, 8, 6, + 1, 42, 4, 206, 190, 93, 23, 252, 48, 8, 2, 1, 42, 4, 206, 190, 93, 23, + 252, 48, 8, 6, 1, 252, 28, 4, 252, 48, 8, 2, 1, 252, 28, 4, 252, 48, 8, + 6, 1, 187, 4, 201, 29, 23, 252, 48, 8, 2, 1, 187, 4, 201, 29, 23, 252, + 48, 8, 6, 1, 42, 4, 55, 230, 212, 8, 2, 1, 42, 4, 55, 230, 212, 8, 6, 1, + 42, 4, 223, 95, 248, 38, 8, 2, 1, 42, 4, 223, 95, 248, 38, 8, 6, 1, 235, + 17, 4, 55, 230, 212, 8, 2, 1, 235, 17, 4, 55, 230, 212, 8, 6, 1, 235, 17, + 4, 223, 95, 248, 38, 8, 2, 1, 235, 17, 4, 223, 95, 248, 38, 8, 6, 1, 228, + 76, 4, 55, 230, 212, 8, 2, 1, 228, 76, 4, 55, 230, 212, 8, 6, 1, 228, 76, + 4, 223, 95, 248, 38, 8, 2, 1, 228, 76, 4, 223, 95, 248, 38, 8, 6, 1, 187, + 4, 55, 230, 212, 8, 2, 1, 187, 4, 55, 230, 212, 8, 6, 1, 187, 4, 223, 95, + 248, 38, 8, 2, 1, 187, 4, 223, 95, 248, 38, 8, 6, 1, 207, 224, 4, 55, + 230, 212, 8, 2, 1, 207, 224, 4, 55, 230, 212, 8, 6, 1, 207, 224, 4, 223, + 95, 248, 38, 8, 2, 1, 207, 224, 4, 223, 95, 248, 38, 8, 6, 1, 126, 4, 55, + 230, 212, 8, 2, 1, 126, 4, 55, 230, 212, 8, 6, 1, 126, 4, 223, 95, 248, + 38, 8, 2, 1, 126, 4, 223, 95, 248, 38, 8, 6, 1, 206, 10, 4, 242, 77, 60, + 8, 2, 1, 206, 10, 4, 242, 77, 60, 8, 6, 1, 200, 44, 4, 242, 77, 60, 8, 2, + 1, 200, 44, 4, 242, 77, 60, 8, 6, 1, 191, 248, 8, 2, 1, 191, 248, 8, 6, + 1, 230, 119, 4, 247, 94, 8, 2, 1, 230, 119, 4, 247, 94, 8, 6, 1, 215, 64, + 4, 180, 50, 219, 214, 8, 2, 1, 238, 130, 4, 238, 177, 8, 6, 1, 211, 21, + 8, 2, 1, 211, 21, 8, 6, 1, 191, 167, 4, 102, 8, 2, 1, 191, 167, 4, 102, + 8, 6, 1, 42, 4, 75, 58, 8, 2, 1, 42, 4, 75, 58, 8, 6, 1, 235, 17, 4, 247, + 37, 8, 2, 1, 235, 17, 4, 247, 37, 8, 6, 1, 187, 4, 237, 45, 23, 217, 148, + 8, 2, 1, 187, 4, 237, 45, 23, 217, 148, 8, 6, 1, 187, 4, 198, 153, 23, + 217, 148, 8, 2, 1, 187, 4, 198, 153, 23, 217, 148, 8, 6, 1, 187, 4, 75, + 58, 8, 2, 1, 187, 4, 75, 58, 8, 6, 1, 187, 4, 75, 93, 23, 217, 148, 8, 2, + 1, 187, 4, 75, 93, 23, 217, 148, 8, 6, 1, 192, 160, 4, 217, 148, 8, 2, 1, + 192, 160, 4, 217, 148, 8, 2, 1, 220, 145, 4, 238, 177, 8, 2, 1, 215, 64, + 4, 238, 177, 8, 2, 1, 200, 44, 4, 238, 177, 8, 2, 1, 236, 141, 223, 37, + 8, 2, 1, 237, 203, 237, 4, 8, 2, 1, 208, 36, 237, 4, 8, 6, 1, 42, 4, 106, + 8, 6, 1, 247, 196, 4, 106, 8, 2, 1, 247, 196, 4, 106, 8, 6, 1, 220, 145, + 4, 164, 8, 6, 1, 200, 44, 4, 237, 41, 106, 8, 2, 1, 206, 10, 4, 200, 146, + 199, 215, 8, 2, 1, 191, 167, 4, 200, 146, 199, 215, 8, 6, 1, 231, 13, + 201, 64, 8, 2, 1, 231, 13, 201, 64, 8, 6, 1, 78, 4, 106, 8, 6, 1, 126, + 164, 8, 6, 1, 154, 196, 12, 8, 6, 1, 235, 17, 4, 106, 8, 2, 1, 235, 17, + 4, 106, 8, 6, 1, 223, 38, 4, 106, 8, 2, 1, 223, 38, 4, 106, 8, 6, 1, 2, + 208, 107, 4, 228, 253, 199, 215, 8, 2, 1, 208, 107, 4, 228, 253, 199, + 215, 8, 6, 1, 207, 224, 4, 106, 8, 2, 1, 207, 224, 4, 106, 8, 6, 1, 192, + 160, 4, 106, 8, 2, 1, 192, 160, 4, 106, 8, 2, 1, 154, 65, 8, 2, 1, 251, + 162, 8, 2, 1, 154, 251, 162, 8, 2, 1, 78, 4, 102, 8, 2, 1, 211, 79, 74, + 8, 2, 1, 247, 196, 4, 238, 177, 8, 2, 1, 238, 130, 4, 199, 215, 8, 2, 1, + 238, 130, 4, 102, 8, 2, 1, 207, 19, 71, 8, 2, 1, 205, 87, 8, 2, 1, 205, + 88, 4, 102, 8, 2, 1, 211, 79, 71, 8, 2, 1, 207, 19, 211, 79, 71, 8, 2, 1, + 207, 19, 211, 79, 235, 17, 4, 102, 8, 2, 1, 242, 221, 207, 19, 211, 79, + 71, 8, 2, 1, 236, 141, 223, 38, 4, 106, 8, 2, 1, 232, 54, 4, 102, 8, 2, + 1, 27, 232, 53, 8, 1, 2, 6, 232, 53, 8, 2, 1, 231, 213, 8, 2, 1, 207, + 142, 228, 189, 8, 2, 1, 154, 230, 118, 8, 2, 1, 230, 119, 4, 102, 8, 2, + 1, 229, 199, 4, 102, 8, 2, 1, 228, 76, 4, 106, 8, 2, 1, 223, 85, 8, 1, 2, + 6, 68, 8, 2, 1, 220, 145, 4, 82, 198, 152, 8, 2, 1, 220, 145, 4, 248, + 233, 8, 2, 1, 220, 145, 4, 207, 25, 102, 8, 2, 1, 219, 164, 8, 2, 1, 154, + 218, 170, 8, 2, 1, 154, 218, 171, 4, 180, 219, 214, 8, 2, 1, 218, 171, 4, + 102, 8, 2, 1, 215, 64, 4, 45, 102, 8, 2, 1, 215, 64, 4, 207, 25, 102, 8, + 1, 2, 6, 215, 63, 8, 2, 1, 249, 84, 74, 8, 1, 2, 6, 211, 153, 8, 2, 1, + 242, 221, 211, 112, 8, 2, 1, 209, 213, 8, 2, 1, 154, 146, 8, 2, 1, 154, + 207, 224, 4, 180, 219, 214, 8, 2, 1, 154, 207, 224, 4, 102, 8, 2, 1, 207, + 224, 4, 180, 219, 214, 8, 2, 1, 207, 224, 4, 199, 215, 8, 2, 1, 207, 224, + 4, 232, 235, 8, 2, 1, 207, 19, 207, 224, 4, 232, 235, 8, 1, 2, 6, 146, 8, + 1, 2, 6, 223, 95, 146, 8, 2, 1, 206, 10, 4, 102, 8, 2, 1, 234, 14, 8, 2, + 1, 236, 141, 223, 38, 4, 201, 29, 23, 102, 8, 2, 1, 201, 188, 207, 19, + 234, 14, 8, 2, 1, 234, 15, 4, 238, 177, 8, 2, 1, 154, 200, 43, 8, 2, 1, + 200, 44, 4, 207, 25, 102, 8, 2, 1, 126, 164, 8, 2, 1, 196, 70, 8, 2, 1, + 196, 13, 4, 102, 8, 2, 1, 154, 196, 12, 8, 2, 1, 154, 193, 224, 8, 2, 1, + 154, 192, 159, 8, 1, 2, 6, 192, 159, 8, 2, 1, 191, 167, 4, 207, 25, 102, + 8, 2, 1, 191, 167, 4, 238, 177, 8, 2, 1, 233, 180, 8, 2, 1, 233, 181, 4, + 238, 177, 8, 1, 231, 13, 201, 64, 8, 1, 209, 221, 195, 20, 232, 106, 8, + 1, 223, 95, 231, 13, 201, 64, 8, 1, 201, 37, 247, 195, 8, 1, 248, 174, + 242, 233, 8, 1, 2, 6, 250, 122, 8, 2, 1, 242, 221, 211, 79, 71, 8, 1, 2, + 6, 232, 54, 4, 102, 8, 1, 2, 6, 230, 118, 8, 2, 1, 223, 38, 4, 238, 214, + 8, 2, 1, 154, 222, 154, 8, 1, 2, 6, 172, 8, 2, 1, 208, 107, 4, 102, 8, 1, + 231, 13, 201, 65, 4, 106, 8, 1, 207, 19, 231, 13, 201, 65, 4, 106, 8, 2, + 1, 235, 39, 237, 4, 8, 2, 1, 237, 72, 237, 4, 8, 2, 1, 235, 39, 237, 5, + 4, 238, 177, 8, 2, 1, 197, 170, 237, 4, 8, 2, 1, 199, 79, 237, 4, 8, 2, + 1, 199, 152, 237, 5, 4, 238, 177, 8, 2, 1, 233, 39, 237, 4, 8, 2, 1, 218, + 229, 237, 4, 8, 2, 1, 218, 172, 237, 4, 8, 1, 248, 174, 210, 14, 8, 1, + 248, 182, 210, 14, 8, 2, 1, 154, 230, 119, 4, 232, 235, 8, 2, 1, 154, + 230, 119, 4, 232, 236, 23, 199, 215, 52, 1, 2, 230, 118, 52, 1, 2, 230, + 119, 4, 102, 52, 1, 2, 223, 37, 52, 1, 2, 146, 52, 1, 2, 154, 146, 52, 1, + 2, 154, 207, 224, 4, 102, 52, 1, 2, 6, 223, 95, 146, 52, 1, 2, 193, 224, + 52, 1, 2, 192, 159, 52, 1, 208, 217, 52, 1, 55, 208, 217, 52, 1, 154, + 242, 76, 52, 1, 251, 51, 52, 1, 207, 19, 242, 76, 52, 1, 50, 132, 206, + 189, 52, 1, 45, 132, 206, 189, 52, 1, 231, 13, 201, 64, 52, 1, 207, 19, + 231, 13, 201, 64, 52, 1, 45, 250, 237, 52, 1, 50, 250, 237, 52, 1, 133, + 250, 237, 52, 1, 144, 250, 237, 52, 1, 243, 4, 252, 62, 247, 94, 52, 1, + 81, 219, 114, 52, 1, 217, 148, 52, 1, 252, 49, 252, 62, 52, 1, 230, 213, + 252, 62, 52, 1, 130, 81, 219, 114, 52, 1, 130, 217, 148, 52, 1, 130, 230, + 213, 252, 62, 52, 1, 130, 252, 49, 252, 62, 52, 1, 197, 238, 242, 85, 52, + 1, 132, 197, 238, 242, 85, 52, 1, 247, 22, 50, 132, 206, 189, 52, 1, 247, + 22, 45, 132, 206, 189, 52, 1, 133, 199, 228, 52, 1, 144, 199, 228, 52, 1, + 108, 56, 52, 1, 216, 37, 56, 248, 38, 75, 58, 206, 190, 58, 211, 140, 2, + 198, 152, 55, 252, 49, 252, 62, 52, 1, 207, 3, 102, 52, 1, 238, 220, 252, + 62, 52, 1, 2, 231, 213, 52, 1, 2, 172, 52, 1, 2, 206, 9, 52, 1, 2, 192, + 235, 52, 1, 2, 207, 19, 231, 13, 201, 64, 52, 1, 233, 202, 163, 164, 52, + 1, 137, 163, 164, 52, 1, 216, 89, 163, 164, 52, 1, 130, 163, 164, 52, 1, + 233, 201, 163, 164, 52, 1, 192, 22, 237, 97, 163, 77, 52, 1, 192, 107, + 237, 97, 163, 77, 52, 1, 195, 18, 52, 1, 196, 109, 52, 1, 55, 251, 51, + 52, 1, 130, 144, 250, 237, 52, 1, 130, 133, 250, 237, 52, 1, 130, 45, + 250, 237, 52, 1, 130, 50, 250, 237, 52, 1, 130, 206, 189, 52, 1, 82, 230, + 213, 252, 62, 52, 1, 82, 55, 230, 213, 252, 62, 52, 1, 82, 55, 252, 49, + 252, 62, 52, 1, 130, 198, 152, 52, 1, 207, 149, 242, 85, 52, 1, 248, 251, + 137, 198, 79, 52, 1, 234, 97, 137, 198, 79, 52, 1, 248, 251, 130, 198, + 79, 52, 1, 234, 97, 130, 198, 79, 52, 1, 203, 105, 52, 1, 211, 79, 203, + 105, 52, 1, 130, 45, 57, 33, 230, 213, 252, 62, 33, 252, 49, 252, 62, 33, + 243, 4, 252, 62, 33, 198, 152, 33, 217, 148, 33, 211, 0, 33, 248, 38, 33, + 75, 58, 33, 237, 44, 33, 228, 253, 58, 33, 206, 190, 58, 33, 55, 252, 49, + 252, 62, 33, 247, 94, 33, 81, 219, 115, 58, 33, 55, 81, 219, 115, 58, 33, + 55, 230, 213, 252, 62, 33, 247, 121, 33, 223, 95, 248, 38, 33, 154, 242, + 77, 58, 33, 242, 77, 58, 33, 207, 19, 242, 77, 58, 33, 242, 77, 93, 179, + 33, 230, 213, 252, 63, 60, 33, 252, 49, 252, 63, 60, 33, 45, 199, 229, + 60, 33, 50, 199, 229, 60, 33, 45, 251, 118, 58, 33, 228, 189, 33, 45, + 132, 206, 190, 60, 33, 133, 199, 229, 60, 33, 144, 199, 229, 60, 33, 108, + 3, 60, 33, 216, 37, 3, 60, 33, 210, 192, 228, 253, 60, 33, 207, 25, 228, + 253, 60, 33, 75, 60, 33, 237, 45, 60, 33, 206, 190, 60, 33, 242, 77, 60, + 33, 247, 37, 33, 211, 140, 33, 81, 219, 115, 60, 33, 248, 31, 60, 33, + 223, 95, 55, 251, 17, 60, 33, 247, 95, 60, 33, 243, 4, 252, 63, 60, 33, + 248, 39, 60, 33, 223, 95, 248, 39, 60, 33, 198, 153, 60, 33, 217, 149, + 60, 33, 130, 219, 114, 33, 55, 130, 219, 114, 33, 198, 153, 211, 1, 33, + 203, 41, 201, 29, 211, 1, 33, 180, 201, 29, 211, 1, 33, 203, 41, 202, 25, + 211, 1, 33, 180, 202, 25, 211, 1, 33, 50, 132, 206, 190, 60, 33, 223, 95, + 248, 31, 60, 33, 51, 60, 33, 205, 63, 60, 33, 192, 236, 58, 33, 81, 198, + 152, 33, 55, 211, 0, 33, 230, 213, 163, 77, 33, 252, 49, 163, 77, 33, 35, + 210, 6, 33, 35, 221, 32, 33, 35, 237, 38, 198, 60, 33, 35, 191, 233, 33, + 248, 31, 58, 33, 234, 45, 3, 60, 33, 55, 81, 219, 115, 60, 33, 45, 251, + 118, 60, 33, 213, 14, 198, 153, 58, 33, 229, 3, 58, 33, 251, 167, 234, + 47, 119, 58, 33, 45, 50, 64, 60, 33, 196, 66, 64, 60, 33, 230, 219, 222, + 198, 33, 50, 250, 238, 58, 33, 45, 132, 206, 190, 58, 33, 233, 36, 33, + 192, 236, 60, 33, 45, 250, 238, 60, 33, 50, 250, 238, 60, 33, 50, 250, + 238, 23, 133, 250, 238, 60, 33, 50, 132, 206, 190, 58, 33, 75, 93, 179, + 33, 250, 196, 60, 33, 55, 206, 190, 60, 33, 191, 21, 58, 33, 55, 248, 39, + 60, 33, 55, 248, 38, 33, 55, 217, 148, 33, 55, 217, 149, 60, 33, 55, 198, + 152, 33, 55, 223, 95, 248, 38, 33, 55, 96, 64, 60, 33, 8, 2, 1, 65, 33, + 8, 2, 1, 71, 33, 8, 2, 1, 68, 33, 8, 2, 1, 74, 33, 8, 2, 1, 66, 33, 8, 2, + 1, 247, 195, 33, 8, 2, 1, 238, 129, 33, 8, 2, 1, 230, 118, 33, 8, 2, 1, + 218, 170, 33, 8, 2, 1, 146, 33, 8, 2, 1, 200, 43, 33, 8, 2, 1, 196, 12, + 33, 8, 2, 1, 192, 235, 35, 6, 1, 229, 187, 35, 2, 1, 229, 187, 35, 6, 1, + 251, 16, 205, 146, 35, 2, 1, 251, 16, 205, 146, 35, 212, 136, 56, 35, + 110, 212, 136, 56, 35, 6, 1, 210, 173, 237, 12, 35, 2, 1, 210, 173, 237, + 12, 35, 191, 233, 35, 2, 207, 19, 218, 208, 202, 198, 113, 35, 2, 235, + 140, 218, 208, 202, 198, 113, 35, 2, 207, 19, 235, 140, 218, 208, 202, + 198, 113, 35, 208, 15, 77, 35, 6, 1, 191, 240, 35, 198, 60, 35, 237, 38, + 198, 60, 35, 6, 1, 251, 163, 4, 198, 60, 35, 251, 96, 199, 108, 35, 6, 1, + 234, 50, 4, 198, 60, 35, 6, 1, 234, 0, 4, 198, 60, 35, 6, 1, 223, 86, 4, + 198, 60, 35, 6, 1, 211, 110, 4, 198, 60, 35, 6, 1, 196, 71, 4, 198, 60, + 35, 6, 1, 211, 113, 4, 198, 60, 35, 2, 1, 223, 86, 4, 237, 38, 23, 198, + 60, 35, 6, 1, 251, 162, 35, 6, 1, 248, 214, 35, 6, 1, 231, 213, 35, 6, 1, + 237, 108, 35, 6, 1, 234, 49, 35, 6, 1, 191, 76, 35, 6, 1, 233, 255, 35, + 6, 1, 199, 15, 35, 6, 1, 223, 85, 35, 6, 1, 222, 74, 35, 6, 1, 220, 33, + 35, 6, 1, 215, 157, 35, 6, 1, 212, 180, 35, 6, 1, 192, 207, 35, 6, 1, + 211, 109, 35, 6, 1, 209, 187, 35, 6, 1, 207, 4, 35, 6, 1, 202, 197, 35, + 6, 1, 199, 166, 35, 6, 1, 196, 70, 35, 6, 1, 209, 213, 35, 6, 1, 243, 97, + 35, 6, 1, 208, 178, 35, 6, 1, 211, 112, 35, 6, 1, 223, 86, 4, 237, 37, + 35, 6, 1, 196, 71, 4, 237, 37, 35, 2, 1, 251, 163, 4, 198, 60, 35, 2, 1, + 234, 50, 4, 198, 60, 35, 2, 1, 234, 0, 4, 198, 60, 35, 2, 1, 223, 86, 4, + 198, 60, 35, 2, 1, 196, 71, 4, 237, 38, 23, 198, 60, 35, 2, 1, 251, 162, + 35, 2, 1, 248, 214, 35, 2, 1, 231, 213, 35, 2, 1, 237, 108, 35, 2, 1, + 234, 49, 35, 2, 1, 191, 76, 35, 2, 1, 233, 255, 35, 2, 1, 199, 15, 35, 2, + 1, 223, 85, 35, 2, 1, 222, 74, 35, 2, 1, 220, 33, 35, 2, 1, 215, 157, 35, + 2, 1, 212, 180, 35, 2, 1, 192, 207, 35, 2, 1, 211, 109, 35, 2, 1, 209, + 187, 35, 2, 1, 207, 4, 35, 2, 1, 53, 202, 197, 35, 2, 1, 202, 197, 35, 2, + 1, 199, 166, 35, 2, 1, 196, 70, 35, 2, 1, 209, 213, 35, 2, 1, 243, 97, + 35, 2, 1, 208, 178, 35, 2, 1, 211, 112, 35, 2, 1, 223, 86, 4, 237, 37, + 35, 2, 1, 196, 71, 4, 237, 37, 35, 2, 1, 211, 110, 4, 198, 60, 35, 2, 1, + 196, 71, 4, 198, 60, 35, 2, 1, 211, 113, 4, 198, 60, 35, 6, 222, 105, + 113, 35, 248, 215, 113, 35, 199, 16, 113, 35, 196, 71, 4, 228, 253, 113, + 35, 196, 71, 4, 252, 49, 23, 228, 253, 113, 35, 196, 71, 4, 237, 45, 23, + 228, 253, 113, 35, 209, 214, 113, 35, 209, 188, 113, 35, 222, 105, 113, + 35, 1, 251, 16, 221, 37, 35, 2, 1, 251, 16, 221, 37, 35, 1, 201, 74, 35, + 2, 1, 201, 74, 35, 1, 237, 12, 35, 2, 1, 237, 12, 35, 1, 221, 37, 35, 2, + 1, 221, 37, 35, 1, 205, 146, 35, 2, 1, 205, 146, 94, 6, 1, 203, 106, 94, + 2, 1, 203, 106, 94, 6, 1, 233, 46, 94, 2, 1, 233, 46, 94, 6, 1, 221, 197, + 94, 2, 1, 221, 197, 94, 6, 1, 228, 244, 94, 2, 1, 228, 244, 94, 6, 1, + 231, 208, 94, 2, 1, 231, 208, 94, 6, 1, 203, 72, 94, 2, 1, 203, 72, 94, + 6, 1, 237, 124, 94, 2, 1, 237, 124, 35, 222, 75, 113, 35, 207, 5, 113, + 35, 218, 208, 202, 198, 113, 35, 1, 191, 240, 35, 6, 199, 16, 113, 35, + 218, 208, 234, 50, 113, 35, 207, 19, 218, 208, 234, 50, 113, 35, 6, 1, + 203, 57, 35, 2, 1, 203, 57, 35, 6, 218, 208, 202, 198, 113, 35, 6, 1, + 205, 143, 35, 2, 1, 205, 143, 35, 207, 5, 4, 201, 29, 113, 35, 6, 207, + 19, 218, 208, 202, 198, 113, 35, 6, 235, 140, 218, 208, 202, 198, 113, + 35, 6, 207, 19, 235, 140, 218, 208, 202, 198, 113, 38, 6, 1, 223, 229, 4, + 230, 212, 38, 6, 1, 223, 90, 38, 6, 1, 236, 194, 38, 6, 1, 231, 22, 38, + 6, 1, 196, 125, 223, 228, 38, 6, 1, 235, 34, 38, 6, 1, 247, 205, 68, 38, + 6, 1, 192, 33, 38, 6, 1, 223, 12, 38, 6, 1, 219, 78, 38, 6, 1, 213, 152, + 38, 6, 1, 197, 155, 38, 6, 1, 221, 105, 38, 6, 1, 228, 76, 4, 230, 212, + 38, 6, 1, 203, 41, 66, 38, 6, 1, 235, 30, 38, 6, 1, 65, 38, 6, 1, 249, + 19, 38, 6, 1, 195, 153, 38, 6, 1, 231, 79, 38, 6, 1, 237, 148, 38, 6, 1, + 223, 228, 38, 6, 1, 191, 62, 38, 6, 1, 191, 87, 38, 6, 1, 68, 38, 6, 1, + 203, 41, 68, 38, 6, 1, 155, 38, 6, 1, 234, 142, 38, 6, 1, 234, 116, 38, + 6, 1, 234, 105, 38, 6, 1, 74, 38, 6, 1, 210, 65, 38, 6, 1, 234, 36, 38, + 6, 1, 234, 24, 38, 6, 1, 199, 145, 38, 6, 1, 66, 38, 6, 1, 234, 183, 38, + 6, 1, 140, 38, 6, 1, 197, 161, 38, 6, 1, 243, 129, 38, 6, 1, 203, 166, + 38, 6, 1, 203, 117, 38, 6, 1, 230, 19, 56, 38, 6, 1, 192, 58, 38, 6, 1, + 202, 33, 56, 38, 6, 1, 71, 38, 6, 1, 191, 225, 38, 6, 1, 170, 38, 2, 1, + 65, 38, 2, 1, 249, 19, 38, 2, 1, 195, 153, 38, 2, 1, 231, 79, 38, 2, 1, + 237, 148, 38, 2, 1, 223, 228, 38, 2, 1, 191, 62, 38, 2, 1, 191, 87, 38, + 2, 1, 68, 38, 2, 1, 203, 41, 68, 38, 2, 1, 155, 38, 2, 1, 234, 142, 38, + 2, 1, 234, 116, 38, 2, 1, 234, 105, 38, 2, 1, 74, 38, 2, 1, 210, 65, 38, + 2, 1, 234, 36, 38, 2, 1, 234, 24, 38, 2, 1, 199, 145, 38, 2, 1, 66, 38, + 2, 1, 234, 183, 38, 2, 1, 140, 38, 2, 1, 197, 161, 38, 2, 1, 243, 129, + 38, 2, 1, 203, 166, 38, 2, 1, 203, 117, 38, 2, 1, 230, 19, 56, 38, 2, 1, + 192, 58, 38, 2, 1, 202, 33, 56, 38, 2, 1, 71, 38, 2, 1, 191, 225, 38, 2, + 1, 170, 38, 2, 1, 223, 229, 4, 230, 212, 38, 2, 1, 223, 90, 38, 2, 1, + 236, 194, 38, 2, 1, 231, 22, 38, 2, 1, 196, 125, 223, 228, 38, 2, 1, 235, + 34, 38, 2, 1, 247, 205, 68, 38, 2, 1, 192, 33, 38, 2, 1, 223, 12, 38, 2, + 1, 219, 78, 38, 2, 1, 213, 152, 38, 2, 1, 197, 155, 38, 2, 1, 221, 105, + 38, 2, 1, 228, 76, 4, 230, 212, 38, 2, 1, 203, 41, 66, 38, 2, 1, 235, 30, + 38, 6, 1, 211, 112, 38, 2, 1, 211, 112, 38, 6, 1, 192, 95, 38, 2, 1, 192, + 95, 38, 6, 1, 223, 83, 71, 38, 2, 1, 223, 83, 71, 38, 6, 1, 219, 85, 191, + 190, 38, 2, 1, 219, 85, 191, 190, 38, 6, 1, 223, 83, 219, 85, 191, 190, + 38, 2, 1, 223, 83, 219, 85, 191, 190, 38, 6, 1, 248, 177, 191, 190, 38, + 2, 1, 248, 177, 191, 190, 38, 6, 1, 223, 83, 248, 177, 191, 190, 38, 2, + 1, 223, 83, 248, 177, 191, 190, 38, 6, 1, 220, 250, 38, 2, 1, 220, 250, + 38, 6, 1, 208, 178, 38, 2, 1, 208, 178, 38, 6, 1, 232, 230, 38, 2, 1, + 232, 230, 38, 6, 1, 223, 39, 38, 2, 1, 223, 39, 38, 6, 1, 223, 40, 4, 55, + 230, 213, 252, 62, 38, 2, 1, 223, 40, 4, 55, 230, 213, 252, 62, 38, 6, 1, + 196, 128, 38, 2, 1, 196, 128, 38, 6, 1, 206, 116, 211, 112, 38, 2, 1, + 206, 116, 211, 112, 38, 6, 1, 211, 113, 4, 198, 122, 38, 2, 1, 211, 113, + 4, 198, 122, 38, 6, 1, 211, 32, 38, 2, 1, 211, 32, 38, 6, 1, 221, 37, 38, + 2, 1, 221, 37, 38, 198, 229, 56, 33, 38, 198, 122, 33, 38, 210, 193, 33, + 38, 237, 215, 209, 77, 33, 38, 208, 172, 209, 77, 33, 38, 209, 56, 33, + 38, 228, 143, 198, 229, 56, 33, 38, 216, 50, 56, 38, 6, 1, 203, 41, 228, + 76, 4, 199, 215, 38, 2, 1, 203, 41, 228, 76, 4, 199, 215, 38, 6, 1, 204, + 22, 56, 38, 2, 1, 204, 22, 56, 38, 6, 1, 234, 37, 4, 198, 182, 38, 2, 1, + 234, 37, 4, 198, 182, 38, 6, 1, 231, 80, 4, 196, 69, 38, 2, 1, 231, 80, + 4, 196, 69, 38, 6, 1, 231, 80, 4, 106, 38, 2, 1, 231, 80, 4, 106, 38, 6, + 1, 231, 80, 4, 82, 102, 38, 2, 1, 231, 80, 4, 82, 102, 38, 6, 1, 191, 63, + 4, 237, 89, 38, 2, 1, 191, 63, 4, 237, 89, 38, 6, 1, 191, 88, 4, 237, 89, + 38, 2, 1, 191, 88, 4, 237, 89, 38, 6, 1, 222, 144, 4, 237, 89, 38, 2, 1, + 222, 144, 4, 237, 89, 38, 6, 1, 222, 144, 4, 81, 106, 38, 2, 1, 222, 144, + 4, 81, 106, 38, 6, 1, 222, 144, 4, 106, 38, 2, 1, 222, 144, 4, 106, 38, + 6, 1, 249, 72, 155, 38, 2, 1, 249, 72, 155, 38, 6, 1, 234, 106, 4, 237, + 89, 38, 2, 1, 234, 106, 4, 237, 89, 38, 6, 34, 234, 106, 231, 79, 38, 2, + 34, 234, 106, 231, 79, 38, 6, 1, 210, 66, 4, 82, 102, 38, 2, 1, 210, 66, + 4, 82, 102, 38, 6, 1, 252, 69, 140, 38, 2, 1, 252, 69, 140, 38, 6, 1, + 234, 25, 4, 237, 89, 38, 2, 1, 234, 25, 4, 237, 89, 38, 6, 1, 199, 146, + 4, 237, 89, 38, 2, 1, 199, 146, 4, 237, 89, 38, 6, 1, 201, 54, 66, 38, 2, + 1, 201, 54, 66, 38, 6, 1, 201, 54, 126, 4, 106, 38, 2, 1, 201, 54, 126, + 4, 106, 38, 6, 1, 230, 107, 4, 237, 89, 38, 2, 1, 230, 107, 4, 237, 89, + 38, 6, 34, 199, 146, 197, 161, 38, 2, 34, 199, 146, 197, 161, 38, 6, 1, + 243, 130, 4, 237, 89, 38, 2, 1, 243, 130, 4, 237, 89, 38, 6, 1, 243, 130, + 4, 81, 106, 38, 2, 1, 243, 130, 4, 81, 106, 38, 6, 1, 203, 83, 38, 2, 1, + 203, 83, 38, 6, 1, 252, 69, 243, 129, 38, 2, 1, 252, 69, 243, 129, 38, 6, + 1, 252, 69, 243, 130, 4, 237, 89, 38, 2, 1, 252, 69, 243, 130, 4, 237, + 89, 38, 1, 210, 181, 38, 6, 1, 191, 63, 4, 248, 38, 38, 2, 1, 191, 63, 4, + 248, 38, 38, 6, 1, 222, 144, 4, 102, 38, 2, 1, 222, 144, 4, 102, 38, 6, + 1, 234, 143, 4, 199, 215, 38, 2, 1, 234, 143, 4, 199, 215, 38, 6, 1, 234, + 106, 4, 102, 38, 2, 1, 234, 106, 4, 102, 38, 6, 1, 234, 106, 4, 199, 215, + 38, 2, 1, 234, 106, 4, 199, 215, 38, 6, 1, 221, 210, 243, 129, 38, 2, 1, + 221, 210, 243, 129, 38, 6, 1, 234, 117, 4, 199, 215, 38, 2, 1, 234, 117, + 4, 199, 215, 38, 2, 1, 210, 181, 38, 6, 1, 42, 4, 248, 38, 38, 2, 1, 42, + 4, 248, 38, 38, 6, 1, 42, 4, 237, 44, 38, 2, 1, 42, 4, 237, 44, 38, 6, + 34, 42, 223, 228, 38, 2, 34, 42, 223, 228, 38, 6, 1, 223, 229, 4, 248, + 38, 38, 2, 1, 223, 229, 4, 248, 38, 38, 6, 1, 205, 87, 38, 2, 1, 205, 87, + 38, 6, 1, 205, 88, 4, 237, 44, 38, 2, 1, 205, 88, 4, 237, 44, 38, 6, 1, + 191, 63, 4, 237, 44, 38, 2, 1, 191, 63, 4, 237, 44, 38, 6, 1, 191, 88, 4, + 237, 44, 38, 2, 1, 191, 88, 4, 237, 44, 38, 6, 1, 252, 69, 235, 34, 38, + 2, 1, 252, 69, 235, 34, 38, 6, 1, 228, 76, 4, 217, 148, 38, 2, 1, 228, + 76, 4, 217, 148, 38, 6, 1, 228, 76, 4, 237, 44, 38, 2, 1, 228, 76, 4, + 237, 44, 38, 6, 1, 187, 4, 237, 44, 38, 2, 1, 187, 4, 237, 44, 38, 6, 1, + 249, 84, 74, 38, 2, 1, 249, 84, 74, 38, 6, 1, 249, 84, 187, 4, 237, 44, + 38, 2, 1, 249, 84, 187, 4, 237, 44, 38, 6, 1, 235, 17, 4, 237, 44, 38, 2, + 1, 235, 17, 4, 237, 44, 38, 6, 1, 126, 4, 217, 148, 38, 2, 1, 126, 4, + 217, 148, 38, 6, 1, 126, 4, 237, 44, 38, 2, 1, 126, 4, 237, 44, 38, 6, 1, + 126, 4, 55, 252, 48, 38, 2, 1, 126, 4, 55, 252, 48, 38, 6, 1, 243, 130, + 4, 237, 44, 38, 2, 1, 243, 130, 4, 237, 44, 38, 6, 1, 231, 80, 4, 237, + 89, 38, 2, 1, 231, 80, 4, 237, 89, 38, 6, 1, 192, 59, 4, 237, 44, 38, 2, + 1, 192, 59, 4, 237, 44, 38, 6, 1, 231, 80, 4, 201, 29, 23, 102, 38, 2, 1, + 231, 80, 4, 201, 29, 23, 102, 38, 6, 1, 230, 107, 4, 102, 38, 2, 1, 230, + 107, 4, 102, 38, 6, 1, 230, 107, 4, 106, 38, 2, 1, 230, 107, 4, 106, 38, + 6, 1, 221, 47, 237, 148, 38, 2, 1, 221, 47, 237, 148, 38, 6, 1, 221, 47, + 236, 194, 38, 2, 1, 221, 47, 236, 194, 38, 6, 1, 221, 47, 191, 12, 38, 2, + 1, 221, 47, 191, 12, 38, 6, 1, 221, 47, 235, 26, 38, 2, 1, 221, 47, 235, + 26, 38, 6, 1, 221, 47, 219, 78, 38, 2, 1, 221, 47, 219, 78, 38, 6, 1, + 221, 47, 213, 152, 38, 2, 1, 221, 47, 213, 152, 38, 6, 1, 221, 47, 202, + 116, 38, 2, 1, 221, 47, 202, 116, 38, 6, 1, 221, 47, 198, 116, 38, 2, 1, + 221, 47, 198, 116, 38, 6, 1, 207, 19, 191, 87, 38, 2, 1, 207, 19, 191, + 87, 38, 6, 1, 234, 143, 4, 102, 38, 2, 1, 234, 143, 4, 102, 38, 6, 1, + 219, 161, 38, 2, 1, 219, 161, 38, 6, 1, 207, 7, 38, 2, 1, 207, 7, 38, 6, + 1, 192, 129, 38, 2, 1, 192, 129, 38, 6, 1, 208, 98, 38, 2, 1, 208, 98, + 38, 6, 1, 193, 125, 38, 2, 1, 193, 125, 38, 6, 1, 251, 190, 155, 38, 2, + 1, 251, 190, 155, 38, 6, 1, 234, 143, 4, 82, 102, 38, 2, 1, 234, 143, 4, + 82, 102, 38, 6, 1, 234, 106, 4, 82, 102, 38, 2, 1, 234, 106, 4, 82, 102, + 38, 6, 1, 210, 66, 4, 237, 89, 38, 2, 1, 210, 66, 4, 237, 89, 38, 6, 1, + 203, 84, 4, 237, 89, 38, 2, 1, 203, 84, 4, 237, 89, 38, 6, 1, 234, 106, + 4, 45, 102, 38, 2, 1, 234, 106, 4, 45, 102, 38, 6, 1, 235, 18, 38, 2, 1, + 235, 18, 38, 6, 1, 237, 197, 38, 2, 1, 237, 197, 38, 6, 1, 234, 143, 4, + 237, 89, 38, 2, 1, 234, 143, 4, 237, 89, 250, 251, 6, 1, 250, 130, 250, + 251, 6, 1, 248, 231, 250, 251, 6, 1, 231, 42, 250, 251, 6, 1, 238, 34, + 250, 251, 6, 1, 234, 197, 250, 251, 6, 1, 191, 123, 250, 251, 6, 1, 234, + 175, 250, 251, 6, 1, 234, 1, 250, 251, 6, 1, 159, 250, 251, 6, 1, 191, + 62, 250, 251, 6, 1, 223, 133, 250, 251, 6, 1, 219, 82, 250, 251, 6, 1, + 192, 212, 250, 251, 6, 1, 247, 162, 250, 251, 6, 1, 221, 253, 250, 251, + 6, 1, 229, 25, 250, 251, 6, 1, 223, 34, 250, 251, 6, 1, 231, 90, 250, + 251, 6, 1, 243, 119, 250, 251, 6, 1, 216, 188, 250, 251, 6, 1, 192, 33, + 250, 251, 6, 1, 212, 255, 250, 251, 6, 1, 203, 166, 250, 251, 6, 1, 195, + 24, 250, 251, 6, 1, 247, 3, 250, 251, 6, 1, 210, 43, 250, 251, 6, 1, 222, + 249, 250, 251, 6, 1, 165, 250, 251, 6, 1, 205, 40, 250, 251, 6, 1, 195, + 74, 250, 251, 6, 1, 198, 119, 250, 251, 6, 1, 207, 72, 250, 251, 6, 1, + 242, 101, 250, 251, 6, 1, 192, 17, 250, 251, 6, 1, 209, 116, 250, 251, 6, + 1, 222, 8, 250, 251, 6, 1, 211, 138, 250, 251, 6, 1, 233, 48, 250, 251, + 52, 1, 45, 132, 206, 189, 250, 251, 251, 51, 250, 251, 234, 109, 77, 250, + 251, 233, 218, 77, 250, 251, 242, 76, 250, 251, 208, 15, 77, 250, 251, + 252, 70, 77, 250, 251, 2, 1, 154, 250, 130, 250, 251, 2, 1, 250, 130, + 250, 251, 2, 1, 248, 231, 250, 251, 2, 1, 231, 42, 250, 251, 2, 1, 238, + 34, 250, 251, 2, 1, 234, 197, 250, 251, 2, 1, 191, 123, 250, 251, 2, 1, + 234, 175, 250, 251, 2, 1, 234, 1, 250, 251, 2, 1, 159, 250, 251, 2, 1, + 191, 62, 250, 251, 2, 1, 223, 133, 250, 251, 2, 1, 219, 82, 250, 251, 2, + 1, 192, 212, 250, 251, 2, 1, 247, 162, 250, 251, 2, 1, 221, 253, 250, + 251, 2, 1, 229, 25, 250, 251, 2, 1, 223, 34, 250, 251, 2, 1, 231, 90, + 250, 251, 2, 1, 243, 119, 250, 251, 2, 1, 216, 188, 250, 251, 2, 1, 192, + 33, 250, 251, 2, 1, 212, 255, 250, 251, 2, 1, 203, 166, 250, 251, 2, 1, + 195, 24, 250, 251, 2, 1, 247, 3, 250, 251, 2, 1, 210, 43, 250, 251, 2, 1, + 222, 249, 250, 251, 2, 1, 165, 250, 251, 2, 1, 205, 40, 250, 251, 2, 1, + 195, 74, 250, 251, 2, 1, 198, 119, 250, 251, 2, 1, 207, 72, 250, 251, 2, + 1, 242, 101, 250, 251, 2, 1, 192, 17, 250, 251, 2, 1, 209, 116, 250, 251, + 2, 1, 222, 8, 250, 251, 2, 1, 211, 138, 250, 251, 2, 1, 233, 48, 250, + 251, 2, 34, 234, 198, 192, 17, 250, 251, 2, 1, 11, 4, 106, 250, 251, 232, + 82, 201, 64, 250, 251, 228, 90, 206, 208, 250, 251, 233, 253, 56, 219, + 225, 250, 251, 233, 253, 56, 250, 251, 235, 112, 56, 136, 252, 63, 233, + 248, 136, 252, 63, 205, 41, 136, 252, 63, 203, 142, 136, 252, 63, 191, + 99, 208, 80, 136, 252, 63, 191, 99, 231, 232, 136, 252, 63, 198, 134, + 136, 252, 63, 207, 16, 136, 252, 63, 191, 97, 136, 252, 63, 210, 99, 136, + 252, 63, 192, 48, 136, 252, 63, 199, 56, 136, 252, 63, 231, 141, 136, + 252, 63, 231, 142, 215, 112, 136, 252, 63, 231, 139, 136, 252, 63, 208, + 82, 210, 132, 136, 252, 63, 199, 103, 231, 160, 136, 252, 63, 210, 71, + 136, 252, 63, 250, 175, 230, 87, 136, 252, 63, 215, 123, 136, 252, 63, + 217, 119, 136, 252, 63, 216, 177, 136, 252, 63, 216, 178, 222, 9, 136, + 252, 63, 237, 224, 136, 252, 63, 208, 93, 136, 252, 63, 199, 103, 208, + 75, 136, 252, 63, 192, 61, 248, 232, 191, 247, 136, 252, 63, 211, 119, + 136, 252, 63, 223, 185, 136, 252, 63, 237, 125, 136, 252, 63, 191, 19, + 136, 87, 217, 36, 243, 12, 136, 209, 64, 203, 86, 136, 209, 64, 230, 10, + 205, 41, 136, 209, 64, 230, 10, 210, 90, 136, 209, 64, 230, 10, 208, 86, + 136, 209, 64, 229, 121, 136, 209, 64, 197, 158, 136, 209, 64, 205, 41, + 136, 209, 64, 210, 90, 136, 209, 64, 208, 86, 136, 209, 64, 229, 9, 136, + 209, 64, 229, 10, 230, 12, 40, 195, 158, 136, 209, 64, 208, 20, 136, 209, + 64, 238, 19, 211, 59, 217, 72, 136, 209, 64, 216, 166, 136, 208, 154, + 217, 69, 136, 209, 64, 207, 163, 136, 208, 154, 210, 101, 136, 209, 64, + 203, 71, 236, 142, 136, 209, 64, 202, 176, 236, 142, 136, 208, 154, 202, + 34, 210, 92, 136, 87, 116, 236, 142, 136, 87, 110, 236, 142, 136, 208, + 154, 212, 133, 230, 86, 136, 209, 64, 208, 87, 208, 80, 136, 1, 251, 194, + 136, 1, 248, 216, 136, 1, 231, 40, 136, 1, 237, 255, 136, 1, 229, 247, + 136, 1, 195, 158, 136, 1, 191, 91, 136, 1, 229, 188, 136, 1, 199, 73, + 136, 1, 191, 250, 136, 1, 53, 222, 108, 136, 1, 222, 108, 136, 1, 220, + 29, 136, 1, 53, 216, 195, 136, 1, 216, 195, 136, 1, 53, 212, 132, 136, 1, + 212, 132, 136, 1, 205, 149, 136, 1, 250, 128, 136, 1, 53, 210, 65, 136, + 1, 210, 65, 136, 1, 53, 197, 163, 136, 1, 197, 163, 136, 1, 208, 44, 136, + 1, 207, 39, 136, 1, 203, 70, 136, 1, 199, 162, 136, 191, 251, 197, 241, 136, 34, 192, 31, 55, 195, 158, 136, 34, 192, 31, 195, 159, 191, 250, - 136, 34, 192, 31, 55, 191, 250, 136, 208, 152, 231, 139, 136, 208, 152, - 231, 137, 9, 31, 56, 9, 3, 205, 141, 9, 232, 157, 217, 51, 9, 3, 205, - 187, 9, 3, 205, 144, 9, 31, 87, 58, 251, 28, 238, 191, 206, 128, 251, 28, - 232, 121, 206, 128, 9, 207, 122, 251, 28, 210, 14, 216, 50, 56, 251, 28, - 210, 14, 199, 96, 198, 230, 56, 252, 2, 56, 9, 242, 74, 9, 237, 209, 204, - 10, 9, 209, 64, 195, 137, 56, 9, 3, 216, 25, 9, 3, 205, 161, 251, 199, - 193, 149, 9, 3, 251, 199, 250, 198, 9, 3, 207, 157, 251, 198, 9, 3, 207, - 167, 251, 170, 251, 105, 9, 3, 199, 206, 9, 2, 137, 199, 219, 9, 2, 137, - 34, 131, 4, 220, 36, 4, 192, 75, 9, 2, 137, 191, 113, 9, 2, 233, 70, 9, - 2, 237, 245, 9, 2, 222, 52, 9, 204, 25, 9, 1, 77, 9, 234, 95, 79, 199, - 54, 77, 9, 197, 225, 75, 208, 152, 77, 9, 208, 13, 77, 9, 1, 222, 56, - 192, 75, 9, 1, 230, 57, 9, 1, 131, 4, 217, 142, 58, 9, 1, 131, 4, 230, - 58, 58, 9, 1, 193, 134, 4, 230, 58, 58, 9, 1, 131, 4, 230, 58, 60, 9, 1, - 99, 4, 230, 58, 58, 9, 1, 251, 192, 9, 1, 248, 245, 9, 1, 199, 115, 217, - 62, 9, 1, 199, 114, 9, 1, 199, 29, 9, 1, 223, 6, 9, 1, 230, 81, 9, 1, - 221, 210, 9, 1, 238, 3, 9, 1, 199, 41, 9, 1, 207, 71, 9, 1, 191, 113, 9, - 1, 205, 46, 9, 1, 203, 109, 9, 1, 205, 192, 9, 1, 238, 26, 9, 1, 199, - 219, 9, 1, 191, 116, 9, 1, 251, 230, 9, 1, 231, 86, 9, 1, 222, 5, 4, 105, - 185, 58, 9, 1, 222, 5, 4, 115, 185, 60, 9, 1, 233, 74, 99, 4, 223, 93, - 196, 12, 9, 1, 233, 74, 99, 4, 105, 185, 58, 9, 1, 233, 74, 99, 4, 115, - 185, 58, 9, 199, 168, 9, 1, 233, 46, 9, 1, 208, 89, 9, 1, 222, 106, 9, 1, - 220, 35, 9, 1, 216, 208, 9, 1, 213, 24, 9, 1, 229, 210, 9, 1, 193, 133, - 9, 1, 131, 217, 99, 9, 1, 192, 75, 9, 233, 68, 9, 237, 243, 9, 222, 50, - 9, 233, 70, 9, 237, 245, 9, 222, 52, 9, 203, 155, 9, 200, 206, 9, 217, - 140, 58, 9, 230, 58, 58, 9, 230, 58, 60, 9, 200, 230, 251, 192, 9, 223, - 93, 237, 245, 9, 87, 213, 25, 231, 57, 9, 190, 237, 9, 18, 3, 2, 196, 13, - 58, 9, 18, 3, 223, 93, 2, 196, 13, 58, 9, 18, 3, 75, 60, 9, 207, 18, 237, - 245, 9, 233, 71, 4, 105, 236, 138, 9, 193, 135, 230, 58, 60, 251, 28, 17, - 191, 77, 251, 28, 17, 107, 251, 28, 17, 109, 251, 28, 17, 138, 251, 28, - 17, 134, 251, 28, 17, 149, 251, 28, 17, 169, 251, 28, 17, 175, 251, 28, - 17, 171, 251, 28, 17, 178, 9, 210, 13, 56, 9, 237, 138, 204, 10, 9, 198, - 229, 204, 10, 9, 232, 226, 209, 60, 201, 102, 9, 1, 236, 139, 248, 245, - 9, 1, 236, 139, 208, 89, 9, 1, 200, 182, 251, 192, 9, 1, 131, 193, 150, - 9, 1, 131, 4, 193, 135, 230, 58, 58, 9, 1, 131, 4, 193, 135, 230, 58, 60, - 9, 1, 137, 230, 57, 9, 1, 137, 230, 58, 251, 192, 9, 1, 137, 230, 58, - 193, 133, 9, 1, 126, 4, 230, 58, 58, 9, 1, 137, 230, 58, 192, 75, 9, 1, - 197, 124, 9, 1, 197, 122, 9, 1, 248, 255, 9, 1, 199, 115, 4, 206, 188, 9, - 1, 199, 115, 4, 115, 185, 93, 235, 118, 9, 1, 210, 41, 9, 1, 199, 112, 9, - 1, 248, 243, 9, 1, 182, 4, 230, 58, 58, 9, 1, 182, 4, 105, 185, 81, 58, - 9, 1, 212, 87, 9, 1, 235, 41, 9, 1, 182, 4, 115, 185, 58, 9, 1, 199, 149, - 9, 1, 199, 147, 9, 1, 237, 186, 9, 1, 238, 4, 4, 206, 188, 9, 1, 238, 4, - 4, 75, 60, 9, 1, 238, 4, 4, 75, 248, 233, 23, 2, 199, 219, 9, 1, 238, 10, - 9, 1, 237, 188, 9, 1, 235, 78, 9, 1, 238, 4, 4, 115, 185, 93, 235, 118, - 9, 1, 238, 4, 4, 232, 128, 185, 58, 9, 1, 206, 101, 9, 1, 207, 72, 4, 2, - 196, 12, 9, 1, 207, 72, 4, 206, 188, 9, 1, 207, 72, 4, 75, 60, 9, 1, 207, - 72, 4, 2, 196, 13, 60, 9, 1, 207, 72, 4, 75, 248, 233, 23, 75, 58, 9, 1, - 207, 72, 4, 105, 185, 58, 9, 1, 223, 3, 9, 1, 207, 72, 4, 232, 128, 185, - 58, 9, 1, 205, 47, 4, 75, 248, 233, 23, 75, 58, 9, 1, 205, 47, 4, 115, - 185, 60, 9, 1, 205, 47, 4, 115, 185, 248, 233, 23, 115, 185, 58, 9, 1, - 205, 193, 4, 105, 185, 60, 9, 1, 205, 193, 4, 115, 185, 58, 9, 1, 199, - 220, 4, 115, 185, 58, 9, 1, 251, 231, 4, 115, 185, 58, 9, 1, 236, 139, - 233, 46, 9, 1, 233, 47, 4, 75, 215, 177, 60, 9, 1, 233, 47, 4, 75, 60, 9, - 1, 195, 146, 9, 1, 233, 47, 4, 115, 185, 60, 9, 1, 210, 39, 9, 1, 208, - 90, 4, 75, 58, 9, 1, 208, 90, 4, 115, 185, 58, 9, 1, 222, 4, 9, 1, 200, - 146, 222, 106, 9, 1, 222, 107, 4, 206, 188, 9, 1, 222, 107, 4, 75, 58, 9, - 1, 214, 70, 9, 1, 222, 107, 4, 115, 185, 60, 9, 1, 231, 227, 9, 1, 231, - 228, 4, 206, 188, 9, 1, 213, 247, 9, 1, 231, 228, 4, 105, 185, 60, 9, 1, - 230, 166, 9, 1, 231, 228, 4, 115, 185, 58, 9, 1, 220, 36, 4, 2, 196, 12, - 9, 1, 220, 36, 4, 75, 58, 9, 1, 220, 36, 4, 115, 185, 58, 9, 1, 220, 36, - 4, 115, 185, 60, 9, 1, 213, 25, 4, 75, 60, 9, 1, 213, 25, 231, 57, 9, 1, - 206, 165, 9, 1, 213, 25, 4, 206, 188, 9, 1, 213, 25, 4, 115, 185, 58, 9, - 1, 229, 211, 236, 170, 9, 1, 199, 150, 4, 75, 58, 9, 1, 229, 211, 4, 99, - 58, 9, 1, 229, 211, 231, 0, 9, 1, 229, 211, 231, 1, 4, 230, 58, 58, 9, 1, - 199, 115, 217, 63, 231, 0, 9, 1, 193, 134, 4, 206, 188, 9, 1, 221, 132, - 211, 151, 9, 1, 211, 151, 9, 1, 66, 9, 1, 191, 225, 9, 1, 221, 132, 191, - 225, 9, 1, 193, 134, 4, 105, 185, 58, 9, 1, 195, 153, 9, 1, 233, 74, 192, + 136, 34, 192, 31, 55, 191, 250, 136, 208, 154, 231, 141, 136, 208, 154, + 231, 139, 9, 31, 56, 9, 3, 205, 142, 9, 232, 159, 217, 53, 9, 3, 205, + 188, 9, 3, 205, 145, 9, 31, 87, 58, 251, 30, 238, 193, 206, 129, 251, 30, + 232, 123, 206, 129, 9, 207, 124, 251, 30, 210, 16, 216, 52, 56, 251, 30, + 210, 16, 199, 96, 198, 230, 56, 252, 4, 56, 9, 242, 76, 9, 237, 211, 204, + 11, 9, 209, 66, 195, 137, 56, 9, 3, 216, 27, 9, 3, 205, 162, 251, 201, + 193, 149, 9, 3, 251, 201, 250, 200, 9, 3, 207, 159, 251, 200, 9, 3, 207, + 169, 251, 172, 251, 107, 9, 3, 199, 206, 9, 2, 137, 199, 219, 9, 2, 137, + 34, 131, 4, 220, 38, 4, 192, 75, 9, 2, 137, 191, 113, 9, 2, 233, 72, 9, + 2, 237, 247, 9, 2, 222, 54, 9, 204, 26, 9, 1, 77, 9, 234, 97, 79, 199, + 54, 77, 9, 197, 225, 75, 208, 154, 77, 9, 208, 15, 77, 9, 1, 222, 58, + 192, 75, 9, 1, 230, 59, 9, 1, 131, 4, 217, 144, 58, 9, 1, 131, 4, 230, + 60, 58, 9, 1, 193, 134, 4, 230, 60, 58, 9, 1, 131, 4, 230, 60, 60, 9, 1, + 99, 4, 230, 60, 58, 9, 1, 251, 194, 9, 1, 248, 247, 9, 1, 199, 115, 217, + 64, 9, 1, 199, 114, 9, 1, 199, 29, 9, 1, 223, 8, 9, 1, 230, 83, 9, 1, + 221, 212, 9, 1, 238, 5, 9, 1, 199, 41, 9, 1, 207, 72, 9, 1, 191, 113, 9, + 1, 205, 47, 9, 1, 203, 110, 9, 1, 205, 193, 9, 1, 238, 28, 9, 1, 199, + 219, 9, 1, 191, 116, 9, 1, 251, 232, 9, 1, 231, 88, 9, 1, 222, 7, 4, 105, + 185, 58, 9, 1, 222, 7, 4, 115, 185, 60, 9, 1, 233, 76, 99, 4, 223, 95, + 196, 12, 9, 1, 233, 76, 99, 4, 105, 185, 58, 9, 1, 233, 76, 99, 4, 115, + 185, 58, 9, 199, 168, 9, 1, 233, 48, 9, 1, 208, 91, 9, 1, 222, 108, 9, 1, + 220, 37, 9, 1, 216, 210, 9, 1, 213, 26, 9, 1, 229, 212, 9, 1, 193, 133, + 9, 1, 131, 217, 101, 9, 1, 192, 75, 9, 233, 70, 9, 237, 245, 9, 222, 52, + 9, 233, 72, 9, 237, 247, 9, 222, 54, 9, 203, 156, 9, 200, 206, 9, 217, + 142, 58, 9, 230, 60, 58, 9, 230, 60, 60, 9, 200, 231, 251, 194, 9, 223, + 95, 237, 247, 9, 87, 213, 27, 231, 59, 9, 190, 237, 9, 18, 3, 2, 196, 13, + 58, 9, 18, 3, 223, 95, 2, 196, 13, 58, 9, 18, 3, 75, 60, 9, 207, 19, 237, + 247, 9, 233, 73, 4, 105, 236, 140, 9, 193, 135, 230, 60, 60, 251, 30, 17, + 191, 77, 251, 30, 17, 107, 251, 30, 17, 109, 251, 30, 17, 138, 251, 30, + 17, 134, 251, 30, 17, 150, 251, 30, 17, 169, 251, 30, 17, 175, 251, 30, + 17, 171, 251, 30, 17, 178, 9, 210, 15, 56, 9, 237, 140, 204, 11, 9, 198, + 229, 204, 11, 9, 232, 228, 209, 62, 201, 103, 9, 1, 236, 141, 248, 247, + 9, 1, 236, 141, 208, 91, 9, 1, 200, 182, 251, 194, 9, 1, 131, 193, 150, + 9, 1, 131, 4, 193, 135, 230, 60, 58, 9, 1, 131, 4, 193, 135, 230, 60, 60, + 9, 1, 137, 230, 59, 9, 1, 137, 230, 60, 251, 194, 9, 1, 137, 230, 60, + 193, 133, 9, 1, 126, 4, 230, 60, 58, 9, 1, 137, 230, 60, 192, 75, 9, 1, + 197, 124, 9, 1, 197, 122, 9, 1, 249, 1, 9, 1, 199, 115, 4, 206, 189, 9, + 1, 199, 115, 4, 115, 185, 93, 235, 120, 9, 1, 210, 43, 9, 1, 199, 112, 9, + 1, 248, 245, 9, 1, 183, 4, 230, 60, 58, 9, 1, 183, 4, 105, 185, 81, 58, + 9, 1, 212, 89, 9, 1, 235, 43, 9, 1, 183, 4, 115, 185, 58, 9, 1, 199, 149, + 9, 1, 199, 147, 9, 1, 237, 188, 9, 1, 238, 6, 4, 206, 189, 9, 1, 238, 6, + 4, 75, 60, 9, 1, 238, 6, 4, 75, 248, 235, 23, 2, 199, 219, 9, 1, 238, 12, + 9, 1, 237, 190, 9, 1, 235, 80, 9, 1, 238, 6, 4, 115, 185, 93, 235, 120, + 9, 1, 238, 6, 4, 232, 130, 185, 58, 9, 1, 206, 102, 9, 1, 207, 73, 4, 2, + 196, 12, 9, 1, 207, 73, 4, 206, 189, 9, 1, 207, 73, 4, 75, 60, 9, 1, 207, + 73, 4, 2, 196, 13, 60, 9, 1, 207, 73, 4, 75, 248, 235, 23, 75, 58, 9, 1, + 207, 73, 4, 105, 185, 58, 9, 1, 223, 5, 9, 1, 207, 73, 4, 232, 130, 185, + 58, 9, 1, 205, 48, 4, 75, 248, 235, 23, 75, 58, 9, 1, 205, 48, 4, 115, + 185, 60, 9, 1, 205, 48, 4, 115, 185, 248, 235, 23, 115, 185, 58, 9, 1, + 205, 194, 4, 105, 185, 60, 9, 1, 205, 194, 4, 115, 185, 58, 9, 1, 199, + 220, 4, 115, 185, 58, 9, 1, 251, 233, 4, 115, 185, 58, 9, 1, 236, 141, + 233, 48, 9, 1, 233, 49, 4, 75, 215, 179, 60, 9, 1, 233, 49, 4, 75, 60, 9, + 1, 195, 146, 9, 1, 233, 49, 4, 115, 185, 60, 9, 1, 210, 41, 9, 1, 208, + 92, 4, 75, 58, 9, 1, 208, 92, 4, 115, 185, 58, 9, 1, 222, 6, 9, 1, 200, + 146, 222, 108, 9, 1, 222, 109, 4, 206, 189, 9, 1, 222, 109, 4, 75, 58, 9, + 1, 214, 72, 9, 1, 222, 109, 4, 115, 185, 60, 9, 1, 231, 229, 9, 1, 231, + 230, 4, 206, 189, 9, 1, 213, 249, 9, 1, 231, 230, 4, 105, 185, 60, 9, 1, + 230, 168, 9, 1, 231, 230, 4, 115, 185, 58, 9, 1, 220, 38, 4, 2, 196, 12, + 9, 1, 220, 38, 4, 75, 58, 9, 1, 220, 38, 4, 115, 185, 58, 9, 1, 220, 38, + 4, 115, 185, 60, 9, 1, 213, 27, 4, 75, 60, 9, 1, 213, 27, 231, 59, 9, 1, + 206, 166, 9, 1, 213, 27, 4, 206, 189, 9, 1, 213, 27, 4, 115, 185, 58, 9, + 1, 229, 213, 236, 172, 9, 1, 199, 150, 4, 75, 58, 9, 1, 229, 213, 4, 99, + 58, 9, 1, 229, 213, 231, 2, 9, 1, 229, 213, 231, 3, 4, 230, 60, 58, 9, 1, + 199, 115, 217, 65, 231, 2, 9, 1, 193, 134, 4, 206, 189, 9, 1, 221, 134, + 211, 153, 9, 1, 211, 153, 9, 1, 66, 9, 1, 191, 225, 9, 1, 221, 134, 191, + 225, 9, 1, 193, 134, 4, 105, 185, 58, 9, 1, 195, 153, 9, 1, 233, 76, 192, 75, 9, 1, 99, 4, 199, 215, 9, 1, 99, 4, 2, 196, 12, 9, 1, 193, 134, 4, - 75, 58, 9, 1, 71, 9, 1, 99, 4, 115, 185, 60, 9, 1, 99, 249, 80, 9, 1, 99, - 249, 81, 4, 230, 58, 58, 9, 232, 80, 201, 63, 9, 1, 252, 25, 9, 2, 137, - 34, 205, 193, 4, 220, 36, 4, 131, 217, 99, 9, 2, 137, 34, 208, 90, 4, - 220, 36, 4, 131, 217, 99, 9, 2, 137, 92, 89, 20, 9, 2, 137, 220, 36, 251, - 192, 9, 2, 137, 223, 6, 9, 2, 137, 115, 236, 138, 9, 2, 137, 205, 46, 9, - 234, 95, 79, 250, 130, 9, 201, 98, 79, 206, 60, 234, 141, 229, 114, 9, 2, - 137, 206, 113, 191, 77, 9, 2, 137, 196, 73, 207, 91, 191, 77, 9, 2, 137, - 236, 139, 229, 236, 79, 221, 210, 9, 2, 137, 92, 76, 20, 9, 2, 130, 205, - 46, 9, 2, 137, 217, 141, 9, 2, 193, 133, 9, 2, 192, 75, 9, 2, 137, 192, - 75, 9, 2, 137, 213, 24, 9, 209, 108, 79, 205, 177, 9, 234, 105, 247, 22, - 130, 201, 63, 9, 234, 105, 247, 22, 137, 201, 63, 9, 206, 113, 137, 201, - 64, 4, 233, 4, 247, 21, 9, 2, 130, 216, 208, 9, 1, 238, 4, 4, 223, 93, - 196, 12, 9, 1, 207, 72, 4, 223, 93, 196, 12, 233, 205, 251, 28, 17, 191, - 77, 233, 205, 251, 28, 17, 107, 233, 205, 251, 28, 17, 109, 233, 205, - 251, 28, 17, 138, 233, 205, 251, 28, 17, 134, 233, 205, 251, 28, 17, 149, - 233, 205, 251, 28, 17, 169, 233, 205, 251, 28, 17, 175, 233, 205, 251, - 28, 17, 171, 233, 205, 251, 28, 17, 178, 9, 1, 203, 110, 4, 75, 60, 9, 1, - 238, 27, 4, 75, 60, 9, 1, 231, 87, 4, 75, 60, 9, 3, 202, 173, 251, 137, - 9, 3, 202, 173, 209, 16, 216, 186, 9, 1, 229, 211, 4, 223, 93, 196, 12, - 200, 63, 234, 95, 79, 210, 127, 200, 63, 200, 177, 232, 80, 201, 63, 200, - 63, 200, 232, 232, 80, 201, 63, 200, 63, 200, 177, 242, 83, 200, 63, 200, - 232, 242, 83, 200, 63, 228, 241, 242, 83, 200, 63, 242, 84, 202, 110, - 219, 224, 200, 63, 242, 84, 202, 110, 183, 200, 63, 200, 177, 242, 84, - 202, 110, 219, 224, 200, 63, 200, 232, 242, 84, 202, 110, 183, 200, 63, - 239, 24, 200, 63, 230, 15, 211, 176, 200, 63, 230, 15, 216, 162, 200, 63, - 230, 15, 250, 195, 200, 63, 252, 68, 77, 200, 63, 1, 251, 202, 200, 63, - 1, 200, 182, 251, 202, 200, 63, 1, 248, 211, 200, 63, 1, 231, 217, 200, - 63, 1, 231, 218, 231, 194, 200, 63, 1, 238, 0, 200, 63, 1, 236, 139, 238, - 1, 206, 181, 200, 63, 1, 229, 245, 200, 63, 1, 193, 133, 200, 63, 1, 191, - 113, 200, 63, 1, 229, 184, 200, 63, 1, 199, 69, 200, 63, 1, 199, 70, 231, - 194, 200, 63, 1, 191, 208, 200, 63, 1, 191, 209, 229, 245, 200, 63, 1, - 222, 75, 200, 63, 1, 220, 34, 200, 63, 1, 216, 46, 200, 63, 1, 212, 130, - 200, 63, 1, 204, 18, 200, 63, 1, 53, 204, 18, 200, 63, 1, 71, 200, 63, 1, - 210, 63, 200, 63, 1, 207, 18, 210, 63, 200, 63, 1, 205, 189, 200, 63, 1, - 208, 83, 200, 63, 1, 206, 181, 200, 63, 1, 203, 69, 200, 63, 1, 199, 159, - 200, 63, 1, 209, 252, 248, 194, 200, 63, 1, 209, 252, 231, 84, 200, 63, - 1, 209, 252, 237, 63, 200, 63, 208, 166, 58, 200, 63, 208, 166, 60, 200, - 63, 208, 166, 235, 137, 200, 63, 191, 0, 58, 200, 63, 191, 0, 60, 200, - 63, 191, 0, 235, 137, 200, 63, 207, 116, 58, 200, 63, 207, 116, 60, 200, - 63, 235, 138, 191, 9, 228, 240, 200, 63, 235, 138, 191, 9, 251, 108, 200, - 63, 229, 250, 58, 200, 63, 229, 250, 60, 200, 63, 229, 249, 235, 137, - 200, 63, 234, 16, 58, 200, 63, 234, 16, 60, 200, 63, 206, 24, 200, 63, - 233, 40, 236, 140, 200, 63, 207, 246, 200, 63, 206, 54, 200, 63, 105, 81, - 185, 58, 200, 63, 105, 81, 185, 60, 200, 63, 115, 185, 58, 200, 63, 115, - 185, 60, 200, 63, 211, 172, 219, 113, 58, 200, 63, 211, 172, 219, 113, - 60, 200, 63, 215, 96, 200, 63, 249, 79, 200, 63, 1, 202, 28, 191, 69, - 200, 63, 1, 202, 28, 221, 201, 200, 63, 1, 202, 28, 233, 59, 9, 1, 248, - 246, 4, 115, 185, 228, 190, 60, 9, 1, 248, 246, 4, 75, 248, 233, 23, 115, - 185, 58, 9, 1, 248, 246, 4, 115, 185, 209, 58, 196, 66, 60, 9, 1, 248, - 246, 4, 115, 185, 209, 58, 196, 66, 248, 233, 23, 105, 185, 58, 9, 1, - 248, 246, 4, 105, 185, 248, 233, 23, 75, 58, 9, 1, 248, 246, 4, 223, 93, - 2, 196, 13, 60, 9, 1, 248, 246, 4, 2, 196, 12, 9, 1, 182, 4, 105, 185, - 58, 9, 1, 182, 4, 115, 185, 209, 58, 196, 66, 60, 9, 1, 238, 4, 4, 105, - 185, 195, 85, 248, 233, 23, 2, 199, 219, 9, 1, 238, 4, 4, 223, 93, 2, - 196, 13, 60, 9, 1, 207, 72, 4, 106, 9, 1, 205, 47, 4, 232, 128, 185, 58, - 9, 1, 251, 231, 4, 105, 185, 58, 9, 1, 251, 231, 4, 115, 185, 209, 58, - 235, 119, 58, 9, 1, 251, 231, 4, 105, 185, 195, 85, 58, 9, 1, 233, 47, 4, - 105, 185, 60, 9, 1, 233, 47, 4, 115, 185, 209, 58, 196, 66, 60, 9, 1, - 222, 5, 4, 75, 58, 9, 1, 222, 5, 4, 115, 185, 58, 9, 1, 222, 5, 4, 115, - 185, 209, 58, 196, 66, 60, 9, 1, 92, 4, 75, 58, 9, 1, 92, 4, 75, 60, 9, - 1, 213, 25, 4, 105, 185, 60, 9, 1, 213, 25, 4, 2, 199, 219, 9, 1, 213, - 25, 4, 2, 196, 12, 9, 1, 220, 36, 4, 164, 9, 1, 207, 72, 4, 105, 185, - 195, 85, 58, 9, 1, 207, 72, 4, 230, 58, 58, 9, 1, 205, 47, 4, 105, 185, - 195, 85, 58, 9, 1, 182, 4, 2, 9, 1, 199, 220, 60, 9, 1, 182, 4, 2, 9, 1, - 199, 220, 23, 105, 236, 138, 9, 1, 205, 47, 4, 2, 9, 1, 199, 220, 23, - 105, 236, 138, 9, 1, 207, 72, 4, 2, 9, 1, 199, 220, 23, 105, 236, 138, 9, - 1, 182, 4, 2, 9, 1, 199, 220, 58, 9, 1, 131, 4, 233, 205, 251, 28, 17, - 105, 58, 9, 1, 131, 4, 233, 205, 251, 28, 17, 115, 58, 9, 1, 233, 74, 99, - 4, 233, 205, 251, 28, 17, 105, 58, 9, 1, 233, 74, 99, 4, 233, 205, 251, - 28, 17, 115, 58, 9, 1, 233, 74, 99, 4, 233, 205, 251, 28, 17, 232, 128, - 60, 9, 1, 193, 134, 4, 233, 205, 251, 28, 17, 105, 58, 9, 1, 193, 134, 4, - 233, 205, 251, 28, 17, 115, 58, 9, 1, 99, 249, 81, 4, 233, 205, 251, 28, - 17, 105, 58, 9, 1, 99, 249, 81, 4, 233, 205, 251, 28, 17, 115, 58, 9, 1, - 182, 4, 233, 205, 251, 28, 17, 232, 128, 60, 9, 1, 205, 47, 4, 233, 205, - 251, 28, 17, 232, 128, 58, 9, 1, 205, 47, 4, 223, 93, 196, 12, 9, 1, 222, - 107, 4, 105, 185, 58, 199, 46, 1, 230, 91, 199, 46, 1, 203, 119, 199, 46, - 1, 213, 23, 199, 46, 1, 207, 178, 199, 46, 1, 249, 151, 199, 46, 1, 219, - 156, 199, 46, 1, 222, 122, 199, 46, 1, 251, 179, 199, 46, 1, 195, 186, - 199, 46, 1, 216, 207, 199, 46, 1, 233, 107, 199, 46, 1, 237, 66, 199, 46, - 1, 199, 48, 199, 46, 1, 220, 122, 199, 46, 1, 231, 236, 199, 46, 1, 231, - 6, 199, 46, 1, 205, 45, 199, 46, 1, 237, 207, 199, 46, 1, 191, 94, 199, - 46, 1, 199, 161, 199, 46, 1, 192, 140, 199, 46, 1, 210, 77, 199, 46, 1, - 223, 15, 199, 46, 1, 243, 130, 199, 46, 1, 197, 131, 199, 46, 1, 229, - 176, 199, 46, 1, 221, 214, 199, 46, 1, 199, 47, 199, 46, 1, 191, 121, - 199, 46, 1, 203, 108, 199, 46, 1, 205, 196, 199, 46, 1, 238, 30, 199, 46, - 1, 159, 199, 46, 1, 191, 7, 199, 46, 1, 251, 227, 199, 46, 1, 231, 85, - 199, 46, 1, 208, 93, 199, 46, 1, 193, 178, 199, 46, 252, 70, 199, 46, - 252, 171, 199, 46, 228, 29, 199, 46, 234, 187, 199, 46, 196, 161, 199, - 46, 211, 86, 199, 46, 234, 198, 199, 46, 233, 195, 199, 46, 211, 171, - 199, 46, 211, 181, 199, 46, 200, 206, 199, 46, 1, 214, 250, 213, 107, 17, - 191, 77, 213, 107, 17, 107, 213, 107, 17, 109, 213, 107, 17, 138, 213, - 107, 17, 134, 213, 107, 17, 149, 213, 107, 17, 169, 213, 107, 17, 175, - 213, 107, 17, 171, 213, 107, 17, 178, 213, 107, 1, 65, 213, 107, 1, 234, - 188, 213, 107, 1, 68, 213, 107, 1, 71, 213, 107, 1, 66, 213, 107, 1, 211, - 87, 213, 107, 1, 74, 213, 107, 1, 238, 18, 213, 107, 1, 215, 61, 213, - 107, 1, 249, 153, 213, 107, 1, 168, 213, 107, 1, 190, 190, 213, 107, 1, - 223, 32, 213, 107, 1, 247, 1, 213, 107, 1, 238, 32, 213, 107, 1, 165, - 213, 107, 1, 206, 109, 213, 107, 1, 188, 213, 107, 1, 231, 182, 213, 107, - 1, 233, 109, 213, 107, 1, 155, 213, 107, 1, 173, 213, 107, 1, 215, 7, - 193, 37, 213, 107, 1, 174, 213, 107, 1, 212, 101, 213, 107, 1, 180, 213, - 107, 1, 140, 213, 107, 1, 193, 190, 213, 107, 1, 170, 213, 107, 1, 212, - 102, 193, 37, 213, 107, 1, 222, 193, 223, 32, 213, 107, 1, 222, 193, 247, - 1, 213, 107, 1, 222, 193, 165, 213, 107, 33, 203, 40, 137, 198, 79, 213, - 107, 33, 203, 40, 130, 198, 79, 213, 107, 33, 203, 40, 206, 180, 198, 79, - 213, 107, 33, 179, 237, 86, 198, 79, 213, 107, 33, 179, 137, 198, 79, - 213, 107, 33, 179, 130, 198, 79, 213, 107, 33, 179, 206, 180, 198, 79, - 213, 107, 33, 214, 213, 77, 213, 107, 33, 55, 75, 58, 213, 107, 137, 163, - 251, 49, 213, 107, 130, 163, 251, 49, 213, 107, 16, 211, 88, 237, 101, - 213, 107, 16, 231, 181, 213, 107, 242, 74, 213, 107, 233, 216, 77, 213, - 107, 220, 94, 213, 107, 237, 233, 213, 107, 236, 142, 56, 213, 107, 199, - 195, 56, 205, 151, 1, 251, 204, 205, 151, 1, 248, 148, 205, 151, 1, 231, - 216, 205, 151, 1, 238, 2, 205, 151, 1, 223, 44, 205, 151, 1, 249, 151, - 205, 151, 1, 191, 80, 205, 151, 1, 223, 53, 205, 151, 1, 198, 125, 205, - 151, 1, 191, 189, 205, 151, 1, 222, 123, 205, 151, 1, 220, 118, 205, 151, - 1, 216, 46, 205, 151, 1, 212, 130, 205, 151, 1, 202, 171, 205, 151, 1, - 223, 162, 205, 151, 1, 233, 23, 205, 151, 1, 197, 166, 205, 151, 1, 208, - 10, 205, 151, 1, 206, 181, 205, 151, 1, 203, 138, 205, 151, 1, 199, 243, - 205, 151, 87, 223, 162, 205, 151, 87, 223, 161, 205, 151, 87, 211, 165, - 205, 151, 87, 238, 16, 205, 151, 52, 1, 234, 52, 191, 189, 205, 151, 87, - 234, 52, 191, 189, 205, 151, 18, 3, 179, 71, 205, 151, 18, 3, 71, 205, - 151, 18, 3, 210, 253, 252, 206, 205, 151, 18, 3, 179, 252, 206, 205, 151, - 18, 3, 252, 206, 205, 151, 18, 3, 210, 253, 65, 205, 151, 18, 3, 179, 65, - 205, 151, 18, 3, 65, 205, 151, 52, 1, 203, 40, 65, 205, 151, 18, 3, 203, - 40, 65, 205, 151, 18, 3, 179, 66, 205, 151, 18, 3, 66, 205, 151, 52, 1, - 68, 205, 151, 18, 3, 179, 68, 205, 151, 18, 3, 68, 205, 151, 18, 3, 74, - 205, 151, 18, 3, 200, 206, 205, 151, 87, 214, 93, 205, 151, 208, 152, - 214, 93, 205, 151, 208, 152, 251, 255, 205, 151, 208, 152, 251, 121, 205, - 151, 208, 152, 249, 57, 205, 151, 208, 152, 250, 174, 205, 151, 208, 152, - 203, 57, 205, 151, 252, 68, 77, 205, 151, 208, 152, 216, 197, 208, 48, - 205, 151, 208, 152, 191, 16, 205, 151, 208, 152, 208, 48, 205, 151, 208, - 152, 191, 119, 205, 151, 208, 152, 197, 54, 205, 151, 208, 152, 250, 255, - 205, 151, 208, 152, 202, 33, 217, 37, 205, 151, 208, 152, 251, 97, 217, - 86, 1, 230, 65, 217, 86, 1, 252, 155, 217, 86, 1, 251, 253, 217, 86, 1, - 252, 42, 217, 86, 1, 251, 245, 217, 86, 1, 196, 36, 217, 86, 1, 250, 123, - 217, 86, 1, 223, 53, 217, 86, 1, 250, 171, 217, 86, 1, 251, 211, 217, 86, - 1, 251, 216, 217, 86, 1, 251, 207, 217, 86, 1, 251, 149, 217, 86, 1, 251, - 132, 217, 86, 1, 250, 219, 217, 86, 1, 223, 162, 217, 86, 1, 251, 65, - 217, 86, 1, 250, 184, 217, 86, 1, 251, 37, 217, 86, 1, 251, 33, 217, 86, - 1, 250, 209, 217, 86, 1, 250, 182, 217, 86, 1, 235, 62, 217, 86, 1, 222, - 114, 217, 86, 1, 251, 230, 217, 86, 252, 3, 77, 217, 86, 195, 22, 77, - 217, 86, 231, 153, 77, 217, 86, 208, 151, 200, 63, 1, 142, 214, 68, 200, - 63, 1, 142, 223, 32, 200, 63, 1, 142, 212, 101, 200, 63, 1, 142, 197, - 132, 200, 63, 1, 142, 213, 79, 200, 63, 1, 142, 213, 61, 200, 63, 1, 142, - 248, 203, 200, 63, 1, 142, 165, 200, 63, 1, 142, 219, 73, 200, 63, 1, - 142, 219, 62, 200, 63, 1, 142, 201, 175, 9, 1, 131, 4, 250, 170, 233, 70, - 9, 1, 131, 4, 250, 170, 198, 54, 50, 233, 70, 9, 1, 131, 4, 50, 82, 106, - 9, 1, 131, 4, 45, 82, 106, 9, 1, 131, 4, 250, 170, 222, 52, 9, 1, 131, 4, - 250, 170, 248, 77, 50, 222, 52, 9, 1, 131, 4, 250, 170, 206, 115, 75, 58, - 9, 1, 131, 4, 250, 170, 50, 206, 115, 236, 140, 9, 1, 131, 4, 250, 170, - 45, 206, 115, 236, 140, 9, 1, 131, 4, 250, 170, 206, 115, 75, 60, 9, 1, - 131, 4, 75, 58, 9, 1, 131, 4, 250, 170, 198, 54, 50, 233, 71, 23, 75, 58, - 9, 1, 131, 4, 50, 82, 201, 28, 23, 75, 58, 9, 1, 131, 4, 250, 170, 248, - 77, 50, 222, 53, 23, 75, 58, 9, 1, 131, 4, 250, 170, 198, 54, 50, 233, - 71, 23, 45, 206, 188, 9, 1, 131, 4, 50, 82, 201, 28, 23, 45, 206, 188, 9, - 1, 131, 4, 250, 170, 248, 77, 50, 222, 53, 23, 45, 206, 188, 9, 1, 131, - 4, 250, 170, 50, 230, 57, 9, 1, 131, 4, 250, 170, 45, 230, 57, 9, 199, - 169, 4, 210, 251, 230, 57, 9, 199, 169, 4, 210, 251, 193, 133, 9, 199, - 169, 4, 105, 185, 60, 9, 1, 199, 4, 192, 75, 9, 249, 72, 206, 115, 236, - 140, 9, 207, 147, 206, 115, 236, 140, 9, 1, 213, 25, 4, 223, 93, 2, 196, - 12, 9, 1, 182, 4, 223, 93, 2, 196, 13, 60, 9, 1, 199, 220, 4, 75, 60, 9, - 1, 199, 220, 4, 115, 185, 60, 9, 1, 222, 5, 4, 105, 185, 195, 85, 60, 9, - 81, 199, 215, 9, 209, 8, 87, 58, 9, 209, 182, 87, 58, 9, 2, 137, 193, 23, - 251, 206, 9, 2, 130, 193, 23, 223, 61, 9, 2, 130, 193, 23, 223, 179, 9, - 2, 130, 193, 23, 199, 173, 9, 217, 142, 193, 179, 9, 200, 182, 131, 215, - 234, 9, 235, 128, 217, 141, 9, 132, 217, 142, 139, 217, 141, 9, 1, 248, - 246, 4, 2, 196, 13, 60, 9, 1, 248, 246, 4, 230, 58, 58, 9, 1, 223, 7, 4, - 105, 185, 58, 9, 1, 199, 220, 4, 105, 185, 58, 9, 1, 233, 47, 4, 75, 248, - 233, 23, 115, 185, 58, 9, 1, 208, 90, 4, 75, 60, 9, 1, 220, 36, 4, 55, - 164, 9, 1, 92, 4, 115, 185, 58, 9, 1, 99, 4, 105, 185, 248, 233, 23, 230, - 58, 58, 9, 1, 99, 4, 105, 185, 248, 233, 23, 75, 58, 9, 1, 207, 72, 4, - 219, 4, 9, 1, 193, 134, 4, 75, 193, 52, 9, 1, 206, 142, 192, 75, 9, 1, - 130, 251, 192, 9, 1, 238, 4, 4, 115, 185, 60, 9, 1, 205, 193, 4, 115, - 185, 60, 9, 1, 231, 228, 4, 223, 93, 106, 9, 1, 201, 53, 193, 133, 9, 1, - 191, 114, 4, 223, 93, 196, 13, 58, 9, 1, 251, 231, 4, 115, 185, 60, 9, 1, - 222, 107, 4, 75, 60, 9, 1, 208, 90, 4, 75, 248, 233, 23, 213, 44, 185, - 58, 9, 1, 248, 246, 4, 2, 92, 58, 9, 1, 210, 42, 4, 2, 92, 58, 9, 1, 199, - 115, 4, 2, 199, 115, 58, 9, 1, 207, 72, 4, 2, 213, 25, 58, 9, 1, 99, 4, - 105, 185, 248, 233, 23, 2, 213, 25, 58, 9, 1, 252, 0, 233, 46, 9, 1, 252, - 0, 208, 89, 9, 1, 252, 0, 213, 24, 9, 1, 210, 42, 4, 2, 196, 12, 9, 1, - 199, 115, 4, 2, 196, 12, 9, 1, 197, 125, 4, 2, 196, 12, 9, 1, 199, 150, - 4, 2, 196, 12, 9, 1, 222, 5, 4, 2, 196, 12, 9, 1, 231, 87, 4, 115, 185, - 58, 9, 1, 252, 0, 208, 90, 4, 115, 185, 58, 9, 1, 223, 7, 4, 115, 185, - 58, 9, 1, 223, 7, 4, 115, 185, 60, 9, 1, 220, 36, 4, 2, 9, 1, 199, 220, - 58, 9, 1, 230, 224, 9, 2, 233, 74, 192, 75, 9, 2, 137, 233, 74, 192, 75, - 9, 2, 137, 99, 249, 81, 4, 105, 185, 60, 9, 2, 137, 193, 23, 205, 182, 9, - 2, 137, 191, 116, 9, 220, 13, 206, 115, 75, 58, 9, 220, 13, 206, 115, 75, - 60, 9, 200, 207, 60, 9, 220, 13, 243, 11, 60, 9, 220, 13, 206, 115, 75, - 223, 118, 243, 11, 60, 9, 2, 130, 193, 133, 9, 2, 137, 193, 23, 251, 30, - 9, 2, 137, 205, 192, 9, 2, 137, 251, 230, 9, 2, 137, 208, 89, 9, 2, 137, - 213, 25, 4, 222, 52, 9, 2, 130, 213, 25, 4, 222, 52, 9, 2, 137, 193, 23, - 250, 181, 9, 2, 137, 193, 23, 250, 218, 9, 2, 137, 193, 23, 251, 131, 9, - 2, 137, 193, 23, 205, 171, 9, 2, 137, 193, 23, 208, 52, 9, 2, 137, 193, - 23, 193, 157, 9, 2, 137, 232, 157, 217, 51, 9, 2, 137, 3, 205, 187, 9, - 236, 218, 234, 95, 79, 250, 130, 9, 153, 237, 246, 60, 9, 238, 171, 233, - 70, 9, 238, 171, 237, 245, 9, 238, 171, 222, 52, 9, 238, 171, 233, 68, 9, - 238, 171, 237, 243, 9, 238, 171, 222, 50, 9, 163, 91, 75, 58, 9, 163, - 105, 185, 58, 9, 163, 219, 5, 58, 9, 163, 91, 75, 60, 9, 163, 105, 185, - 60, 9, 163, 219, 5, 60, 9, 211, 77, 233, 68, 9, 211, 77, 237, 243, 9, - 211, 77, 222, 50, 9, 2, 137, 193, 133, 9, 233, 71, 4, 206, 188, 9, 233, - 71, 4, 75, 58, 9, 222, 53, 4, 75, 60, 9, 45, 250, 236, 58, 9, 50, 250, - 236, 58, 9, 45, 250, 236, 60, 9, 50, 250, 236, 60, 9, 55, 50, 250, 236, - 58, 9, 55, 50, 250, 236, 93, 4, 236, 140, 9, 50, 250, 236, 93, 4, 236, - 140, 9, 237, 246, 4, 236, 140, 9, 87, 202, 206, 213, 25, 231, 57, 100, 3, - 223, 93, 247, 119, 100, 3, 247, 119, 100, 3, 251, 71, 100, 3, 195, 35, - 100, 1, 203, 40, 65, 100, 1, 65, 100, 1, 252, 206, 100, 1, 68, 100, 1, - 223, 199, 100, 1, 66, 100, 1, 196, 30, 100, 1, 117, 146, 100, 1, 117, - 172, 100, 1, 247, 122, 71, 100, 1, 203, 40, 71, 100, 1, 71, 100, 1, 251, - 236, 100, 1, 247, 122, 74, 100, 1, 203, 40, 74, 100, 1, 74, 100, 1, 250, - 163, 100, 1, 155, 100, 1, 221, 215, 100, 1, 231, 240, 100, 1, 231, 91, - 100, 1, 214, 68, 100, 1, 247, 160, 100, 1, 247, 1, 100, 1, 223, 32, 100, - 1, 222, 252, 100, 1, 212, 101, 100, 1, 197, 132, 100, 1, 197, 120, 100, - 1, 237, 191, 100, 1, 237, 175, 100, 1, 213, 79, 100, 1, 190, 190, 100, 1, - 199, 49, 100, 1, 238, 32, 100, 1, 237, 68, 100, 1, 180, 100, 1, 213, 61, - 100, 1, 168, 100, 1, 209, 228, 100, 1, 249, 153, 100, 1, 248, 203, 100, - 1, 174, 100, 1, 170, 100, 1, 165, 100, 1, 206, 109, 100, 1, 173, 100, 1, - 219, 73, 100, 1, 219, 62, 100, 1, 195, 188, 100, 1, 203, 165, 100, 1, - 201, 175, 100, 1, 188, 100, 1, 140, 100, 18, 3, 211, 151, 100, 18, 3, - 211, 85, 100, 3, 212, 141, 100, 3, 250, 145, 100, 18, 3, 252, 206, 100, - 18, 3, 68, 100, 18, 3, 223, 199, 100, 18, 3, 66, 100, 18, 3, 196, 30, - 100, 18, 3, 117, 146, 100, 18, 3, 117, 206, 110, 100, 18, 3, 247, 122, - 71, 100, 18, 3, 203, 40, 71, 100, 18, 3, 71, 100, 18, 3, 251, 236, 100, - 18, 3, 247, 122, 74, 100, 18, 3, 203, 40, 74, 100, 18, 3, 74, 100, 18, 3, - 250, 163, 100, 3, 195, 40, 100, 18, 3, 208, 207, 71, 100, 18, 3, 250, - 140, 100, 211, 113, 100, 201, 38, 3, 196, 154, 100, 201, 38, 3, 251, 73, - 100, 230, 211, 252, 60, 100, 252, 47, 252, 60, 100, 18, 3, 247, 122, 179, - 71, 100, 18, 3, 196, 152, 100, 18, 3, 196, 29, 100, 1, 208, 96, 100, 1, - 221, 193, 100, 1, 231, 66, 100, 1, 191, 123, 100, 1, 237, 180, 100, 1, - 207, 6, 100, 1, 233, 109, 100, 1, 191, 175, 100, 1, 117, 206, 110, 100, - 1, 117, 219, 74, 100, 18, 3, 117, 172, 100, 18, 3, 117, 219, 74, 100, - 237, 238, 100, 55, 237, 238, 100, 17, 191, 77, 100, 17, 107, 100, 17, - 109, 100, 17, 138, 100, 17, 134, 100, 17, 149, 100, 17, 169, 100, 17, - 175, 100, 17, 171, 100, 17, 178, 100, 252, 68, 56, 100, 3, 137, 201, 246, - 236, 140, 100, 1, 247, 122, 65, 100, 1, 211, 151, 100, 1, 211, 85, 100, - 1, 250, 140, 100, 1, 196, 152, 100, 1, 196, 29, 100, 1, 217, 43, 237, - 191, 100, 1, 191, 71, 100, 1, 88, 170, 100, 1, 231, 127, 100, 1, 222, - 230, 100, 1, 231, 11, 201, 63, 100, 1, 237, 181, 100, 1, 249, 53, 248, - 225, 251, 100, 248, 225, 3, 247, 119, 248, 225, 3, 251, 71, 248, 225, 3, - 195, 35, 248, 225, 1, 65, 248, 225, 1, 252, 206, 248, 225, 1, 68, 248, - 225, 1, 223, 199, 248, 225, 1, 66, 248, 225, 1, 196, 30, 248, 225, 1, - 117, 146, 248, 225, 1, 117, 172, 248, 225, 1, 71, 248, 225, 1, 251, 236, - 248, 225, 1, 74, 248, 225, 1, 250, 163, 248, 225, 1, 155, 248, 225, 1, - 221, 215, 248, 225, 1, 231, 240, 248, 225, 1, 231, 91, 248, 225, 1, 214, - 68, 248, 225, 1, 247, 160, 248, 225, 1, 247, 1, 248, 225, 1, 223, 32, - 248, 225, 1, 222, 252, 248, 225, 1, 212, 101, 248, 225, 1, 197, 132, 248, - 225, 1, 197, 120, 248, 225, 1, 237, 191, 248, 225, 1, 237, 175, 248, 225, - 1, 213, 79, 248, 225, 1, 190, 190, 248, 225, 1, 199, 49, 248, 225, 1, - 238, 32, 248, 225, 1, 237, 68, 248, 225, 1, 180, 248, 225, 1, 168, 248, - 225, 1, 209, 228, 248, 225, 1, 249, 153, 248, 225, 1, 248, 203, 248, 225, - 1, 174, 248, 225, 1, 170, 248, 225, 1, 165, 248, 225, 1, 173, 248, 225, - 1, 203, 165, 248, 225, 1, 201, 175, 248, 225, 1, 188, 248, 225, 1, 140, - 248, 225, 3, 212, 141, 248, 225, 3, 250, 145, 248, 225, 18, 3, 252, 206, - 248, 225, 18, 3, 68, 248, 225, 18, 3, 223, 199, 248, 225, 18, 3, 66, 248, - 225, 18, 3, 196, 30, 248, 225, 18, 3, 117, 146, 248, 225, 18, 3, 117, - 206, 110, 248, 225, 18, 3, 71, 248, 225, 18, 3, 251, 236, 248, 225, 18, - 3, 74, 248, 225, 18, 3, 250, 163, 248, 225, 3, 195, 40, 248, 225, 1, 221, - 204, 190, 190, 248, 225, 250, 164, 219, 198, 77, 248, 225, 1, 206, 109, - 248, 225, 1, 207, 6, 248, 225, 1, 191, 175, 248, 225, 1, 117, 206, 110, - 248, 225, 1, 117, 219, 74, 248, 225, 18, 3, 117, 172, 248, 225, 18, 3, - 117, 219, 74, 248, 225, 17, 191, 77, 248, 225, 17, 107, 248, 225, 17, - 109, 248, 225, 17, 138, 248, 225, 17, 134, 248, 225, 17, 149, 248, 225, - 17, 169, 248, 225, 17, 175, 248, 225, 17, 171, 248, 225, 17, 178, 248, - 225, 1, 207, 186, 4, 82, 237, 38, 248, 225, 1, 207, 186, 4, 110, 237, 38, - 248, 225, 206, 36, 77, 248, 225, 206, 36, 56, 248, 225, 238, 170, 212, - 133, 107, 248, 225, 238, 170, 212, 133, 109, 248, 225, 238, 170, 212, - 133, 138, 248, 225, 238, 170, 212, 133, 134, 248, 225, 238, 170, 212, - 133, 91, 219, 181, 199, 39, 199, 34, 237, 99, 248, 225, 238, 170, 237, - 100, 202, 130, 248, 225, 223, 54, 248, 225, 231, 207, 77, 248, 225, 1, - 195, 150, 251, 71, 248, 225, 252, 68, 56, 248, 225, 205, 138, 77, 230, - 144, 3, 252, 41, 248, 167, 230, 144, 3, 248, 167, 230, 144, 3, 195, 35, - 230, 144, 1, 65, 230, 144, 1, 252, 206, 230, 144, 1, 68, 230, 144, 1, - 223, 199, 230, 144, 1, 66, 230, 144, 1, 196, 30, 230, 144, 1, 234, 188, - 230, 144, 1, 251, 236, 230, 144, 1, 211, 87, 230, 144, 1, 250, 163, 230, - 144, 1, 155, 230, 144, 1, 221, 215, 230, 144, 1, 231, 240, 230, 144, 1, - 231, 91, 230, 144, 1, 214, 68, 230, 144, 1, 247, 160, 230, 144, 1, 247, - 1, 230, 144, 1, 223, 32, 230, 144, 1, 222, 252, 230, 144, 1, 212, 101, - 230, 144, 1, 197, 132, 230, 144, 1, 197, 120, 230, 144, 1, 237, 191, 230, - 144, 1, 237, 175, 230, 144, 1, 213, 79, 230, 144, 1, 190, 190, 230, 144, - 1, 199, 49, 230, 144, 1, 238, 32, 230, 144, 1, 237, 68, 230, 144, 1, 180, - 230, 144, 1, 168, 230, 144, 1, 209, 228, 230, 144, 1, 249, 153, 230, 144, - 1, 248, 203, 230, 144, 1, 174, 230, 144, 1, 170, 230, 144, 1, 165, 230, - 144, 1, 173, 230, 144, 1, 219, 73, 230, 144, 1, 195, 188, 230, 144, 1, - 203, 165, 230, 144, 1, 188, 230, 144, 1, 140, 230, 144, 3, 212, 141, 230, - 144, 18, 3, 252, 206, 230, 144, 18, 3, 68, 230, 144, 18, 3, 223, 199, - 230, 144, 18, 3, 66, 230, 144, 18, 3, 196, 30, 230, 144, 18, 3, 234, 188, - 230, 144, 18, 3, 251, 236, 230, 144, 18, 3, 211, 87, 230, 144, 18, 3, - 250, 163, 230, 144, 3, 195, 40, 230, 144, 3, 196, 157, 230, 144, 1, 221, - 193, 230, 144, 1, 231, 66, 230, 144, 1, 191, 123, 230, 144, 1, 206, 109, - 230, 144, 1, 233, 109, 230, 144, 17, 191, 77, 230, 144, 17, 107, 230, - 144, 17, 109, 230, 144, 17, 138, 230, 144, 17, 134, 230, 144, 17, 149, - 230, 144, 17, 169, 230, 144, 17, 175, 230, 144, 17, 171, 230, 144, 17, - 178, 230, 144, 198, 133, 230, 144, 252, 40, 230, 144, 223, 75, 230, 144, - 196, 58, 230, 144, 234, 148, 211, 92, 230, 144, 3, 192, 115, 230, 144, - 252, 68, 56, 230, 161, 3, 247, 119, 230, 161, 3, 251, 71, 230, 161, 3, - 195, 35, 230, 161, 1, 65, 230, 161, 1, 252, 206, 230, 161, 1, 68, 230, - 161, 1, 223, 199, 230, 161, 1, 66, 230, 161, 1, 196, 30, 230, 161, 1, - 117, 146, 230, 161, 1, 117, 172, 230, 161, 18, 247, 122, 71, 230, 161, 1, - 71, 230, 161, 1, 251, 236, 230, 161, 18, 247, 122, 74, 230, 161, 1, 74, - 230, 161, 1, 250, 163, 230, 161, 1, 155, 230, 161, 1, 221, 215, 230, 161, - 1, 231, 240, 230, 161, 1, 231, 91, 230, 161, 1, 214, 68, 230, 161, 1, - 247, 160, 230, 161, 1, 247, 1, 230, 161, 1, 223, 32, 230, 161, 1, 222, - 252, 230, 161, 1, 212, 101, 230, 161, 1, 197, 132, 230, 161, 1, 197, 120, - 230, 161, 1, 237, 191, 230, 161, 1, 237, 175, 230, 161, 1, 213, 79, 230, - 161, 1, 190, 190, 230, 161, 1, 199, 49, 230, 161, 1, 238, 32, 230, 161, - 1, 237, 68, 230, 161, 1, 180, 230, 161, 1, 168, 230, 161, 1, 209, 228, - 230, 161, 1, 249, 153, 230, 161, 1, 248, 203, 230, 161, 1, 174, 230, 161, - 1, 170, 230, 161, 1, 165, 230, 161, 1, 173, 230, 161, 1, 219, 73, 230, - 161, 1, 195, 188, 230, 161, 1, 203, 165, 230, 161, 1, 201, 175, 230, 161, - 1, 188, 230, 161, 1, 140, 230, 161, 3, 212, 141, 230, 161, 3, 250, 145, - 230, 161, 18, 3, 252, 206, 230, 161, 18, 3, 68, 230, 161, 18, 3, 223, - 199, 230, 161, 18, 3, 66, 230, 161, 18, 3, 196, 30, 230, 161, 18, 3, 117, - 146, 230, 161, 18, 3, 117, 206, 110, 230, 161, 18, 3, 247, 122, 71, 230, - 161, 18, 3, 71, 230, 161, 18, 3, 251, 236, 230, 161, 18, 3, 247, 122, 74, - 230, 161, 18, 3, 74, 230, 161, 18, 3, 250, 163, 230, 161, 3, 195, 40, - 230, 161, 211, 113, 230, 161, 1, 117, 206, 110, 230, 161, 1, 117, 219, - 74, 230, 161, 18, 3, 117, 172, 230, 161, 18, 3, 117, 219, 74, 230, 161, - 17, 191, 77, 230, 161, 17, 107, 230, 161, 17, 109, 230, 161, 17, 138, - 230, 161, 17, 134, 230, 161, 17, 149, 230, 161, 17, 169, 230, 161, 17, - 175, 230, 161, 17, 171, 230, 161, 17, 178, 230, 161, 252, 68, 56, 230, - 161, 206, 36, 56, 230, 161, 1, 191, 71, 230, 161, 3, 200, 206, 230, 161, - 3, 203, 155, 230, 161, 3, 217, 139, 230, 161, 3, 198, 224, 212, 142, 58, - 230, 161, 3, 243, 11, 212, 142, 58, 230, 161, 3, 197, 15, 212, 142, 58, - 211, 45, 3, 247, 119, 211, 45, 3, 251, 71, 211, 45, 3, 195, 35, 211, 45, - 1, 65, 211, 45, 1, 252, 206, 211, 45, 1, 68, 211, 45, 1, 223, 199, 211, - 45, 1, 66, 211, 45, 1, 196, 30, 211, 45, 1, 117, 146, 211, 45, 1, 117, - 172, 211, 45, 1, 71, 211, 45, 1, 251, 236, 211, 45, 1, 74, 211, 45, 1, - 250, 163, 211, 45, 1, 155, 211, 45, 1, 221, 215, 211, 45, 1, 231, 240, - 211, 45, 1, 231, 91, 211, 45, 1, 214, 68, 211, 45, 1, 247, 160, 211, 45, - 1, 247, 1, 211, 45, 1, 223, 32, 211, 45, 1, 222, 252, 211, 45, 1, 212, - 101, 211, 45, 1, 197, 132, 211, 45, 1, 197, 120, 211, 45, 1, 237, 191, - 211, 45, 1, 237, 175, 211, 45, 1, 213, 79, 211, 45, 1, 190, 190, 211, 45, - 1, 199, 49, 211, 45, 1, 238, 32, 211, 45, 1, 237, 68, 211, 45, 1, 180, - 211, 45, 1, 168, 211, 45, 1, 209, 228, 211, 45, 1, 249, 153, 211, 45, 1, - 248, 203, 211, 45, 1, 174, 211, 45, 1, 170, 211, 45, 1, 165, 211, 45, 1, - 173, 211, 45, 1, 219, 73, 211, 45, 1, 195, 188, 211, 45, 1, 203, 165, - 211, 45, 1, 201, 175, 211, 45, 1, 188, 211, 45, 1, 140, 211, 45, 3, 212, - 141, 211, 45, 3, 250, 145, 211, 45, 18, 3, 252, 206, 211, 45, 18, 3, 68, - 211, 45, 18, 3, 223, 199, 211, 45, 18, 3, 66, 211, 45, 18, 3, 196, 30, - 211, 45, 18, 3, 117, 146, 211, 45, 18, 3, 117, 206, 110, 211, 45, 18, 3, - 71, 211, 45, 18, 3, 251, 236, 211, 45, 18, 3, 74, 211, 45, 18, 3, 250, - 163, 211, 45, 3, 195, 40, 211, 45, 3, 210, 254, 211, 45, 251, 237, 219, - 198, 77, 211, 45, 250, 164, 219, 198, 77, 211, 45, 1, 206, 109, 211, 45, - 1, 207, 6, 211, 45, 1, 191, 175, 211, 45, 1, 117, 206, 110, 211, 45, 1, - 117, 219, 74, 211, 45, 18, 3, 117, 172, 211, 45, 18, 3, 117, 219, 74, - 211, 45, 17, 191, 77, 211, 45, 17, 107, 211, 45, 17, 109, 211, 45, 17, - 138, 211, 45, 17, 134, 211, 45, 17, 149, 211, 45, 17, 169, 211, 45, 17, - 175, 211, 45, 17, 171, 211, 45, 17, 178, 211, 45, 223, 54, 211, 45, 1, - 193, 190, 211, 45, 232, 118, 91, 208, 22, 211, 45, 232, 118, 91, 230, 70, - 211, 45, 232, 118, 115, 208, 20, 211, 45, 232, 118, 91, 202, 128, 211, - 45, 232, 118, 91, 234, 159, 211, 45, 232, 118, 115, 202, 125, 44, 3, 251, - 71, 44, 3, 195, 35, 44, 1, 65, 44, 1, 252, 206, 44, 1, 68, 44, 1, 223, - 199, 44, 1, 66, 44, 1, 196, 30, 44, 1, 71, 44, 1, 234, 188, 44, 1, 251, - 236, 44, 1, 74, 44, 1, 211, 87, 44, 1, 250, 163, 44, 1, 155, 44, 1, 214, - 68, 44, 1, 247, 160, 44, 1, 223, 32, 44, 1, 212, 101, 44, 1, 197, 132, - 44, 1, 213, 79, 44, 1, 190, 190, 44, 1, 180, 44, 1, 213, 61, 44, 1, 168, - 44, 1, 174, 44, 1, 170, 44, 1, 165, 44, 1, 206, 109, 44, 1, 173, 44, 1, - 219, 73, 44, 1, 219, 62, 44, 1, 195, 188, 44, 1, 203, 165, 44, 1, 201, - 175, 44, 1, 188, 44, 1, 140, 44, 18, 3, 252, 206, 44, 18, 3, 68, 44, 18, - 3, 223, 199, 44, 18, 3, 66, 44, 18, 3, 196, 30, 44, 18, 3, 71, 44, 18, 3, - 234, 188, 44, 18, 3, 251, 236, 44, 18, 3, 74, 44, 18, 3, 211, 87, 44, 18, - 3, 250, 163, 44, 3, 195, 40, 44, 211, 113, 44, 250, 164, 219, 198, 77, + 75, 58, 9, 1, 71, 9, 1, 99, 4, 115, 185, 60, 9, 1, 99, 249, 82, 9, 1, 99, + 249, 83, 4, 230, 60, 58, 9, 232, 82, 201, 64, 9, 1, 252, 27, 9, 2, 137, + 34, 205, 194, 4, 220, 38, 4, 131, 217, 101, 9, 2, 137, 34, 208, 92, 4, + 220, 38, 4, 131, 217, 101, 9, 2, 137, 92, 89, 20, 9, 2, 137, 220, 38, + 251, 194, 9, 2, 137, 223, 8, 9, 2, 137, 115, 236, 140, 9, 2, 137, 205, + 47, 9, 234, 97, 79, 250, 132, 9, 201, 99, 79, 206, 61, 234, 143, 229, + 116, 9, 2, 137, 206, 114, 191, 77, 9, 2, 137, 196, 73, 207, 93, 191, 77, + 9, 2, 137, 236, 141, 229, 238, 79, 221, 212, 9, 2, 137, 92, 76, 20, 9, 2, + 130, 205, 47, 9, 2, 137, 217, 143, 9, 2, 193, 133, 9, 2, 192, 75, 9, 2, + 137, 192, 75, 9, 2, 137, 213, 26, 9, 209, 110, 79, 205, 178, 9, 234, 107, + 247, 24, 130, 201, 64, 9, 234, 107, 247, 24, 137, 201, 64, 9, 206, 114, + 137, 201, 65, 4, 233, 6, 247, 23, 9, 2, 130, 216, 210, 9, 1, 238, 6, 4, + 223, 95, 196, 12, 9, 1, 207, 73, 4, 223, 95, 196, 12, 233, 207, 251, 30, + 17, 191, 77, 233, 207, 251, 30, 17, 107, 233, 207, 251, 30, 17, 109, 233, + 207, 251, 30, 17, 138, 233, 207, 251, 30, 17, 134, 233, 207, 251, 30, 17, + 150, 233, 207, 251, 30, 17, 169, 233, 207, 251, 30, 17, 175, 233, 207, + 251, 30, 17, 171, 233, 207, 251, 30, 17, 178, 9, 1, 203, 111, 4, 75, 60, + 9, 1, 238, 29, 4, 75, 60, 9, 1, 231, 89, 4, 75, 60, 9, 3, 202, 174, 251, + 139, 9, 3, 202, 174, 209, 18, 216, 188, 9, 1, 229, 213, 4, 223, 95, 196, + 12, 200, 63, 234, 97, 79, 210, 129, 200, 63, 200, 177, 232, 82, 201, 64, + 200, 63, 200, 233, 232, 82, 201, 64, 200, 63, 200, 177, 242, 85, 200, 63, + 200, 233, 242, 85, 200, 63, 228, 243, 242, 85, 200, 63, 242, 86, 202, + 111, 219, 226, 200, 63, 242, 86, 202, 111, 179, 200, 63, 200, 177, 242, + 86, 202, 111, 219, 226, 200, 63, 200, 233, 242, 86, 202, 111, 179, 200, + 63, 239, 26, 200, 63, 230, 17, 211, 178, 200, 63, 230, 17, 216, 164, 200, + 63, 230, 17, 250, 197, 200, 63, 252, 70, 77, 200, 63, 1, 251, 204, 200, + 63, 1, 200, 182, 251, 204, 200, 63, 1, 248, 213, 200, 63, 1, 231, 219, + 200, 63, 1, 231, 220, 231, 196, 200, 63, 1, 238, 2, 200, 63, 1, 236, 141, + 238, 3, 206, 182, 200, 63, 1, 229, 247, 200, 63, 1, 193, 133, 200, 63, 1, + 191, 113, 200, 63, 1, 229, 186, 200, 63, 1, 199, 69, 200, 63, 1, 199, 70, + 231, 196, 200, 63, 1, 191, 208, 200, 63, 1, 191, 209, 229, 247, 200, 63, + 1, 222, 77, 200, 63, 1, 220, 36, 200, 63, 1, 216, 48, 200, 63, 1, 212, + 132, 200, 63, 1, 204, 19, 200, 63, 1, 53, 204, 19, 200, 63, 1, 71, 200, + 63, 1, 210, 65, 200, 63, 1, 207, 19, 210, 65, 200, 63, 1, 205, 190, 200, + 63, 1, 208, 85, 200, 63, 1, 206, 182, 200, 63, 1, 203, 70, 200, 63, 1, + 199, 159, 200, 63, 1, 209, 254, 248, 196, 200, 63, 1, 209, 254, 231, 86, + 200, 63, 1, 209, 254, 237, 65, 200, 63, 208, 168, 58, 200, 63, 208, 168, + 60, 200, 63, 208, 168, 235, 139, 200, 63, 191, 0, 58, 200, 63, 191, 0, + 60, 200, 63, 191, 0, 235, 139, 200, 63, 207, 118, 58, 200, 63, 207, 118, + 60, 200, 63, 235, 140, 191, 9, 228, 242, 200, 63, 235, 140, 191, 9, 251, + 110, 200, 63, 229, 252, 58, 200, 63, 229, 252, 60, 200, 63, 229, 251, + 235, 139, 200, 63, 234, 18, 58, 200, 63, 234, 18, 60, 200, 63, 206, 25, + 200, 63, 233, 42, 236, 142, 200, 63, 207, 248, 200, 63, 206, 55, 200, 63, + 105, 81, 185, 58, 200, 63, 105, 81, 185, 60, 200, 63, 115, 185, 58, 200, + 63, 115, 185, 60, 200, 63, 211, 174, 219, 115, 58, 200, 63, 211, 174, + 219, 115, 60, 200, 63, 215, 98, 200, 63, 249, 81, 200, 63, 1, 202, 29, + 191, 69, 200, 63, 1, 202, 29, 221, 203, 200, 63, 1, 202, 29, 233, 61, 9, + 1, 248, 248, 4, 115, 185, 228, 192, 60, 9, 1, 248, 248, 4, 75, 248, 235, + 23, 115, 185, 58, 9, 1, 248, 248, 4, 115, 185, 209, 60, 196, 66, 60, 9, + 1, 248, 248, 4, 115, 185, 209, 60, 196, 66, 248, 235, 23, 105, 185, 58, + 9, 1, 248, 248, 4, 105, 185, 248, 235, 23, 75, 58, 9, 1, 248, 248, 4, + 223, 95, 2, 196, 13, 60, 9, 1, 248, 248, 4, 2, 196, 12, 9, 1, 183, 4, + 105, 185, 58, 9, 1, 183, 4, 115, 185, 209, 60, 196, 66, 60, 9, 1, 238, 6, + 4, 105, 185, 195, 85, 248, 235, 23, 2, 199, 219, 9, 1, 238, 6, 4, 223, + 95, 2, 196, 13, 60, 9, 1, 207, 73, 4, 106, 9, 1, 205, 48, 4, 232, 130, + 185, 58, 9, 1, 251, 233, 4, 105, 185, 58, 9, 1, 251, 233, 4, 115, 185, + 209, 60, 235, 121, 58, 9, 1, 251, 233, 4, 105, 185, 195, 85, 58, 9, 1, + 233, 49, 4, 105, 185, 60, 9, 1, 233, 49, 4, 115, 185, 209, 60, 196, 66, + 60, 9, 1, 222, 7, 4, 75, 58, 9, 1, 222, 7, 4, 115, 185, 58, 9, 1, 222, 7, + 4, 115, 185, 209, 60, 196, 66, 60, 9, 1, 92, 4, 75, 58, 9, 1, 92, 4, 75, + 60, 9, 1, 213, 27, 4, 105, 185, 60, 9, 1, 213, 27, 4, 2, 199, 219, 9, 1, + 213, 27, 4, 2, 196, 12, 9, 1, 220, 38, 4, 164, 9, 1, 207, 73, 4, 105, + 185, 195, 85, 58, 9, 1, 207, 73, 4, 230, 60, 58, 9, 1, 205, 48, 4, 105, + 185, 195, 85, 58, 9, 1, 183, 4, 2, 9, 1, 199, 220, 60, 9, 1, 183, 4, 2, + 9, 1, 199, 220, 23, 105, 236, 140, 9, 1, 205, 48, 4, 2, 9, 1, 199, 220, + 23, 105, 236, 140, 9, 1, 207, 73, 4, 2, 9, 1, 199, 220, 23, 105, 236, + 140, 9, 1, 183, 4, 2, 9, 1, 199, 220, 58, 9, 1, 131, 4, 233, 207, 251, + 30, 17, 105, 58, 9, 1, 131, 4, 233, 207, 251, 30, 17, 115, 58, 9, 1, 233, + 76, 99, 4, 233, 207, 251, 30, 17, 105, 58, 9, 1, 233, 76, 99, 4, 233, + 207, 251, 30, 17, 115, 58, 9, 1, 233, 76, 99, 4, 233, 207, 251, 30, 17, + 232, 130, 60, 9, 1, 193, 134, 4, 233, 207, 251, 30, 17, 105, 58, 9, 1, + 193, 134, 4, 233, 207, 251, 30, 17, 115, 58, 9, 1, 99, 249, 83, 4, 233, + 207, 251, 30, 17, 105, 58, 9, 1, 99, 249, 83, 4, 233, 207, 251, 30, 17, + 115, 58, 9, 1, 183, 4, 233, 207, 251, 30, 17, 232, 130, 60, 9, 1, 205, + 48, 4, 233, 207, 251, 30, 17, 232, 130, 58, 9, 1, 205, 48, 4, 223, 95, + 196, 12, 9, 1, 222, 109, 4, 105, 185, 58, 199, 46, 1, 230, 93, 199, 46, + 1, 203, 120, 199, 46, 1, 213, 25, 199, 46, 1, 207, 180, 199, 46, 1, 249, + 153, 199, 46, 1, 219, 158, 199, 46, 1, 222, 124, 199, 46, 1, 251, 181, + 199, 46, 1, 195, 186, 199, 46, 1, 216, 209, 199, 46, 1, 233, 109, 199, + 46, 1, 237, 68, 199, 46, 1, 199, 48, 199, 46, 1, 220, 124, 199, 46, 1, + 231, 238, 199, 46, 1, 231, 8, 199, 46, 1, 205, 46, 199, 46, 1, 237, 209, + 199, 46, 1, 191, 94, 199, 46, 1, 199, 161, 199, 46, 1, 192, 140, 199, 46, + 1, 210, 79, 199, 46, 1, 223, 17, 199, 46, 1, 243, 132, 199, 46, 1, 197, + 131, 199, 46, 1, 229, 178, 199, 46, 1, 221, 216, 199, 46, 1, 199, 47, + 199, 46, 1, 191, 121, 199, 46, 1, 203, 109, 199, 46, 1, 205, 197, 199, + 46, 1, 238, 32, 199, 46, 1, 159, 199, 46, 1, 191, 7, 199, 46, 1, 251, + 229, 199, 46, 1, 231, 87, 199, 46, 1, 208, 95, 199, 46, 1, 193, 178, 199, + 46, 252, 72, 199, 46, 252, 173, 199, 46, 228, 31, 199, 46, 234, 189, 199, + 46, 196, 161, 199, 46, 211, 88, 199, 46, 234, 200, 199, 46, 233, 197, + 199, 46, 211, 173, 199, 46, 211, 183, 199, 46, 200, 206, 199, 46, 1, 214, + 252, 213, 109, 17, 191, 77, 213, 109, 17, 107, 213, 109, 17, 109, 213, + 109, 17, 138, 213, 109, 17, 134, 213, 109, 17, 150, 213, 109, 17, 169, + 213, 109, 17, 175, 213, 109, 17, 171, 213, 109, 17, 178, 213, 109, 1, 65, + 213, 109, 1, 234, 190, 213, 109, 1, 68, 213, 109, 1, 71, 213, 109, 1, 66, + 213, 109, 1, 211, 89, 213, 109, 1, 74, 213, 109, 1, 238, 20, 213, 109, 1, + 215, 63, 213, 109, 1, 249, 155, 213, 109, 1, 168, 213, 109, 1, 190, 190, + 213, 109, 1, 223, 34, 213, 109, 1, 247, 3, 213, 109, 1, 238, 34, 213, + 109, 1, 165, 213, 109, 1, 206, 110, 213, 109, 1, 188, 213, 109, 1, 231, + 184, 213, 109, 1, 233, 111, 213, 109, 1, 155, 213, 109, 1, 173, 213, 109, + 1, 215, 9, 193, 37, 213, 109, 1, 174, 213, 109, 1, 212, 103, 213, 109, 1, + 181, 213, 109, 1, 140, 213, 109, 1, 193, 190, 213, 109, 1, 170, 213, 109, + 1, 212, 104, 193, 37, 213, 109, 1, 222, 195, 223, 34, 213, 109, 1, 222, + 195, 247, 3, 213, 109, 1, 222, 195, 165, 213, 109, 33, 203, 41, 137, 198, + 79, 213, 109, 33, 203, 41, 130, 198, 79, 213, 109, 33, 203, 41, 206, 181, + 198, 79, 213, 109, 33, 180, 237, 88, 198, 79, 213, 109, 33, 180, 137, + 198, 79, 213, 109, 33, 180, 130, 198, 79, 213, 109, 33, 180, 206, 181, + 198, 79, 213, 109, 33, 214, 215, 77, 213, 109, 33, 55, 75, 58, 213, 109, + 137, 163, 251, 51, 213, 109, 130, 163, 251, 51, 213, 109, 16, 211, 90, + 237, 103, 213, 109, 16, 231, 183, 213, 109, 242, 76, 213, 109, 233, 218, + 77, 213, 109, 220, 96, 213, 109, 237, 235, 213, 109, 236, 144, 56, 213, + 109, 199, 195, 56, 205, 152, 1, 251, 206, 205, 152, 1, 248, 150, 205, + 152, 1, 231, 218, 205, 152, 1, 238, 4, 205, 152, 1, 223, 46, 205, 152, 1, + 249, 153, 205, 152, 1, 191, 80, 205, 152, 1, 223, 55, 205, 152, 1, 198, + 125, 205, 152, 1, 191, 189, 205, 152, 1, 222, 125, 205, 152, 1, 220, 120, + 205, 152, 1, 216, 48, 205, 152, 1, 212, 132, 205, 152, 1, 202, 172, 205, + 152, 1, 223, 164, 205, 152, 1, 233, 25, 205, 152, 1, 197, 166, 205, 152, + 1, 208, 12, 205, 152, 1, 206, 182, 205, 152, 1, 203, 139, 205, 152, 1, + 199, 243, 205, 152, 87, 223, 164, 205, 152, 87, 223, 163, 205, 152, 87, + 211, 167, 205, 152, 87, 238, 18, 205, 152, 52, 1, 234, 54, 191, 189, 205, + 152, 87, 234, 54, 191, 189, 205, 152, 18, 3, 180, 71, 205, 152, 18, 3, + 71, 205, 152, 18, 3, 210, 255, 252, 208, 205, 152, 18, 3, 180, 252, 208, + 205, 152, 18, 3, 252, 208, 205, 152, 18, 3, 210, 255, 65, 205, 152, 18, + 3, 180, 65, 205, 152, 18, 3, 65, 205, 152, 52, 1, 203, 41, 65, 205, 152, + 18, 3, 203, 41, 65, 205, 152, 18, 3, 180, 66, 205, 152, 18, 3, 66, 205, + 152, 52, 1, 68, 205, 152, 18, 3, 180, 68, 205, 152, 18, 3, 68, 205, 152, + 18, 3, 74, 205, 152, 18, 3, 200, 206, 205, 152, 87, 214, 95, 205, 152, + 208, 154, 214, 95, 205, 152, 208, 154, 252, 1, 205, 152, 208, 154, 251, + 123, 205, 152, 208, 154, 249, 59, 205, 152, 208, 154, 250, 176, 205, 152, + 208, 154, 203, 58, 205, 152, 252, 70, 77, 205, 152, 208, 154, 216, 199, + 208, 50, 205, 152, 208, 154, 191, 16, 205, 152, 208, 154, 208, 50, 205, + 152, 208, 154, 191, 119, 205, 152, 208, 154, 197, 54, 205, 152, 208, 154, + 251, 1, 205, 152, 208, 154, 202, 34, 217, 39, 205, 152, 208, 154, 251, + 99, 217, 88, 1, 230, 67, 217, 88, 1, 252, 157, 217, 88, 1, 251, 255, 217, + 88, 1, 252, 44, 217, 88, 1, 251, 247, 217, 88, 1, 196, 36, 217, 88, 1, + 250, 125, 217, 88, 1, 223, 55, 217, 88, 1, 250, 173, 217, 88, 1, 251, + 213, 217, 88, 1, 251, 218, 217, 88, 1, 251, 209, 217, 88, 1, 251, 151, + 217, 88, 1, 251, 134, 217, 88, 1, 250, 221, 217, 88, 1, 223, 164, 217, + 88, 1, 251, 67, 217, 88, 1, 250, 186, 217, 88, 1, 251, 39, 217, 88, 1, + 251, 35, 217, 88, 1, 250, 211, 217, 88, 1, 250, 184, 217, 88, 1, 235, 64, + 217, 88, 1, 222, 116, 217, 88, 1, 251, 232, 217, 88, 252, 5, 77, 217, 88, + 195, 22, 77, 217, 88, 231, 155, 77, 217, 88, 208, 153, 200, 63, 1, 142, + 214, 70, 200, 63, 1, 142, 223, 34, 200, 63, 1, 142, 212, 103, 200, 63, 1, + 142, 197, 132, 200, 63, 1, 142, 213, 81, 200, 63, 1, 142, 213, 63, 200, + 63, 1, 142, 248, 205, 200, 63, 1, 142, 165, 200, 63, 1, 142, 219, 75, + 200, 63, 1, 142, 219, 64, 200, 63, 1, 142, 201, 176, 9, 1, 131, 4, 250, + 172, 233, 72, 9, 1, 131, 4, 250, 172, 198, 54, 50, 233, 72, 9, 1, 131, 4, + 50, 82, 106, 9, 1, 131, 4, 45, 82, 106, 9, 1, 131, 4, 250, 172, 222, 54, + 9, 1, 131, 4, 250, 172, 248, 79, 50, 222, 54, 9, 1, 131, 4, 250, 172, + 206, 116, 75, 58, 9, 1, 131, 4, 250, 172, 50, 206, 116, 236, 142, 9, 1, + 131, 4, 250, 172, 45, 206, 116, 236, 142, 9, 1, 131, 4, 250, 172, 206, + 116, 75, 60, 9, 1, 131, 4, 75, 58, 9, 1, 131, 4, 250, 172, 198, 54, 50, + 233, 73, 23, 75, 58, 9, 1, 131, 4, 50, 82, 201, 29, 23, 75, 58, 9, 1, + 131, 4, 250, 172, 248, 79, 50, 222, 55, 23, 75, 58, 9, 1, 131, 4, 250, + 172, 198, 54, 50, 233, 73, 23, 45, 206, 189, 9, 1, 131, 4, 50, 82, 201, + 29, 23, 45, 206, 189, 9, 1, 131, 4, 250, 172, 248, 79, 50, 222, 55, 23, + 45, 206, 189, 9, 1, 131, 4, 250, 172, 50, 230, 59, 9, 1, 131, 4, 250, + 172, 45, 230, 59, 9, 199, 169, 4, 210, 253, 230, 59, 9, 199, 169, 4, 210, + 253, 193, 133, 9, 199, 169, 4, 105, 185, 60, 9, 1, 199, 4, 192, 75, 9, + 249, 74, 206, 116, 236, 142, 9, 207, 149, 206, 116, 236, 142, 9, 1, 213, + 27, 4, 223, 95, 2, 196, 12, 9, 1, 183, 4, 223, 95, 2, 196, 13, 60, 9, 1, + 199, 220, 4, 75, 60, 9, 1, 199, 220, 4, 115, 185, 60, 9, 1, 222, 7, 4, + 105, 185, 195, 85, 60, 9, 81, 199, 215, 9, 209, 10, 87, 58, 9, 209, 184, + 87, 58, 9, 2, 137, 193, 23, 251, 208, 9, 2, 130, 193, 23, 223, 63, 9, 2, + 130, 193, 23, 223, 181, 9, 2, 130, 193, 23, 199, 173, 9, 217, 144, 193, + 179, 9, 200, 182, 131, 215, 236, 9, 235, 130, 217, 143, 9, 132, 217, 144, + 139, 217, 143, 9, 1, 248, 248, 4, 2, 196, 13, 60, 9, 1, 248, 248, 4, 230, + 60, 58, 9, 1, 223, 9, 4, 105, 185, 58, 9, 1, 199, 220, 4, 105, 185, 58, + 9, 1, 233, 49, 4, 75, 248, 235, 23, 115, 185, 58, 9, 1, 208, 92, 4, 75, + 60, 9, 1, 220, 38, 4, 55, 164, 9, 1, 92, 4, 115, 185, 58, 9, 1, 99, 4, + 105, 185, 248, 235, 23, 230, 60, 58, 9, 1, 99, 4, 105, 185, 248, 235, 23, + 75, 58, 9, 1, 207, 73, 4, 219, 6, 9, 1, 193, 134, 4, 75, 193, 52, 9, 1, + 206, 143, 192, 75, 9, 1, 130, 251, 194, 9, 1, 238, 6, 4, 115, 185, 60, 9, + 1, 205, 194, 4, 115, 185, 60, 9, 1, 231, 230, 4, 223, 95, 106, 9, 1, 201, + 54, 193, 133, 9, 1, 191, 114, 4, 223, 95, 196, 13, 58, 9, 1, 251, 233, 4, + 115, 185, 60, 9, 1, 222, 109, 4, 75, 60, 9, 1, 208, 92, 4, 75, 248, 235, + 23, 213, 46, 185, 58, 9, 1, 248, 248, 4, 2, 92, 58, 9, 1, 210, 44, 4, 2, + 92, 58, 9, 1, 199, 115, 4, 2, 199, 115, 58, 9, 1, 207, 73, 4, 2, 213, 27, + 58, 9, 1, 99, 4, 105, 185, 248, 235, 23, 2, 213, 27, 58, 9, 1, 252, 2, + 233, 48, 9, 1, 252, 2, 208, 91, 9, 1, 252, 2, 213, 26, 9, 1, 210, 44, 4, + 2, 196, 12, 9, 1, 199, 115, 4, 2, 196, 12, 9, 1, 197, 125, 4, 2, 196, 12, + 9, 1, 199, 150, 4, 2, 196, 12, 9, 1, 222, 7, 4, 2, 196, 12, 9, 1, 231, + 89, 4, 115, 185, 58, 9, 1, 252, 2, 208, 92, 4, 115, 185, 58, 9, 1, 223, + 9, 4, 115, 185, 58, 9, 1, 223, 9, 4, 115, 185, 60, 9, 1, 220, 38, 4, 2, + 9, 1, 199, 220, 58, 9, 1, 230, 226, 9, 2, 233, 76, 192, 75, 9, 2, 137, + 233, 76, 192, 75, 9, 2, 137, 99, 249, 83, 4, 105, 185, 60, 9, 2, 137, + 193, 23, 205, 183, 9, 2, 137, 191, 116, 9, 220, 15, 206, 116, 75, 58, 9, + 220, 15, 206, 116, 75, 60, 9, 200, 207, 60, 9, 220, 15, 243, 13, 60, 9, + 220, 15, 206, 116, 75, 223, 120, 243, 13, 60, 9, 2, 130, 193, 133, 9, 2, + 137, 193, 23, 251, 32, 9, 2, 137, 205, 193, 9, 2, 137, 251, 232, 9, 2, + 137, 208, 91, 9, 2, 137, 213, 27, 4, 222, 54, 9, 2, 130, 213, 27, 4, 222, + 54, 9, 2, 137, 193, 23, 250, 183, 9, 2, 137, 193, 23, 250, 220, 9, 2, + 137, 193, 23, 251, 133, 9, 2, 137, 193, 23, 205, 172, 9, 2, 137, 193, 23, + 208, 54, 9, 2, 137, 193, 23, 193, 157, 9, 2, 137, 232, 159, 217, 53, 9, + 2, 137, 3, 205, 188, 9, 236, 220, 234, 97, 79, 250, 132, 9, 154, 237, + 248, 60, 9, 238, 173, 233, 72, 9, 238, 173, 237, 247, 9, 238, 173, 222, + 54, 9, 238, 173, 233, 70, 9, 238, 173, 237, 245, 9, 238, 173, 222, 52, 9, + 163, 91, 75, 58, 9, 163, 105, 185, 58, 9, 163, 219, 7, 58, 9, 163, 91, + 75, 60, 9, 163, 105, 185, 60, 9, 163, 219, 7, 60, 9, 211, 79, 233, 70, 9, + 211, 79, 237, 245, 9, 211, 79, 222, 52, 9, 2, 137, 193, 133, 9, 233, 73, + 4, 206, 189, 9, 233, 73, 4, 75, 58, 9, 222, 55, 4, 75, 60, 9, 45, 250, + 238, 58, 9, 50, 250, 238, 58, 9, 45, 250, 238, 60, 9, 50, 250, 238, 60, + 9, 55, 50, 250, 238, 58, 9, 55, 50, 250, 238, 93, 4, 236, 142, 9, 50, + 250, 238, 93, 4, 236, 142, 9, 237, 248, 4, 236, 142, 9, 87, 202, 207, + 213, 27, 231, 59, 100, 3, 223, 95, 247, 121, 100, 3, 247, 121, 100, 3, + 251, 73, 100, 3, 195, 35, 100, 1, 203, 41, 65, 100, 1, 65, 100, 1, 252, + 208, 100, 1, 68, 100, 1, 223, 201, 100, 1, 66, 100, 1, 196, 30, 100, 1, + 117, 146, 100, 1, 117, 172, 100, 1, 247, 124, 71, 100, 1, 203, 41, 71, + 100, 1, 71, 100, 1, 251, 238, 100, 1, 247, 124, 74, 100, 1, 203, 41, 74, + 100, 1, 74, 100, 1, 250, 165, 100, 1, 155, 100, 1, 221, 217, 100, 1, 231, + 242, 100, 1, 231, 93, 100, 1, 214, 70, 100, 1, 247, 162, 100, 1, 247, 3, + 100, 1, 223, 34, 100, 1, 222, 254, 100, 1, 212, 103, 100, 1, 197, 132, + 100, 1, 197, 120, 100, 1, 237, 193, 100, 1, 237, 177, 100, 1, 213, 81, + 100, 1, 190, 190, 100, 1, 199, 49, 100, 1, 238, 34, 100, 1, 237, 70, 100, + 1, 181, 100, 1, 213, 63, 100, 1, 168, 100, 1, 209, 230, 100, 1, 249, 155, + 100, 1, 248, 205, 100, 1, 174, 100, 1, 170, 100, 1, 165, 100, 1, 206, + 110, 100, 1, 173, 100, 1, 219, 75, 100, 1, 219, 64, 100, 1, 195, 188, + 100, 1, 203, 166, 100, 1, 201, 176, 100, 1, 188, 100, 1, 140, 100, 18, 3, + 211, 153, 100, 18, 3, 211, 87, 100, 3, 212, 143, 100, 3, 250, 147, 100, + 18, 3, 252, 208, 100, 18, 3, 68, 100, 18, 3, 223, 201, 100, 18, 3, 66, + 100, 18, 3, 196, 30, 100, 18, 3, 117, 146, 100, 18, 3, 117, 206, 111, + 100, 18, 3, 247, 124, 71, 100, 18, 3, 203, 41, 71, 100, 18, 3, 71, 100, + 18, 3, 251, 238, 100, 18, 3, 247, 124, 74, 100, 18, 3, 203, 41, 74, 100, + 18, 3, 74, 100, 18, 3, 250, 165, 100, 3, 195, 40, 100, 18, 3, 208, 209, + 71, 100, 18, 3, 250, 142, 100, 211, 115, 100, 201, 39, 3, 196, 154, 100, + 201, 39, 3, 251, 75, 100, 230, 213, 252, 62, 100, 252, 49, 252, 62, 100, + 18, 3, 247, 124, 180, 71, 100, 18, 3, 196, 152, 100, 18, 3, 196, 29, 100, + 1, 208, 98, 100, 1, 221, 195, 100, 1, 231, 68, 100, 1, 191, 123, 100, 1, + 237, 182, 100, 1, 207, 7, 100, 1, 233, 111, 100, 1, 191, 175, 100, 1, + 117, 206, 111, 100, 1, 117, 219, 76, 100, 18, 3, 117, 172, 100, 18, 3, + 117, 219, 76, 100, 237, 240, 100, 55, 237, 240, 100, 17, 191, 77, 100, + 17, 107, 100, 17, 109, 100, 17, 138, 100, 17, 134, 100, 17, 150, 100, 17, + 169, 100, 17, 175, 100, 17, 171, 100, 17, 178, 100, 252, 70, 56, 100, 3, + 137, 201, 247, 236, 142, 100, 1, 247, 124, 65, 100, 1, 211, 153, 100, 1, + 211, 87, 100, 1, 250, 142, 100, 1, 196, 152, 100, 1, 196, 29, 100, 1, + 217, 45, 237, 193, 100, 1, 191, 71, 100, 1, 88, 170, 100, 1, 231, 129, + 100, 1, 222, 232, 100, 1, 231, 13, 201, 64, 100, 1, 237, 183, 100, 1, + 249, 55, 248, 227, 251, 102, 248, 227, 3, 247, 121, 248, 227, 3, 251, 73, + 248, 227, 3, 195, 35, 248, 227, 1, 65, 248, 227, 1, 252, 208, 248, 227, + 1, 68, 248, 227, 1, 223, 201, 248, 227, 1, 66, 248, 227, 1, 196, 30, 248, + 227, 1, 117, 146, 248, 227, 1, 117, 172, 248, 227, 1, 71, 248, 227, 1, + 251, 238, 248, 227, 1, 74, 248, 227, 1, 250, 165, 248, 227, 1, 155, 248, + 227, 1, 221, 217, 248, 227, 1, 231, 242, 248, 227, 1, 231, 93, 248, 227, + 1, 214, 70, 248, 227, 1, 247, 162, 248, 227, 1, 247, 3, 248, 227, 1, 223, + 34, 248, 227, 1, 222, 254, 248, 227, 1, 212, 103, 248, 227, 1, 197, 132, + 248, 227, 1, 197, 120, 248, 227, 1, 237, 193, 248, 227, 1, 237, 177, 248, + 227, 1, 213, 81, 248, 227, 1, 190, 190, 248, 227, 1, 199, 49, 248, 227, + 1, 238, 34, 248, 227, 1, 237, 70, 248, 227, 1, 181, 248, 227, 1, 168, + 248, 227, 1, 209, 230, 248, 227, 1, 249, 155, 248, 227, 1, 248, 205, 248, + 227, 1, 174, 248, 227, 1, 170, 248, 227, 1, 165, 248, 227, 1, 173, 248, + 227, 1, 203, 166, 248, 227, 1, 201, 176, 248, 227, 1, 188, 248, 227, 1, + 140, 248, 227, 3, 212, 143, 248, 227, 3, 250, 147, 248, 227, 18, 3, 252, + 208, 248, 227, 18, 3, 68, 248, 227, 18, 3, 223, 201, 248, 227, 18, 3, 66, + 248, 227, 18, 3, 196, 30, 248, 227, 18, 3, 117, 146, 248, 227, 18, 3, + 117, 206, 111, 248, 227, 18, 3, 71, 248, 227, 18, 3, 251, 238, 248, 227, + 18, 3, 74, 248, 227, 18, 3, 250, 165, 248, 227, 3, 195, 40, 248, 227, 1, + 221, 206, 190, 190, 248, 227, 250, 166, 219, 200, 77, 248, 227, 1, 206, + 110, 248, 227, 1, 207, 7, 248, 227, 1, 191, 175, 248, 227, 1, 117, 206, + 111, 248, 227, 1, 117, 219, 76, 248, 227, 18, 3, 117, 172, 248, 227, 18, + 3, 117, 219, 76, 248, 227, 17, 191, 77, 248, 227, 17, 107, 248, 227, 17, + 109, 248, 227, 17, 138, 248, 227, 17, 134, 248, 227, 17, 150, 248, 227, + 17, 169, 248, 227, 17, 175, 248, 227, 17, 171, 248, 227, 17, 178, 248, + 227, 1, 207, 188, 4, 82, 237, 40, 248, 227, 1, 207, 188, 4, 110, 237, 40, + 248, 227, 206, 37, 77, 248, 227, 206, 37, 56, 248, 227, 238, 172, 212, + 135, 107, 248, 227, 238, 172, 212, 135, 109, 248, 227, 238, 172, 212, + 135, 138, 248, 227, 238, 172, 212, 135, 134, 248, 227, 238, 172, 212, + 135, 91, 219, 183, 199, 39, 199, 34, 237, 101, 248, 227, 238, 172, 237, + 102, 202, 131, 248, 227, 223, 56, 248, 227, 231, 209, 77, 248, 227, 1, + 195, 150, 251, 73, 248, 227, 252, 70, 56, 248, 227, 205, 139, 77, 230, + 146, 3, 252, 43, 248, 169, 230, 146, 3, 248, 169, 230, 146, 3, 195, 35, + 230, 146, 1, 65, 230, 146, 1, 252, 208, 230, 146, 1, 68, 230, 146, 1, + 223, 201, 230, 146, 1, 66, 230, 146, 1, 196, 30, 230, 146, 1, 234, 190, + 230, 146, 1, 251, 238, 230, 146, 1, 211, 89, 230, 146, 1, 250, 165, 230, + 146, 1, 155, 230, 146, 1, 221, 217, 230, 146, 1, 231, 242, 230, 146, 1, + 231, 93, 230, 146, 1, 214, 70, 230, 146, 1, 247, 162, 230, 146, 1, 247, + 3, 230, 146, 1, 223, 34, 230, 146, 1, 222, 254, 230, 146, 1, 212, 103, + 230, 146, 1, 197, 132, 230, 146, 1, 197, 120, 230, 146, 1, 237, 193, 230, + 146, 1, 237, 177, 230, 146, 1, 213, 81, 230, 146, 1, 190, 190, 230, 146, + 1, 199, 49, 230, 146, 1, 238, 34, 230, 146, 1, 237, 70, 230, 146, 1, 181, + 230, 146, 1, 168, 230, 146, 1, 209, 230, 230, 146, 1, 249, 155, 230, 146, + 1, 248, 205, 230, 146, 1, 174, 230, 146, 1, 170, 230, 146, 1, 165, 230, + 146, 1, 173, 230, 146, 1, 219, 75, 230, 146, 1, 195, 188, 230, 146, 1, + 203, 166, 230, 146, 1, 188, 230, 146, 1, 140, 230, 146, 3, 212, 143, 230, + 146, 18, 3, 252, 208, 230, 146, 18, 3, 68, 230, 146, 18, 3, 223, 201, + 230, 146, 18, 3, 66, 230, 146, 18, 3, 196, 30, 230, 146, 18, 3, 234, 190, + 230, 146, 18, 3, 251, 238, 230, 146, 18, 3, 211, 89, 230, 146, 18, 3, + 250, 165, 230, 146, 3, 195, 40, 230, 146, 3, 196, 157, 230, 146, 1, 221, + 195, 230, 146, 1, 231, 68, 230, 146, 1, 191, 123, 230, 146, 1, 206, 110, + 230, 146, 1, 233, 111, 230, 146, 17, 191, 77, 230, 146, 17, 107, 230, + 146, 17, 109, 230, 146, 17, 138, 230, 146, 17, 134, 230, 146, 17, 150, + 230, 146, 17, 169, 230, 146, 17, 175, 230, 146, 17, 171, 230, 146, 17, + 178, 230, 146, 198, 133, 230, 146, 252, 42, 230, 146, 223, 77, 230, 146, + 196, 58, 230, 146, 234, 150, 211, 94, 230, 146, 3, 192, 115, 230, 146, + 252, 70, 56, 230, 163, 3, 247, 121, 230, 163, 3, 251, 73, 230, 163, 3, + 195, 35, 230, 163, 1, 65, 230, 163, 1, 252, 208, 230, 163, 1, 68, 230, + 163, 1, 223, 201, 230, 163, 1, 66, 230, 163, 1, 196, 30, 230, 163, 1, + 117, 146, 230, 163, 1, 117, 172, 230, 163, 18, 247, 124, 71, 230, 163, 1, + 71, 230, 163, 1, 251, 238, 230, 163, 18, 247, 124, 74, 230, 163, 1, 74, + 230, 163, 1, 250, 165, 230, 163, 1, 155, 230, 163, 1, 221, 217, 230, 163, + 1, 231, 242, 230, 163, 1, 231, 93, 230, 163, 1, 214, 70, 230, 163, 1, + 247, 162, 230, 163, 1, 247, 3, 230, 163, 1, 223, 34, 230, 163, 1, 222, + 254, 230, 163, 1, 212, 103, 230, 163, 1, 197, 132, 230, 163, 1, 197, 120, + 230, 163, 1, 237, 193, 230, 163, 1, 237, 177, 230, 163, 1, 213, 81, 230, + 163, 1, 190, 190, 230, 163, 1, 199, 49, 230, 163, 1, 238, 34, 230, 163, + 1, 237, 70, 230, 163, 1, 181, 230, 163, 1, 168, 230, 163, 1, 209, 230, + 230, 163, 1, 249, 155, 230, 163, 1, 248, 205, 230, 163, 1, 174, 230, 163, + 1, 170, 230, 163, 1, 165, 230, 163, 1, 173, 230, 163, 1, 219, 75, 230, + 163, 1, 195, 188, 230, 163, 1, 203, 166, 230, 163, 1, 201, 176, 230, 163, + 1, 188, 230, 163, 1, 140, 230, 163, 3, 212, 143, 230, 163, 3, 250, 147, + 230, 163, 18, 3, 252, 208, 230, 163, 18, 3, 68, 230, 163, 18, 3, 223, + 201, 230, 163, 18, 3, 66, 230, 163, 18, 3, 196, 30, 230, 163, 18, 3, 117, + 146, 230, 163, 18, 3, 117, 206, 111, 230, 163, 18, 3, 247, 124, 71, 230, + 163, 18, 3, 71, 230, 163, 18, 3, 251, 238, 230, 163, 18, 3, 247, 124, 74, + 230, 163, 18, 3, 74, 230, 163, 18, 3, 250, 165, 230, 163, 3, 195, 40, + 230, 163, 211, 115, 230, 163, 1, 117, 206, 111, 230, 163, 1, 117, 219, + 76, 230, 163, 18, 3, 117, 172, 230, 163, 18, 3, 117, 219, 76, 230, 163, + 17, 191, 77, 230, 163, 17, 107, 230, 163, 17, 109, 230, 163, 17, 138, + 230, 163, 17, 134, 230, 163, 17, 150, 230, 163, 17, 169, 230, 163, 17, + 175, 230, 163, 17, 171, 230, 163, 17, 178, 230, 163, 252, 70, 56, 230, + 163, 206, 37, 56, 230, 163, 1, 191, 71, 230, 163, 3, 200, 206, 230, 163, + 3, 203, 156, 230, 163, 3, 217, 141, 230, 163, 3, 198, 224, 212, 144, 58, + 230, 163, 3, 243, 13, 212, 144, 58, 230, 163, 3, 197, 15, 212, 144, 58, + 211, 47, 3, 247, 121, 211, 47, 3, 251, 73, 211, 47, 3, 195, 35, 211, 47, + 1, 65, 211, 47, 1, 252, 208, 211, 47, 1, 68, 211, 47, 1, 223, 201, 211, + 47, 1, 66, 211, 47, 1, 196, 30, 211, 47, 1, 117, 146, 211, 47, 1, 117, + 172, 211, 47, 1, 71, 211, 47, 1, 251, 238, 211, 47, 1, 74, 211, 47, 1, + 250, 165, 211, 47, 1, 155, 211, 47, 1, 221, 217, 211, 47, 1, 231, 242, + 211, 47, 1, 231, 93, 211, 47, 1, 214, 70, 211, 47, 1, 247, 162, 211, 47, + 1, 247, 3, 211, 47, 1, 223, 34, 211, 47, 1, 222, 254, 211, 47, 1, 212, + 103, 211, 47, 1, 197, 132, 211, 47, 1, 197, 120, 211, 47, 1, 237, 193, + 211, 47, 1, 237, 177, 211, 47, 1, 213, 81, 211, 47, 1, 190, 190, 211, 47, + 1, 199, 49, 211, 47, 1, 238, 34, 211, 47, 1, 237, 70, 211, 47, 1, 181, + 211, 47, 1, 168, 211, 47, 1, 209, 230, 211, 47, 1, 249, 155, 211, 47, 1, + 248, 205, 211, 47, 1, 174, 211, 47, 1, 170, 211, 47, 1, 165, 211, 47, 1, + 173, 211, 47, 1, 219, 75, 211, 47, 1, 195, 188, 211, 47, 1, 203, 166, + 211, 47, 1, 201, 176, 211, 47, 1, 188, 211, 47, 1, 140, 211, 47, 3, 212, + 143, 211, 47, 3, 250, 147, 211, 47, 18, 3, 252, 208, 211, 47, 18, 3, 68, + 211, 47, 18, 3, 223, 201, 211, 47, 18, 3, 66, 211, 47, 18, 3, 196, 30, + 211, 47, 18, 3, 117, 146, 211, 47, 18, 3, 117, 206, 111, 211, 47, 18, 3, + 71, 211, 47, 18, 3, 251, 238, 211, 47, 18, 3, 74, 211, 47, 18, 3, 250, + 165, 211, 47, 3, 195, 40, 211, 47, 3, 211, 0, 211, 47, 251, 239, 219, + 200, 77, 211, 47, 250, 166, 219, 200, 77, 211, 47, 1, 206, 110, 211, 47, + 1, 207, 7, 211, 47, 1, 191, 175, 211, 47, 1, 117, 206, 111, 211, 47, 1, + 117, 219, 76, 211, 47, 18, 3, 117, 172, 211, 47, 18, 3, 117, 219, 76, + 211, 47, 17, 191, 77, 211, 47, 17, 107, 211, 47, 17, 109, 211, 47, 17, + 138, 211, 47, 17, 134, 211, 47, 17, 150, 211, 47, 17, 169, 211, 47, 17, + 175, 211, 47, 17, 171, 211, 47, 17, 178, 211, 47, 223, 56, 211, 47, 1, + 193, 190, 211, 47, 232, 120, 91, 208, 24, 211, 47, 232, 120, 91, 230, 72, + 211, 47, 232, 120, 115, 208, 22, 211, 47, 232, 120, 91, 202, 129, 211, + 47, 232, 120, 91, 234, 161, 211, 47, 232, 120, 115, 202, 126, 44, 3, 251, + 73, 44, 3, 195, 35, 44, 1, 65, 44, 1, 252, 208, 44, 1, 68, 44, 1, 223, + 201, 44, 1, 66, 44, 1, 196, 30, 44, 1, 71, 44, 1, 234, 190, 44, 1, 251, + 238, 44, 1, 74, 44, 1, 211, 89, 44, 1, 250, 165, 44, 1, 155, 44, 1, 214, + 70, 44, 1, 247, 162, 44, 1, 223, 34, 44, 1, 212, 103, 44, 1, 197, 132, + 44, 1, 213, 81, 44, 1, 190, 190, 44, 1, 181, 44, 1, 213, 63, 44, 1, 168, + 44, 1, 174, 44, 1, 170, 44, 1, 165, 44, 1, 206, 110, 44, 1, 173, 44, 1, + 219, 75, 44, 1, 219, 64, 44, 1, 195, 188, 44, 1, 203, 166, 44, 1, 201, + 176, 44, 1, 188, 44, 1, 140, 44, 18, 3, 252, 208, 44, 18, 3, 68, 44, 18, + 3, 223, 201, 44, 18, 3, 66, 44, 18, 3, 196, 30, 44, 18, 3, 71, 44, 18, 3, + 234, 190, 44, 18, 3, 251, 238, 44, 18, 3, 74, 44, 18, 3, 211, 89, 44, 18, + 3, 250, 165, 44, 3, 195, 40, 44, 211, 115, 44, 250, 166, 219, 200, 77, 44, 17, 191, 77, 44, 17, 107, 44, 17, 109, 44, 17, 138, 44, 17, 134, 44, - 17, 149, 44, 17, 169, 44, 17, 175, 44, 17, 171, 44, 17, 178, 44, 31, 199, - 95, 44, 31, 91, 228, 140, 44, 31, 91, 189, 44, 237, 204, 56, 44, 215, - 214, 56, 44, 192, 78, 56, 44, 237, 142, 56, 44, 238, 230, 56, 44, 250, - 220, 93, 56, 44, 206, 36, 56, 44, 31, 56, 199, 99, 3, 33, 247, 120, 58, - 199, 99, 3, 247, 119, 199, 99, 3, 251, 71, 199, 99, 3, 195, 35, 199, 99, - 3, 33, 251, 72, 58, 199, 99, 1, 65, 199, 99, 1, 252, 206, 199, 99, 1, 68, - 199, 99, 1, 223, 199, 199, 99, 1, 66, 199, 99, 1, 196, 30, 199, 99, 1, - 117, 146, 199, 99, 1, 117, 172, 199, 99, 1, 71, 199, 99, 1, 234, 188, - 199, 99, 1, 251, 236, 199, 99, 1, 74, 199, 99, 1, 211, 87, 199, 99, 1, - 250, 163, 199, 99, 1, 155, 199, 99, 1, 221, 215, 199, 99, 1, 231, 240, - 199, 99, 1, 231, 91, 199, 99, 1, 214, 68, 199, 99, 1, 247, 160, 199, 99, - 1, 247, 1, 199, 99, 1, 223, 32, 199, 99, 1, 222, 252, 199, 99, 1, 212, - 101, 199, 99, 1, 197, 132, 199, 99, 1, 197, 120, 199, 99, 1, 237, 191, - 199, 99, 1, 237, 175, 199, 99, 1, 213, 79, 199, 99, 1, 190, 190, 199, 99, - 1, 199, 49, 199, 99, 1, 238, 32, 199, 99, 1, 237, 68, 199, 99, 1, 180, - 199, 99, 1, 168, 199, 99, 1, 209, 228, 199, 99, 1, 249, 153, 199, 99, 1, - 248, 203, 199, 99, 1, 174, 199, 99, 1, 170, 199, 99, 1, 165, 199, 99, 1, - 206, 109, 199, 99, 1, 173, 199, 99, 1, 219, 73, 199, 99, 1, 219, 62, 199, - 99, 1, 195, 188, 199, 99, 1, 203, 165, 199, 99, 1, 201, 175, 199, 99, 1, - 188, 199, 99, 1, 140, 199, 99, 3, 212, 141, 199, 99, 3, 250, 145, 199, - 99, 18, 3, 252, 206, 199, 99, 18, 3, 68, 199, 99, 18, 3, 223, 199, 199, + 17, 150, 44, 17, 169, 44, 17, 175, 44, 17, 171, 44, 17, 178, 44, 31, 199, + 95, 44, 31, 91, 228, 142, 44, 31, 91, 189, 44, 237, 206, 56, 44, 215, + 216, 56, 44, 192, 78, 56, 44, 237, 144, 56, 44, 238, 232, 56, 44, 250, + 222, 93, 56, 44, 206, 37, 56, 44, 31, 56, 199, 99, 3, 33, 247, 122, 58, + 199, 99, 3, 247, 121, 199, 99, 3, 251, 73, 199, 99, 3, 195, 35, 199, 99, + 3, 33, 251, 74, 58, 199, 99, 1, 65, 199, 99, 1, 252, 208, 199, 99, 1, 68, + 199, 99, 1, 223, 201, 199, 99, 1, 66, 199, 99, 1, 196, 30, 199, 99, 1, + 117, 146, 199, 99, 1, 117, 172, 199, 99, 1, 71, 199, 99, 1, 234, 190, + 199, 99, 1, 251, 238, 199, 99, 1, 74, 199, 99, 1, 211, 89, 199, 99, 1, + 250, 165, 199, 99, 1, 155, 199, 99, 1, 221, 217, 199, 99, 1, 231, 242, + 199, 99, 1, 231, 93, 199, 99, 1, 214, 70, 199, 99, 1, 247, 162, 199, 99, + 1, 247, 3, 199, 99, 1, 223, 34, 199, 99, 1, 222, 254, 199, 99, 1, 212, + 103, 199, 99, 1, 197, 132, 199, 99, 1, 197, 120, 199, 99, 1, 237, 193, + 199, 99, 1, 237, 177, 199, 99, 1, 213, 81, 199, 99, 1, 190, 190, 199, 99, + 1, 199, 49, 199, 99, 1, 238, 34, 199, 99, 1, 237, 70, 199, 99, 1, 181, + 199, 99, 1, 168, 199, 99, 1, 209, 230, 199, 99, 1, 249, 155, 199, 99, 1, + 248, 205, 199, 99, 1, 174, 199, 99, 1, 170, 199, 99, 1, 165, 199, 99, 1, + 206, 110, 199, 99, 1, 173, 199, 99, 1, 219, 75, 199, 99, 1, 219, 64, 199, + 99, 1, 195, 188, 199, 99, 1, 203, 166, 199, 99, 1, 201, 176, 199, 99, 1, + 188, 199, 99, 1, 140, 199, 99, 3, 212, 143, 199, 99, 3, 250, 147, 199, + 99, 18, 3, 252, 208, 199, 99, 18, 3, 68, 199, 99, 18, 3, 223, 201, 199, 99, 18, 3, 66, 199, 99, 18, 3, 196, 30, 199, 99, 18, 3, 117, 146, 199, - 99, 18, 3, 117, 206, 110, 199, 99, 18, 3, 71, 199, 99, 18, 3, 234, 188, - 199, 99, 18, 3, 251, 236, 199, 99, 18, 3, 74, 199, 99, 18, 3, 211, 87, - 199, 99, 18, 3, 250, 163, 199, 99, 3, 195, 40, 199, 99, 219, 198, 77, - 199, 99, 251, 237, 219, 198, 77, 199, 99, 1, 197, 168, 199, 99, 1, 235, - 35, 199, 99, 1, 206, 90, 199, 99, 1, 214, 232, 209, 46, 199, 99, 1, 117, - 206, 110, 199, 99, 1, 117, 219, 74, 199, 99, 18, 3, 117, 172, 199, 99, - 18, 3, 117, 219, 74, 199, 99, 17, 191, 77, 199, 99, 17, 107, 199, 99, 17, - 109, 199, 99, 17, 138, 199, 99, 17, 134, 199, 99, 17, 149, 199, 99, 17, + 99, 18, 3, 117, 206, 111, 199, 99, 18, 3, 71, 199, 99, 18, 3, 234, 190, + 199, 99, 18, 3, 251, 238, 199, 99, 18, 3, 74, 199, 99, 18, 3, 211, 89, + 199, 99, 18, 3, 250, 165, 199, 99, 3, 195, 40, 199, 99, 219, 200, 77, + 199, 99, 251, 239, 219, 200, 77, 199, 99, 1, 197, 168, 199, 99, 1, 235, + 37, 199, 99, 1, 206, 91, 199, 99, 1, 214, 234, 209, 48, 199, 99, 1, 117, + 206, 111, 199, 99, 1, 117, 219, 76, 199, 99, 18, 3, 117, 172, 199, 99, + 18, 3, 117, 219, 76, 199, 99, 17, 191, 77, 199, 99, 17, 107, 199, 99, 17, + 109, 199, 99, 17, 138, 199, 99, 17, 134, 199, 99, 17, 150, 199, 99, 17, 169, 199, 99, 17, 175, 199, 99, 17, 171, 199, 99, 17, 178, 199, 99, 3, - 202, 210, 199, 99, 232, 118, 17, 191, 78, 40, 211, 155, 208, 253, 79, - 134, 199, 99, 232, 118, 17, 91, 40, 211, 155, 208, 253, 79, 134, 199, 99, - 232, 118, 17, 105, 40, 211, 155, 208, 253, 79, 134, 199, 99, 232, 118, - 17, 115, 40, 211, 155, 208, 253, 79, 134, 199, 99, 232, 118, 17, 91, 40, - 233, 229, 208, 253, 79, 134, 199, 99, 232, 118, 17, 105, 40, 233, 229, - 208, 253, 79, 134, 199, 99, 232, 118, 17, 115, 40, 233, 229, 208, 253, - 79, 134, 199, 99, 3, 197, 48, 222, 81, 3, 201, 246, 247, 119, 222, 81, 3, - 247, 119, 222, 81, 3, 251, 71, 222, 81, 3, 195, 35, 222, 81, 3, 202, 210, - 222, 81, 1, 65, 222, 81, 1, 252, 206, 222, 81, 1, 68, 222, 81, 1, 223, - 199, 222, 81, 1, 66, 222, 81, 1, 196, 30, 222, 81, 1, 117, 146, 222, 81, - 1, 117, 172, 222, 81, 1, 71, 222, 81, 1, 234, 188, 222, 81, 1, 251, 236, - 222, 81, 1, 74, 222, 81, 1, 211, 87, 222, 81, 1, 250, 163, 222, 81, 1, - 155, 222, 81, 1, 221, 215, 222, 81, 1, 231, 240, 222, 81, 1, 231, 91, - 222, 81, 1, 214, 68, 222, 81, 1, 247, 160, 222, 81, 1, 247, 1, 222, 81, - 1, 223, 32, 222, 81, 1, 222, 252, 222, 81, 1, 212, 101, 222, 81, 1, 197, - 132, 222, 81, 1, 197, 120, 222, 81, 1, 237, 191, 222, 81, 1, 237, 175, - 222, 81, 1, 213, 79, 222, 81, 1, 190, 190, 222, 81, 1, 199, 49, 222, 81, - 1, 238, 32, 222, 81, 1, 237, 68, 222, 81, 1, 180, 222, 81, 1, 168, 222, - 81, 1, 209, 228, 222, 81, 1, 249, 153, 222, 81, 1, 248, 203, 222, 81, 1, - 174, 222, 81, 1, 170, 222, 81, 1, 165, 222, 81, 1, 206, 109, 222, 81, 1, - 173, 222, 81, 1, 219, 73, 222, 81, 1, 195, 188, 222, 81, 1, 203, 165, - 222, 81, 1, 201, 175, 222, 81, 1, 188, 222, 81, 1, 140, 222, 81, 3, 212, - 141, 222, 81, 3, 250, 145, 222, 81, 18, 3, 252, 206, 222, 81, 18, 3, 68, - 222, 81, 18, 3, 223, 199, 222, 81, 18, 3, 66, 222, 81, 18, 3, 196, 30, - 222, 81, 18, 3, 117, 146, 222, 81, 18, 3, 117, 206, 110, 222, 81, 18, 3, - 71, 222, 81, 18, 3, 234, 188, 222, 81, 18, 3, 251, 236, 222, 81, 18, 3, - 74, 222, 81, 18, 3, 211, 87, 222, 81, 18, 3, 250, 163, 222, 81, 3, 195, - 40, 222, 81, 219, 198, 77, 222, 81, 251, 237, 219, 198, 77, 222, 81, 1, - 214, 232, 209, 46, 222, 81, 1, 233, 109, 222, 81, 1, 117, 206, 110, 222, - 81, 1, 117, 219, 74, 222, 81, 18, 3, 117, 172, 222, 81, 18, 3, 117, 219, - 74, 222, 81, 17, 191, 77, 222, 81, 17, 107, 222, 81, 17, 109, 222, 81, - 17, 138, 222, 81, 17, 134, 222, 81, 17, 149, 222, 81, 17, 169, 222, 81, - 17, 175, 222, 81, 17, 171, 222, 81, 17, 178, 222, 81, 3, 222, 237, 222, - 81, 3, 196, 75, 222, 81, 3, 33, 251, 72, 93, 183, 142, 3, 33, 251, 72, - 58, 142, 3, 247, 119, 142, 3, 251, 71, 142, 3, 195, 35, 142, 1, 195, 150, - 251, 71, 142, 1, 65, 142, 1, 252, 206, 142, 1, 68, 142, 1, 223, 199, 142, + 202, 211, 199, 99, 232, 120, 17, 191, 78, 40, 211, 157, 208, 255, 79, + 134, 199, 99, 232, 120, 17, 91, 40, 211, 157, 208, 255, 79, 134, 199, 99, + 232, 120, 17, 105, 40, 211, 157, 208, 255, 79, 134, 199, 99, 232, 120, + 17, 115, 40, 211, 157, 208, 255, 79, 134, 199, 99, 232, 120, 17, 91, 40, + 233, 231, 208, 255, 79, 134, 199, 99, 232, 120, 17, 105, 40, 233, 231, + 208, 255, 79, 134, 199, 99, 232, 120, 17, 115, 40, 233, 231, 208, 255, + 79, 134, 199, 99, 3, 197, 48, 222, 83, 3, 201, 247, 247, 121, 222, 83, 3, + 247, 121, 222, 83, 3, 251, 73, 222, 83, 3, 195, 35, 222, 83, 3, 202, 211, + 222, 83, 1, 65, 222, 83, 1, 252, 208, 222, 83, 1, 68, 222, 83, 1, 223, + 201, 222, 83, 1, 66, 222, 83, 1, 196, 30, 222, 83, 1, 117, 146, 222, 83, + 1, 117, 172, 222, 83, 1, 71, 222, 83, 1, 234, 190, 222, 83, 1, 251, 238, + 222, 83, 1, 74, 222, 83, 1, 211, 89, 222, 83, 1, 250, 165, 222, 83, 1, + 155, 222, 83, 1, 221, 217, 222, 83, 1, 231, 242, 222, 83, 1, 231, 93, + 222, 83, 1, 214, 70, 222, 83, 1, 247, 162, 222, 83, 1, 247, 3, 222, 83, + 1, 223, 34, 222, 83, 1, 222, 254, 222, 83, 1, 212, 103, 222, 83, 1, 197, + 132, 222, 83, 1, 197, 120, 222, 83, 1, 237, 193, 222, 83, 1, 237, 177, + 222, 83, 1, 213, 81, 222, 83, 1, 190, 190, 222, 83, 1, 199, 49, 222, 83, + 1, 238, 34, 222, 83, 1, 237, 70, 222, 83, 1, 181, 222, 83, 1, 168, 222, + 83, 1, 209, 230, 222, 83, 1, 249, 155, 222, 83, 1, 248, 205, 222, 83, 1, + 174, 222, 83, 1, 170, 222, 83, 1, 165, 222, 83, 1, 206, 110, 222, 83, 1, + 173, 222, 83, 1, 219, 75, 222, 83, 1, 195, 188, 222, 83, 1, 203, 166, + 222, 83, 1, 201, 176, 222, 83, 1, 188, 222, 83, 1, 140, 222, 83, 3, 212, + 143, 222, 83, 3, 250, 147, 222, 83, 18, 3, 252, 208, 222, 83, 18, 3, 68, + 222, 83, 18, 3, 223, 201, 222, 83, 18, 3, 66, 222, 83, 18, 3, 196, 30, + 222, 83, 18, 3, 117, 146, 222, 83, 18, 3, 117, 206, 111, 222, 83, 18, 3, + 71, 222, 83, 18, 3, 234, 190, 222, 83, 18, 3, 251, 238, 222, 83, 18, 3, + 74, 222, 83, 18, 3, 211, 89, 222, 83, 18, 3, 250, 165, 222, 83, 3, 195, + 40, 222, 83, 219, 200, 77, 222, 83, 251, 239, 219, 200, 77, 222, 83, 1, + 214, 234, 209, 48, 222, 83, 1, 233, 111, 222, 83, 1, 117, 206, 111, 222, + 83, 1, 117, 219, 76, 222, 83, 18, 3, 117, 172, 222, 83, 18, 3, 117, 219, + 76, 222, 83, 17, 191, 77, 222, 83, 17, 107, 222, 83, 17, 109, 222, 83, + 17, 138, 222, 83, 17, 134, 222, 83, 17, 150, 222, 83, 17, 169, 222, 83, + 17, 175, 222, 83, 17, 171, 222, 83, 17, 178, 222, 83, 3, 222, 239, 222, + 83, 3, 196, 75, 222, 83, 3, 33, 251, 74, 93, 179, 142, 3, 33, 251, 74, + 58, 142, 3, 247, 121, 142, 3, 251, 73, 142, 3, 195, 35, 142, 1, 195, 150, + 251, 73, 142, 1, 65, 142, 1, 252, 208, 142, 1, 68, 142, 1, 223, 201, 142, 1, 66, 142, 1, 196, 30, 142, 1, 117, 146, 142, 1, 117, 172, 142, 1, 71, - 142, 1, 234, 188, 142, 1, 251, 236, 142, 1, 74, 142, 1, 211, 87, 142, 1, - 250, 163, 142, 1, 155, 142, 1, 221, 215, 142, 1, 231, 240, 142, 1, 231, - 91, 142, 1, 214, 68, 142, 1, 247, 160, 142, 1, 247, 1, 142, 1, 223, 32, - 142, 1, 222, 252, 142, 1, 212, 101, 142, 1, 197, 132, 142, 1, 197, 120, - 142, 1, 237, 191, 142, 1, 237, 175, 142, 1, 213, 79, 142, 1, 190, 190, - 142, 1, 199, 49, 142, 1, 238, 32, 142, 1, 237, 68, 142, 1, 180, 142, 1, - 213, 61, 142, 1, 168, 142, 1, 209, 228, 142, 1, 249, 153, 142, 1, 248, - 203, 142, 1, 174, 142, 1, 170, 142, 1, 165, 142, 1, 206, 109, 142, 1, - 173, 142, 1, 219, 73, 142, 1, 219, 62, 142, 1, 195, 188, 142, 1, 203, - 165, 142, 1, 201, 175, 142, 1, 188, 142, 1, 140, 142, 1, 197, 101, 142, - 3, 81, 249, 88, 195, 40, 142, 3, 243, 4, 195, 40, 142, 3, 250, 145, 142, - 18, 3, 252, 206, 142, 18, 3, 68, 142, 18, 3, 223, 199, 142, 18, 3, 66, - 142, 18, 3, 196, 30, 142, 18, 3, 117, 146, 142, 18, 3, 117, 206, 110, - 142, 18, 3, 71, 142, 18, 3, 234, 188, 142, 18, 3, 251, 236, 142, 18, 3, - 74, 142, 18, 3, 211, 87, 142, 18, 3, 250, 163, 142, 3, 195, 40, 142, 1, - 75, 207, 45, 142, 3, 210, 130, 142, 1, 243, 84, 218, 168, 142, 1, 243, - 84, 192, 159, 142, 1, 243, 84, 219, 63, 142, 250, 164, 219, 198, 77, 142, - 232, 118, 91, 211, 100, 142, 232, 118, 91, 232, 139, 142, 232, 118, 115, - 234, 155, 142, 232, 118, 91, 197, 35, 142, 232, 118, 91, 199, 86, 142, - 232, 118, 115, 197, 34, 142, 232, 118, 91, 233, 18, 142, 1, 251, 14, 223, - 199, 142, 1, 117, 206, 110, 142, 1, 117, 219, 74, 142, 18, 3, 117, 172, - 142, 18, 3, 117, 219, 74, 142, 17, 191, 77, 142, 17, 107, 142, 17, 109, - 142, 17, 138, 142, 17, 134, 142, 17, 149, 142, 17, 169, 142, 17, 175, - 142, 17, 171, 142, 17, 178, 142, 31, 199, 95, 142, 31, 91, 228, 140, 142, - 31, 91, 189, 142, 232, 118, 91, 208, 22, 142, 232, 118, 91, 230, 70, 142, - 232, 118, 115, 208, 20, 142, 232, 118, 91, 202, 128, 142, 232, 118, 91, - 234, 159, 142, 232, 118, 115, 202, 125, 142, 237, 209, 77, 142, 1, 243, - 84, 213, 80, 142, 1, 243, 84, 215, 61, 142, 1, 243, 84, 206, 110, 142, 1, - 243, 84, 172, 142, 1, 243, 84, 219, 74, 142, 1, 243, 84, 222, 152, 166, - 3, 247, 119, 166, 3, 251, 70, 166, 3, 195, 34, 166, 1, 250, 129, 166, 1, - 252, 159, 166, 1, 252, 5, 166, 1, 252, 20, 166, 1, 223, 43, 166, 1, 223, - 198, 166, 1, 196, 20, 166, 1, 196, 24, 166, 1, 223, 70, 166, 1, 223, 71, - 166, 1, 223, 182, 166, 1, 223, 184, 166, 1, 233, 196, 166, 1, 234, 183, - 166, 1, 251, 219, 166, 1, 210, 241, 166, 1, 211, 80, 166, 1, 250, 148, - 166, 1, 251, 163, 222, 27, 166, 1, 217, 119, 222, 27, 166, 1, 251, 163, - 231, 185, 166, 1, 217, 119, 231, 185, 166, 1, 222, 80, 214, 247, 166, 1, - 205, 132, 231, 185, 166, 1, 251, 163, 247, 68, 166, 1, 217, 119, 247, 68, - 166, 1, 251, 163, 223, 13, 166, 1, 217, 119, 223, 13, 166, 1, 199, 241, - 214, 247, 166, 1, 199, 241, 205, 131, 214, 248, 166, 1, 205, 132, 223, - 13, 166, 1, 251, 163, 197, 128, 166, 1, 217, 119, 197, 128, 166, 1, 251, - 163, 237, 182, 166, 1, 217, 119, 237, 182, 166, 1, 215, 92, 214, 197, - 166, 1, 205, 132, 237, 182, 166, 1, 251, 163, 199, 153, 166, 1, 217, 119, - 199, 153, 166, 1, 251, 163, 237, 202, 166, 1, 217, 119, 237, 202, 166, 1, - 237, 234, 214, 197, 166, 1, 205, 132, 237, 202, 166, 1, 251, 163, 210, - 71, 166, 1, 217, 119, 210, 71, 166, 1, 251, 163, 249, 55, 166, 1, 217, - 119, 249, 55, 166, 1, 217, 19, 166, 1, 251, 143, 249, 55, 166, 1, 192, - 85, 166, 1, 207, 121, 166, 1, 237, 234, 219, 247, 166, 1, 195, 156, 166, - 1, 199, 241, 205, 102, 166, 1, 215, 92, 205, 102, 166, 1, 237, 234, 205, - 102, 166, 1, 229, 251, 166, 1, 215, 92, 219, 247, 166, 1, 233, 61, 166, - 3, 251, 205, 166, 18, 3, 252, 15, 166, 18, 3, 221, 240, 252, 22, 166, 18, - 3, 237, 11, 252, 22, 166, 18, 3, 221, 240, 223, 67, 166, 18, 3, 237, 11, - 223, 67, 166, 18, 3, 221, 240, 210, 219, 166, 18, 3, 237, 11, 210, 219, - 166, 18, 3, 231, 229, 166, 18, 3, 221, 46, 166, 18, 3, 237, 11, 221, 46, - 166, 18, 3, 221, 48, 237, 120, 166, 18, 3, 221, 47, 230, 92, 252, 15, - 166, 18, 3, 221, 47, 230, 92, 237, 11, 252, 15, 166, 18, 3, 221, 47, 230, - 92, 231, 184, 166, 18, 3, 231, 184, 166, 219, 86, 17, 191, 77, 166, 219, - 86, 17, 107, 166, 219, 86, 17, 109, 166, 219, 86, 17, 138, 166, 219, 86, - 17, 134, 166, 219, 86, 17, 149, 166, 219, 86, 17, 169, 166, 219, 86, 17, - 175, 166, 219, 86, 17, 171, 166, 219, 86, 17, 178, 166, 18, 3, 237, 11, - 231, 229, 166, 18, 3, 237, 11, 231, 184, 166, 208, 152, 220, 209, 199, - 44, 246, 240, 221, 68, 222, 102, 199, 44, 246, 240, 221, 184, 221, 209, - 199, 44, 246, 240, 221, 184, 221, 174, 199, 44, 246, 240, 221, 184, 221, - 169, 199, 44, 246, 240, 221, 184, 221, 179, 199, 44, 246, 240, 221, 184, - 207, 143, 199, 44, 246, 240, 213, 250, 213, 237, 199, 44, 246, 240, 243, - 69, 246, 246, 199, 44, 246, 240, 243, 69, 243, 79, 199, 44, 246, 240, - 243, 69, 246, 245, 199, 44, 246, 240, 202, 47, 202, 46, 199, 44, 246, - 240, 243, 69, 243, 65, 199, 44, 246, 240, 192, 13, 192, 20, 199, 44, 246, - 240, 236, 175, 246, 254, 199, 44, 246, 240, 119, 210, 87, 199, 44, 246, - 240, 198, 242, 199, 38, 199, 44, 246, 240, 198, 242, 214, 222, 199, 44, - 246, 240, 198, 242, 209, 188, 199, 44, 246, 240, 213, 44, 214, 102, 199, - 44, 246, 240, 236, 175, 237, 121, 199, 44, 246, 240, 119, 199, 184, 199, - 44, 246, 240, 198, 242, 198, 207, 199, 44, 246, 240, 198, 242, 199, 45, - 199, 44, 246, 240, 198, 242, 198, 236, 199, 44, 246, 240, 213, 44, 212, - 178, 199, 44, 246, 240, 248, 112, 249, 118, 199, 44, 246, 240, 209, 74, - 209, 110, 199, 44, 246, 240, 209, 200, 209, 190, 199, 44, 246, 240, 232, - 176, 233, 109, 199, 44, 246, 240, 209, 200, 209, 221, 199, 44, 246, 240, - 232, 176, 233, 80, 199, 44, 246, 240, 209, 200, 205, 146, 199, 44, 246, - 240, 216, 13, 174, 199, 44, 246, 240, 192, 13, 192, 116, 199, 44, 246, - 240, 206, 163, 206, 61, 199, 44, 246, 240, 206, 68, 199, 44, 246, 240, - 219, 44, 219, 105, 199, 44, 246, 240, 218, 225, 199, 44, 246, 240, 193, - 49, 193, 175, 199, 44, 246, 240, 202, 47, 205, 167, 199, 44, 246, 240, - 202, 47, 206, 32, 199, 44, 246, 240, 202, 47, 200, 251, 199, 44, 246, - 240, 229, 24, 229, 122, 199, 44, 246, 240, 219, 44, 243, 47, 199, 44, - 246, 240, 187, 251, 122, 199, 44, 246, 240, 229, 24, 213, 34, 199, 44, - 246, 240, 210, 194, 199, 44, 246, 240, 205, 126, 65, 199, 44, 246, 240, - 217, 113, 230, 55, 199, 44, 246, 240, 205, 126, 252, 206, 199, 44, 246, - 240, 205, 126, 251, 149, 199, 44, 246, 240, 205, 126, 68, 199, 44, 246, - 240, 205, 126, 223, 199, 199, 44, 246, 240, 205, 126, 196, 152, 199, 44, - 246, 240, 205, 126, 196, 149, 199, 44, 246, 240, 205, 126, 66, 199, 44, - 246, 240, 205, 126, 196, 30, 199, 44, 246, 240, 209, 202, 199, 44, 238, - 170, 16, 249, 119, 199, 44, 246, 240, 205, 126, 71, 199, 44, 246, 240, - 205, 126, 252, 25, 199, 44, 246, 240, 205, 126, 74, 199, 44, 246, 240, - 205, 126, 251, 237, 217, 107, 199, 44, 246, 240, 205, 126, 251, 237, 217, - 108, 199, 44, 246, 240, 220, 39, 199, 44, 246, 240, 217, 104, 199, 44, - 246, 240, 217, 105, 199, 44, 246, 240, 217, 113, 234, 147, 199, 44, 246, - 240, 217, 113, 198, 241, 199, 44, 246, 240, 217, 113, 197, 244, 199, 44, - 246, 240, 217, 113, 243, 132, 199, 44, 246, 240, 199, 36, 199, 44, 246, - 240, 213, 183, 199, 44, 246, 240, 192, 110, 199, 44, 246, 240, 232, 164, + 142, 1, 234, 190, 142, 1, 251, 238, 142, 1, 74, 142, 1, 211, 89, 142, 1, + 250, 165, 142, 1, 155, 142, 1, 221, 217, 142, 1, 231, 242, 142, 1, 231, + 93, 142, 1, 214, 70, 142, 1, 247, 162, 142, 1, 247, 3, 142, 1, 223, 34, + 142, 1, 222, 254, 142, 1, 212, 103, 142, 1, 197, 132, 142, 1, 197, 120, + 142, 1, 237, 193, 142, 1, 237, 177, 142, 1, 213, 81, 142, 1, 190, 190, + 142, 1, 199, 49, 142, 1, 238, 34, 142, 1, 237, 70, 142, 1, 181, 142, 1, + 213, 63, 142, 1, 168, 142, 1, 209, 230, 142, 1, 249, 155, 142, 1, 248, + 205, 142, 1, 174, 142, 1, 170, 142, 1, 165, 142, 1, 206, 110, 142, 1, + 173, 142, 1, 219, 75, 142, 1, 219, 64, 142, 1, 195, 188, 142, 1, 203, + 166, 142, 1, 201, 176, 142, 1, 188, 142, 1, 140, 142, 1, 197, 101, 142, + 3, 81, 249, 90, 195, 40, 142, 3, 243, 6, 195, 40, 142, 3, 250, 147, 142, + 18, 3, 252, 208, 142, 18, 3, 68, 142, 18, 3, 223, 201, 142, 18, 3, 66, + 142, 18, 3, 196, 30, 142, 18, 3, 117, 146, 142, 18, 3, 117, 206, 111, + 142, 18, 3, 71, 142, 18, 3, 234, 190, 142, 18, 3, 251, 238, 142, 18, 3, + 74, 142, 18, 3, 211, 89, 142, 18, 3, 250, 165, 142, 3, 195, 40, 142, 1, + 75, 207, 46, 142, 3, 210, 132, 142, 1, 243, 86, 218, 170, 142, 1, 243, + 86, 192, 159, 142, 1, 243, 86, 219, 65, 142, 250, 166, 219, 200, 77, 142, + 232, 120, 91, 211, 102, 142, 232, 120, 91, 232, 141, 142, 232, 120, 115, + 234, 157, 142, 232, 120, 91, 197, 35, 142, 232, 120, 91, 199, 86, 142, + 232, 120, 115, 197, 34, 142, 232, 120, 91, 233, 20, 142, 1, 251, 16, 223, + 201, 142, 1, 117, 206, 111, 142, 1, 117, 219, 76, 142, 18, 3, 117, 172, + 142, 18, 3, 117, 219, 76, 142, 17, 191, 77, 142, 17, 107, 142, 17, 109, + 142, 17, 138, 142, 17, 134, 142, 17, 150, 142, 17, 169, 142, 17, 175, + 142, 17, 171, 142, 17, 178, 142, 31, 199, 95, 142, 31, 91, 228, 142, 142, + 31, 91, 189, 142, 232, 120, 91, 208, 24, 142, 232, 120, 91, 230, 72, 142, + 232, 120, 115, 208, 22, 142, 232, 120, 91, 202, 129, 142, 232, 120, 91, + 234, 161, 142, 232, 120, 115, 202, 126, 142, 237, 211, 77, 142, 1, 243, + 86, 213, 82, 142, 1, 243, 86, 215, 63, 142, 1, 243, 86, 206, 111, 142, 1, + 243, 86, 172, 142, 1, 243, 86, 219, 76, 142, 1, 243, 86, 222, 154, 166, + 3, 247, 121, 166, 3, 251, 72, 166, 3, 195, 34, 166, 1, 250, 131, 166, 1, + 252, 161, 166, 1, 252, 7, 166, 1, 252, 22, 166, 1, 223, 45, 166, 1, 223, + 200, 166, 1, 196, 20, 166, 1, 196, 24, 166, 1, 223, 72, 166, 1, 223, 73, + 166, 1, 223, 184, 166, 1, 223, 186, 166, 1, 233, 198, 166, 1, 234, 185, + 166, 1, 251, 221, 166, 1, 210, 243, 166, 1, 211, 82, 166, 1, 250, 150, + 166, 1, 251, 165, 222, 29, 166, 1, 217, 121, 222, 29, 166, 1, 251, 165, + 231, 187, 166, 1, 217, 121, 231, 187, 166, 1, 222, 82, 214, 249, 166, 1, + 205, 133, 231, 187, 166, 1, 251, 165, 247, 70, 166, 1, 217, 121, 247, 70, + 166, 1, 251, 165, 223, 15, 166, 1, 217, 121, 223, 15, 166, 1, 199, 241, + 214, 249, 166, 1, 199, 241, 205, 132, 214, 250, 166, 1, 205, 133, 223, + 15, 166, 1, 251, 165, 197, 128, 166, 1, 217, 121, 197, 128, 166, 1, 251, + 165, 237, 184, 166, 1, 217, 121, 237, 184, 166, 1, 215, 94, 214, 199, + 166, 1, 205, 133, 237, 184, 166, 1, 251, 165, 199, 153, 166, 1, 217, 121, + 199, 153, 166, 1, 251, 165, 237, 204, 166, 1, 217, 121, 237, 204, 166, 1, + 237, 236, 214, 199, 166, 1, 205, 133, 237, 204, 166, 1, 251, 165, 210, + 73, 166, 1, 217, 121, 210, 73, 166, 1, 251, 165, 249, 57, 166, 1, 217, + 121, 249, 57, 166, 1, 217, 21, 166, 1, 251, 145, 249, 57, 166, 1, 192, + 85, 166, 1, 207, 123, 166, 1, 237, 236, 219, 249, 166, 1, 195, 156, 166, + 1, 199, 241, 205, 103, 166, 1, 215, 94, 205, 103, 166, 1, 237, 236, 205, + 103, 166, 1, 229, 253, 166, 1, 215, 94, 219, 249, 166, 1, 233, 63, 166, + 3, 251, 207, 166, 18, 3, 252, 17, 166, 18, 3, 221, 242, 252, 24, 166, 18, + 3, 237, 13, 252, 24, 166, 18, 3, 221, 242, 223, 69, 166, 18, 3, 237, 13, + 223, 69, 166, 18, 3, 221, 242, 210, 221, 166, 18, 3, 237, 13, 210, 221, + 166, 18, 3, 231, 231, 166, 18, 3, 221, 48, 166, 18, 3, 237, 13, 221, 48, + 166, 18, 3, 221, 50, 237, 122, 166, 18, 3, 221, 49, 230, 94, 252, 17, + 166, 18, 3, 221, 49, 230, 94, 237, 13, 252, 17, 166, 18, 3, 221, 49, 230, + 94, 231, 186, 166, 18, 3, 231, 186, 166, 219, 88, 17, 191, 77, 166, 219, + 88, 17, 107, 166, 219, 88, 17, 109, 166, 219, 88, 17, 138, 166, 219, 88, + 17, 134, 166, 219, 88, 17, 150, 166, 219, 88, 17, 169, 166, 219, 88, 17, + 175, 166, 219, 88, 17, 171, 166, 219, 88, 17, 178, 166, 18, 3, 237, 13, + 231, 231, 166, 18, 3, 237, 13, 231, 186, 166, 208, 154, 220, 211, 199, + 44, 246, 242, 221, 70, 222, 104, 199, 44, 246, 242, 221, 186, 221, 211, + 199, 44, 246, 242, 221, 186, 221, 176, 199, 44, 246, 242, 221, 186, 221, + 171, 199, 44, 246, 242, 221, 186, 221, 181, 199, 44, 246, 242, 221, 186, + 207, 145, 199, 44, 246, 242, 213, 252, 213, 239, 199, 44, 246, 242, 243, + 71, 246, 248, 199, 44, 246, 242, 243, 71, 243, 81, 199, 44, 246, 242, + 243, 71, 246, 247, 199, 44, 246, 242, 202, 48, 202, 47, 199, 44, 246, + 242, 243, 71, 243, 67, 199, 44, 246, 242, 192, 13, 192, 20, 199, 44, 246, + 242, 236, 177, 247, 0, 199, 44, 246, 242, 119, 210, 89, 199, 44, 246, + 242, 198, 242, 199, 38, 199, 44, 246, 242, 198, 242, 214, 224, 199, 44, + 246, 242, 198, 242, 209, 190, 199, 44, 246, 242, 213, 46, 214, 104, 199, + 44, 246, 242, 236, 177, 237, 123, 199, 44, 246, 242, 119, 199, 184, 199, + 44, 246, 242, 198, 242, 198, 207, 199, 44, 246, 242, 198, 242, 199, 45, + 199, 44, 246, 242, 198, 242, 198, 236, 199, 44, 246, 242, 213, 46, 212, + 180, 199, 44, 246, 242, 248, 114, 249, 120, 199, 44, 246, 242, 209, 76, + 209, 112, 199, 44, 246, 242, 209, 202, 209, 192, 199, 44, 246, 242, 232, + 178, 233, 111, 199, 44, 246, 242, 209, 202, 209, 223, 199, 44, 246, 242, + 232, 178, 233, 82, 199, 44, 246, 242, 209, 202, 205, 147, 199, 44, 246, + 242, 216, 15, 174, 199, 44, 246, 242, 192, 13, 192, 116, 199, 44, 246, + 242, 206, 164, 206, 62, 199, 44, 246, 242, 206, 69, 199, 44, 246, 242, + 219, 46, 219, 107, 199, 44, 246, 242, 218, 227, 199, 44, 246, 242, 193, + 49, 193, 175, 199, 44, 246, 242, 202, 48, 205, 168, 199, 44, 246, 242, + 202, 48, 206, 33, 199, 44, 246, 242, 202, 48, 200, 252, 199, 44, 246, + 242, 229, 26, 229, 124, 199, 44, 246, 242, 219, 46, 243, 49, 199, 44, + 246, 242, 187, 251, 124, 199, 44, 246, 242, 229, 26, 213, 36, 199, 44, + 246, 242, 210, 196, 199, 44, 246, 242, 205, 127, 65, 199, 44, 246, 242, + 217, 115, 230, 57, 199, 44, 246, 242, 205, 127, 252, 208, 199, 44, 246, + 242, 205, 127, 251, 151, 199, 44, 246, 242, 205, 127, 68, 199, 44, 246, + 242, 205, 127, 223, 201, 199, 44, 246, 242, 205, 127, 196, 152, 199, 44, + 246, 242, 205, 127, 196, 149, 199, 44, 246, 242, 205, 127, 66, 199, 44, + 246, 242, 205, 127, 196, 30, 199, 44, 246, 242, 209, 204, 199, 44, 238, + 172, 16, 249, 121, 199, 44, 246, 242, 205, 127, 71, 199, 44, 246, 242, + 205, 127, 252, 27, 199, 44, 246, 242, 205, 127, 74, 199, 44, 246, 242, + 205, 127, 251, 239, 217, 109, 199, 44, 246, 242, 205, 127, 251, 239, 217, + 110, 199, 44, 246, 242, 220, 41, 199, 44, 246, 242, 217, 106, 199, 44, + 246, 242, 217, 107, 199, 44, 246, 242, 217, 115, 234, 149, 199, 44, 246, + 242, 217, 115, 198, 241, 199, 44, 246, 242, 217, 115, 197, 244, 199, 44, + 246, 242, 217, 115, 243, 134, 199, 44, 246, 242, 199, 36, 199, 44, 246, + 242, 213, 185, 199, 44, 246, 242, 192, 110, 199, 44, 246, 242, 232, 166, 199, 44, 17, 191, 77, 199, 44, 17, 107, 199, 44, 17, 109, 199, 44, 17, - 138, 199, 44, 17, 134, 199, 44, 17, 149, 199, 44, 17, 169, 199, 44, 17, - 175, 199, 44, 17, 171, 199, 44, 17, 178, 199, 44, 246, 240, 251, 117, - 199, 44, 246, 240, 221, 180, 220, 17, 1, 221, 67, 220, 17, 1, 221, 184, - 200, 195, 220, 17, 1, 221, 184, 199, 197, 220, 17, 1, 210, 187, 231, 91, - 220, 17, 1, 213, 249, 220, 17, 1, 242, 99, 220, 17, 1, 210, 187, 247, 1, - 220, 17, 1, 202, 47, 199, 197, 220, 17, 1, 210, 187, 222, 252, 220, 17, - 1, 212, 65, 220, 17, 1, 210, 187, 212, 101, 220, 17, 1, 210, 187, 197, - 132, 220, 17, 1, 210, 187, 197, 120, 220, 17, 1, 210, 187, 237, 191, 220, - 17, 1, 210, 187, 237, 175, 220, 17, 1, 210, 187, 213, 79, 220, 17, 1, - 236, 174, 220, 17, 1, 159, 220, 17, 1, 198, 242, 200, 195, 220, 17, 1, - 198, 242, 199, 197, 220, 17, 1, 210, 187, 237, 68, 220, 17, 1, 213, 43, - 220, 17, 1, 248, 111, 220, 17, 1, 209, 73, 220, 17, 1, 209, 200, 200, - 195, 220, 17, 1, 232, 176, 199, 197, 220, 17, 1, 209, 200, 199, 197, 220, - 17, 1, 232, 176, 200, 195, 220, 17, 1, 210, 187, 248, 203, 220, 17, 1, - 216, 12, 220, 17, 1, 192, 12, 220, 17, 1, 219, 44, 219, 105, 220, 17, 1, - 219, 44, 219, 2, 220, 17, 1, 193, 48, 220, 17, 1, 205, 134, 203, 165, - 220, 17, 1, 205, 134, 201, 175, 220, 17, 1, 202, 47, 200, 195, 220, 17, - 1, 229, 24, 200, 195, 220, 17, 1, 210, 187, 219, 73, 220, 17, 1, 74, 220, - 17, 1, 229, 24, 199, 197, 220, 17, 234, 120, 220, 17, 18, 3, 65, 220, 17, - 18, 3, 217, 113, 222, 87, 220, 17, 18, 3, 252, 206, 220, 17, 18, 3, 251, - 149, 220, 17, 18, 3, 68, 220, 17, 18, 3, 223, 199, 220, 17, 18, 3, 192, - 159, 220, 17, 18, 3, 191, 176, 220, 17, 18, 3, 66, 220, 17, 18, 3, 196, - 30, 220, 17, 3, 210, 187, 195, 40, 220, 17, 18, 3, 217, 113, 221, 44, - 220, 17, 204, 20, 3, 219, 43, 220, 17, 204, 20, 3, 212, 65, 220, 17, 18, - 3, 71, 220, 17, 18, 3, 234, 166, 220, 17, 18, 3, 74, 220, 17, 18, 3, 250, - 131, 220, 17, 18, 3, 251, 236, 220, 17, 221, 68, 173, 220, 17, 163, 217, - 113, 234, 147, 220, 17, 163, 217, 113, 198, 241, 220, 17, 163, 217, 113, - 198, 193, 220, 17, 163, 217, 113, 247, 77, 220, 17, 247, 125, 77, 220, - 17, 213, 192, 220, 17, 192, 110, 220, 17, 17, 191, 77, 220, 17, 17, 107, - 220, 17, 17, 109, 220, 17, 17, 138, 220, 17, 17, 134, 220, 17, 17, 149, - 220, 17, 17, 169, 220, 17, 17, 175, 220, 17, 17, 171, 220, 17, 17, 178, - 220, 17, 229, 24, 213, 43, 220, 17, 229, 24, 216, 12, 220, 17, 1, 221, - 185, 231, 3, 220, 17, 1, 221, 185, 212, 65, 86, 5, 211, 113, 86, 87, 230, - 181, 192, 25, 216, 118, 197, 178, 65, 86, 87, 230, 181, 192, 25, 216, - 118, 255, 207, 206, 167, 249, 19, 174, 86, 87, 230, 181, 192, 25, 216, - 118, 255, 207, 230, 181, 197, 153, 174, 86, 87, 89, 192, 25, 216, 118, - 216, 234, 174, 86, 87, 242, 215, 192, 25, 216, 118, 203, 172, 174, 86, - 87, 247, 97, 192, 25, 216, 118, 209, 189, 203, 158, 174, 86, 87, 192, 25, - 216, 118, 197, 153, 203, 158, 174, 86, 87, 205, 100, 203, 157, 86, 87, - 248, 13, 192, 25, 216, 117, 86, 87, 248, 141, 203, 50, 192, 25, 216, 117, - 86, 87, 223, 98, 197, 152, 86, 87, 237, 113, 197, 153, 248, 12, 86, 87, - 203, 157, 86, 87, 212, 70, 203, 157, 86, 87, 197, 153, 203, 157, 86, 87, - 212, 70, 197, 153, 203, 157, 86, 87, 206, 191, 243, 111, 201, 193, 203, - 157, 86, 87, 207, 10, 230, 222, 203, 157, 86, 87, 247, 97, 255, 211, 206, - 73, 216, 233, 179, 247, 128, 86, 87, 230, 181, 197, 152, 86, 219, 27, 3, - 246, 255, 206, 72, 86, 219, 27, 3, 219, 157, 206, 72, 86, 250, 188, 3, - 203, 168, 231, 168, 255, 212, 206, 72, 86, 250, 188, 3, 255, 209, 168, - 86, 250, 188, 3, 205, 69, 197, 147, 86, 3, 207, 115, 236, 189, 231, 167, - 86, 3, 207, 115, 236, 189, 231, 5, 86, 3, 207, 115, 236, 189, 230, 182, - 86, 3, 207, 115, 214, 243, 231, 167, 86, 3, 207, 115, 214, 243, 231, 5, - 86, 3, 207, 115, 236, 189, 207, 115, 214, 242, 86, 17, 191, 77, 86, 17, - 107, 86, 17, 109, 86, 17, 138, 86, 17, 134, 86, 17, 149, 86, 17, 169, 86, - 17, 175, 86, 17, 171, 86, 17, 178, 86, 17, 132, 107, 86, 17, 132, 109, - 86, 17, 132, 138, 86, 17, 132, 134, 86, 17, 132, 149, 86, 17, 132, 169, - 86, 17, 132, 175, 86, 17, 132, 171, 86, 17, 132, 178, 86, 17, 132, 191, - 77, 86, 87, 248, 15, 206, 72, 86, 87, 214, 59, 247, 195, 212, 82, 191, - 10, 86, 87, 247, 97, 255, 211, 206, 73, 247, 196, 216, 62, 247, 128, 86, - 87, 214, 59, 247, 195, 203, 169, 206, 72, 86, 87, 243, 128, 216, 117, 86, - 87, 197, 169, 255, 208, 86, 87, 230, 164, 206, 73, 230, 119, 86, 87, 230, - 164, 206, 73, 230, 125, 86, 87, 251, 123, 221, 202, 230, 119, 86, 87, - 251, 123, 221, 202, 230, 125, 86, 3, 192, 102, 197, 151, 86, 3, 217, 66, - 197, 151, 86, 1, 155, 86, 1, 221, 215, 86, 1, 231, 240, 86, 1, 231, 91, - 86, 1, 214, 68, 86, 1, 247, 160, 86, 1, 247, 1, 86, 1, 223, 32, 86, 1, - 212, 101, 86, 1, 197, 132, 86, 1, 197, 120, 86, 1, 237, 191, 86, 1, 237, - 175, 86, 1, 213, 79, 86, 1, 190, 190, 86, 1, 199, 49, 86, 1, 238, 32, 86, - 1, 237, 68, 86, 1, 180, 86, 1, 168, 86, 1, 209, 228, 86, 1, 249, 153, 86, - 1, 248, 203, 86, 1, 174, 86, 1, 197, 168, 86, 1, 197, 157, 86, 1, 235, - 35, 86, 1, 235, 29, 86, 1, 193, 190, 86, 1, 191, 71, 86, 1, 191, 123, 86, - 1, 255, 214, 86, 1, 170, 86, 1, 165, 86, 1, 173, 86, 1, 203, 165, 86, 1, - 201, 175, 86, 1, 188, 86, 1, 140, 86, 1, 65, 86, 1, 220, 246, 86, 1, 232, - 221, 165, 86, 1, 221, 101, 86, 1, 206, 109, 86, 18, 3, 252, 206, 86, 18, - 3, 68, 86, 18, 3, 223, 199, 86, 18, 3, 66, 86, 18, 3, 196, 30, 86, 18, 3, - 117, 146, 86, 18, 3, 117, 206, 110, 86, 18, 3, 117, 172, 86, 18, 3, 117, - 219, 74, 86, 18, 3, 71, 86, 18, 3, 234, 188, 86, 18, 3, 74, 86, 18, 3, - 211, 87, 86, 3, 206, 173, 201, 5, 214, 69, 206, 162, 86, 3, 206, 167, - 249, 18, 86, 18, 3, 207, 18, 68, 86, 18, 3, 207, 18, 223, 199, 86, 3, - 212, 82, 191, 11, 214, 251, 238, 32, 86, 3, 202, 61, 219, 240, 86, 87, - 230, 72, 86, 87, 210, 178, 86, 3, 219, 243, 206, 72, 86, 3, 192, 107, - 206, 72, 86, 3, 219, 244, 197, 169, 247, 128, 86, 3, 216, 236, 247, 128, - 86, 3, 230, 185, 247, 129, 207, 8, 86, 3, 230, 185, 216, 220, 207, 8, 86, - 3, 223, 93, 216, 236, 247, 128, 86, 200, 239, 3, 219, 244, 197, 169, 247, - 128, 86, 200, 239, 3, 216, 236, 247, 128, 86, 200, 239, 3, 223, 93, 216, - 236, 247, 128, 86, 200, 239, 1, 155, 86, 200, 239, 1, 221, 215, 86, 200, - 239, 1, 231, 240, 86, 200, 239, 1, 231, 91, 86, 200, 239, 1, 214, 68, 86, - 200, 239, 1, 247, 160, 86, 200, 239, 1, 247, 1, 86, 200, 239, 1, 223, 32, - 86, 200, 239, 1, 212, 101, 86, 200, 239, 1, 197, 132, 86, 200, 239, 1, - 197, 120, 86, 200, 239, 1, 237, 191, 86, 200, 239, 1, 237, 175, 86, 200, - 239, 1, 213, 79, 86, 200, 239, 1, 190, 190, 86, 200, 239, 1, 199, 49, 86, - 200, 239, 1, 238, 32, 86, 200, 239, 1, 237, 68, 86, 200, 239, 1, 180, 86, - 200, 239, 1, 168, 86, 200, 239, 1, 209, 228, 86, 200, 239, 1, 249, 153, - 86, 200, 239, 1, 248, 203, 86, 200, 239, 1, 174, 86, 200, 239, 1, 197, - 168, 86, 200, 239, 1, 197, 157, 86, 200, 239, 1, 235, 35, 86, 200, 239, - 1, 235, 29, 86, 200, 239, 1, 193, 190, 86, 200, 239, 1, 191, 71, 86, 200, - 239, 1, 191, 123, 86, 200, 239, 1, 255, 214, 86, 200, 239, 1, 170, 86, - 200, 239, 1, 165, 86, 200, 239, 1, 173, 86, 200, 239, 1, 203, 165, 86, - 200, 239, 1, 201, 175, 86, 200, 239, 1, 188, 86, 200, 239, 1, 140, 86, - 200, 239, 1, 65, 86, 200, 239, 1, 220, 246, 86, 200, 239, 1, 232, 221, - 193, 190, 86, 200, 239, 1, 232, 221, 170, 86, 200, 239, 1, 232, 221, 165, - 86, 220, 233, 206, 69, 221, 215, 86, 220, 233, 206, 69, 221, 216, 247, - 196, 216, 62, 247, 128, 86, 247, 112, 3, 88, 249, 7, 86, 247, 112, 3, - 156, 249, 7, 86, 247, 112, 3, 247, 116, 199, 135, 86, 247, 112, 3, 205, - 99, 255, 213, 86, 16, 235, 105, 248, 10, 86, 16, 207, 114, 206, 174, 86, - 16, 210, 206, 231, 166, 86, 16, 207, 114, 206, 175, 207, 10, 230, 221, - 86, 16, 209, 189, 168, 86, 16, 213, 21, 248, 10, 86, 16, 213, 21, 248, - 11, 212, 70, 255, 210, 86, 16, 213, 21, 248, 11, 230, 183, 255, 210, 86, - 16, 213, 21, 248, 11, 247, 196, 255, 210, 86, 3, 207, 115, 214, 243, 207, - 115, 236, 188, 86, 3, 207, 115, 214, 243, 230, 182, 86, 87, 248, 14, 203, - 50, 231, 54, 216, 118, 207, 9, 86, 87, 216, 14, 192, 25, 231, 54, 216, - 118, 207, 9, 86, 87, 212, 70, 197, 152, 86, 87, 89, 248, 44, 206, 164, - 192, 25, 216, 118, 216, 234, 174, 86, 87, 242, 215, 248, 44, 206, 164, - 192, 25, 216, 118, 203, 172, 174, 206, 207, 200, 155, 56, 219, 223, 200, - 155, 56, 206, 207, 200, 155, 3, 4, 236, 138, 219, 223, 200, 155, 3, 4, - 236, 138, 86, 87, 219, 235, 216, 237, 206, 72, 86, 87, 198, 18, 216, 237, - 206, 72, 80, 1, 155, 80, 1, 221, 215, 80, 1, 231, 240, 80, 1, 231, 91, - 80, 1, 214, 68, 80, 1, 247, 160, 80, 1, 247, 1, 80, 1, 223, 32, 80, 1, - 222, 252, 80, 1, 212, 101, 80, 1, 213, 45, 80, 1, 197, 132, 80, 1, 197, - 120, 80, 1, 237, 191, 80, 1, 237, 175, 80, 1, 213, 79, 80, 1, 190, 190, - 80, 1, 199, 49, 80, 1, 238, 32, 80, 1, 237, 68, 80, 1, 180, 80, 1, 168, - 80, 1, 209, 228, 80, 1, 249, 153, 80, 1, 248, 203, 80, 1, 174, 80, 1, + 138, 199, 44, 17, 134, 199, 44, 17, 150, 199, 44, 17, 169, 199, 44, 17, + 175, 199, 44, 17, 171, 199, 44, 17, 178, 199, 44, 246, 242, 251, 119, + 199, 44, 246, 242, 221, 182, 220, 19, 1, 221, 69, 220, 19, 1, 221, 186, + 200, 195, 220, 19, 1, 221, 186, 199, 197, 220, 19, 1, 210, 189, 231, 93, + 220, 19, 1, 213, 251, 220, 19, 1, 242, 101, 220, 19, 1, 210, 189, 247, 3, + 220, 19, 1, 202, 48, 199, 197, 220, 19, 1, 210, 189, 222, 254, 220, 19, + 1, 212, 67, 220, 19, 1, 210, 189, 212, 103, 220, 19, 1, 210, 189, 197, + 132, 220, 19, 1, 210, 189, 197, 120, 220, 19, 1, 210, 189, 237, 193, 220, + 19, 1, 210, 189, 237, 177, 220, 19, 1, 210, 189, 213, 81, 220, 19, 1, + 236, 176, 220, 19, 1, 159, 220, 19, 1, 198, 242, 200, 195, 220, 19, 1, + 198, 242, 199, 197, 220, 19, 1, 210, 189, 237, 70, 220, 19, 1, 213, 45, + 220, 19, 1, 248, 113, 220, 19, 1, 209, 75, 220, 19, 1, 209, 202, 200, + 195, 220, 19, 1, 232, 178, 199, 197, 220, 19, 1, 209, 202, 199, 197, 220, + 19, 1, 232, 178, 200, 195, 220, 19, 1, 210, 189, 248, 205, 220, 19, 1, + 216, 14, 220, 19, 1, 192, 12, 220, 19, 1, 219, 46, 219, 107, 220, 19, 1, + 219, 46, 219, 4, 220, 19, 1, 193, 48, 220, 19, 1, 205, 135, 203, 166, + 220, 19, 1, 205, 135, 201, 176, 220, 19, 1, 202, 48, 200, 195, 220, 19, + 1, 229, 26, 200, 195, 220, 19, 1, 210, 189, 219, 75, 220, 19, 1, 74, 220, + 19, 1, 229, 26, 199, 197, 220, 19, 234, 122, 220, 19, 18, 3, 65, 220, 19, + 18, 3, 217, 115, 222, 89, 220, 19, 18, 3, 252, 208, 220, 19, 18, 3, 251, + 151, 220, 19, 18, 3, 68, 220, 19, 18, 3, 223, 201, 220, 19, 18, 3, 192, + 159, 220, 19, 18, 3, 191, 176, 220, 19, 18, 3, 66, 220, 19, 18, 3, 196, + 30, 220, 19, 3, 210, 189, 195, 40, 220, 19, 18, 3, 217, 115, 221, 46, + 220, 19, 204, 21, 3, 219, 45, 220, 19, 204, 21, 3, 212, 67, 220, 19, 18, + 3, 71, 220, 19, 18, 3, 234, 168, 220, 19, 18, 3, 74, 220, 19, 18, 3, 250, + 133, 220, 19, 18, 3, 251, 238, 220, 19, 221, 70, 173, 220, 19, 163, 217, + 115, 234, 149, 220, 19, 163, 217, 115, 198, 241, 220, 19, 163, 217, 115, + 198, 193, 220, 19, 163, 217, 115, 247, 79, 220, 19, 247, 127, 77, 220, + 19, 213, 194, 220, 19, 192, 110, 220, 19, 17, 191, 77, 220, 19, 17, 107, + 220, 19, 17, 109, 220, 19, 17, 138, 220, 19, 17, 134, 220, 19, 17, 150, + 220, 19, 17, 169, 220, 19, 17, 175, 220, 19, 17, 171, 220, 19, 17, 178, + 220, 19, 229, 26, 213, 45, 220, 19, 229, 26, 216, 14, 220, 19, 1, 221, + 187, 231, 5, 220, 19, 1, 221, 187, 212, 67, 86, 5, 211, 115, 86, 87, 230, + 183, 192, 25, 216, 120, 197, 178, 65, 86, 87, 230, 183, 192, 25, 216, + 120, 255, 209, 206, 168, 249, 21, 174, 86, 87, 230, 183, 192, 25, 216, + 120, 255, 209, 230, 183, 197, 153, 174, 86, 87, 89, 192, 25, 216, 120, + 216, 236, 174, 86, 87, 242, 217, 192, 25, 216, 120, 203, 173, 174, 86, + 87, 247, 99, 192, 25, 216, 120, 209, 191, 203, 159, 174, 86, 87, 192, 25, + 216, 120, 197, 153, 203, 159, 174, 86, 87, 205, 101, 203, 158, 86, 87, + 248, 15, 192, 25, 216, 119, 86, 87, 248, 143, 203, 51, 192, 25, 216, 119, + 86, 87, 223, 100, 197, 152, 86, 87, 237, 115, 197, 153, 248, 14, 86, 87, + 203, 158, 86, 87, 212, 72, 203, 158, 86, 87, 197, 153, 203, 158, 86, 87, + 212, 72, 197, 153, 203, 158, 86, 87, 206, 192, 243, 113, 201, 194, 203, + 158, 86, 87, 207, 11, 230, 224, 203, 158, 86, 87, 247, 99, 255, 213, 206, + 74, 216, 235, 180, 247, 130, 86, 87, 230, 183, 197, 152, 86, 219, 29, 3, + 247, 1, 206, 73, 86, 219, 29, 3, 219, 159, 206, 73, 86, 250, 190, 3, 203, + 169, 231, 170, 255, 214, 206, 73, 86, 250, 190, 3, 255, 211, 168, 86, + 250, 190, 3, 205, 70, 197, 147, 86, 3, 207, 117, 236, 191, 231, 169, 86, + 3, 207, 117, 236, 191, 231, 7, 86, 3, 207, 117, 236, 191, 230, 184, 86, + 3, 207, 117, 214, 245, 231, 169, 86, 3, 207, 117, 214, 245, 231, 7, 86, + 3, 207, 117, 236, 191, 207, 117, 214, 244, 86, 17, 191, 77, 86, 17, 107, + 86, 17, 109, 86, 17, 138, 86, 17, 134, 86, 17, 150, 86, 17, 169, 86, 17, + 175, 86, 17, 171, 86, 17, 178, 86, 17, 132, 107, 86, 17, 132, 109, 86, + 17, 132, 138, 86, 17, 132, 134, 86, 17, 132, 150, 86, 17, 132, 169, 86, + 17, 132, 175, 86, 17, 132, 171, 86, 17, 132, 178, 86, 17, 132, 191, 77, + 86, 87, 248, 17, 206, 73, 86, 87, 214, 61, 247, 197, 212, 84, 191, 10, + 86, 87, 247, 99, 255, 213, 206, 74, 247, 198, 216, 64, 247, 130, 86, 87, + 214, 61, 247, 197, 203, 170, 206, 73, 86, 87, 243, 130, 216, 119, 86, 87, + 197, 169, 255, 210, 86, 87, 230, 166, 206, 74, 230, 121, 86, 87, 230, + 166, 206, 74, 230, 127, 86, 87, 251, 125, 221, 204, 230, 121, 86, 87, + 251, 125, 221, 204, 230, 127, 86, 3, 192, 102, 197, 151, 86, 3, 217, 68, + 197, 151, 86, 1, 155, 86, 1, 221, 217, 86, 1, 231, 242, 86, 1, 231, 93, + 86, 1, 214, 70, 86, 1, 247, 162, 86, 1, 247, 3, 86, 1, 223, 34, 86, 1, + 212, 103, 86, 1, 197, 132, 86, 1, 197, 120, 86, 1, 237, 193, 86, 1, 237, + 177, 86, 1, 213, 81, 86, 1, 190, 190, 86, 1, 199, 49, 86, 1, 238, 34, 86, + 1, 237, 70, 86, 1, 181, 86, 1, 168, 86, 1, 209, 230, 86, 1, 249, 155, 86, + 1, 248, 205, 86, 1, 174, 86, 1, 197, 168, 86, 1, 197, 157, 86, 1, 235, + 37, 86, 1, 235, 31, 86, 1, 193, 190, 86, 1, 191, 71, 86, 1, 191, 123, 86, + 1, 255, 216, 86, 1, 170, 86, 1, 165, 86, 1, 173, 86, 1, 203, 166, 86, 1, + 201, 176, 86, 1, 188, 86, 1, 140, 86, 1, 65, 86, 1, 220, 248, 86, 1, 232, + 223, 165, 86, 1, 221, 103, 86, 1, 206, 110, 86, 18, 3, 252, 208, 86, 18, + 3, 68, 86, 18, 3, 223, 201, 86, 18, 3, 66, 86, 18, 3, 196, 30, 86, 18, 3, + 117, 146, 86, 18, 3, 117, 206, 111, 86, 18, 3, 117, 172, 86, 18, 3, 117, + 219, 76, 86, 18, 3, 71, 86, 18, 3, 234, 190, 86, 18, 3, 74, 86, 18, 3, + 211, 89, 86, 3, 206, 174, 201, 6, 214, 71, 206, 163, 86, 3, 206, 168, + 249, 20, 86, 18, 3, 207, 19, 68, 86, 18, 3, 207, 19, 223, 201, 86, 3, + 212, 84, 191, 11, 214, 253, 238, 34, 86, 3, 202, 62, 219, 242, 86, 87, + 230, 74, 86, 87, 210, 180, 86, 3, 219, 245, 206, 73, 86, 3, 192, 107, + 206, 73, 86, 3, 219, 246, 197, 169, 247, 130, 86, 3, 216, 238, 247, 130, + 86, 3, 230, 187, 247, 131, 207, 9, 86, 3, 230, 187, 216, 222, 207, 9, 86, + 3, 223, 95, 216, 238, 247, 130, 86, 200, 240, 3, 219, 246, 197, 169, 247, + 130, 86, 200, 240, 3, 216, 238, 247, 130, 86, 200, 240, 3, 223, 95, 216, + 238, 247, 130, 86, 200, 240, 1, 155, 86, 200, 240, 1, 221, 217, 86, 200, + 240, 1, 231, 242, 86, 200, 240, 1, 231, 93, 86, 200, 240, 1, 214, 70, 86, + 200, 240, 1, 247, 162, 86, 200, 240, 1, 247, 3, 86, 200, 240, 1, 223, 34, + 86, 200, 240, 1, 212, 103, 86, 200, 240, 1, 197, 132, 86, 200, 240, 1, + 197, 120, 86, 200, 240, 1, 237, 193, 86, 200, 240, 1, 237, 177, 86, 200, + 240, 1, 213, 81, 86, 200, 240, 1, 190, 190, 86, 200, 240, 1, 199, 49, 86, + 200, 240, 1, 238, 34, 86, 200, 240, 1, 237, 70, 86, 200, 240, 1, 181, 86, + 200, 240, 1, 168, 86, 200, 240, 1, 209, 230, 86, 200, 240, 1, 249, 155, + 86, 200, 240, 1, 248, 205, 86, 200, 240, 1, 174, 86, 200, 240, 1, 197, + 168, 86, 200, 240, 1, 197, 157, 86, 200, 240, 1, 235, 37, 86, 200, 240, + 1, 235, 31, 86, 200, 240, 1, 193, 190, 86, 200, 240, 1, 191, 71, 86, 200, + 240, 1, 191, 123, 86, 200, 240, 1, 255, 216, 86, 200, 240, 1, 170, 86, + 200, 240, 1, 165, 86, 200, 240, 1, 173, 86, 200, 240, 1, 203, 166, 86, + 200, 240, 1, 201, 176, 86, 200, 240, 1, 188, 86, 200, 240, 1, 140, 86, + 200, 240, 1, 65, 86, 200, 240, 1, 220, 248, 86, 200, 240, 1, 232, 223, + 193, 190, 86, 200, 240, 1, 232, 223, 170, 86, 200, 240, 1, 232, 223, 165, + 86, 220, 235, 206, 70, 221, 217, 86, 220, 235, 206, 70, 221, 218, 247, + 198, 216, 64, 247, 130, 86, 247, 114, 3, 88, 249, 9, 86, 247, 114, 3, + 156, 249, 9, 86, 247, 114, 3, 247, 118, 199, 135, 86, 247, 114, 3, 205, + 100, 255, 215, 86, 16, 235, 107, 248, 12, 86, 16, 207, 116, 206, 175, 86, + 16, 210, 208, 231, 168, 86, 16, 207, 116, 206, 176, 207, 11, 230, 223, + 86, 16, 209, 191, 168, 86, 16, 213, 23, 248, 12, 86, 16, 213, 23, 248, + 13, 212, 72, 255, 212, 86, 16, 213, 23, 248, 13, 230, 185, 255, 212, 86, + 16, 213, 23, 248, 13, 247, 198, 255, 212, 86, 3, 207, 117, 214, 245, 207, + 117, 236, 190, 86, 3, 207, 117, 214, 245, 230, 184, 86, 87, 248, 16, 203, + 51, 231, 56, 216, 120, 207, 10, 86, 87, 216, 16, 192, 25, 231, 56, 216, + 120, 207, 10, 86, 87, 212, 72, 197, 152, 86, 87, 89, 248, 46, 206, 165, + 192, 25, 216, 120, 216, 236, 174, 86, 87, 242, 217, 248, 46, 206, 165, + 192, 25, 216, 120, 203, 173, 174, 206, 208, 200, 155, 56, 219, 225, 200, + 155, 56, 206, 208, 200, 155, 3, 4, 236, 140, 219, 225, 200, 155, 3, 4, + 236, 140, 86, 87, 219, 237, 216, 239, 206, 73, 86, 87, 198, 18, 216, 239, + 206, 73, 80, 1, 155, 80, 1, 221, 217, 80, 1, 231, 242, 80, 1, 231, 93, + 80, 1, 214, 70, 80, 1, 247, 162, 80, 1, 247, 3, 80, 1, 223, 34, 80, 1, + 222, 254, 80, 1, 212, 103, 80, 1, 213, 47, 80, 1, 197, 132, 80, 1, 197, + 120, 80, 1, 237, 193, 80, 1, 237, 177, 80, 1, 213, 81, 80, 1, 190, 190, + 80, 1, 199, 49, 80, 1, 238, 34, 80, 1, 237, 70, 80, 1, 181, 80, 1, 168, + 80, 1, 209, 230, 80, 1, 249, 155, 80, 1, 248, 205, 80, 1, 174, 80, 1, 170, 80, 1, 165, 80, 1, 173, 80, 1, 193, 190, 80, 1, 188, 80, 1, 140, 80, - 1, 219, 73, 80, 1, 65, 80, 1, 203, 139, 65, 80, 1, 68, 80, 1, 223, 199, - 80, 1, 66, 80, 1, 196, 30, 80, 1, 71, 80, 1, 215, 232, 71, 80, 1, 74, 80, - 1, 250, 163, 80, 18, 3, 199, 200, 252, 206, 80, 18, 3, 252, 206, 80, 18, - 3, 68, 80, 18, 3, 223, 199, 80, 18, 3, 66, 80, 18, 3, 196, 30, 80, 18, 3, - 71, 80, 18, 3, 251, 236, 80, 18, 3, 215, 232, 223, 199, 80, 18, 3, 215, - 232, 74, 80, 18, 3, 235, 15, 58, 80, 3, 251, 71, 80, 3, 75, 60, 80, 3, - 195, 35, 80, 3, 195, 40, 80, 3, 250, 214, 80, 120, 3, 216, 217, 170, 80, - 120, 3, 216, 217, 165, 80, 120, 3, 216, 217, 193, 190, 80, 120, 3, 216, - 217, 140, 80, 1, 230, 206, 188, 80, 17, 191, 77, 80, 17, 107, 80, 17, - 109, 80, 17, 138, 80, 17, 134, 80, 17, 149, 80, 17, 169, 80, 17, 175, 80, - 17, 171, 80, 17, 178, 80, 3, 219, 83, 205, 53, 80, 3, 205, 53, 80, 16, - 219, 36, 80, 16, 242, 67, 80, 16, 252, 1, 80, 16, 231, 146, 80, 1, 203, - 165, 80, 1, 201, 175, 80, 1, 117, 146, 80, 1, 117, 206, 110, 80, 1, 117, - 172, 80, 1, 117, 219, 74, 80, 18, 3, 117, 146, 80, 18, 3, 117, 206, 110, - 80, 18, 3, 117, 172, 80, 18, 3, 117, 219, 74, 80, 1, 215, 232, 214, 68, - 80, 1, 215, 232, 222, 252, 80, 1, 215, 232, 249, 53, 80, 1, 215, 232, - 249, 48, 80, 120, 3, 215, 232, 216, 217, 180, 80, 120, 3, 215, 232, 216, - 217, 174, 80, 120, 3, 215, 232, 216, 217, 173, 80, 1, 203, 171, 222, 62, - 203, 165, 80, 18, 3, 203, 171, 222, 62, 233, 242, 80, 163, 87, 203, 171, - 222, 62, 230, 5, 80, 163, 87, 203, 171, 222, 62, 222, 23, 209, 199, 80, - 1, 193, 102, 208, 116, 222, 62, 199, 49, 80, 1, 193, 102, 208, 116, 222, - 62, 208, 122, 80, 18, 3, 193, 102, 208, 116, 222, 62, 233, 242, 80, 18, - 3, 193, 102, 208, 116, 222, 62, 196, 152, 80, 3, 193, 102, 208, 116, 222, - 62, 198, 78, 80, 3, 193, 102, 208, 116, 222, 62, 198, 77, 80, 3, 193, - 102, 208, 116, 222, 62, 198, 76, 80, 3, 193, 102, 208, 116, 222, 62, 198, - 75, 80, 3, 193, 102, 208, 116, 222, 62, 198, 74, 80, 1, 234, 202, 208, - 116, 222, 62, 213, 79, 80, 1, 234, 202, 208, 116, 222, 62, 191, 183, 80, - 1, 234, 202, 208, 116, 222, 62, 231, 56, 80, 18, 3, 231, 161, 222, 62, - 68, 80, 18, 3, 222, 28, 211, 151, 80, 18, 3, 222, 28, 66, 80, 18, 3, 222, - 28, 234, 188, 80, 1, 203, 139, 155, 80, 1, 203, 139, 221, 215, 80, 1, - 203, 139, 231, 240, 80, 1, 203, 139, 247, 160, 80, 1, 203, 139, 191, 123, - 80, 1, 203, 139, 212, 101, 80, 1, 203, 139, 238, 32, 80, 1, 203, 139, - 180, 80, 1, 203, 139, 209, 228, 80, 1, 203, 139, 233, 109, 80, 1, 203, - 139, 249, 153, 80, 1, 203, 139, 199, 49, 80, 1, 203, 139, 140, 80, 120, - 3, 203, 139, 216, 217, 193, 190, 80, 18, 3, 203, 139, 252, 206, 80, 18, - 3, 203, 139, 71, 80, 18, 3, 203, 139, 235, 15, 58, 80, 18, 3, 203, 139, - 53, 192, 159, 80, 3, 203, 139, 198, 77, 80, 3, 203, 139, 198, 76, 80, 3, - 203, 139, 198, 74, 80, 3, 203, 139, 198, 73, 80, 3, 203, 139, 238, 247, - 198, 77, 80, 3, 203, 139, 238, 247, 198, 76, 80, 3, 203, 139, 238, 247, - 234, 106, 198, 79, 80, 1, 206, 47, 210, 189, 233, 109, 80, 3, 206, 47, - 210, 189, 198, 74, 80, 203, 139, 17, 191, 77, 80, 203, 139, 17, 107, 80, - 203, 139, 17, 109, 80, 203, 139, 17, 138, 80, 203, 139, 17, 134, 80, 203, - 139, 17, 149, 80, 203, 139, 17, 169, 80, 203, 139, 17, 175, 80, 203, 139, - 17, 171, 80, 203, 139, 17, 178, 80, 3, 221, 206, 198, 78, 80, 3, 221, - 206, 198, 76, 80, 18, 3, 251, 222, 65, 80, 18, 3, 251, 222, 251, 236, 80, - 16, 203, 139, 107, 80, 16, 203, 139, 233, 215, 101, 6, 1, 251, 132, 101, - 6, 1, 249, 101, 101, 6, 1, 231, 210, 101, 6, 1, 236, 150, 101, 6, 1, 234, - 103, 101, 6, 1, 195, 49, 101, 6, 1, 191, 80, 101, 6, 1, 199, 193, 101, 6, - 1, 223, 162, 101, 6, 1, 222, 87, 101, 6, 1, 220, 7, 101, 6, 1, 217, 90, - 101, 6, 1, 214, 216, 101, 6, 1, 211, 104, 101, 6, 1, 210, 131, 101, 6, 1, - 191, 67, 101, 6, 1, 207, 163, 101, 6, 1, 205, 142, 101, 6, 1, 199, 179, - 101, 6, 1, 196, 113, 101, 6, 1, 209, 220, 101, 6, 1, 221, 200, 101, 6, 1, - 231, 82, 101, 6, 1, 208, 81, 101, 6, 1, 203, 69, 101, 6, 1, 243, 81, 101, - 6, 1, 247, 128, 101, 6, 1, 222, 234, 101, 6, 1, 243, 18, 101, 6, 1, 246, - 241, 101, 6, 1, 192, 218, 101, 6, 1, 222, 249, 101, 6, 1, 230, 87, 101, - 6, 1, 229, 245, 101, 6, 1, 229, 145, 101, 6, 1, 193, 125, 101, 6, 1, 230, - 19, 101, 6, 1, 229, 11, 101, 6, 1, 192, 14, 101, 6, 1, 252, 14, 101, 1, - 251, 132, 101, 1, 249, 101, 101, 1, 231, 210, 101, 1, 236, 150, 101, 1, - 234, 103, 101, 1, 195, 49, 101, 1, 191, 80, 101, 1, 199, 193, 101, 1, - 223, 162, 101, 1, 222, 87, 101, 1, 220, 7, 101, 1, 217, 90, 101, 1, 214, - 216, 101, 1, 211, 104, 101, 1, 210, 131, 101, 1, 191, 67, 101, 1, 207, - 163, 101, 1, 205, 142, 101, 1, 199, 179, 101, 1, 196, 113, 101, 1, 209, - 220, 101, 1, 221, 200, 101, 1, 231, 82, 101, 1, 208, 81, 101, 1, 203, 69, - 101, 1, 243, 81, 101, 1, 247, 128, 101, 1, 222, 234, 101, 1, 243, 18, - 101, 1, 246, 241, 101, 1, 192, 218, 101, 1, 222, 249, 101, 1, 230, 87, - 101, 1, 229, 245, 101, 1, 229, 145, 101, 1, 193, 125, 101, 1, 230, 19, - 101, 1, 229, 11, 101, 1, 233, 23, 101, 1, 192, 14, 101, 1, 234, 123, 101, - 1, 153, 231, 210, 101, 1, 251, 230, 101, 210, 128, 204, 10, 52, 1, 101, - 214, 216, 101, 1, 252, 14, 101, 1, 230, 17, 56, 101, 1, 220, 116, 56, 30, - 147, 221, 113, 30, 147, 201, 167, 30, 147, 213, 204, 30, 147, 198, 168, - 30, 147, 201, 156, 30, 147, 206, 239, 30, 147, 216, 77, 30, 147, 209, - 169, 30, 147, 201, 164, 30, 147, 202, 160, 30, 147, 201, 161, 30, 147, - 223, 222, 30, 147, 243, 24, 30, 147, 201, 171, 30, 147, 243, 91, 30, 147, - 221, 188, 30, 147, 199, 7, 30, 147, 209, 209, 30, 147, 229, 142, 30, 147, - 213, 200, 30, 147, 201, 165, 30, 147, 213, 194, 30, 147, 213, 198, 30, - 147, 198, 165, 30, 147, 206, 227, 30, 147, 201, 163, 30, 147, 206, 237, - 30, 147, 222, 68, 30, 147, 216, 70, 30, 147, 222, 71, 30, 147, 209, 164, - 30, 147, 209, 162, 30, 147, 209, 150, 30, 147, 209, 158, 30, 147, 209, - 156, 30, 147, 209, 153, 30, 147, 209, 155, 30, 147, 209, 152, 30, 147, - 209, 157, 30, 147, 209, 167, 30, 147, 209, 168, 30, 147, 209, 151, 30, - 147, 209, 161, 30, 147, 222, 69, 30, 147, 222, 67, 30, 147, 202, 153, 30, - 147, 202, 151, 30, 147, 202, 143, 30, 147, 202, 146, 30, 147, 202, 152, - 30, 147, 202, 148, 30, 147, 202, 147, 30, 147, 202, 145, 30, 147, 202, - 156, 30, 147, 202, 158, 30, 147, 202, 159, 30, 147, 202, 154, 30, 147, - 202, 144, 30, 147, 202, 149, 30, 147, 202, 157, 30, 147, 243, 72, 30, - 147, 243, 70, 30, 147, 247, 14, 30, 147, 247, 12, 30, 147, 210, 149, 30, - 147, 223, 217, 30, 147, 223, 208, 30, 147, 223, 216, 30, 147, 223, 213, - 30, 147, 223, 211, 30, 147, 223, 215, 30, 147, 201, 168, 30, 147, 223, - 220, 30, 147, 223, 221, 30, 147, 223, 209, 30, 147, 223, 214, 30, 147, - 192, 57, 30, 147, 243, 23, 30, 147, 243, 73, 30, 147, 243, 71, 30, 147, - 247, 15, 30, 147, 247, 13, 30, 147, 243, 89, 30, 147, 243, 90, 30, 147, - 243, 74, 30, 147, 247, 16, 30, 147, 209, 207, 30, 147, 222, 70, 30, 147, - 201, 169, 30, 147, 192, 63, 30, 147, 221, 104, 30, 147, 213, 196, 30, - 147, 213, 202, 30, 147, 213, 201, 30, 147, 198, 162, 30, 147, 233, 3, 30, - 222, 174, 233, 3, 30, 222, 174, 65, 30, 222, 174, 252, 25, 30, 222, 174, - 170, 30, 222, 174, 192, 129, 30, 222, 174, 234, 65, 30, 222, 174, 71, 30, - 222, 174, 192, 67, 30, 222, 174, 192, 80, 30, 222, 174, 74, 30, 222, 174, - 193, 190, 30, 222, 174, 193, 176, 30, 222, 174, 211, 151, 30, 222, 174, - 192, 12, 30, 222, 174, 66, 30, 222, 174, 193, 107, 30, 222, 174, 193, - 125, 30, 222, 174, 193, 86, 30, 222, 174, 191, 225, 30, 222, 174, 233, - 242, 30, 222, 174, 192, 33, 30, 222, 174, 68, 30, 222, 174, 255, 202, 30, - 222, 174, 255, 201, 30, 222, 174, 192, 143, 30, 222, 174, 192, 141, 30, - 222, 174, 234, 63, 30, 222, 174, 234, 62, 30, 222, 174, 234, 64, 30, 222, - 174, 192, 66, 30, 222, 174, 192, 65, 30, 222, 174, 212, 10, 30, 222, 174, - 212, 11, 30, 222, 174, 212, 4, 30, 222, 174, 212, 9, 30, 222, 174, 212, - 7, 30, 222, 174, 192, 0, 30, 222, 174, 191, 255, 30, 222, 174, 191, 254, - 30, 222, 174, 192, 1, 30, 222, 174, 192, 2, 30, 222, 174, 196, 226, 30, - 222, 174, 196, 225, 30, 222, 174, 196, 223, 30, 222, 174, 196, 219, 30, - 222, 174, 196, 220, 30, 222, 174, 191, 220, 30, 222, 174, 191, 217, 30, - 222, 174, 191, 218, 30, 222, 174, 191, 212, 30, 222, 174, 191, 213, 30, - 222, 174, 191, 214, 30, 222, 174, 191, 216, 30, 222, 174, 233, 236, 30, - 222, 174, 233, 238, 30, 222, 174, 192, 32, 30, 222, 174, 228, 69, 30, - 222, 174, 228, 61, 30, 222, 174, 228, 64, 30, 222, 174, 228, 62, 30, 222, - 174, 228, 66, 30, 222, 174, 228, 68, 30, 222, 174, 251, 25, 30, 222, 174, - 251, 22, 30, 222, 174, 251, 20, 30, 222, 174, 251, 21, 30, 222, 174, 201, - 172, 30, 222, 174, 255, 203, 30, 222, 174, 192, 142, 30, 222, 174, 192, - 64, 30, 222, 174, 212, 6, 30, 222, 174, 212, 5, 30, 125, 221, 113, 30, - 125, 201, 167, 30, 125, 221, 106, 30, 125, 213, 204, 30, 125, 213, 202, - 30, 125, 213, 201, 30, 125, 198, 168, 30, 125, 206, 239, 30, 125, 206, - 234, 30, 125, 206, 231, 30, 125, 206, 224, 30, 125, 206, 219, 30, 125, - 206, 214, 30, 125, 206, 225, 30, 125, 206, 237, 30, 125, 216, 77, 30, - 125, 209, 169, 30, 125, 209, 158, 30, 125, 202, 160, 30, 125, 201, 161, - 30, 125, 223, 222, 30, 125, 243, 24, 30, 125, 243, 91, 30, 125, 221, 188, - 30, 125, 199, 7, 30, 125, 209, 209, 30, 125, 229, 142, 30, 125, 221, 107, - 30, 125, 221, 105, 30, 125, 213, 200, 30, 125, 213, 194, 30, 125, 213, - 196, 30, 125, 213, 199, 30, 125, 213, 195, 30, 125, 198, 165, 30, 125, - 198, 162, 30, 125, 206, 232, 30, 125, 206, 227, 30, 125, 206, 213, 30, - 125, 206, 212, 30, 125, 201, 163, 30, 125, 206, 229, 30, 125, 206, 228, - 30, 125, 206, 221, 30, 125, 206, 223, 30, 125, 206, 236, 30, 125, 206, - 216, 30, 125, 206, 226, 30, 125, 206, 235, 30, 125, 206, 211, 30, 125, - 216, 73, 30, 125, 216, 68, 30, 125, 216, 70, 30, 125, 216, 67, 30, 125, - 216, 65, 30, 125, 216, 71, 30, 125, 216, 76, 30, 125, 216, 74, 30, 125, - 222, 71, 30, 125, 209, 160, 30, 125, 209, 161, 30, 125, 209, 166, 30, - 125, 222, 69, 30, 125, 202, 153, 30, 125, 202, 143, 30, 125, 202, 146, - 30, 125, 202, 148, 30, 125, 210, 149, 30, 125, 223, 217, 30, 125, 223, - 210, 30, 125, 201, 168, 30, 125, 223, 218, 30, 125, 192, 57, 30, 125, - 192, 51, 30, 125, 192, 52, 30, 125, 209, 207, 30, 125, 222, 70, 30, 125, - 229, 140, 30, 125, 229, 138, 30, 125, 229, 141, 30, 125, 229, 139, 30, - 125, 192, 63, 30, 125, 221, 109, 30, 125, 221, 108, 30, 125, 221, 112, - 30, 125, 221, 110, 30, 125, 221, 111, 30, 125, 201, 165, 36, 5, 140, 36, - 5, 228, 159, 36, 5, 229, 158, 36, 5, 230, 91, 36, 5, 229, 215, 36, 5, - 229, 245, 36, 5, 229, 23, 36, 5, 229, 14, 36, 5, 173, 36, 5, 218, 225, - 36, 5, 219, 146, 36, 5, 220, 125, 36, 5, 219, 228, 36, 5, 219, 238, 36, - 5, 219, 43, 36, 5, 218, 191, 36, 5, 229, 177, 36, 5, 229, 171, 36, 5, - 229, 173, 36, 5, 229, 176, 36, 5, 229, 174, 36, 5, 229, 175, 36, 5, 229, - 172, 36, 5, 229, 170, 36, 5, 174, 36, 5, 215, 155, 36, 5, 216, 100, 36, - 5, 217, 151, 36, 5, 216, 211, 36, 5, 216, 232, 36, 5, 216, 12, 36, 5, - 215, 80, 36, 5, 200, 54, 36, 5, 200, 48, 36, 5, 200, 50, 36, 5, 200, 53, + 1, 219, 75, 80, 1, 65, 80, 1, 203, 140, 65, 80, 1, 68, 80, 1, 223, 201, + 80, 1, 66, 80, 1, 196, 30, 80, 1, 71, 80, 1, 215, 234, 71, 80, 1, 74, 80, + 1, 250, 165, 80, 18, 3, 199, 200, 252, 208, 80, 18, 3, 252, 208, 80, 18, + 3, 68, 80, 18, 3, 223, 201, 80, 18, 3, 66, 80, 18, 3, 196, 30, 80, 18, 3, + 71, 80, 18, 3, 251, 238, 80, 18, 3, 215, 234, 223, 201, 80, 18, 3, 215, + 234, 74, 80, 18, 3, 235, 17, 58, 80, 3, 251, 73, 80, 3, 75, 60, 80, 3, + 195, 35, 80, 3, 195, 40, 80, 3, 250, 216, 80, 120, 3, 216, 219, 170, 80, + 120, 3, 216, 219, 165, 80, 120, 3, 216, 219, 193, 190, 80, 120, 3, 216, + 219, 140, 80, 1, 230, 208, 188, 80, 17, 191, 77, 80, 17, 107, 80, 17, + 109, 80, 17, 138, 80, 17, 134, 80, 17, 150, 80, 17, 169, 80, 17, 175, 80, + 17, 171, 80, 17, 178, 80, 3, 219, 85, 205, 54, 80, 3, 205, 54, 80, 16, + 219, 38, 80, 16, 242, 69, 80, 16, 252, 3, 80, 16, 231, 148, 80, 1, 203, + 166, 80, 1, 201, 176, 80, 1, 117, 146, 80, 1, 117, 206, 111, 80, 1, 117, + 172, 80, 1, 117, 219, 76, 80, 18, 3, 117, 146, 80, 18, 3, 117, 206, 111, + 80, 18, 3, 117, 172, 80, 18, 3, 117, 219, 76, 80, 1, 215, 234, 214, 70, + 80, 1, 215, 234, 222, 254, 80, 1, 215, 234, 249, 55, 80, 1, 215, 234, + 249, 50, 80, 120, 3, 215, 234, 216, 219, 181, 80, 120, 3, 215, 234, 216, + 219, 174, 80, 120, 3, 215, 234, 216, 219, 173, 80, 1, 203, 172, 222, 64, + 203, 166, 80, 18, 3, 203, 172, 222, 64, 233, 244, 80, 163, 87, 203, 172, + 222, 64, 230, 7, 80, 163, 87, 203, 172, 222, 64, 222, 25, 209, 201, 80, + 1, 193, 102, 208, 118, 222, 64, 199, 49, 80, 1, 193, 102, 208, 118, 222, + 64, 208, 124, 80, 18, 3, 193, 102, 208, 118, 222, 64, 233, 244, 80, 18, + 3, 193, 102, 208, 118, 222, 64, 196, 152, 80, 3, 193, 102, 208, 118, 222, + 64, 198, 78, 80, 3, 193, 102, 208, 118, 222, 64, 198, 77, 80, 3, 193, + 102, 208, 118, 222, 64, 198, 76, 80, 3, 193, 102, 208, 118, 222, 64, 198, + 75, 80, 3, 193, 102, 208, 118, 222, 64, 198, 74, 80, 1, 234, 204, 208, + 118, 222, 64, 213, 81, 80, 1, 234, 204, 208, 118, 222, 64, 191, 183, 80, + 1, 234, 204, 208, 118, 222, 64, 231, 58, 80, 18, 3, 231, 163, 222, 64, + 68, 80, 18, 3, 222, 30, 211, 153, 80, 18, 3, 222, 30, 66, 80, 18, 3, 222, + 30, 234, 190, 80, 1, 203, 140, 155, 80, 1, 203, 140, 221, 217, 80, 1, + 203, 140, 231, 242, 80, 1, 203, 140, 247, 162, 80, 1, 203, 140, 191, 123, + 80, 1, 203, 140, 212, 103, 80, 1, 203, 140, 238, 34, 80, 1, 203, 140, + 181, 80, 1, 203, 140, 209, 230, 80, 1, 203, 140, 233, 111, 80, 1, 203, + 140, 249, 155, 80, 1, 203, 140, 199, 49, 80, 1, 203, 140, 140, 80, 120, + 3, 203, 140, 216, 219, 193, 190, 80, 18, 3, 203, 140, 252, 208, 80, 18, + 3, 203, 140, 71, 80, 18, 3, 203, 140, 235, 17, 58, 80, 18, 3, 203, 140, + 53, 192, 159, 80, 3, 203, 140, 198, 77, 80, 3, 203, 140, 198, 76, 80, 3, + 203, 140, 198, 74, 80, 3, 203, 140, 198, 73, 80, 3, 203, 140, 238, 249, + 198, 77, 80, 3, 203, 140, 238, 249, 198, 76, 80, 3, 203, 140, 238, 249, + 234, 108, 198, 79, 80, 1, 206, 48, 210, 191, 233, 111, 80, 3, 206, 48, + 210, 191, 198, 74, 80, 203, 140, 17, 191, 77, 80, 203, 140, 17, 107, 80, + 203, 140, 17, 109, 80, 203, 140, 17, 138, 80, 203, 140, 17, 134, 80, 203, + 140, 17, 150, 80, 203, 140, 17, 169, 80, 203, 140, 17, 175, 80, 203, 140, + 17, 171, 80, 203, 140, 17, 178, 80, 3, 221, 208, 198, 78, 80, 3, 221, + 208, 198, 76, 80, 18, 3, 251, 224, 65, 80, 18, 3, 251, 224, 251, 238, 80, + 16, 203, 140, 107, 80, 16, 203, 140, 233, 217, 101, 6, 1, 251, 134, 101, + 6, 1, 249, 103, 101, 6, 1, 231, 212, 101, 6, 1, 236, 152, 101, 6, 1, 234, + 105, 101, 6, 1, 195, 49, 101, 6, 1, 191, 80, 101, 6, 1, 199, 193, 101, 6, + 1, 223, 164, 101, 6, 1, 222, 89, 101, 6, 1, 220, 9, 101, 6, 1, 217, 92, + 101, 6, 1, 214, 218, 101, 6, 1, 211, 106, 101, 6, 1, 210, 133, 101, 6, 1, + 191, 67, 101, 6, 1, 207, 165, 101, 6, 1, 205, 143, 101, 6, 1, 199, 179, + 101, 6, 1, 196, 113, 101, 6, 1, 209, 222, 101, 6, 1, 221, 202, 101, 6, 1, + 231, 84, 101, 6, 1, 208, 83, 101, 6, 1, 203, 70, 101, 6, 1, 243, 83, 101, + 6, 1, 247, 130, 101, 6, 1, 222, 236, 101, 6, 1, 243, 20, 101, 6, 1, 246, + 243, 101, 6, 1, 192, 218, 101, 6, 1, 222, 251, 101, 6, 1, 230, 89, 101, + 6, 1, 229, 247, 101, 6, 1, 229, 147, 101, 6, 1, 193, 125, 101, 6, 1, 230, + 21, 101, 6, 1, 229, 13, 101, 6, 1, 192, 14, 101, 6, 1, 252, 16, 101, 1, + 251, 134, 101, 1, 249, 103, 101, 1, 231, 212, 101, 1, 236, 152, 101, 1, + 234, 105, 101, 1, 195, 49, 101, 1, 191, 80, 101, 1, 199, 193, 101, 1, + 223, 164, 101, 1, 222, 89, 101, 1, 220, 9, 101, 1, 217, 92, 101, 1, 214, + 218, 101, 1, 211, 106, 101, 1, 210, 133, 101, 1, 191, 67, 101, 1, 207, + 165, 101, 1, 205, 143, 101, 1, 199, 179, 101, 1, 196, 113, 101, 1, 209, + 222, 101, 1, 221, 202, 101, 1, 231, 84, 101, 1, 208, 83, 101, 1, 203, 70, + 101, 1, 243, 83, 101, 1, 247, 130, 101, 1, 222, 236, 101, 1, 243, 20, + 101, 1, 246, 243, 101, 1, 192, 218, 101, 1, 222, 251, 101, 1, 230, 89, + 101, 1, 229, 247, 101, 1, 229, 147, 101, 1, 193, 125, 101, 1, 230, 21, + 101, 1, 229, 13, 101, 1, 233, 25, 101, 1, 192, 14, 101, 1, 234, 125, 101, + 1, 154, 231, 212, 101, 1, 251, 232, 101, 210, 130, 204, 11, 52, 1, 101, + 214, 218, 101, 1, 252, 16, 101, 1, 230, 19, 56, 101, 1, 220, 118, 56, 30, + 147, 221, 115, 30, 147, 201, 168, 30, 147, 213, 206, 30, 147, 198, 168, + 30, 147, 201, 157, 30, 147, 206, 240, 30, 147, 216, 79, 30, 147, 209, + 171, 30, 147, 201, 165, 30, 147, 202, 161, 30, 147, 201, 162, 30, 147, + 223, 224, 30, 147, 243, 26, 30, 147, 201, 172, 30, 147, 243, 93, 30, 147, + 221, 190, 30, 147, 199, 7, 30, 147, 209, 211, 30, 147, 229, 144, 30, 147, + 213, 202, 30, 147, 201, 166, 30, 147, 213, 196, 30, 147, 213, 200, 30, + 147, 198, 165, 30, 147, 206, 228, 30, 147, 201, 164, 30, 147, 206, 238, + 30, 147, 222, 70, 30, 147, 216, 72, 30, 147, 222, 73, 30, 147, 209, 166, + 30, 147, 209, 164, 30, 147, 209, 152, 30, 147, 209, 160, 30, 147, 209, + 158, 30, 147, 209, 155, 30, 147, 209, 157, 30, 147, 209, 154, 30, 147, + 209, 159, 30, 147, 209, 169, 30, 147, 209, 170, 30, 147, 209, 153, 30, + 147, 209, 163, 30, 147, 222, 71, 30, 147, 222, 69, 30, 147, 202, 154, 30, + 147, 202, 152, 30, 147, 202, 144, 30, 147, 202, 147, 30, 147, 202, 153, + 30, 147, 202, 149, 30, 147, 202, 148, 30, 147, 202, 146, 30, 147, 202, + 157, 30, 147, 202, 159, 30, 147, 202, 160, 30, 147, 202, 155, 30, 147, + 202, 145, 30, 147, 202, 150, 30, 147, 202, 158, 30, 147, 243, 74, 30, + 147, 243, 72, 30, 147, 247, 16, 30, 147, 247, 14, 30, 147, 210, 151, 30, + 147, 223, 219, 30, 147, 223, 210, 30, 147, 223, 218, 30, 147, 223, 215, + 30, 147, 223, 213, 30, 147, 223, 217, 30, 147, 201, 169, 30, 147, 223, + 222, 30, 147, 223, 223, 30, 147, 223, 211, 30, 147, 223, 216, 30, 147, + 192, 57, 30, 147, 243, 25, 30, 147, 243, 75, 30, 147, 243, 73, 30, 147, + 247, 17, 30, 147, 247, 15, 30, 147, 243, 91, 30, 147, 243, 92, 30, 147, + 243, 76, 30, 147, 247, 18, 30, 147, 209, 209, 30, 147, 222, 72, 30, 147, + 201, 170, 30, 147, 192, 63, 30, 147, 221, 106, 30, 147, 213, 198, 30, + 147, 213, 204, 30, 147, 213, 203, 30, 147, 198, 162, 30, 147, 233, 5, 30, + 222, 176, 233, 5, 30, 222, 176, 65, 30, 222, 176, 252, 27, 30, 222, 176, + 170, 30, 222, 176, 192, 129, 30, 222, 176, 234, 67, 30, 222, 176, 71, 30, + 222, 176, 192, 67, 30, 222, 176, 192, 80, 30, 222, 176, 74, 30, 222, 176, + 193, 190, 30, 222, 176, 193, 176, 30, 222, 176, 211, 153, 30, 222, 176, + 192, 12, 30, 222, 176, 66, 30, 222, 176, 193, 107, 30, 222, 176, 193, + 125, 30, 222, 176, 193, 86, 30, 222, 176, 191, 225, 30, 222, 176, 233, + 244, 30, 222, 176, 192, 33, 30, 222, 176, 68, 30, 222, 176, 255, 204, 30, + 222, 176, 255, 203, 30, 222, 176, 192, 143, 30, 222, 176, 192, 141, 30, + 222, 176, 234, 65, 30, 222, 176, 234, 64, 30, 222, 176, 234, 66, 30, 222, + 176, 192, 66, 30, 222, 176, 192, 65, 30, 222, 176, 212, 12, 30, 222, 176, + 212, 13, 30, 222, 176, 212, 6, 30, 222, 176, 212, 11, 30, 222, 176, 212, + 9, 30, 222, 176, 192, 0, 30, 222, 176, 191, 255, 30, 222, 176, 191, 254, + 30, 222, 176, 192, 1, 30, 222, 176, 192, 2, 30, 222, 176, 196, 226, 30, + 222, 176, 196, 225, 30, 222, 176, 196, 223, 30, 222, 176, 196, 219, 30, + 222, 176, 196, 220, 30, 222, 176, 191, 220, 30, 222, 176, 191, 217, 30, + 222, 176, 191, 218, 30, 222, 176, 191, 212, 30, 222, 176, 191, 213, 30, + 222, 176, 191, 214, 30, 222, 176, 191, 216, 30, 222, 176, 233, 238, 30, + 222, 176, 233, 240, 30, 222, 176, 192, 32, 30, 222, 176, 228, 71, 30, + 222, 176, 228, 63, 30, 222, 176, 228, 66, 30, 222, 176, 228, 64, 30, 222, + 176, 228, 68, 30, 222, 176, 228, 70, 30, 222, 176, 251, 27, 30, 222, 176, + 251, 24, 30, 222, 176, 251, 22, 30, 222, 176, 251, 23, 30, 222, 176, 201, + 173, 30, 222, 176, 255, 205, 30, 222, 176, 192, 142, 30, 222, 176, 192, + 64, 30, 222, 176, 212, 8, 30, 222, 176, 212, 7, 30, 125, 221, 115, 30, + 125, 201, 168, 30, 125, 221, 108, 30, 125, 213, 206, 30, 125, 213, 204, + 30, 125, 213, 203, 30, 125, 198, 168, 30, 125, 206, 240, 30, 125, 206, + 235, 30, 125, 206, 232, 30, 125, 206, 225, 30, 125, 206, 220, 30, 125, + 206, 215, 30, 125, 206, 226, 30, 125, 206, 238, 30, 125, 216, 79, 30, + 125, 209, 171, 30, 125, 209, 160, 30, 125, 202, 161, 30, 125, 201, 162, + 30, 125, 223, 224, 30, 125, 243, 26, 30, 125, 243, 93, 30, 125, 221, 190, + 30, 125, 199, 7, 30, 125, 209, 211, 30, 125, 229, 144, 30, 125, 221, 109, + 30, 125, 221, 107, 30, 125, 213, 202, 30, 125, 213, 196, 30, 125, 213, + 198, 30, 125, 213, 201, 30, 125, 213, 197, 30, 125, 198, 165, 30, 125, + 198, 162, 30, 125, 206, 233, 30, 125, 206, 228, 30, 125, 206, 214, 30, + 125, 206, 213, 30, 125, 201, 164, 30, 125, 206, 230, 30, 125, 206, 229, + 30, 125, 206, 222, 30, 125, 206, 224, 30, 125, 206, 237, 30, 125, 206, + 217, 30, 125, 206, 227, 30, 125, 206, 236, 30, 125, 206, 212, 30, 125, + 216, 75, 30, 125, 216, 70, 30, 125, 216, 72, 30, 125, 216, 69, 30, 125, + 216, 67, 30, 125, 216, 73, 30, 125, 216, 78, 30, 125, 216, 76, 30, 125, + 222, 73, 30, 125, 209, 162, 30, 125, 209, 163, 30, 125, 209, 168, 30, + 125, 222, 71, 30, 125, 202, 154, 30, 125, 202, 144, 30, 125, 202, 147, + 30, 125, 202, 149, 30, 125, 210, 151, 30, 125, 223, 219, 30, 125, 223, + 212, 30, 125, 201, 169, 30, 125, 223, 220, 30, 125, 192, 57, 30, 125, + 192, 51, 30, 125, 192, 52, 30, 125, 209, 209, 30, 125, 222, 72, 30, 125, + 229, 142, 30, 125, 229, 140, 30, 125, 229, 143, 30, 125, 229, 141, 30, + 125, 192, 63, 30, 125, 221, 111, 30, 125, 221, 110, 30, 125, 221, 114, + 30, 125, 221, 112, 30, 125, 221, 113, 30, 125, 201, 166, 36, 5, 140, 36, + 5, 228, 161, 36, 5, 229, 160, 36, 5, 230, 93, 36, 5, 229, 217, 36, 5, + 229, 247, 36, 5, 229, 25, 36, 5, 229, 16, 36, 5, 173, 36, 5, 218, 227, + 36, 5, 219, 148, 36, 5, 220, 127, 36, 5, 219, 230, 36, 5, 219, 240, 36, + 5, 219, 45, 36, 5, 218, 193, 36, 5, 229, 179, 36, 5, 229, 173, 36, 5, + 229, 175, 36, 5, 229, 178, 36, 5, 229, 176, 36, 5, 229, 177, 36, 5, 229, + 174, 36, 5, 229, 172, 36, 5, 174, 36, 5, 215, 157, 36, 5, 216, 102, 36, + 5, 217, 153, 36, 5, 216, 213, 36, 5, 216, 234, 36, 5, 216, 14, 36, 5, + 215, 82, 36, 5, 200, 54, 36, 5, 200, 48, 36, 5, 200, 50, 36, 5, 200, 53, 36, 5, 200, 51, 36, 5, 200, 52, 36, 5, 200, 49, 36, 5, 200, 47, 36, 5, - 165, 36, 5, 206, 68, 36, 5, 207, 1, 36, 5, 207, 178, 36, 5, 207, 84, 36, - 5, 207, 113, 36, 5, 206, 162, 36, 5, 206, 26, 36, 5, 188, 36, 5, 201, 4, - 36, 5, 202, 222, 36, 5, 205, 197, 36, 5, 205, 50, 36, 5, 205, 68, 36, 5, - 202, 46, 36, 5, 200, 150, 36, 5, 203, 165, 36, 5, 203, 5, 36, 5, 203, 81, - 36, 5, 203, 160, 36, 5, 203, 111, 36, 5, 203, 113, 36, 5, 203, 56, 36, 5, - 202, 240, 36, 5, 208, 96, 36, 5, 208, 33, 36, 5, 208, 57, 36, 5, 208, 95, - 36, 5, 208, 74, 36, 5, 208, 75, 36, 5, 208, 45, 36, 5, 208, 44, 36, 5, - 207, 240, 36, 5, 207, 236, 36, 5, 207, 239, 36, 5, 207, 237, 36, 5, 207, - 238, 36, 5, 208, 71, 36, 5, 208, 63, 36, 5, 208, 66, 36, 5, 208, 70, 36, - 5, 208, 67, 36, 5, 208, 68, 36, 5, 208, 65, 36, 5, 208, 62, 36, 5, 208, - 58, 36, 5, 208, 61, 36, 5, 208, 59, 36, 5, 208, 60, 36, 5, 249, 153, 36, - 5, 248, 10, 36, 5, 248, 188, 36, 5, 249, 151, 36, 5, 249, 1, 36, 5, 249, - 17, 36, 5, 248, 111, 36, 5, 247, 210, 36, 5, 195, 188, 36, 5, 193, 249, + 165, 36, 5, 206, 69, 36, 5, 207, 2, 36, 5, 207, 180, 36, 5, 207, 86, 36, + 5, 207, 115, 36, 5, 206, 163, 36, 5, 206, 27, 36, 5, 188, 36, 5, 201, 5, + 36, 5, 202, 223, 36, 5, 205, 198, 36, 5, 205, 51, 36, 5, 205, 69, 36, 5, + 202, 47, 36, 5, 200, 150, 36, 5, 203, 166, 36, 5, 203, 6, 36, 5, 203, 82, + 36, 5, 203, 161, 36, 5, 203, 112, 36, 5, 203, 114, 36, 5, 203, 57, 36, 5, + 202, 241, 36, 5, 208, 98, 36, 5, 208, 35, 36, 5, 208, 59, 36, 5, 208, 97, + 36, 5, 208, 76, 36, 5, 208, 77, 36, 5, 208, 47, 36, 5, 208, 46, 36, 5, + 207, 242, 36, 5, 207, 238, 36, 5, 207, 241, 36, 5, 207, 239, 36, 5, 207, + 240, 36, 5, 208, 73, 36, 5, 208, 65, 36, 5, 208, 68, 36, 5, 208, 72, 36, + 5, 208, 69, 36, 5, 208, 70, 36, 5, 208, 67, 36, 5, 208, 64, 36, 5, 208, + 60, 36, 5, 208, 63, 36, 5, 208, 61, 36, 5, 208, 62, 36, 5, 249, 155, 36, + 5, 248, 12, 36, 5, 248, 190, 36, 5, 249, 153, 36, 5, 249, 3, 36, 5, 249, + 19, 36, 5, 248, 113, 36, 5, 247, 212, 36, 5, 195, 188, 36, 5, 193, 249, 36, 5, 195, 69, 36, 5, 195, 187, 36, 5, 195, 148, 36, 5, 195, 153, 36, 5, 195, 24, 36, 5, 193, 238, 36, 5, 190, 190, 36, 5, 197, 94, 36, 5, 198, 193, 36, 5, 199, 245, 36, 5, 199, 121, 36, 5, 199, 145, 36, 5, 159, 36, - 5, 197, 43, 36, 5, 247, 160, 36, 5, 238, 195, 36, 5, 243, 29, 36, 5, 247, - 159, 36, 5, 247, 34, 36, 5, 247, 42, 36, 5, 242, 99, 36, 5, 238, 151, 36, - 5, 192, 220, 36, 5, 192, 188, 36, 5, 192, 207, 36, 5, 192, 219, 36, 5, - 192, 213, 36, 5, 192, 214, 36, 5, 192, 196, 36, 5, 192, 195, 36, 5, 192, - 181, 36, 5, 192, 177, 36, 5, 192, 180, 36, 5, 192, 178, 36, 5, 192, 179, - 36, 5, 180, 36, 5, 212, 178, 36, 5, 213, 219, 36, 5, 214, 250, 36, 5, - 214, 110, 36, 5, 214, 121, 36, 5, 213, 43, 36, 5, 212, 110, 36, 5, 212, - 101, 36, 5, 212, 58, 36, 5, 212, 81, 36, 5, 212, 100, 36, 5, 212, 89, 36, - 5, 212, 90, 36, 5, 212, 65, 36, 5, 212, 48, 36, 5, 231, 11, 65, 36, 5, - 231, 11, 66, 36, 5, 231, 11, 68, 36, 5, 231, 11, 252, 206, 36, 5, 231, - 11, 234, 188, 36, 5, 231, 11, 71, 36, 5, 231, 11, 74, 36, 5, 231, 11, - 193, 190, 36, 5, 155, 36, 5, 220, 232, 36, 5, 221, 166, 36, 5, 222, 127, - 36, 5, 222, 13, 36, 5, 222, 22, 36, 5, 221, 67, 36, 5, 221, 62, 36, 5, - 220, 179, 36, 5, 220, 172, 36, 5, 220, 178, 36, 5, 220, 173, 36, 5, 220, - 174, 36, 5, 220, 165, 36, 5, 220, 159, 36, 5, 220, 161, 36, 5, 220, 164, - 36, 5, 220, 162, 36, 5, 220, 163, 36, 5, 220, 160, 36, 5, 220, 158, 36, - 5, 220, 154, 36, 5, 220, 157, 36, 5, 220, 155, 36, 5, 220, 156, 36, 5, - 193, 190, 36, 5, 193, 0, 36, 5, 193, 86, 36, 5, 193, 181, 36, 5, 193, - 114, 36, 5, 193, 125, 36, 5, 193, 48, 36, 5, 193, 40, 36, 5, 209, 219, - 65, 36, 5, 209, 219, 66, 36, 5, 209, 219, 68, 36, 5, 209, 219, 252, 206, - 36, 5, 209, 219, 234, 188, 36, 5, 209, 219, 71, 36, 5, 209, 219, 74, 36, + 5, 197, 43, 36, 5, 247, 162, 36, 5, 238, 197, 36, 5, 243, 31, 36, 5, 247, + 161, 36, 5, 247, 36, 36, 5, 247, 44, 36, 5, 242, 101, 36, 5, 238, 153, + 36, 5, 192, 220, 36, 5, 192, 188, 36, 5, 192, 207, 36, 5, 192, 219, 36, + 5, 192, 213, 36, 5, 192, 214, 36, 5, 192, 196, 36, 5, 192, 195, 36, 5, + 192, 181, 36, 5, 192, 177, 36, 5, 192, 180, 36, 5, 192, 178, 36, 5, 192, + 179, 36, 5, 181, 36, 5, 212, 180, 36, 5, 213, 221, 36, 5, 214, 252, 36, + 5, 214, 112, 36, 5, 214, 123, 36, 5, 213, 45, 36, 5, 212, 112, 36, 5, + 212, 103, 36, 5, 212, 60, 36, 5, 212, 83, 36, 5, 212, 102, 36, 5, 212, + 91, 36, 5, 212, 92, 36, 5, 212, 67, 36, 5, 212, 50, 36, 5, 231, 13, 65, + 36, 5, 231, 13, 66, 36, 5, 231, 13, 68, 36, 5, 231, 13, 252, 208, 36, 5, + 231, 13, 234, 190, 36, 5, 231, 13, 71, 36, 5, 231, 13, 74, 36, 5, 231, + 13, 193, 190, 36, 5, 155, 36, 5, 220, 234, 36, 5, 221, 168, 36, 5, 222, + 129, 36, 5, 222, 15, 36, 5, 222, 24, 36, 5, 221, 69, 36, 5, 221, 64, 36, + 5, 220, 181, 36, 5, 220, 174, 36, 5, 220, 180, 36, 5, 220, 175, 36, 5, + 220, 176, 36, 5, 220, 167, 36, 5, 220, 161, 36, 5, 220, 163, 36, 5, 220, + 166, 36, 5, 220, 164, 36, 5, 220, 165, 36, 5, 220, 162, 36, 5, 220, 160, + 36, 5, 220, 156, 36, 5, 220, 159, 36, 5, 220, 157, 36, 5, 220, 158, 36, + 5, 193, 190, 36, 5, 193, 0, 36, 5, 193, 86, 36, 5, 193, 181, 36, 5, 193, + 114, 36, 5, 193, 125, 36, 5, 193, 48, 36, 5, 193, 40, 36, 5, 209, 221, + 65, 36, 5, 209, 221, 66, 36, 5, 209, 221, 68, 36, 5, 209, 221, 252, 208, + 36, 5, 209, 221, 234, 190, 36, 5, 209, 221, 71, 36, 5, 209, 221, 74, 36, 5, 191, 123, 36, 5, 190, 251, 36, 5, 191, 30, 36, 5, 191, 121, 36, 5, 191, 84, 36, 5, 191, 87, 36, 5, 191, 7, 36, 5, 190, 238, 36, 5, 191, 71, 36, 5, 191, 48, 36, 5, 191, 57, 36, 5, 191, 70, 36, 5, 191, 61, 36, 5, 191, 62, 36, 5, 191, 54, 36, 5, 191, 39, 36, 5, 170, 36, 5, 191, 225, 36, 5, 192, 33, 36, 5, 192, 140, 36, 5, 192, 77, 36, 5, 192, 80, 36, 5, 192, - 12, 36, 5, 191, 252, 36, 5, 238, 32, 36, 5, 235, 89, 36, 5, 237, 44, 36, - 5, 238, 31, 36, 5, 237, 131, 36, 5, 237, 146, 36, 5, 236, 174, 36, 5, - 235, 46, 36, 5, 237, 191, 36, 5, 237, 156, 36, 5, 237, 168, 36, 5, 237, - 190, 36, 5, 237, 178, 36, 5, 237, 179, 36, 5, 237, 161, 36, 5, 237, 147, - 36, 5, 223, 32, 36, 5, 222, 182, 36, 5, 222, 244, 36, 5, 223, 31, 36, 5, - 223, 8, 36, 5, 223, 10, 36, 5, 222, 201, 36, 5, 222, 160, 36, 5, 231, - 240, 36, 5, 230, 179, 36, 5, 231, 53, 36, 5, 231, 237, 36, 5, 231, 157, - 36, 5, 231, 165, 36, 5, 231, 3, 36, 5, 231, 2, 36, 5, 230, 135, 36, 5, - 230, 131, 36, 5, 230, 134, 36, 5, 230, 132, 36, 5, 230, 133, 36, 5, 231, - 127, 36, 5, 231, 107, 36, 5, 231, 117, 36, 5, 231, 126, 36, 5, 231, 121, - 36, 5, 231, 122, 36, 5, 231, 111, 36, 5, 231, 96, 36, 5, 199, 49, 36, 5, + 12, 36, 5, 191, 252, 36, 5, 238, 34, 36, 5, 235, 91, 36, 5, 237, 46, 36, + 5, 238, 33, 36, 5, 237, 133, 36, 5, 237, 148, 36, 5, 236, 176, 36, 5, + 235, 48, 36, 5, 237, 193, 36, 5, 237, 158, 36, 5, 237, 170, 36, 5, 237, + 192, 36, 5, 237, 180, 36, 5, 237, 181, 36, 5, 237, 163, 36, 5, 237, 149, + 36, 5, 223, 34, 36, 5, 222, 184, 36, 5, 222, 246, 36, 5, 223, 33, 36, 5, + 223, 10, 36, 5, 223, 12, 36, 5, 222, 203, 36, 5, 222, 162, 36, 5, 231, + 242, 36, 5, 230, 181, 36, 5, 231, 55, 36, 5, 231, 239, 36, 5, 231, 159, + 36, 5, 231, 167, 36, 5, 231, 5, 36, 5, 231, 4, 36, 5, 230, 137, 36, 5, + 230, 133, 36, 5, 230, 136, 36, 5, 230, 134, 36, 5, 230, 135, 36, 5, 231, + 129, 36, 5, 231, 109, 36, 5, 231, 119, 36, 5, 231, 128, 36, 5, 231, 123, + 36, 5, 231, 124, 36, 5, 231, 113, 36, 5, 231, 98, 36, 5, 199, 49, 36, 5, 198, 213, 36, 5, 199, 11, 36, 5, 199, 48, 36, 5, 199, 31, 36, 5, 199, 33, - 36, 5, 198, 241, 36, 5, 198, 204, 36, 5, 247, 1, 36, 5, 243, 48, 36, 5, - 243, 95, 36, 5, 247, 0, 36, 5, 243, 123, 36, 5, 243, 127, 36, 5, 243, 68, - 36, 5, 243, 37, 36, 5, 209, 228, 36, 5, 209, 191, 36, 5, 209, 211, 36, 5, - 209, 227, 36, 5, 209, 213, 36, 5, 209, 214, 36, 5, 209, 199, 36, 5, 209, - 187, 36, 5, 197, 168, 36, 5, 197, 140, 36, 5, 197, 146, 36, 5, 197, 167, + 36, 5, 198, 241, 36, 5, 198, 204, 36, 5, 247, 3, 36, 5, 243, 50, 36, 5, + 243, 97, 36, 5, 247, 2, 36, 5, 243, 125, 36, 5, 243, 129, 36, 5, 243, 70, + 36, 5, 243, 39, 36, 5, 209, 230, 36, 5, 209, 193, 36, 5, 209, 213, 36, 5, + 209, 229, 36, 5, 209, 215, 36, 5, 209, 216, 36, 5, 209, 201, 36, 5, 209, + 189, 36, 5, 197, 168, 36, 5, 197, 140, 36, 5, 197, 146, 36, 5, 197, 167, 36, 5, 197, 160, 36, 5, 197, 161, 36, 5, 197, 144, 36, 5, 197, 138, 36, 5, 196, 240, 36, 5, 196, 232, 36, 5, 196, 236, 36, 5, 196, 239, 36, 5, 196, 237, 36, 5, 196, 238, 36, 5, 196, 234, 36, 5, 196, 233, 36, 5, 233, - 109, 36, 5, 232, 86, 36, 5, 233, 23, 36, 5, 233, 108, 36, 5, 233, 52, 36, - 5, 233, 59, 36, 5, 232, 175, 36, 5, 232, 62, 36, 5, 168, 36, 5, 208, 165, - 36, 5, 209, 185, 36, 5, 210, 220, 36, 5, 210, 49, 36, 5, 210, 63, 36, 5, - 209, 73, 36, 5, 208, 122, 36, 5, 206, 16, 36, 5, 215, 68, 36, 5, 232, 56, - 36, 33, 231, 153, 23, 18, 219, 198, 77, 36, 33, 18, 219, 198, 77, 36, 33, - 231, 153, 77, 36, 205, 54, 77, 36, 193, 22, 36, 232, 80, 201, 63, 36, - 242, 74, 36, 204, 25, 36, 242, 83, 36, 208, 228, 242, 83, 36, 208, 13, - 77, 36, 210, 128, 204, 10, 36, 17, 107, 36, 17, 109, 36, 17, 138, 36, 17, - 134, 36, 17, 149, 36, 17, 169, 36, 17, 175, 36, 17, 171, 36, 17, 178, 36, - 31, 199, 95, 36, 31, 197, 32, 36, 31, 198, 249, 36, 31, 232, 135, 36, 31, - 233, 15, 36, 31, 202, 120, 36, 31, 203, 241, 36, 31, 234, 153, 36, 31, - 213, 169, 36, 31, 228, 140, 36, 31, 199, 96, 189, 36, 5, 205, 59, 215, - 80, 36, 5, 215, 76, 36, 5, 215, 77, 36, 5, 215, 78, 36, 5, 205, 59, 247, - 210, 36, 5, 247, 207, 36, 5, 247, 208, 36, 5, 247, 209, 36, 5, 205, 59, - 232, 62, 36, 5, 232, 58, 36, 5, 232, 59, 36, 5, 232, 60, 36, 5, 205, 59, - 208, 122, 36, 5, 208, 118, 36, 5, 208, 119, 36, 5, 208, 120, 36, 198, 80, - 87, 192, 15, 36, 198, 80, 87, 237, 89, 36, 198, 80, 87, 206, 194, 36, - 198, 80, 87, 203, 40, 206, 194, 36, 198, 80, 87, 237, 18, 36, 198, 80, - 87, 221, 250, 36, 198, 80, 87, 243, 76, 36, 198, 80, 87, 229, 147, 36, - 198, 80, 87, 237, 88, 36, 198, 80, 87, 220, 195, 103, 1, 65, 103, 1, 71, - 103, 1, 68, 103, 1, 74, 103, 1, 66, 103, 1, 196, 12, 103, 1, 231, 240, - 103, 1, 155, 103, 1, 231, 165, 103, 1, 231, 53, 103, 1, 231, 3, 103, 1, - 230, 179, 103, 1, 230, 138, 103, 1, 140, 103, 1, 229, 245, 103, 1, 229, - 158, 103, 1, 229, 23, 103, 1, 228, 159, 103, 1, 228, 126, 103, 1, 173, - 103, 1, 219, 238, 103, 1, 219, 146, 103, 1, 219, 43, 103, 1, 218, 225, - 103, 1, 218, 192, 103, 1, 174, 103, 1, 216, 232, 103, 1, 216, 100, 103, - 1, 216, 12, 103, 1, 215, 155, 103, 1, 180, 103, 1, 229, 47, 103, 1, 214, - 237, 103, 1, 214, 121, 103, 1, 213, 219, 103, 1, 213, 43, 103, 1, 212, - 178, 103, 1, 212, 112, 103, 1, 208, 32, 103, 1, 208, 16, 103, 1, 208, 9, - 103, 1, 207, 255, 103, 1, 207, 244, 103, 1, 207, 242, 103, 1, 188, 103, - 1, 206, 8, 103, 1, 205, 68, 103, 1, 202, 222, 103, 1, 202, 46, 103, 1, - 201, 4, 103, 1, 200, 158, 103, 1, 238, 32, 103, 1, 190, 190, 103, 1, 237, - 146, 103, 1, 199, 145, 103, 1, 237, 44, 103, 1, 198, 193, 103, 1, 236, - 174, 103, 1, 235, 89, 103, 1, 235, 57, 103, 1, 236, 186, 103, 1, 198, - 115, 103, 1, 198, 114, 103, 1, 198, 103, 103, 1, 198, 102, 103, 1, 198, - 101, 103, 1, 198, 100, 103, 1, 197, 168, 103, 1, 197, 161, 103, 1, 197, - 146, 103, 1, 197, 144, 103, 1, 197, 140, 103, 1, 197, 139, 103, 1, 193, - 190, 103, 1, 193, 125, 103, 1, 193, 86, 103, 1, 193, 48, 103, 1, 193, 0, - 103, 1, 192, 243, 103, 1, 170, 103, 1, 192, 80, 103, 1, 192, 33, 103, 1, - 192, 12, 103, 1, 191, 225, 103, 1, 191, 184, 103, 1, 215, 87, 103, 2, 1, - 192, 80, 103, 2, 1, 192, 33, 103, 2, 1, 192, 12, 103, 2, 1, 191, 225, - 103, 2, 1, 191, 184, 103, 2, 1, 215, 87, 21, 22, 228, 88, 21, 22, 71, 21, - 22, 252, 170, 21, 22, 68, 21, 22, 223, 199, 21, 22, 74, 21, 22, 211, 87, - 21, 22, 192, 158, 211, 87, 21, 22, 98, 234, 188, 21, 22, 98, 68, 21, 22, - 65, 21, 22, 252, 206, 21, 22, 193, 125, 21, 22, 193, 103, 193, 125, 21, - 22, 193, 86, 21, 22, 193, 103, 193, 86, 21, 22, 193, 70, 21, 22, 193, - 103, 193, 70, 21, 22, 193, 48, 21, 22, 193, 103, 193, 48, 21, 22, 193, - 29, 21, 22, 193, 103, 193, 29, 21, 22, 214, 209, 193, 29, 21, 22, 193, - 190, 21, 22, 193, 103, 193, 190, 21, 22, 193, 181, 21, 22, 193, 103, 193, - 181, 21, 22, 214, 209, 193, 181, 21, 22, 251, 236, 21, 22, 192, 158, 193, - 224, 21, 22, 231, 11, 201, 63, 21, 22, 53, 252, 46, 21, 22, 53, 230, 210, - 21, 22, 53, 248, 77, 132, 206, 188, 21, 22, 53, 198, 54, 132, 206, 188, - 21, 22, 53, 50, 132, 206, 188, 21, 22, 53, 206, 188, 21, 22, 53, 55, 252, - 46, 21, 22, 53, 55, 203, 40, 81, 201, 15, 21, 22, 53, 82, 236, 140, 21, - 22, 53, 203, 40, 228, 241, 106, 21, 22, 53, 209, 81, 21, 22, 53, 144, - 199, 228, 21, 22, 234, 103, 21, 22, 223, 162, 21, 22, 211, 104, 21, 22, - 251, 132, 21, 22, 210, 63, 21, 22, 210, 218, 21, 22, 209, 185, 21, 22, - 209, 145, 21, 22, 209, 73, 21, 22, 209, 37, 21, 22, 192, 158, 209, 37, - 21, 22, 98, 229, 215, 21, 22, 98, 229, 158, 21, 22, 168, 21, 22, 210, - 220, 21, 22, 208, 120, 21, 22, 193, 103, 208, 120, 21, 22, 208, 118, 21, - 22, 193, 103, 208, 118, 21, 22, 208, 117, 21, 22, 193, 103, 208, 117, 21, - 22, 208, 115, 21, 22, 193, 103, 208, 115, 21, 22, 208, 114, 21, 22, 193, - 103, 208, 114, 21, 22, 208, 122, 21, 22, 193, 103, 208, 122, 21, 22, 208, - 121, 21, 22, 193, 103, 208, 121, 21, 22, 192, 158, 208, 121, 21, 22, 210, - 236, 21, 22, 193, 103, 210, 236, 21, 22, 98, 230, 116, 21, 22, 199, 145, - 21, 22, 199, 242, 21, 22, 198, 193, 21, 22, 198, 170, 21, 22, 159, 21, - 22, 198, 59, 21, 22, 192, 158, 198, 59, 21, 22, 98, 237, 131, 21, 22, 98, - 237, 44, 21, 22, 190, 190, 21, 22, 199, 245, 21, 22, 197, 41, 21, 22, - 193, 103, 197, 41, 21, 22, 197, 19, 21, 22, 193, 103, 197, 19, 21, 22, - 197, 18, 21, 22, 193, 103, 197, 18, 21, 22, 109, 21, 22, 193, 103, 109, - 21, 22, 197, 9, 21, 22, 193, 103, 197, 9, 21, 22, 197, 43, 21, 22, 193, - 103, 197, 43, 21, 22, 197, 42, 21, 22, 193, 103, 197, 42, 21, 22, 214, - 209, 197, 42, 21, 22, 200, 43, 21, 22, 197, 127, 21, 22, 197, 111, 21, - 22, 197, 109, 21, 22, 197, 132, 21, 22, 222, 22, 21, 22, 222, 121, 21, - 22, 221, 166, 21, 22, 221, 145, 21, 22, 221, 67, 21, 22, 221, 41, 21, 22, - 192, 158, 221, 41, 21, 22, 155, 21, 22, 222, 127, 21, 22, 220, 174, 21, - 22, 193, 103, 220, 174, 21, 22, 220, 172, 21, 22, 193, 103, 220, 172, 21, - 22, 220, 171, 21, 22, 193, 103, 220, 171, 21, 22, 220, 169, 21, 22, 193, - 103, 220, 169, 21, 22, 220, 168, 21, 22, 193, 103, 220, 168, 21, 22, 220, - 179, 21, 22, 193, 103, 220, 179, 21, 22, 220, 178, 21, 22, 193, 103, 220, - 178, 21, 22, 214, 209, 220, 178, 21, 22, 222, 152, 21, 22, 220, 180, 21, - 22, 202, 1, 222, 6, 21, 22, 202, 1, 221, 146, 21, 22, 202, 1, 221, 56, - 21, 22, 202, 1, 222, 104, 21, 22, 247, 42, 21, 22, 247, 158, 21, 22, 243, - 29, 21, 22, 243, 19, 21, 22, 242, 99, 21, 22, 239, 18, 21, 22, 192, 158, - 239, 18, 21, 22, 247, 160, 21, 22, 247, 159, 21, 22, 238, 149, 21, 22, - 193, 103, 238, 149, 21, 22, 238, 147, 21, 22, 193, 103, 238, 147, 21, 22, - 238, 146, 21, 22, 193, 103, 238, 146, 21, 22, 238, 145, 21, 22, 193, 103, - 238, 145, 21, 22, 238, 144, 21, 22, 193, 103, 238, 144, 21, 22, 238, 151, - 21, 22, 193, 103, 238, 151, 21, 22, 238, 150, 21, 22, 193, 103, 238, 150, - 21, 22, 214, 209, 238, 150, 21, 22, 247, 193, 21, 22, 205, 101, 199, 51, - 21, 22, 216, 232, 21, 22, 217, 150, 21, 22, 216, 100, 21, 22, 216, 61, - 21, 22, 216, 12, 21, 22, 215, 211, 21, 22, 192, 158, 215, 211, 21, 22, - 174, 21, 22, 217, 151, 21, 22, 215, 78, 21, 22, 193, 103, 215, 78, 21, - 22, 215, 76, 21, 22, 193, 103, 215, 76, 21, 22, 215, 75, 21, 22, 193, - 103, 215, 75, 21, 22, 215, 74, 21, 22, 193, 103, 215, 74, 21, 22, 215, - 73, 21, 22, 193, 103, 215, 73, 21, 22, 215, 80, 21, 22, 193, 103, 215, - 80, 21, 22, 215, 79, 21, 22, 193, 103, 215, 79, 21, 22, 214, 209, 215, - 79, 21, 22, 218, 168, 21, 22, 193, 103, 218, 168, 21, 22, 216, 104, 21, - 22, 250, 180, 218, 168, 21, 22, 205, 101, 218, 168, 21, 22, 214, 121, 21, - 22, 214, 249, 21, 22, 213, 219, 21, 22, 213, 186, 21, 22, 213, 43, 21, - 22, 213, 26, 21, 22, 192, 158, 213, 26, 21, 22, 180, 21, 22, 214, 250, - 21, 22, 212, 108, 21, 22, 193, 103, 212, 108, 21, 22, 212, 110, 21, 22, - 193, 103, 212, 110, 21, 22, 212, 109, 21, 22, 193, 103, 212, 109, 21, 22, - 214, 209, 212, 109, 21, 22, 215, 61, 21, 22, 98, 214, 70, 21, 22, 213, - 225, 21, 22, 219, 238, 21, 22, 220, 124, 21, 22, 219, 146, 21, 22, 219, - 128, 21, 22, 219, 43, 21, 22, 219, 8, 21, 22, 192, 158, 219, 8, 21, 22, - 173, 21, 22, 220, 125, 21, 22, 218, 189, 21, 22, 193, 103, 218, 189, 21, + 111, 36, 5, 232, 88, 36, 5, 233, 25, 36, 5, 233, 110, 36, 5, 233, 54, 36, + 5, 233, 61, 36, 5, 232, 177, 36, 5, 232, 64, 36, 5, 168, 36, 5, 208, 167, + 36, 5, 209, 187, 36, 5, 210, 222, 36, 5, 210, 51, 36, 5, 210, 65, 36, 5, + 209, 75, 36, 5, 208, 124, 36, 5, 206, 17, 36, 5, 215, 70, 36, 5, 232, 58, + 36, 33, 231, 155, 23, 18, 219, 200, 77, 36, 33, 18, 219, 200, 77, 36, 33, + 231, 155, 77, 36, 205, 55, 77, 36, 193, 22, 36, 232, 82, 201, 64, 36, + 242, 76, 36, 204, 26, 36, 242, 85, 36, 208, 230, 242, 85, 36, 208, 15, + 77, 36, 210, 130, 204, 11, 36, 17, 107, 36, 17, 109, 36, 17, 138, 36, 17, + 134, 36, 17, 150, 36, 17, 169, 36, 17, 175, 36, 17, 171, 36, 17, 178, 36, + 31, 199, 95, 36, 31, 197, 32, 36, 31, 198, 249, 36, 31, 232, 137, 36, 31, + 233, 17, 36, 31, 202, 121, 36, 31, 203, 242, 36, 31, 234, 155, 36, 31, + 213, 171, 36, 31, 228, 142, 36, 31, 199, 96, 189, 36, 5, 205, 60, 215, + 82, 36, 5, 215, 78, 36, 5, 215, 79, 36, 5, 215, 80, 36, 5, 205, 60, 247, + 212, 36, 5, 247, 209, 36, 5, 247, 210, 36, 5, 247, 211, 36, 5, 205, 60, + 232, 64, 36, 5, 232, 60, 36, 5, 232, 61, 36, 5, 232, 62, 36, 5, 205, 60, + 208, 124, 36, 5, 208, 120, 36, 5, 208, 121, 36, 5, 208, 122, 36, 198, 80, + 87, 192, 15, 36, 198, 80, 87, 237, 91, 36, 198, 80, 87, 206, 195, 36, + 198, 80, 87, 203, 41, 206, 195, 36, 198, 80, 87, 237, 20, 36, 198, 80, + 87, 221, 252, 36, 198, 80, 87, 243, 78, 36, 198, 80, 87, 229, 149, 36, + 198, 80, 87, 237, 90, 36, 198, 80, 87, 220, 197, 103, 1, 65, 103, 1, 71, + 103, 1, 68, 103, 1, 74, 103, 1, 66, 103, 1, 196, 12, 103, 1, 231, 242, + 103, 1, 155, 103, 1, 231, 167, 103, 1, 231, 55, 103, 1, 231, 5, 103, 1, + 230, 181, 103, 1, 230, 140, 103, 1, 140, 103, 1, 229, 247, 103, 1, 229, + 160, 103, 1, 229, 25, 103, 1, 228, 161, 103, 1, 228, 128, 103, 1, 173, + 103, 1, 219, 240, 103, 1, 219, 148, 103, 1, 219, 45, 103, 1, 218, 227, + 103, 1, 218, 194, 103, 1, 174, 103, 1, 216, 234, 103, 1, 216, 102, 103, + 1, 216, 14, 103, 1, 215, 157, 103, 1, 181, 103, 1, 229, 49, 103, 1, 214, + 239, 103, 1, 214, 123, 103, 1, 213, 221, 103, 1, 213, 45, 103, 1, 212, + 180, 103, 1, 212, 114, 103, 1, 208, 34, 103, 1, 208, 18, 103, 1, 208, 11, + 103, 1, 208, 1, 103, 1, 207, 246, 103, 1, 207, 244, 103, 1, 188, 103, 1, + 206, 9, 103, 1, 205, 69, 103, 1, 202, 223, 103, 1, 202, 47, 103, 1, 201, + 5, 103, 1, 200, 158, 103, 1, 238, 34, 103, 1, 190, 190, 103, 1, 237, 148, + 103, 1, 199, 145, 103, 1, 237, 46, 103, 1, 198, 193, 103, 1, 236, 176, + 103, 1, 235, 91, 103, 1, 235, 59, 103, 1, 236, 188, 103, 1, 198, 115, + 103, 1, 198, 114, 103, 1, 198, 103, 103, 1, 198, 102, 103, 1, 198, 101, + 103, 1, 198, 100, 103, 1, 197, 168, 103, 1, 197, 161, 103, 1, 197, 146, + 103, 1, 197, 144, 103, 1, 197, 140, 103, 1, 197, 139, 103, 1, 193, 190, + 103, 1, 193, 125, 103, 1, 193, 86, 103, 1, 193, 48, 103, 1, 193, 0, 103, + 1, 192, 243, 103, 1, 170, 103, 1, 192, 80, 103, 1, 192, 33, 103, 1, 192, + 12, 103, 1, 191, 225, 103, 1, 191, 184, 103, 1, 215, 89, 103, 2, 1, 192, + 80, 103, 2, 1, 192, 33, 103, 2, 1, 192, 12, 103, 2, 1, 191, 225, 103, 2, + 1, 191, 184, 103, 2, 1, 215, 89, 21, 22, 228, 90, 21, 22, 71, 21, 22, + 252, 172, 21, 22, 68, 21, 22, 223, 201, 21, 22, 74, 21, 22, 211, 89, 21, + 22, 192, 158, 211, 89, 21, 22, 98, 234, 190, 21, 22, 98, 68, 21, 22, 65, + 21, 22, 252, 208, 21, 22, 193, 125, 21, 22, 193, 103, 193, 125, 21, 22, + 193, 86, 21, 22, 193, 103, 193, 86, 21, 22, 193, 70, 21, 22, 193, 103, + 193, 70, 21, 22, 193, 48, 21, 22, 193, 103, 193, 48, 21, 22, 193, 29, 21, + 22, 193, 103, 193, 29, 21, 22, 214, 211, 193, 29, 21, 22, 193, 190, 21, + 22, 193, 103, 193, 190, 21, 22, 193, 181, 21, 22, 193, 103, 193, 181, 21, + 22, 214, 211, 193, 181, 21, 22, 251, 238, 21, 22, 192, 158, 193, 224, 21, + 22, 231, 13, 201, 64, 21, 22, 53, 252, 48, 21, 22, 53, 230, 212, 21, 22, + 53, 248, 79, 132, 206, 189, 21, 22, 53, 198, 54, 132, 206, 189, 21, 22, + 53, 50, 132, 206, 189, 21, 22, 53, 206, 189, 21, 22, 53, 55, 252, 48, 21, + 22, 53, 55, 203, 41, 81, 201, 16, 21, 22, 53, 82, 236, 142, 21, 22, 53, + 203, 41, 228, 243, 106, 21, 22, 53, 209, 83, 21, 22, 53, 144, 199, 228, + 21, 22, 234, 105, 21, 22, 223, 164, 21, 22, 211, 106, 21, 22, 251, 134, + 21, 22, 210, 65, 21, 22, 210, 220, 21, 22, 209, 187, 21, 22, 209, 147, + 21, 22, 209, 75, 21, 22, 209, 39, 21, 22, 192, 158, 209, 39, 21, 22, 98, + 229, 217, 21, 22, 98, 229, 160, 21, 22, 168, 21, 22, 210, 222, 21, 22, + 208, 122, 21, 22, 193, 103, 208, 122, 21, 22, 208, 120, 21, 22, 193, 103, + 208, 120, 21, 22, 208, 119, 21, 22, 193, 103, 208, 119, 21, 22, 208, 117, + 21, 22, 193, 103, 208, 117, 21, 22, 208, 116, 21, 22, 193, 103, 208, 116, + 21, 22, 208, 124, 21, 22, 193, 103, 208, 124, 21, 22, 208, 123, 21, 22, + 193, 103, 208, 123, 21, 22, 192, 158, 208, 123, 21, 22, 210, 238, 21, 22, + 193, 103, 210, 238, 21, 22, 98, 230, 118, 21, 22, 199, 145, 21, 22, 199, + 242, 21, 22, 198, 193, 21, 22, 198, 170, 21, 22, 159, 21, 22, 198, 59, + 21, 22, 192, 158, 198, 59, 21, 22, 98, 237, 133, 21, 22, 98, 237, 46, 21, + 22, 190, 190, 21, 22, 199, 245, 21, 22, 197, 41, 21, 22, 193, 103, 197, + 41, 21, 22, 197, 19, 21, 22, 193, 103, 197, 19, 21, 22, 197, 18, 21, 22, + 193, 103, 197, 18, 21, 22, 109, 21, 22, 193, 103, 109, 21, 22, 197, 9, + 21, 22, 193, 103, 197, 9, 21, 22, 197, 43, 21, 22, 193, 103, 197, 43, 21, + 22, 197, 42, 21, 22, 193, 103, 197, 42, 21, 22, 214, 211, 197, 42, 21, + 22, 200, 43, 21, 22, 197, 127, 21, 22, 197, 111, 21, 22, 197, 109, 21, + 22, 197, 132, 21, 22, 222, 24, 21, 22, 222, 123, 21, 22, 221, 168, 21, + 22, 221, 147, 21, 22, 221, 69, 21, 22, 221, 43, 21, 22, 192, 158, 221, + 43, 21, 22, 155, 21, 22, 222, 129, 21, 22, 220, 176, 21, 22, 193, 103, + 220, 176, 21, 22, 220, 174, 21, 22, 193, 103, 220, 174, 21, 22, 220, 173, + 21, 22, 193, 103, 220, 173, 21, 22, 220, 171, 21, 22, 193, 103, 220, 171, + 21, 22, 220, 170, 21, 22, 193, 103, 220, 170, 21, 22, 220, 181, 21, 22, + 193, 103, 220, 181, 21, 22, 220, 180, 21, 22, 193, 103, 220, 180, 21, 22, + 214, 211, 220, 180, 21, 22, 222, 154, 21, 22, 220, 182, 21, 22, 202, 2, + 222, 8, 21, 22, 202, 2, 221, 148, 21, 22, 202, 2, 221, 58, 21, 22, 202, + 2, 222, 106, 21, 22, 247, 44, 21, 22, 247, 160, 21, 22, 243, 31, 21, 22, + 243, 21, 21, 22, 242, 101, 21, 22, 239, 20, 21, 22, 192, 158, 239, 20, + 21, 22, 247, 162, 21, 22, 247, 161, 21, 22, 238, 151, 21, 22, 193, 103, + 238, 151, 21, 22, 238, 149, 21, 22, 193, 103, 238, 149, 21, 22, 238, 148, + 21, 22, 193, 103, 238, 148, 21, 22, 238, 147, 21, 22, 193, 103, 238, 147, + 21, 22, 238, 146, 21, 22, 193, 103, 238, 146, 21, 22, 238, 153, 21, 22, + 193, 103, 238, 153, 21, 22, 238, 152, 21, 22, 193, 103, 238, 152, 21, 22, + 214, 211, 238, 152, 21, 22, 247, 195, 21, 22, 205, 102, 199, 51, 21, 22, + 216, 234, 21, 22, 217, 152, 21, 22, 216, 102, 21, 22, 216, 63, 21, 22, + 216, 14, 21, 22, 215, 213, 21, 22, 192, 158, 215, 213, 21, 22, 174, 21, + 22, 217, 153, 21, 22, 215, 80, 21, 22, 193, 103, 215, 80, 21, 22, 215, + 78, 21, 22, 193, 103, 215, 78, 21, 22, 215, 77, 21, 22, 193, 103, 215, + 77, 21, 22, 215, 76, 21, 22, 193, 103, 215, 76, 21, 22, 215, 75, 21, 22, + 193, 103, 215, 75, 21, 22, 215, 82, 21, 22, 193, 103, 215, 82, 21, 22, + 215, 81, 21, 22, 193, 103, 215, 81, 21, 22, 214, 211, 215, 81, 21, 22, + 218, 170, 21, 22, 193, 103, 218, 170, 21, 22, 216, 106, 21, 22, 250, 182, + 218, 170, 21, 22, 205, 102, 218, 170, 21, 22, 214, 123, 21, 22, 214, 251, + 21, 22, 213, 221, 21, 22, 213, 188, 21, 22, 213, 45, 21, 22, 213, 28, 21, + 22, 192, 158, 213, 28, 21, 22, 181, 21, 22, 214, 252, 21, 22, 212, 110, + 21, 22, 193, 103, 212, 110, 21, 22, 212, 112, 21, 22, 193, 103, 212, 112, + 21, 22, 212, 111, 21, 22, 193, 103, 212, 111, 21, 22, 214, 211, 212, 111, + 21, 22, 215, 63, 21, 22, 98, 214, 72, 21, 22, 213, 227, 21, 22, 219, 240, + 21, 22, 220, 126, 21, 22, 219, 148, 21, 22, 219, 130, 21, 22, 219, 45, + 21, 22, 219, 10, 21, 22, 192, 158, 219, 10, 21, 22, 173, 21, 22, 220, + 127, 21, 22, 218, 191, 21, 22, 193, 103, 218, 191, 21, 22, 218, 190, 21, + 22, 193, 103, 218, 190, 21, 22, 218, 189, 21, 22, 193, 103, 218, 189, 21, 22, 218, 188, 21, 22, 193, 103, 218, 188, 21, 22, 218, 187, 21, 22, 193, - 103, 218, 187, 21, 22, 218, 186, 21, 22, 193, 103, 218, 186, 21, 22, 218, - 185, 21, 22, 193, 103, 218, 185, 21, 22, 218, 191, 21, 22, 193, 103, 218, - 191, 21, 22, 218, 190, 21, 22, 193, 103, 218, 190, 21, 22, 172, 21, 22, - 193, 103, 172, 21, 22, 216, 217, 172, 21, 22, 205, 68, 21, 22, 205, 195, - 21, 22, 202, 222, 21, 22, 202, 193, 21, 22, 202, 46, 21, 22, 202, 16, 21, - 22, 192, 158, 202, 16, 21, 22, 188, 21, 22, 205, 197, 21, 22, 200, 145, - 21, 22, 193, 103, 200, 145, 21, 22, 200, 139, 21, 22, 193, 103, 200, 139, - 21, 22, 200, 138, 21, 22, 193, 103, 200, 138, 21, 22, 200, 133, 21, 22, - 193, 103, 200, 133, 21, 22, 200, 132, 21, 22, 193, 103, 200, 132, 21, 22, - 200, 150, 21, 22, 193, 103, 200, 150, 21, 22, 200, 149, 21, 22, 193, 103, - 200, 149, 21, 22, 214, 209, 200, 149, 21, 22, 206, 8, 21, 22, 250, 180, - 206, 8, 21, 22, 200, 151, 21, 22, 248, 136, 206, 8, 21, 22, 215, 203, - 202, 114, 21, 22, 214, 209, 202, 101, 21, 22, 214, 209, 206, 6, 21, 22, - 214, 209, 201, 192, 21, 22, 214, 209, 201, 7, 21, 22, 214, 209, 202, 100, - 21, 22, 214, 209, 205, 71, 21, 22, 203, 113, 21, 22, 203, 81, 21, 22, - 203, 76, 21, 22, 203, 56, 21, 22, 203, 48, 21, 22, 203, 165, 21, 22, 203, - 160, 21, 22, 202, 237, 21, 22, 193, 103, 202, 237, 21, 22, 202, 236, 21, - 22, 193, 103, 202, 236, 21, 22, 202, 235, 21, 22, 193, 103, 202, 235, 21, - 22, 202, 234, 21, 22, 193, 103, 202, 234, 21, 22, 202, 233, 21, 22, 193, - 103, 202, 233, 21, 22, 202, 240, 21, 22, 193, 103, 202, 240, 21, 22, 202, - 239, 21, 22, 193, 103, 202, 239, 21, 22, 203, 167, 21, 22, 192, 80, 21, - 22, 192, 138, 21, 22, 192, 33, 21, 22, 192, 23, 21, 22, 192, 12, 21, 22, - 191, 246, 21, 22, 192, 158, 191, 246, 21, 22, 170, 21, 22, 192, 140, 21, - 22, 191, 181, 21, 22, 193, 103, 191, 181, 21, 22, 191, 180, 21, 22, 193, - 103, 191, 180, 21, 22, 191, 179, 21, 22, 193, 103, 191, 179, 21, 22, 191, - 178, 21, 22, 193, 103, 191, 178, 21, 22, 191, 177, 21, 22, 193, 103, 191, - 177, 21, 22, 191, 183, 21, 22, 193, 103, 191, 183, 21, 22, 191, 182, 21, - 22, 193, 103, 191, 182, 21, 22, 214, 209, 191, 182, 21, 22, 192, 159, 21, - 22, 248, 186, 192, 159, 21, 22, 193, 103, 192, 159, 21, 22, 205, 101, - 192, 33, 21, 22, 207, 113, 21, 22, 207, 221, 207, 113, 21, 22, 193, 103, - 219, 238, 21, 22, 207, 177, 21, 22, 207, 1, 21, 22, 206, 195, 21, 22, - 206, 162, 21, 22, 206, 134, 21, 22, 193, 103, 219, 43, 21, 22, 165, 21, - 22, 207, 178, 21, 22, 193, 103, 173, 21, 22, 206, 25, 21, 22, 193, 103, - 206, 25, 21, 22, 146, 21, 22, 193, 103, 146, 21, 22, 216, 217, 146, 21, - 22, 233, 59, 21, 22, 233, 106, 21, 22, 233, 23, 21, 22, 233, 8, 21, 22, - 232, 175, 21, 22, 232, 162, 21, 22, 233, 109, 21, 22, 233, 108, 21, 22, - 232, 61, 21, 22, 193, 103, 232, 61, 21, 22, 233, 175, 21, 22, 199, 33, - 21, 22, 215, 59, 199, 33, 21, 22, 199, 11, 21, 22, 215, 59, 199, 11, 21, - 22, 199, 5, 21, 22, 215, 59, 199, 5, 21, 22, 198, 241, 21, 22, 198, 235, - 21, 22, 199, 49, 21, 22, 199, 48, 21, 22, 198, 203, 21, 22, 193, 103, - 198, 203, 21, 22, 199, 51, 21, 22, 197, 118, 21, 22, 197, 116, 21, 22, - 197, 115, 21, 22, 197, 120, 21, 22, 197, 121, 21, 22, 197, 2, 21, 22, - 197, 1, 21, 22, 197, 0, 21, 22, 197, 4, 21, 22, 212, 129, 229, 245, 21, - 22, 212, 129, 229, 158, 21, 22, 212, 129, 229, 130, 21, 22, 212, 129, - 229, 23, 21, 22, 212, 129, 228, 252, 21, 22, 212, 129, 140, 21, 22, 212, - 129, 230, 91, 21, 22, 212, 129, 230, 116, 21, 22, 212, 128, 230, 116, 21, - 22, 229, 113, 21, 22, 208, 92, 21, 22, 208, 57, 21, 22, 208, 51, 21, 22, - 208, 45, 21, 22, 208, 40, 21, 22, 208, 96, 21, 22, 208, 95, 21, 22, 208, - 104, 21, 22, 198, 111, 21, 22, 198, 109, 21, 22, 198, 108, 21, 22, 198, - 112, 21, 22, 193, 103, 207, 113, 21, 22, 193, 103, 207, 1, 21, 22, 193, - 103, 206, 162, 21, 22, 193, 103, 165, 21, 22, 214, 66, 21, 22, 214, 16, - 21, 22, 214, 12, 21, 22, 213, 249, 21, 22, 213, 244, 21, 22, 214, 68, 21, - 22, 214, 67, 21, 22, 214, 70, 21, 22, 213, 72, 21, 22, 205, 101, 203, - 113, 21, 22, 205, 101, 203, 81, 21, 22, 205, 101, 203, 56, 21, 22, 205, - 101, 203, 165, 21, 22, 193, 27, 199, 33, 21, 22, 193, 27, 199, 11, 21, - 22, 193, 27, 198, 241, 21, 22, 193, 27, 199, 49, 21, 22, 193, 27, 199, - 51, 21, 22, 219, 153, 21, 22, 219, 152, 21, 22, 219, 151, 21, 22, 219, - 150, 21, 22, 219, 159, 21, 22, 219, 158, 21, 22, 219, 160, 21, 22, 199, - 50, 199, 33, 21, 22, 199, 50, 199, 11, 21, 22, 199, 50, 199, 5, 21, 22, - 199, 50, 198, 241, 21, 22, 199, 50, 198, 235, 21, 22, 199, 50, 199, 49, - 21, 22, 199, 50, 199, 48, 21, 22, 199, 50, 199, 51, 21, 22, 251, 220, - 250, 120, 21, 22, 248, 136, 71, 21, 22, 248, 136, 68, 21, 22, 248, 136, - 74, 21, 22, 248, 136, 65, 21, 22, 248, 136, 193, 125, 21, 22, 248, 136, - 193, 86, 21, 22, 248, 136, 193, 48, 21, 22, 248, 136, 193, 190, 21, 22, - 248, 136, 214, 121, 21, 22, 248, 136, 213, 219, 21, 22, 248, 136, 213, - 43, 21, 22, 248, 136, 180, 21, 22, 248, 136, 222, 22, 21, 22, 248, 136, - 221, 166, 21, 22, 248, 136, 221, 67, 21, 22, 248, 136, 155, 21, 22, 205, - 101, 229, 245, 21, 22, 205, 101, 229, 158, 21, 22, 205, 101, 229, 23, 21, - 22, 205, 101, 140, 21, 22, 98, 231, 59, 21, 22, 98, 231, 63, 21, 22, 98, - 231, 77, 21, 22, 98, 231, 76, 21, 22, 98, 231, 65, 21, 22, 98, 231, 91, - 21, 22, 98, 206, 68, 21, 22, 98, 206, 162, 21, 22, 98, 207, 113, 21, 22, - 98, 207, 84, 21, 22, 98, 207, 1, 21, 22, 98, 165, 21, 22, 98, 193, 0, 21, - 22, 98, 193, 48, 21, 22, 98, 193, 125, 21, 22, 98, 193, 114, 21, 22, 98, - 193, 86, 21, 22, 98, 193, 190, 21, 22, 98, 228, 118, 21, 22, 98, 228, - 119, 21, 22, 98, 228, 122, 21, 22, 98, 228, 121, 21, 22, 98, 228, 120, - 21, 22, 98, 228, 125, 21, 22, 98, 198, 213, 21, 22, 98, 198, 241, 21, 22, - 98, 199, 33, 21, 22, 98, 199, 31, 21, 22, 98, 199, 11, 21, 22, 98, 199, - 49, 21, 22, 98, 197, 99, 21, 22, 98, 197, 109, 21, 22, 98, 197, 127, 21, - 22, 98, 197, 126, 21, 22, 98, 197, 111, 21, 22, 98, 197, 132, 21, 22, 98, - 208, 165, 21, 22, 98, 209, 73, 21, 22, 98, 210, 63, 21, 22, 98, 210, 49, - 21, 22, 98, 209, 185, 21, 22, 98, 168, 21, 22, 98, 210, 236, 21, 22, 98, - 230, 179, 21, 22, 98, 231, 3, 21, 22, 98, 231, 165, 21, 22, 98, 231, 157, - 21, 22, 98, 231, 53, 21, 22, 98, 231, 240, 21, 22, 98, 221, 175, 21, 22, - 98, 221, 183, 21, 22, 98, 221, 197, 21, 22, 98, 221, 196, 21, 22, 98, - 221, 190, 21, 22, 98, 221, 215, 21, 22, 98, 221, 96, 21, 22, 98, 221, 97, - 21, 22, 98, 221, 100, 21, 22, 98, 221, 99, 21, 22, 98, 221, 98, 21, 22, - 98, 221, 101, 21, 22, 98, 221, 102, 21, 22, 98, 212, 178, 21, 22, 98, - 213, 43, 21, 22, 98, 214, 121, 21, 22, 98, 214, 110, 21, 22, 98, 213, - 219, 21, 22, 98, 180, 21, 22, 98, 215, 155, 21, 22, 98, 216, 12, 21, 22, - 98, 216, 232, 21, 22, 98, 216, 211, 21, 22, 98, 216, 100, 21, 22, 98, - 174, 21, 22, 98, 191, 225, 21, 22, 98, 192, 12, 21, 22, 98, 192, 80, 21, - 22, 98, 192, 77, 21, 22, 98, 192, 33, 21, 22, 98, 170, 21, 22, 98, 222, - 182, 21, 22, 205, 101, 222, 182, 21, 22, 98, 222, 201, 21, 22, 98, 223, - 10, 21, 22, 98, 223, 8, 21, 22, 98, 222, 244, 21, 22, 205, 101, 222, 244, - 21, 22, 98, 223, 32, 21, 22, 98, 222, 215, 21, 22, 98, 222, 219, 21, 22, - 98, 222, 229, 21, 22, 98, 222, 228, 21, 22, 98, 222, 227, 21, 22, 98, - 222, 230, 21, 22, 98, 218, 225, 21, 22, 98, 219, 43, 21, 22, 98, 219, - 238, 21, 22, 98, 219, 228, 21, 22, 98, 219, 146, 21, 22, 98, 173, 21, 22, - 98, 236, 179, 21, 22, 98, 236, 180, 21, 22, 98, 236, 185, 21, 22, 98, - 236, 184, 21, 22, 98, 236, 181, 21, 22, 98, 236, 186, 21, 22, 98, 219, - 149, 21, 22, 98, 219, 151, 21, 22, 98, 219, 155, 21, 22, 98, 219, 154, - 21, 22, 98, 219, 153, 21, 22, 98, 219, 159, 21, 22, 98, 198, 106, 21, 22, - 98, 198, 108, 21, 22, 98, 198, 111, 21, 22, 98, 198, 110, 21, 22, 98, - 198, 109, 21, 22, 98, 198, 112, 21, 22, 98, 198, 101, 21, 22, 98, 198, - 102, 21, 22, 98, 198, 114, 21, 22, 98, 198, 113, 21, 22, 98, 198, 103, - 21, 22, 98, 198, 115, 21, 22, 98, 190, 251, 21, 22, 98, 191, 7, 21, 22, - 98, 191, 87, 21, 22, 98, 191, 84, 21, 22, 98, 191, 30, 21, 22, 98, 191, - 123, 21, 22, 98, 191, 166, 21, 22, 98, 89, 191, 166, 21, 22, 98, 235, 22, - 21, 22, 98, 235, 23, 21, 22, 98, 235, 32, 21, 22, 98, 235, 31, 21, 22, - 98, 235, 26, 21, 22, 98, 235, 35, 21, 22, 98, 201, 4, 21, 22, 98, 202, - 46, 21, 22, 98, 205, 68, 21, 22, 98, 205, 50, 21, 22, 98, 202, 222, 21, - 22, 98, 188, 21, 22, 98, 203, 5, 21, 22, 98, 203, 56, 21, 22, 98, 203, - 113, 21, 22, 98, 203, 111, 21, 22, 98, 203, 81, 21, 22, 98, 203, 165, 21, - 22, 98, 203, 167, 21, 22, 98, 197, 140, 21, 22, 98, 197, 144, 21, 22, 98, - 197, 161, 21, 22, 98, 197, 160, 21, 22, 98, 197, 146, 21, 22, 98, 197, - 168, 21, 22, 98, 243, 48, 21, 22, 98, 243, 68, 21, 22, 98, 243, 127, 21, - 22, 98, 243, 123, 21, 22, 98, 243, 95, 21, 22, 98, 247, 1, 21, 22, 98, - 197, 102, 21, 22, 98, 197, 103, 21, 22, 98, 197, 106, 21, 22, 98, 197, - 105, 21, 22, 98, 197, 104, 21, 22, 98, 197, 107, 21, 22, 243, 96, 56, 21, - 22, 232, 80, 201, 63, 21, 22, 208, 88, 21, 22, 214, 64, 21, 22, 213, 69, - 21, 22, 213, 68, 21, 22, 213, 67, 21, 22, 213, 66, 21, 22, 213, 71, 21, - 22, 213, 70, 21, 22, 193, 27, 198, 201, 21, 22, 193, 27, 198, 200, 21, - 22, 193, 27, 198, 199, 21, 22, 193, 27, 198, 198, 21, 22, 193, 27, 198, - 197, 21, 22, 193, 27, 198, 204, 21, 22, 193, 27, 198, 203, 21, 22, 193, - 27, 53, 199, 51, 21, 22, 248, 136, 193, 224, 211, 140, 201, 248, 77, 211, - 140, 1, 248, 239, 211, 140, 1, 218, 211, 211, 140, 1, 233, 56, 211, 140, - 1, 205, 179, 211, 140, 1, 213, 166, 211, 140, 1, 196, 165, 211, 140, 1, - 238, 5, 211, 140, 1, 198, 139, 211, 140, 1, 242, 86, 211, 140, 1, 247, - 29, 211, 140, 1, 215, 137, 211, 140, 1, 230, 234, 211, 140, 1, 214, 54, - 211, 140, 1, 201, 54, 211, 140, 1, 206, 55, 211, 140, 1, 251, 232, 211, - 140, 1, 211, 91, 211, 140, 1, 196, 62, 211, 140, 1, 234, 215, 211, 140, - 1, 223, 87, 211, 140, 1, 234, 216, 211, 140, 1, 211, 56, 211, 140, 1, - 196, 136, 211, 140, 1, 223, 205, 211, 140, 1, 234, 213, 211, 140, 1, 210, - 38, 211, 140, 233, 55, 77, 211, 140, 207, 18, 233, 55, 77, 206, 44, 1, - 233, 45, 233, 36, 233, 60, 233, 175, 206, 44, 1, 196, 12, 206, 44, 1, - 196, 47, 196, 63, 66, 206, 44, 1, 191, 228, 206, 44, 1, 192, 159, 206, - 44, 1, 193, 224, 206, 44, 1, 198, 206, 198, 205, 198, 233, 206, 44, 1, - 233, 248, 206, 44, 1, 251, 90, 65, 206, 44, 1, 211, 37, 74, 206, 44, 1, - 252, 64, 65, 206, 44, 1, 252, 9, 206, 44, 1, 219, 15, 74, 206, 44, 1, - 203, 33, 74, 206, 44, 1, 74, 206, 44, 1, 211, 151, 206, 44, 1, 211, 104, - 206, 44, 1, 207, 154, 207, 169, 207, 69, 146, 206, 44, 1, 222, 39, 206, - 44, 1, 247, 25, 206, 44, 1, 222, 40, 222, 152, 206, 44, 1, 232, 51, 206, - 44, 1, 234, 88, 206, 44, 1, 231, 160, 230, 122, 232, 51, 206, 44, 1, 231, - 200, 206, 44, 1, 192, 248, 192, 239, 193, 224, 206, 44, 1, 230, 82, 230, - 116, 206, 44, 1, 230, 86, 230, 116, 206, 44, 1, 219, 17, 230, 116, 206, - 44, 1, 203, 36, 230, 116, 206, 44, 1, 214, 203, 212, 91, 214, 204, 215, - 61, 206, 44, 1, 203, 34, 215, 61, 206, 44, 1, 235, 135, 206, 44, 1, 223, - 65, 223, 69, 223, 55, 68, 206, 44, 1, 71, 206, 44, 1, 222, 255, 223, 35, - 206, 44, 1, 231, 141, 206, 44, 1, 219, 18, 252, 25, 206, 44, 1, 203, 38, - 65, 206, 44, 1, 223, 47, 234, 61, 206, 44, 1, 209, 247, 210, 18, 210, - 236, 206, 44, 1, 251, 185, 234, 59, 206, 44, 1, 201, 254, 206, 8, 206, - 44, 1, 202, 198, 219, 14, 206, 8, 206, 44, 1, 203, 32, 206, 8, 206, 44, - 1, 247, 193, 206, 44, 1, 191, 166, 206, 44, 1, 198, 120, 198, 132, 196, - 242, 200, 43, 206, 44, 1, 203, 31, 200, 43, 206, 44, 1, 238, 127, 206, - 44, 1, 248, 217, 248, 220, 248, 142, 250, 120, 206, 44, 1, 203, 37, 250, - 120, 206, 44, 1, 235, 134, 206, 44, 1, 211, 70, 206, 44, 1, 234, 167, - 234, 174, 71, 206, 44, 1, 217, 79, 217, 91, 218, 168, 206, 44, 1, 219, - 16, 218, 168, 206, 44, 1, 203, 35, 218, 168, 206, 44, 1, 219, 253, 220, - 101, 219, 26, 172, 206, 44, 1, 235, 136, 206, 44, 1, 223, 135, 206, 44, - 1, 223, 136, 206, 44, 1, 238, 19, 238, 25, 238, 127, 206, 44, 1, 211, 28, - 233, 247, 74, 206, 44, 1, 234, 211, 206, 44, 1, 223, 85, 206, 44, 1, 238, - 148, 206, 44, 1, 247, 143, 206, 44, 1, 247, 41, 206, 44, 1, 201, 108, - 206, 44, 1, 219, 13, 206, 44, 1, 203, 30, 206, 44, 1, 228, 25, 206, 44, - 1, 208, 104, 206, 44, 1, 192, 235, 206, 44, 202, 170, 208, 151, 206, 44, - 215, 129, 208, 151, 206, 44, 238, 218, 208, 151, 206, 44, 250, 252, 113, - 206, 44, 197, 45, 113, 206, 44, 248, 237, 113, 206, 44, 1, 222, 152, 206, - 44, 1, 203, 167, 206, 44, 1, 211, 87, 206, 44, 1, 232, 110, 247, 81, 211, - 36, 206, 44, 1, 232, 110, 247, 81, 223, 68, 206, 44, 1, 232, 110, 247, - 81, 234, 173, 206, 44, 1, 232, 110, 247, 81, 252, 63, 206, 44, 1, 232, - 110, 247, 81, 252, 9, 199, 222, 1, 65, 199, 222, 1, 68, 199, 222, 1, 66, - 199, 222, 1, 155, 199, 222, 1, 231, 240, 199, 222, 1, 214, 68, 199, 222, - 1, 190, 190, 199, 222, 1, 238, 32, 199, 222, 1, 180, 199, 222, 1, 168, - 199, 222, 1, 249, 153, 199, 222, 1, 174, 199, 222, 1, 170, 199, 222, 1, - 165, 199, 222, 1, 173, 199, 222, 1, 193, 190, 199, 222, 1, 188, 199, 222, - 1, 140, 199, 222, 18, 3, 68, 199, 222, 18, 3, 66, 199, 222, 3, 195, 40, - 199, 222, 3, 210, 169, 199, 222, 1, 251, 14, 165, 230, 23, 1, 65, 230, - 23, 1, 68, 230, 23, 1, 66, 230, 23, 1, 155, 230, 23, 1, 231, 240, 230, - 23, 1, 214, 68, 230, 23, 1, 190, 190, 230, 23, 1, 238, 32, 230, 23, 1, - 180, 230, 23, 1, 168, 230, 23, 1, 249, 153, 230, 23, 1, 174, 230, 23, 1, - 170, 230, 23, 1, 165, 230, 23, 1, 173, 230, 23, 1, 193, 190, 230, 23, 1, - 188, 230, 23, 1, 140, 230, 23, 18, 3, 68, 230, 23, 18, 3, 66, 230, 23, 3, - 210, 169, 209, 204, 202, 170, 208, 151, 209, 204, 55, 208, 151, 248, 0, - 1, 65, 248, 0, 1, 68, 248, 0, 1, 66, 248, 0, 1, 155, 248, 0, 1, 231, 240, - 248, 0, 1, 214, 68, 248, 0, 1, 190, 190, 248, 0, 1, 238, 32, 248, 0, 1, - 180, 248, 0, 1, 168, 248, 0, 1, 249, 153, 248, 0, 1, 174, 248, 0, 1, 170, - 248, 0, 1, 165, 248, 0, 1, 173, 248, 0, 1, 193, 190, 248, 0, 1, 188, 248, - 0, 1, 140, 248, 0, 18, 3, 68, 248, 0, 18, 3, 66, 199, 221, 1, 65, 199, - 221, 1, 68, 199, 221, 1, 66, 199, 221, 1, 155, 199, 221, 1, 231, 240, - 199, 221, 1, 214, 68, 199, 221, 1, 190, 190, 199, 221, 1, 238, 32, 199, - 221, 1, 180, 199, 221, 1, 168, 199, 221, 1, 249, 153, 199, 221, 1, 174, - 199, 221, 1, 170, 199, 221, 1, 173, 199, 221, 1, 193, 190, 199, 221, 1, - 188, 199, 221, 18, 3, 68, 199, 221, 18, 3, 66, 95, 1, 155, 95, 1, 221, - 215, 95, 1, 221, 67, 95, 1, 221, 183, 95, 1, 213, 249, 95, 1, 247, 160, - 95, 1, 247, 1, 95, 1, 242, 99, 95, 1, 243, 68, 95, 1, 212, 65, 95, 1, - 238, 32, 95, 1, 197, 120, 95, 1, 236, 174, 95, 1, 197, 115, 95, 1, 213, - 49, 95, 1, 190, 190, 95, 1, 199, 49, 95, 1, 159, 95, 1, 198, 241, 95, 1, - 213, 43, 95, 1, 249, 153, 95, 1, 209, 228, 95, 1, 209, 73, 95, 1, 209, - 199, 95, 1, 216, 12, 95, 1, 192, 12, 95, 1, 206, 162, 95, 1, 219, 43, 95, - 1, 195, 24, 95, 1, 203, 165, 95, 1, 201, 134, 95, 1, 188, 95, 1, 140, 95, - 1, 173, 95, 1, 208, 96, 95, 223, 149, 18, 208, 82, 95, 223, 149, 18, 208, - 95, 95, 223, 149, 18, 208, 57, 95, 223, 149, 18, 208, 51, 95, 223, 149, - 18, 208, 33, 95, 223, 149, 18, 208, 0, 95, 223, 149, 18, 207, 244, 95, - 223, 149, 18, 207, 243, 95, 223, 149, 18, 206, 17, 95, 223, 149, 18, 206, - 10, 95, 223, 149, 18, 218, 183, 95, 223, 149, 18, 218, 171, 95, 223, 149, - 18, 208, 75, 95, 223, 149, 18, 208, 88, 95, 223, 149, 18, 208, 41, 196, - 255, 107, 95, 223, 149, 18, 208, 41, 196, 255, 109, 95, 223, 149, 18, - 208, 77, 95, 18, 223, 133, 251, 37, 95, 18, 223, 133, 252, 206, 95, 18, - 3, 252, 206, 95, 18, 3, 68, 95, 18, 3, 223, 199, 95, 18, 3, 192, 159, 95, - 18, 3, 191, 176, 95, 18, 3, 66, 95, 18, 3, 196, 30, 95, 18, 3, 196, 168, - 95, 18, 3, 211, 151, 95, 18, 3, 170, 95, 18, 3, 223, 226, 95, 18, 3, 71, - 95, 18, 3, 252, 25, 95, 18, 3, 251, 236, 95, 18, 3, 211, 87, 95, 18, 3, - 250, 163, 95, 3, 213, 184, 95, 3, 207, 106, 95, 3, 191, 187, 95, 3, 215, - 91, 95, 3, 197, 229, 95, 3, 249, 90, 95, 3, 206, 151, 95, 3, 198, 90, 95, - 3, 222, 95, 95, 3, 251, 238, 95, 3, 205, 143, 205, 135, 95, 3, 195, 37, - 95, 3, 242, 90, 95, 3, 249, 60, 95, 3, 221, 205, 95, 3, 249, 85, 95, 3, - 247, 131, 209, 146, 220, 186, 95, 3, 219, 205, 198, 59, 95, 3, 248, 205, - 95, 3, 209, 201, 215, 148, 95, 3, 221, 39, 95, 238, 170, 16, 206, 241, - 95, 3, 250, 144, 95, 3, 250, 166, 95, 17, 191, 77, 95, 17, 107, 95, 17, - 109, 95, 17, 138, 95, 17, 134, 95, 17, 149, 95, 17, 169, 95, 17, 175, 95, - 17, 171, 95, 17, 178, 95, 16, 219, 205, 250, 168, 202, 19, 95, 16, 219, - 205, 250, 168, 215, 112, 95, 16, 219, 205, 250, 168, 209, 145, 95, 16, - 219, 205, 250, 168, 248, 240, 95, 16, 219, 205, 250, 168, 247, 236, 95, - 16, 219, 205, 250, 168, 208, 245, 95, 16, 219, 205, 250, 168, 208, 239, - 95, 16, 219, 205, 250, 168, 208, 237, 95, 16, 219, 205, 250, 168, 208, - 243, 95, 16, 219, 205, 250, 168, 208, 241, 104, 248, 158, 104, 234, 120, - 104, 242, 74, 104, 232, 80, 201, 63, 104, 242, 83, 104, 232, 128, 236, - 138, 104, 198, 88, 202, 32, 228, 88, 104, 202, 214, 5, 248, 73, 217, 51, - 104, 217, 87, 242, 74, 104, 217, 87, 232, 80, 201, 63, 104, 213, 164, - 104, 232, 109, 67, 205, 35, 107, 104, 232, 109, 67, 205, 35, 109, 104, - 232, 109, 67, 205, 35, 138, 104, 18, 204, 10, 104, 232, 109, 67, 205, 35, - 134, 104, 17, 191, 77, 104, 17, 107, 104, 17, 109, 104, 17, 138, 104, 17, - 134, 104, 17, 149, 104, 17, 169, 104, 17, 175, 104, 17, 171, 104, 17, - 178, 104, 1, 65, 104, 1, 71, 104, 1, 68, 104, 1, 74, 104, 1, 66, 104, 1, - 211, 151, 104, 1, 196, 152, 104, 1, 234, 188, 104, 1, 180, 104, 1, 251, - 122, 104, 1, 249, 153, 104, 1, 168, 104, 1, 208, 96, 104, 1, 231, 240, - 104, 1, 174, 104, 1, 173, 104, 1, 188, 104, 1, 203, 165, 104, 1, 190, - 190, 104, 1, 238, 32, 104, 1, 247, 1, 104, 1, 223, 32, 104, 1, 170, 104, - 1, 165, 104, 1, 193, 190, 104, 1, 233, 109, 104, 1, 155, 104, 1, 221, - 215, 104, 1, 197, 168, 104, 1, 191, 123, 104, 1, 230, 91, 104, 1, 190, - 255, 104, 1, 219, 159, 104, 1, 191, 57, 104, 1, 243, 95, 104, 1, 198, 88, - 179, 18, 56, 104, 1, 198, 88, 71, 104, 1, 198, 88, 68, 104, 1, 198, 88, - 74, 104, 1, 198, 88, 66, 104, 1, 198, 88, 211, 151, 104, 1, 198, 88, 196, - 152, 104, 1, 198, 88, 251, 122, 104, 1, 198, 88, 249, 153, 104, 1, 198, - 88, 168, 104, 1, 198, 88, 208, 96, 104, 1, 198, 88, 231, 240, 104, 1, - 198, 88, 174, 104, 1, 198, 88, 190, 190, 104, 1, 198, 88, 238, 32, 104, - 1, 198, 88, 247, 1, 104, 1, 198, 88, 223, 32, 104, 1, 198, 88, 197, 168, - 104, 1, 198, 88, 170, 104, 1, 198, 88, 193, 190, 104, 1, 198, 88, 155, - 104, 1, 198, 88, 231, 237, 104, 1, 198, 88, 230, 91, 104, 1, 198, 88, - 222, 243, 104, 1, 198, 88, 213, 209, 104, 1, 198, 88, 235, 35, 104, 1, - 202, 214, 71, 104, 1, 202, 214, 68, 104, 1, 202, 214, 223, 44, 104, 1, - 202, 214, 196, 152, 104, 1, 202, 214, 66, 104, 1, 202, 214, 251, 122, - 104, 1, 202, 214, 155, 104, 1, 202, 214, 231, 240, 104, 1, 202, 214, 140, - 104, 1, 202, 214, 168, 104, 1, 202, 214, 203, 165, 104, 1, 202, 214, 190, - 190, 104, 1, 202, 214, 238, 32, 104, 1, 202, 214, 223, 32, 104, 1, 202, - 214, 233, 109, 104, 1, 202, 214, 231, 237, 104, 1, 202, 214, 230, 91, - 104, 1, 202, 214, 197, 168, 104, 1, 202, 214, 191, 123, 104, 1, 202, 214, - 207, 178, 104, 1, 202, 214, 247, 1, 104, 1, 202, 214, 191, 71, 104, 1, - 217, 87, 68, 104, 1, 217, 87, 155, 104, 1, 217, 87, 165, 104, 1, 217, 87, - 233, 109, 104, 1, 217, 87, 191, 71, 104, 1, 247, 2, 4, 105, 236, 138, - 104, 1, 251, 184, 231, 220, 251, 72, 107, 104, 1, 251, 184, 231, 220, - 195, 36, 107, 104, 1, 251, 184, 231, 220, 237, 247, 104, 1, 251, 184, - 231, 220, 196, 163, 104, 1, 251, 184, 231, 220, 223, 93, 196, 163, 104, - 1, 251, 184, 231, 220, 249, 104, 104, 1, 251, 184, 231, 220, 115, 249, - 104, 104, 1, 251, 184, 231, 220, 65, 104, 1, 251, 184, 231, 220, 68, 104, - 1, 251, 184, 231, 220, 155, 104, 1, 251, 184, 231, 220, 214, 68, 104, 1, - 251, 184, 231, 220, 247, 160, 104, 1, 251, 184, 231, 220, 197, 132, 104, - 1, 251, 184, 231, 220, 197, 120, 104, 1, 251, 184, 231, 220, 237, 191, - 104, 1, 251, 184, 231, 220, 213, 79, 104, 1, 251, 184, 231, 220, 190, - 190, 104, 1, 251, 184, 231, 220, 238, 32, 104, 1, 251, 184, 231, 220, - 168, 104, 1, 251, 184, 231, 220, 209, 228, 104, 1, 251, 184, 231, 220, - 201, 175, 104, 1, 251, 184, 231, 220, 191, 71, 104, 1, 251, 184, 231, - 220, 191, 123, 104, 1, 251, 184, 231, 220, 251, 245, 104, 1, 198, 88, - 251, 184, 231, 220, 190, 190, 104, 1, 198, 88, 251, 184, 231, 220, 191, - 71, 104, 1, 217, 87, 251, 184, 231, 220, 231, 91, 104, 1, 217, 87, 251, - 184, 231, 220, 214, 68, 104, 1, 217, 87, 251, 184, 231, 220, 247, 160, - 104, 1, 217, 87, 251, 184, 231, 220, 222, 252, 104, 1, 217, 87, 251, 184, - 231, 220, 197, 132, 104, 1, 217, 87, 251, 184, 231, 220, 237, 175, 104, - 1, 217, 87, 251, 184, 231, 220, 190, 190, 104, 1, 217, 87, 251, 184, 231, - 220, 237, 68, 104, 1, 217, 87, 251, 184, 231, 220, 201, 175, 104, 1, 217, - 87, 251, 184, 231, 220, 238, 142, 104, 1, 217, 87, 251, 184, 231, 220, - 191, 71, 104, 1, 217, 87, 251, 184, 231, 220, 191, 123, 104, 1, 251, 184, - 231, 220, 132, 66, 104, 1, 251, 184, 231, 220, 132, 170, 104, 1, 217, 87, - 251, 184, 231, 220, 248, 203, 104, 1, 251, 184, 231, 220, 238, 20, 104, - 1, 217, 87, 251, 184, 231, 220, 219, 159, 21, 22, 210, 242, 21, 22, 250, - 131, 21, 22, 252, 160, 21, 22, 193, 128, 21, 22, 208, 251, 21, 22, 210, - 72, 21, 22, 208, 113, 21, 22, 199, 154, 21, 22, 222, 29, 21, 22, 220, - 176, 21, 22, 217, 21, 21, 22, 212, 250, 21, 22, 214, 198, 21, 22, 219, - 248, 21, 22, 201, 252, 21, 22, 205, 103, 21, 22, 203, 18, 21, 22, 203, - 117, 21, 22, 202, 232, 21, 22, 191, 234, 21, 22, 192, 86, 21, 22, 207, - 122, 21, 22, 212, 107, 21, 22, 211, 128, 212, 107, 21, 22, 212, 106, 21, - 22, 211, 128, 212, 106, 21, 22, 212, 105, 21, 22, 211, 128, 212, 105, 21, - 22, 212, 104, 21, 22, 211, 128, 212, 104, 21, 22, 206, 22, 21, 22, 206, - 21, 21, 22, 206, 20, 21, 22, 206, 19, 21, 22, 206, 18, 21, 22, 206, 26, - 21, 22, 211, 128, 210, 236, 21, 22, 211, 128, 200, 43, 21, 22, 211, 128, - 222, 152, 21, 22, 211, 128, 247, 193, 21, 22, 211, 128, 218, 168, 21, 22, - 211, 128, 215, 61, 21, 22, 211, 128, 206, 8, 21, 22, 211, 128, 203, 167, - 21, 22, 234, 202, 193, 224, 21, 22, 193, 102, 193, 224, 21, 22, 53, 2, - 206, 188, 21, 22, 53, 207, 147, 236, 140, 21, 22, 207, 221, 206, 23, 21, - 22, 193, 103, 219, 8, 21, 22, 193, 103, 220, 125, 21, 22, 198, 202, 21, + 103, 218, 187, 21, 22, 218, 193, 21, 22, 193, 103, 218, 193, 21, 22, 218, + 192, 21, 22, 193, 103, 218, 192, 21, 22, 172, 21, 22, 193, 103, 172, 21, + 22, 216, 219, 172, 21, 22, 205, 69, 21, 22, 205, 196, 21, 22, 202, 223, + 21, 22, 202, 194, 21, 22, 202, 47, 21, 22, 202, 17, 21, 22, 192, 158, + 202, 17, 21, 22, 188, 21, 22, 205, 198, 21, 22, 200, 145, 21, 22, 193, + 103, 200, 145, 21, 22, 200, 139, 21, 22, 193, 103, 200, 139, 21, 22, 200, + 138, 21, 22, 193, 103, 200, 138, 21, 22, 200, 133, 21, 22, 193, 103, 200, + 133, 21, 22, 200, 132, 21, 22, 193, 103, 200, 132, 21, 22, 200, 150, 21, + 22, 193, 103, 200, 150, 21, 22, 200, 149, 21, 22, 193, 103, 200, 149, 21, + 22, 214, 211, 200, 149, 21, 22, 206, 9, 21, 22, 250, 182, 206, 9, 21, 22, + 200, 151, 21, 22, 248, 138, 206, 9, 21, 22, 215, 205, 202, 115, 21, 22, + 214, 211, 202, 102, 21, 22, 214, 211, 206, 7, 21, 22, 214, 211, 201, 193, + 21, 22, 214, 211, 201, 8, 21, 22, 214, 211, 202, 101, 21, 22, 214, 211, + 205, 72, 21, 22, 203, 114, 21, 22, 203, 82, 21, 22, 203, 77, 21, 22, 203, + 57, 21, 22, 203, 49, 21, 22, 203, 166, 21, 22, 203, 161, 21, 22, 202, + 238, 21, 22, 193, 103, 202, 238, 21, 22, 202, 237, 21, 22, 193, 103, 202, + 237, 21, 22, 202, 236, 21, 22, 193, 103, 202, 236, 21, 22, 202, 235, 21, + 22, 193, 103, 202, 235, 21, 22, 202, 234, 21, 22, 193, 103, 202, 234, 21, + 22, 202, 241, 21, 22, 193, 103, 202, 241, 21, 22, 202, 240, 21, 22, 193, + 103, 202, 240, 21, 22, 203, 168, 21, 22, 192, 80, 21, 22, 192, 138, 21, + 22, 192, 33, 21, 22, 192, 23, 21, 22, 192, 12, 21, 22, 191, 246, 21, 22, + 192, 158, 191, 246, 21, 22, 170, 21, 22, 192, 140, 21, 22, 191, 181, 21, + 22, 193, 103, 191, 181, 21, 22, 191, 180, 21, 22, 193, 103, 191, 180, 21, + 22, 191, 179, 21, 22, 193, 103, 191, 179, 21, 22, 191, 178, 21, 22, 193, + 103, 191, 178, 21, 22, 191, 177, 21, 22, 193, 103, 191, 177, 21, 22, 191, + 183, 21, 22, 193, 103, 191, 183, 21, 22, 191, 182, 21, 22, 193, 103, 191, + 182, 21, 22, 214, 211, 191, 182, 21, 22, 192, 159, 21, 22, 248, 188, 192, + 159, 21, 22, 193, 103, 192, 159, 21, 22, 205, 102, 192, 33, 21, 22, 207, + 115, 21, 22, 207, 223, 207, 115, 21, 22, 193, 103, 219, 240, 21, 22, 207, + 179, 21, 22, 207, 2, 21, 22, 206, 196, 21, 22, 206, 163, 21, 22, 206, + 135, 21, 22, 193, 103, 219, 45, 21, 22, 165, 21, 22, 207, 180, 21, 22, + 193, 103, 173, 21, 22, 206, 26, 21, 22, 193, 103, 206, 26, 21, 22, 146, + 21, 22, 193, 103, 146, 21, 22, 216, 219, 146, 21, 22, 233, 61, 21, 22, + 233, 108, 21, 22, 233, 25, 21, 22, 233, 10, 21, 22, 232, 177, 21, 22, + 232, 164, 21, 22, 233, 111, 21, 22, 233, 110, 21, 22, 232, 63, 21, 22, + 193, 103, 232, 63, 21, 22, 233, 177, 21, 22, 199, 33, 21, 22, 215, 61, + 199, 33, 21, 22, 199, 11, 21, 22, 215, 61, 199, 11, 21, 22, 199, 5, 21, + 22, 215, 61, 199, 5, 21, 22, 198, 241, 21, 22, 198, 235, 21, 22, 199, 49, + 21, 22, 199, 48, 21, 22, 198, 203, 21, 22, 193, 103, 198, 203, 21, 22, + 199, 51, 21, 22, 197, 118, 21, 22, 197, 116, 21, 22, 197, 115, 21, 22, + 197, 120, 21, 22, 197, 121, 21, 22, 197, 2, 21, 22, 197, 1, 21, 22, 197, + 0, 21, 22, 197, 4, 21, 22, 212, 131, 229, 247, 21, 22, 212, 131, 229, + 160, 21, 22, 212, 131, 229, 132, 21, 22, 212, 131, 229, 25, 21, 22, 212, + 131, 228, 254, 21, 22, 212, 131, 140, 21, 22, 212, 131, 230, 93, 21, 22, + 212, 131, 230, 118, 21, 22, 212, 130, 230, 118, 21, 22, 229, 115, 21, 22, + 208, 94, 21, 22, 208, 59, 21, 22, 208, 53, 21, 22, 208, 47, 21, 22, 208, + 42, 21, 22, 208, 98, 21, 22, 208, 97, 21, 22, 208, 106, 21, 22, 198, 111, + 21, 22, 198, 109, 21, 22, 198, 108, 21, 22, 198, 112, 21, 22, 193, 103, + 207, 115, 21, 22, 193, 103, 207, 2, 21, 22, 193, 103, 206, 163, 21, 22, + 193, 103, 165, 21, 22, 214, 68, 21, 22, 214, 18, 21, 22, 214, 14, 21, 22, + 213, 251, 21, 22, 213, 246, 21, 22, 214, 70, 21, 22, 214, 69, 21, 22, + 214, 72, 21, 22, 213, 74, 21, 22, 205, 102, 203, 114, 21, 22, 205, 102, + 203, 82, 21, 22, 205, 102, 203, 57, 21, 22, 205, 102, 203, 166, 21, 22, + 193, 27, 199, 33, 21, 22, 193, 27, 199, 11, 21, 22, 193, 27, 198, 241, + 21, 22, 193, 27, 199, 49, 21, 22, 193, 27, 199, 51, 21, 22, 219, 155, 21, + 22, 219, 154, 21, 22, 219, 153, 21, 22, 219, 152, 21, 22, 219, 161, 21, + 22, 219, 160, 21, 22, 219, 162, 21, 22, 199, 50, 199, 33, 21, 22, 199, + 50, 199, 11, 21, 22, 199, 50, 199, 5, 21, 22, 199, 50, 198, 241, 21, 22, + 199, 50, 198, 235, 21, 22, 199, 50, 199, 49, 21, 22, 199, 50, 199, 48, + 21, 22, 199, 50, 199, 51, 21, 22, 251, 222, 250, 122, 21, 22, 248, 138, + 71, 21, 22, 248, 138, 68, 21, 22, 248, 138, 74, 21, 22, 248, 138, 65, 21, + 22, 248, 138, 193, 125, 21, 22, 248, 138, 193, 86, 21, 22, 248, 138, 193, + 48, 21, 22, 248, 138, 193, 190, 21, 22, 248, 138, 214, 123, 21, 22, 248, + 138, 213, 221, 21, 22, 248, 138, 213, 45, 21, 22, 248, 138, 181, 21, 22, + 248, 138, 222, 24, 21, 22, 248, 138, 221, 168, 21, 22, 248, 138, 221, 69, + 21, 22, 248, 138, 155, 21, 22, 205, 102, 229, 247, 21, 22, 205, 102, 229, + 160, 21, 22, 205, 102, 229, 25, 21, 22, 205, 102, 140, 21, 22, 98, 231, + 61, 21, 22, 98, 231, 65, 21, 22, 98, 231, 79, 21, 22, 98, 231, 78, 21, + 22, 98, 231, 67, 21, 22, 98, 231, 93, 21, 22, 98, 206, 69, 21, 22, 98, + 206, 163, 21, 22, 98, 207, 115, 21, 22, 98, 207, 86, 21, 22, 98, 207, 2, + 21, 22, 98, 165, 21, 22, 98, 193, 0, 21, 22, 98, 193, 48, 21, 22, 98, + 193, 125, 21, 22, 98, 193, 114, 21, 22, 98, 193, 86, 21, 22, 98, 193, + 190, 21, 22, 98, 228, 120, 21, 22, 98, 228, 121, 21, 22, 98, 228, 124, + 21, 22, 98, 228, 123, 21, 22, 98, 228, 122, 21, 22, 98, 228, 127, 21, 22, + 98, 198, 213, 21, 22, 98, 198, 241, 21, 22, 98, 199, 33, 21, 22, 98, 199, + 31, 21, 22, 98, 199, 11, 21, 22, 98, 199, 49, 21, 22, 98, 197, 99, 21, + 22, 98, 197, 109, 21, 22, 98, 197, 127, 21, 22, 98, 197, 126, 21, 22, 98, + 197, 111, 21, 22, 98, 197, 132, 21, 22, 98, 208, 167, 21, 22, 98, 209, + 75, 21, 22, 98, 210, 65, 21, 22, 98, 210, 51, 21, 22, 98, 209, 187, 21, + 22, 98, 168, 21, 22, 98, 210, 238, 21, 22, 98, 230, 181, 21, 22, 98, 231, + 5, 21, 22, 98, 231, 167, 21, 22, 98, 231, 159, 21, 22, 98, 231, 55, 21, + 22, 98, 231, 242, 21, 22, 98, 221, 177, 21, 22, 98, 221, 185, 21, 22, 98, + 221, 199, 21, 22, 98, 221, 198, 21, 22, 98, 221, 192, 21, 22, 98, 221, + 217, 21, 22, 98, 221, 98, 21, 22, 98, 221, 99, 21, 22, 98, 221, 102, 21, + 22, 98, 221, 101, 21, 22, 98, 221, 100, 21, 22, 98, 221, 103, 21, 22, 98, + 221, 104, 21, 22, 98, 212, 180, 21, 22, 98, 213, 45, 21, 22, 98, 214, + 123, 21, 22, 98, 214, 112, 21, 22, 98, 213, 221, 21, 22, 98, 181, 21, 22, + 98, 215, 157, 21, 22, 98, 216, 14, 21, 22, 98, 216, 234, 21, 22, 98, 216, + 213, 21, 22, 98, 216, 102, 21, 22, 98, 174, 21, 22, 98, 191, 225, 21, 22, + 98, 192, 12, 21, 22, 98, 192, 80, 21, 22, 98, 192, 77, 21, 22, 98, 192, + 33, 21, 22, 98, 170, 21, 22, 98, 222, 184, 21, 22, 205, 102, 222, 184, + 21, 22, 98, 222, 203, 21, 22, 98, 223, 12, 21, 22, 98, 223, 10, 21, 22, + 98, 222, 246, 21, 22, 205, 102, 222, 246, 21, 22, 98, 223, 34, 21, 22, + 98, 222, 217, 21, 22, 98, 222, 221, 21, 22, 98, 222, 231, 21, 22, 98, + 222, 230, 21, 22, 98, 222, 229, 21, 22, 98, 222, 232, 21, 22, 98, 218, + 227, 21, 22, 98, 219, 45, 21, 22, 98, 219, 240, 21, 22, 98, 219, 230, 21, + 22, 98, 219, 148, 21, 22, 98, 173, 21, 22, 98, 236, 181, 21, 22, 98, 236, + 182, 21, 22, 98, 236, 187, 21, 22, 98, 236, 186, 21, 22, 98, 236, 183, + 21, 22, 98, 236, 188, 21, 22, 98, 219, 151, 21, 22, 98, 219, 153, 21, 22, + 98, 219, 157, 21, 22, 98, 219, 156, 21, 22, 98, 219, 155, 21, 22, 98, + 219, 161, 21, 22, 98, 198, 106, 21, 22, 98, 198, 108, 21, 22, 98, 198, + 111, 21, 22, 98, 198, 110, 21, 22, 98, 198, 109, 21, 22, 98, 198, 112, + 21, 22, 98, 198, 101, 21, 22, 98, 198, 102, 21, 22, 98, 198, 114, 21, 22, + 98, 198, 113, 21, 22, 98, 198, 103, 21, 22, 98, 198, 115, 21, 22, 98, + 190, 251, 21, 22, 98, 191, 7, 21, 22, 98, 191, 87, 21, 22, 98, 191, 84, + 21, 22, 98, 191, 30, 21, 22, 98, 191, 123, 21, 22, 98, 191, 166, 21, 22, + 98, 89, 191, 166, 21, 22, 98, 235, 24, 21, 22, 98, 235, 25, 21, 22, 98, + 235, 34, 21, 22, 98, 235, 33, 21, 22, 98, 235, 28, 21, 22, 98, 235, 37, + 21, 22, 98, 201, 5, 21, 22, 98, 202, 47, 21, 22, 98, 205, 69, 21, 22, 98, + 205, 51, 21, 22, 98, 202, 223, 21, 22, 98, 188, 21, 22, 98, 203, 6, 21, + 22, 98, 203, 57, 21, 22, 98, 203, 114, 21, 22, 98, 203, 112, 21, 22, 98, + 203, 82, 21, 22, 98, 203, 166, 21, 22, 98, 203, 168, 21, 22, 98, 197, + 140, 21, 22, 98, 197, 144, 21, 22, 98, 197, 161, 21, 22, 98, 197, 160, + 21, 22, 98, 197, 146, 21, 22, 98, 197, 168, 21, 22, 98, 243, 50, 21, 22, + 98, 243, 70, 21, 22, 98, 243, 129, 21, 22, 98, 243, 125, 21, 22, 98, 243, + 97, 21, 22, 98, 247, 3, 21, 22, 98, 197, 102, 21, 22, 98, 197, 103, 21, + 22, 98, 197, 106, 21, 22, 98, 197, 105, 21, 22, 98, 197, 104, 21, 22, 98, + 197, 107, 21, 22, 243, 98, 56, 21, 22, 232, 82, 201, 64, 21, 22, 208, 90, + 21, 22, 214, 66, 21, 22, 213, 71, 21, 22, 213, 70, 21, 22, 213, 69, 21, + 22, 213, 68, 21, 22, 213, 73, 21, 22, 213, 72, 21, 22, 193, 27, 198, 201, + 21, 22, 193, 27, 198, 200, 21, 22, 193, 27, 198, 199, 21, 22, 193, 27, + 198, 198, 21, 22, 193, 27, 198, 197, 21, 22, 193, 27, 198, 204, 21, 22, + 193, 27, 198, 203, 21, 22, 193, 27, 53, 199, 51, 21, 22, 248, 138, 193, + 224, 211, 142, 201, 249, 77, 211, 142, 1, 248, 241, 211, 142, 1, 218, + 213, 211, 142, 1, 233, 58, 211, 142, 1, 205, 180, 211, 142, 1, 213, 168, + 211, 142, 1, 196, 165, 211, 142, 1, 238, 7, 211, 142, 1, 198, 139, 211, + 142, 1, 242, 88, 211, 142, 1, 247, 31, 211, 142, 1, 215, 139, 211, 142, + 1, 230, 236, 211, 142, 1, 214, 56, 211, 142, 1, 201, 55, 211, 142, 1, + 206, 56, 211, 142, 1, 251, 234, 211, 142, 1, 211, 93, 211, 142, 1, 196, + 62, 211, 142, 1, 234, 217, 211, 142, 1, 223, 89, 211, 142, 1, 234, 218, + 211, 142, 1, 211, 58, 211, 142, 1, 196, 136, 211, 142, 1, 223, 207, 211, + 142, 1, 234, 215, 211, 142, 1, 210, 40, 211, 142, 233, 57, 77, 211, 142, + 207, 19, 233, 57, 77, 206, 45, 1, 233, 47, 233, 38, 233, 62, 233, 177, + 206, 45, 1, 196, 12, 206, 45, 1, 196, 47, 196, 63, 66, 206, 45, 1, 191, + 228, 206, 45, 1, 192, 159, 206, 45, 1, 193, 224, 206, 45, 1, 198, 206, + 198, 205, 198, 233, 206, 45, 1, 233, 250, 206, 45, 1, 251, 92, 65, 206, + 45, 1, 211, 39, 74, 206, 45, 1, 252, 66, 65, 206, 45, 1, 252, 11, 206, + 45, 1, 219, 17, 74, 206, 45, 1, 203, 34, 74, 206, 45, 1, 74, 206, 45, 1, + 211, 153, 206, 45, 1, 211, 106, 206, 45, 1, 207, 156, 207, 171, 207, 70, + 146, 206, 45, 1, 222, 41, 206, 45, 1, 247, 27, 206, 45, 1, 222, 42, 222, + 154, 206, 45, 1, 232, 53, 206, 45, 1, 234, 90, 206, 45, 1, 231, 162, 230, + 124, 232, 53, 206, 45, 1, 231, 202, 206, 45, 1, 192, 248, 192, 239, 193, + 224, 206, 45, 1, 230, 84, 230, 118, 206, 45, 1, 230, 88, 230, 118, 206, + 45, 1, 219, 19, 230, 118, 206, 45, 1, 203, 37, 230, 118, 206, 45, 1, 214, + 205, 212, 93, 214, 206, 215, 63, 206, 45, 1, 203, 35, 215, 63, 206, 45, + 1, 235, 137, 206, 45, 1, 223, 67, 223, 71, 223, 57, 68, 206, 45, 1, 71, + 206, 45, 1, 223, 1, 223, 37, 206, 45, 1, 231, 143, 206, 45, 1, 219, 20, + 252, 27, 206, 45, 1, 203, 39, 65, 206, 45, 1, 223, 49, 234, 63, 206, 45, + 1, 209, 249, 210, 20, 210, 238, 206, 45, 1, 251, 187, 234, 61, 206, 45, + 1, 201, 255, 206, 9, 206, 45, 1, 202, 199, 219, 16, 206, 9, 206, 45, 1, + 203, 33, 206, 9, 206, 45, 1, 247, 195, 206, 45, 1, 191, 166, 206, 45, 1, + 198, 120, 198, 132, 196, 242, 200, 43, 206, 45, 1, 203, 32, 200, 43, 206, + 45, 1, 238, 129, 206, 45, 1, 248, 219, 248, 222, 248, 144, 250, 122, 206, + 45, 1, 203, 38, 250, 122, 206, 45, 1, 235, 136, 206, 45, 1, 211, 72, 206, + 45, 1, 234, 169, 234, 176, 71, 206, 45, 1, 217, 81, 217, 93, 218, 170, + 206, 45, 1, 219, 18, 218, 170, 206, 45, 1, 203, 36, 218, 170, 206, 45, 1, + 219, 255, 220, 103, 219, 28, 172, 206, 45, 1, 235, 138, 206, 45, 1, 223, + 137, 206, 45, 1, 223, 138, 206, 45, 1, 238, 21, 238, 27, 238, 129, 206, + 45, 1, 211, 30, 233, 249, 74, 206, 45, 1, 234, 213, 206, 45, 1, 223, 87, + 206, 45, 1, 238, 150, 206, 45, 1, 247, 145, 206, 45, 1, 247, 43, 206, 45, + 1, 201, 109, 206, 45, 1, 219, 15, 206, 45, 1, 203, 31, 206, 45, 1, 228, + 27, 206, 45, 1, 208, 106, 206, 45, 1, 192, 235, 206, 45, 202, 171, 208, + 153, 206, 45, 215, 131, 208, 153, 206, 45, 238, 220, 208, 153, 206, 45, + 250, 254, 113, 206, 45, 197, 45, 113, 206, 45, 248, 239, 113, 206, 45, 1, + 222, 154, 206, 45, 1, 203, 168, 206, 45, 1, 211, 89, 206, 45, 1, 232, + 112, 247, 83, 211, 38, 206, 45, 1, 232, 112, 247, 83, 223, 70, 206, 45, + 1, 232, 112, 247, 83, 234, 175, 206, 45, 1, 232, 112, 247, 83, 252, 65, + 206, 45, 1, 232, 112, 247, 83, 252, 11, 199, 222, 1, 65, 199, 222, 1, 68, + 199, 222, 1, 66, 199, 222, 1, 155, 199, 222, 1, 231, 242, 199, 222, 1, + 214, 70, 199, 222, 1, 190, 190, 199, 222, 1, 238, 34, 199, 222, 1, 181, + 199, 222, 1, 168, 199, 222, 1, 249, 155, 199, 222, 1, 174, 199, 222, 1, + 170, 199, 222, 1, 165, 199, 222, 1, 173, 199, 222, 1, 193, 190, 199, 222, + 1, 188, 199, 222, 1, 140, 199, 222, 18, 3, 68, 199, 222, 18, 3, 66, 199, + 222, 3, 195, 40, 199, 222, 3, 210, 171, 199, 222, 1, 251, 16, 165, 230, + 25, 1, 65, 230, 25, 1, 68, 230, 25, 1, 66, 230, 25, 1, 155, 230, 25, 1, + 231, 242, 230, 25, 1, 214, 70, 230, 25, 1, 190, 190, 230, 25, 1, 238, 34, + 230, 25, 1, 181, 230, 25, 1, 168, 230, 25, 1, 249, 155, 230, 25, 1, 174, + 230, 25, 1, 170, 230, 25, 1, 165, 230, 25, 1, 173, 230, 25, 1, 193, 190, + 230, 25, 1, 188, 230, 25, 1, 140, 230, 25, 18, 3, 68, 230, 25, 18, 3, 66, + 230, 25, 3, 210, 171, 209, 206, 202, 171, 208, 153, 209, 206, 55, 208, + 153, 248, 2, 1, 65, 248, 2, 1, 68, 248, 2, 1, 66, 248, 2, 1, 155, 248, 2, + 1, 231, 242, 248, 2, 1, 214, 70, 248, 2, 1, 190, 190, 248, 2, 1, 238, 34, + 248, 2, 1, 181, 248, 2, 1, 168, 248, 2, 1, 249, 155, 248, 2, 1, 174, 248, + 2, 1, 170, 248, 2, 1, 165, 248, 2, 1, 173, 248, 2, 1, 193, 190, 248, 2, + 1, 188, 248, 2, 1, 140, 248, 2, 18, 3, 68, 248, 2, 18, 3, 66, 199, 221, + 1, 65, 199, 221, 1, 68, 199, 221, 1, 66, 199, 221, 1, 155, 199, 221, 1, + 231, 242, 199, 221, 1, 214, 70, 199, 221, 1, 190, 190, 199, 221, 1, 238, + 34, 199, 221, 1, 181, 199, 221, 1, 168, 199, 221, 1, 249, 155, 199, 221, + 1, 174, 199, 221, 1, 170, 199, 221, 1, 173, 199, 221, 1, 193, 190, 199, + 221, 1, 188, 199, 221, 18, 3, 68, 199, 221, 18, 3, 66, 95, 1, 155, 95, 1, + 221, 217, 95, 1, 221, 69, 95, 1, 221, 185, 95, 1, 213, 251, 95, 1, 247, + 162, 95, 1, 247, 3, 95, 1, 242, 101, 95, 1, 243, 70, 95, 1, 212, 67, 95, + 1, 238, 34, 95, 1, 197, 120, 95, 1, 236, 176, 95, 1, 197, 115, 95, 1, + 213, 51, 95, 1, 190, 190, 95, 1, 199, 49, 95, 1, 159, 95, 1, 198, 241, + 95, 1, 213, 45, 95, 1, 249, 155, 95, 1, 209, 230, 95, 1, 209, 75, 95, 1, + 209, 201, 95, 1, 216, 14, 95, 1, 192, 12, 95, 1, 206, 163, 95, 1, 219, + 45, 95, 1, 195, 24, 95, 1, 203, 166, 95, 1, 201, 135, 95, 1, 188, 95, 1, + 140, 95, 1, 173, 95, 1, 208, 98, 95, 223, 151, 18, 208, 84, 95, 223, 151, + 18, 208, 97, 95, 223, 151, 18, 208, 59, 95, 223, 151, 18, 208, 53, 95, + 223, 151, 18, 208, 35, 95, 223, 151, 18, 208, 2, 95, 223, 151, 18, 207, + 246, 95, 223, 151, 18, 207, 245, 95, 223, 151, 18, 206, 18, 95, 223, 151, + 18, 206, 11, 95, 223, 151, 18, 218, 185, 95, 223, 151, 18, 218, 173, 95, + 223, 151, 18, 208, 77, 95, 223, 151, 18, 208, 90, 95, 223, 151, 18, 208, + 43, 196, 255, 107, 95, 223, 151, 18, 208, 43, 196, 255, 109, 95, 223, + 151, 18, 208, 79, 95, 18, 223, 135, 251, 39, 95, 18, 223, 135, 252, 208, + 95, 18, 3, 252, 208, 95, 18, 3, 68, 95, 18, 3, 223, 201, 95, 18, 3, 192, + 159, 95, 18, 3, 191, 176, 95, 18, 3, 66, 95, 18, 3, 196, 30, 95, 18, 3, + 196, 168, 95, 18, 3, 211, 153, 95, 18, 3, 170, 95, 18, 3, 223, 228, 95, + 18, 3, 71, 95, 18, 3, 252, 27, 95, 18, 3, 251, 238, 95, 18, 3, 211, 89, + 95, 18, 3, 250, 165, 95, 3, 213, 186, 95, 3, 207, 108, 95, 3, 191, 187, + 95, 3, 215, 93, 95, 3, 197, 229, 95, 3, 249, 92, 95, 3, 206, 152, 95, 3, + 198, 90, 95, 3, 222, 97, 95, 3, 251, 240, 95, 3, 205, 144, 205, 136, 95, + 3, 195, 37, 95, 3, 242, 92, 95, 3, 249, 62, 95, 3, 221, 207, 95, 3, 249, + 87, 95, 3, 247, 133, 209, 148, 220, 188, 95, 3, 219, 207, 198, 59, 95, 3, + 248, 207, 95, 3, 209, 203, 215, 150, 95, 3, 221, 41, 95, 238, 172, 16, + 206, 242, 95, 3, 250, 146, 95, 3, 250, 168, 95, 17, 191, 77, 95, 17, 107, + 95, 17, 109, 95, 17, 138, 95, 17, 134, 95, 17, 150, 95, 17, 169, 95, 17, + 175, 95, 17, 171, 95, 17, 178, 95, 16, 219, 207, 250, 170, 202, 20, 95, + 16, 219, 207, 250, 170, 215, 114, 95, 16, 219, 207, 250, 170, 209, 147, + 95, 16, 219, 207, 250, 170, 248, 242, 95, 16, 219, 207, 250, 170, 247, + 238, 95, 16, 219, 207, 250, 170, 208, 247, 95, 16, 219, 207, 250, 170, + 208, 241, 95, 16, 219, 207, 250, 170, 208, 239, 95, 16, 219, 207, 250, + 170, 208, 245, 95, 16, 219, 207, 250, 170, 208, 243, 104, 248, 160, 104, + 234, 122, 104, 242, 76, 104, 232, 82, 201, 64, 104, 242, 85, 104, 232, + 130, 236, 140, 104, 198, 88, 202, 33, 228, 90, 104, 202, 215, 5, 248, 75, + 217, 53, 104, 217, 89, 242, 76, 104, 217, 89, 232, 82, 201, 64, 104, 213, + 166, 104, 232, 111, 67, 205, 36, 107, 104, 232, 111, 67, 205, 36, 109, + 104, 232, 111, 67, 205, 36, 138, 104, 18, 204, 11, 104, 232, 111, 67, + 205, 36, 134, 104, 17, 191, 77, 104, 17, 107, 104, 17, 109, 104, 17, 138, + 104, 17, 134, 104, 17, 150, 104, 17, 169, 104, 17, 175, 104, 17, 171, + 104, 17, 178, 104, 1, 65, 104, 1, 71, 104, 1, 68, 104, 1, 74, 104, 1, 66, + 104, 1, 211, 153, 104, 1, 196, 152, 104, 1, 234, 190, 104, 1, 181, 104, + 1, 251, 124, 104, 1, 249, 155, 104, 1, 168, 104, 1, 208, 98, 104, 1, 231, + 242, 104, 1, 174, 104, 1, 173, 104, 1, 188, 104, 1, 203, 166, 104, 1, + 190, 190, 104, 1, 238, 34, 104, 1, 247, 3, 104, 1, 223, 34, 104, 1, 170, + 104, 1, 165, 104, 1, 193, 190, 104, 1, 233, 111, 104, 1, 155, 104, 1, + 221, 217, 104, 1, 197, 168, 104, 1, 191, 123, 104, 1, 230, 93, 104, 1, + 190, 255, 104, 1, 219, 161, 104, 1, 191, 57, 104, 1, 243, 97, 104, 1, + 198, 88, 180, 18, 56, 104, 1, 198, 88, 71, 104, 1, 198, 88, 68, 104, 1, + 198, 88, 74, 104, 1, 198, 88, 66, 104, 1, 198, 88, 211, 153, 104, 1, 198, + 88, 196, 152, 104, 1, 198, 88, 251, 124, 104, 1, 198, 88, 249, 155, 104, + 1, 198, 88, 168, 104, 1, 198, 88, 208, 98, 104, 1, 198, 88, 231, 242, + 104, 1, 198, 88, 174, 104, 1, 198, 88, 190, 190, 104, 1, 198, 88, 238, + 34, 104, 1, 198, 88, 247, 3, 104, 1, 198, 88, 223, 34, 104, 1, 198, 88, + 197, 168, 104, 1, 198, 88, 170, 104, 1, 198, 88, 193, 190, 104, 1, 198, + 88, 155, 104, 1, 198, 88, 231, 239, 104, 1, 198, 88, 230, 93, 104, 1, + 198, 88, 222, 245, 104, 1, 198, 88, 213, 211, 104, 1, 198, 88, 235, 37, + 104, 1, 202, 215, 71, 104, 1, 202, 215, 68, 104, 1, 202, 215, 223, 46, + 104, 1, 202, 215, 196, 152, 104, 1, 202, 215, 66, 104, 1, 202, 215, 251, + 124, 104, 1, 202, 215, 155, 104, 1, 202, 215, 231, 242, 104, 1, 202, 215, + 140, 104, 1, 202, 215, 168, 104, 1, 202, 215, 203, 166, 104, 1, 202, 215, + 190, 190, 104, 1, 202, 215, 238, 34, 104, 1, 202, 215, 223, 34, 104, 1, + 202, 215, 233, 111, 104, 1, 202, 215, 231, 239, 104, 1, 202, 215, 230, + 93, 104, 1, 202, 215, 197, 168, 104, 1, 202, 215, 191, 123, 104, 1, 202, + 215, 207, 180, 104, 1, 202, 215, 247, 3, 104, 1, 202, 215, 191, 71, 104, + 1, 217, 89, 68, 104, 1, 217, 89, 155, 104, 1, 217, 89, 165, 104, 1, 217, + 89, 233, 111, 104, 1, 217, 89, 191, 71, 104, 1, 247, 4, 4, 105, 236, 140, + 104, 1, 251, 186, 231, 222, 251, 74, 107, 104, 1, 251, 186, 231, 222, + 195, 36, 107, 104, 1, 251, 186, 231, 222, 237, 249, 104, 1, 251, 186, + 231, 222, 196, 163, 104, 1, 251, 186, 231, 222, 223, 95, 196, 163, 104, + 1, 251, 186, 231, 222, 249, 106, 104, 1, 251, 186, 231, 222, 115, 249, + 106, 104, 1, 251, 186, 231, 222, 65, 104, 1, 251, 186, 231, 222, 68, 104, + 1, 251, 186, 231, 222, 155, 104, 1, 251, 186, 231, 222, 214, 70, 104, 1, + 251, 186, 231, 222, 247, 162, 104, 1, 251, 186, 231, 222, 197, 132, 104, + 1, 251, 186, 231, 222, 197, 120, 104, 1, 251, 186, 231, 222, 237, 193, + 104, 1, 251, 186, 231, 222, 213, 81, 104, 1, 251, 186, 231, 222, 190, + 190, 104, 1, 251, 186, 231, 222, 238, 34, 104, 1, 251, 186, 231, 222, + 168, 104, 1, 251, 186, 231, 222, 209, 230, 104, 1, 251, 186, 231, 222, + 201, 176, 104, 1, 251, 186, 231, 222, 191, 71, 104, 1, 251, 186, 231, + 222, 191, 123, 104, 1, 251, 186, 231, 222, 251, 247, 104, 1, 198, 88, + 251, 186, 231, 222, 190, 190, 104, 1, 198, 88, 251, 186, 231, 222, 191, + 71, 104, 1, 217, 89, 251, 186, 231, 222, 231, 93, 104, 1, 217, 89, 251, + 186, 231, 222, 214, 70, 104, 1, 217, 89, 251, 186, 231, 222, 247, 162, + 104, 1, 217, 89, 251, 186, 231, 222, 222, 254, 104, 1, 217, 89, 251, 186, + 231, 222, 197, 132, 104, 1, 217, 89, 251, 186, 231, 222, 237, 177, 104, + 1, 217, 89, 251, 186, 231, 222, 190, 190, 104, 1, 217, 89, 251, 186, 231, + 222, 237, 70, 104, 1, 217, 89, 251, 186, 231, 222, 201, 176, 104, 1, 217, + 89, 251, 186, 231, 222, 238, 144, 104, 1, 217, 89, 251, 186, 231, 222, + 191, 71, 104, 1, 217, 89, 251, 186, 231, 222, 191, 123, 104, 1, 251, 186, + 231, 222, 132, 66, 104, 1, 251, 186, 231, 222, 132, 170, 104, 1, 217, 89, + 251, 186, 231, 222, 248, 205, 104, 1, 251, 186, 231, 222, 238, 22, 104, + 1, 217, 89, 251, 186, 231, 222, 219, 161, 21, 22, 210, 244, 21, 22, 250, + 133, 21, 22, 252, 162, 21, 22, 193, 128, 21, 22, 208, 253, 21, 22, 210, + 74, 21, 22, 208, 115, 21, 22, 199, 154, 21, 22, 222, 31, 21, 22, 220, + 178, 21, 22, 217, 23, 21, 22, 212, 252, 21, 22, 214, 200, 21, 22, 219, + 250, 21, 22, 201, 253, 21, 22, 205, 104, 21, 22, 203, 19, 21, 22, 203, + 118, 21, 22, 202, 233, 21, 22, 191, 234, 21, 22, 192, 86, 21, 22, 207, + 124, 21, 22, 212, 109, 21, 22, 211, 130, 212, 109, 21, 22, 212, 108, 21, + 22, 211, 130, 212, 108, 21, 22, 212, 107, 21, 22, 211, 130, 212, 107, 21, + 22, 212, 106, 21, 22, 211, 130, 212, 106, 21, 22, 206, 23, 21, 22, 206, + 22, 21, 22, 206, 21, 21, 22, 206, 20, 21, 22, 206, 19, 21, 22, 206, 27, + 21, 22, 211, 130, 210, 238, 21, 22, 211, 130, 200, 43, 21, 22, 211, 130, + 222, 154, 21, 22, 211, 130, 247, 195, 21, 22, 211, 130, 218, 170, 21, 22, + 211, 130, 215, 63, 21, 22, 211, 130, 206, 9, 21, 22, 211, 130, 203, 168, + 21, 22, 234, 204, 193, 224, 21, 22, 193, 102, 193, 224, 21, 22, 53, 2, + 206, 189, 21, 22, 53, 207, 149, 236, 142, 21, 22, 207, 223, 206, 24, 21, + 22, 193, 103, 219, 10, 21, 22, 193, 103, 220, 127, 21, 22, 198, 202, 21, 22, 198, 204, 21, 22, 197, 112, 21, 22, 197, 114, 21, 22, 197, 119, 21, - 22, 198, 105, 21, 22, 198, 107, 21, 22, 205, 101, 202, 237, 21, 22, 205, - 101, 203, 48, 21, 22, 205, 101, 228, 252, 21, 22, 98, 230, 130, 21, 22, - 98, 237, 103, 231, 157, 21, 22, 98, 231, 237, 21, 22, 98, 230, 135, 21, - 22, 205, 101, 222, 162, 21, 22, 98, 222, 160, 21, 22, 249, 5, 237, 103, - 172, 21, 22, 249, 5, 237, 103, 146, 21, 22, 98, 237, 98, 206, 8, 219, - 122, 195, 1, 219, 175, 219, 122, 1, 155, 219, 122, 1, 221, 215, 219, 122, - 1, 231, 240, 219, 122, 1, 231, 91, 219, 122, 1, 214, 68, 219, 122, 1, - 247, 160, 219, 122, 1, 247, 1, 219, 122, 1, 223, 32, 219, 122, 1, 222, - 252, 219, 122, 1, 192, 108, 219, 122, 1, 190, 190, 219, 122, 1, 199, 49, - 219, 122, 1, 238, 32, 219, 122, 1, 237, 68, 219, 122, 1, 180, 219, 122, - 1, 168, 219, 122, 1, 209, 228, 219, 122, 1, 249, 153, 219, 122, 1, 248, - 203, 219, 122, 1, 174, 219, 122, 1, 170, 219, 122, 1, 165, 219, 122, 1, - 173, 219, 122, 1, 193, 190, 219, 122, 1, 203, 165, 219, 122, 1, 201, 175, - 219, 122, 1, 188, 219, 122, 1, 140, 219, 122, 1, 230, 126, 219, 122, 1, - 198, 26, 219, 122, 18, 3, 65, 219, 122, 18, 3, 68, 219, 122, 18, 3, 66, - 219, 122, 18, 3, 234, 188, 219, 122, 18, 3, 251, 236, 219, 122, 18, 3, - 211, 87, 219, 122, 18, 3, 250, 163, 219, 122, 18, 3, 71, 219, 122, 18, 3, - 74, 219, 122, 200, 239, 1, 170, 219, 122, 200, 239, 1, 165, 219, 122, - 200, 239, 1, 193, 190, 219, 122, 2, 1, 155, 219, 122, 2, 1, 214, 68, 219, - 122, 2, 1, 251, 71, 219, 122, 2, 1, 190, 190, 219, 122, 2, 1, 180, 219, - 122, 2, 1, 168, 219, 122, 2, 1, 174, 219, 122, 2, 1, 165, 219, 122, 2, 1, - 173, 219, 122, 3, 215, 134, 219, 122, 3, 222, 1, 219, 122, 3, 205, 198, - 219, 122, 3, 219, 8, 219, 122, 233, 216, 77, 219, 122, 208, 13, 77, 219, - 122, 17, 191, 77, 219, 122, 17, 107, 219, 122, 17, 109, 219, 122, 17, - 138, 219, 122, 17, 134, 219, 122, 17, 149, 219, 122, 17, 169, 219, 122, - 17, 175, 219, 122, 17, 171, 219, 122, 17, 178, 54, 219, 239, 1, 155, 54, - 219, 239, 1, 192, 220, 54, 219, 239, 1, 214, 68, 54, 219, 239, 1, 197, - 168, 54, 219, 239, 1, 188, 54, 219, 239, 1, 170, 54, 219, 239, 1, 190, - 190, 54, 219, 239, 1, 199, 49, 54, 219, 239, 1, 173, 54, 219, 239, 1, - 168, 54, 219, 239, 1, 209, 228, 54, 219, 239, 1, 174, 54, 219, 239, 1, - 233, 109, 54, 219, 239, 1, 195, 188, 54, 219, 239, 1, 140, 54, 219, 239, - 1, 208, 96, 54, 219, 239, 1, 221, 215, 54, 219, 239, 1, 197, 157, 54, - 219, 239, 1, 180, 54, 219, 239, 1, 65, 54, 219, 239, 1, 68, 54, 219, 239, - 1, 234, 188, 54, 219, 239, 1, 234, 173, 54, 219, 239, 1, 66, 54, 219, - 239, 1, 211, 87, 54, 219, 239, 1, 74, 54, 219, 239, 1, 196, 152, 54, 219, - 239, 1, 71, 54, 219, 239, 1, 250, 161, 54, 219, 239, 1, 251, 236, 54, - 219, 239, 1, 198, 77, 54, 219, 239, 1, 198, 76, 54, 219, 239, 1, 198, 75, - 54, 219, 239, 1, 198, 74, 54, 219, 239, 1, 198, 73, 214, 80, 54, 218, - 219, 1, 137, 208, 96, 214, 80, 54, 218, 219, 1, 130, 208, 96, 214, 80, - 54, 218, 219, 1, 137, 155, 214, 80, 54, 218, 219, 1, 137, 192, 220, 214, - 80, 54, 218, 219, 1, 137, 214, 68, 214, 80, 54, 218, 219, 1, 130, 155, - 214, 80, 54, 218, 219, 1, 130, 192, 220, 214, 80, 54, 218, 219, 1, 130, - 214, 68, 214, 80, 54, 218, 219, 1, 137, 197, 168, 214, 80, 54, 218, 219, - 1, 137, 188, 214, 80, 54, 218, 219, 1, 137, 170, 214, 80, 54, 218, 219, - 1, 130, 197, 168, 214, 80, 54, 218, 219, 1, 130, 188, 214, 80, 54, 218, - 219, 1, 130, 170, 214, 80, 54, 218, 219, 1, 137, 190, 190, 214, 80, 54, - 218, 219, 1, 137, 199, 49, 214, 80, 54, 218, 219, 1, 137, 180, 214, 80, - 54, 218, 219, 1, 130, 190, 190, 214, 80, 54, 218, 219, 1, 130, 199, 49, - 214, 80, 54, 218, 219, 1, 130, 180, 214, 80, 54, 218, 219, 1, 137, 168, - 214, 80, 54, 218, 219, 1, 137, 209, 228, 214, 80, 54, 218, 219, 1, 137, - 174, 214, 80, 54, 218, 219, 1, 130, 168, 214, 80, 54, 218, 219, 1, 130, - 209, 228, 214, 80, 54, 218, 219, 1, 130, 174, 214, 80, 54, 218, 219, 1, - 137, 233, 109, 214, 80, 54, 218, 219, 1, 137, 195, 188, 214, 80, 54, 218, - 219, 1, 137, 173, 214, 80, 54, 218, 219, 1, 130, 233, 109, 214, 80, 54, - 218, 219, 1, 130, 195, 188, 214, 80, 54, 218, 219, 1, 130, 173, 214, 80, - 54, 218, 219, 1, 137, 140, 214, 80, 54, 218, 219, 1, 137, 238, 32, 214, - 80, 54, 218, 219, 1, 137, 249, 153, 214, 80, 54, 218, 219, 1, 130, 140, - 214, 80, 54, 218, 219, 1, 130, 238, 32, 214, 80, 54, 218, 219, 1, 130, - 249, 153, 214, 80, 54, 218, 219, 1, 137, 220, 181, 214, 80, 54, 218, 219, - 1, 137, 192, 185, 214, 80, 54, 218, 219, 1, 130, 220, 181, 214, 80, 54, - 218, 219, 1, 130, 192, 185, 214, 80, 54, 218, 219, 1, 137, 200, 251, 214, - 80, 54, 218, 219, 1, 130, 200, 251, 214, 80, 54, 218, 219, 18, 3, 18, - 203, 28, 214, 80, 54, 218, 219, 18, 3, 252, 206, 214, 80, 54, 218, 219, - 18, 3, 223, 199, 214, 80, 54, 218, 219, 18, 3, 66, 214, 80, 54, 218, 219, - 18, 3, 196, 30, 214, 80, 54, 218, 219, 18, 3, 71, 214, 80, 54, 218, 219, - 18, 3, 252, 25, 214, 80, 54, 218, 219, 18, 3, 74, 214, 80, 54, 218, 219, - 18, 3, 211, 182, 214, 80, 54, 218, 219, 18, 3, 196, 152, 214, 80, 54, - 218, 219, 18, 3, 250, 131, 214, 80, 54, 218, 219, 18, 3, 252, 160, 214, - 80, 54, 218, 219, 18, 3, 196, 21, 214, 80, 54, 218, 219, 18, 3, 210, 242, - 214, 80, 54, 218, 219, 18, 3, 211, 179, 214, 80, 54, 218, 219, 18, 3, - 196, 144, 214, 80, 54, 218, 219, 18, 3, 223, 44, 214, 80, 54, 218, 219, - 1, 53, 196, 12, 214, 80, 54, 218, 219, 1, 53, 214, 70, 214, 80, 54, 218, - 219, 1, 53, 215, 61, 214, 80, 54, 218, 219, 1, 53, 218, 168, 214, 80, 54, - 218, 219, 1, 53, 222, 152, 214, 80, 54, 218, 219, 1, 53, 238, 127, 214, - 80, 54, 218, 219, 1, 53, 250, 120, 214, 80, 54, 218, 219, 163, 217, 55, - 214, 80, 54, 218, 219, 163, 217, 54, 214, 80, 54, 218, 219, 17, 191, 77, - 214, 80, 54, 218, 219, 17, 107, 214, 80, 54, 218, 219, 17, 109, 214, 80, - 54, 218, 219, 17, 138, 214, 80, 54, 218, 219, 17, 134, 214, 80, 54, 218, - 219, 17, 149, 214, 80, 54, 218, 219, 17, 169, 214, 80, 54, 218, 219, 17, - 175, 214, 80, 54, 218, 219, 17, 171, 214, 80, 54, 218, 219, 17, 178, 214, - 80, 54, 218, 219, 128, 17, 107, 214, 80, 54, 218, 219, 3, 220, 107, 214, - 80, 54, 218, 219, 3, 220, 106, 95, 16, 210, 84, 95, 16, 215, 113, 221, - 58, 95, 16, 209, 146, 221, 58, 95, 16, 248, 241, 221, 58, 95, 16, 247, - 237, 221, 58, 95, 16, 208, 246, 221, 58, 95, 16, 208, 240, 221, 58, 95, - 16, 208, 238, 221, 58, 95, 16, 208, 244, 221, 58, 95, 16, 208, 242, 221, - 58, 95, 16, 237, 232, 221, 58, 95, 16, 237, 228, 221, 58, 95, 16, 237, - 227, 221, 58, 95, 16, 237, 230, 221, 58, 95, 16, 237, 229, 221, 58, 95, - 16, 237, 226, 221, 58, 95, 16, 197, 51, 95, 16, 215, 113, 206, 149, 95, - 16, 209, 146, 206, 149, 95, 16, 248, 241, 206, 149, 95, 16, 247, 237, - 206, 149, 95, 16, 208, 246, 206, 149, 95, 16, 208, 240, 206, 149, 95, 16, - 208, 238, 206, 149, 95, 16, 208, 244, 206, 149, 95, 16, 208, 242, 206, - 149, 95, 16, 237, 232, 206, 149, 95, 16, 237, 228, 206, 149, 95, 16, 237, - 227, 206, 149, 95, 16, 237, 230, 206, 149, 95, 16, 237, 229, 206, 149, - 95, 16, 237, 226, 206, 149, 248, 1, 1, 155, 248, 1, 1, 231, 240, 248, 1, - 1, 214, 68, 248, 1, 1, 214, 11, 248, 1, 1, 168, 248, 1, 1, 249, 153, 248, - 1, 1, 174, 248, 1, 1, 215, 166, 248, 1, 1, 190, 190, 248, 1, 1, 238, 32, - 248, 1, 1, 180, 248, 1, 1, 212, 244, 248, 1, 1, 247, 160, 248, 1, 1, 223, - 32, 248, 1, 1, 212, 101, 248, 1, 1, 212, 92, 248, 1, 1, 170, 248, 1, 1, - 165, 248, 1, 1, 173, 248, 1, 1, 195, 188, 248, 1, 1, 188, 248, 1, 1, 65, - 248, 1, 1, 140, 248, 1, 18, 3, 68, 248, 1, 18, 3, 66, 248, 1, 18, 3, 71, - 248, 1, 18, 3, 74, 248, 1, 18, 3, 252, 25, 248, 1, 210, 184, 248, 1, 234, - 95, 79, 205, 53, 54, 128, 1, 137, 155, 54, 128, 1, 137, 221, 215, 54, - 128, 1, 137, 220, 165, 54, 128, 1, 130, 155, 54, 128, 1, 130, 220, 165, - 54, 128, 1, 130, 221, 215, 54, 128, 1, 214, 68, 54, 128, 1, 137, 247, - 160, 54, 128, 1, 137, 247, 1, 54, 128, 1, 130, 247, 160, 54, 128, 1, 130, - 188, 54, 128, 1, 130, 247, 1, 54, 128, 1, 212, 101, 54, 128, 1, 207, 129, - 54, 128, 1, 137, 207, 127, 54, 128, 1, 238, 32, 54, 128, 1, 130, 207, - 127, 54, 128, 1, 207, 138, 54, 128, 1, 137, 190, 190, 54, 128, 1, 137, + 22, 198, 105, 21, 22, 198, 107, 21, 22, 205, 102, 202, 238, 21, 22, 205, + 102, 203, 49, 21, 22, 205, 102, 228, 254, 21, 22, 98, 230, 132, 21, 22, + 98, 237, 105, 231, 159, 21, 22, 98, 231, 239, 21, 22, 98, 230, 137, 21, + 22, 205, 102, 222, 164, 21, 22, 98, 222, 162, 21, 22, 249, 7, 237, 105, + 172, 21, 22, 249, 7, 237, 105, 146, 21, 22, 98, 237, 100, 206, 9, 219, + 124, 195, 1, 219, 177, 219, 124, 1, 155, 219, 124, 1, 221, 217, 219, 124, + 1, 231, 242, 219, 124, 1, 231, 93, 219, 124, 1, 214, 70, 219, 124, 1, + 247, 162, 219, 124, 1, 247, 3, 219, 124, 1, 223, 34, 219, 124, 1, 222, + 254, 219, 124, 1, 192, 108, 219, 124, 1, 190, 190, 219, 124, 1, 199, 49, + 219, 124, 1, 238, 34, 219, 124, 1, 237, 70, 219, 124, 1, 181, 219, 124, + 1, 168, 219, 124, 1, 209, 230, 219, 124, 1, 249, 155, 219, 124, 1, 248, + 205, 219, 124, 1, 174, 219, 124, 1, 170, 219, 124, 1, 165, 219, 124, 1, + 173, 219, 124, 1, 193, 190, 219, 124, 1, 203, 166, 219, 124, 1, 201, 176, + 219, 124, 1, 188, 219, 124, 1, 140, 219, 124, 1, 230, 128, 219, 124, 1, + 198, 26, 219, 124, 18, 3, 65, 219, 124, 18, 3, 68, 219, 124, 18, 3, 66, + 219, 124, 18, 3, 234, 190, 219, 124, 18, 3, 251, 238, 219, 124, 18, 3, + 211, 89, 219, 124, 18, 3, 250, 165, 219, 124, 18, 3, 71, 219, 124, 18, 3, + 74, 219, 124, 200, 240, 1, 170, 219, 124, 200, 240, 1, 165, 219, 124, + 200, 240, 1, 193, 190, 219, 124, 2, 1, 155, 219, 124, 2, 1, 214, 70, 219, + 124, 2, 1, 251, 73, 219, 124, 2, 1, 190, 190, 219, 124, 2, 1, 181, 219, + 124, 2, 1, 168, 219, 124, 2, 1, 174, 219, 124, 2, 1, 165, 219, 124, 2, 1, + 173, 219, 124, 3, 215, 136, 219, 124, 3, 222, 3, 219, 124, 3, 205, 199, + 219, 124, 3, 219, 10, 219, 124, 233, 218, 77, 219, 124, 208, 15, 77, 219, + 124, 17, 191, 77, 219, 124, 17, 107, 219, 124, 17, 109, 219, 124, 17, + 138, 219, 124, 17, 134, 219, 124, 17, 150, 219, 124, 17, 169, 219, 124, + 17, 175, 219, 124, 17, 171, 219, 124, 17, 178, 54, 219, 241, 1, 155, 54, + 219, 241, 1, 192, 220, 54, 219, 241, 1, 214, 70, 54, 219, 241, 1, 197, + 168, 54, 219, 241, 1, 188, 54, 219, 241, 1, 170, 54, 219, 241, 1, 190, + 190, 54, 219, 241, 1, 199, 49, 54, 219, 241, 1, 173, 54, 219, 241, 1, + 168, 54, 219, 241, 1, 209, 230, 54, 219, 241, 1, 174, 54, 219, 241, 1, + 233, 111, 54, 219, 241, 1, 195, 188, 54, 219, 241, 1, 140, 54, 219, 241, + 1, 208, 98, 54, 219, 241, 1, 221, 217, 54, 219, 241, 1, 197, 157, 54, + 219, 241, 1, 181, 54, 219, 241, 1, 65, 54, 219, 241, 1, 68, 54, 219, 241, + 1, 234, 190, 54, 219, 241, 1, 234, 175, 54, 219, 241, 1, 66, 54, 219, + 241, 1, 211, 89, 54, 219, 241, 1, 74, 54, 219, 241, 1, 196, 152, 54, 219, + 241, 1, 71, 54, 219, 241, 1, 250, 163, 54, 219, 241, 1, 251, 238, 54, + 219, 241, 1, 198, 77, 54, 219, 241, 1, 198, 76, 54, 219, 241, 1, 198, 75, + 54, 219, 241, 1, 198, 74, 54, 219, 241, 1, 198, 73, 214, 82, 54, 218, + 221, 1, 137, 208, 98, 214, 82, 54, 218, 221, 1, 130, 208, 98, 214, 82, + 54, 218, 221, 1, 137, 155, 214, 82, 54, 218, 221, 1, 137, 192, 220, 214, + 82, 54, 218, 221, 1, 137, 214, 70, 214, 82, 54, 218, 221, 1, 130, 155, + 214, 82, 54, 218, 221, 1, 130, 192, 220, 214, 82, 54, 218, 221, 1, 130, + 214, 70, 214, 82, 54, 218, 221, 1, 137, 197, 168, 214, 82, 54, 218, 221, + 1, 137, 188, 214, 82, 54, 218, 221, 1, 137, 170, 214, 82, 54, 218, 221, + 1, 130, 197, 168, 214, 82, 54, 218, 221, 1, 130, 188, 214, 82, 54, 218, + 221, 1, 130, 170, 214, 82, 54, 218, 221, 1, 137, 190, 190, 214, 82, 54, + 218, 221, 1, 137, 199, 49, 214, 82, 54, 218, 221, 1, 137, 181, 214, 82, + 54, 218, 221, 1, 130, 190, 190, 214, 82, 54, 218, 221, 1, 130, 199, 49, + 214, 82, 54, 218, 221, 1, 130, 181, 214, 82, 54, 218, 221, 1, 137, 168, + 214, 82, 54, 218, 221, 1, 137, 209, 230, 214, 82, 54, 218, 221, 1, 137, + 174, 214, 82, 54, 218, 221, 1, 130, 168, 214, 82, 54, 218, 221, 1, 130, + 209, 230, 214, 82, 54, 218, 221, 1, 130, 174, 214, 82, 54, 218, 221, 1, + 137, 233, 111, 214, 82, 54, 218, 221, 1, 137, 195, 188, 214, 82, 54, 218, + 221, 1, 137, 173, 214, 82, 54, 218, 221, 1, 130, 233, 111, 214, 82, 54, + 218, 221, 1, 130, 195, 188, 214, 82, 54, 218, 221, 1, 130, 173, 214, 82, + 54, 218, 221, 1, 137, 140, 214, 82, 54, 218, 221, 1, 137, 238, 34, 214, + 82, 54, 218, 221, 1, 137, 249, 155, 214, 82, 54, 218, 221, 1, 130, 140, + 214, 82, 54, 218, 221, 1, 130, 238, 34, 214, 82, 54, 218, 221, 1, 130, + 249, 155, 214, 82, 54, 218, 221, 1, 137, 220, 183, 214, 82, 54, 218, 221, + 1, 137, 192, 185, 214, 82, 54, 218, 221, 1, 130, 220, 183, 214, 82, 54, + 218, 221, 1, 130, 192, 185, 214, 82, 54, 218, 221, 1, 137, 200, 252, 214, + 82, 54, 218, 221, 1, 130, 200, 252, 214, 82, 54, 218, 221, 18, 3, 18, + 203, 29, 214, 82, 54, 218, 221, 18, 3, 252, 208, 214, 82, 54, 218, 221, + 18, 3, 223, 201, 214, 82, 54, 218, 221, 18, 3, 66, 214, 82, 54, 218, 221, + 18, 3, 196, 30, 214, 82, 54, 218, 221, 18, 3, 71, 214, 82, 54, 218, 221, + 18, 3, 252, 27, 214, 82, 54, 218, 221, 18, 3, 74, 214, 82, 54, 218, 221, + 18, 3, 211, 184, 214, 82, 54, 218, 221, 18, 3, 196, 152, 214, 82, 54, + 218, 221, 18, 3, 250, 133, 214, 82, 54, 218, 221, 18, 3, 252, 162, 214, + 82, 54, 218, 221, 18, 3, 196, 21, 214, 82, 54, 218, 221, 18, 3, 210, 244, + 214, 82, 54, 218, 221, 18, 3, 211, 181, 214, 82, 54, 218, 221, 18, 3, + 196, 144, 214, 82, 54, 218, 221, 18, 3, 223, 46, 214, 82, 54, 218, 221, + 1, 53, 196, 12, 214, 82, 54, 218, 221, 1, 53, 214, 72, 214, 82, 54, 218, + 221, 1, 53, 215, 63, 214, 82, 54, 218, 221, 1, 53, 218, 170, 214, 82, 54, + 218, 221, 1, 53, 222, 154, 214, 82, 54, 218, 221, 1, 53, 238, 129, 214, + 82, 54, 218, 221, 1, 53, 250, 122, 214, 82, 54, 218, 221, 163, 217, 57, + 214, 82, 54, 218, 221, 163, 217, 56, 214, 82, 54, 218, 221, 17, 191, 77, + 214, 82, 54, 218, 221, 17, 107, 214, 82, 54, 218, 221, 17, 109, 214, 82, + 54, 218, 221, 17, 138, 214, 82, 54, 218, 221, 17, 134, 214, 82, 54, 218, + 221, 17, 150, 214, 82, 54, 218, 221, 17, 169, 214, 82, 54, 218, 221, 17, + 175, 214, 82, 54, 218, 221, 17, 171, 214, 82, 54, 218, 221, 17, 178, 214, + 82, 54, 218, 221, 128, 17, 107, 214, 82, 54, 218, 221, 3, 220, 109, 214, + 82, 54, 218, 221, 3, 220, 108, 95, 16, 210, 86, 95, 16, 215, 115, 221, + 60, 95, 16, 209, 148, 221, 60, 95, 16, 248, 243, 221, 60, 95, 16, 247, + 239, 221, 60, 95, 16, 208, 248, 221, 60, 95, 16, 208, 242, 221, 60, 95, + 16, 208, 240, 221, 60, 95, 16, 208, 246, 221, 60, 95, 16, 208, 244, 221, + 60, 95, 16, 237, 234, 221, 60, 95, 16, 237, 230, 221, 60, 95, 16, 237, + 229, 221, 60, 95, 16, 237, 232, 221, 60, 95, 16, 237, 231, 221, 60, 95, + 16, 237, 228, 221, 60, 95, 16, 197, 51, 95, 16, 215, 115, 206, 150, 95, + 16, 209, 148, 206, 150, 95, 16, 248, 243, 206, 150, 95, 16, 247, 239, + 206, 150, 95, 16, 208, 248, 206, 150, 95, 16, 208, 242, 206, 150, 95, 16, + 208, 240, 206, 150, 95, 16, 208, 246, 206, 150, 95, 16, 208, 244, 206, + 150, 95, 16, 237, 234, 206, 150, 95, 16, 237, 230, 206, 150, 95, 16, 237, + 229, 206, 150, 95, 16, 237, 232, 206, 150, 95, 16, 237, 231, 206, 150, + 95, 16, 237, 228, 206, 150, 248, 3, 1, 155, 248, 3, 1, 231, 242, 248, 3, + 1, 214, 70, 248, 3, 1, 214, 13, 248, 3, 1, 168, 248, 3, 1, 249, 155, 248, + 3, 1, 174, 248, 3, 1, 215, 168, 248, 3, 1, 190, 190, 248, 3, 1, 238, 34, + 248, 3, 1, 181, 248, 3, 1, 212, 246, 248, 3, 1, 247, 162, 248, 3, 1, 223, + 34, 248, 3, 1, 212, 103, 248, 3, 1, 212, 94, 248, 3, 1, 170, 248, 3, 1, + 165, 248, 3, 1, 173, 248, 3, 1, 195, 188, 248, 3, 1, 188, 248, 3, 1, 65, + 248, 3, 1, 140, 248, 3, 18, 3, 68, 248, 3, 18, 3, 66, 248, 3, 18, 3, 71, + 248, 3, 18, 3, 74, 248, 3, 18, 3, 252, 27, 248, 3, 210, 186, 248, 3, 234, + 97, 79, 205, 54, 54, 128, 1, 137, 155, 54, 128, 1, 137, 221, 217, 54, + 128, 1, 137, 220, 167, 54, 128, 1, 130, 155, 54, 128, 1, 130, 220, 167, + 54, 128, 1, 130, 221, 217, 54, 128, 1, 214, 70, 54, 128, 1, 137, 247, + 162, 54, 128, 1, 137, 247, 3, 54, 128, 1, 130, 247, 162, 54, 128, 1, 130, + 188, 54, 128, 1, 130, 247, 3, 54, 128, 1, 212, 103, 54, 128, 1, 207, 131, + 54, 128, 1, 137, 207, 129, 54, 128, 1, 238, 34, 54, 128, 1, 130, 207, + 129, 54, 128, 1, 207, 140, 54, 128, 1, 137, 190, 190, 54, 128, 1, 137, 199, 49, 54, 128, 1, 130, 190, 190, 54, 128, 1, 130, 199, 49, 54, 128, 1, - 180, 54, 128, 1, 249, 153, 54, 128, 1, 137, 168, 54, 128, 1, 137, 209, - 228, 54, 128, 1, 137, 233, 109, 54, 128, 1, 130, 168, 54, 128, 1, 130, - 233, 109, 54, 128, 1, 130, 209, 228, 54, 128, 1, 174, 54, 128, 1, 130, - 170, 54, 128, 1, 137, 170, 54, 128, 1, 165, 54, 128, 1, 206, 57, 54, 128, - 1, 173, 54, 128, 1, 218, 218, 54, 128, 1, 193, 190, 54, 128, 1, 137, 203, - 165, 54, 128, 1, 137, 201, 175, 54, 128, 1, 137, 188, 54, 128, 1, 137, - 140, 54, 128, 1, 219, 73, 54, 128, 1, 65, 54, 128, 1, 130, 140, 54, 128, - 1, 68, 54, 128, 1, 223, 199, 54, 128, 1, 66, 54, 128, 1, 196, 30, 54, - 128, 1, 234, 188, 54, 128, 1, 211, 87, 54, 128, 1, 220, 107, 54, 128, 1, - 230, 206, 188, 54, 128, 120, 3, 216, 217, 165, 54, 128, 120, 3, 216, 217, - 173, 54, 128, 120, 3, 220, 126, 199, 190, 220, 96, 54, 128, 3, 217, 113, - 222, 84, 220, 96, 54, 128, 120, 3, 53, 214, 68, 54, 128, 120, 3, 130, - 168, 54, 128, 120, 3, 137, 207, 128, 211, 57, 130, 168, 54, 128, 120, 3, - 174, 54, 128, 120, 3, 249, 153, 54, 128, 120, 3, 188, 54, 128, 3, 205, - 172, 54, 128, 18, 3, 65, 54, 128, 18, 3, 217, 113, 205, 122, 54, 128, 18, - 3, 252, 206, 54, 128, 18, 3, 199, 200, 252, 206, 54, 128, 18, 3, 68, 54, - 128, 18, 3, 223, 199, 54, 128, 18, 3, 196, 152, 54, 128, 18, 3, 196, 29, + 181, 54, 128, 1, 249, 155, 54, 128, 1, 137, 168, 54, 128, 1, 137, 209, + 230, 54, 128, 1, 137, 233, 111, 54, 128, 1, 130, 168, 54, 128, 1, 130, + 233, 111, 54, 128, 1, 130, 209, 230, 54, 128, 1, 174, 54, 128, 1, 130, + 170, 54, 128, 1, 137, 170, 54, 128, 1, 165, 54, 128, 1, 206, 58, 54, 128, + 1, 173, 54, 128, 1, 218, 220, 54, 128, 1, 193, 190, 54, 128, 1, 137, 203, + 166, 54, 128, 1, 137, 201, 176, 54, 128, 1, 137, 188, 54, 128, 1, 137, + 140, 54, 128, 1, 219, 75, 54, 128, 1, 65, 54, 128, 1, 130, 140, 54, 128, + 1, 68, 54, 128, 1, 223, 201, 54, 128, 1, 66, 54, 128, 1, 196, 30, 54, + 128, 1, 234, 190, 54, 128, 1, 211, 89, 54, 128, 1, 220, 109, 54, 128, 1, + 230, 208, 188, 54, 128, 120, 3, 216, 219, 165, 54, 128, 120, 3, 216, 219, + 173, 54, 128, 120, 3, 220, 128, 199, 190, 220, 98, 54, 128, 3, 217, 115, + 222, 86, 220, 98, 54, 128, 120, 3, 53, 214, 70, 54, 128, 120, 3, 130, + 168, 54, 128, 120, 3, 137, 207, 130, 211, 59, 130, 168, 54, 128, 120, 3, + 174, 54, 128, 120, 3, 249, 155, 54, 128, 120, 3, 188, 54, 128, 3, 205, + 173, 54, 128, 18, 3, 65, 54, 128, 18, 3, 217, 115, 205, 123, 54, 128, 18, + 3, 252, 208, 54, 128, 18, 3, 199, 200, 252, 208, 54, 128, 18, 3, 68, 54, + 128, 18, 3, 223, 201, 54, 128, 18, 3, 196, 152, 54, 128, 18, 3, 196, 29, 54, 128, 18, 3, 66, 54, 128, 18, 3, 196, 30, 54, 128, 18, 3, 74, 54, 128, - 18, 3, 211, 183, 60, 54, 128, 18, 3, 210, 242, 54, 128, 18, 3, 71, 54, - 128, 18, 3, 252, 25, 54, 128, 18, 3, 211, 87, 54, 128, 18, 3, 251, 236, - 54, 128, 18, 3, 128, 251, 236, 54, 128, 18, 3, 211, 183, 58, 54, 128, 3, - 217, 113, 222, 83, 54, 128, 3, 198, 78, 54, 128, 3, 198, 77, 54, 128, 3, - 221, 171, 198, 76, 54, 128, 3, 221, 171, 198, 75, 54, 128, 3, 221, 171, - 198, 74, 54, 128, 3, 207, 186, 230, 90, 54, 128, 3, 217, 113, 205, 152, - 54, 128, 3, 221, 170, 222, 64, 54, 128, 33, 238, 198, 236, 140, 54, 128, - 228, 243, 17, 191, 77, 54, 128, 228, 243, 17, 107, 54, 128, 228, 243, 17, - 109, 54, 128, 228, 243, 17, 138, 54, 128, 228, 243, 17, 134, 54, 128, - 228, 243, 17, 149, 54, 128, 228, 243, 17, 169, 54, 128, 228, 243, 17, - 175, 54, 128, 228, 243, 17, 171, 54, 128, 228, 243, 17, 178, 54, 128, + 18, 3, 211, 185, 60, 54, 128, 18, 3, 210, 244, 54, 128, 18, 3, 71, 54, + 128, 18, 3, 252, 27, 54, 128, 18, 3, 211, 89, 54, 128, 18, 3, 251, 238, + 54, 128, 18, 3, 128, 251, 238, 54, 128, 18, 3, 211, 185, 58, 54, 128, 3, + 217, 115, 222, 85, 54, 128, 3, 198, 78, 54, 128, 3, 198, 77, 54, 128, 3, + 221, 173, 198, 76, 54, 128, 3, 221, 173, 198, 75, 54, 128, 3, 221, 173, + 198, 74, 54, 128, 3, 207, 188, 230, 92, 54, 128, 3, 217, 115, 205, 153, + 54, 128, 3, 221, 172, 222, 66, 54, 128, 33, 238, 200, 236, 142, 54, 128, + 228, 245, 17, 191, 77, 54, 128, 228, 245, 17, 107, 54, 128, 228, 245, 17, + 109, 54, 128, 228, 245, 17, 138, 54, 128, 228, 245, 17, 134, 54, 128, + 228, 245, 17, 150, 54, 128, 228, 245, 17, 169, 54, 128, 228, 245, 17, + 175, 54, 128, 228, 245, 17, 171, 54, 128, 228, 245, 17, 178, 54, 128, 128, 17, 191, 77, 54, 128, 128, 17, 107, 54, 128, 128, 17, 109, 54, 128, - 128, 17, 138, 54, 128, 128, 17, 134, 54, 128, 128, 17, 149, 54, 128, 128, + 128, 17, 138, 54, 128, 128, 17, 134, 54, 128, 128, 17, 150, 54, 128, 128, 17, 169, 54, 128, 128, 17, 175, 54, 128, 128, 17, 171, 54, 128, 128, 17, - 178, 54, 128, 3, 193, 80, 54, 128, 3, 193, 79, 54, 128, 3, 205, 107, 54, - 128, 3, 221, 246, 54, 128, 3, 228, 170, 54, 128, 3, 236, 157, 54, 128, 3, - 207, 18, 206, 122, 207, 138, 54, 128, 3, 217, 113, 192, 109, 54, 128, 3, - 222, 120, 54, 128, 3, 222, 119, 54, 128, 3, 205, 117, 54, 128, 3, 205, - 116, 54, 128, 3, 230, 26, 54, 128, 3, 247, 157, 33, 235, 128, 243, 2, - 252, 60, 33, 237, 41, 33, 223, 139, 33, 235, 119, 57, 33, 197, 225, 236, - 140, 33, 192, 233, 60, 33, 193, 72, 219, 113, 60, 33, 211, 77, 87, 60, - 33, 55, 211, 77, 87, 60, 33, 156, 247, 23, 201, 28, 60, 33, 201, 14, 247, - 23, 201, 28, 60, 33, 210, 115, 58, 33, 55, 210, 115, 58, 33, 210, 115, - 60, 33, 210, 115, 210, 255, 33, 8, 2, 1, 193, 225, 60, 33, 8, 2, 1, 153, - 193, 225, 60, 33, 45, 210, 114, 93, 219, 224, 33, 50, 210, 114, 93, 183, - 33, 45, 210, 114, 248, 233, 219, 224, 33, 50, 210, 114, 248, 233, 183, - 33, 51, 248, 51, 58, 33, 31, 3, 58, 33, 223, 93, 55, 251, 15, 58, 33, + 178, 54, 128, 3, 193, 80, 54, 128, 3, 193, 79, 54, 128, 3, 205, 108, 54, + 128, 3, 221, 248, 54, 128, 3, 228, 172, 54, 128, 3, 236, 159, 54, 128, 3, + 207, 19, 206, 123, 207, 140, 54, 128, 3, 217, 115, 192, 109, 54, 128, 3, + 222, 122, 54, 128, 3, 222, 121, 54, 128, 3, 205, 118, 54, 128, 3, 205, + 117, 54, 128, 3, 230, 28, 54, 128, 3, 247, 159, 33, 235, 130, 243, 4, + 252, 62, 33, 237, 43, 33, 223, 141, 33, 235, 121, 57, 33, 197, 225, 236, + 142, 33, 192, 233, 60, 33, 193, 72, 219, 115, 60, 33, 211, 79, 87, 60, + 33, 55, 211, 79, 87, 60, 33, 156, 247, 25, 201, 29, 60, 33, 201, 15, 247, + 25, 201, 29, 60, 33, 210, 117, 58, 33, 55, 210, 117, 58, 33, 210, 117, + 60, 33, 210, 117, 211, 1, 33, 8, 2, 1, 193, 225, 60, 33, 8, 2, 1, 154, + 193, 225, 60, 33, 45, 210, 116, 93, 219, 226, 33, 50, 210, 116, 93, 179, + 33, 45, 210, 116, 248, 235, 219, 226, 33, 50, 210, 116, 248, 235, 179, + 33, 51, 248, 53, 58, 33, 31, 3, 58, 33, 223, 95, 55, 251, 17, 58, 33, 108, 3, 58, 33, 55, 108, 3, 58, 33, 55, 108, 3, 60, 33, 197, 225, 252, - 47, 252, 60, 33, 8, 2, 1, 223, 115, 232, 51, 33, 8, 2, 1, 223, 115, 146, - 33, 8, 2, 1, 223, 115, 200, 43, 148, 3, 196, 123, 206, 244, 148, 3, 196, - 123, 247, 121, 148, 3, 247, 38, 148, 3, 200, 173, 148, 3, 248, 155, 148, - 1, 251, 214, 148, 1, 251, 215, 199, 123, 148, 1, 223, 194, 148, 1, 223, - 195, 199, 123, 148, 1, 196, 126, 148, 1, 196, 127, 199, 123, 148, 1, 207, - 186, 207, 51, 148, 1, 207, 186, 207, 52, 199, 123, 148, 1, 220, 126, 219, - 199, 148, 1, 220, 126, 219, 200, 199, 123, 148, 1, 234, 145, 148, 1, 251, - 233, 148, 1, 211, 123, 148, 1, 211, 124, 199, 123, 148, 1, 155, 148, 1, - 222, 142, 217, 116, 148, 1, 231, 240, 148, 1, 231, 241, 230, 241, 148, 1, - 214, 68, 148, 1, 247, 160, 148, 1, 247, 161, 220, 112, 148, 1, 223, 32, - 148, 1, 223, 33, 223, 0, 148, 1, 212, 101, 148, 1, 199, 252, 220, 2, 148, - 1, 199, 252, 215, 108, 217, 116, 148, 1, 238, 33, 215, 108, 251, 162, - 148, 1, 238, 33, 215, 108, 217, 116, 148, 1, 215, 7, 207, 141, 148, 1, - 190, 190, 148, 1, 199, 252, 199, 158, 148, 1, 238, 32, 148, 1, 238, 33, - 217, 138, 148, 1, 180, 148, 1, 168, 148, 1, 210, 221, 222, 76, 148, 1, - 249, 153, 148, 1, 249, 154, 222, 2, 148, 1, 174, 148, 1, 170, 148, 1, - 165, 148, 1, 173, 148, 1, 193, 190, 148, 1, 205, 207, 205, 184, 148, 1, - 205, 207, 205, 129, 148, 1, 188, 148, 1, 140, 148, 3, 207, 41, 148, 18, - 3, 199, 123, 148, 18, 3, 196, 122, 148, 18, 3, 196, 123, 205, 125, 148, - 18, 3, 200, 208, 148, 18, 3, 200, 209, 223, 185, 148, 18, 3, 207, 186, - 207, 51, 148, 18, 3, 207, 186, 207, 52, 199, 123, 148, 18, 3, 220, 126, - 219, 199, 148, 18, 3, 220, 126, 219, 200, 199, 123, 148, 18, 3, 199, 201, - 148, 18, 3, 199, 202, 207, 51, 148, 18, 3, 199, 202, 199, 123, 148, 18, - 3, 199, 202, 207, 52, 199, 123, 148, 18, 3, 210, 16, 148, 18, 3, 210, 17, - 199, 123, 148, 252, 37, 252, 36, 148, 1, 222, 107, 205, 124, 148, 1, 221, - 177, 205, 124, 148, 1, 196, 235, 205, 124, 148, 1, 234, 182, 205, 124, - 148, 1, 195, 154, 205, 124, 148, 1, 191, 109, 205, 124, 148, 1, 250, 185, - 205, 124, 148, 1, 251, 14, 222, 202, 148, 17, 191, 77, 148, 17, 107, 148, - 17, 109, 148, 17, 138, 148, 17, 134, 148, 17, 149, 148, 17, 169, 148, 17, - 175, 148, 17, 171, 148, 17, 178, 148, 210, 145, 148, 210, 175, 148, 193, - 64, 148, 247, 94, 210, 168, 148, 247, 94, 202, 190, 148, 247, 94, 210, - 112, 148, 210, 174, 148, 37, 16, 236, 148, 148, 37, 16, 237, 102, 148, - 37, 16, 235, 71, 148, 37, 16, 237, 236, 148, 37, 16, 237, 237, 200, 173, - 148, 37, 16, 236, 242, 148, 37, 16, 238, 24, 148, 37, 16, 237, 77, 148, - 37, 16, 238, 6, 148, 37, 16, 237, 237, 231, 159, 148, 37, 16, 33, 199, - 116, 148, 37, 16, 33, 234, 92, 148, 37, 16, 33, 221, 253, 148, 37, 16, - 33, 221, 255, 148, 37, 16, 33, 223, 5, 148, 37, 16, 33, 221, 254, 4, 223, - 5, 148, 37, 16, 33, 222, 0, 4, 223, 5, 148, 37, 16, 33, 248, 226, 148, - 37, 16, 33, 230, 247, 148, 37, 16, 206, 206, 211, 77, 235, 82, 148, 37, - 16, 206, 206, 211, 77, 238, 22, 148, 37, 16, 206, 206, 242, 219, 197, 80, - 148, 37, 16, 206, 206, 242, 219, 199, 211, 148, 37, 16, 219, 222, 211, - 77, 210, 160, 148, 37, 16, 219, 222, 211, 77, 208, 149, 148, 37, 16, 219, - 222, 242, 219, 209, 104, 148, 37, 16, 219, 222, 242, 219, 209, 86, 148, - 37, 16, 219, 222, 211, 77, 209, 132, 148, 210, 146, 220, 19, 148, 210, - 176, 220, 19, 200, 197, 3, 210, 142, 200, 197, 3, 210, 156, 200, 197, 3, - 210, 152, 200, 197, 1, 65, 200, 197, 1, 68, 200, 197, 1, 66, 200, 197, 1, - 252, 25, 200, 197, 1, 74, 200, 197, 1, 71, 200, 197, 1, 233, 242, 200, - 197, 1, 155, 200, 197, 1, 208, 96, 200, 197, 1, 231, 240, 200, 197, 1, - 214, 68, 200, 197, 1, 247, 160, 200, 197, 1, 223, 32, 200, 197, 1, 191, - 123, 200, 197, 1, 212, 101, 200, 197, 1, 190, 190, 200, 197, 1, 238, 32, - 200, 197, 1, 180, 200, 197, 1, 168, 200, 197, 1, 233, 109, 200, 197, 1, - 195, 188, 200, 197, 1, 249, 153, 200, 197, 1, 174, 200, 197, 1, 170, 200, + 49, 252, 62, 33, 8, 2, 1, 223, 117, 232, 53, 33, 8, 2, 1, 223, 117, 146, + 33, 8, 2, 1, 223, 117, 200, 43, 149, 3, 196, 123, 206, 245, 149, 3, 196, + 123, 247, 123, 149, 3, 247, 40, 149, 3, 200, 173, 149, 3, 248, 157, 149, + 1, 251, 216, 149, 1, 251, 217, 199, 123, 149, 1, 223, 196, 149, 1, 223, + 197, 199, 123, 149, 1, 196, 126, 149, 1, 196, 127, 199, 123, 149, 1, 207, + 188, 207, 52, 149, 1, 207, 188, 207, 53, 199, 123, 149, 1, 220, 128, 219, + 201, 149, 1, 220, 128, 219, 202, 199, 123, 149, 1, 234, 147, 149, 1, 251, + 235, 149, 1, 211, 125, 149, 1, 211, 126, 199, 123, 149, 1, 155, 149, 1, + 222, 144, 217, 118, 149, 1, 231, 242, 149, 1, 231, 243, 230, 243, 149, 1, + 214, 70, 149, 1, 247, 162, 149, 1, 247, 163, 220, 114, 149, 1, 223, 34, + 149, 1, 223, 35, 223, 2, 149, 1, 212, 103, 149, 1, 199, 252, 220, 4, 149, + 1, 199, 252, 215, 110, 217, 118, 149, 1, 238, 35, 215, 110, 251, 164, + 149, 1, 238, 35, 215, 110, 217, 118, 149, 1, 215, 9, 207, 143, 149, 1, + 190, 190, 149, 1, 199, 252, 199, 158, 149, 1, 238, 34, 149, 1, 238, 35, + 217, 140, 149, 1, 181, 149, 1, 168, 149, 1, 210, 223, 222, 78, 149, 1, + 249, 155, 149, 1, 249, 156, 222, 4, 149, 1, 174, 149, 1, 170, 149, 1, + 165, 149, 1, 173, 149, 1, 193, 190, 149, 1, 205, 208, 205, 185, 149, 1, + 205, 208, 205, 130, 149, 1, 188, 149, 1, 140, 149, 3, 207, 42, 149, 18, + 3, 199, 123, 149, 18, 3, 196, 122, 149, 18, 3, 196, 123, 205, 126, 149, + 18, 3, 200, 208, 149, 18, 3, 200, 209, 223, 187, 149, 18, 3, 207, 188, + 207, 52, 149, 18, 3, 207, 188, 207, 53, 199, 123, 149, 18, 3, 220, 128, + 219, 201, 149, 18, 3, 220, 128, 219, 202, 199, 123, 149, 18, 3, 199, 201, + 149, 18, 3, 199, 202, 207, 52, 149, 18, 3, 199, 202, 199, 123, 149, 18, + 3, 199, 202, 207, 53, 199, 123, 149, 18, 3, 210, 18, 149, 18, 3, 210, 19, + 199, 123, 149, 252, 39, 252, 38, 149, 1, 222, 109, 205, 125, 149, 1, 221, + 179, 205, 125, 149, 1, 196, 235, 205, 125, 149, 1, 234, 184, 205, 125, + 149, 1, 195, 154, 205, 125, 149, 1, 191, 109, 205, 125, 149, 1, 250, 187, + 205, 125, 149, 1, 251, 16, 222, 204, 149, 17, 191, 77, 149, 17, 107, 149, + 17, 109, 149, 17, 138, 149, 17, 134, 149, 17, 150, 149, 17, 169, 149, 17, + 175, 149, 17, 171, 149, 17, 178, 149, 210, 147, 149, 210, 177, 149, 193, + 64, 149, 247, 96, 210, 170, 149, 247, 96, 202, 191, 149, 247, 96, 210, + 114, 149, 210, 176, 149, 37, 16, 236, 150, 149, 37, 16, 237, 104, 149, + 37, 16, 235, 73, 149, 37, 16, 237, 238, 149, 37, 16, 237, 239, 200, 173, + 149, 37, 16, 236, 244, 149, 37, 16, 238, 26, 149, 37, 16, 237, 79, 149, + 37, 16, 238, 8, 149, 37, 16, 237, 239, 231, 161, 149, 37, 16, 33, 199, + 116, 149, 37, 16, 33, 234, 94, 149, 37, 16, 33, 221, 255, 149, 37, 16, + 33, 222, 1, 149, 37, 16, 33, 223, 7, 149, 37, 16, 33, 222, 0, 4, 223, 7, + 149, 37, 16, 33, 222, 2, 4, 223, 7, 149, 37, 16, 33, 248, 228, 149, 37, + 16, 33, 230, 249, 149, 37, 16, 206, 207, 211, 79, 235, 84, 149, 37, 16, + 206, 207, 211, 79, 238, 24, 149, 37, 16, 206, 207, 242, 221, 197, 80, + 149, 37, 16, 206, 207, 242, 221, 199, 211, 149, 37, 16, 219, 224, 211, + 79, 210, 162, 149, 37, 16, 219, 224, 211, 79, 208, 151, 149, 37, 16, 219, + 224, 242, 221, 209, 106, 149, 37, 16, 219, 224, 242, 221, 209, 88, 149, + 37, 16, 219, 224, 211, 79, 209, 134, 149, 210, 148, 220, 21, 149, 210, + 178, 220, 21, 200, 197, 3, 210, 144, 200, 197, 3, 210, 158, 200, 197, 3, + 210, 154, 200, 197, 1, 65, 200, 197, 1, 68, 200, 197, 1, 66, 200, 197, 1, + 252, 27, 200, 197, 1, 74, 200, 197, 1, 71, 200, 197, 1, 233, 244, 200, + 197, 1, 155, 200, 197, 1, 208, 98, 200, 197, 1, 231, 242, 200, 197, 1, + 214, 70, 200, 197, 1, 247, 162, 200, 197, 1, 223, 34, 200, 197, 1, 191, + 123, 200, 197, 1, 212, 103, 200, 197, 1, 190, 190, 200, 197, 1, 238, 34, + 200, 197, 1, 181, 200, 197, 1, 168, 200, 197, 1, 233, 111, 200, 197, 1, + 195, 188, 200, 197, 1, 249, 155, 200, 197, 1, 174, 200, 197, 1, 170, 200, 197, 1, 165, 200, 197, 1, 173, 200, 197, 1, 193, 190, 200, 197, 1, 188, - 200, 197, 1, 192, 220, 200, 197, 1, 140, 200, 197, 120, 3, 210, 172, 200, - 197, 120, 3, 210, 144, 200, 197, 120, 3, 210, 141, 200, 197, 18, 3, 210, - 159, 200, 197, 18, 3, 210, 140, 200, 197, 18, 3, 210, 165, 200, 197, 18, - 3, 210, 151, 200, 197, 18, 3, 210, 173, 200, 197, 18, 3, 210, 161, 200, - 197, 3, 210, 177, 200, 197, 3, 195, 40, 200, 197, 120, 3, 210, 100, 174, - 200, 197, 120, 3, 210, 100, 193, 190, 200, 197, 1, 221, 215, 200, 197, 1, + 200, 197, 1, 192, 220, 200, 197, 1, 140, 200, 197, 120, 3, 210, 174, 200, + 197, 120, 3, 210, 146, 200, 197, 120, 3, 210, 143, 200, 197, 18, 3, 210, + 161, 200, 197, 18, 3, 210, 142, 200, 197, 18, 3, 210, 167, 200, 197, 18, + 3, 210, 153, 200, 197, 18, 3, 210, 175, 200, 197, 18, 3, 210, 163, 200, + 197, 3, 210, 179, 200, 197, 3, 195, 40, 200, 197, 120, 3, 210, 102, 174, + 200, 197, 120, 3, 210, 102, 193, 190, 200, 197, 1, 221, 217, 200, 197, 1, 200, 126, 200, 197, 17, 191, 77, 200, 197, 17, 107, 200, 197, 17, 109, - 200, 197, 17, 138, 200, 197, 17, 134, 200, 197, 17, 149, 200, 197, 17, + 200, 197, 17, 138, 200, 197, 17, 134, 200, 197, 17, 150, 200, 197, 17, 169, 200, 197, 17, 175, 200, 197, 17, 171, 200, 197, 17, 178, 200, 197, - 250, 145, 200, 197, 1, 207, 21, 200, 197, 1, 219, 172, 200, 197, 1, 248, - 203, 200, 197, 1, 53, 222, 152, 200, 197, 1, 53, 218, 168, 249, 63, 1, - 65, 249, 63, 1, 202, 182, 65, 249, 63, 1, 140, 249, 63, 1, 202, 182, 140, - 249, 63, 1, 217, 85, 140, 249, 63, 1, 249, 153, 249, 63, 1, 222, 61, 249, - 153, 249, 63, 1, 168, 249, 63, 1, 202, 182, 168, 249, 63, 1, 180, 249, - 63, 1, 217, 85, 180, 249, 63, 1, 193, 190, 249, 63, 1, 202, 182, 193, - 190, 249, 63, 1, 210, 193, 193, 190, 249, 63, 1, 231, 240, 249, 63, 1, - 202, 182, 231, 240, 249, 63, 1, 223, 32, 249, 63, 1, 238, 32, 249, 63, 1, - 165, 249, 63, 1, 202, 182, 165, 249, 63, 1, 174, 249, 63, 1, 202, 182, - 174, 249, 63, 1, 202, 0, 190, 190, 249, 63, 1, 213, 16, 190, 190, 249, - 63, 1, 188, 249, 63, 1, 202, 182, 188, 249, 63, 1, 217, 85, 188, 249, 63, - 1, 170, 249, 63, 1, 202, 182, 170, 249, 63, 1, 214, 68, 249, 63, 1, 173, - 249, 63, 1, 202, 182, 173, 249, 63, 1, 212, 101, 249, 63, 1, 247, 160, - 249, 63, 1, 214, 162, 249, 63, 1, 217, 11, 249, 63, 1, 68, 249, 63, 1, - 66, 249, 63, 3, 198, 82, 249, 63, 18, 3, 71, 249, 63, 18, 3, 210, 193, - 71, 249, 63, 18, 3, 234, 188, 249, 63, 18, 3, 68, 249, 63, 18, 3, 222, - 61, 68, 249, 63, 18, 3, 74, 249, 63, 18, 3, 222, 61, 74, 249, 63, 18, 3, - 66, 249, 63, 18, 3, 126, 40, 202, 182, 188, 249, 63, 120, 3, 214, 70, - 249, 63, 120, 3, 230, 116, 249, 63, 210, 154, 249, 63, 210, 150, 249, 63, - 16, 248, 165, 215, 7, 216, 163, 249, 63, 16, 248, 165, 209, 138, 249, 63, - 16, 248, 165, 222, 179, 249, 63, 16, 248, 165, 210, 154, 219, 183, 1, - 155, 219, 183, 1, 221, 94, 219, 183, 1, 221, 215, 219, 183, 1, 231, 240, - 219, 183, 1, 231, 19, 219, 183, 1, 214, 68, 219, 183, 1, 247, 160, 219, - 183, 1, 247, 1, 219, 183, 1, 223, 32, 219, 183, 1, 212, 101, 219, 183, 1, - 190, 190, 219, 183, 1, 199, 49, 219, 183, 1, 238, 32, 219, 183, 1, 180, - 219, 183, 1, 168, 219, 183, 1, 209, 110, 219, 183, 1, 209, 228, 219, 183, - 1, 233, 109, 219, 183, 1, 232, 219, 219, 183, 1, 249, 153, 219, 183, 1, - 248, 140, 219, 183, 1, 174, 219, 183, 1, 216, 19, 219, 183, 1, 197, 168, - 219, 183, 1, 197, 157, 219, 183, 1, 235, 35, 219, 183, 1, 170, 219, 183, - 1, 165, 219, 183, 1, 173, 219, 183, 1, 140, 219, 183, 1, 229, 111, 219, - 183, 1, 195, 188, 219, 183, 1, 188, 219, 183, 1, 203, 165, 219, 183, 1, - 193, 190, 219, 183, 1, 65, 219, 183, 200, 239, 1, 170, 219, 183, 200, - 239, 1, 165, 219, 183, 18, 3, 252, 206, 219, 183, 18, 3, 68, 219, 183, - 18, 3, 74, 219, 183, 18, 3, 211, 87, 219, 183, 18, 3, 66, 219, 183, 18, - 3, 196, 30, 219, 183, 18, 3, 71, 219, 183, 120, 3, 222, 152, 219, 183, - 120, 3, 218, 168, 219, 183, 120, 3, 172, 219, 183, 120, 3, 215, 61, 219, - 183, 120, 3, 210, 236, 219, 183, 120, 3, 146, 219, 183, 120, 3, 200, 43, - 219, 183, 120, 3, 212, 73, 219, 183, 120, 3, 222, 83, 219, 183, 3, 207, - 139, 219, 183, 3, 212, 141, 219, 183, 208, 152, 199, 247, 219, 183, 208, - 152, 212, 85, 198, 196, 199, 247, 219, 183, 208, 152, 247, 10, 219, 183, - 208, 152, 197, 149, 247, 10, 219, 183, 208, 152, 197, 148, 219, 183, 17, - 191, 77, 219, 183, 17, 107, 219, 183, 17, 109, 219, 183, 17, 138, 219, - 183, 17, 134, 219, 183, 17, 149, 219, 183, 17, 169, 219, 183, 17, 175, - 219, 183, 17, 171, 219, 183, 17, 178, 219, 183, 1, 197, 132, 219, 183, 1, - 197, 120, 219, 183, 1, 237, 191, 211, 121, 243, 88, 17, 191, 77, 211, - 121, 243, 88, 17, 107, 211, 121, 243, 88, 17, 109, 211, 121, 243, 88, 17, - 138, 211, 121, 243, 88, 17, 134, 211, 121, 243, 88, 17, 149, 211, 121, - 243, 88, 17, 169, 211, 121, 243, 88, 17, 175, 211, 121, 243, 88, 17, 171, - 211, 121, 243, 88, 17, 178, 211, 121, 243, 88, 1, 173, 211, 121, 243, 88, - 1, 250, 182, 211, 121, 243, 88, 1, 251, 253, 211, 121, 243, 88, 1, 251, - 122, 211, 121, 243, 88, 1, 251, 207, 211, 121, 243, 88, 1, 220, 125, 211, - 121, 243, 88, 1, 252, 168, 211, 121, 243, 88, 1, 252, 169, 211, 121, 243, - 88, 1, 252, 167, 211, 121, 243, 88, 1, 252, 161, 211, 121, 243, 88, 1, - 219, 146, 211, 121, 243, 88, 1, 223, 68, 211, 121, 243, 88, 1, 223, 200, - 211, 121, 243, 88, 1, 223, 90, 211, 121, 243, 88, 1, 223, 77, 211, 121, - 243, 88, 1, 218, 225, 211, 121, 243, 88, 1, 196, 160, 211, 121, 243, 88, - 1, 196, 158, 211, 121, 243, 88, 1, 196, 83, 211, 121, 243, 88, 1, 196, - 21, 211, 121, 243, 88, 1, 219, 238, 211, 121, 243, 88, 1, 234, 56, 211, - 121, 243, 88, 1, 234, 191, 211, 121, 243, 88, 1, 234, 103, 211, 121, 243, - 88, 1, 234, 26, 211, 121, 243, 88, 1, 219, 43, 211, 121, 243, 88, 1, 211, - 24, 211, 121, 243, 88, 1, 211, 178, 211, 121, 243, 88, 1, 211, 9, 211, - 121, 243, 88, 1, 211, 136, 211, 121, 243, 88, 215, 156, 197, 97, 211, - 121, 243, 88, 231, 235, 197, 98, 211, 121, 243, 88, 215, 150, 197, 98, - 211, 121, 243, 88, 207, 66, 211, 121, 243, 88, 209, 226, 211, 121, 243, - 88, 251, 244, 211, 121, 243, 88, 208, 152, 215, 146, 211, 121, 243, 88, - 208, 152, 55, 215, 146, 38, 2, 1, 206, 113, 195, 153, 38, 2, 1, 219, 12, - 237, 146, 38, 2, 1, 214, 215, 74, 38, 2, 1, 193, 78, 234, 22, 38, 2, 1, + 250, 147, 200, 197, 1, 207, 22, 200, 197, 1, 219, 174, 200, 197, 1, 248, + 205, 200, 197, 1, 53, 222, 154, 200, 197, 1, 53, 218, 170, 249, 65, 1, + 65, 249, 65, 1, 202, 183, 65, 249, 65, 1, 140, 249, 65, 1, 202, 183, 140, + 249, 65, 1, 217, 87, 140, 249, 65, 1, 249, 155, 249, 65, 1, 222, 63, 249, + 155, 249, 65, 1, 168, 249, 65, 1, 202, 183, 168, 249, 65, 1, 181, 249, + 65, 1, 217, 87, 181, 249, 65, 1, 193, 190, 249, 65, 1, 202, 183, 193, + 190, 249, 65, 1, 210, 195, 193, 190, 249, 65, 1, 231, 242, 249, 65, 1, + 202, 183, 231, 242, 249, 65, 1, 223, 34, 249, 65, 1, 238, 34, 249, 65, 1, + 165, 249, 65, 1, 202, 183, 165, 249, 65, 1, 174, 249, 65, 1, 202, 183, + 174, 249, 65, 1, 202, 1, 190, 190, 249, 65, 1, 213, 18, 190, 190, 249, + 65, 1, 188, 249, 65, 1, 202, 183, 188, 249, 65, 1, 217, 87, 188, 249, 65, + 1, 170, 249, 65, 1, 202, 183, 170, 249, 65, 1, 214, 70, 249, 65, 1, 173, + 249, 65, 1, 202, 183, 173, 249, 65, 1, 212, 103, 249, 65, 1, 247, 162, + 249, 65, 1, 214, 164, 249, 65, 1, 217, 13, 249, 65, 1, 68, 249, 65, 1, + 66, 249, 65, 3, 198, 82, 249, 65, 18, 3, 71, 249, 65, 18, 3, 210, 195, + 71, 249, 65, 18, 3, 234, 190, 249, 65, 18, 3, 68, 249, 65, 18, 3, 222, + 63, 68, 249, 65, 18, 3, 74, 249, 65, 18, 3, 222, 63, 74, 249, 65, 18, 3, + 66, 249, 65, 18, 3, 126, 40, 202, 183, 188, 249, 65, 120, 3, 214, 72, + 249, 65, 120, 3, 230, 118, 249, 65, 210, 156, 249, 65, 210, 152, 249, 65, + 16, 248, 167, 215, 9, 216, 165, 249, 65, 16, 248, 167, 209, 140, 249, 65, + 16, 248, 167, 222, 181, 249, 65, 16, 248, 167, 210, 156, 219, 185, 1, + 155, 219, 185, 1, 221, 96, 219, 185, 1, 221, 217, 219, 185, 1, 231, 242, + 219, 185, 1, 231, 21, 219, 185, 1, 214, 70, 219, 185, 1, 247, 162, 219, + 185, 1, 247, 3, 219, 185, 1, 223, 34, 219, 185, 1, 212, 103, 219, 185, 1, + 190, 190, 219, 185, 1, 199, 49, 219, 185, 1, 238, 34, 219, 185, 1, 181, + 219, 185, 1, 168, 219, 185, 1, 209, 112, 219, 185, 1, 209, 230, 219, 185, + 1, 233, 111, 219, 185, 1, 232, 221, 219, 185, 1, 249, 155, 219, 185, 1, + 248, 142, 219, 185, 1, 174, 219, 185, 1, 216, 21, 219, 185, 1, 197, 168, + 219, 185, 1, 197, 157, 219, 185, 1, 235, 37, 219, 185, 1, 170, 219, 185, + 1, 165, 219, 185, 1, 173, 219, 185, 1, 140, 219, 185, 1, 229, 113, 219, + 185, 1, 195, 188, 219, 185, 1, 188, 219, 185, 1, 203, 166, 219, 185, 1, + 193, 190, 219, 185, 1, 65, 219, 185, 200, 240, 1, 170, 219, 185, 200, + 240, 1, 165, 219, 185, 18, 3, 252, 208, 219, 185, 18, 3, 68, 219, 185, + 18, 3, 74, 219, 185, 18, 3, 211, 89, 219, 185, 18, 3, 66, 219, 185, 18, + 3, 196, 30, 219, 185, 18, 3, 71, 219, 185, 120, 3, 222, 154, 219, 185, + 120, 3, 218, 170, 219, 185, 120, 3, 172, 219, 185, 120, 3, 215, 63, 219, + 185, 120, 3, 210, 238, 219, 185, 120, 3, 146, 219, 185, 120, 3, 200, 43, + 219, 185, 120, 3, 212, 75, 219, 185, 120, 3, 222, 85, 219, 185, 3, 207, + 141, 219, 185, 3, 212, 143, 219, 185, 208, 154, 199, 247, 219, 185, 208, + 154, 212, 87, 198, 196, 199, 247, 219, 185, 208, 154, 247, 12, 219, 185, + 208, 154, 197, 149, 247, 12, 219, 185, 208, 154, 197, 148, 219, 185, 17, + 191, 77, 219, 185, 17, 107, 219, 185, 17, 109, 219, 185, 17, 138, 219, + 185, 17, 134, 219, 185, 17, 150, 219, 185, 17, 169, 219, 185, 17, 175, + 219, 185, 17, 171, 219, 185, 17, 178, 219, 185, 1, 197, 132, 219, 185, 1, + 197, 120, 219, 185, 1, 237, 193, 211, 123, 243, 90, 17, 191, 77, 211, + 123, 243, 90, 17, 107, 211, 123, 243, 90, 17, 109, 211, 123, 243, 90, 17, + 138, 211, 123, 243, 90, 17, 134, 211, 123, 243, 90, 17, 150, 211, 123, + 243, 90, 17, 169, 211, 123, 243, 90, 17, 175, 211, 123, 243, 90, 17, 171, + 211, 123, 243, 90, 17, 178, 211, 123, 243, 90, 1, 173, 211, 123, 243, 90, + 1, 250, 184, 211, 123, 243, 90, 1, 251, 255, 211, 123, 243, 90, 1, 251, + 124, 211, 123, 243, 90, 1, 251, 209, 211, 123, 243, 90, 1, 220, 127, 211, + 123, 243, 90, 1, 252, 170, 211, 123, 243, 90, 1, 252, 171, 211, 123, 243, + 90, 1, 252, 169, 211, 123, 243, 90, 1, 252, 163, 211, 123, 243, 90, 1, + 219, 148, 211, 123, 243, 90, 1, 223, 70, 211, 123, 243, 90, 1, 223, 202, + 211, 123, 243, 90, 1, 223, 92, 211, 123, 243, 90, 1, 223, 79, 211, 123, + 243, 90, 1, 218, 227, 211, 123, 243, 90, 1, 196, 160, 211, 123, 243, 90, + 1, 196, 158, 211, 123, 243, 90, 1, 196, 83, 211, 123, 243, 90, 1, 196, + 21, 211, 123, 243, 90, 1, 219, 240, 211, 123, 243, 90, 1, 234, 58, 211, + 123, 243, 90, 1, 234, 193, 211, 123, 243, 90, 1, 234, 105, 211, 123, 243, + 90, 1, 234, 28, 211, 123, 243, 90, 1, 219, 45, 211, 123, 243, 90, 1, 211, + 26, 211, 123, 243, 90, 1, 211, 180, 211, 123, 243, 90, 1, 211, 11, 211, + 123, 243, 90, 1, 211, 138, 211, 123, 243, 90, 215, 158, 197, 97, 211, + 123, 243, 90, 231, 237, 197, 98, 211, 123, 243, 90, 215, 152, 197, 98, + 211, 123, 243, 90, 207, 67, 211, 123, 243, 90, 209, 228, 211, 123, 243, + 90, 251, 246, 211, 123, 243, 90, 208, 154, 215, 148, 211, 123, 243, 90, + 208, 154, 55, 215, 148, 38, 2, 1, 206, 114, 195, 153, 38, 2, 1, 219, 14, + 237, 148, 38, 2, 1, 214, 217, 74, 38, 2, 1, 193, 78, 234, 24, 38, 2, 1, 199, 200, 199, 145, 38, 2, 1, 198, 221, 199, 145, 38, 2, 1, 199, 200, - 230, 17, 56, 38, 2, 1, 199, 200, 192, 95, 38, 2, 1, 196, 108, 196, 128, - 101, 215, 157, 6, 1, 251, 132, 101, 215, 157, 6, 1, 249, 101, 101, 215, - 157, 6, 1, 231, 210, 101, 215, 157, 6, 1, 236, 150, 101, 215, 157, 6, 1, - 234, 103, 101, 215, 157, 6, 1, 195, 49, 101, 215, 157, 6, 1, 191, 80, - 101, 215, 157, 6, 1, 199, 193, 101, 215, 157, 6, 1, 223, 162, 101, 215, - 157, 6, 1, 222, 87, 101, 215, 157, 6, 1, 220, 7, 101, 215, 157, 6, 1, - 217, 90, 101, 215, 157, 6, 1, 214, 216, 101, 215, 157, 6, 1, 211, 104, - 101, 215, 157, 6, 1, 210, 131, 101, 215, 157, 6, 1, 191, 67, 101, 215, - 157, 6, 1, 207, 163, 101, 215, 157, 6, 1, 205, 142, 101, 215, 157, 6, 1, - 199, 179, 101, 215, 157, 6, 1, 196, 113, 101, 215, 157, 6, 1, 209, 220, - 101, 215, 157, 6, 1, 221, 200, 101, 215, 157, 6, 1, 231, 82, 101, 215, - 157, 6, 1, 208, 81, 101, 215, 157, 6, 1, 203, 69, 101, 215, 157, 6, 1, - 243, 81, 101, 215, 157, 6, 1, 247, 128, 101, 215, 157, 6, 1, 222, 234, - 101, 215, 157, 6, 1, 243, 18, 101, 215, 157, 6, 1, 246, 241, 101, 215, - 157, 6, 1, 192, 218, 101, 215, 157, 6, 1, 222, 249, 101, 215, 157, 6, 1, - 230, 87, 101, 215, 157, 6, 1, 229, 245, 101, 215, 157, 6, 1, 229, 145, - 101, 215, 157, 6, 1, 193, 125, 101, 215, 157, 6, 1, 230, 19, 101, 215, - 157, 6, 1, 229, 11, 101, 215, 157, 6, 1, 233, 23, 101, 215, 157, 6, 1, - 192, 14, 101, 215, 157, 6, 1, 234, 123, 101, 215, 157, 6, 1, 153, 231, - 210, 101, 215, 157, 6, 1, 251, 230, 101, 215, 157, 6, 1, 252, 14, 101, - 215, 157, 6, 1, 230, 17, 56, 101, 215, 157, 6, 1, 220, 116, 56, 200, 197, - 208, 152, 248, 165, 200, 166, 200, 197, 208, 152, 248, 165, 210, 155, - 200, 197, 208, 152, 248, 165, 208, 139, 200, 197, 208, 152, 248, 165, - 247, 145, 200, 197, 208, 152, 248, 165, 219, 173, 205, 121, 200, 197, - 208, 152, 248, 165, 222, 142, 205, 121, 200, 197, 208, 152, 248, 165, - 238, 33, 205, 121, 200, 197, 208, 152, 248, 165, 249, 154, 205, 121, 195, - 150, 163, 222, 57, 195, 150, 163, 203, 130, 195, 150, 163, 208, 225, 195, - 150, 3, 213, 187, 195, 150, 3, 192, 117, 216, 82, 200, 156, 195, 150, - 163, 192, 117, 251, 249, 223, 149, 200, 156, 195, 150, 163, 192, 117, - 223, 149, 200, 156, 195, 150, 163, 192, 117, 222, 45, 223, 149, 200, 156, - 195, 150, 163, 247, 122, 60, 195, 150, 163, 192, 117, 222, 45, 223, 149, - 200, 157, 205, 88, 195, 150, 163, 55, 200, 156, 195, 150, 163, 197, 225, - 200, 156, 195, 150, 163, 222, 45, 251, 73, 195, 150, 163, 75, 60, 195, + 230, 19, 56, 38, 2, 1, 199, 200, 192, 95, 38, 2, 1, 196, 108, 196, 128, + 101, 215, 159, 6, 1, 251, 134, 101, 215, 159, 6, 1, 249, 103, 101, 215, + 159, 6, 1, 231, 212, 101, 215, 159, 6, 1, 236, 152, 101, 215, 159, 6, 1, + 234, 105, 101, 215, 159, 6, 1, 195, 49, 101, 215, 159, 6, 1, 191, 80, + 101, 215, 159, 6, 1, 199, 193, 101, 215, 159, 6, 1, 223, 164, 101, 215, + 159, 6, 1, 222, 89, 101, 215, 159, 6, 1, 220, 9, 101, 215, 159, 6, 1, + 217, 92, 101, 215, 159, 6, 1, 214, 218, 101, 215, 159, 6, 1, 211, 106, + 101, 215, 159, 6, 1, 210, 133, 101, 215, 159, 6, 1, 191, 67, 101, 215, + 159, 6, 1, 207, 165, 101, 215, 159, 6, 1, 205, 143, 101, 215, 159, 6, 1, + 199, 179, 101, 215, 159, 6, 1, 196, 113, 101, 215, 159, 6, 1, 209, 222, + 101, 215, 159, 6, 1, 221, 202, 101, 215, 159, 6, 1, 231, 84, 101, 215, + 159, 6, 1, 208, 83, 101, 215, 159, 6, 1, 203, 70, 101, 215, 159, 6, 1, + 243, 83, 101, 215, 159, 6, 1, 247, 130, 101, 215, 159, 6, 1, 222, 236, + 101, 215, 159, 6, 1, 243, 20, 101, 215, 159, 6, 1, 246, 243, 101, 215, + 159, 6, 1, 192, 218, 101, 215, 159, 6, 1, 222, 251, 101, 215, 159, 6, 1, + 230, 89, 101, 215, 159, 6, 1, 229, 247, 101, 215, 159, 6, 1, 229, 147, + 101, 215, 159, 6, 1, 193, 125, 101, 215, 159, 6, 1, 230, 21, 101, 215, + 159, 6, 1, 229, 13, 101, 215, 159, 6, 1, 233, 25, 101, 215, 159, 6, 1, + 192, 14, 101, 215, 159, 6, 1, 234, 125, 101, 215, 159, 6, 1, 154, 231, + 212, 101, 215, 159, 6, 1, 251, 232, 101, 215, 159, 6, 1, 252, 16, 101, + 215, 159, 6, 1, 230, 19, 56, 101, 215, 159, 6, 1, 220, 118, 56, 200, 197, + 208, 154, 248, 167, 200, 166, 200, 197, 208, 154, 248, 167, 210, 157, + 200, 197, 208, 154, 248, 167, 208, 141, 200, 197, 208, 154, 248, 167, + 247, 147, 200, 197, 208, 154, 248, 167, 219, 175, 205, 122, 200, 197, + 208, 154, 248, 167, 222, 144, 205, 122, 200, 197, 208, 154, 248, 167, + 238, 35, 205, 122, 200, 197, 208, 154, 248, 167, 249, 156, 205, 122, 195, + 150, 163, 222, 59, 195, 150, 163, 203, 131, 195, 150, 163, 208, 227, 195, + 150, 3, 213, 189, 195, 150, 3, 192, 117, 216, 84, 200, 156, 195, 150, + 163, 192, 117, 251, 251, 223, 151, 200, 156, 195, 150, 163, 192, 117, + 223, 151, 200, 156, 195, 150, 163, 192, 117, 222, 47, 223, 151, 200, 156, + 195, 150, 163, 247, 124, 60, 195, 150, 163, 192, 117, 222, 47, 223, 151, + 200, 157, 205, 89, 195, 150, 163, 55, 200, 156, 195, 150, 163, 197, 225, + 200, 156, 195, 150, 163, 222, 47, 251, 75, 195, 150, 163, 75, 60, 195, 150, 163, 105, 185, 60, 195, 150, 163, 115, 185, 60, 195, 150, 163, 206, - 196, 222, 56, 223, 149, 200, 156, 195, 150, 163, 250, 179, 223, 149, 200, + 197, 222, 58, 223, 151, 200, 156, 195, 150, 163, 250, 181, 223, 151, 200, 156, 195, 150, 3, 195, 36, 200, 156, 195, 150, 3, 195, 36, 196, 154, 195, - 150, 3, 207, 18, 195, 36, 196, 154, 195, 150, 3, 195, 36, 251, 73, 195, - 150, 3, 207, 18, 195, 36, 251, 73, 195, 150, 3, 195, 36, 196, 155, 4, - 199, 215, 195, 150, 3, 195, 36, 251, 74, 4, 199, 215, 195, 150, 3, 251, - 72, 251, 88, 195, 150, 3, 251, 72, 249, 120, 195, 150, 3, 251, 72, 195, - 178, 195, 150, 3, 251, 72, 195, 179, 4, 199, 215, 195, 150, 3, 198, 126, - 195, 150, 3, 229, 180, 179, 251, 71, 195, 150, 3, 179, 251, 71, 195, 150, - 3, 206, 70, 179, 251, 71, 195, 150, 3, 251, 72, 196, 162, 215, 136, 195, - 150, 3, 251, 10, 195, 150, 3, 206, 122, 251, 10, 195, 150, 163, 247, 122, - 58, 195, 150, 3, 222, 237, 195, 150, 3, 196, 75, 195, 150, 3, 250, 177, - 195, 150, 163, 206, 189, 58, 195, 150, 163, 55, 206, 189, 58, 195, 150, - 3, 55, 251, 72, 251, 88, 8, 1, 2, 6, 65, 8, 1, 2, 6, 252, 25, 8, 2, 1, - 153, 252, 25, 8, 1, 2, 6, 249, 82, 250, 120, 8, 1, 2, 6, 247, 193, 8, 1, - 2, 6, 238, 127, 8, 1, 2, 6, 233, 248, 8, 1, 2, 6, 71, 8, 2, 1, 153, 211, - 77, 71, 8, 2, 1, 153, 68, 8, 1, 2, 6, 223, 35, 8, 1, 2, 6, 222, 152, 8, - 1, 2, 6, 220, 143, 4, 106, 8, 1, 2, 6, 218, 168, 8, 1, 2, 6, 207, 18, - 215, 61, 8, 1, 2, 6, 74, 8, 1, 2, 6, 211, 77, 74, 8, 2, 1, 202, 206, 74, - 8, 2, 1, 202, 206, 211, 77, 74, 8, 2, 1, 202, 206, 187, 4, 106, 8, 2, 1, - 153, 211, 151, 8, 1, 2, 6, 211, 19, 8, 2, 1, 198, 54, 132, 74, 8, 2, 1, - 248, 77, 132, 74, 8, 1, 2, 6, 210, 236, 8, 1, 2, 6, 207, 18, 146, 8, 1, - 2, 6, 153, 146, 8, 1, 2, 6, 200, 43, 8, 1, 2, 6, 66, 8, 2, 1, 202, 206, - 66, 8, 2, 1, 202, 206, 237, 40, 66, 8, 2, 1, 202, 206, 153, 218, 168, 8, + 150, 3, 207, 19, 195, 36, 196, 154, 195, 150, 3, 195, 36, 251, 75, 195, + 150, 3, 207, 19, 195, 36, 251, 75, 195, 150, 3, 195, 36, 196, 155, 4, + 199, 215, 195, 150, 3, 195, 36, 251, 76, 4, 199, 215, 195, 150, 3, 251, + 74, 251, 90, 195, 150, 3, 251, 74, 249, 122, 195, 150, 3, 251, 74, 195, + 178, 195, 150, 3, 251, 74, 195, 179, 4, 199, 215, 195, 150, 3, 198, 126, + 195, 150, 3, 229, 182, 180, 251, 73, 195, 150, 3, 180, 251, 73, 195, 150, + 3, 206, 71, 180, 251, 73, 195, 150, 3, 251, 74, 196, 162, 215, 138, 195, + 150, 3, 251, 12, 195, 150, 3, 206, 123, 251, 12, 195, 150, 163, 247, 124, + 58, 195, 150, 3, 222, 239, 195, 150, 3, 196, 75, 195, 150, 3, 250, 179, + 195, 150, 163, 206, 190, 58, 195, 150, 163, 55, 206, 190, 58, 195, 150, + 3, 55, 251, 74, 251, 90, 8, 1, 2, 6, 65, 8, 1, 2, 6, 252, 27, 8, 2, 1, + 154, 252, 27, 8, 1, 2, 6, 249, 84, 250, 122, 8, 1, 2, 6, 247, 195, 8, 1, + 2, 6, 238, 129, 8, 1, 2, 6, 233, 250, 8, 1, 2, 6, 71, 8, 2, 1, 154, 211, + 79, 71, 8, 2, 1, 154, 68, 8, 1, 2, 6, 223, 37, 8, 1, 2, 6, 222, 154, 8, + 1, 2, 6, 220, 145, 4, 106, 8, 1, 2, 6, 218, 170, 8, 1, 2, 6, 207, 19, + 215, 63, 8, 1, 2, 6, 74, 8, 1, 2, 6, 211, 79, 74, 8, 2, 1, 202, 207, 74, + 8, 2, 1, 202, 207, 211, 79, 74, 8, 2, 1, 202, 207, 187, 4, 106, 8, 2, 1, + 154, 211, 153, 8, 1, 2, 6, 211, 21, 8, 2, 1, 198, 54, 132, 74, 8, 2, 1, + 248, 79, 132, 74, 8, 1, 2, 6, 210, 238, 8, 1, 2, 6, 207, 19, 146, 8, 1, + 2, 6, 154, 146, 8, 1, 2, 6, 200, 43, 8, 1, 2, 6, 66, 8, 2, 1, 202, 207, + 66, 8, 2, 1, 202, 207, 237, 42, 66, 8, 2, 1, 202, 207, 154, 218, 170, 8, 1, 2, 6, 196, 12, 8, 1, 2, 6, 193, 224, 8, 1, 2, 6, 191, 166, 8, 1, 2, 6, - 233, 178, 8, 1, 195, 20, 220, 8, 201, 216, 8, 1, 251, 230, 35, 1, 2, 6, - 231, 211, 35, 1, 2, 6, 220, 31, 35, 1, 2, 6, 209, 185, 35, 1, 2, 6, 207, - 3, 35, 1, 2, 6, 208, 176, 38, 1, 2, 6, 234, 140, 52, 1, 6, 65, 52, 1, 6, - 252, 25, 52, 1, 6, 250, 120, 52, 1, 6, 249, 82, 250, 120, 52, 1, 6, 238, - 127, 52, 1, 6, 71, 52, 1, 6, 207, 18, 71, 52, 1, 6, 232, 51, 52, 1, 6, - 230, 116, 52, 1, 6, 68, 52, 1, 6, 223, 35, 52, 1, 6, 222, 152, 52, 1, 6, - 172, 52, 1, 6, 218, 168, 52, 1, 6, 215, 61, 52, 1, 6, 207, 18, 215, 61, - 52, 1, 6, 74, 52, 1, 6, 211, 19, 52, 1, 6, 210, 236, 52, 1, 6, 146, 52, + 233, 180, 8, 1, 195, 20, 220, 10, 201, 217, 8, 1, 251, 232, 35, 1, 2, 6, + 231, 213, 35, 1, 2, 6, 220, 33, 35, 1, 2, 6, 209, 187, 35, 1, 2, 6, 207, + 4, 35, 1, 2, 6, 208, 178, 38, 1, 2, 6, 234, 142, 52, 1, 6, 65, 52, 1, 6, + 252, 27, 52, 1, 6, 250, 122, 52, 1, 6, 249, 84, 250, 122, 52, 1, 6, 238, + 129, 52, 1, 6, 71, 52, 1, 6, 207, 19, 71, 52, 1, 6, 232, 53, 52, 1, 6, + 230, 118, 52, 1, 6, 68, 52, 1, 6, 223, 37, 52, 1, 6, 222, 154, 52, 1, 6, + 172, 52, 1, 6, 218, 170, 52, 1, 6, 215, 63, 52, 1, 6, 207, 19, 215, 63, + 52, 1, 6, 74, 52, 1, 6, 211, 21, 52, 1, 6, 210, 238, 52, 1, 6, 146, 52, 1, 6, 200, 43, 52, 1, 6, 66, 52, 1, 6, 193, 224, 52, 1, 2, 65, 52, 1, 2, - 153, 65, 52, 1, 2, 251, 160, 52, 1, 2, 153, 252, 25, 52, 1, 2, 250, 120, - 52, 1, 2, 238, 127, 52, 1, 2, 71, 52, 1, 2, 205, 86, 52, 1, 2, 211, 77, - 71, 52, 1, 2, 153, 211, 77, 71, 52, 1, 2, 232, 51, 52, 1, 2, 153, 68, 52, - 1, 2, 222, 152, 52, 1, 2, 218, 168, 52, 1, 2, 234, 88, 52, 1, 2, 74, 52, - 1, 2, 211, 77, 74, 52, 1, 2, 198, 54, 132, 74, 52, 1, 2, 248, 77, 132, - 74, 52, 1, 2, 210, 236, 52, 1, 2, 200, 43, 52, 1, 2, 66, 52, 1, 2, 202, - 206, 66, 52, 1, 2, 153, 218, 168, 52, 1, 2, 196, 12, 52, 1, 2, 251, 230, - 52, 1, 2, 248, 212, 52, 1, 2, 35, 231, 211, 52, 1, 2, 237, 106, 52, 1, 2, - 35, 209, 211, 52, 1, 2, 243, 95, 8, 200, 230, 2, 1, 68, 8, 200, 230, 2, - 1, 146, 8, 200, 230, 2, 1, 66, 8, 200, 230, 2, 1, 196, 12, 35, 200, 230, - 2, 1, 248, 212, 35, 200, 230, 2, 1, 231, 211, 35, 200, 230, 2, 1, 207, 3, - 35, 200, 230, 2, 1, 209, 211, 35, 200, 230, 2, 1, 243, 95, 8, 2, 1, 196, - 152, 8, 2, 1, 78, 4, 82, 198, 152, 8, 2, 1, 238, 128, 4, 82, 198, 152, 8, - 2, 1, 233, 176, 4, 82, 198, 152, 8, 2, 1, 218, 169, 4, 82, 198, 152, 8, - 2, 1, 215, 62, 4, 82, 198, 152, 8, 2, 1, 210, 237, 4, 82, 198, 152, 8, 2, - 1, 207, 222, 4, 82, 198, 152, 8, 2, 1, 207, 222, 4, 232, 234, 23, 82, - 198, 152, 8, 2, 1, 206, 9, 4, 82, 198, 152, 8, 2, 1, 200, 44, 4, 82, 198, - 152, 8, 2, 1, 191, 167, 4, 82, 198, 152, 8, 2, 1, 153, 232, 51, 52, 1, - 38, 234, 103, 8, 2, 1, 223, 115, 232, 51, 8, 2, 1, 199, 52, 4, 201, 32, - 8, 2, 6, 1, 228, 74, 4, 106, 8, 2, 1, 223, 84, 4, 106, 8, 2, 1, 210, 237, - 4, 106, 8, 2, 6, 1, 126, 4, 106, 8, 2, 1, 196, 71, 4, 106, 8, 2, 1, 78, - 4, 210, 192, 102, 8, 2, 1, 238, 128, 4, 210, 192, 102, 8, 2, 1, 233, 176, - 4, 210, 192, 102, 8, 2, 1, 232, 52, 4, 210, 192, 102, 8, 2, 1, 222, 153, - 4, 210, 192, 102, 8, 2, 1, 220, 143, 4, 210, 192, 102, 8, 2, 1, 218, 169, - 4, 210, 192, 102, 8, 2, 1, 215, 62, 4, 210, 192, 102, 8, 2, 1, 210, 237, - 4, 210, 192, 102, 8, 2, 1, 207, 222, 4, 210, 192, 102, 8, 2, 1, 206, 9, - 4, 210, 192, 102, 8, 2, 1, 234, 13, 4, 210, 192, 102, 8, 2, 1, 196, 13, - 4, 210, 192, 102, 8, 2, 1, 192, 236, 4, 210, 192, 102, 8, 2, 1, 191, 167, - 4, 210, 192, 102, 8, 2, 1, 42, 4, 207, 24, 102, 8, 2, 1, 251, 161, 4, - 207, 24, 102, 8, 2, 1, 238, 128, 4, 228, 251, 23, 199, 215, 8, 2, 1, 235, - 15, 4, 207, 24, 102, 8, 2, 1, 211, 77, 235, 15, 4, 207, 24, 102, 8, 2, 1, - 207, 18, 211, 77, 235, 15, 4, 207, 24, 102, 8, 2, 1, 205, 87, 4, 207, 24, - 102, 8, 2, 1, 228, 74, 4, 207, 24, 102, 8, 2, 1, 211, 77, 187, 4, 207, - 24, 102, 8, 2, 1, 234, 13, 4, 207, 24, 102, 8, 2, 1, 126, 4, 207, 24, - 102, 8, 2, 1, 233, 179, 4, 207, 24, 102, 52, 1, 2, 153, 251, 160, 52, 1, - 2, 247, 193, 52, 1, 2, 247, 194, 4, 238, 175, 52, 1, 2, 233, 248, 52, 1, - 2, 207, 18, 211, 77, 71, 52, 1, 2, 233, 175, 52, 1, 2, 236, 139, 223, 36, - 4, 106, 52, 1, 2, 27, 232, 51, 52, 1, 2, 153, 230, 116, 52, 1, 2, 228, - 74, 4, 106, 52, 1, 2, 223, 83, 52, 1, 2, 6, 68, 52, 1, 2, 6, 228, 74, 4, - 106, 52, 1, 2, 223, 36, 4, 238, 212, 52, 1, 2, 220, 143, 4, 207, 24, 102, - 52, 1, 2, 220, 143, 4, 210, 192, 102, 52, 1, 2, 6, 172, 52, 1, 2, 218, - 169, 4, 102, 52, 1, 2, 153, 218, 169, 4, 179, 219, 212, 52, 1, 2, 215, - 62, 4, 45, 102, 52, 1, 2, 215, 62, 4, 207, 24, 102, 52, 1, 2, 6, 215, 61, - 52, 1, 2, 249, 82, 74, 52, 1, 2, 209, 211, 52, 1, 2, 206, 9, 4, 102, 52, - 1, 2, 234, 12, 52, 1, 2, 200, 44, 4, 210, 192, 102, 52, 1, 2, 126, 164, - 52, 1, 2, 196, 70, 52, 1, 2, 6, 66, 52, 1, 2, 196, 13, 4, 102, 52, 1, 2, - 153, 196, 12, 52, 1, 2, 191, 166, 52, 1, 2, 191, 167, 4, 207, 24, 102, - 52, 1, 2, 191, 167, 4, 238, 175, 52, 1, 2, 233, 178, 52, 1, 2, 199, 15, - 33, 235, 138, 230, 211, 252, 60, 33, 235, 138, 252, 47, 252, 60, 33, 202, - 59, 60, 33, 200, 164, 77, 33, 217, 145, 33, 230, 208, 33, 217, 143, 33, - 252, 44, 33, 230, 209, 33, 252, 45, 33, 8, 2, 1, 207, 222, 60, 33, 248, - 35, 33, 217, 144, 33, 55, 243, 2, 58, 33, 211, 139, 58, 33, 191, 21, 60, - 33, 223, 69, 60, 33, 196, 63, 58, 33, 196, 46, 58, 33, 8, 2, 1, 232, 203, - 211, 77, 42, 58, 33, 8, 2, 1, 252, 25, 33, 8, 2, 1, 251, 68, 33, 8, 2, 1, - 250, 146, 33, 8, 2, 1, 247, 194, 247, 35, 33, 8, 2, 1, 223, 115, 238, - 127, 33, 8, 2, 1, 233, 248, 33, 8, 2, 1, 232, 51, 33, 8, 1, 2, 6, 232, - 51, 33, 8, 2, 1, 222, 152, 33, 8, 2, 1, 172, 33, 8, 1, 2, 6, 172, 33, 8, - 1, 2, 6, 218, 168, 33, 8, 2, 1, 215, 61, 33, 8, 1, 2, 6, 215, 61, 33, 8, - 1, 2, 6, 146, 33, 8, 2, 1, 207, 222, 206, 116, 33, 8, 2, 1, 206, 8, 33, - 8, 2, 1, 179, 206, 8, 33, 8, 2, 1, 191, 166, 33, 8, 2, 1, 251, 160, 33, - 8, 2, 1, 250, 120, 33, 8, 2, 1, 248, 212, 33, 8, 2, 1, 205, 86, 33, 8, 2, - 1, 233, 175, 33, 8, 2, 1, 220, 143, 4, 55, 82, 198, 152, 33, 8, 2, 1, - 187, 4, 156, 247, 23, 106, 33, 8, 2, 1, 210, 236, 33, 8, 2, 1, 234, 12, - 33, 8, 2, 1, 126, 4, 156, 247, 23, 106, 33, 8, 2, 1, 193, 224, 33, 8, 2, - 1, 42, 4, 237, 42, 33, 8, 2, 1, 187, 4, 237, 42, 33, 8, 2, 1, 126, 4, - 237, 42, 33, 133, 199, 229, 58, 33, 222, 36, 93, 183, 33, 222, 36, 93, - 219, 224, 33, 75, 93, 219, 224, 33, 193, 78, 223, 93, 248, 29, 60, 33, - 75, 248, 233, 219, 224, 33, 237, 115, 77, 33, 55, 223, 93, 248, 37, 60, - 33, 251, 165, 234, 45, 119, 60, 33, 45, 250, 236, 58, 33, 50, 250, 236, - 23, 144, 250, 236, 60, 8, 6, 1, 42, 4, 206, 189, 60, 8, 2, 1, 42, 4, 206, - 189, 60, 8, 6, 1, 78, 4, 75, 58, 8, 2, 1, 78, 4, 75, 58, 8, 6, 1, 78, 4, - 75, 60, 8, 2, 1, 78, 4, 75, 60, 8, 6, 1, 78, 4, 219, 113, 60, 8, 2, 1, - 78, 4, 219, 113, 60, 8, 6, 1, 247, 194, 4, 247, 36, 23, 252, 46, 8, 2, 1, - 247, 194, 4, 247, 36, 23, 252, 46, 8, 6, 1, 238, 128, 4, 75, 58, 8, 2, 1, - 238, 128, 4, 75, 58, 8, 6, 1, 238, 128, 4, 75, 60, 8, 2, 1, 238, 128, 4, - 75, 60, 8, 6, 1, 238, 128, 4, 219, 113, 60, 8, 2, 1, 238, 128, 4, 219, - 113, 60, 8, 6, 1, 238, 128, 4, 247, 35, 8, 2, 1, 238, 128, 4, 247, 35, 8, - 6, 1, 238, 128, 4, 243, 2, 60, 8, 2, 1, 238, 128, 4, 243, 2, 60, 8, 6, 1, - 235, 15, 4, 217, 147, 23, 230, 210, 8, 2, 1, 235, 15, 4, 217, 147, 23, - 230, 210, 8, 6, 1, 235, 15, 4, 217, 147, 23, 252, 46, 8, 2, 1, 235, 15, - 4, 217, 147, 23, 252, 46, 8, 6, 1, 235, 15, 4, 243, 2, 60, 8, 2, 1, 235, - 15, 4, 243, 2, 60, 8, 6, 1, 235, 15, 4, 198, 153, 60, 8, 2, 1, 235, 15, - 4, 198, 153, 60, 8, 6, 1, 235, 15, 4, 247, 36, 23, 248, 36, 8, 2, 1, 235, - 15, 4, 247, 36, 23, 248, 36, 8, 6, 1, 233, 176, 4, 75, 58, 8, 2, 1, 233, - 176, 4, 75, 58, 8, 6, 1, 232, 52, 4, 217, 146, 8, 2, 1, 232, 52, 4, 217, - 146, 8, 6, 1, 230, 117, 4, 75, 58, 8, 2, 1, 230, 117, 4, 75, 58, 8, 6, 1, - 230, 117, 4, 75, 60, 8, 2, 1, 230, 117, 4, 75, 60, 8, 6, 1, 230, 117, 4, - 237, 42, 8, 2, 1, 230, 117, 4, 237, 42, 8, 6, 1, 230, 117, 4, 247, 35, 8, - 2, 1, 230, 117, 4, 247, 35, 8, 6, 1, 230, 117, 4, 248, 37, 60, 8, 2, 1, - 230, 117, 4, 248, 37, 60, 8, 6, 1, 228, 74, 4, 198, 153, 60, 8, 2, 1, - 228, 74, 4, 198, 153, 60, 8, 6, 1, 228, 74, 4, 237, 43, 23, 252, 46, 8, - 2, 1, 228, 74, 4, 237, 43, 23, 252, 46, 8, 6, 1, 222, 153, 4, 252, 46, 8, - 2, 1, 222, 153, 4, 252, 46, 8, 6, 1, 222, 153, 4, 75, 60, 8, 2, 1, 222, - 153, 4, 75, 60, 8, 6, 1, 222, 153, 4, 219, 113, 60, 8, 2, 1, 222, 153, 4, - 219, 113, 60, 8, 6, 1, 220, 143, 4, 75, 60, 8, 2, 1, 220, 143, 4, 75, 60, - 8, 6, 1, 220, 143, 4, 75, 248, 233, 23, 217, 146, 8, 2, 1, 220, 143, 4, - 75, 248, 233, 23, 217, 146, 8, 6, 1, 220, 143, 4, 219, 113, 60, 8, 2, 1, - 220, 143, 4, 219, 113, 60, 8, 6, 1, 220, 143, 4, 243, 2, 60, 8, 2, 1, - 220, 143, 4, 243, 2, 60, 8, 6, 1, 218, 169, 4, 252, 46, 8, 2, 1, 218, - 169, 4, 252, 46, 8, 6, 1, 218, 169, 4, 75, 58, 8, 2, 1, 218, 169, 4, 75, - 58, 8, 6, 1, 218, 169, 4, 75, 60, 8, 2, 1, 218, 169, 4, 75, 60, 8, 6, 1, - 215, 62, 4, 75, 58, 8, 2, 1, 215, 62, 4, 75, 58, 8, 6, 1, 215, 62, 4, 75, - 60, 8, 2, 1, 215, 62, 4, 75, 60, 8, 6, 1, 215, 62, 4, 219, 113, 60, 8, 2, - 1, 215, 62, 4, 219, 113, 60, 8, 6, 1, 215, 62, 4, 243, 2, 60, 8, 2, 1, - 215, 62, 4, 243, 2, 60, 8, 6, 1, 187, 4, 198, 153, 23, 252, 46, 8, 2, 1, - 187, 4, 198, 153, 23, 252, 46, 8, 6, 1, 187, 4, 198, 153, 23, 237, 42, 8, - 2, 1, 187, 4, 198, 153, 23, 237, 42, 8, 6, 1, 187, 4, 217, 147, 23, 230, - 210, 8, 2, 1, 187, 4, 217, 147, 23, 230, 210, 8, 6, 1, 187, 4, 217, 147, - 23, 252, 46, 8, 2, 1, 187, 4, 217, 147, 23, 252, 46, 8, 6, 1, 210, 237, - 4, 252, 46, 8, 2, 1, 210, 237, 4, 252, 46, 8, 6, 1, 210, 237, 4, 75, 58, - 8, 2, 1, 210, 237, 4, 75, 58, 8, 6, 1, 207, 222, 4, 75, 58, 8, 2, 1, 207, - 222, 4, 75, 58, 8, 6, 1, 207, 222, 4, 75, 60, 8, 2, 1, 207, 222, 4, 75, - 60, 8, 6, 1, 207, 222, 4, 75, 248, 233, 23, 217, 146, 8, 2, 1, 207, 222, - 4, 75, 248, 233, 23, 217, 146, 8, 6, 1, 207, 222, 4, 219, 113, 60, 8, 2, - 1, 207, 222, 4, 219, 113, 60, 8, 6, 1, 206, 9, 4, 75, 58, 8, 2, 1, 206, - 9, 4, 75, 58, 8, 6, 1, 206, 9, 4, 75, 60, 8, 2, 1, 206, 9, 4, 75, 60, 8, - 6, 1, 206, 9, 4, 252, 47, 23, 75, 58, 8, 2, 1, 206, 9, 4, 252, 47, 23, - 75, 58, 8, 6, 1, 206, 9, 4, 247, 93, 23, 75, 58, 8, 2, 1, 206, 9, 4, 247, - 93, 23, 75, 58, 8, 6, 1, 206, 9, 4, 75, 248, 233, 23, 75, 58, 8, 2, 1, - 206, 9, 4, 75, 248, 233, 23, 75, 58, 8, 6, 1, 200, 44, 4, 75, 58, 8, 2, - 1, 200, 44, 4, 75, 58, 8, 6, 1, 200, 44, 4, 75, 60, 8, 2, 1, 200, 44, 4, - 75, 60, 8, 6, 1, 200, 44, 4, 219, 113, 60, 8, 2, 1, 200, 44, 4, 219, 113, - 60, 8, 6, 1, 200, 44, 4, 243, 2, 60, 8, 2, 1, 200, 44, 4, 243, 2, 60, 8, - 6, 1, 126, 4, 237, 43, 60, 8, 2, 1, 126, 4, 237, 43, 60, 8, 6, 1, 126, 4, - 198, 153, 60, 8, 2, 1, 126, 4, 198, 153, 60, 8, 6, 1, 126, 4, 243, 2, 60, - 8, 2, 1, 126, 4, 243, 2, 60, 8, 6, 1, 126, 4, 198, 153, 23, 252, 46, 8, - 2, 1, 126, 4, 198, 153, 23, 252, 46, 8, 6, 1, 126, 4, 217, 147, 23, 237, - 42, 8, 2, 1, 126, 4, 217, 147, 23, 237, 42, 8, 6, 1, 196, 13, 4, 198, - 152, 8, 2, 1, 196, 13, 4, 198, 152, 8, 6, 1, 196, 13, 4, 75, 60, 8, 2, 1, - 196, 13, 4, 75, 60, 8, 6, 1, 193, 225, 4, 230, 210, 8, 2, 1, 193, 225, 4, - 230, 210, 8, 6, 1, 193, 225, 4, 252, 46, 8, 2, 1, 193, 225, 4, 252, 46, - 8, 6, 1, 193, 225, 4, 237, 42, 8, 2, 1, 193, 225, 4, 237, 42, 8, 6, 1, - 193, 225, 4, 75, 58, 8, 2, 1, 193, 225, 4, 75, 58, 8, 6, 1, 193, 225, 4, - 75, 60, 8, 2, 1, 193, 225, 4, 75, 60, 8, 6, 1, 192, 236, 4, 75, 58, 8, 2, - 1, 192, 236, 4, 75, 58, 8, 6, 1, 192, 236, 4, 237, 42, 8, 2, 1, 192, 236, - 4, 237, 42, 8, 6, 1, 192, 160, 4, 75, 58, 8, 2, 1, 192, 160, 4, 75, 58, - 8, 6, 1, 191, 167, 4, 243, 1, 8, 2, 1, 191, 167, 4, 243, 1, 8, 6, 1, 191, - 167, 4, 75, 60, 8, 2, 1, 191, 167, 4, 75, 60, 8, 6, 1, 191, 167, 4, 219, - 113, 60, 8, 2, 1, 191, 167, 4, 219, 113, 60, 8, 2, 1, 230, 117, 4, 219, - 113, 60, 8, 2, 1, 200, 44, 4, 237, 42, 8, 2, 1, 193, 225, 4, 206, 189, - 58, 8, 2, 1, 192, 160, 4, 206, 189, 58, 8, 2, 1, 42, 4, 50, 132, 206, - 188, 8, 2, 1, 179, 206, 9, 4, 75, 58, 8, 2, 1, 179, 206, 9, 4, 237, 39, - 106, 8, 2, 1, 179, 206, 9, 4, 137, 106, 8, 6, 1, 203, 127, 206, 8, 8, 2, - 1, 237, 106, 8, 6, 1, 42, 4, 75, 60, 8, 2, 1, 42, 4, 75, 60, 8, 6, 1, 42, - 4, 228, 251, 58, 8, 2, 1, 42, 4, 228, 251, 58, 8, 6, 1, 42, 4, 243, 2, - 23, 252, 46, 8, 2, 1, 42, 4, 243, 2, 23, 252, 46, 8, 6, 1, 42, 4, 243, 2, - 23, 230, 210, 8, 2, 1, 42, 4, 243, 2, 23, 230, 210, 8, 6, 1, 42, 4, 243, - 2, 23, 228, 251, 58, 8, 2, 1, 42, 4, 243, 2, 23, 228, 251, 58, 8, 6, 1, - 42, 4, 243, 2, 23, 198, 152, 8, 2, 1, 42, 4, 243, 2, 23, 198, 152, 8, 6, - 1, 42, 4, 243, 2, 23, 75, 60, 8, 2, 1, 42, 4, 243, 2, 23, 75, 60, 8, 6, - 1, 42, 4, 248, 37, 23, 252, 46, 8, 2, 1, 42, 4, 248, 37, 23, 252, 46, 8, - 6, 1, 42, 4, 248, 37, 23, 230, 210, 8, 2, 1, 42, 4, 248, 37, 23, 230, - 210, 8, 6, 1, 42, 4, 248, 37, 23, 228, 251, 58, 8, 2, 1, 42, 4, 248, 37, - 23, 228, 251, 58, 8, 6, 1, 42, 4, 248, 37, 23, 198, 152, 8, 2, 1, 42, 4, - 248, 37, 23, 198, 152, 8, 6, 1, 42, 4, 248, 37, 23, 75, 60, 8, 2, 1, 42, - 4, 248, 37, 23, 75, 60, 8, 6, 1, 235, 15, 4, 75, 60, 8, 2, 1, 235, 15, 4, - 75, 60, 8, 6, 1, 235, 15, 4, 228, 251, 58, 8, 2, 1, 235, 15, 4, 228, 251, - 58, 8, 6, 1, 235, 15, 4, 198, 152, 8, 2, 1, 235, 15, 4, 198, 152, 8, 6, - 1, 235, 15, 4, 243, 2, 23, 252, 46, 8, 2, 1, 235, 15, 4, 243, 2, 23, 252, - 46, 8, 6, 1, 235, 15, 4, 243, 2, 23, 230, 210, 8, 2, 1, 235, 15, 4, 243, - 2, 23, 230, 210, 8, 6, 1, 235, 15, 4, 243, 2, 23, 228, 251, 58, 8, 2, 1, - 235, 15, 4, 243, 2, 23, 228, 251, 58, 8, 6, 1, 235, 15, 4, 243, 2, 23, - 198, 152, 8, 2, 1, 235, 15, 4, 243, 2, 23, 198, 152, 8, 6, 1, 235, 15, 4, - 243, 2, 23, 75, 60, 8, 2, 1, 235, 15, 4, 243, 2, 23, 75, 60, 8, 6, 1, - 228, 74, 4, 228, 251, 58, 8, 2, 1, 228, 74, 4, 228, 251, 58, 8, 6, 1, - 228, 74, 4, 75, 60, 8, 2, 1, 228, 74, 4, 75, 60, 8, 6, 1, 187, 4, 75, 60, - 8, 2, 1, 187, 4, 75, 60, 8, 6, 1, 187, 4, 228, 251, 58, 8, 2, 1, 187, 4, - 228, 251, 58, 8, 6, 1, 187, 4, 243, 2, 23, 252, 46, 8, 2, 1, 187, 4, 243, - 2, 23, 252, 46, 8, 6, 1, 187, 4, 243, 2, 23, 230, 210, 8, 2, 1, 187, 4, - 243, 2, 23, 230, 210, 8, 6, 1, 187, 4, 243, 2, 23, 228, 251, 58, 8, 2, 1, - 187, 4, 243, 2, 23, 228, 251, 58, 8, 6, 1, 187, 4, 243, 2, 23, 198, 152, - 8, 2, 1, 187, 4, 243, 2, 23, 198, 152, 8, 6, 1, 187, 4, 243, 2, 23, 75, - 60, 8, 2, 1, 187, 4, 243, 2, 23, 75, 60, 8, 6, 1, 187, 4, 228, 188, 23, - 252, 46, 8, 2, 1, 187, 4, 228, 188, 23, 252, 46, 8, 6, 1, 187, 4, 228, - 188, 23, 230, 210, 8, 2, 1, 187, 4, 228, 188, 23, 230, 210, 8, 6, 1, 187, - 4, 228, 188, 23, 228, 251, 58, 8, 2, 1, 187, 4, 228, 188, 23, 228, 251, - 58, 8, 6, 1, 187, 4, 228, 188, 23, 198, 152, 8, 2, 1, 187, 4, 228, 188, - 23, 198, 152, 8, 6, 1, 187, 4, 228, 188, 23, 75, 60, 8, 2, 1, 187, 4, - 228, 188, 23, 75, 60, 8, 6, 1, 126, 4, 75, 60, 8, 2, 1, 126, 4, 75, 60, - 8, 6, 1, 126, 4, 228, 251, 58, 8, 2, 1, 126, 4, 228, 251, 58, 8, 6, 1, - 126, 4, 228, 188, 23, 252, 46, 8, 2, 1, 126, 4, 228, 188, 23, 252, 46, 8, - 6, 1, 126, 4, 228, 188, 23, 230, 210, 8, 2, 1, 126, 4, 228, 188, 23, 230, - 210, 8, 6, 1, 126, 4, 228, 188, 23, 228, 251, 58, 8, 2, 1, 126, 4, 228, - 188, 23, 228, 251, 58, 8, 6, 1, 126, 4, 228, 188, 23, 198, 152, 8, 2, 1, - 126, 4, 228, 188, 23, 198, 152, 8, 6, 1, 126, 4, 228, 188, 23, 75, 60, 8, - 2, 1, 126, 4, 228, 188, 23, 75, 60, 8, 6, 1, 192, 160, 4, 230, 210, 8, 2, - 1, 192, 160, 4, 230, 210, 8, 6, 1, 192, 160, 4, 75, 60, 8, 2, 1, 192, - 160, 4, 75, 60, 8, 6, 1, 192, 160, 4, 228, 251, 58, 8, 2, 1, 192, 160, 4, - 228, 251, 58, 8, 6, 1, 192, 160, 4, 198, 152, 8, 2, 1, 192, 160, 4, 198, - 152, 8, 6, 1, 216, 83, 219, 74, 8, 2, 1, 216, 83, 219, 74, 8, 6, 1, 216, - 83, 196, 12, 8, 2, 1, 216, 83, 196, 12, 8, 6, 1, 192, 160, 4, 219, 4, 8, - 2, 1, 192, 160, 4, 219, 4, 35, 2, 1, 251, 161, 4, 208, 169, 35, 2, 1, - 251, 161, 4, 237, 212, 35, 2, 1, 251, 161, 4, 208, 170, 23, 195, 169, 35, - 2, 1, 251, 161, 4, 237, 213, 23, 195, 169, 35, 2, 1, 251, 161, 4, 208, - 170, 23, 210, 243, 35, 2, 1, 251, 161, 4, 237, 213, 23, 210, 243, 35, 2, - 1, 251, 161, 4, 208, 170, 23, 210, 4, 35, 2, 1, 251, 161, 4, 237, 213, - 23, 210, 4, 35, 6, 1, 251, 161, 4, 208, 169, 35, 6, 1, 251, 161, 4, 237, - 212, 35, 6, 1, 251, 161, 4, 208, 170, 23, 195, 169, 35, 6, 1, 251, 161, - 4, 237, 213, 23, 195, 169, 35, 6, 1, 251, 161, 4, 208, 170, 23, 210, 243, - 35, 6, 1, 251, 161, 4, 237, 213, 23, 210, 243, 35, 6, 1, 251, 161, 4, - 208, 170, 23, 210, 4, 35, 6, 1, 251, 161, 4, 237, 213, 23, 210, 4, 35, 2, - 1, 234, 48, 4, 208, 169, 35, 2, 1, 234, 48, 4, 237, 212, 35, 2, 1, 234, - 48, 4, 208, 170, 23, 195, 169, 35, 2, 1, 234, 48, 4, 237, 213, 23, 195, - 169, 35, 2, 1, 234, 48, 4, 208, 170, 23, 210, 243, 35, 2, 1, 234, 48, 4, - 237, 213, 23, 210, 243, 35, 6, 1, 234, 48, 4, 208, 169, 35, 6, 1, 234, - 48, 4, 237, 212, 35, 6, 1, 234, 48, 4, 208, 170, 23, 195, 169, 35, 6, 1, - 234, 48, 4, 237, 213, 23, 195, 169, 35, 6, 1, 234, 48, 4, 208, 170, 23, - 210, 243, 35, 6, 1, 234, 48, 4, 237, 213, 23, 210, 243, 35, 2, 1, 233, - 254, 4, 208, 169, 35, 2, 1, 233, 254, 4, 237, 212, 35, 2, 1, 233, 254, 4, - 208, 170, 23, 195, 169, 35, 2, 1, 233, 254, 4, 237, 213, 23, 195, 169, - 35, 2, 1, 233, 254, 4, 208, 170, 23, 210, 243, 35, 2, 1, 233, 254, 4, - 237, 213, 23, 210, 243, 35, 2, 1, 233, 254, 4, 208, 170, 23, 210, 4, 35, - 2, 1, 233, 254, 4, 237, 213, 23, 210, 4, 35, 6, 1, 233, 254, 4, 208, 169, - 35, 6, 1, 233, 254, 4, 237, 212, 35, 6, 1, 233, 254, 4, 208, 170, 23, - 195, 169, 35, 6, 1, 233, 254, 4, 237, 213, 23, 195, 169, 35, 6, 1, 233, - 254, 4, 208, 170, 23, 210, 243, 35, 6, 1, 233, 254, 4, 237, 213, 23, 210, - 243, 35, 6, 1, 233, 254, 4, 208, 170, 23, 210, 4, 35, 6, 1, 233, 254, 4, - 237, 213, 23, 210, 4, 35, 2, 1, 223, 84, 4, 208, 169, 35, 2, 1, 223, 84, - 4, 237, 212, 35, 2, 1, 223, 84, 4, 208, 170, 23, 195, 169, 35, 2, 1, 223, - 84, 4, 237, 213, 23, 195, 169, 35, 2, 1, 223, 84, 4, 208, 170, 23, 210, - 243, 35, 2, 1, 223, 84, 4, 237, 213, 23, 210, 243, 35, 2, 1, 223, 84, 4, - 208, 170, 23, 210, 4, 35, 2, 1, 223, 84, 4, 237, 213, 23, 210, 4, 35, 6, - 1, 223, 84, 4, 208, 169, 35, 6, 1, 223, 84, 4, 237, 212, 35, 6, 1, 223, - 84, 4, 208, 170, 23, 195, 169, 35, 6, 1, 223, 84, 4, 237, 213, 23, 195, - 169, 35, 6, 1, 223, 84, 4, 208, 170, 23, 210, 243, 35, 6, 1, 223, 84, 4, - 237, 213, 23, 210, 243, 35, 6, 1, 223, 84, 4, 208, 170, 23, 210, 4, 35, - 6, 1, 223, 84, 4, 237, 213, 23, 210, 4, 35, 2, 1, 211, 108, 4, 208, 169, - 35, 2, 1, 211, 108, 4, 237, 212, 35, 2, 1, 211, 108, 4, 208, 170, 23, - 195, 169, 35, 2, 1, 211, 108, 4, 237, 213, 23, 195, 169, 35, 2, 1, 211, - 108, 4, 208, 170, 23, 210, 243, 35, 2, 1, 211, 108, 4, 237, 213, 23, 210, - 243, 35, 6, 1, 211, 108, 4, 208, 169, 35, 6, 1, 211, 108, 4, 237, 212, - 35, 6, 1, 211, 108, 4, 208, 170, 23, 195, 169, 35, 6, 1, 211, 108, 4, - 237, 213, 23, 195, 169, 35, 6, 1, 211, 108, 4, 208, 170, 23, 210, 243, - 35, 6, 1, 211, 108, 4, 237, 213, 23, 210, 243, 35, 2, 1, 196, 71, 4, 208, - 169, 35, 2, 1, 196, 71, 4, 237, 212, 35, 2, 1, 196, 71, 4, 208, 170, 23, - 195, 169, 35, 2, 1, 196, 71, 4, 237, 213, 23, 195, 169, 35, 2, 1, 196, - 71, 4, 208, 170, 23, 210, 243, 35, 2, 1, 196, 71, 4, 237, 213, 23, 210, - 243, 35, 2, 1, 196, 71, 4, 208, 170, 23, 210, 4, 35, 2, 1, 196, 71, 4, - 237, 213, 23, 210, 4, 35, 6, 1, 196, 71, 4, 237, 212, 35, 6, 1, 196, 71, - 4, 237, 213, 23, 195, 169, 35, 6, 1, 196, 71, 4, 237, 213, 23, 210, 243, - 35, 6, 1, 196, 71, 4, 237, 213, 23, 210, 4, 35, 2, 1, 211, 111, 4, 208, - 169, 35, 2, 1, 211, 111, 4, 237, 212, 35, 2, 1, 211, 111, 4, 208, 170, - 23, 195, 169, 35, 2, 1, 211, 111, 4, 237, 213, 23, 195, 169, 35, 2, 1, - 211, 111, 4, 208, 170, 23, 210, 243, 35, 2, 1, 211, 111, 4, 237, 213, 23, - 210, 243, 35, 2, 1, 211, 111, 4, 208, 170, 23, 210, 4, 35, 2, 1, 211, - 111, 4, 237, 213, 23, 210, 4, 35, 6, 1, 211, 111, 4, 208, 169, 35, 6, 1, - 211, 111, 4, 237, 212, 35, 6, 1, 211, 111, 4, 208, 170, 23, 195, 169, 35, - 6, 1, 211, 111, 4, 237, 213, 23, 195, 169, 35, 6, 1, 211, 111, 4, 208, - 170, 23, 210, 243, 35, 6, 1, 211, 111, 4, 237, 213, 23, 210, 243, 35, 6, - 1, 211, 111, 4, 208, 170, 23, 210, 4, 35, 6, 1, 211, 111, 4, 237, 213, - 23, 210, 4, 35, 2, 1, 251, 161, 4, 195, 169, 35, 2, 1, 251, 161, 4, 210, - 243, 35, 2, 1, 234, 48, 4, 195, 169, 35, 2, 1, 234, 48, 4, 210, 243, 35, - 2, 1, 233, 254, 4, 195, 169, 35, 2, 1, 233, 254, 4, 210, 243, 35, 2, 1, - 223, 84, 4, 195, 169, 35, 2, 1, 223, 84, 4, 210, 243, 35, 2, 1, 211, 108, - 4, 195, 169, 35, 2, 1, 211, 108, 4, 210, 243, 35, 2, 1, 196, 71, 4, 195, - 169, 35, 2, 1, 196, 71, 4, 210, 243, 35, 2, 1, 211, 111, 4, 195, 169, 35, - 2, 1, 211, 111, 4, 210, 243, 35, 2, 1, 251, 161, 4, 208, 170, 23, 191, - 233, 35, 2, 1, 251, 161, 4, 237, 213, 23, 191, 233, 35, 2, 1, 251, 161, - 4, 208, 170, 23, 195, 170, 23, 191, 233, 35, 2, 1, 251, 161, 4, 237, 213, - 23, 195, 170, 23, 191, 233, 35, 2, 1, 251, 161, 4, 208, 170, 23, 210, - 244, 23, 191, 233, 35, 2, 1, 251, 161, 4, 237, 213, 23, 210, 244, 23, - 191, 233, 35, 2, 1, 251, 161, 4, 208, 170, 23, 210, 5, 23, 191, 233, 35, - 2, 1, 251, 161, 4, 237, 213, 23, 210, 5, 23, 191, 233, 35, 6, 1, 251, - 161, 4, 208, 170, 23, 208, 184, 35, 6, 1, 251, 161, 4, 237, 213, 23, 208, - 184, 35, 6, 1, 251, 161, 4, 208, 170, 23, 195, 170, 23, 208, 184, 35, 6, - 1, 251, 161, 4, 237, 213, 23, 195, 170, 23, 208, 184, 35, 6, 1, 251, 161, - 4, 208, 170, 23, 210, 244, 23, 208, 184, 35, 6, 1, 251, 161, 4, 237, 213, - 23, 210, 244, 23, 208, 184, 35, 6, 1, 251, 161, 4, 208, 170, 23, 210, 5, - 23, 208, 184, 35, 6, 1, 251, 161, 4, 237, 213, 23, 210, 5, 23, 208, 184, - 35, 2, 1, 233, 254, 4, 208, 170, 23, 191, 233, 35, 2, 1, 233, 254, 4, - 237, 213, 23, 191, 233, 35, 2, 1, 233, 254, 4, 208, 170, 23, 195, 170, - 23, 191, 233, 35, 2, 1, 233, 254, 4, 237, 213, 23, 195, 170, 23, 191, - 233, 35, 2, 1, 233, 254, 4, 208, 170, 23, 210, 244, 23, 191, 233, 35, 2, - 1, 233, 254, 4, 237, 213, 23, 210, 244, 23, 191, 233, 35, 2, 1, 233, 254, - 4, 208, 170, 23, 210, 5, 23, 191, 233, 35, 2, 1, 233, 254, 4, 237, 213, - 23, 210, 5, 23, 191, 233, 35, 6, 1, 233, 254, 4, 208, 170, 23, 208, 184, - 35, 6, 1, 233, 254, 4, 237, 213, 23, 208, 184, 35, 6, 1, 233, 254, 4, - 208, 170, 23, 195, 170, 23, 208, 184, 35, 6, 1, 233, 254, 4, 237, 213, - 23, 195, 170, 23, 208, 184, 35, 6, 1, 233, 254, 4, 208, 170, 23, 210, - 244, 23, 208, 184, 35, 6, 1, 233, 254, 4, 237, 213, 23, 210, 244, 23, - 208, 184, 35, 6, 1, 233, 254, 4, 208, 170, 23, 210, 5, 23, 208, 184, 35, - 6, 1, 233, 254, 4, 237, 213, 23, 210, 5, 23, 208, 184, 35, 2, 1, 211, - 111, 4, 208, 170, 23, 191, 233, 35, 2, 1, 211, 111, 4, 237, 213, 23, 191, - 233, 35, 2, 1, 211, 111, 4, 208, 170, 23, 195, 170, 23, 191, 233, 35, 2, - 1, 211, 111, 4, 237, 213, 23, 195, 170, 23, 191, 233, 35, 2, 1, 211, 111, - 4, 208, 170, 23, 210, 244, 23, 191, 233, 35, 2, 1, 211, 111, 4, 237, 213, - 23, 210, 244, 23, 191, 233, 35, 2, 1, 211, 111, 4, 208, 170, 23, 210, 5, - 23, 191, 233, 35, 2, 1, 211, 111, 4, 237, 213, 23, 210, 5, 23, 191, 233, - 35, 6, 1, 211, 111, 4, 208, 170, 23, 208, 184, 35, 6, 1, 211, 111, 4, - 237, 213, 23, 208, 184, 35, 6, 1, 211, 111, 4, 208, 170, 23, 195, 170, - 23, 208, 184, 35, 6, 1, 211, 111, 4, 237, 213, 23, 195, 170, 23, 208, - 184, 35, 6, 1, 211, 111, 4, 208, 170, 23, 210, 244, 23, 208, 184, 35, 6, - 1, 211, 111, 4, 237, 213, 23, 210, 244, 23, 208, 184, 35, 6, 1, 211, 111, - 4, 208, 170, 23, 210, 5, 23, 208, 184, 35, 6, 1, 211, 111, 4, 237, 213, - 23, 210, 5, 23, 208, 184, 35, 2, 1, 251, 161, 4, 194, 254, 35, 2, 1, 251, - 161, 4, 217, 146, 35, 2, 1, 251, 161, 4, 195, 170, 23, 191, 233, 35, 2, - 1, 251, 161, 4, 191, 233, 35, 2, 1, 251, 161, 4, 210, 244, 23, 191, 233, - 35, 2, 1, 251, 161, 4, 210, 4, 35, 2, 1, 251, 161, 4, 210, 5, 23, 191, - 233, 35, 6, 1, 251, 161, 4, 194, 254, 35, 6, 1, 251, 161, 4, 217, 146, - 35, 6, 1, 251, 161, 4, 195, 169, 35, 6, 1, 251, 161, 4, 210, 243, 35, 6, - 1, 251, 161, 4, 208, 184, 35, 221, 30, 35, 208, 184, 35, 208, 169, 35, - 210, 4, 35, 237, 36, 23, 210, 4, 35, 2, 1, 233, 254, 4, 195, 170, 23, - 191, 233, 35, 2, 1, 233, 254, 4, 191, 233, 35, 2, 1, 233, 254, 4, 210, - 244, 23, 191, 233, 35, 2, 1, 233, 254, 4, 210, 4, 35, 2, 1, 233, 254, 4, - 210, 5, 23, 191, 233, 35, 6, 1, 234, 48, 4, 195, 169, 35, 6, 1, 234, 48, - 4, 210, 243, 35, 6, 1, 233, 254, 4, 195, 169, 35, 6, 1, 233, 254, 4, 210, - 243, 35, 6, 1, 233, 254, 4, 208, 184, 35, 208, 170, 23, 195, 169, 35, - 208, 170, 23, 210, 243, 35, 208, 170, 23, 210, 4, 35, 2, 1, 223, 84, 4, - 194, 254, 35, 2, 1, 223, 84, 4, 217, 146, 35, 2, 1, 223, 84, 4, 237, 36, - 23, 195, 169, 35, 2, 1, 223, 84, 4, 237, 36, 23, 210, 243, 35, 2, 1, 223, - 84, 4, 210, 4, 35, 2, 1, 223, 84, 4, 237, 36, 23, 210, 4, 35, 6, 1, 223, - 84, 4, 194, 254, 35, 6, 1, 223, 84, 4, 217, 146, 35, 6, 1, 223, 84, 4, - 195, 169, 35, 6, 1, 223, 84, 4, 210, 243, 35, 237, 213, 23, 195, 169, 35, - 237, 213, 23, 210, 243, 35, 237, 213, 23, 210, 4, 35, 2, 1, 196, 71, 4, - 194, 254, 35, 2, 1, 196, 71, 4, 217, 146, 35, 2, 1, 196, 71, 4, 237, 36, - 23, 195, 169, 35, 2, 1, 196, 71, 4, 237, 36, 23, 210, 243, 35, 2, 1, 207, - 4, 4, 208, 169, 35, 2, 1, 207, 4, 4, 237, 212, 35, 2, 1, 196, 71, 4, 210, - 4, 35, 2, 1, 196, 71, 4, 237, 36, 23, 210, 4, 35, 6, 1, 196, 71, 4, 194, - 254, 35, 6, 1, 196, 71, 4, 217, 146, 35, 6, 1, 196, 71, 4, 195, 169, 35, - 6, 1, 196, 71, 4, 210, 243, 35, 6, 1, 207, 4, 4, 237, 212, 35, 237, 36, - 23, 195, 169, 35, 237, 36, 23, 210, 243, 35, 195, 169, 35, 2, 1, 211, - 111, 4, 195, 170, 23, 191, 233, 35, 2, 1, 211, 111, 4, 191, 233, 35, 2, - 1, 211, 111, 4, 210, 244, 23, 191, 233, 35, 2, 1, 211, 111, 4, 210, 4, - 35, 2, 1, 211, 111, 4, 210, 5, 23, 191, 233, 35, 6, 1, 211, 108, 4, 195, - 169, 35, 6, 1, 211, 108, 4, 210, 243, 35, 6, 1, 211, 111, 4, 195, 169, - 35, 6, 1, 211, 111, 4, 210, 243, 35, 6, 1, 211, 111, 4, 208, 184, 35, - 210, 243, 35, 237, 212, 234, 104, 208, 30, 234, 115, 208, 30, 234, 104, - 201, 247, 234, 115, 201, 247, 198, 219, 201, 247, 232, 126, 201, 247, - 202, 134, 201, 247, 233, 13, 201, 247, 208, 152, 201, 247, 199, 4, 201, - 247, 230, 79, 201, 247, 191, 78, 193, 75, 201, 247, 191, 78, 193, 75, - 213, 29, 191, 78, 193, 75, 222, 196, 219, 215, 77, 206, 199, 77, 228, 88, - 213, 30, 228, 88, 233, 13, 237, 215, 234, 104, 237, 215, 234, 115, 237, - 215, 228, 241, 164, 55, 81, 219, 112, 55, 130, 219, 112, 45, 202, 170, - 207, 252, 77, 50, 202, 170, 207, 252, 77, 202, 170, 218, 240, 207, 252, - 77, 202, 170, 229, 132, 207, 252, 77, 45, 55, 207, 252, 77, 50, 55, 207, - 252, 77, 55, 218, 240, 207, 252, 77, 55, 229, 132, 207, 252, 77, 238, 14, - 55, 238, 14, 247, 248, 197, 238, 247, 248, 91, 75, 219, 236, 105, 75, - 219, 236, 228, 241, 234, 120, 228, 86, 209, 61, 219, 113, 204, 10, 210, - 128, 204, 10, 219, 215, 234, 113, 206, 199, 234, 113, 209, 34, 236, 232, - 232, 144, 219, 215, 210, 252, 206, 199, 210, 252, 214, 215, 213, 37, 201, - 247, 210, 14, 216, 50, 56, 210, 14, 199, 96, 198, 230, 56, 208, 215, 55, - 208, 215, 197, 225, 208, 215, 207, 18, 208, 215, 207, 18, 55, 208, 215, - 207, 18, 197, 225, 208, 215, 247, 96, 202, 170, 219, 219, 251, 116, 207, - 252, 77, 202, 170, 206, 203, 251, 116, 207, 252, 77, 207, 83, 77, 55, - 233, 216, 77, 223, 102, 210, 254, 196, 100, 246, 240, 198, 178, 247, 97, - 223, 119, 209, 61, 250, 191, 228, 89, 247, 248, 232, 118, 202, 97, 45, - 51, 248, 54, 4, 208, 7, 50, 51, 248, 54, 4, 208, 7, 55, 208, 13, 77, 208, - 13, 233, 216, 77, 233, 216, 208, 13, 77, 198, 128, 3, 233, 255, 207, 18, - 209, 142, 56, 62, 118, 247, 248, 62, 96, 247, 248, 130, 250, 193, 207, - 18, 204, 25, 242, 220, 196, 77, 105, 250, 192, 251, 178, 195, 84, 242, - 72, 216, 35, 56, 200, 129, 237, 215, 223, 93, 196, 100, 232, 187, 208, - 152, 77, 115, 75, 208, 151, 208, 26, 208, 215, 232, 128, 75, 208, 151, - 232, 226, 75, 208, 151, 105, 75, 208, 151, 232, 128, 75, 77, 235, 138, - 238, 217, 197, 237, 81, 232, 128, 236, 138, 216, 213, 13, 201, 247, 193, - 23, 222, 196, 232, 77, 251, 44, 223, 91, 198, 144, 223, 91, 204, 10, 223, - 91, 209, 81, 219, 215, 223, 59, 206, 199, 223, 59, 232, 238, 201, 14, - 223, 59, 209, 34, 236, 232, 223, 59, 223, 132, 200, 75, 200, 147, 252, - 49, 200, 75, 200, 147, 223, 132, 9, 232, 146, 203, 133, 252, 49, 9, 232, - 146, 203, 133, 214, 208, 17, 203, 134, 213, 33, 17, 203, 134, 200, 182, - 191, 77, 200, 182, 8, 2, 1, 68, 200, 182, 134, 200, 182, 149, 200, 182, - 169, 200, 182, 175, 200, 182, 171, 200, 182, 178, 200, 182, 108, 56, 200, - 182, 216, 34, 200, 182, 234, 43, 56, 200, 182, 45, 210, 113, 200, 182, - 50, 210, 113, 200, 182, 8, 2, 1, 215, 61, 200, 230, 191, 77, 200, 230, - 107, 200, 230, 109, 200, 230, 138, 200, 230, 134, 200, 230, 149, 200, - 230, 169, 200, 230, 175, 200, 230, 171, 200, 230, 178, 200, 230, 108, 56, - 200, 230, 216, 34, 200, 230, 234, 43, 56, 200, 230, 45, 210, 113, 200, - 230, 50, 210, 113, 8, 200, 230, 2, 1, 65, 8, 200, 230, 2, 1, 71, 8, 200, - 230, 2, 1, 74, 8, 200, 230, 2, 1, 192, 235, 8, 200, 230, 2, 1, 205, 86, - 8, 200, 230, 2, 1, 230, 116, 8, 200, 230, 2, 1, 222, 152, 8, 200, 230, 2, - 1, 172, 8, 200, 230, 2, 1, 218, 168, 8, 200, 230, 2, 1, 215, 61, 8, 200, - 230, 2, 1, 210, 236, 8, 200, 230, 2, 1, 206, 8, 8, 200, 230, 2, 1, 200, - 43, 233, 233, 56, 242, 84, 56, 238, 200, 56, 232, 106, 232, 111, 56, 219, - 91, 56, 216, 51, 56, 214, 234, 56, 209, 245, 56, 206, 36, 56, 193, 31, - 56, 214, 80, 203, 99, 56, 236, 149, 56, 233, 234, 56, 221, 135, 56, 197, - 81, 56, 235, 116, 56, 231, 138, 210, 27, 56, 209, 242, 56, 230, 174, 56, - 250, 153, 56, 228, 166, 56, 247, 37, 56, 219, 81, 198, 33, 56, 201, 226, - 56, 199, 93, 56, 223, 147, 206, 36, 56, 197, 60, 219, 91, 56, 213, 19, - 87, 56, 217, 88, 56, 206, 59, 56, 220, 9, 56, 248, 147, 56, 202, 22, 56, - 33, 45, 230, 13, 58, 33, 50, 230, 13, 58, 33, 179, 81, 219, 113, 210, - 255, 33, 203, 40, 81, 219, 113, 210, 255, 33, 251, 85, 64, 58, 33, 242, - 221, 64, 58, 33, 45, 64, 58, 33, 50, 64, 58, 33, 206, 189, 210, 255, 33, - 242, 221, 206, 189, 210, 255, 33, 251, 85, 206, 189, 210, 255, 33, 115, - 185, 58, 33, 232, 128, 185, 58, 33, 234, 99, 243, 10, 33, 234, 99, 201, - 190, 33, 234, 99, 237, 32, 33, 234, 99, 243, 11, 249, 141, 33, 45, 50, - 64, 58, 33, 234, 99, 205, 76, 33, 234, 99, 221, 218, 33, 234, 99, 196, - 68, 209, 58, 197, 241, 33, 207, 19, 202, 24, 210, 255, 33, 55, 81, 201, - 28, 210, 255, 33, 251, 95, 113, 33, 197, 225, 196, 102, 33, 193, 78, 248, - 29, 58, 33, 118, 64, 210, 255, 33, 179, 55, 202, 24, 210, 255, 33, 96, - 230, 13, 4, 181, 235, 118, 33, 118, 230, 13, 4, 181, 235, 118, 33, 45, - 64, 60, 33, 50, 64, 60, 33, 250, 194, 58, 252, 55, 211, 146, 252, 38, - 119, 199, 34, 200, 240, 235, 129, 6, 247, 193, 237, 125, 247, 27, 247, - 22, 219, 113, 113, 247, 98, 211, 146, 247, 152, 196, 112, 233, 235, 239, - 38, 205, 72, 237, 125, 233, 91, 27, 2, 232, 51, 27, 6, 230, 116, 248, - 137, 6, 230, 116, 235, 129, 6, 230, 116, 209, 103, 239, 38, 209, 103, - 239, 39, 139, 105, 209, 185, 27, 6, 68, 248, 137, 6, 68, 27, 6, 172, 27, - 2, 172, 220, 143, 78, 249, 88, 113, 235, 129, 6, 215, 61, 212, 132, 56, - 202, 5, 207, 95, 239, 5, 27, 6, 210, 236, 235, 129, 6, 210, 236, 235, - 129, 6, 208, 104, 27, 6, 146, 248, 137, 6, 146, 235, 129, 6, 146, 208, - 223, 199, 208, 207, 31, 204, 1, 77, 199, 107, 56, 198, 22, 87, 56, 195, - 136, 235, 129, 6, 191, 166, 211, 18, 56, 211, 135, 56, 223, 93, 211, 135, - 56, 248, 137, 6, 191, 166, 153, 35, 2, 1, 223, 83, 222, 3, 56, 251, 110, - 56, 27, 6, 250, 120, 248, 137, 6, 247, 193, 234, 4, 113, 27, 2, 71, 27, - 6, 71, 27, 6, 233, 175, 153, 6, 233, 175, 27, 6, 218, 168, 27, 2, 74, - 131, 113, 248, 215, 113, 231, 39, 113, 237, 254, 113, 223, 137, 202, 3, - 206, 122, 6, 208, 104, 233, 94, 56, 235, 129, 2, 209, 185, 235, 129, 2, - 231, 211, 235, 129, 6, 231, 211, 235, 129, 6, 209, 185, 235, 129, 215, - 60, 200, 201, 153, 49, 6, 232, 51, 153, 49, 6, 172, 207, 18, 49, 6, 172, - 153, 49, 6, 192, 159, 235, 129, 43, 6, 238, 127, 235, 129, 43, 2, 238, - 127, 235, 129, 43, 2, 71, 235, 129, 43, 2, 68, 235, 129, 43, 2, 223, 35, - 208, 188, 219, 112, 153, 251, 137, 210, 14, 56, 251, 210, 153, 2, 233, - 175, 16, 40, 205, 151, 202, 3, 193, 246, 232, 118, 91, 203, 243, 193, - 246, 232, 118, 91, 213, 167, 193, 246, 232, 118, 91, 199, 86, 193, 246, - 232, 118, 91, 199, 0, 193, 246, 232, 118, 105, 198, 253, 193, 246, 232, - 118, 91, 233, 18, 193, 246, 232, 118, 105, 233, 17, 193, 246, 232, 118, - 115, 233, 17, 193, 246, 232, 118, 232, 128, 233, 17, 193, 246, 232, 118, - 91, 202, 124, 193, 246, 232, 118, 232, 226, 202, 122, 193, 246, 232, 118, - 91, 234, 159, 193, 246, 232, 118, 115, 234, 157, 193, 246, 232, 118, 232, - 226, 234, 157, 193, 246, 232, 118, 203, 247, 234, 157, 232, 118, 212, - 133, 107, 206, 136, 212, 134, 107, 206, 136, 212, 134, 109, 206, 136, - 212, 134, 138, 206, 136, 212, 134, 134, 206, 136, 212, 134, 149, 206, - 136, 212, 134, 169, 206, 136, 212, 134, 175, 206, 136, 212, 134, 171, - 206, 136, 212, 134, 178, 206, 136, 212, 134, 199, 95, 206, 136, 212, 134, - 234, 127, 206, 136, 212, 134, 197, 37, 206, 136, 212, 134, 233, 15, 206, - 136, 212, 134, 91, 228, 140, 206, 136, 212, 134, 232, 226, 228, 140, 206, - 136, 212, 134, 91, 189, 2, 206, 136, 212, 134, 107, 2, 206, 136, 212, - 134, 109, 2, 206, 136, 212, 134, 138, 2, 206, 136, 212, 134, 134, 2, 206, - 136, 212, 134, 149, 2, 206, 136, 212, 134, 169, 2, 206, 136, 212, 134, - 175, 2, 206, 136, 212, 134, 171, 2, 206, 136, 212, 134, 178, 2, 206, 136, - 212, 134, 199, 95, 2, 206, 136, 212, 134, 234, 127, 2, 206, 136, 212, - 134, 197, 37, 2, 206, 136, 212, 134, 233, 15, 2, 206, 136, 212, 134, 91, - 228, 140, 2, 206, 136, 212, 134, 232, 226, 228, 140, 2, 206, 136, 212, - 134, 91, 189, 206, 136, 212, 134, 91, 198, 230, 247, 194, 238, 127, 206, - 136, 212, 134, 232, 226, 189, 206, 136, 212, 134, 199, 96, 189, 206, 136, - 212, 134, 207, 18, 91, 228, 140, 8, 2, 1, 207, 18, 247, 193, 206, 136, - 212, 134, 202, 136, 220, 4, 20, 206, 136, 212, 134, 233, 16, 234, 210, - 20, 206, 136, 212, 134, 233, 16, 189, 206, 136, 212, 134, 91, 228, 141, - 189, 193, 246, 232, 118, 191, 78, 198, 253, 153, 17, 109, 153, 17, 138, - 118, 57, 196, 66, 57, 96, 57, 235, 119, 57, 45, 50, 57, 133, 144, 57, - 186, 193, 105, 57, 186, 234, 204, 57, 202, 2, 234, 204, 57, 202, 2, 193, + 154, 65, 52, 1, 2, 251, 162, 52, 1, 2, 154, 252, 27, 52, 1, 2, 250, 122, + 52, 1, 2, 238, 129, 52, 1, 2, 71, 52, 1, 2, 205, 87, 52, 1, 2, 211, 79, + 71, 52, 1, 2, 154, 211, 79, 71, 52, 1, 2, 232, 53, 52, 1, 2, 154, 68, 52, + 1, 2, 222, 154, 52, 1, 2, 218, 170, 52, 1, 2, 234, 90, 52, 1, 2, 74, 52, + 1, 2, 211, 79, 74, 52, 1, 2, 198, 54, 132, 74, 52, 1, 2, 248, 79, 132, + 74, 52, 1, 2, 210, 238, 52, 1, 2, 200, 43, 52, 1, 2, 66, 52, 1, 2, 202, + 207, 66, 52, 1, 2, 154, 218, 170, 52, 1, 2, 196, 12, 52, 1, 2, 251, 232, + 52, 1, 2, 248, 214, 52, 1, 2, 35, 231, 213, 52, 1, 2, 237, 108, 52, 1, 2, + 35, 209, 213, 52, 1, 2, 243, 97, 8, 200, 231, 2, 1, 68, 8, 200, 231, 2, + 1, 146, 8, 200, 231, 2, 1, 66, 8, 200, 231, 2, 1, 196, 12, 35, 200, 231, + 2, 1, 248, 214, 35, 200, 231, 2, 1, 231, 213, 35, 200, 231, 2, 1, 207, 4, + 35, 200, 231, 2, 1, 209, 213, 35, 200, 231, 2, 1, 243, 97, 8, 2, 1, 196, + 152, 8, 2, 1, 78, 4, 82, 198, 152, 8, 2, 1, 238, 130, 4, 82, 198, 152, 8, + 2, 1, 233, 178, 4, 82, 198, 152, 8, 2, 1, 218, 171, 4, 82, 198, 152, 8, + 2, 1, 215, 64, 4, 82, 198, 152, 8, 2, 1, 210, 239, 4, 82, 198, 152, 8, 2, + 1, 207, 224, 4, 82, 198, 152, 8, 2, 1, 207, 224, 4, 232, 236, 23, 82, + 198, 152, 8, 2, 1, 206, 10, 4, 82, 198, 152, 8, 2, 1, 200, 44, 4, 82, + 198, 152, 8, 2, 1, 191, 167, 4, 82, 198, 152, 8, 2, 1, 154, 232, 53, 52, + 1, 38, 234, 105, 8, 2, 1, 223, 117, 232, 53, 8, 2, 1, 199, 52, 4, 201, + 33, 8, 2, 6, 1, 228, 76, 4, 106, 8, 2, 1, 223, 86, 4, 106, 8, 2, 1, 210, + 239, 4, 106, 8, 2, 6, 1, 126, 4, 106, 8, 2, 1, 196, 71, 4, 106, 8, 2, 1, + 78, 4, 210, 194, 102, 8, 2, 1, 238, 130, 4, 210, 194, 102, 8, 2, 1, 233, + 178, 4, 210, 194, 102, 8, 2, 1, 232, 54, 4, 210, 194, 102, 8, 2, 1, 222, + 155, 4, 210, 194, 102, 8, 2, 1, 220, 145, 4, 210, 194, 102, 8, 2, 1, 218, + 171, 4, 210, 194, 102, 8, 2, 1, 215, 64, 4, 210, 194, 102, 8, 2, 1, 210, + 239, 4, 210, 194, 102, 8, 2, 1, 207, 224, 4, 210, 194, 102, 8, 2, 1, 206, + 10, 4, 210, 194, 102, 8, 2, 1, 234, 15, 4, 210, 194, 102, 8, 2, 1, 196, + 13, 4, 210, 194, 102, 8, 2, 1, 192, 236, 4, 210, 194, 102, 8, 2, 1, 191, + 167, 4, 210, 194, 102, 8, 2, 1, 42, 4, 207, 25, 102, 8, 2, 1, 251, 163, + 4, 207, 25, 102, 8, 2, 1, 238, 130, 4, 228, 253, 23, 199, 215, 8, 2, 1, + 235, 17, 4, 207, 25, 102, 8, 2, 1, 211, 79, 235, 17, 4, 207, 25, 102, 8, + 2, 1, 207, 19, 211, 79, 235, 17, 4, 207, 25, 102, 8, 2, 1, 205, 88, 4, + 207, 25, 102, 8, 2, 1, 228, 76, 4, 207, 25, 102, 8, 2, 1, 211, 79, 187, + 4, 207, 25, 102, 8, 2, 1, 234, 15, 4, 207, 25, 102, 8, 2, 1, 126, 4, 207, + 25, 102, 8, 2, 1, 233, 181, 4, 207, 25, 102, 52, 1, 2, 154, 251, 162, 52, + 1, 2, 247, 195, 52, 1, 2, 247, 196, 4, 238, 177, 52, 1, 2, 233, 250, 52, + 1, 2, 207, 19, 211, 79, 71, 52, 1, 2, 233, 177, 52, 1, 2, 236, 141, 223, + 38, 4, 106, 52, 1, 2, 27, 232, 53, 52, 1, 2, 154, 230, 118, 52, 1, 2, + 228, 76, 4, 106, 52, 1, 2, 223, 85, 52, 1, 2, 6, 68, 52, 1, 2, 6, 228, + 76, 4, 106, 52, 1, 2, 223, 38, 4, 238, 214, 52, 1, 2, 220, 145, 4, 207, + 25, 102, 52, 1, 2, 220, 145, 4, 210, 194, 102, 52, 1, 2, 6, 172, 52, 1, + 2, 218, 171, 4, 102, 52, 1, 2, 154, 218, 171, 4, 180, 219, 214, 52, 1, 2, + 215, 64, 4, 45, 102, 52, 1, 2, 215, 64, 4, 207, 25, 102, 52, 1, 2, 6, + 215, 63, 52, 1, 2, 249, 84, 74, 52, 1, 2, 209, 213, 52, 1, 2, 206, 10, 4, + 102, 52, 1, 2, 234, 14, 52, 1, 2, 200, 44, 4, 210, 194, 102, 52, 1, 2, + 126, 164, 52, 1, 2, 196, 70, 52, 1, 2, 6, 66, 52, 1, 2, 196, 13, 4, 102, + 52, 1, 2, 154, 196, 12, 52, 1, 2, 191, 166, 52, 1, 2, 191, 167, 4, 207, + 25, 102, 52, 1, 2, 191, 167, 4, 238, 177, 52, 1, 2, 233, 180, 52, 1, 2, + 199, 15, 33, 235, 140, 230, 213, 252, 62, 33, 235, 140, 252, 49, 252, 62, + 33, 202, 60, 60, 33, 200, 164, 77, 33, 217, 147, 33, 230, 210, 33, 217, + 145, 33, 252, 46, 33, 230, 211, 33, 252, 47, 33, 8, 2, 1, 207, 224, 60, + 33, 248, 37, 33, 217, 146, 33, 55, 243, 4, 58, 33, 211, 141, 58, 33, 191, + 21, 60, 33, 223, 71, 60, 33, 196, 63, 58, 33, 196, 46, 58, 33, 8, 2, 1, + 232, 205, 211, 79, 42, 58, 33, 8, 2, 1, 252, 27, 33, 8, 2, 1, 251, 70, + 33, 8, 2, 1, 250, 148, 33, 8, 2, 1, 247, 196, 247, 37, 33, 8, 2, 1, 223, + 117, 238, 129, 33, 8, 2, 1, 233, 250, 33, 8, 2, 1, 232, 53, 33, 8, 1, 2, + 6, 232, 53, 33, 8, 2, 1, 222, 154, 33, 8, 2, 1, 172, 33, 8, 1, 2, 6, 172, + 33, 8, 1, 2, 6, 218, 170, 33, 8, 2, 1, 215, 63, 33, 8, 1, 2, 6, 215, 63, + 33, 8, 1, 2, 6, 146, 33, 8, 2, 1, 207, 224, 206, 117, 33, 8, 2, 1, 206, + 9, 33, 8, 2, 1, 180, 206, 9, 33, 8, 2, 1, 191, 166, 33, 8, 2, 1, 251, + 162, 33, 8, 2, 1, 250, 122, 33, 8, 2, 1, 248, 214, 33, 8, 2, 1, 205, 87, + 33, 8, 2, 1, 233, 177, 33, 8, 2, 1, 220, 145, 4, 55, 82, 198, 152, 33, 8, + 2, 1, 187, 4, 156, 247, 25, 106, 33, 8, 2, 1, 210, 238, 33, 8, 2, 1, 234, + 14, 33, 8, 2, 1, 126, 4, 156, 247, 25, 106, 33, 8, 2, 1, 193, 224, 33, 8, + 2, 1, 42, 4, 237, 44, 33, 8, 2, 1, 187, 4, 237, 44, 33, 8, 2, 1, 126, 4, + 237, 44, 33, 133, 199, 229, 58, 33, 222, 38, 93, 179, 33, 222, 38, 93, + 219, 226, 33, 75, 93, 219, 226, 33, 193, 78, 223, 95, 248, 31, 60, 33, + 75, 248, 235, 219, 226, 33, 237, 117, 77, 33, 55, 223, 95, 248, 39, 60, + 33, 251, 167, 234, 47, 119, 60, 33, 45, 250, 238, 58, 33, 50, 250, 238, + 23, 144, 250, 238, 60, 8, 6, 1, 42, 4, 206, 190, 60, 8, 2, 1, 42, 4, 206, + 190, 60, 8, 6, 1, 78, 4, 75, 58, 8, 2, 1, 78, 4, 75, 58, 8, 6, 1, 78, 4, + 75, 60, 8, 2, 1, 78, 4, 75, 60, 8, 6, 1, 78, 4, 219, 115, 60, 8, 2, 1, + 78, 4, 219, 115, 60, 8, 6, 1, 247, 196, 4, 247, 38, 23, 252, 48, 8, 2, 1, + 247, 196, 4, 247, 38, 23, 252, 48, 8, 6, 1, 238, 130, 4, 75, 58, 8, 2, 1, + 238, 130, 4, 75, 58, 8, 6, 1, 238, 130, 4, 75, 60, 8, 2, 1, 238, 130, 4, + 75, 60, 8, 6, 1, 238, 130, 4, 219, 115, 60, 8, 2, 1, 238, 130, 4, 219, + 115, 60, 8, 6, 1, 238, 130, 4, 247, 37, 8, 2, 1, 238, 130, 4, 247, 37, 8, + 6, 1, 238, 130, 4, 243, 4, 60, 8, 2, 1, 238, 130, 4, 243, 4, 60, 8, 6, 1, + 235, 17, 4, 217, 149, 23, 230, 212, 8, 2, 1, 235, 17, 4, 217, 149, 23, + 230, 212, 8, 6, 1, 235, 17, 4, 217, 149, 23, 252, 48, 8, 2, 1, 235, 17, + 4, 217, 149, 23, 252, 48, 8, 6, 1, 235, 17, 4, 243, 4, 60, 8, 2, 1, 235, + 17, 4, 243, 4, 60, 8, 6, 1, 235, 17, 4, 198, 153, 60, 8, 2, 1, 235, 17, + 4, 198, 153, 60, 8, 6, 1, 235, 17, 4, 247, 38, 23, 248, 38, 8, 2, 1, 235, + 17, 4, 247, 38, 23, 248, 38, 8, 6, 1, 233, 178, 4, 75, 58, 8, 2, 1, 233, + 178, 4, 75, 58, 8, 6, 1, 232, 54, 4, 217, 148, 8, 2, 1, 232, 54, 4, 217, + 148, 8, 6, 1, 230, 119, 4, 75, 58, 8, 2, 1, 230, 119, 4, 75, 58, 8, 6, 1, + 230, 119, 4, 75, 60, 8, 2, 1, 230, 119, 4, 75, 60, 8, 6, 1, 230, 119, 4, + 237, 44, 8, 2, 1, 230, 119, 4, 237, 44, 8, 6, 1, 230, 119, 4, 247, 37, 8, + 2, 1, 230, 119, 4, 247, 37, 8, 6, 1, 230, 119, 4, 248, 39, 60, 8, 2, 1, + 230, 119, 4, 248, 39, 60, 8, 6, 1, 228, 76, 4, 198, 153, 60, 8, 2, 1, + 228, 76, 4, 198, 153, 60, 8, 6, 1, 228, 76, 4, 237, 45, 23, 252, 48, 8, + 2, 1, 228, 76, 4, 237, 45, 23, 252, 48, 8, 6, 1, 222, 155, 4, 252, 48, 8, + 2, 1, 222, 155, 4, 252, 48, 8, 6, 1, 222, 155, 4, 75, 60, 8, 2, 1, 222, + 155, 4, 75, 60, 8, 6, 1, 222, 155, 4, 219, 115, 60, 8, 2, 1, 222, 155, 4, + 219, 115, 60, 8, 6, 1, 220, 145, 4, 75, 60, 8, 2, 1, 220, 145, 4, 75, 60, + 8, 6, 1, 220, 145, 4, 75, 248, 235, 23, 217, 148, 8, 2, 1, 220, 145, 4, + 75, 248, 235, 23, 217, 148, 8, 6, 1, 220, 145, 4, 219, 115, 60, 8, 2, 1, + 220, 145, 4, 219, 115, 60, 8, 6, 1, 220, 145, 4, 243, 4, 60, 8, 2, 1, + 220, 145, 4, 243, 4, 60, 8, 6, 1, 218, 171, 4, 252, 48, 8, 2, 1, 218, + 171, 4, 252, 48, 8, 6, 1, 218, 171, 4, 75, 58, 8, 2, 1, 218, 171, 4, 75, + 58, 8, 6, 1, 218, 171, 4, 75, 60, 8, 2, 1, 218, 171, 4, 75, 60, 8, 6, 1, + 215, 64, 4, 75, 58, 8, 2, 1, 215, 64, 4, 75, 58, 8, 6, 1, 215, 64, 4, 75, + 60, 8, 2, 1, 215, 64, 4, 75, 60, 8, 6, 1, 215, 64, 4, 219, 115, 60, 8, 2, + 1, 215, 64, 4, 219, 115, 60, 8, 6, 1, 215, 64, 4, 243, 4, 60, 8, 2, 1, + 215, 64, 4, 243, 4, 60, 8, 6, 1, 187, 4, 198, 153, 23, 252, 48, 8, 2, 1, + 187, 4, 198, 153, 23, 252, 48, 8, 6, 1, 187, 4, 198, 153, 23, 237, 44, 8, + 2, 1, 187, 4, 198, 153, 23, 237, 44, 8, 6, 1, 187, 4, 217, 149, 23, 230, + 212, 8, 2, 1, 187, 4, 217, 149, 23, 230, 212, 8, 6, 1, 187, 4, 217, 149, + 23, 252, 48, 8, 2, 1, 187, 4, 217, 149, 23, 252, 48, 8, 6, 1, 210, 239, + 4, 252, 48, 8, 2, 1, 210, 239, 4, 252, 48, 8, 6, 1, 210, 239, 4, 75, 58, + 8, 2, 1, 210, 239, 4, 75, 58, 8, 6, 1, 207, 224, 4, 75, 58, 8, 2, 1, 207, + 224, 4, 75, 58, 8, 6, 1, 207, 224, 4, 75, 60, 8, 2, 1, 207, 224, 4, 75, + 60, 8, 6, 1, 207, 224, 4, 75, 248, 235, 23, 217, 148, 8, 2, 1, 207, 224, + 4, 75, 248, 235, 23, 217, 148, 8, 6, 1, 207, 224, 4, 219, 115, 60, 8, 2, + 1, 207, 224, 4, 219, 115, 60, 8, 6, 1, 206, 10, 4, 75, 58, 8, 2, 1, 206, + 10, 4, 75, 58, 8, 6, 1, 206, 10, 4, 75, 60, 8, 2, 1, 206, 10, 4, 75, 60, + 8, 6, 1, 206, 10, 4, 252, 49, 23, 75, 58, 8, 2, 1, 206, 10, 4, 252, 49, + 23, 75, 58, 8, 6, 1, 206, 10, 4, 247, 95, 23, 75, 58, 8, 2, 1, 206, 10, + 4, 247, 95, 23, 75, 58, 8, 6, 1, 206, 10, 4, 75, 248, 235, 23, 75, 58, 8, + 2, 1, 206, 10, 4, 75, 248, 235, 23, 75, 58, 8, 6, 1, 200, 44, 4, 75, 58, + 8, 2, 1, 200, 44, 4, 75, 58, 8, 6, 1, 200, 44, 4, 75, 60, 8, 2, 1, 200, + 44, 4, 75, 60, 8, 6, 1, 200, 44, 4, 219, 115, 60, 8, 2, 1, 200, 44, 4, + 219, 115, 60, 8, 6, 1, 200, 44, 4, 243, 4, 60, 8, 2, 1, 200, 44, 4, 243, + 4, 60, 8, 6, 1, 126, 4, 237, 45, 60, 8, 2, 1, 126, 4, 237, 45, 60, 8, 6, + 1, 126, 4, 198, 153, 60, 8, 2, 1, 126, 4, 198, 153, 60, 8, 6, 1, 126, 4, + 243, 4, 60, 8, 2, 1, 126, 4, 243, 4, 60, 8, 6, 1, 126, 4, 198, 153, 23, + 252, 48, 8, 2, 1, 126, 4, 198, 153, 23, 252, 48, 8, 6, 1, 126, 4, 217, + 149, 23, 237, 44, 8, 2, 1, 126, 4, 217, 149, 23, 237, 44, 8, 6, 1, 196, + 13, 4, 198, 152, 8, 2, 1, 196, 13, 4, 198, 152, 8, 6, 1, 196, 13, 4, 75, + 60, 8, 2, 1, 196, 13, 4, 75, 60, 8, 6, 1, 193, 225, 4, 230, 212, 8, 2, 1, + 193, 225, 4, 230, 212, 8, 6, 1, 193, 225, 4, 252, 48, 8, 2, 1, 193, 225, + 4, 252, 48, 8, 6, 1, 193, 225, 4, 237, 44, 8, 2, 1, 193, 225, 4, 237, 44, + 8, 6, 1, 193, 225, 4, 75, 58, 8, 2, 1, 193, 225, 4, 75, 58, 8, 6, 1, 193, + 225, 4, 75, 60, 8, 2, 1, 193, 225, 4, 75, 60, 8, 6, 1, 192, 236, 4, 75, + 58, 8, 2, 1, 192, 236, 4, 75, 58, 8, 6, 1, 192, 236, 4, 237, 44, 8, 2, 1, + 192, 236, 4, 237, 44, 8, 6, 1, 192, 160, 4, 75, 58, 8, 2, 1, 192, 160, 4, + 75, 58, 8, 6, 1, 191, 167, 4, 243, 3, 8, 2, 1, 191, 167, 4, 243, 3, 8, 6, + 1, 191, 167, 4, 75, 60, 8, 2, 1, 191, 167, 4, 75, 60, 8, 6, 1, 191, 167, + 4, 219, 115, 60, 8, 2, 1, 191, 167, 4, 219, 115, 60, 8, 2, 1, 230, 119, + 4, 219, 115, 60, 8, 2, 1, 200, 44, 4, 237, 44, 8, 2, 1, 193, 225, 4, 206, + 190, 58, 8, 2, 1, 192, 160, 4, 206, 190, 58, 8, 2, 1, 42, 4, 50, 132, + 206, 189, 8, 2, 1, 180, 206, 10, 4, 75, 58, 8, 2, 1, 180, 206, 10, 4, + 237, 41, 106, 8, 2, 1, 180, 206, 10, 4, 137, 106, 8, 6, 1, 203, 128, 206, + 9, 8, 2, 1, 237, 108, 8, 6, 1, 42, 4, 75, 60, 8, 2, 1, 42, 4, 75, 60, 8, + 6, 1, 42, 4, 228, 253, 58, 8, 2, 1, 42, 4, 228, 253, 58, 8, 6, 1, 42, 4, + 243, 4, 23, 252, 48, 8, 2, 1, 42, 4, 243, 4, 23, 252, 48, 8, 6, 1, 42, 4, + 243, 4, 23, 230, 212, 8, 2, 1, 42, 4, 243, 4, 23, 230, 212, 8, 6, 1, 42, + 4, 243, 4, 23, 228, 253, 58, 8, 2, 1, 42, 4, 243, 4, 23, 228, 253, 58, 8, + 6, 1, 42, 4, 243, 4, 23, 198, 152, 8, 2, 1, 42, 4, 243, 4, 23, 198, 152, + 8, 6, 1, 42, 4, 243, 4, 23, 75, 60, 8, 2, 1, 42, 4, 243, 4, 23, 75, 60, + 8, 6, 1, 42, 4, 248, 39, 23, 252, 48, 8, 2, 1, 42, 4, 248, 39, 23, 252, + 48, 8, 6, 1, 42, 4, 248, 39, 23, 230, 212, 8, 2, 1, 42, 4, 248, 39, 23, + 230, 212, 8, 6, 1, 42, 4, 248, 39, 23, 228, 253, 58, 8, 2, 1, 42, 4, 248, + 39, 23, 228, 253, 58, 8, 6, 1, 42, 4, 248, 39, 23, 198, 152, 8, 2, 1, 42, + 4, 248, 39, 23, 198, 152, 8, 6, 1, 42, 4, 248, 39, 23, 75, 60, 8, 2, 1, + 42, 4, 248, 39, 23, 75, 60, 8, 6, 1, 235, 17, 4, 75, 60, 8, 2, 1, 235, + 17, 4, 75, 60, 8, 6, 1, 235, 17, 4, 228, 253, 58, 8, 2, 1, 235, 17, 4, + 228, 253, 58, 8, 6, 1, 235, 17, 4, 198, 152, 8, 2, 1, 235, 17, 4, 198, + 152, 8, 6, 1, 235, 17, 4, 243, 4, 23, 252, 48, 8, 2, 1, 235, 17, 4, 243, + 4, 23, 252, 48, 8, 6, 1, 235, 17, 4, 243, 4, 23, 230, 212, 8, 2, 1, 235, + 17, 4, 243, 4, 23, 230, 212, 8, 6, 1, 235, 17, 4, 243, 4, 23, 228, 253, + 58, 8, 2, 1, 235, 17, 4, 243, 4, 23, 228, 253, 58, 8, 6, 1, 235, 17, 4, + 243, 4, 23, 198, 152, 8, 2, 1, 235, 17, 4, 243, 4, 23, 198, 152, 8, 6, 1, + 235, 17, 4, 243, 4, 23, 75, 60, 8, 2, 1, 235, 17, 4, 243, 4, 23, 75, 60, + 8, 6, 1, 228, 76, 4, 228, 253, 58, 8, 2, 1, 228, 76, 4, 228, 253, 58, 8, + 6, 1, 228, 76, 4, 75, 60, 8, 2, 1, 228, 76, 4, 75, 60, 8, 6, 1, 187, 4, + 75, 60, 8, 2, 1, 187, 4, 75, 60, 8, 6, 1, 187, 4, 228, 253, 58, 8, 2, 1, + 187, 4, 228, 253, 58, 8, 6, 1, 187, 4, 243, 4, 23, 252, 48, 8, 2, 1, 187, + 4, 243, 4, 23, 252, 48, 8, 6, 1, 187, 4, 243, 4, 23, 230, 212, 8, 2, 1, + 187, 4, 243, 4, 23, 230, 212, 8, 6, 1, 187, 4, 243, 4, 23, 228, 253, 58, + 8, 2, 1, 187, 4, 243, 4, 23, 228, 253, 58, 8, 6, 1, 187, 4, 243, 4, 23, + 198, 152, 8, 2, 1, 187, 4, 243, 4, 23, 198, 152, 8, 6, 1, 187, 4, 243, 4, + 23, 75, 60, 8, 2, 1, 187, 4, 243, 4, 23, 75, 60, 8, 6, 1, 187, 4, 228, + 190, 23, 252, 48, 8, 2, 1, 187, 4, 228, 190, 23, 252, 48, 8, 6, 1, 187, + 4, 228, 190, 23, 230, 212, 8, 2, 1, 187, 4, 228, 190, 23, 230, 212, 8, 6, + 1, 187, 4, 228, 190, 23, 228, 253, 58, 8, 2, 1, 187, 4, 228, 190, 23, + 228, 253, 58, 8, 6, 1, 187, 4, 228, 190, 23, 198, 152, 8, 2, 1, 187, 4, + 228, 190, 23, 198, 152, 8, 6, 1, 187, 4, 228, 190, 23, 75, 60, 8, 2, 1, + 187, 4, 228, 190, 23, 75, 60, 8, 6, 1, 126, 4, 75, 60, 8, 2, 1, 126, 4, + 75, 60, 8, 6, 1, 126, 4, 228, 253, 58, 8, 2, 1, 126, 4, 228, 253, 58, 8, + 6, 1, 126, 4, 228, 190, 23, 252, 48, 8, 2, 1, 126, 4, 228, 190, 23, 252, + 48, 8, 6, 1, 126, 4, 228, 190, 23, 230, 212, 8, 2, 1, 126, 4, 228, 190, + 23, 230, 212, 8, 6, 1, 126, 4, 228, 190, 23, 228, 253, 58, 8, 2, 1, 126, + 4, 228, 190, 23, 228, 253, 58, 8, 6, 1, 126, 4, 228, 190, 23, 198, 152, + 8, 2, 1, 126, 4, 228, 190, 23, 198, 152, 8, 6, 1, 126, 4, 228, 190, 23, + 75, 60, 8, 2, 1, 126, 4, 228, 190, 23, 75, 60, 8, 6, 1, 192, 160, 4, 230, + 212, 8, 2, 1, 192, 160, 4, 230, 212, 8, 6, 1, 192, 160, 4, 75, 60, 8, 2, + 1, 192, 160, 4, 75, 60, 8, 6, 1, 192, 160, 4, 228, 253, 58, 8, 2, 1, 192, + 160, 4, 228, 253, 58, 8, 6, 1, 192, 160, 4, 198, 152, 8, 2, 1, 192, 160, + 4, 198, 152, 8, 6, 1, 216, 85, 219, 76, 8, 2, 1, 216, 85, 219, 76, 8, 6, + 1, 216, 85, 196, 12, 8, 2, 1, 216, 85, 196, 12, 8, 6, 1, 192, 160, 4, + 219, 6, 8, 2, 1, 192, 160, 4, 219, 6, 35, 2, 1, 251, 163, 4, 208, 171, + 35, 2, 1, 251, 163, 4, 237, 214, 35, 2, 1, 251, 163, 4, 208, 172, 23, + 195, 169, 35, 2, 1, 251, 163, 4, 237, 215, 23, 195, 169, 35, 2, 1, 251, + 163, 4, 208, 172, 23, 210, 245, 35, 2, 1, 251, 163, 4, 237, 215, 23, 210, + 245, 35, 2, 1, 251, 163, 4, 208, 172, 23, 210, 6, 35, 2, 1, 251, 163, 4, + 237, 215, 23, 210, 6, 35, 6, 1, 251, 163, 4, 208, 171, 35, 6, 1, 251, + 163, 4, 237, 214, 35, 6, 1, 251, 163, 4, 208, 172, 23, 195, 169, 35, 6, + 1, 251, 163, 4, 237, 215, 23, 195, 169, 35, 6, 1, 251, 163, 4, 208, 172, + 23, 210, 245, 35, 6, 1, 251, 163, 4, 237, 215, 23, 210, 245, 35, 6, 1, + 251, 163, 4, 208, 172, 23, 210, 6, 35, 6, 1, 251, 163, 4, 237, 215, 23, + 210, 6, 35, 2, 1, 234, 50, 4, 208, 171, 35, 2, 1, 234, 50, 4, 237, 214, + 35, 2, 1, 234, 50, 4, 208, 172, 23, 195, 169, 35, 2, 1, 234, 50, 4, 237, + 215, 23, 195, 169, 35, 2, 1, 234, 50, 4, 208, 172, 23, 210, 245, 35, 2, + 1, 234, 50, 4, 237, 215, 23, 210, 245, 35, 6, 1, 234, 50, 4, 208, 171, + 35, 6, 1, 234, 50, 4, 237, 214, 35, 6, 1, 234, 50, 4, 208, 172, 23, 195, + 169, 35, 6, 1, 234, 50, 4, 237, 215, 23, 195, 169, 35, 6, 1, 234, 50, 4, + 208, 172, 23, 210, 245, 35, 6, 1, 234, 50, 4, 237, 215, 23, 210, 245, 35, + 2, 1, 234, 0, 4, 208, 171, 35, 2, 1, 234, 0, 4, 237, 214, 35, 2, 1, 234, + 0, 4, 208, 172, 23, 195, 169, 35, 2, 1, 234, 0, 4, 237, 215, 23, 195, + 169, 35, 2, 1, 234, 0, 4, 208, 172, 23, 210, 245, 35, 2, 1, 234, 0, 4, + 237, 215, 23, 210, 245, 35, 2, 1, 234, 0, 4, 208, 172, 23, 210, 6, 35, 2, + 1, 234, 0, 4, 237, 215, 23, 210, 6, 35, 6, 1, 234, 0, 4, 208, 171, 35, 6, + 1, 234, 0, 4, 237, 214, 35, 6, 1, 234, 0, 4, 208, 172, 23, 195, 169, 35, + 6, 1, 234, 0, 4, 237, 215, 23, 195, 169, 35, 6, 1, 234, 0, 4, 208, 172, + 23, 210, 245, 35, 6, 1, 234, 0, 4, 237, 215, 23, 210, 245, 35, 6, 1, 234, + 0, 4, 208, 172, 23, 210, 6, 35, 6, 1, 234, 0, 4, 237, 215, 23, 210, 6, + 35, 2, 1, 223, 86, 4, 208, 171, 35, 2, 1, 223, 86, 4, 237, 214, 35, 2, 1, + 223, 86, 4, 208, 172, 23, 195, 169, 35, 2, 1, 223, 86, 4, 237, 215, 23, + 195, 169, 35, 2, 1, 223, 86, 4, 208, 172, 23, 210, 245, 35, 2, 1, 223, + 86, 4, 237, 215, 23, 210, 245, 35, 2, 1, 223, 86, 4, 208, 172, 23, 210, + 6, 35, 2, 1, 223, 86, 4, 237, 215, 23, 210, 6, 35, 6, 1, 223, 86, 4, 208, + 171, 35, 6, 1, 223, 86, 4, 237, 214, 35, 6, 1, 223, 86, 4, 208, 172, 23, + 195, 169, 35, 6, 1, 223, 86, 4, 237, 215, 23, 195, 169, 35, 6, 1, 223, + 86, 4, 208, 172, 23, 210, 245, 35, 6, 1, 223, 86, 4, 237, 215, 23, 210, + 245, 35, 6, 1, 223, 86, 4, 208, 172, 23, 210, 6, 35, 6, 1, 223, 86, 4, + 237, 215, 23, 210, 6, 35, 2, 1, 211, 110, 4, 208, 171, 35, 2, 1, 211, + 110, 4, 237, 214, 35, 2, 1, 211, 110, 4, 208, 172, 23, 195, 169, 35, 2, + 1, 211, 110, 4, 237, 215, 23, 195, 169, 35, 2, 1, 211, 110, 4, 208, 172, + 23, 210, 245, 35, 2, 1, 211, 110, 4, 237, 215, 23, 210, 245, 35, 6, 1, + 211, 110, 4, 208, 171, 35, 6, 1, 211, 110, 4, 237, 214, 35, 6, 1, 211, + 110, 4, 208, 172, 23, 195, 169, 35, 6, 1, 211, 110, 4, 237, 215, 23, 195, + 169, 35, 6, 1, 211, 110, 4, 208, 172, 23, 210, 245, 35, 6, 1, 211, 110, + 4, 237, 215, 23, 210, 245, 35, 2, 1, 196, 71, 4, 208, 171, 35, 2, 1, 196, + 71, 4, 237, 214, 35, 2, 1, 196, 71, 4, 208, 172, 23, 195, 169, 35, 2, 1, + 196, 71, 4, 237, 215, 23, 195, 169, 35, 2, 1, 196, 71, 4, 208, 172, 23, + 210, 245, 35, 2, 1, 196, 71, 4, 237, 215, 23, 210, 245, 35, 2, 1, 196, + 71, 4, 208, 172, 23, 210, 6, 35, 2, 1, 196, 71, 4, 237, 215, 23, 210, 6, + 35, 6, 1, 196, 71, 4, 237, 214, 35, 6, 1, 196, 71, 4, 237, 215, 23, 195, + 169, 35, 6, 1, 196, 71, 4, 237, 215, 23, 210, 245, 35, 6, 1, 196, 71, 4, + 237, 215, 23, 210, 6, 35, 2, 1, 211, 113, 4, 208, 171, 35, 2, 1, 211, + 113, 4, 237, 214, 35, 2, 1, 211, 113, 4, 208, 172, 23, 195, 169, 35, 2, + 1, 211, 113, 4, 237, 215, 23, 195, 169, 35, 2, 1, 211, 113, 4, 208, 172, + 23, 210, 245, 35, 2, 1, 211, 113, 4, 237, 215, 23, 210, 245, 35, 2, 1, + 211, 113, 4, 208, 172, 23, 210, 6, 35, 2, 1, 211, 113, 4, 237, 215, 23, + 210, 6, 35, 6, 1, 211, 113, 4, 208, 171, 35, 6, 1, 211, 113, 4, 237, 214, + 35, 6, 1, 211, 113, 4, 208, 172, 23, 195, 169, 35, 6, 1, 211, 113, 4, + 237, 215, 23, 195, 169, 35, 6, 1, 211, 113, 4, 208, 172, 23, 210, 245, + 35, 6, 1, 211, 113, 4, 237, 215, 23, 210, 245, 35, 6, 1, 211, 113, 4, + 208, 172, 23, 210, 6, 35, 6, 1, 211, 113, 4, 237, 215, 23, 210, 6, 35, 2, + 1, 251, 163, 4, 195, 169, 35, 2, 1, 251, 163, 4, 210, 245, 35, 2, 1, 234, + 50, 4, 195, 169, 35, 2, 1, 234, 50, 4, 210, 245, 35, 2, 1, 234, 0, 4, + 195, 169, 35, 2, 1, 234, 0, 4, 210, 245, 35, 2, 1, 223, 86, 4, 195, 169, + 35, 2, 1, 223, 86, 4, 210, 245, 35, 2, 1, 211, 110, 4, 195, 169, 35, 2, + 1, 211, 110, 4, 210, 245, 35, 2, 1, 196, 71, 4, 195, 169, 35, 2, 1, 196, + 71, 4, 210, 245, 35, 2, 1, 211, 113, 4, 195, 169, 35, 2, 1, 211, 113, 4, + 210, 245, 35, 2, 1, 251, 163, 4, 208, 172, 23, 191, 233, 35, 2, 1, 251, + 163, 4, 237, 215, 23, 191, 233, 35, 2, 1, 251, 163, 4, 208, 172, 23, 195, + 170, 23, 191, 233, 35, 2, 1, 251, 163, 4, 237, 215, 23, 195, 170, 23, + 191, 233, 35, 2, 1, 251, 163, 4, 208, 172, 23, 210, 246, 23, 191, 233, + 35, 2, 1, 251, 163, 4, 237, 215, 23, 210, 246, 23, 191, 233, 35, 2, 1, + 251, 163, 4, 208, 172, 23, 210, 7, 23, 191, 233, 35, 2, 1, 251, 163, 4, + 237, 215, 23, 210, 7, 23, 191, 233, 35, 6, 1, 251, 163, 4, 208, 172, 23, + 208, 186, 35, 6, 1, 251, 163, 4, 237, 215, 23, 208, 186, 35, 6, 1, 251, + 163, 4, 208, 172, 23, 195, 170, 23, 208, 186, 35, 6, 1, 251, 163, 4, 237, + 215, 23, 195, 170, 23, 208, 186, 35, 6, 1, 251, 163, 4, 208, 172, 23, + 210, 246, 23, 208, 186, 35, 6, 1, 251, 163, 4, 237, 215, 23, 210, 246, + 23, 208, 186, 35, 6, 1, 251, 163, 4, 208, 172, 23, 210, 7, 23, 208, 186, + 35, 6, 1, 251, 163, 4, 237, 215, 23, 210, 7, 23, 208, 186, 35, 2, 1, 234, + 0, 4, 208, 172, 23, 191, 233, 35, 2, 1, 234, 0, 4, 237, 215, 23, 191, + 233, 35, 2, 1, 234, 0, 4, 208, 172, 23, 195, 170, 23, 191, 233, 35, 2, 1, + 234, 0, 4, 237, 215, 23, 195, 170, 23, 191, 233, 35, 2, 1, 234, 0, 4, + 208, 172, 23, 210, 246, 23, 191, 233, 35, 2, 1, 234, 0, 4, 237, 215, 23, + 210, 246, 23, 191, 233, 35, 2, 1, 234, 0, 4, 208, 172, 23, 210, 7, 23, + 191, 233, 35, 2, 1, 234, 0, 4, 237, 215, 23, 210, 7, 23, 191, 233, 35, 6, + 1, 234, 0, 4, 208, 172, 23, 208, 186, 35, 6, 1, 234, 0, 4, 237, 215, 23, + 208, 186, 35, 6, 1, 234, 0, 4, 208, 172, 23, 195, 170, 23, 208, 186, 35, + 6, 1, 234, 0, 4, 237, 215, 23, 195, 170, 23, 208, 186, 35, 6, 1, 234, 0, + 4, 208, 172, 23, 210, 246, 23, 208, 186, 35, 6, 1, 234, 0, 4, 237, 215, + 23, 210, 246, 23, 208, 186, 35, 6, 1, 234, 0, 4, 208, 172, 23, 210, 7, + 23, 208, 186, 35, 6, 1, 234, 0, 4, 237, 215, 23, 210, 7, 23, 208, 186, + 35, 2, 1, 211, 113, 4, 208, 172, 23, 191, 233, 35, 2, 1, 211, 113, 4, + 237, 215, 23, 191, 233, 35, 2, 1, 211, 113, 4, 208, 172, 23, 195, 170, + 23, 191, 233, 35, 2, 1, 211, 113, 4, 237, 215, 23, 195, 170, 23, 191, + 233, 35, 2, 1, 211, 113, 4, 208, 172, 23, 210, 246, 23, 191, 233, 35, 2, + 1, 211, 113, 4, 237, 215, 23, 210, 246, 23, 191, 233, 35, 2, 1, 211, 113, + 4, 208, 172, 23, 210, 7, 23, 191, 233, 35, 2, 1, 211, 113, 4, 237, 215, + 23, 210, 7, 23, 191, 233, 35, 6, 1, 211, 113, 4, 208, 172, 23, 208, 186, + 35, 6, 1, 211, 113, 4, 237, 215, 23, 208, 186, 35, 6, 1, 211, 113, 4, + 208, 172, 23, 195, 170, 23, 208, 186, 35, 6, 1, 211, 113, 4, 237, 215, + 23, 195, 170, 23, 208, 186, 35, 6, 1, 211, 113, 4, 208, 172, 23, 210, + 246, 23, 208, 186, 35, 6, 1, 211, 113, 4, 237, 215, 23, 210, 246, 23, + 208, 186, 35, 6, 1, 211, 113, 4, 208, 172, 23, 210, 7, 23, 208, 186, 35, + 6, 1, 211, 113, 4, 237, 215, 23, 210, 7, 23, 208, 186, 35, 2, 1, 251, + 163, 4, 194, 254, 35, 2, 1, 251, 163, 4, 217, 148, 35, 2, 1, 251, 163, 4, + 195, 170, 23, 191, 233, 35, 2, 1, 251, 163, 4, 191, 233, 35, 2, 1, 251, + 163, 4, 210, 246, 23, 191, 233, 35, 2, 1, 251, 163, 4, 210, 6, 35, 2, 1, + 251, 163, 4, 210, 7, 23, 191, 233, 35, 6, 1, 251, 163, 4, 194, 254, 35, + 6, 1, 251, 163, 4, 217, 148, 35, 6, 1, 251, 163, 4, 195, 169, 35, 6, 1, + 251, 163, 4, 210, 245, 35, 6, 1, 251, 163, 4, 208, 186, 35, 221, 32, 35, + 208, 186, 35, 208, 171, 35, 210, 6, 35, 237, 38, 23, 210, 6, 35, 2, 1, + 234, 0, 4, 195, 170, 23, 191, 233, 35, 2, 1, 234, 0, 4, 191, 233, 35, 2, + 1, 234, 0, 4, 210, 246, 23, 191, 233, 35, 2, 1, 234, 0, 4, 210, 6, 35, 2, + 1, 234, 0, 4, 210, 7, 23, 191, 233, 35, 6, 1, 234, 50, 4, 195, 169, 35, + 6, 1, 234, 50, 4, 210, 245, 35, 6, 1, 234, 0, 4, 195, 169, 35, 6, 1, 234, + 0, 4, 210, 245, 35, 6, 1, 234, 0, 4, 208, 186, 35, 208, 172, 23, 195, + 169, 35, 208, 172, 23, 210, 245, 35, 208, 172, 23, 210, 6, 35, 2, 1, 223, + 86, 4, 194, 254, 35, 2, 1, 223, 86, 4, 217, 148, 35, 2, 1, 223, 86, 4, + 237, 38, 23, 195, 169, 35, 2, 1, 223, 86, 4, 237, 38, 23, 210, 245, 35, + 2, 1, 223, 86, 4, 210, 6, 35, 2, 1, 223, 86, 4, 237, 38, 23, 210, 6, 35, + 6, 1, 223, 86, 4, 194, 254, 35, 6, 1, 223, 86, 4, 217, 148, 35, 6, 1, + 223, 86, 4, 195, 169, 35, 6, 1, 223, 86, 4, 210, 245, 35, 237, 215, 23, + 195, 169, 35, 237, 215, 23, 210, 245, 35, 237, 215, 23, 210, 6, 35, 2, 1, + 196, 71, 4, 194, 254, 35, 2, 1, 196, 71, 4, 217, 148, 35, 2, 1, 196, 71, + 4, 237, 38, 23, 195, 169, 35, 2, 1, 196, 71, 4, 237, 38, 23, 210, 245, + 35, 2, 1, 207, 5, 4, 208, 171, 35, 2, 1, 207, 5, 4, 237, 214, 35, 2, 1, + 196, 71, 4, 210, 6, 35, 2, 1, 196, 71, 4, 237, 38, 23, 210, 6, 35, 6, 1, + 196, 71, 4, 194, 254, 35, 6, 1, 196, 71, 4, 217, 148, 35, 6, 1, 196, 71, + 4, 195, 169, 35, 6, 1, 196, 71, 4, 210, 245, 35, 6, 1, 207, 5, 4, 237, + 214, 35, 237, 38, 23, 195, 169, 35, 237, 38, 23, 210, 245, 35, 195, 169, + 35, 2, 1, 211, 113, 4, 195, 170, 23, 191, 233, 35, 2, 1, 211, 113, 4, + 191, 233, 35, 2, 1, 211, 113, 4, 210, 246, 23, 191, 233, 35, 2, 1, 211, + 113, 4, 210, 6, 35, 2, 1, 211, 113, 4, 210, 7, 23, 191, 233, 35, 6, 1, + 211, 110, 4, 195, 169, 35, 6, 1, 211, 110, 4, 210, 245, 35, 6, 1, 211, + 113, 4, 195, 169, 35, 6, 1, 211, 113, 4, 210, 245, 35, 6, 1, 211, 113, 4, + 208, 186, 35, 210, 245, 35, 237, 214, 234, 106, 208, 32, 234, 117, 208, + 32, 234, 106, 201, 248, 234, 117, 201, 248, 198, 219, 201, 248, 232, 128, + 201, 248, 202, 135, 201, 248, 233, 15, 201, 248, 208, 154, 201, 248, 199, + 4, 201, 248, 230, 81, 201, 248, 191, 78, 193, 75, 201, 248, 191, 78, 193, + 75, 213, 31, 191, 78, 193, 75, 222, 198, 219, 217, 77, 206, 200, 77, 228, + 90, 213, 32, 228, 90, 233, 15, 237, 217, 234, 106, 237, 217, 234, 117, + 237, 217, 228, 243, 164, 55, 81, 219, 114, 55, 130, 219, 114, 45, 202, + 171, 207, 254, 77, 50, 202, 171, 207, 254, 77, 202, 171, 218, 242, 207, + 254, 77, 202, 171, 229, 134, 207, 254, 77, 45, 55, 207, 254, 77, 50, 55, + 207, 254, 77, 55, 218, 242, 207, 254, 77, 55, 229, 134, 207, 254, 77, + 238, 16, 55, 238, 16, 247, 250, 197, 238, 247, 250, 91, 75, 219, 238, + 105, 75, 219, 238, 228, 243, 234, 122, 228, 88, 209, 63, 219, 115, 204, + 11, 210, 130, 204, 11, 219, 217, 234, 115, 206, 200, 234, 115, 209, 36, + 236, 234, 232, 146, 219, 217, 210, 254, 206, 200, 210, 254, 214, 217, + 213, 39, 201, 248, 210, 16, 216, 52, 56, 210, 16, 199, 96, 198, 230, 56, + 208, 217, 55, 208, 217, 197, 225, 208, 217, 207, 19, 208, 217, 207, 19, + 55, 208, 217, 207, 19, 197, 225, 208, 217, 247, 98, 202, 171, 219, 221, + 251, 118, 207, 254, 77, 202, 171, 206, 204, 251, 118, 207, 254, 77, 207, + 85, 77, 55, 233, 218, 77, 223, 104, 211, 0, 196, 100, 246, 242, 198, 178, + 247, 99, 223, 121, 209, 63, 250, 193, 228, 91, 247, 250, 232, 120, 202, + 98, 45, 51, 248, 56, 4, 208, 9, 50, 51, 248, 56, 4, 208, 9, 55, 208, 15, + 77, 208, 15, 233, 218, 77, 233, 218, 208, 15, 77, 198, 128, 3, 234, 1, + 207, 19, 209, 144, 56, 62, 118, 247, 250, 62, 96, 247, 250, 130, 250, + 195, 207, 19, 204, 26, 242, 222, 196, 77, 105, 250, 194, 251, 180, 195, + 84, 242, 74, 216, 37, 56, 200, 129, 237, 217, 223, 95, 196, 100, 232, + 189, 208, 154, 77, 115, 75, 208, 153, 208, 28, 208, 217, 232, 130, 75, + 208, 153, 232, 228, 75, 208, 153, 105, 75, 208, 153, 232, 130, 75, 77, + 235, 140, 238, 219, 197, 237, 81, 232, 130, 236, 140, 216, 215, 13, 201, + 248, 193, 23, 222, 198, 232, 79, 251, 46, 223, 93, 198, 144, 223, 93, + 204, 11, 223, 93, 209, 83, 219, 217, 223, 61, 206, 200, 223, 61, 232, + 240, 201, 15, 223, 61, 209, 36, 236, 234, 223, 61, 223, 134, 200, 75, + 200, 147, 252, 51, 200, 75, 200, 147, 223, 134, 9, 232, 148, 203, 134, + 252, 51, 9, 232, 148, 203, 134, 214, 210, 17, 203, 135, 213, 35, 17, 203, + 135, 200, 182, 191, 77, 200, 182, 8, 2, 1, 68, 200, 182, 134, 200, 182, + 150, 200, 182, 169, 200, 182, 175, 200, 182, 171, 200, 182, 178, 200, + 182, 108, 56, 200, 182, 216, 36, 200, 182, 234, 45, 56, 200, 182, 45, + 210, 115, 200, 182, 50, 210, 115, 200, 182, 8, 2, 1, 215, 63, 200, 231, + 191, 77, 200, 231, 107, 200, 231, 109, 200, 231, 138, 200, 231, 134, 200, + 231, 150, 200, 231, 169, 200, 231, 175, 200, 231, 171, 200, 231, 178, + 200, 231, 108, 56, 200, 231, 216, 36, 200, 231, 234, 45, 56, 200, 231, + 45, 210, 115, 200, 231, 50, 210, 115, 8, 200, 231, 2, 1, 65, 8, 200, 231, + 2, 1, 71, 8, 200, 231, 2, 1, 74, 8, 200, 231, 2, 1, 192, 235, 8, 200, + 231, 2, 1, 205, 87, 8, 200, 231, 2, 1, 230, 118, 8, 200, 231, 2, 1, 222, + 154, 8, 200, 231, 2, 1, 172, 8, 200, 231, 2, 1, 218, 170, 8, 200, 231, 2, + 1, 215, 63, 8, 200, 231, 2, 1, 210, 238, 8, 200, 231, 2, 1, 206, 9, 8, + 200, 231, 2, 1, 200, 43, 233, 235, 56, 242, 86, 56, 238, 202, 56, 232, + 108, 232, 113, 56, 219, 93, 56, 216, 53, 56, 214, 236, 56, 209, 247, 56, + 206, 37, 56, 193, 31, 56, 214, 82, 203, 100, 56, 236, 151, 56, 233, 236, + 56, 221, 137, 56, 197, 81, 56, 235, 118, 56, 231, 140, 210, 29, 56, 209, + 244, 56, 230, 176, 56, 250, 155, 56, 228, 168, 56, 247, 39, 56, 219, 83, + 198, 33, 56, 201, 227, 56, 199, 93, 56, 223, 149, 206, 37, 56, 197, 60, + 219, 93, 56, 213, 21, 87, 56, 217, 90, 56, 206, 60, 56, 220, 11, 56, 248, + 149, 56, 202, 23, 56, 33, 45, 230, 15, 58, 33, 50, 230, 15, 58, 33, 180, + 81, 219, 115, 211, 1, 33, 203, 41, 81, 219, 115, 211, 1, 33, 251, 87, 64, + 58, 33, 242, 223, 64, 58, 33, 45, 64, 58, 33, 50, 64, 58, 33, 206, 190, + 211, 1, 33, 242, 223, 206, 190, 211, 1, 33, 251, 87, 206, 190, 211, 1, + 33, 115, 185, 58, 33, 232, 130, 185, 58, 33, 234, 101, 243, 12, 33, 234, + 101, 201, 191, 33, 234, 101, 237, 34, 33, 234, 101, 243, 13, 249, 143, + 33, 45, 50, 64, 58, 33, 234, 101, 205, 77, 33, 234, 101, 221, 220, 33, + 234, 101, 196, 68, 209, 60, 197, 241, 33, 207, 20, 202, 25, 211, 1, 33, + 55, 81, 201, 29, 211, 1, 33, 251, 97, 113, 33, 197, 225, 196, 102, 33, + 193, 78, 248, 31, 58, 33, 118, 64, 211, 1, 33, 180, 55, 202, 25, 211, 1, + 33, 96, 230, 15, 4, 182, 235, 120, 33, 118, 230, 15, 4, 182, 235, 120, + 33, 45, 64, 60, 33, 50, 64, 60, 33, 250, 196, 58, 252, 57, 211, 148, 252, + 40, 119, 199, 34, 200, 241, 235, 131, 6, 247, 195, 237, 127, 247, 29, + 247, 24, 219, 115, 113, 247, 100, 211, 148, 247, 154, 196, 112, 233, 237, + 239, 40, 205, 73, 237, 127, 233, 93, 27, 2, 232, 53, 27, 6, 230, 118, + 248, 139, 6, 230, 118, 235, 131, 6, 230, 118, 209, 105, 239, 40, 209, + 105, 239, 41, 139, 105, 209, 187, 27, 6, 68, 248, 139, 6, 68, 27, 6, 172, + 27, 2, 172, 220, 145, 78, 249, 90, 113, 235, 131, 6, 215, 63, 212, 134, + 56, 202, 6, 207, 97, 239, 7, 27, 6, 210, 238, 235, 131, 6, 210, 238, 235, + 131, 6, 208, 106, 27, 6, 146, 248, 139, 6, 146, 235, 131, 6, 146, 208, + 225, 199, 208, 207, 32, 204, 2, 77, 199, 107, 56, 198, 22, 87, 56, 195, + 136, 235, 131, 6, 191, 166, 211, 20, 56, 211, 137, 56, 223, 95, 211, 137, + 56, 248, 139, 6, 191, 166, 154, 35, 2, 1, 223, 85, 222, 5, 56, 251, 112, + 56, 27, 6, 250, 122, 248, 139, 6, 247, 195, 234, 6, 113, 27, 2, 71, 27, + 6, 71, 27, 6, 233, 177, 154, 6, 233, 177, 27, 6, 218, 170, 27, 2, 74, + 131, 113, 248, 217, 113, 231, 41, 113, 238, 0, 113, 223, 139, 202, 4, + 206, 123, 6, 208, 106, 233, 96, 56, 235, 131, 2, 209, 187, 235, 131, 2, + 231, 213, 235, 131, 6, 231, 213, 235, 131, 6, 209, 187, 235, 131, 215, + 62, 200, 201, 154, 49, 6, 232, 53, 154, 49, 6, 172, 207, 19, 49, 6, 172, + 154, 49, 6, 192, 159, 235, 131, 43, 6, 238, 129, 235, 131, 43, 2, 238, + 129, 235, 131, 43, 2, 71, 235, 131, 43, 2, 68, 235, 131, 43, 2, 223, 37, + 208, 190, 219, 114, 154, 251, 139, 210, 16, 56, 251, 212, 154, 2, 233, + 177, 16, 40, 205, 152, 202, 4, 193, 246, 232, 120, 91, 203, 244, 193, + 246, 232, 120, 91, 213, 169, 193, 246, 232, 120, 91, 199, 86, 193, 246, + 232, 120, 91, 199, 0, 193, 246, 232, 120, 105, 198, 253, 193, 246, 232, + 120, 91, 233, 20, 193, 246, 232, 120, 105, 233, 19, 193, 246, 232, 120, + 115, 233, 19, 193, 246, 232, 120, 232, 130, 233, 19, 193, 246, 232, 120, + 91, 202, 125, 193, 246, 232, 120, 232, 228, 202, 123, 193, 246, 232, 120, + 91, 234, 161, 193, 246, 232, 120, 115, 234, 159, 193, 246, 232, 120, 232, + 228, 234, 159, 193, 246, 232, 120, 203, 248, 234, 159, 232, 120, 212, + 135, 107, 206, 137, 212, 136, 107, 206, 137, 212, 136, 109, 206, 137, + 212, 136, 138, 206, 137, 212, 136, 134, 206, 137, 212, 136, 150, 206, + 137, 212, 136, 169, 206, 137, 212, 136, 175, 206, 137, 212, 136, 171, + 206, 137, 212, 136, 178, 206, 137, 212, 136, 199, 95, 206, 137, 212, 136, + 234, 129, 206, 137, 212, 136, 197, 37, 206, 137, 212, 136, 233, 17, 206, + 137, 212, 136, 91, 228, 142, 206, 137, 212, 136, 232, 228, 228, 142, 206, + 137, 212, 136, 91, 189, 2, 206, 137, 212, 136, 107, 2, 206, 137, 212, + 136, 109, 2, 206, 137, 212, 136, 138, 2, 206, 137, 212, 136, 134, 2, 206, + 137, 212, 136, 150, 2, 206, 137, 212, 136, 169, 2, 206, 137, 212, 136, + 175, 2, 206, 137, 212, 136, 171, 2, 206, 137, 212, 136, 178, 2, 206, 137, + 212, 136, 199, 95, 2, 206, 137, 212, 136, 234, 129, 2, 206, 137, 212, + 136, 197, 37, 2, 206, 137, 212, 136, 233, 17, 2, 206, 137, 212, 136, 91, + 228, 142, 2, 206, 137, 212, 136, 232, 228, 228, 142, 2, 206, 137, 212, + 136, 91, 189, 206, 137, 212, 136, 91, 198, 230, 247, 196, 238, 129, 206, + 137, 212, 136, 232, 228, 189, 206, 137, 212, 136, 199, 96, 189, 206, 137, + 212, 136, 207, 19, 91, 228, 142, 8, 2, 1, 207, 19, 247, 195, 206, 137, + 212, 136, 202, 137, 220, 6, 20, 206, 137, 212, 136, 233, 18, 234, 212, + 20, 206, 137, 212, 136, 233, 18, 189, 206, 137, 212, 136, 91, 228, 143, + 189, 193, 246, 232, 120, 191, 78, 198, 253, 154, 17, 109, 154, 17, 138, + 118, 57, 196, 66, 57, 96, 57, 235, 121, 57, 45, 50, 57, 133, 144, 57, + 186, 193, 105, 57, 186, 234, 206, 57, 202, 3, 234, 206, 57, 202, 3, 193, 105, 57, 118, 64, 4, 106, 96, 64, 4, 106, 118, 193, 139, 57, 96, 193, - 139, 57, 118, 105, 229, 233, 57, 196, 66, 105, 229, 233, 57, 96, 105, - 229, 233, 57, 235, 119, 105, 229, 233, 57, 118, 64, 4, 199, 215, 96, 64, - 4, 199, 215, 118, 64, 232, 98, 164, 196, 66, 64, 232, 98, 164, 96, 64, - 232, 98, 164, 235, 119, 64, 232, 98, 164, 133, 144, 64, 4, 249, 74, 118, - 64, 4, 102, 96, 64, 4, 102, 118, 64, 4, 219, 4, 96, 64, 4, 219, 4, 45, - 50, 193, 139, 57, 45, 50, 64, 4, 106, 235, 119, 191, 21, 57, 196, 66, 64, - 4, 198, 136, 219, 214, 196, 66, 64, 4, 198, 136, 206, 197, 235, 119, 64, - 4, 198, 136, 219, 214, 235, 119, 64, 4, 198, 136, 206, 197, 96, 64, 4, - 239, 2, 235, 118, 235, 119, 64, 4, 239, 2, 219, 214, 251, 85, 198, 54, - 204, 28, 57, 242, 221, 198, 54, 204, 28, 57, 186, 193, 105, 64, 119, 179, - 164, 118, 64, 119, 249, 88, 139, 96, 64, 119, 164, 251, 85, 211, 77, 243, - 11, 57, 242, 221, 211, 77, 243, 11, 57, 118, 230, 13, 4, 181, 196, 65, - 118, 230, 13, 4, 181, 235, 118, 196, 66, 230, 13, 4, 181, 206, 197, 196, - 66, 230, 13, 4, 181, 219, 214, 96, 230, 13, 4, 181, 196, 65, 96, 230, 13, - 4, 181, 235, 118, 235, 119, 230, 13, 4, 181, 206, 197, 235, 119, 230, 13, - 4, 181, 219, 214, 96, 64, 139, 118, 57, 196, 66, 64, 118, 79, 235, 119, - 57, 118, 64, 139, 96, 57, 118, 210, 196, 250, 231, 196, 66, 210, 196, - 250, 231, 96, 210, 196, 250, 231, 235, 119, 210, 196, 250, 231, 118, 230, - 13, 139, 96, 230, 12, 96, 230, 13, 139, 118, 230, 12, 118, 55, 64, 4, + 139, 57, 118, 105, 229, 235, 57, 196, 66, 105, 229, 235, 57, 96, 105, + 229, 235, 57, 235, 121, 105, 229, 235, 57, 118, 64, 4, 199, 215, 96, 64, + 4, 199, 215, 118, 64, 232, 100, 164, 196, 66, 64, 232, 100, 164, 96, 64, + 232, 100, 164, 235, 121, 64, 232, 100, 164, 133, 144, 64, 4, 249, 76, + 118, 64, 4, 102, 96, 64, 4, 102, 118, 64, 4, 219, 6, 96, 64, 4, 219, 6, + 45, 50, 193, 139, 57, 45, 50, 64, 4, 106, 235, 121, 191, 21, 57, 196, 66, + 64, 4, 198, 136, 219, 216, 196, 66, 64, 4, 198, 136, 206, 198, 235, 121, + 64, 4, 198, 136, 219, 216, 235, 121, 64, 4, 198, 136, 206, 198, 96, 64, + 4, 239, 4, 235, 120, 235, 121, 64, 4, 239, 4, 219, 216, 251, 87, 198, 54, + 204, 29, 57, 242, 223, 198, 54, 204, 29, 57, 186, 193, 105, 64, 119, 180, + 164, 118, 64, 119, 249, 90, 139, 96, 64, 119, 164, 251, 87, 211, 79, 243, + 13, 57, 242, 223, 211, 79, 243, 13, 57, 118, 230, 15, 4, 182, 196, 65, + 118, 230, 15, 4, 182, 235, 120, 196, 66, 230, 15, 4, 182, 206, 198, 196, + 66, 230, 15, 4, 182, 219, 216, 96, 230, 15, 4, 182, 196, 65, 96, 230, 15, + 4, 182, 235, 120, 235, 121, 230, 15, 4, 182, 206, 198, 235, 121, 230, 15, + 4, 182, 219, 216, 96, 64, 139, 118, 57, 196, 66, 64, 118, 79, 235, 121, + 57, 118, 64, 139, 96, 57, 118, 210, 198, 250, 233, 196, 66, 210, 198, + 250, 233, 96, 210, 198, 250, 233, 235, 121, 210, 198, 250, 233, 118, 230, + 15, 139, 96, 230, 14, 96, 230, 15, 139, 118, 230, 14, 118, 55, 64, 4, 106, 45, 50, 55, 64, 4, 106, 96, 55, 64, 4, 106, 118, 55, 57, 196, 66, - 55, 57, 96, 55, 57, 235, 119, 55, 57, 45, 50, 55, 57, 133, 144, 55, 57, - 186, 193, 105, 55, 57, 186, 234, 204, 55, 57, 202, 2, 234, 204, 55, 57, - 202, 2, 193, 105, 55, 57, 118, 197, 225, 57, 96, 197, 225, 57, 118, 201, - 183, 57, 96, 201, 183, 57, 196, 66, 64, 4, 55, 106, 235, 119, 64, 4, 55, - 106, 118, 237, 214, 57, 196, 66, 237, 214, 57, 96, 237, 214, 57, 235, - 119, 237, 214, 57, 118, 64, 119, 164, 96, 64, 119, 164, 118, 63, 57, 196, - 66, 63, 57, 96, 63, 57, 235, 119, 63, 57, 196, 66, 63, 64, 232, 98, 164, - 196, 66, 63, 64, 211, 105, 210, 52, 196, 66, 63, 64, 211, 105, 210, 53, - 4, 228, 241, 164, 196, 66, 63, 64, 211, 105, 210, 53, 4, 81, 164, 196, - 66, 63, 55, 57, 196, 66, 63, 55, 64, 211, 105, 210, 52, 96, 63, 64, 232, - 98, 193, 167, 186, 193, 105, 64, 119, 239, 1, 202, 2, 234, 204, 64, 119, - 239, 1, 133, 144, 63, 57, 50, 64, 4, 2, 243, 10, 235, 119, 64, 118, 79, - 196, 66, 57, 115, 96, 250, 231, 118, 64, 4, 81, 106, 96, 64, 4, 81, 106, + 55, 57, 96, 55, 57, 235, 121, 55, 57, 45, 50, 55, 57, 133, 144, 55, 57, + 186, 193, 105, 55, 57, 186, 234, 206, 55, 57, 202, 3, 234, 206, 55, 57, + 202, 3, 193, 105, 55, 57, 118, 197, 225, 57, 96, 197, 225, 57, 118, 201, + 184, 57, 96, 201, 184, 57, 196, 66, 64, 4, 55, 106, 235, 121, 64, 4, 55, + 106, 118, 237, 216, 57, 196, 66, 237, 216, 57, 96, 237, 216, 57, 235, + 121, 237, 216, 57, 118, 64, 119, 164, 96, 64, 119, 164, 118, 63, 57, 196, + 66, 63, 57, 96, 63, 57, 235, 121, 63, 57, 196, 66, 63, 64, 232, 100, 164, + 196, 66, 63, 64, 211, 107, 210, 54, 196, 66, 63, 64, 211, 107, 210, 55, + 4, 228, 243, 164, 196, 66, 63, 64, 211, 107, 210, 55, 4, 81, 164, 196, + 66, 63, 55, 57, 196, 66, 63, 55, 64, 211, 107, 210, 54, 96, 63, 64, 232, + 100, 193, 167, 186, 193, 105, 64, 119, 239, 3, 202, 3, 234, 206, 64, 119, + 239, 3, 133, 144, 63, 57, 50, 64, 4, 2, 243, 12, 235, 121, 64, 118, 79, + 196, 66, 57, 115, 96, 250, 233, 118, 64, 4, 81, 106, 96, 64, 4, 81, 106, 45, 50, 64, 4, 81, 106, 118, 64, 4, 55, 81, 106, 96, 64, 4, 55, 81, 106, - 45, 50, 64, 4, 55, 81, 106, 118, 211, 74, 57, 96, 211, 74, 57, 45, 50, - 211, 74, 57, 40, 251, 174, 242, 68, 210, 105, 237, 16, 199, 24, 233, 211, - 199, 24, 236, 164, 213, 12, 233, 212, 234, 105, 203, 252, 223, 151, 214, - 245, 234, 132, 211, 146, 213, 12, 251, 133, 234, 132, 211, 146, 2, 234, - 132, 211, 146, 239, 32, 250, 220, 216, 190, 236, 164, 213, 12, 239, 34, - 250, 220, 216, 190, 2, 239, 32, 250, 220, 216, 190, 234, 95, 79, 208, - 190, 215, 60, 208, 200, 215, 60, 239, 9, 215, 60, 200, 201, 216, 35, 56, - 216, 33, 56, 75, 209, 81, 236, 200, 202, 97, 203, 253, 216, 34, 250, 194, - 211, 66, 206, 189, 211, 66, 247, 249, 211, 66, 51, 206, 128, 238, 191, - 206, 128, 232, 121, 206, 128, 208, 186, 159, 223, 139, 50, 251, 115, 251, - 115, 216, 226, 251, 115, 201, 225, 251, 115, 236, 203, 236, 164, 213, 12, - 236, 207, 210, 119, 159, 213, 12, 210, 119, 159, 219, 29, 251, 125, 219, - 29, 211, 56, 223, 99, 196, 92, 223, 113, 55, 223, 113, 197, 225, 223, - 113, 239, 26, 223, 113, 200, 171, 223, 113, 195, 11, 223, 113, 242, 221, - 223, 113, 242, 221, 239, 26, 223, 113, 251, 85, 239, 26, 223, 113, 199, - 23, 249, 3, 207, 126, 208, 187, 75, 216, 34, 233, 219, 231, 144, 208, - 187, 229, 0, 198, 153, 211, 66, 207, 18, 198, 152, 223, 93, 219, 245, - 206, 8, 202, 172, 193, 138, 193, 10, 208, 200, 213, 12, 198, 152, 216, - 35, 198, 152, 250, 186, 234, 45, 159, 213, 12, 250, 186, 234, 45, 159, - 251, 40, 234, 45, 159, 251, 40, 247, 218, 213, 12, 252, 48, 234, 45, 159, - 214, 105, 251, 40, 213, 21, 252, 48, 234, 45, 159, 251, 165, 234, 45, - 159, 213, 12, 251, 165, 234, 45, 159, 251, 165, 234, 45, 211, 57, 234, - 45, 159, 197, 225, 198, 152, 251, 175, 234, 45, 159, 234, 36, 159, 231, - 143, 234, 36, 159, 237, 17, 248, 209, 251, 42, 199, 34, 219, 120, 231, - 143, 234, 45, 159, 251, 40, 234, 45, 119, 211, 57, 199, 34, 223, 178, - 211, 146, 223, 178, 79, 211, 57, 251, 40, 234, 45, 159, 242, 84, 234, 42, - 234, 43, 242, 83, 206, 189, 223, 163, 234, 45, 159, 206, 189, 234, 45, - 159, 238, 250, 159, 234, 3, 234, 41, 159, 201, 103, 234, 42, 237, 107, - 234, 45, 159, 234, 45, 119, 247, 205, 237, 126, 216, 226, 247, 204, 208, - 11, 234, 45, 159, 213, 12, 234, 45, 159, 228, 17, 159, 213, 12, 228, 17, - 159, 201, 35, 234, 36, 159, 219, 180, 211, 57, 234, 45, 159, 230, 204, - 211, 57, 234, 45, 159, 219, 180, 139, 234, 45, 159, 230, 204, 139, 234, - 45, 159, 219, 180, 247, 218, 213, 12, 234, 45, 159, 230, 204, 247, 218, - 213, 12, 234, 45, 159, 215, 145, 219, 179, 215, 145, 230, 203, 248, 209, - 213, 12, 234, 36, 159, 213, 12, 219, 179, 213, 12, 230, 203, 214, 105, - 219, 180, 213, 21, 234, 45, 159, 214, 105, 230, 204, 213, 21, 234, 45, - 159, 219, 180, 211, 57, 234, 36, 159, 230, 204, 211, 57, 234, 36, 159, - 214, 105, 219, 180, 213, 21, 234, 36, 159, 214, 105, 230, 204, 213, 21, - 234, 36, 159, 219, 180, 211, 57, 230, 203, 230, 204, 211, 57, 219, 179, - 214, 105, 219, 180, 213, 21, 230, 203, 214, 105, 230, 204, 213, 21, 219, - 179, 208, 231, 200, 220, 208, 232, 211, 57, 234, 45, 159, 200, 221, 211, - 57, 234, 45, 159, 208, 232, 211, 57, 234, 36, 159, 200, 221, 211, 57, - 234, 36, 159, 236, 164, 213, 12, 208, 234, 236, 164, 213, 12, 200, 222, - 200, 229, 211, 146, 200, 181, 211, 146, 213, 12, 42, 200, 229, 211, 146, - 213, 12, 42, 200, 181, 211, 146, 200, 229, 79, 211, 57, 234, 45, 159, - 200, 181, 79, 211, 57, 234, 45, 159, 214, 105, 42, 200, 229, 79, 213, 21, - 234, 45, 159, 214, 105, 42, 200, 181, 79, 213, 21, 234, 45, 159, 200, - 229, 79, 4, 213, 12, 234, 45, 159, 200, 181, 79, 4, 213, 12, 234, 45, - 159, 215, 124, 215, 125, 215, 126, 215, 125, 196, 92, 51, 223, 178, 211, - 146, 51, 211, 46, 211, 146, 51, 223, 178, 79, 211, 57, 234, 45, 159, 51, - 211, 46, 79, 211, 57, 234, 45, 159, 51, 247, 111, 51, 238, 181, 47, 209, - 81, 47, 216, 34, 47, 198, 144, 47, 236, 200, 202, 97, 47, 75, 211, 66, - 47, 206, 189, 211, 66, 47, 250, 194, 211, 66, 47, 234, 42, 47, 237, 215, - 112, 209, 81, 112, 216, 34, 112, 198, 144, 112, 75, 211, 66, 50, 199, - 228, 45, 199, 228, 144, 199, 228, 133, 199, 228, 250, 197, 216, 1, 197, - 201, 232, 152, 197, 225, 81, 249, 88, 50, 197, 57, 55, 81, 249, 88, 55, - 50, 197, 57, 236, 164, 213, 12, 208, 179, 213, 12, 197, 201, 236, 164, - 213, 12, 232, 153, 214, 108, 55, 81, 249, 88, 55, 50, 197, 57, 208, 232, - 196, 105, 207, 65, 200, 221, 196, 105, 207, 65, 213, 18, 200, 244, 211, - 146, 239, 32, 250, 220, 213, 18, 200, 243, 213, 18, 200, 244, 79, 211, - 57, 234, 45, 159, 239, 32, 250, 220, 213, 18, 200, 244, 211, 57, 234, 45, - 159, 211, 46, 211, 146, 223, 178, 211, 146, 215, 131, 229, 189, 239, 43, - 217, 27, 223, 110, 192, 192, 214, 224, 213, 20, 50, 251, 116, 4, 251, 16, - 50, 197, 241, 215, 60, 219, 29, 251, 125, 215, 60, 219, 29, 211, 56, 215, - 60, 223, 99, 215, 60, 196, 92, 237, 33, 211, 66, 75, 211, 66, 201, 103, - 211, 66, 236, 200, 198, 144, 248, 63, 45, 213, 18, 233, 93, 204, 24, 208, - 200, 50, 213, 18, 233, 93, 204, 24, 208, 200, 45, 204, 24, 208, 200, 50, - 204, 24, 208, 200, 207, 18, 198, 153, 234, 42, 238, 171, 219, 29, 211, - 56, 238, 171, 219, 29, 251, 125, 55, 200, 228, 55, 200, 180, 55, 223, 99, - 55, 196, 92, 209, 115, 234, 45, 23, 210, 119, 159, 219, 180, 4, 236, 140, - 230, 204, 4, 236, 140, 195, 83, 215, 145, 219, 179, 195, 83, 215, 145, - 230, 203, 219, 180, 234, 45, 119, 211, 57, 230, 203, 230, 204, 234, 45, - 119, 211, 57, 219, 179, 234, 45, 119, 211, 57, 219, 179, 234, 45, 119, - 211, 57, 230, 203, 234, 45, 119, 211, 57, 208, 231, 234, 45, 119, 211, - 57, 200, 220, 236, 164, 213, 12, 208, 235, 211, 57, 234, 44, 236, 164, - 213, 12, 200, 223, 211, 57, 234, 44, 213, 12, 51, 223, 178, 79, 211, 57, - 234, 45, 159, 213, 12, 51, 211, 46, 79, 211, 57, 234, 45, 159, 51, 223, - 178, 79, 211, 57, 213, 12, 234, 45, 159, 51, 211, 46, 79, 211, 57, 213, - 12, 234, 45, 159, 219, 180, 247, 218, 213, 12, 234, 36, 159, 230, 204, - 247, 218, 213, 12, 234, 36, 159, 208, 232, 247, 218, 213, 12, 234, 36, - 159, 200, 221, 247, 218, 213, 12, 234, 36, 159, 213, 12, 213, 18, 200, - 244, 211, 146, 236, 164, 213, 12, 239, 34, 250, 220, 213, 18, 200, 243, - 213, 12, 213, 18, 200, 244, 79, 211, 57, 234, 45, 159, 236, 164, 213, 12, - 239, 34, 250, 220, 213, 18, 200, 244, 211, 57, 234, 44, 81, 234, 120, - 216, 82, 228, 241, 234, 120, 133, 50, 237, 39, 234, 120, 144, 50, 237, - 39, 234, 120, 234, 132, 79, 4, 179, 228, 241, 106, 234, 132, 79, 4, 81, - 249, 88, 250, 183, 234, 95, 79, 228, 241, 106, 2, 234, 132, 79, 4, 81, - 249, 88, 250, 183, 234, 95, 79, 228, 241, 106, 234, 132, 79, 4, 75, 58, - 234, 132, 79, 4, 211, 6, 2, 234, 132, 79, 4, 211, 6, 234, 132, 79, 4, - 196, 103, 234, 132, 79, 4, 105, 228, 241, 201, 15, 239, 32, 4, 179, 228, - 241, 106, 239, 32, 4, 81, 249, 88, 250, 183, 234, 95, 79, 228, 241, 106, - 2, 239, 32, 4, 81, 249, 88, 250, 183, 234, 95, 79, 228, 241, 106, 239, - 32, 4, 211, 6, 2, 239, 32, 4, 211, 6, 191, 167, 213, 10, 249, 131, 216, - 189, 237, 34, 56, 234, 135, 57, 228, 172, 133, 250, 235, 144, 250, 235, - 208, 194, 209, 248, 193, 135, 219, 112, 45, 247, 30, 50, 247, 30, 45, - 232, 193, 50, 232, 193, 248, 77, 50, 238, 219, 248, 77, 45, 238, 219, - 198, 54, 50, 238, 219, 198, 54, 45, 238, 219, 207, 18, 213, 12, 56, 51, - 218, 232, 251, 16, 205, 43, 205, 52, 199, 107, 207, 96, 209, 25, 223, - 144, 195, 56, 201, 190, 209, 108, 79, 223, 109, 56, 153, 213, 12, 56, - 193, 145, 228, 174, 198, 54, 45, 239, 1, 198, 54, 50, 239, 1, 248, 77, - 45, 239, 1, 248, 77, 50, 239, 1, 198, 54, 132, 223, 113, 248, 77, 132, - 223, 113, 232, 93, 202, 65, 133, 250, 236, 248, 210, 105, 228, 241, 249, - 76, 211, 59, 221, 222, 234, 32, 119, 199, 34, 183, 192, 236, 223, 163, - 42, 207, 93, 248, 62, 221, 220, 219, 219, 251, 116, 248, 53, 206, 203, - 251, 116, 248, 53, 234, 32, 119, 199, 34, 219, 224, 248, 221, 206, 188, - 238, 138, 251, 175, 250, 244, 200, 74, 198, 39, 206, 41, 236, 252, 211, - 47, 239, 48, 199, 181, 202, 81, 238, 246, 238, 245, 251, 59, 232, 75, 16, - 228, 67, 251, 59, 232, 75, 16, 201, 181, 208, 30, 251, 59, 232, 75, 16, - 208, 31, 234, 44, 251, 59, 232, 75, 16, 208, 31, 236, 207, 251, 59, 232, - 75, 16, 208, 31, 237, 32, 251, 59, 232, 75, 16, 208, 31, 222, 188, 251, - 59, 232, 75, 16, 208, 31, 243, 10, 251, 59, 232, 75, 16, 243, 11, 201, - 71, 251, 59, 232, 75, 16, 243, 11, 222, 188, 251, 59, 232, 75, 16, 202, - 98, 164, 251, 59, 232, 75, 16, 249, 142, 164, 251, 59, 232, 75, 16, 208, - 31, 202, 97, 251, 59, 232, 75, 16, 208, 31, 249, 141, 251, 59, 232, 75, - 16, 208, 31, 219, 179, 251, 59, 232, 75, 16, 208, 31, 230, 203, 251, 59, - 232, 75, 16, 118, 195, 176, 251, 59, 232, 75, 16, 96, 195, 176, 251, 59, - 232, 75, 16, 208, 31, 118, 57, 251, 59, 232, 75, 16, 208, 31, 96, 57, - 251, 59, 232, 75, 16, 243, 11, 249, 141, 251, 59, 232, 75, 16, 144, 199, - 229, 196, 103, 251, 59, 232, 75, 16, 237, 107, 201, 71, 251, 59, 232, 75, - 16, 208, 31, 144, 247, 96, 251, 59, 232, 75, 16, 208, 31, 237, 106, 251, - 59, 232, 75, 16, 144, 199, 229, 222, 188, 251, 59, 232, 75, 16, 196, 66, - 195, 176, 251, 59, 232, 75, 16, 208, 31, 196, 66, 57, 251, 59, 232, 75, - 16, 133, 199, 229, 211, 6, 251, 59, 232, 75, 16, 237, 119, 201, 71, 251, - 59, 232, 75, 16, 208, 31, 133, 247, 96, 251, 59, 232, 75, 16, 208, 31, - 237, 118, 251, 59, 232, 75, 16, 133, 199, 229, 222, 188, 251, 59, 232, - 75, 16, 235, 119, 195, 176, 251, 59, 232, 75, 16, 208, 31, 235, 119, 57, - 251, 59, 232, 75, 16, 207, 251, 196, 103, 251, 59, 232, 75, 16, 237, 107, - 196, 103, 251, 59, 232, 75, 16, 237, 33, 196, 103, 251, 59, 232, 75, 16, - 222, 189, 196, 103, 251, 59, 232, 75, 16, 243, 11, 196, 103, 251, 59, - 232, 75, 16, 133, 203, 53, 222, 188, 251, 59, 232, 75, 16, 207, 251, 208, - 30, 251, 59, 232, 75, 16, 243, 11, 201, 102, 251, 59, 232, 75, 16, 208, - 31, 242, 83, 251, 59, 232, 75, 16, 133, 199, 229, 237, 42, 251, 59, 232, - 75, 16, 237, 119, 237, 42, 251, 59, 232, 75, 16, 201, 103, 237, 42, 251, - 59, 232, 75, 16, 222, 189, 237, 42, 251, 59, 232, 75, 16, 243, 11, 237, - 42, 251, 59, 232, 75, 16, 144, 203, 53, 201, 71, 251, 59, 232, 75, 16, - 45, 203, 53, 201, 71, 251, 59, 232, 75, 16, 198, 153, 237, 42, 251, 59, - 232, 75, 16, 230, 204, 237, 42, 251, 59, 232, 75, 16, 242, 75, 164, 251, - 59, 232, 75, 16, 237, 119, 198, 152, 251, 59, 232, 75, 16, 191, 20, 251, - 59, 232, 75, 16, 201, 72, 198, 152, 251, 59, 232, 75, 16, 204, 26, 196, - 103, 251, 59, 232, 75, 16, 208, 31, 213, 12, 234, 44, 251, 59, 232, 75, - 16, 208, 31, 208, 12, 251, 59, 232, 75, 16, 144, 247, 97, 198, 152, 251, - 59, 232, 75, 16, 133, 247, 97, 198, 152, 251, 59, 232, 75, 16, 223, 83, - 251, 59, 232, 75, 16, 207, 3, 251, 59, 232, 75, 16, 211, 110, 251, 59, - 232, 75, 16, 251, 161, 196, 103, 251, 59, 232, 75, 16, 234, 48, 196, 103, - 251, 59, 232, 75, 16, 223, 84, 196, 103, 251, 59, 232, 75, 16, 211, 111, - 196, 103, 251, 59, 232, 75, 16, 251, 160, 213, 12, 243, 126, 77, 50, 251, - 116, 4, 235, 119, 191, 21, 57, 203, 21, 211, 77, 248, 62, 248, 236, 113, - 81, 219, 113, 4, 82, 236, 140, 223, 119, 113, 239, 27, 196, 101, 113, - 236, 225, 196, 101, 113, 234, 107, 113, 239, 63, 113, 63, 51, 4, 247, 22, - 81, 219, 112, 234, 78, 113, 251, 152, 221, 223, 113, 229, 202, 113, 47, - 228, 241, 249, 88, 4, 213, 9, 47, 197, 242, 235, 123, 248, 22, 243, 11, - 4, 213, 15, 57, 196, 99, 113, 215, 216, 113, 228, 84, 113, 211, 75, 230, - 115, 113, 211, 75, 220, 141, 113, 210, 93, 113, 210, 92, 113, 236, 234, - 238, 169, 16, 232, 146, 109, 202, 29, 113, 251, 59, 232, 75, 16, 208, 30, - 237, 138, 204, 11, 221, 223, 113, 208, 217, 210, 204, 214, 73, 210, 204, - 208, 212, 205, 77, 113, 242, 238, 205, 77, 113, 45, 210, 114, 116, 102, - 45, 210, 114, 233, 203, 45, 210, 114, 110, 102, 50, 210, 114, 116, 102, - 50, 210, 114, 233, 203, 50, 210, 114, 110, 102, 45, 51, 248, 54, 116, - 239, 1, 45, 51, 248, 54, 233, 203, 45, 51, 248, 54, 110, 239, 1, 50, 51, - 248, 54, 116, 239, 1, 50, 51, 248, 54, 233, 203, 50, 51, 248, 54, 110, - 239, 1, 45, 238, 171, 248, 54, 116, 102, 45, 238, 171, 248, 54, 82, 209, - 175, 45, 238, 171, 248, 54, 110, 102, 238, 171, 248, 54, 233, 203, 50, - 238, 171, 248, 54, 116, 102, 50, 238, 171, 248, 54, 82, 209, 175, 50, - 238, 171, 248, 54, 110, 102, 223, 114, 233, 203, 228, 241, 219, 113, 233, - 203, 116, 45, 211, 57, 110, 50, 238, 171, 248, 54, 205, 53, 116, 50, 211, - 57, 110, 45, 238, 171, 248, 54, 205, 53, 200, 202, 198, 53, 200, 202, - 248, 76, 198, 54, 51, 248, 53, 248, 77, 51, 248, 53, 248, 77, 51, 248, - 54, 139, 198, 54, 51, 248, 53, 48, 16, 248, 76, 45, 81, 111, 219, 112, - 50, 81, 111, 219, 112, 228, 241, 205, 97, 219, 111, 228, 241, 205, 97, - 219, 110, 228, 241, 205, 97, 219, 109, 228, 241, 205, 97, 219, 108, 237, - 97, 16, 156, 81, 23, 198, 54, 183, 237, 97, 16, 156, 81, 23, 248, 77, - 183, 237, 97, 16, 156, 81, 4, 243, 10, 237, 97, 16, 156, 144, 23, 228, - 241, 4, 243, 10, 237, 97, 16, 156, 133, 23, 228, 241, 4, 243, 10, 237, - 97, 16, 156, 81, 4, 197, 241, 237, 97, 16, 156, 144, 23, 228, 241, 4, - 197, 241, 237, 97, 16, 156, 133, 23, 228, 241, 4, 197, 241, 237, 97, 16, - 156, 81, 23, 193, 138, 237, 97, 16, 156, 144, 23, 228, 241, 4, 193, 138, - 237, 97, 16, 156, 133, 23, 228, 241, 4, 193, 138, 237, 97, 16, 156, 144, - 23, 228, 240, 237, 97, 16, 156, 133, 23, 228, 240, 237, 97, 16, 156, 81, - 23, 198, 54, 219, 224, 237, 97, 16, 156, 81, 23, 248, 77, 219, 224, 51, - 232, 159, 207, 23, 113, 234, 149, 113, 81, 219, 113, 233, 203, 216, 159, - 248, 36, 216, 159, 179, 139, 203, 39, 216, 159, 203, 40, 139, 219, 19, - 216, 159, 179, 139, 105, 203, 25, 216, 159, 105, 203, 26, 139, 219, 19, - 216, 159, 105, 203, 26, 222, 197, 216, 159, 197, 221, 216, 159, 199, 65, - 216, 159, 210, 22, 234, 208, 230, 188, 232, 69, 198, 54, 210, 113, 248, - 77, 210, 113, 198, 54, 238, 171, 248, 53, 248, 77, 238, 171, 248, 53, - 198, 54, 198, 42, 203, 103, 248, 53, 248, 77, 198, 42, 203, 103, 248, 53, - 63, 198, 5, 248, 221, 206, 189, 4, 243, 10, 201, 51, 232, 204, 252, 64, - 238, 168, 234, 134, 223, 99, 237, 138, 233, 207, 113, 62, 206, 203, 55, - 197, 241, 62, 219, 219, 55, 197, 241, 62, 196, 76, 55, 197, 241, 62, 235, - 122, 55, 197, 241, 62, 206, 203, 55, 197, 242, 4, 81, 164, 62, 219, 219, - 55, 197, 242, 4, 81, 164, 62, 206, 203, 197, 242, 4, 55, 81, 164, 251, - 201, 242, 222, 201, 58, 198, 145, 242, 222, 228, 175, 4, 232, 184, 205, - 140, 62, 216, 213, 219, 219, 197, 241, 62, 216, 213, 206, 203, 197, 241, - 62, 216, 213, 196, 76, 197, 241, 62, 216, 213, 235, 122, 197, 241, 55, - 81, 164, 62, 51, 40, 201, 63, 62, 243, 11, 40, 207, 97, 208, 255, 113, - 208, 255, 211, 103, 113, 208, 255, 211, 105, 113, 208, 255, 202, 93, 113, - 211, 168, 233, 194, 113, 16, 40, 212, 138, 16, 40, 201, 98, 79, 229, 232, - 16, 40, 201, 98, 79, 199, 53, 16, 40, 234, 95, 79, 199, 53, 16, 40, 234, - 95, 79, 198, 11, 16, 40, 234, 81, 16, 40, 252, 51, 16, 40, 248, 235, 16, - 40, 249, 140, 16, 40, 228, 241, 199, 230, 16, 40, 219, 113, 233, 50, 16, - 40, 81, 199, 230, 16, 40, 232, 146, 233, 50, 16, 40, 247, 88, 207, 22, - 16, 40, 203, 77, 211, 14, 16, 40, 203, 77, 223, 162, 16, 40, 237, 210, - 219, 103, 234, 14, 16, 40, 237, 75, 239, 22, 107, 16, 40, 237, 75, 239, - 22, 109, 16, 40, 237, 75, 239, 22, 138, 16, 40, 237, 75, 239, 22, 134, - 16, 40, 214, 106, 252, 51, 16, 40, 200, 69, 223, 228, 16, 40, 234, 95, - 79, 198, 12, 248, 129, 16, 40, 247, 126, 16, 40, 234, 95, 79, 216, 212, - 16, 40, 200, 226, 16, 40, 234, 14, 16, 40, 233, 7, 204, 10, 16, 40, 230, - 187, 204, 10, 16, 40, 207, 98, 204, 10, 16, 40, 196, 91, 204, 10, 16, 40, - 201, 247, 16, 40, 237, 116, 248, 133, 113, 211, 77, 248, 62, 16, 40, 214, - 76, 16, 40, 237, 117, 232, 146, 109, 16, 40, 200, 227, 232, 146, 109, - 211, 161, 102, 211, 161, 246, 252, 211, 161, 232, 149, 211, 161, 223, 93, - 232, 149, 211, 161, 248, 232, 248, 5, 211, 161, 248, 70, 198, 178, 211, - 161, 248, 48, 249, 93, 228, 15, 211, 161, 251, 139, 79, 243, 125, 211, - 161, 237, 215, 211, 161, 238, 157, 252, 55, 212, 136, 211, 161, 55, 249, - 141, 47, 17, 107, 47, 17, 109, 47, 17, 138, 47, 17, 134, 47, 17, 149, 47, + 45, 50, 64, 4, 55, 81, 106, 118, 211, 76, 57, 96, 211, 76, 57, 45, 50, + 211, 76, 57, 40, 251, 176, 242, 70, 210, 107, 237, 18, 199, 24, 233, 213, + 199, 24, 236, 166, 213, 14, 233, 214, 234, 107, 203, 253, 223, 153, 214, + 247, 234, 134, 211, 148, 213, 14, 251, 135, 234, 134, 211, 148, 2, 234, + 134, 211, 148, 239, 34, 250, 222, 216, 192, 236, 166, 213, 14, 239, 36, + 250, 222, 216, 192, 2, 239, 34, 250, 222, 216, 192, 234, 97, 79, 208, + 192, 215, 62, 208, 202, 215, 62, 239, 11, 215, 62, 200, 201, 216, 37, 56, + 216, 35, 56, 75, 209, 83, 236, 202, 202, 98, 203, 254, 216, 36, 250, 196, + 211, 68, 206, 190, 211, 68, 247, 251, 211, 68, 51, 206, 129, 238, 193, + 206, 129, 232, 123, 206, 129, 208, 188, 159, 223, 141, 50, 251, 117, 251, + 117, 216, 228, 251, 117, 201, 226, 251, 117, 236, 205, 236, 166, 213, 14, + 236, 209, 210, 121, 159, 213, 14, 210, 121, 159, 219, 31, 251, 127, 219, + 31, 211, 58, 223, 101, 196, 92, 223, 115, 55, 223, 115, 197, 225, 223, + 115, 239, 28, 223, 115, 200, 171, 223, 115, 195, 11, 223, 115, 242, 223, + 223, 115, 242, 223, 239, 28, 223, 115, 251, 87, 239, 28, 223, 115, 199, + 23, 249, 5, 207, 128, 208, 189, 75, 216, 36, 233, 221, 231, 146, 208, + 189, 229, 2, 198, 153, 211, 68, 207, 19, 198, 152, 223, 95, 219, 247, + 206, 9, 202, 173, 193, 138, 193, 10, 208, 202, 213, 14, 198, 152, 216, + 37, 198, 152, 250, 188, 234, 47, 159, 213, 14, 250, 188, 234, 47, 159, + 251, 42, 234, 47, 159, 251, 42, 247, 220, 213, 14, 252, 50, 234, 47, 159, + 214, 107, 251, 42, 213, 23, 252, 50, 234, 47, 159, 251, 167, 234, 47, + 159, 213, 14, 251, 167, 234, 47, 159, 251, 167, 234, 47, 211, 59, 234, + 47, 159, 197, 225, 198, 152, 251, 177, 234, 47, 159, 234, 38, 159, 231, + 145, 234, 38, 159, 237, 19, 248, 211, 251, 44, 199, 34, 219, 122, 231, + 145, 234, 47, 159, 251, 42, 234, 47, 119, 211, 59, 199, 34, 223, 180, + 211, 148, 223, 180, 79, 211, 59, 251, 42, 234, 47, 159, 242, 86, 234, 44, + 234, 45, 242, 85, 206, 190, 223, 165, 234, 47, 159, 206, 190, 234, 47, + 159, 238, 252, 159, 234, 5, 234, 43, 159, 201, 104, 234, 44, 237, 109, + 234, 47, 159, 234, 47, 119, 247, 207, 237, 128, 216, 228, 247, 206, 208, + 13, 234, 47, 159, 213, 14, 234, 47, 159, 228, 19, 159, 213, 14, 228, 19, + 159, 201, 36, 234, 38, 159, 219, 182, 211, 59, 234, 47, 159, 230, 206, + 211, 59, 234, 47, 159, 219, 182, 139, 234, 47, 159, 230, 206, 139, 234, + 47, 159, 219, 182, 247, 220, 213, 14, 234, 47, 159, 230, 206, 247, 220, + 213, 14, 234, 47, 159, 215, 147, 219, 181, 215, 147, 230, 205, 248, 211, + 213, 14, 234, 38, 159, 213, 14, 219, 181, 213, 14, 230, 205, 214, 107, + 219, 182, 213, 23, 234, 47, 159, 214, 107, 230, 206, 213, 23, 234, 47, + 159, 219, 182, 211, 59, 234, 38, 159, 230, 206, 211, 59, 234, 38, 159, + 214, 107, 219, 182, 213, 23, 234, 38, 159, 214, 107, 230, 206, 213, 23, + 234, 38, 159, 219, 182, 211, 59, 230, 205, 230, 206, 211, 59, 219, 181, + 214, 107, 219, 182, 213, 23, 230, 205, 214, 107, 230, 206, 213, 23, 219, + 181, 208, 233, 200, 220, 208, 234, 211, 59, 234, 47, 159, 200, 221, 211, + 59, 234, 47, 159, 208, 234, 211, 59, 234, 38, 159, 200, 221, 211, 59, + 234, 38, 159, 236, 166, 213, 14, 208, 236, 236, 166, 213, 14, 200, 222, + 200, 230, 211, 148, 200, 181, 211, 148, 213, 14, 42, 200, 230, 211, 148, + 213, 14, 42, 200, 181, 211, 148, 200, 230, 79, 211, 59, 234, 47, 159, + 200, 181, 79, 211, 59, 234, 47, 159, 214, 107, 42, 200, 230, 79, 213, 23, + 234, 47, 159, 214, 107, 42, 200, 181, 79, 213, 23, 234, 47, 159, 200, + 230, 79, 4, 213, 14, 234, 47, 159, 200, 181, 79, 4, 213, 14, 234, 47, + 159, 215, 126, 215, 127, 215, 128, 215, 127, 196, 92, 51, 223, 180, 211, + 148, 51, 211, 48, 211, 148, 51, 223, 180, 79, 211, 59, 234, 47, 159, 51, + 211, 48, 79, 211, 59, 234, 47, 159, 51, 247, 113, 51, 238, 183, 47, 209, + 83, 47, 216, 36, 47, 198, 144, 47, 236, 202, 202, 98, 47, 75, 211, 68, + 47, 206, 190, 211, 68, 47, 250, 196, 211, 68, 47, 234, 44, 47, 237, 217, + 112, 209, 83, 112, 216, 36, 112, 198, 144, 112, 75, 211, 68, 50, 199, + 228, 45, 199, 228, 144, 199, 228, 133, 199, 228, 250, 199, 216, 3, 197, + 201, 232, 154, 197, 225, 81, 249, 90, 50, 197, 57, 55, 81, 249, 90, 55, + 50, 197, 57, 236, 166, 213, 14, 208, 181, 213, 14, 197, 201, 236, 166, + 213, 14, 232, 155, 214, 110, 55, 81, 249, 90, 55, 50, 197, 57, 208, 234, + 196, 105, 207, 66, 200, 221, 196, 105, 207, 66, 213, 20, 200, 245, 211, + 148, 239, 34, 250, 222, 213, 20, 200, 244, 213, 20, 200, 245, 79, 211, + 59, 234, 47, 159, 239, 34, 250, 222, 213, 20, 200, 245, 211, 59, 234, 47, + 159, 211, 48, 211, 148, 223, 180, 211, 148, 215, 133, 229, 191, 239, 45, + 217, 29, 223, 112, 192, 192, 214, 226, 213, 22, 50, 251, 118, 4, 251, 18, + 50, 197, 241, 215, 62, 219, 31, 251, 127, 215, 62, 219, 31, 211, 58, 215, + 62, 223, 101, 215, 62, 196, 92, 237, 35, 211, 68, 75, 211, 68, 201, 104, + 211, 68, 236, 202, 198, 144, 248, 65, 45, 213, 20, 233, 95, 204, 25, 208, + 202, 50, 213, 20, 233, 95, 204, 25, 208, 202, 45, 204, 25, 208, 202, 50, + 204, 25, 208, 202, 207, 19, 198, 153, 234, 44, 238, 173, 219, 31, 211, + 58, 238, 173, 219, 31, 251, 127, 55, 200, 229, 55, 200, 180, 55, 223, + 101, 55, 196, 92, 209, 117, 234, 47, 23, 210, 121, 159, 219, 182, 4, 236, + 142, 230, 206, 4, 236, 142, 195, 83, 215, 147, 219, 181, 195, 83, 215, + 147, 230, 205, 219, 182, 234, 47, 119, 211, 59, 230, 205, 230, 206, 234, + 47, 119, 211, 59, 219, 181, 234, 47, 119, 211, 59, 219, 181, 234, 47, + 119, 211, 59, 230, 205, 234, 47, 119, 211, 59, 208, 233, 234, 47, 119, + 211, 59, 200, 220, 236, 166, 213, 14, 208, 237, 211, 59, 234, 46, 236, + 166, 213, 14, 200, 223, 211, 59, 234, 46, 213, 14, 51, 223, 180, 79, 211, + 59, 234, 47, 159, 213, 14, 51, 211, 48, 79, 211, 59, 234, 47, 159, 51, + 223, 180, 79, 211, 59, 213, 14, 234, 47, 159, 51, 211, 48, 79, 211, 59, + 213, 14, 234, 47, 159, 219, 182, 247, 220, 213, 14, 234, 38, 159, 230, + 206, 247, 220, 213, 14, 234, 38, 159, 208, 234, 247, 220, 213, 14, 234, + 38, 159, 200, 221, 247, 220, 213, 14, 234, 38, 159, 213, 14, 213, 20, + 200, 245, 211, 148, 236, 166, 213, 14, 239, 36, 250, 222, 213, 20, 200, + 244, 213, 14, 213, 20, 200, 245, 79, 211, 59, 234, 47, 159, 236, 166, + 213, 14, 239, 36, 250, 222, 213, 20, 200, 245, 211, 59, 234, 46, 81, 234, + 122, 216, 84, 228, 243, 234, 122, 133, 50, 237, 41, 234, 122, 144, 50, + 237, 41, 234, 122, 234, 134, 79, 4, 180, 228, 243, 106, 234, 134, 79, 4, + 81, 249, 90, 250, 185, 234, 97, 79, 228, 243, 106, 2, 234, 134, 79, 4, + 81, 249, 90, 250, 185, 234, 97, 79, 228, 243, 106, 234, 134, 79, 4, 75, + 58, 234, 134, 79, 4, 211, 8, 2, 234, 134, 79, 4, 211, 8, 234, 134, 79, 4, + 196, 103, 234, 134, 79, 4, 105, 228, 243, 201, 16, 239, 34, 4, 180, 228, + 243, 106, 239, 34, 4, 81, 249, 90, 250, 185, 234, 97, 79, 228, 243, 106, + 2, 239, 34, 4, 81, 249, 90, 250, 185, 234, 97, 79, 228, 243, 106, 239, + 34, 4, 211, 8, 2, 239, 34, 4, 211, 8, 191, 167, 213, 12, 249, 133, 216, + 191, 237, 36, 56, 234, 137, 57, 228, 174, 133, 250, 237, 144, 250, 237, + 208, 196, 209, 250, 193, 135, 219, 114, 45, 247, 32, 50, 247, 32, 45, + 232, 195, 50, 232, 195, 248, 79, 50, 238, 221, 248, 79, 45, 238, 221, + 198, 54, 50, 238, 221, 198, 54, 45, 238, 221, 207, 19, 213, 14, 56, 51, + 218, 234, 251, 18, 205, 44, 205, 53, 199, 107, 207, 98, 209, 27, 223, + 146, 195, 56, 201, 191, 209, 110, 79, 223, 111, 56, 154, 213, 14, 56, + 193, 145, 228, 176, 198, 54, 45, 239, 3, 198, 54, 50, 239, 3, 248, 79, + 45, 239, 3, 248, 79, 50, 239, 3, 198, 54, 132, 223, 115, 248, 79, 132, + 223, 115, 232, 95, 202, 66, 133, 250, 238, 248, 212, 105, 228, 243, 249, + 78, 211, 61, 221, 224, 234, 34, 119, 199, 34, 179, 192, 236, 223, 165, + 42, 207, 95, 248, 64, 221, 222, 219, 221, 251, 118, 248, 55, 206, 204, + 251, 118, 248, 55, 234, 34, 119, 199, 34, 219, 226, 248, 223, 206, 189, + 238, 140, 251, 177, 250, 246, 200, 74, 198, 39, 206, 42, 236, 254, 211, + 49, 239, 50, 199, 181, 202, 82, 238, 248, 238, 247, 251, 61, 232, 77, 16, + 228, 69, 251, 61, 232, 77, 16, 201, 182, 208, 32, 251, 61, 232, 77, 16, + 208, 33, 234, 46, 251, 61, 232, 77, 16, 208, 33, 236, 209, 251, 61, 232, + 77, 16, 208, 33, 237, 34, 251, 61, 232, 77, 16, 208, 33, 222, 190, 251, + 61, 232, 77, 16, 208, 33, 243, 12, 251, 61, 232, 77, 16, 243, 13, 201, + 72, 251, 61, 232, 77, 16, 243, 13, 222, 190, 251, 61, 232, 77, 16, 202, + 99, 164, 251, 61, 232, 77, 16, 249, 144, 164, 251, 61, 232, 77, 16, 208, + 33, 202, 98, 251, 61, 232, 77, 16, 208, 33, 249, 143, 251, 61, 232, 77, + 16, 208, 33, 219, 181, 251, 61, 232, 77, 16, 208, 33, 230, 205, 251, 61, + 232, 77, 16, 118, 195, 176, 251, 61, 232, 77, 16, 96, 195, 176, 251, 61, + 232, 77, 16, 208, 33, 118, 57, 251, 61, 232, 77, 16, 208, 33, 96, 57, + 251, 61, 232, 77, 16, 243, 13, 249, 143, 251, 61, 232, 77, 16, 144, 199, + 229, 196, 103, 251, 61, 232, 77, 16, 237, 109, 201, 72, 251, 61, 232, 77, + 16, 208, 33, 144, 247, 98, 251, 61, 232, 77, 16, 208, 33, 237, 108, 251, + 61, 232, 77, 16, 144, 199, 229, 222, 190, 251, 61, 232, 77, 16, 196, 66, + 195, 176, 251, 61, 232, 77, 16, 208, 33, 196, 66, 57, 251, 61, 232, 77, + 16, 133, 199, 229, 211, 8, 251, 61, 232, 77, 16, 237, 121, 201, 72, 251, + 61, 232, 77, 16, 208, 33, 133, 247, 98, 251, 61, 232, 77, 16, 208, 33, + 237, 120, 251, 61, 232, 77, 16, 133, 199, 229, 222, 190, 251, 61, 232, + 77, 16, 235, 121, 195, 176, 251, 61, 232, 77, 16, 208, 33, 235, 121, 57, + 251, 61, 232, 77, 16, 207, 253, 196, 103, 251, 61, 232, 77, 16, 237, 109, + 196, 103, 251, 61, 232, 77, 16, 237, 35, 196, 103, 251, 61, 232, 77, 16, + 222, 191, 196, 103, 251, 61, 232, 77, 16, 243, 13, 196, 103, 251, 61, + 232, 77, 16, 133, 203, 54, 222, 190, 251, 61, 232, 77, 16, 207, 253, 208, + 32, 251, 61, 232, 77, 16, 243, 13, 201, 103, 251, 61, 232, 77, 16, 208, + 33, 242, 85, 251, 61, 232, 77, 16, 133, 199, 229, 237, 44, 251, 61, 232, + 77, 16, 237, 121, 237, 44, 251, 61, 232, 77, 16, 201, 104, 237, 44, 251, + 61, 232, 77, 16, 222, 191, 237, 44, 251, 61, 232, 77, 16, 243, 13, 237, + 44, 251, 61, 232, 77, 16, 144, 203, 54, 201, 72, 251, 61, 232, 77, 16, + 45, 203, 54, 201, 72, 251, 61, 232, 77, 16, 198, 153, 237, 44, 251, 61, + 232, 77, 16, 230, 206, 237, 44, 251, 61, 232, 77, 16, 242, 77, 164, 251, + 61, 232, 77, 16, 237, 121, 198, 152, 251, 61, 232, 77, 16, 191, 20, 251, + 61, 232, 77, 16, 201, 73, 198, 152, 251, 61, 232, 77, 16, 204, 27, 196, + 103, 251, 61, 232, 77, 16, 208, 33, 213, 14, 234, 46, 251, 61, 232, 77, + 16, 208, 33, 208, 14, 251, 61, 232, 77, 16, 144, 247, 99, 198, 152, 251, + 61, 232, 77, 16, 133, 247, 99, 198, 152, 251, 61, 232, 77, 16, 223, 85, + 251, 61, 232, 77, 16, 207, 4, 251, 61, 232, 77, 16, 211, 112, 251, 61, + 232, 77, 16, 251, 163, 196, 103, 251, 61, 232, 77, 16, 234, 50, 196, 103, + 251, 61, 232, 77, 16, 223, 86, 196, 103, 251, 61, 232, 77, 16, 211, 113, + 196, 103, 251, 61, 232, 77, 16, 251, 162, 213, 14, 243, 128, 77, 50, 251, + 118, 4, 235, 121, 191, 21, 57, 203, 22, 211, 79, 248, 64, 248, 238, 113, + 81, 219, 115, 4, 82, 236, 142, 223, 121, 113, 239, 29, 196, 101, 113, + 236, 227, 196, 101, 113, 234, 109, 113, 239, 65, 113, 63, 51, 4, 247, 24, + 81, 219, 114, 234, 80, 113, 251, 154, 221, 225, 113, 229, 204, 113, 47, + 228, 243, 249, 90, 4, 213, 11, 47, 197, 242, 235, 125, 248, 24, 243, 13, + 4, 213, 17, 57, 196, 99, 113, 215, 218, 113, 228, 86, 113, 211, 77, 230, + 117, 113, 211, 77, 220, 143, 113, 210, 95, 113, 210, 94, 113, 236, 236, + 238, 171, 16, 232, 148, 109, 202, 30, 113, 251, 61, 232, 77, 16, 208, 32, + 237, 140, 204, 12, 221, 225, 113, 208, 219, 210, 206, 214, 75, 210, 206, + 208, 214, 205, 78, 113, 242, 240, 205, 78, 113, 45, 210, 116, 116, 102, + 45, 210, 116, 233, 205, 45, 210, 116, 110, 102, 50, 210, 116, 116, 102, + 50, 210, 116, 233, 205, 50, 210, 116, 110, 102, 45, 51, 248, 56, 116, + 239, 3, 45, 51, 248, 56, 233, 205, 45, 51, 248, 56, 110, 239, 3, 50, 51, + 248, 56, 116, 239, 3, 50, 51, 248, 56, 233, 205, 50, 51, 248, 56, 110, + 239, 3, 45, 238, 173, 248, 56, 116, 102, 45, 238, 173, 248, 56, 82, 209, + 177, 45, 238, 173, 248, 56, 110, 102, 238, 173, 248, 56, 233, 205, 50, + 238, 173, 248, 56, 116, 102, 50, 238, 173, 248, 56, 82, 209, 177, 50, + 238, 173, 248, 56, 110, 102, 223, 116, 233, 205, 228, 243, 219, 115, 233, + 205, 116, 45, 211, 59, 110, 50, 238, 173, 248, 56, 205, 54, 116, 50, 211, + 59, 110, 45, 238, 173, 248, 56, 205, 54, 200, 202, 198, 53, 200, 202, + 248, 78, 198, 54, 51, 248, 55, 248, 79, 51, 248, 55, 248, 79, 51, 248, + 56, 139, 198, 54, 51, 248, 55, 48, 16, 248, 78, 45, 81, 111, 219, 114, + 50, 81, 111, 219, 114, 228, 243, 205, 98, 219, 113, 228, 243, 205, 98, + 219, 112, 228, 243, 205, 98, 219, 111, 228, 243, 205, 98, 219, 110, 237, + 99, 16, 156, 81, 23, 198, 54, 179, 237, 99, 16, 156, 81, 23, 248, 79, + 179, 237, 99, 16, 156, 81, 4, 243, 12, 237, 99, 16, 156, 144, 23, 228, + 243, 4, 243, 12, 237, 99, 16, 156, 133, 23, 228, 243, 4, 243, 12, 237, + 99, 16, 156, 81, 4, 197, 241, 237, 99, 16, 156, 144, 23, 228, 243, 4, + 197, 241, 237, 99, 16, 156, 133, 23, 228, 243, 4, 197, 241, 237, 99, 16, + 156, 81, 23, 193, 138, 237, 99, 16, 156, 144, 23, 228, 243, 4, 193, 138, + 237, 99, 16, 156, 133, 23, 228, 243, 4, 193, 138, 237, 99, 16, 156, 144, + 23, 228, 242, 237, 99, 16, 156, 133, 23, 228, 242, 237, 99, 16, 156, 81, + 23, 198, 54, 219, 226, 237, 99, 16, 156, 81, 23, 248, 79, 219, 226, 51, + 232, 161, 207, 24, 113, 234, 151, 113, 81, 219, 115, 233, 205, 216, 161, + 248, 38, 216, 161, 180, 139, 203, 40, 216, 161, 203, 41, 139, 219, 21, + 216, 161, 180, 139, 105, 203, 26, 216, 161, 105, 203, 27, 139, 219, 21, + 216, 161, 105, 203, 27, 222, 199, 216, 161, 197, 221, 216, 161, 199, 65, + 216, 161, 210, 24, 234, 210, 230, 190, 232, 71, 198, 54, 210, 115, 248, + 79, 210, 115, 198, 54, 238, 173, 248, 55, 248, 79, 238, 173, 248, 55, + 198, 54, 198, 42, 203, 104, 248, 55, 248, 79, 198, 42, 203, 104, 248, 55, + 63, 198, 5, 248, 223, 206, 190, 4, 243, 12, 201, 52, 232, 206, 252, 66, + 238, 170, 234, 136, 223, 101, 237, 140, 233, 209, 113, 62, 206, 204, 55, + 197, 241, 62, 219, 221, 55, 197, 241, 62, 196, 76, 55, 197, 241, 62, 235, + 124, 55, 197, 241, 62, 206, 204, 55, 197, 242, 4, 81, 164, 62, 219, 221, + 55, 197, 242, 4, 81, 164, 62, 206, 204, 197, 242, 4, 55, 81, 164, 251, + 203, 242, 224, 201, 59, 198, 145, 242, 224, 228, 177, 4, 232, 186, 205, + 141, 62, 216, 215, 219, 221, 197, 241, 62, 216, 215, 206, 204, 197, 241, + 62, 216, 215, 196, 76, 197, 241, 62, 216, 215, 235, 124, 197, 241, 55, + 81, 164, 62, 51, 40, 201, 64, 62, 243, 13, 40, 207, 99, 209, 1, 113, 209, + 1, 211, 105, 113, 209, 1, 211, 107, 113, 209, 1, 202, 94, 113, 211, 170, + 233, 196, 113, 16, 40, 212, 140, 16, 40, 201, 99, 79, 229, 234, 16, 40, + 201, 99, 79, 199, 53, 16, 40, 234, 97, 79, 199, 53, 16, 40, 234, 97, 79, + 198, 11, 16, 40, 234, 83, 16, 40, 252, 53, 16, 40, 248, 237, 16, 40, 249, + 142, 16, 40, 228, 243, 199, 230, 16, 40, 219, 115, 233, 52, 16, 40, 81, + 199, 230, 16, 40, 232, 148, 233, 52, 16, 40, 247, 90, 207, 23, 16, 40, + 203, 78, 211, 16, 16, 40, 203, 78, 223, 164, 16, 40, 237, 212, 219, 105, + 234, 16, 16, 40, 237, 77, 239, 24, 107, 16, 40, 237, 77, 239, 24, 109, + 16, 40, 237, 77, 239, 24, 138, 16, 40, 237, 77, 239, 24, 134, 16, 40, + 214, 108, 252, 53, 16, 40, 200, 69, 223, 230, 16, 40, 234, 97, 79, 198, + 12, 248, 131, 16, 40, 247, 128, 16, 40, 234, 97, 79, 216, 214, 16, 40, + 200, 227, 16, 40, 234, 16, 16, 40, 233, 9, 204, 11, 16, 40, 230, 189, + 204, 11, 16, 40, 207, 100, 204, 11, 16, 40, 196, 91, 204, 11, 16, 40, + 201, 248, 16, 40, 237, 118, 248, 135, 113, 211, 79, 248, 64, 16, 40, 214, + 78, 16, 40, 237, 119, 232, 148, 109, 16, 40, 200, 228, 232, 148, 109, + 211, 163, 102, 211, 163, 246, 254, 211, 163, 232, 151, 211, 163, 223, 95, + 232, 151, 211, 163, 248, 234, 248, 7, 211, 163, 248, 72, 198, 178, 211, + 163, 248, 50, 249, 95, 228, 17, 211, 163, 251, 141, 79, 243, 127, 211, + 163, 237, 217, 211, 163, 238, 159, 252, 57, 212, 138, 211, 163, 55, 249, + 143, 47, 17, 107, 47, 17, 109, 47, 17, 138, 47, 17, 134, 47, 17, 150, 47, 17, 169, 47, 17, 175, 47, 17, 171, 47, 17, 178, 47, 31, 199, 95, 47, 31, - 234, 127, 47, 31, 197, 37, 47, 31, 198, 251, 47, 31, 232, 122, 47, 31, - 233, 19, 47, 31, 202, 130, 47, 31, 203, 244, 47, 31, 234, 161, 47, 31, - 213, 171, 47, 31, 197, 32, 127, 17, 107, 127, 17, 109, 127, 17, 138, 127, - 17, 134, 127, 17, 149, 127, 17, 169, 127, 17, 175, 127, 17, 171, 127, 17, - 178, 127, 31, 199, 95, 127, 31, 234, 127, 127, 31, 197, 37, 127, 31, 198, - 251, 127, 31, 232, 122, 127, 31, 233, 19, 127, 31, 202, 130, 127, 31, - 203, 244, 127, 31, 234, 161, 127, 31, 213, 171, 127, 31, 197, 32, 17, 91, - 232, 80, 201, 63, 17, 105, 232, 80, 201, 63, 17, 115, 232, 80, 201, 63, - 17, 232, 128, 232, 80, 201, 63, 17, 232, 226, 232, 80, 201, 63, 17, 202, - 136, 232, 80, 201, 63, 17, 203, 247, 232, 80, 201, 63, 17, 234, 164, 232, - 80, 201, 63, 17, 213, 175, 232, 80, 201, 63, 31, 199, 96, 232, 80, 201, - 63, 31, 234, 128, 232, 80, 201, 63, 31, 197, 38, 232, 80, 201, 63, 31, - 198, 252, 232, 80, 201, 63, 31, 232, 123, 232, 80, 201, 63, 31, 233, 20, - 232, 80, 201, 63, 31, 202, 131, 232, 80, 201, 63, 31, 203, 245, 232, 80, - 201, 63, 31, 234, 162, 232, 80, 201, 63, 31, 213, 172, 232, 80, 201, 63, - 31, 197, 33, 232, 80, 201, 63, 127, 8, 2, 1, 65, 127, 8, 2, 1, 250, 120, - 127, 8, 2, 1, 247, 193, 127, 8, 2, 1, 238, 127, 127, 8, 2, 1, 71, 127, 8, - 2, 1, 233, 175, 127, 8, 2, 1, 232, 51, 127, 8, 2, 1, 230, 116, 127, 8, 2, - 1, 68, 127, 8, 2, 1, 223, 35, 127, 8, 2, 1, 222, 152, 127, 8, 2, 1, 172, - 127, 8, 2, 1, 218, 168, 127, 8, 2, 1, 215, 61, 127, 8, 2, 1, 74, 127, 8, - 2, 1, 210, 236, 127, 8, 2, 1, 208, 104, 127, 8, 2, 1, 146, 127, 8, 2, 1, - 206, 8, 127, 8, 2, 1, 200, 43, 127, 8, 2, 1, 66, 127, 8, 2, 1, 196, 12, + 234, 129, 47, 31, 197, 37, 47, 31, 198, 251, 47, 31, 232, 124, 47, 31, + 233, 21, 47, 31, 202, 131, 47, 31, 203, 245, 47, 31, 234, 163, 47, 31, + 213, 173, 47, 31, 197, 32, 127, 17, 107, 127, 17, 109, 127, 17, 138, 127, + 17, 134, 127, 17, 150, 127, 17, 169, 127, 17, 175, 127, 17, 171, 127, 17, + 178, 127, 31, 199, 95, 127, 31, 234, 129, 127, 31, 197, 37, 127, 31, 198, + 251, 127, 31, 232, 124, 127, 31, 233, 21, 127, 31, 202, 131, 127, 31, + 203, 245, 127, 31, 234, 163, 127, 31, 213, 173, 127, 31, 197, 32, 17, 91, + 232, 82, 201, 64, 17, 105, 232, 82, 201, 64, 17, 115, 232, 82, 201, 64, + 17, 232, 130, 232, 82, 201, 64, 17, 232, 228, 232, 82, 201, 64, 17, 202, + 137, 232, 82, 201, 64, 17, 203, 248, 232, 82, 201, 64, 17, 234, 166, 232, + 82, 201, 64, 17, 213, 177, 232, 82, 201, 64, 31, 199, 96, 232, 82, 201, + 64, 31, 234, 130, 232, 82, 201, 64, 31, 197, 38, 232, 82, 201, 64, 31, + 198, 252, 232, 82, 201, 64, 31, 232, 125, 232, 82, 201, 64, 31, 233, 22, + 232, 82, 201, 64, 31, 202, 132, 232, 82, 201, 64, 31, 203, 246, 232, 82, + 201, 64, 31, 234, 164, 232, 82, 201, 64, 31, 213, 174, 232, 82, 201, 64, + 31, 197, 33, 232, 82, 201, 64, 127, 8, 2, 1, 65, 127, 8, 2, 1, 250, 122, + 127, 8, 2, 1, 247, 195, 127, 8, 2, 1, 238, 129, 127, 8, 2, 1, 71, 127, 8, + 2, 1, 233, 177, 127, 8, 2, 1, 232, 53, 127, 8, 2, 1, 230, 118, 127, 8, 2, + 1, 68, 127, 8, 2, 1, 223, 37, 127, 8, 2, 1, 222, 154, 127, 8, 2, 1, 172, + 127, 8, 2, 1, 218, 170, 127, 8, 2, 1, 215, 63, 127, 8, 2, 1, 74, 127, 8, + 2, 1, 210, 238, 127, 8, 2, 1, 208, 106, 127, 8, 2, 1, 146, 127, 8, 2, 1, + 206, 9, 127, 8, 2, 1, 200, 43, 127, 8, 2, 1, 66, 127, 8, 2, 1, 196, 12, 127, 8, 2, 1, 193, 224, 127, 8, 2, 1, 192, 235, 127, 8, 2, 1, 192, 159, - 127, 8, 2, 1, 191, 166, 47, 8, 6, 1, 65, 47, 8, 6, 1, 250, 120, 47, 8, 6, - 1, 247, 193, 47, 8, 6, 1, 238, 127, 47, 8, 6, 1, 71, 47, 8, 6, 1, 233, - 175, 47, 8, 6, 1, 232, 51, 47, 8, 6, 1, 230, 116, 47, 8, 6, 1, 68, 47, 8, - 6, 1, 223, 35, 47, 8, 6, 1, 222, 152, 47, 8, 6, 1, 172, 47, 8, 6, 1, 218, - 168, 47, 8, 6, 1, 215, 61, 47, 8, 6, 1, 74, 47, 8, 6, 1, 210, 236, 47, 8, - 6, 1, 208, 104, 47, 8, 6, 1, 146, 47, 8, 6, 1, 206, 8, 47, 8, 6, 1, 200, + 127, 8, 2, 1, 191, 166, 47, 8, 6, 1, 65, 47, 8, 6, 1, 250, 122, 47, 8, 6, + 1, 247, 195, 47, 8, 6, 1, 238, 129, 47, 8, 6, 1, 71, 47, 8, 6, 1, 233, + 177, 47, 8, 6, 1, 232, 53, 47, 8, 6, 1, 230, 118, 47, 8, 6, 1, 68, 47, 8, + 6, 1, 223, 37, 47, 8, 6, 1, 222, 154, 47, 8, 6, 1, 172, 47, 8, 6, 1, 218, + 170, 47, 8, 6, 1, 215, 63, 47, 8, 6, 1, 74, 47, 8, 6, 1, 210, 238, 47, 8, + 6, 1, 208, 106, 47, 8, 6, 1, 146, 47, 8, 6, 1, 206, 9, 47, 8, 6, 1, 200, 43, 47, 8, 6, 1, 66, 47, 8, 6, 1, 196, 12, 47, 8, 6, 1, 193, 224, 47, 8, 6, 1, 192, 235, 47, 8, 6, 1, 192, 159, 47, 8, 6, 1, 191, 166, 47, 8, 2, - 1, 65, 47, 8, 2, 1, 250, 120, 47, 8, 2, 1, 247, 193, 47, 8, 2, 1, 238, - 127, 47, 8, 2, 1, 71, 47, 8, 2, 1, 233, 175, 47, 8, 2, 1, 232, 51, 47, 8, - 2, 1, 230, 116, 47, 8, 2, 1, 68, 47, 8, 2, 1, 223, 35, 47, 8, 2, 1, 222, - 152, 47, 8, 2, 1, 172, 47, 8, 2, 1, 218, 168, 47, 8, 2, 1, 215, 61, 47, - 8, 2, 1, 74, 47, 8, 2, 1, 210, 236, 47, 8, 2, 1, 208, 104, 47, 8, 2, 1, - 146, 47, 8, 2, 1, 206, 8, 47, 8, 2, 1, 200, 43, 47, 8, 2, 1, 66, 47, 8, + 1, 65, 47, 8, 2, 1, 250, 122, 47, 8, 2, 1, 247, 195, 47, 8, 2, 1, 238, + 129, 47, 8, 2, 1, 71, 47, 8, 2, 1, 233, 177, 47, 8, 2, 1, 232, 53, 47, 8, + 2, 1, 230, 118, 47, 8, 2, 1, 68, 47, 8, 2, 1, 223, 37, 47, 8, 2, 1, 222, + 154, 47, 8, 2, 1, 172, 47, 8, 2, 1, 218, 170, 47, 8, 2, 1, 215, 63, 47, + 8, 2, 1, 74, 47, 8, 2, 1, 210, 238, 47, 8, 2, 1, 208, 106, 47, 8, 2, 1, + 146, 47, 8, 2, 1, 206, 9, 47, 8, 2, 1, 200, 43, 47, 8, 2, 1, 66, 47, 8, 2, 1, 196, 12, 47, 8, 2, 1, 193, 224, 47, 8, 2, 1, 192, 235, 47, 8, 2, 1, - 192, 159, 47, 8, 2, 1, 191, 166, 47, 17, 191, 77, 214, 106, 47, 31, 234, - 127, 214, 106, 47, 31, 197, 37, 214, 106, 47, 31, 198, 251, 214, 106, 47, - 31, 232, 122, 214, 106, 47, 31, 233, 19, 214, 106, 47, 31, 202, 130, 214, - 106, 47, 31, 203, 244, 214, 106, 47, 31, 234, 161, 214, 106, 47, 31, 213, - 171, 214, 106, 47, 31, 197, 32, 55, 47, 17, 107, 55, 47, 17, 109, 55, 47, - 17, 138, 55, 47, 17, 134, 55, 47, 17, 149, 55, 47, 17, 169, 55, 47, 17, - 175, 55, 47, 17, 171, 55, 47, 17, 178, 55, 47, 31, 199, 95, 214, 106, 47, - 17, 191, 77, 111, 122, 156, 228, 240, 111, 122, 88, 228, 240, 111, 122, - 156, 195, 135, 111, 122, 88, 195, 135, 111, 122, 156, 197, 225, 237, 216, - 228, 240, 111, 122, 88, 197, 225, 237, 216, 228, 240, 111, 122, 156, 197, - 225, 237, 216, 195, 135, 111, 122, 88, 197, 225, 237, 216, 195, 135, 111, - 122, 156, 208, 26, 237, 216, 228, 240, 111, 122, 88, 208, 26, 237, 216, - 228, 240, 111, 122, 156, 208, 26, 237, 216, 195, 135, 111, 122, 88, 208, - 26, 237, 216, 195, 135, 111, 122, 156, 144, 23, 183, 111, 122, 144, 156, - 23, 50, 229, 217, 111, 122, 144, 88, 23, 50, 219, 132, 111, 122, 88, 144, - 23, 183, 111, 122, 156, 144, 23, 219, 224, 111, 122, 144, 156, 23, 45, - 229, 217, 111, 122, 144, 88, 23, 45, 219, 132, 111, 122, 88, 144, 23, - 219, 224, 111, 122, 156, 133, 23, 183, 111, 122, 133, 156, 23, 50, 229, - 217, 111, 122, 133, 88, 23, 50, 219, 132, 111, 122, 88, 133, 23, 183, - 111, 122, 156, 133, 23, 219, 224, 111, 122, 133, 156, 23, 45, 229, 217, - 111, 122, 133, 88, 23, 45, 219, 132, 111, 122, 88, 133, 23, 219, 224, - 111, 122, 156, 81, 23, 183, 111, 122, 81, 156, 23, 50, 229, 217, 111, - 122, 133, 88, 23, 50, 144, 219, 132, 111, 122, 144, 88, 23, 50, 133, 219, - 132, 111, 122, 81, 88, 23, 50, 219, 132, 111, 122, 144, 156, 23, 50, 133, - 229, 217, 111, 122, 133, 156, 23, 50, 144, 229, 217, 111, 122, 88, 81, - 23, 183, 111, 122, 156, 81, 23, 219, 224, 111, 122, 81, 156, 23, 45, 229, - 217, 111, 122, 133, 88, 23, 45, 144, 219, 132, 111, 122, 144, 88, 23, 45, - 133, 219, 132, 111, 122, 81, 88, 23, 45, 219, 132, 111, 122, 144, 156, - 23, 45, 133, 229, 217, 111, 122, 133, 156, 23, 45, 144, 229, 217, 111, - 122, 88, 81, 23, 219, 224, 111, 122, 156, 144, 23, 228, 240, 111, 122, - 45, 88, 23, 50, 144, 219, 132, 111, 122, 50, 88, 23, 45, 144, 219, 132, - 111, 122, 144, 156, 23, 228, 241, 229, 217, 111, 122, 144, 88, 23, 228, - 241, 219, 132, 111, 122, 50, 156, 23, 45, 144, 229, 217, 111, 122, 45, - 156, 23, 50, 144, 229, 217, 111, 122, 88, 144, 23, 228, 240, 111, 122, - 156, 133, 23, 228, 240, 111, 122, 45, 88, 23, 50, 133, 219, 132, 111, - 122, 50, 88, 23, 45, 133, 219, 132, 111, 122, 133, 156, 23, 228, 241, - 229, 217, 111, 122, 133, 88, 23, 228, 241, 219, 132, 111, 122, 50, 156, - 23, 45, 133, 229, 217, 111, 122, 45, 156, 23, 50, 133, 229, 217, 111, - 122, 88, 133, 23, 228, 240, 111, 122, 156, 81, 23, 228, 240, 111, 122, - 45, 88, 23, 50, 81, 219, 132, 111, 122, 50, 88, 23, 45, 81, 219, 132, - 111, 122, 81, 156, 23, 228, 241, 229, 217, 111, 122, 133, 88, 23, 144, - 228, 241, 219, 132, 111, 122, 144, 88, 23, 133, 228, 241, 219, 132, 111, - 122, 81, 88, 23, 228, 241, 219, 132, 111, 122, 45, 133, 88, 23, 50, 144, - 219, 132, 111, 122, 50, 133, 88, 23, 45, 144, 219, 132, 111, 122, 45, - 144, 88, 23, 50, 133, 219, 132, 111, 122, 50, 144, 88, 23, 45, 133, 219, - 132, 111, 122, 144, 156, 23, 133, 228, 241, 229, 217, 111, 122, 133, 156, - 23, 144, 228, 241, 229, 217, 111, 122, 50, 156, 23, 45, 81, 229, 217, - 111, 122, 45, 156, 23, 50, 81, 229, 217, 111, 122, 88, 81, 23, 228, 240, - 111, 122, 156, 55, 237, 216, 228, 240, 111, 122, 88, 55, 237, 216, 228, - 240, 111, 122, 156, 55, 237, 216, 195, 135, 111, 122, 88, 55, 237, 216, - 195, 135, 111, 122, 55, 228, 240, 111, 122, 55, 195, 135, 111, 122, 144, - 202, 170, 23, 50, 235, 133, 111, 122, 144, 55, 23, 50, 202, 169, 111, - 122, 55, 144, 23, 183, 111, 122, 144, 202, 170, 23, 45, 235, 133, 111, - 122, 144, 55, 23, 45, 202, 169, 111, 122, 55, 144, 23, 219, 224, 111, - 122, 133, 202, 170, 23, 50, 235, 133, 111, 122, 133, 55, 23, 50, 202, - 169, 111, 122, 55, 133, 23, 183, 111, 122, 133, 202, 170, 23, 45, 235, - 133, 111, 122, 133, 55, 23, 45, 202, 169, 111, 122, 55, 133, 23, 219, - 224, 111, 122, 81, 202, 170, 23, 50, 235, 133, 111, 122, 81, 55, 23, 50, - 202, 169, 111, 122, 55, 81, 23, 183, 111, 122, 81, 202, 170, 23, 45, 235, - 133, 111, 122, 81, 55, 23, 45, 202, 169, 111, 122, 55, 81, 23, 219, 224, - 111, 122, 144, 202, 170, 23, 228, 241, 235, 133, 111, 122, 144, 55, 23, - 228, 241, 202, 169, 111, 122, 55, 144, 23, 228, 240, 111, 122, 133, 202, - 170, 23, 228, 241, 235, 133, 111, 122, 133, 55, 23, 228, 241, 202, 169, - 111, 122, 55, 133, 23, 228, 240, 111, 122, 81, 202, 170, 23, 228, 241, - 235, 133, 111, 122, 81, 55, 23, 228, 241, 202, 169, 111, 122, 55, 81, 23, - 228, 240, 111, 122, 156, 251, 17, 144, 23, 183, 111, 122, 156, 251, 17, - 144, 23, 219, 224, 111, 122, 156, 251, 17, 133, 23, 219, 224, 111, 122, - 156, 251, 17, 133, 23, 183, 111, 122, 156, 237, 39, 116, 50, 119, 110, - 219, 224, 111, 122, 156, 237, 39, 116, 45, 119, 110, 183, 111, 122, 156, - 237, 39, 238, 217, 111, 122, 156, 219, 224, 111, 122, 156, 196, 77, 111, - 122, 156, 183, 111, 122, 156, 235, 123, 111, 122, 88, 219, 224, 111, 122, - 88, 196, 77, 111, 122, 88, 183, 111, 122, 88, 235, 123, 111, 122, 156, - 45, 23, 88, 183, 111, 122, 156, 133, 23, 88, 235, 123, 111, 122, 88, 45, - 23, 156, 183, 111, 122, 88, 133, 23, 156, 235, 123, 116, 132, 248, 129, - 110, 91, 234, 160, 248, 129, 110, 91, 208, 23, 248, 129, 110, 115, 234, - 158, 248, 129, 110, 132, 248, 129, 110, 232, 226, 234, 158, 248, 129, - 110, 115, 208, 21, 248, 129, 110, 203, 247, 234, 158, 248, 129, 232, 80, - 248, 129, 45, 203, 247, 234, 158, 248, 129, 45, 115, 208, 21, 248, 129, - 45, 232, 226, 234, 158, 248, 129, 45, 132, 248, 129, 45, 115, 234, 158, - 248, 129, 45, 91, 208, 23, 248, 129, 45, 91, 234, 160, 248, 129, 50, 132, - 248, 129, 156, 203, 153, 216, 213, 203, 153, 237, 221, 203, 153, 116, 91, - 234, 160, 248, 129, 50, 91, 234, 160, 248, 129, 208, 28, 110, 219, 224, - 208, 28, 110, 183, 208, 28, 116, 219, 224, 208, 28, 116, 45, 23, 110, 45, - 23, 110, 183, 208, 28, 116, 45, 23, 110, 183, 208, 28, 116, 45, 23, 116, - 50, 23, 110, 219, 224, 208, 28, 116, 45, 23, 116, 50, 23, 110, 183, 208, - 28, 116, 183, 208, 28, 116, 50, 23, 110, 219, 224, 208, 28, 116, 50, 23, - 110, 45, 23, 110, 183, 62, 201, 190, 63, 201, 190, 63, 51, 4, 206, 113, - 239, 0, 63, 51, 239, 33, 62, 2, 201, 190, 51, 4, 228, 241, 233, 5, 51, 4, - 81, 233, 5, 51, 4, 211, 38, 238, 211, 233, 5, 51, 4, 116, 45, 119, 110, - 50, 233, 5, 51, 4, 116, 50, 119, 110, 45, 233, 5, 51, 4, 237, 39, 238, - 211, 233, 5, 62, 2, 201, 190, 63, 2, 201, 190, 62, 207, 92, 63, 207, 92, - 62, 81, 207, 92, 63, 81, 207, 92, 62, 210, 117, 63, 210, 117, 62, 196, + 192, 159, 47, 8, 2, 1, 191, 166, 47, 17, 191, 77, 214, 108, 47, 31, 234, + 129, 214, 108, 47, 31, 197, 37, 214, 108, 47, 31, 198, 251, 214, 108, 47, + 31, 232, 124, 214, 108, 47, 31, 233, 21, 214, 108, 47, 31, 202, 131, 214, + 108, 47, 31, 203, 245, 214, 108, 47, 31, 234, 163, 214, 108, 47, 31, 213, + 173, 214, 108, 47, 31, 197, 32, 55, 47, 17, 107, 55, 47, 17, 109, 55, 47, + 17, 138, 55, 47, 17, 134, 55, 47, 17, 150, 55, 47, 17, 169, 55, 47, 17, + 175, 55, 47, 17, 171, 55, 47, 17, 178, 55, 47, 31, 199, 95, 214, 108, 47, + 17, 191, 77, 111, 122, 156, 228, 242, 111, 122, 88, 228, 242, 111, 122, + 156, 195, 135, 111, 122, 88, 195, 135, 111, 122, 156, 197, 225, 237, 218, + 228, 242, 111, 122, 88, 197, 225, 237, 218, 228, 242, 111, 122, 156, 197, + 225, 237, 218, 195, 135, 111, 122, 88, 197, 225, 237, 218, 195, 135, 111, + 122, 156, 208, 28, 237, 218, 228, 242, 111, 122, 88, 208, 28, 237, 218, + 228, 242, 111, 122, 156, 208, 28, 237, 218, 195, 135, 111, 122, 88, 208, + 28, 237, 218, 195, 135, 111, 122, 156, 144, 23, 179, 111, 122, 144, 156, + 23, 50, 229, 219, 111, 122, 144, 88, 23, 50, 219, 134, 111, 122, 88, 144, + 23, 179, 111, 122, 156, 144, 23, 219, 226, 111, 122, 144, 156, 23, 45, + 229, 219, 111, 122, 144, 88, 23, 45, 219, 134, 111, 122, 88, 144, 23, + 219, 226, 111, 122, 156, 133, 23, 179, 111, 122, 133, 156, 23, 50, 229, + 219, 111, 122, 133, 88, 23, 50, 219, 134, 111, 122, 88, 133, 23, 179, + 111, 122, 156, 133, 23, 219, 226, 111, 122, 133, 156, 23, 45, 229, 219, + 111, 122, 133, 88, 23, 45, 219, 134, 111, 122, 88, 133, 23, 219, 226, + 111, 122, 156, 81, 23, 179, 111, 122, 81, 156, 23, 50, 229, 219, 111, + 122, 133, 88, 23, 50, 144, 219, 134, 111, 122, 144, 88, 23, 50, 133, 219, + 134, 111, 122, 81, 88, 23, 50, 219, 134, 111, 122, 144, 156, 23, 50, 133, + 229, 219, 111, 122, 133, 156, 23, 50, 144, 229, 219, 111, 122, 88, 81, + 23, 179, 111, 122, 156, 81, 23, 219, 226, 111, 122, 81, 156, 23, 45, 229, + 219, 111, 122, 133, 88, 23, 45, 144, 219, 134, 111, 122, 144, 88, 23, 45, + 133, 219, 134, 111, 122, 81, 88, 23, 45, 219, 134, 111, 122, 144, 156, + 23, 45, 133, 229, 219, 111, 122, 133, 156, 23, 45, 144, 229, 219, 111, + 122, 88, 81, 23, 219, 226, 111, 122, 156, 144, 23, 228, 242, 111, 122, + 45, 88, 23, 50, 144, 219, 134, 111, 122, 50, 88, 23, 45, 144, 219, 134, + 111, 122, 144, 156, 23, 228, 243, 229, 219, 111, 122, 144, 88, 23, 228, + 243, 219, 134, 111, 122, 50, 156, 23, 45, 144, 229, 219, 111, 122, 45, + 156, 23, 50, 144, 229, 219, 111, 122, 88, 144, 23, 228, 242, 111, 122, + 156, 133, 23, 228, 242, 111, 122, 45, 88, 23, 50, 133, 219, 134, 111, + 122, 50, 88, 23, 45, 133, 219, 134, 111, 122, 133, 156, 23, 228, 243, + 229, 219, 111, 122, 133, 88, 23, 228, 243, 219, 134, 111, 122, 50, 156, + 23, 45, 133, 229, 219, 111, 122, 45, 156, 23, 50, 133, 229, 219, 111, + 122, 88, 133, 23, 228, 242, 111, 122, 156, 81, 23, 228, 242, 111, 122, + 45, 88, 23, 50, 81, 219, 134, 111, 122, 50, 88, 23, 45, 81, 219, 134, + 111, 122, 81, 156, 23, 228, 243, 229, 219, 111, 122, 133, 88, 23, 144, + 228, 243, 219, 134, 111, 122, 144, 88, 23, 133, 228, 243, 219, 134, 111, + 122, 81, 88, 23, 228, 243, 219, 134, 111, 122, 45, 133, 88, 23, 50, 144, + 219, 134, 111, 122, 50, 133, 88, 23, 45, 144, 219, 134, 111, 122, 45, + 144, 88, 23, 50, 133, 219, 134, 111, 122, 50, 144, 88, 23, 45, 133, 219, + 134, 111, 122, 144, 156, 23, 133, 228, 243, 229, 219, 111, 122, 133, 156, + 23, 144, 228, 243, 229, 219, 111, 122, 50, 156, 23, 45, 81, 229, 219, + 111, 122, 45, 156, 23, 50, 81, 229, 219, 111, 122, 88, 81, 23, 228, 242, + 111, 122, 156, 55, 237, 218, 228, 242, 111, 122, 88, 55, 237, 218, 228, + 242, 111, 122, 156, 55, 237, 218, 195, 135, 111, 122, 88, 55, 237, 218, + 195, 135, 111, 122, 55, 228, 242, 111, 122, 55, 195, 135, 111, 122, 144, + 202, 171, 23, 50, 235, 135, 111, 122, 144, 55, 23, 50, 202, 170, 111, + 122, 55, 144, 23, 179, 111, 122, 144, 202, 171, 23, 45, 235, 135, 111, + 122, 144, 55, 23, 45, 202, 170, 111, 122, 55, 144, 23, 219, 226, 111, + 122, 133, 202, 171, 23, 50, 235, 135, 111, 122, 133, 55, 23, 50, 202, + 170, 111, 122, 55, 133, 23, 179, 111, 122, 133, 202, 171, 23, 45, 235, + 135, 111, 122, 133, 55, 23, 45, 202, 170, 111, 122, 55, 133, 23, 219, + 226, 111, 122, 81, 202, 171, 23, 50, 235, 135, 111, 122, 81, 55, 23, 50, + 202, 170, 111, 122, 55, 81, 23, 179, 111, 122, 81, 202, 171, 23, 45, 235, + 135, 111, 122, 81, 55, 23, 45, 202, 170, 111, 122, 55, 81, 23, 219, 226, + 111, 122, 144, 202, 171, 23, 228, 243, 235, 135, 111, 122, 144, 55, 23, + 228, 243, 202, 170, 111, 122, 55, 144, 23, 228, 242, 111, 122, 133, 202, + 171, 23, 228, 243, 235, 135, 111, 122, 133, 55, 23, 228, 243, 202, 170, + 111, 122, 55, 133, 23, 228, 242, 111, 122, 81, 202, 171, 23, 228, 243, + 235, 135, 111, 122, 81, 55, 23, 228, 243, 202, 170, 111, 122, 55, 81, 23, + 228, 242, 111, 122, 156, 251, 19, 144, 23, 179, 111, 122, 156, 251, 19, + 144, 23, 219, 226, 111, 122, 156, 251, 19, 133, 23, 219, 226, 111, 122, + 156, 251, 19, 133, 23, 179, 111, 122, 156, 237, 41, 116, 50, 119, 110, + 219, 226, 111, 122, 156, 237, 41, 116, 45, 119, 110, 179, 111, 122, 156, + 237, 41, 238, 219, 111, 122, 156, 219, 226, 111, 122, 156, 196, 77, 111, + 122, 156, 179, 111, 122, 156, 235, 125, 111, 122, 88, 219, 226, 111, 122, + 88, 196, 77, 111, 122, 88, 179, 111, 122, 88, 235, 125, 111, 122, 156, + 45, 23, 88, 179, 111, 122, 156, 133, 23, 88, 235, 125, 111, 122, 88, 45, + 23, 156, 179, 111, 122, 88, 133, 23, 156, 235, 125, 116, 132, 248, 131, + 110, 91, 234, 162, 248, 131, 110, 91, 208, 25, 248, 131, 110, 115, 234, + 160, 248, 131, 110, 132, 248, 131, 110, 232, 228, 234, 160, 248, 131, + 110, 115, 208, 23, 248, 131, 110, 203, 248, 234, 160, 248, 131, 232, 82, + 248, 131, 45, 203, 248, 234, 160, 248, 131, 45, 115, 208, 23, 248, 131, + 45, 232, 228, 234, 160, 248, 131, 45, 132, 248, 131, 45, 115, 234, 160, + 248, 131, 45, 91, 208, 25, 248, 131, 45, 91, 234, 162, 248, 131, 50, 132, + 248, 131, 156, 203, 154, 216, 215, 203, 154, 237, 223, 203, 154, 116, 91, + 234, 162, 248, 131, 50, 91, 234, 162, 248, 131, 208, 30, 110, 219, 226, + 208, 30, 110, 179, 208, 30, 116, 219, 226, 208, 30, 116, 45, 23, 110, 45, + 23, 110, 179, 208, 30, 116, 45, 23, 110, 179, 208, 30, 116, 45, 23, 116, + 50, 23, 110, 219, 226, 208, 30, 116, 45, 23, 116, 50, 23, 110, 179, 208, + 30, 116, 179, 208, 30, 116, 50, 23, 110, 219, 226, 208, 30, 116, 50, 23, + 110, 45, 23, 110, 179, 62, 201, 191, 63, 201, 191, 63, 51, 4, 206, 114, + 239, 2, 63, 51, 239, 35, 62, 2, 201, 191, 51, 4, 228, 243, 233, 7, 51, 4, + 81, 233, 7, 51, 4, 211, 40, 238, 213, 233, 7, 51, 4, 116, 45, 119, 110, + 50, 233, 7, 51, 4, 116, 50, 119, 110, 45, 233, 7, 51, 4, 237, 41, 238, + 213, 233, 7, 62, 2, 201, 191, 63, 2, 201, 191, 62, 207, 94, 63, 207, 94, + 62, 81, 207, 94, 63, 81, 207, 94, 62, 210, 119, 63, 210, 119, 62, 196, 76, 197, 241, 63, 196, 76, 197, 241, 62, 196, 76, 2, 197, 241, 63, 196, - 76, 2, 197, 241, 62, 206, 203, 197, 241, 63, 206, 203, 197, 241, 62, 206, - 203, 2, 197, 241, 63, 206, 203, 2, 197, 241, 62, 206, 203, 209, 59, 63, - 206, 203, 209, 59, 62, 235, 122, 197, 241, 63, 235, 122, 197, 241, 62, - 235, 122, 2, 197, 241, 63, 235, 122, 2, 197, 241, 62, 219, 219, 197, 241, - 63, 219, 219, 197, 241, 62, 219, 219, 2, 197, 241, 63, 219, 219, 2, 197, - 241, 62, 219, 219, 209, 59, 63, 219, 219, 209, 59, 62, 237, 32, 63, 237, - 32, 63, 237, 33, 239, 33, 62, 2, 237, 32, 232, 235, 218, 232, 63, 243, - 10, 235, 138, 243, 10, 243, 11, 4, 81, 233, 5, 247, 244, 62, 243, 10, - 243, 11, 4, 45, 132, 248, 139, 243, 11, 4, 50, 132, 248, 139, 243, 11, 4, - 110, 132, 248, 139, 243, 11, 4, 116, 132, 248, 139, 243, 11, 4, 116, 50, - 208, 28, 248, 139, 243, 11, 4, 251, 175, 247, 218, 116, 45, 208, 28, 248, - 139, 45, 132, 62, 243, 10, 50, 132, 62, 243, 10, 223, 95, 247, 248, 223, - 95, 63, 243, 10, 116, 132, 223, 95, 63, 243, 10, 110, 132, 223, 95, 63, - 243, 10, 116, 45, 208, 28, 243, 4, 251, 16, 116, 50, 208, 28, 243, 4, - 251, 16, 110, 50, 208, 28, 243, 4, 251, 16, 110, 45, 208, 28, 243, 4, - 251, 16, 116, 132, 243, 10, 110, 132, 243, 10, 62, 110, 50, 197, 241, 62, + 76, 2, 197, 241, 62, 206, 204, 197, 241, 63, 206, 204, 197, 241, 62, 206, + 204, 2, 197, 241, 63, 206, 204, 2, 197, 241, 62, 206, 204, 209, 61, 63, + 206, 204, 209, 61, 62, 235, 124, 197, 241, 63, 235, 124, 197, 241, 62, + 235, 124, 2, 197, 241, 63, 235, 124, 2, 197, 241, 62, 219, 221, 197, 241, + 63, 219, 221, 197, 241, 62, 219, 221, 2, 197, 241, 63, 219, 221, 2, 197, + 241, 62, 219, 221, 209, 61, 63, 219, 221, 209, 61, 62, 237, 34, 63, 237, + 34, 63, 237, 35, 239, 35, 62, 2, 237, 34, 232, 237, 218, 234, 63, 243, + 12, 235, 140, 243, 12, 243, 13, 4, 81, 233, 7, 247, 246, 62, 243, 12, + 243, 13, 4, 45, 132, 248, 141, 243, 13, 4, 50, 132, 248, 141, 243, 13, 4, + 110, 132, 248, 141, 243, 13, 4, 116, 132, 248, 141, 243, 13, 4, 116, 50, + 208, 30, 248, 141, 243, 13, 4, 251, 177, 247, 220, 116, 45, 208, 30, 248, + 141, 45, 132, 62, 243, 12, 50, 132, 62, 243, 12, 223, 97, 247, 250, 223, + 97, 63, 243, 12, 116, 132, 223, 97, 63, 243, 12, 110, 132, 223, 97, 63, + 243, 12, 116, 45, 208, 30, 243, 6, 251, 18, 116, 50, 208, 30, 243, 6, + 251, 18, 110, 50, 208, 30, 243, 6, 251, 18, 110, 45, 208, 30, 243, 6, + 251, 18, 116, 132, 243, 12, 110, 132, 243, 12, 62, 110, 50, 197, 241, 62, 110, 45, 197, 241, 62, 116, 45, 197, 241, 62, 116, 50, 197, 241, 63, 247, - 248, 51, 4, 45, 132, 248, 139, 51, 4, 50, 132, 248, 139, 51, 4, 116, 45, - 237, 39, 132, 248, 139, 51, 4, 110, 50, 237, 39, 132, 248, 139, 63, 51, - 4, 81, 248, 154, 219, 112, 63, 196, 76, 197, 242, 4, 236, 140, 196, 76, - 197, 242, 4, 45, 132, 248, 139, 196, 76, 197, 242, 4, 50, 132, 248, 139, - 220, 13, 243, 10, 63, 51, 4, 116, 45, 208, 27, 63, 51, 4, 110, 45, 208, - 27, 63, 51, 4, 110, 50, 208, 27, 63, 51, 4, 116, 50, 208, 27, 63, 243, - 11, 4, 116, 45, 208, 27, 63, 243, 11, 4, 110, 45, 208, 27, 63, 243, 11, - 4, 110, 50, 208, 27, 63, 243, 11, 4, 116, 50, 208, 27, 116, 45, 197, 241, - 116, 50, 197, 241, 110, 45, 197, 241, 63, 216, 213, 201, 190, 62, 216, - 213, 201, 190, 63, 216, 213, 2, 201, 190, 62, 216, 213, 2, 201, 190, 110, - 50, 197, 241, 62, 200, 199, 4, 207, 119, 242, 210, 196, 117, 202, 48, - 242, 77, 62, 201, 102, 63, 201, 102, 219, 129, 198, 208, 200, 198, 250, - 213, 213, 35, 237, 86, 213, 35, 239, 42, 211, 62, 62, 199, 106, 63, 199, - 106, 249, 107, 248, 62, 249, 107, 111, 4, 243, 125, 249, 107, 111, 4, - 192, 235, 205, 154, 196, 118, 4, 207, 150, 235, 96, 228, 181, 248, 207, - 63, 203, 49, 209, 175, 62, 203, 49, 209, 175, 203, 140, 207, 18, 206, - 122, 232, 190, 229, 224, 247, 248, 62, 45, 209, 58, 223, 148, 62, 50, - 209, 58, 223, 148, 63, 45, 209, 58, 223, 148, 63, 133, 209, 58, 223, 148, - 63, 50, 209, 58, 223, 148, 63, 144, 209, 58, 223, 148, 202, 104, 23, 238, - 215, 247, 71, 56, 207, 164, 56, 248, 162, 56, 247, 151, 251, 99, 211, 39, - 238, 217, 243, 96, 207, 3, 238, 218, 79, 218, 255, 238, 218, 79, 222, - 254, 201, 103, 23, 238, 227, 233, 74, 113, 252, 34, 203, 143, 230, 62, - 23, 202, 213, 210, 61, 113, 192, 22, 192, 106, 197, 231, 40, 229, 219, - 197, 231, 40, 220, 43, 197, 231, 40, 232, 243, 197, 231, 40, 198, 209, - 197, 231, 40, 193, 66, 197, 231, 40, 193, 143, 197, 231, 40, 215, 184, - 197, 231, 40, 234, 207, 193, 94, 79, 237, 60, 63, 232, 92, 233, 103, 63, - 202, 64, 233, 103, 62, 202, 64, 233, 103, 63, 200, 199, 4, 207, 119, 232, - 238, 208, 23, 215, 205, 220, 6, 208, 23, 215, 205, 216, 180, 233, 42, 56, - 234, 207, 217, 97, 56, 222, 167, 205, 115, 196, 57, 214, 94, 209, 77, - 251, 2, 199, 164, 231, 152, 247, 124, 219, 186, 195, 38, 219, 143, 205, - 80, 205, 183, 247, 106, 251, 34, 209, 120, 63, 243, 105, 221, 138, 63, - 243, 105, 208, 14, 63, 243, 105, 206, 131, 63, 243, 105, 248, 152, 63, - 243, 105, 221, 76, 63, 243, 105, 210, 74, 62, 243, 105, 221, 138, 62, - 243, 105, 208, 14, 62, 243, 105, 206, 131, 62, 243, 105, 248, 152, 62, - 243, 105, 221, 76, 62, 243, 105, 210, 74, 62, 201, 245, 200, 211, 63, - 229, 224, 200, 211, 63, 237, 33, 200, 211, 62, 242, 207, 200, 211, 63, - 201, 245, 200, 211, 62, 229, 224, 200, 211, 62, 237, 33, 200, 211, 63, - 242, 207, 200, 211, 228, 181, 201, 195, 208, 23, 213, 6, 234, 160, 213, - 6, 249, 13, 234, 160, 213, 1, 249, 13, 202, 129, 213, 1, 215, 97, 232, - 207, 56, 215, 97, 214, 206, 56, 215, 97, 203, 127, 56, 193, 105, 200, 63, - 238, 217, 234, 204, 200, 63, 238, 217, 196, 87, 207, 88, 113, 207, 88, - 16, 40, 196, 254, 209, 98, 207, 88, 16, 40, 196, 252, 209, 98, 207, 88, - 16, 40, 196, 251, 209, 98, 207, 88, 16, 40, 196, 249, 209, 98, 207, 88, - 16, 40, 196, 247, 209, 98, 207, 88, 16, 40, 196, 245, 209, 98, 207, 88, - 16, 40, 196, 243, 209, 98, 207, 88, 16, 40, 231, 149, 217, 28, 62, 196, - 87, 207, 88, 113, 207, 89, 210, 136, 113, 210, 104, 210, 136, 113, 210, - 3, 210, 136, 56, 193, 92, 113, 237, 25, 233, 102, 237, 25, 233, 101, 237, - 25, 233, 100, 237, 25, 233, 99, 237, 25, 233, 98, 237, 25, 233, 97, 63, - 243, 11, 4, 75, 183, 63, 243, 11, 4, 105, 236, 138, 62, 243, 11, 4, 63, - 75, 183, 62, 243, 11, 4, 105, 63, 236, 138, 215, 221, 40, 192, 106, 215, - 221, 40, 192, 21, 237, 6, 40, 230, 205, 192, 106, 237, 6, 40, 219, 178, - 192, 21, 237, 6, 40, 219, 178, 192, 106, 237, 6, 40, 230, 205, 192, 21, - 63, 232, 217, 62, 232, 217, 230, 62, 23, 209, 180, 251, 127, 238, 214, - 200, 130, 201, 112, 79, 252, 8, 205, 98, 251, 191, 232, 186, 231, 162, - 201, 112, 79, 229, 191, 250, 172, 113, 232, 202, 211, 10, 63, 201, 102, - 115, 219, 107, 239, 19, 183, 115, 219, 107, 239, 19, 219, 224, 193, 155, - 56, 137, 195, 12, 56, 235, 128, 233, 42, 56, 235, 128, 217, 97, 56, 223, - 105, 233, 42, 23, 217, 97, 56, 217, 97, 23, 233, 42, 56, 217, 97, 4, 201, - 28, 56, 217, 97, 4, 201, 28, 23, 217, 97, 23, 233, 42, 56, 81, 217, 97, - 4, 201, 28, 56, 228, 241, 217, 97, 4, 201, 28, 56, 216, 213, 63, 243, 10, - 216, 213, 62, 243, 10, 216, 213, 2, 63, 243, 10, 217, 48, 113, 236, 198, - 113, 196, 84, 210, 103, 113, 242, 89, 232, 74, 196, 53, 214, 83, 247, 7, - 210, 185, 222, 173, 195, 80, 243, 75, 62, 215, 206, 219, 126, 203, 176, - 204, 22, 208, 4, 203, 255, 202, 36, 249, 111, 249, 73, 112, 221, 222, 63, - 235, 108, 217, 90, 63, 235, 108, 221, 138, 62, 235, 108, 217, 90, 62, - 235, 108, 221, 138, 202, 49, 193, 51, 202, 52, 200, 199, 248, 242, 242, - 210, 207, 149, 62, 202, 48, 198, 210, 242, 211, 23, 207, 149, 153, 63, - 203, 49, 209, 175, 153, 62, 203, 49, 209, 175, 63, 237, 33, 223, 163, - 201, 190, 238, 210, 220, 21, 236, 229, 247, 102, 211, 65, 209, 180, 247, - 103, 202, 85, 229, 201, 4, 63, 238, 217, 47, 238, 210, 220, 21, 246, 253, - 213, 44, 234, 72, 251, 157, 211, 96, 45, 193, 129, 198, 19, 62, 197, 10, - 45, 193, 129, 198, 19, 63, 197, 10, 45, 193, 129, 198, 19, 62, 45, 220, - 22, 216, 179, 63, 45, 220, 22, 216, 179, 235, 103, 202, 76, 56, 88, 63, - 235, 122, 197, 241, 45, 242, 219, 234, 72, 112, 205, 154, 233, 83, 237, - 39, 223, 163, 63, 243, 11, 223, 163, 62, 201, 190, 62, 197, 203, 207, 29, - 45, 234, 71, 207, 29, 45, 234, 70, 250, 187, 16, 40, 196, 57, 88, 243, - 11, 4, 201, 28, 23, 105, 185, 58, 210, 23, 206, 205, 223, 107, 210, 23, - 219, 221, 223, 107, 210, 23, 223, 93, 210, 23, 62, 238, 218, 211, 105, - 203, 78, 203, 66, 203, 12, 243, 40, 247, 80, 229, 118, 202, 137, 231, - 163, 193, 51, 228, 153, 231, 163, 4, 230, 30, 217, 72, 16, 40, 219, 131, - 215, 184, 196, 118, 211, 105, 230, 188, 232, 129, 232, 218, 223, 163, - 229, 5, 233, 32, 205, 178, 51, 232, 128, 239, 0, 202, 108, 228, 27, 202, - 112, 209, 251, 4, 249, 111, 199, 87, 223, 19, 249, 93, 113, 229, 229, - 230, 207, 113, 232, 83, 208, 153, 238, 182, 211, 105, 62, 201, 190, 63, - 232, 218, 4, 228, 241, 82, 62, 201, 29, 62, 205, 188, 205, 84, 116, 248, - 134, 205, 84, 62, 205, 84, 110, 248, 134, 205, 84, 63, 205, 84, 63, 88, - 243, 126, 77, 199, 107, 219, 40, 56, 199, 182, 235, 102, 251, 223, 234, - 67, 207, 147, 232, 231, 207, 147, 230, 53, 195, 67, 230, 53, 193, 3, 230, - 53, 110, 50, 210, 33, 210, 33, 116, 50, 210, 33, 63, 213, 208, 62, 213, - 208, 243, 126, 77, 88, 243, 126, 77, 215, 127, 192, 235, 88, 215, 127, - 192, 235, 249, 107, 192, 235, 88, 249, 107, 192, 235, 211, 10, 35, 238, - 217, 88, 35, 238, 217, 211, 77, 247, 22, 238, 217, 88, 211, 77, 247, 22, - 238, 217, 8, 238, 217, 203, 151, 63, 8, 238, 217, 211, 10, 8, 238, 217, - 217, 93, 238, 217, 201, 103, 79, 237, 208, 232, 128, 199, 127, 250, 193, - 232, 128, 249, 108, 250, 193, 88, 232, 128, 249, 108, 250, 193, 232, 128, - 242, 205, 250, 193, 62, 232, 128, 209, 60, 201, 102, 63, 232, 128, 209, - 60, 201, 102, 201, 240, 201, 38, 211, 10, 63, 201, 102, 47, 63, 201, 102, - 211, 77, 247, 22, 62, 201, 102, 62, 247, 22, 63, 201, 102, 211, 10, 62, - 201, 102, 88, 211, 10, 62, 201, 102, 209, 130, 201, 102, 203, 151, 63, - 201, 102, 88, 250, 193, 211, 77, 247, 22, 250, 193, 234, 164, 201, 206, - 250, 193, 234, 164, 209, 60, 62, 201, 102, 234, 164, 209, 60, 209, 130, - 201, 102, 202, 136, 209, 60, 62, 201, 102, 234, 164, 209, 60, 207, 90, - 62, 201, 102, 88, 234, 164, 209, 60, 207, 90, 62, 201, 102, 197, 38, 209, - 60, 62, 201, 102, 202, 131, 209, 60, 250, 193, 199, 127, 250, 193, 211, - 77, 247, 22, 199, 127, 250, 193, 88, 199, 127, 250, 193, 202, 136, 209, - 239, 62, 23, 63, 232, 189, 62, 232, 189, 63, 232, 189, 234, 164, 209, - 239, 211, 10, 62, 232, 189, 47, 211, 77, 247, 22, 234, 164, 209, 60, 201, - 102, 88, 199, 127, 209, 130, 250, 193, 202, 50, 198, 172, 197, 234, 202, - 50, 88, 243, 101, 202, 50, 201, 242, 88, 201, 242, 249, 108, 250, 193, - 234, 164, 199, 127, 208, 189, 250, 193, 88, 234, 164, 199, 127, 208, 189, - 250, 193, 238, 218, 77, 203, 151, 63, 243, 10, 214, 106, 112, 238, 218, - 77, 110, 50, 235, 98, 63, 201, 190, 116, 50, 235, 98, 63, 201, 190, 110, - 50, 203, 151, 63, 201, 190, 116, 50, 203, 151, 63, 201, 190, 62, 208, 13, - 87, 211, 42, 63, 208, 13, 87, 211, 42, 63, 233, 216, 87, 211, 42, 62, - 237, 33, 216, 35, 63, 192, 235, 88, 233, 216, 87, 113, 156, 81, 164, 216, - 213, 81, 164, 88, 81, 164, 88, 202, 170, 153, 242, 75, 207, 252, 87, 211, - 42, 88, 202, 170, 242, 75, 207, 252, 87, 211, 42, 88, 55, 153, 242, 75, - 207, 252, 87, 211, 42, 88, 55, 242, 75, 207, 252, 87, 211, 42, 88, 130, - 202, 170, 242, 75, 207, 252, 87, 211, 42, 88, 130, 55, 242, 75, 207, 252, - 87, 211, 42, 238, 163, 201, 81, 210, 128, 3, 211, 42, 88, 233, 216, 87, - 211, 42, 88, 229, 224, 233, 216, 87, 211, 42, 88, 62, 229, 223, 206, 122, - 88, 62, 229, 224, 247, 248, 232, 190, 229, 223, 206, 122, 232, 190, 229, - 224, 247, 248, 216, 213, 45, 210, 114, 211, 42, 216, 213, 50, 210, 114, - 211, 42, 216, 213, 232, 203, 45, 210, 114, 211, 42, 216, 213, 232, 203, - 50, 210, 114, 211, 42, 216, 213, 219, 219, 251, 116, 248, 54, 211, 42, - 216, 213, 206, 203, 251, 116, 248, 54, 211, 42, 88, 219, 219, 251, 116, - 207, 252, 87, 211, 42, 88, 206, 203, 251, 116, 207, 252, 87, 211, 42, 88, - 219, 219, 251, 116, 248, 54, 211, 42, 88, 206, 203, 251, 116, 248, 54, - 211, 42, 156, 45, 198, 42, 203, 103, 248, 54, 211, 42, 156, 50, 198, 42, - 203, 103, 248, 54, 211, 42, 216, 213, 45, 238, 171, 248, 54, 211, 42, - 216, 213, 50, 238, 171, 248, 54, 211, 42, 236, 241, 214, 106, 47, 17, - 107, 236, 241, 214, 106, 47, 17, 109, 236, 241, 214, 106, 47, 17, 138, - 236, 241, 214, 106, 47, 17, 134, 236, 241, 214, 106, 47, 17, 149, 236, - 241, 214, 106, 47, 17, 169, 236, 241, 214, 106, 47, 17, 175, 236, 241, - 214, 106, 47, 17, 171, 236, 241, 214, 106, 47, 17, 178, 236, 241, 214, - 106, 47, 31, 199, 95, 236, 241, 47, 49, 17, 107, 236, 241, 47, 49, 17, - 109, 236, 241, 47, 49, 17, 138, 236, 241, 47, 49, 17, 134, 236, 241, 47, - 49, 17, 149, 236, 241, 47, 49, 17, 169, 236, 241, 47, 49, 17, 175, 236, - 241, 47, 49, 17, 171, 236, 241, 47, 49, 17, 178, 236, 241, 47, 49, 31, - 199, 95, 236, 241, 214, 106, 47, 49, 17, 107, 236, 241, 214, 106, 47, 49, - 17, 109, 236, 241, 214, 106, 47, 49, 17, 138, 236, 241, 214, 106, 47, 49, - 17, 134, 236, 241, 214, 106, 47, 49, 17, 149, 236, 241, 214, 106, 47, 49, - 17, 169, 236, 241, 214, 106, 47, 49, 17, 175, 236, 241, 214, 106, 47, 49, - 17, 171, 236, 241, 214, 106, 47, 49, 17, 178, 236, 241, 214, 106, 47, 49, - 31, 199, 95, 88, 193, 77, 96, 57, 88, 108, 56, 88, 216, 35, 56, 88, 236, - 200, 56, 88, 202, 2, 234, 204, 57, 88, 96, 57, 88, 186, 234, 204, 57, - 235, 113, 209, 62, 96, 57, 88, 206, 114, 96, 57, 197, 240, 96, 57, 88, - 197, 240, 96, 57, 237, 214, 197, 240, 96, 57, 88, 237, 214, 197, 240, 96, - 57, 62, 96, 57, 198, 225, 198, 52, 96, 250, 235, 198, 225, 248, 75, 96, - 250, 235, 62, 96, 250, 235, 88, 62, 238, 163, 235, 119, 23, 96, 57, 88, - 62, 238, 163, 196, 66, 23, 96, 57, 201, 187, 62, 96, 57, 88, 239, 56, 62, - 96, 57, 206, 202, 63, 96, 57, 219, 218, 63, 96, 57, 249, 145, 203, 151, - 63, 96, 57, 232, 95, 203, 151, 63, 96, 57, 88, 110, 206, 201, 63, 96, 57, - 88, 116, 206, 201, 63, 96, 57, 213, 8, 110, 206, 201, 63, 96, 57, 238, - 171, 219, 4, 213, 8, 116, 206, 201, 63, 96, 57, 47, 88, 63, 96, 57, 193, - 88, 96, 57, 248, 138, 202, 2, 234, 204, 57, 248, 138, 96, 57, 248, 138, - 186, 234, 204, 57, 88, 248, 138, 202, 2, 234, 204, 57, 88, 248, 138, 96, - 57, 88, 248, 138, 186, 234, 204, 57, 199, 129, 96, 57, 88, 199, 128, 96, - 57, 193, 115, 96, 57, 88, 193, 115, 96, 57, 211, 71, 96, 57, 55, 238, - 171, 219, 4, 115, 236, 251, 251, 115, 63, 197, 242, 239, 33, 2, 63, 197, - 241, 209, 254, 211, 77, 200, 228, 211, 77, 200, 180, 45, 206, 7, 249, - 131, 237, 112, 50, 206, 7, 249, 131, 237, 112, 211, 57, 4, 75, 223, 117, - 207, 19, 202, 24, 208, 230, 200, 228, 200, 181, 208, 230, 202, 23, 81, - 249, 88, 4, 228, 241, 106, 13, 206, 180, 237, 38, 179, 236, 199, 13, 233, - 83, 237, 38, 112, 219, 29, 251, 125, 112, 219, 29, 211, 56, 63, 237, 33, - 4, 247, 20, 236, 140, 23, 4, 236, 140, 234, 132, 79, 211, 69, 196, 65, - 110, 50, 239, 2, 4, 236, 140, 116, 45, 239, 2, 4, 236, 140, 45, 211, 12, - 222, 199, 50, 211, 12, 222, 199, 232, 80, 211, 12, 222, 199, 220, 13, - 133, 199, 228, 220, 13, 144, 199, 228, 45, 23, 50, 55, 197, 57, 45, 23, - 50, 199, 228, 45, 215, 131, 179, 50, 199, 228, 179, 45, 199, 228, 133, - 199, 229, 4, 243, 11, 58, 218, 233, 236, 206, 247, 205, 228, 241, 206, - 52, 63, 239, 55, 237, 32, 63, 239, 55, 237, 33, 4, 118, 198, 182, 63, - 239, 55, 237, 33, 4, 96, 198, 182, 63, 51, 4, 118, 198, 182, 63, 51, 4, - 96, 198, 182, 13, 45, 63, 51, 248, 53, 13, 50, 63, 51, 248, 53, 13, 45, - 251, 116, 248, 53, 13, 50, 251, 116, 248, 53, 13, 45, 55, 251, 116, 248, - 53, 13, 50, 55, 251, 116, 248, 53, 13, 45, 63, 198, 42, 203, 103, 248, - 53, 13, 50, 63, 198, 42, 203, 103, 248, 53, 13, 45, 232, 203, 210, 113, - 13, 50, 232, 203, 210, 113, 196, 66, 208, 26, 57, 235, 119, 208, 26, 57, - 251, 85, 231, 202, 243, 11, 57, 242, 221, 231, 202, 243, 11, 57, 50, 64, - 4, 47, 209, 81, 179, 118, 57, 179, 96, 57, 179, 45, 50, 57, 179, 118, 55, - 57, 179, 96, 55, 57, 179, 45, 50, 55, 57, 179, 118, 64, 232, 98, 164, - 179, 96, 64, 232, 98, 164, 179, 118, 55, 64, 232, 98, 164, 179, 96, 55, - 64, 232, 98, 164, 179, 96, 201, 183, 57, 69, 70, 248, 132, 69, 70, 236, - 137, 69, 70, 236, 9, 69, 70, 236, 136, 69, 70, 235, 201, 69, 70, 236, 72, - 69, 70, 236, 8, 69, 70, 236, 135, 69, 70, 235, 169, 69, 70, 236, 40, 69, - 70, 235, 232, 69, 70, 236, 103, 69, 70, 235, 200, 69, 70, 236, 71, 69, - 70, 236, 7, 69, 70, 236, 134, 69, 70, 235, 153, 69, 70, 236, 24, 69, 70, - 235, 216, 69, 70, 236, 87, 69, 70, 235, 184, 69, 70, 236, 55, 69, 70, - 235, 247, 69, 70, 236, 118, 69, 70, 235, 168, 69, 70, 236, 39, 69, 70, - 235, 231, 69, 70, 236, 102, 69, 70, 235, 199, 69, 70, 236, 70, 69, 70, - 236, 6, 69, 70, 236, 133, 69, 70, 235, 145, 69, 70, 236, 16, 69, 70, 235, - 208, 69, 70, 236, 79, 69, 70, 235, 176, 69, 70, 236, 47, 69, 70, 235, - 239, 69, 70, 236, 110, 69, 70, 235, 160, 69, 70, 236, 31, 69, 70, 235, - 223, 69, 70, 236, 94, 69, 70, 235, 191, 69, 70, 236, 62, 69, 70, 235, - 254, 69, 70, 236, 125, 69, 70, 235, 152, 69, 70, 236, 23, 69, 70, 235, - 215, 69, 70, 236, 86, 69, 70, 235, 183, 69, 70, 236, 54, 69, 70, 235, - 246, 69, 70, 236, 117, 69, 70, 235, 167, 69, 70, 236, 38, 69, 70, 235, - 230, 69, 70, 236, 101, 69, 70, 235, 198, 69, 70, 236, 69, 69, 70, 236, 5, - 69, 70, 236, 132, 69, 70, 235, 141, 69, 70, 236, 12, 69, 70, 235, 204, - 69, 70, 236, 75, 69, 70, 235, 172, 69, 70, 236, 43, 69, 70, 235, 235, 69, - 70, 236, 106, 69, 70, 235, 156, 69, 70, 236, 27, 69, 70, 235, 219, 69, - 70, 236, 90, 69, 70, 235, 187, 69, 70, 236, 58, 69, 70, 235, 250, 69, 70, - 236, 121, 69, 70, 235, 148, 69, 70, 236, 19, 69, 70, 235, 211, 69, 70, - 236, 82, 69, 70, 235, 179, 69, 70, 236, 50, 69, 70, 235, 242, 69, 70, - 236, 113, 69, 70, 235, 163, 69, 70, 236, 34, 69, 70, 235, 226, 69, 70, - 236, 97, 69, 70, 235, 194, 69, 70, 236, 65, 69, 70, 236, 1, 69, 70, 236, - 128, 69, 70, 235, 144, 69, 70, 236, 15, 69, 70, 235, 207, 69, 70, 236, - 78, 69, 70, 235, 175, 69, 70, 236, 46, 69, 70, 235, 238, 69, 70, 236, - 109, 69, 70, 235, 159, 69, 70, 236, 30, 69, 70, 235, 222, 69, 70, 236, - 93, 69, 70, 235, 190, 69, 70, 236, 61, 69, 70, 235, 253, 69, 70, 236, - 124, 69, 70, 235, 151, 69, 70, 236, 22, 69, 70, 235, 214, 69, 70, 236, - 85, 69, 70, 235, 182, 69, 70, 236, 53, 69, 70, 235, 245, 69, 70, 236, - 116, 69, 70, 235, 166, 69, 70, 236, 37, 69, 70, 235, 229, 69, 70, 236, - 100, 69, 70, 235, 197, 69, 70, 236, 68, 69, 70, 236, 4, 69, 70, 236, 131, - 69, 70, 235, 139, 69, 70, 236, 10, 69, 70, 235, 202, 69, 70, 236, 73, 69, - 70, 235, 170, 69, 70, 236, 41, 69, 70, 235, 233, 69, 70, 236, 104, 69, - 70, 235, 154, 69, 70, 236, 25, 69, 70, 235, 217, 69, 70, 236, 88, 69, 70, - 235, 185, 69, 70, 236, 56, 69, 70, 235, 248, 69, 70, 236, 119, 69, 70, - 235, 146, 69, 70, 236, 17, 69, 70, 235, 209, 69, 70, 236, 80, 69, 70, - 235, 177, 69, 70, 236, 48, 69, 70, 235, 240, 69, 70, 236, 111, 69, 70, - 235, 161, 69, 70, 236, 32, 69, 70, 235, 224, 69, 70, 236, 95, 69, 70, - 235, 192, 69, 70, 236, 63, 69, 70, 235, 255, 69, 70, 236, 126, 69, 70, - 235, 142, 69, 70, 236, 13, 69, 70, 235, 205, 69, 70, 236, 76, 69, 70, - 235, 173, 69, 70, 236, 44, 69, 70, 235, 236, 69, 70, 236, 107, 69, 70, - 235, 157, 69, 70, 236, 28, 69, 70, 235, 220, 69, 70, 236, 91, 69, 70, - 235, 188, 69, 70, 236, 59, 69, 70, 235, 251, 69, 70, 236, 122, 69, 70, - 235, 149, 69, 70, 236, 20, 69, 70, 235, 212, 69, 70, 236, 83, 69, 70, - 235, 180, 69, 70, 236, 51, 69, 70, 235, 243, 69, 70, 236, 114, 69, 70, - 235, 164, 69, 70, 236, 35, 69, 70, 235, 227, 69, 70, 236, 98, 69, 70, - 235, 195, 69, 70, 236, 66, 69, 70, 236, 2, 69, 70, 236, 129, 69, 70, 235, - 140, 69, 70, 236, 11, 69, 70, 235, 203, 69, 70, 236, 74, 69, 70, 235, - 171, 69, 70, 236, 42, 69, 70, 235, 234, 69, 70, 236, 105, 69, 70, 235, - 155, 69, 70, 236, 26, 69, 70, 235, 218, 69, 70, 236, 89, 69, 70, 235, - 186, 69, 70, 236, 57, 69, 70, 235, 249, 69, 70, 236, 120, 69, 70, 235, - 147, 69, 70, 236, 18, 69, 70, 235, 210, 69, 70, 236, 81, 69, 70, 235, - 178, 69, 70, 236, 49, 69, 70, 235, 241, 69, 70, 236, 112, 69, 70, 235, - 162, 69, 70, 236, 33, 69, 70, 235, 225, 69, 70, 236, 96, 69, 70, 235, - 193, 69, 70, 236, 64, 69, 70, 236, 0, 69, 70, 236, 127, 69, 70, 235, 143, - 69, 70, 236, 14, 69, 70, 235, 206, 69, 70, 236, 77, 69, 70, 235, 174, 69, - 70, 236, 45, 69, 70, 235, 237, 69, 70, 236, 108, 69, 70, 235, 158, 69, - 70, 236, 29, 69, 70, 235, 221, 69, 70, 236, 92, 69, 70, 235, 189, 69, 70, - 236, 60, 69, 70, 235, 252, 69, 70, 236, 123, 69, 70, 235, 150, 69, 70, - 236, 21, 69, 70, 235, 213, 69, 70, 236, 84, 69, 70, 235, 181, 69, 70, - 236, 52, 69, 70, 235, 244, 69, 70, 236, 115, 69, 70, 235, 165, 69, 70, - 236, 36, 69, 70, 235, 228, 69, 70, 236, 99, 69, 70, 235, 196, 69, 70, - 236, 67, 69, 70, 236, 3, 69, 70, 236, 130, 96, 197, 13, 64, 4, 81, 106, - 96, 197, 13, 64, 4, 55, 81, 106, 118, 55, 64, 4, 81, 106, 96, 55, 64, 4, - 81, 106, 45, 50, 55, 64, 4, 81, 106, 96, 197, 13, 64, 232, 98, 164, 118, - 55, 64, 232, 98, 164, 96, 55, 64, 232, 98, 164, 235, 119, 64, 4, 228, - 241, 106, 196, 66, 64, 4, 228, 241, 106, 196, 66, 197, 225, 57, 235, 119, - 197, 225, 57, 118, 55, 237, 216, 57, 96, 55, 237, 216, 57, 118, 197, 225, - 237, 216, 57, 96, 197, 225, 237, 216, 57, 96, 197, 13, 197, 225, 237, - 216, 57, 96, 64, 4, 235, 138, 201, 80, 196, 66, 64, 119, 164, 235, 119, - 64, 119, 164, 96, 64, 4, 199, 216, 4, 81, 106, 96, 64, 4, 199, 216, 4, - 55, 81, 106, 96, 197, 13, 64, 4, 199, 215, 96, 197, 13, 64, 4, 199, 216, - 4, 81, 106, 96, 197, 13, 64, 4, 199, 216, 4, 55, 81, 106, 118, 250, 237, - 96, 250, 237, 118, 55, 250, 237, 96, 55, 250, 237, 118, 64, 119, 62, 237, - 32, 96, 64, 119, 62, 237, 32, 118, 64, 232, 98, 249, 88, 119, 62, 237, - 32, 96, 64, 232, 98, 249, 88, 119, 62, 237, 32, 186, 193, 105, 23, 202, - 2, 234, 204, 57, 186, 234, 204, 23, 202, 2, 193, 105, 57, 186, 193, 105, - 64, 4, 102, 186, 234, 204, 64, 4, 102, 202, 2, 234, 204, 64, 4, 102, 202, - 2, 193, 105, 64, 4, 102, 186, 193, 105, 64, 23, 186, 234, 204, 57, 186, - 234, 204, 64, 23, 202, 2, 234, 204, 57, 202, 2, 234, 204, 64, 23, 202, 2, - 193, 105, 57, 202, 2, 193, 105, 64, 23, 186, 193, 105, 57, 206, 180, 237, - 39, 238, 210, 233, 83, 237, 38, 233, 83, 237, 39, 238, 210, 206, 180, - 237, 38, 202, 2, 234, 204, 64, 238, 210, 186, 234, 204, 57, 186, 234, - 204, 64, 238, 210, 202, 2, 234, 204, 57, 233, 83, 237, 39, 238, 210, 186, - 234, 204, 57, 206, 180, 237, 39, 238, 210, 202, 2, 234, 204, 57, 186, - 234, 204, 64, 238, 210, 186, 193, 105, 57, 186, 193, 105, 64, 238, 210, - 186, 234, 204, 57, 193, 139, 64, 209, 58, 236, 231, 183, 64, 209, 58, 96, - 199, 25, 238, 161, 196, 65, 64, 209, 58, 96, 199, 25, 238, 161, 235, 118, - 64, 209, 58, 235, 119, 199, 25, 238, 161, 219, 214, 64, 209, 58, 235, - 119, 199, 25, 238, 161, 206, 197, 206, 200, 251, 17, 242, 221, 57, 219, - 217, 251, 17, 251, 85, 57, 198, 54, 251, 17, 251, 85, 57, 248, 77, 251, - 17, 251, 85, 57, 198, 54, 251, 17, 242, 221, 64, 4, 216, 34, 198, 54, - 251, 17, 251, 85, 64, 4, 209, 81, 110, 50, 204, 27, 242, 221, 57, 110, - 45, 204, 27, 251, 85, 57, 251, 85, 242, 219, 243, 11, 57, 242, 221, 242, - 219, 243, 11, 57, 96, 64, 93, 203, 40, 118, 57, 118, 64, 93, 203, 40, 96, - 57, 203, 40, 96, 64, 93, 118, 57, 96, 64, 4, 108, 60, 118, 64, 4, 108, - 60, 96, 64, 198, 216, 192, 235, 45, 50, 64, 198, 216, 2, 243, 10, 196, - 66, 197, 13, 64, 232, 98, 2, 243, 10, 45, 181, 133, 50, 181, 144, 230, - 12, 45, 181, 144, 50, 181, 133, 230, 12, 133, 181, 50, 144, 181, 45, 230, - 12, 133, 181, 45, 144, 181, 50, 230, 12, 45, 181, 133, 50, 181, 133, 230, - 12, 133, 181, 50, 144, 181, 50, 230, 12, 45, 181, 144, 50, 181, 144, 230, - 12, 133, 181, 45, 144, 181, 45, 230, 12, 118, 230, 13, 4, 181, 133, 119, - 164, 96, 230, 13, 4, 181, 133, 119, 164, 196, 66, 230, 13, 4, 181, 50, - 119, 164, 235, 119, 230, 13, 4, 181, 50, 119, 164, 118, 230, 13, 4, 181, - 144, 119, 164, 96, 230, 13, 4, 181, 144, 119, 164, 196, 66, 230, 13, 4, - 181, 45, 119, 164, 235, 119, 230, 13, 4, 181, 45, 119, 164, 118, 230, 13, - 4, 181, 133, 232, 98, 164, 96, 230, 13, 4, 181, 133, 232, 98, 164, 196, - 66, 230, 13, 4, 181, 50, 232, 98, 164, 235, 119, 230, 13, 4, 181, 50, - 232, 98, 164, 118, 230, 13, 4, 181, 144, 232, 98, 164, 96, 230, 13, 4, - 181, 144, 232, 98, 164, 196, 66, 230, 13, 4, 181, 45, 232, 98, 164, 235, - 119, 230, 13, 4, 181, 45, 232, 98, 164, 118, 230, 13, 4, 181, 133, 93, - 118, 230, 13, 4, 181, 235, 123, 196, 66, 230, 13, 4, 181, 45, 248, 216, - 196, 66, 230, 13, 4, 181, 183, 96, 230, 13, 4, 181, 133, 93, 96, 230, 13, - 4, 181, 235, 123, 235, 119, 230, 13, 4, 181, 45, 248, 216, 235, 119, 230, - 13, 4, 181, 183, 118, 230, 13, 4, 181, 133, 93, 96, 230, 13, 4, 181, 196, - 77, 118, 230, 13, 4, 181, 144, 93, 96, 230, 13, 4, 181, 235, 123, 96, - 230, 13, 4, 181, 133, 93, 118, 230, 13, 4, 181, 196, 77, 96, 230, 13, 4, - 181, 144, 93, 118, 230, 13, 4, 181, 235, 123, 118, 230, 13, 4, 181, 133, - 93, 179, 237, 215, 118, 230, 13, 4, 181, 144, 248, 233, 179, 237, 215, - 96, 230, 13, 4, 181, 133, 93, 179, 237, 215, 96, 230, 13, 4, 181, 144, - 248, 233, 179, 237, 215, 196, 66, 230, 13, 4, 181, 45, 248, 216, 235, - 119, 230, 13, 4, 181, 183, 235, 119, 230, 13, 4, 181, 45, 248, 216, 196, - 66, 230, 13, 4, 181, 183, 50, 55, 64, 4, 206, 113, 229, 235, 234, 43, 3, - 93, 96, 57, 198, 153, 211, 67, 93, 96, 57, 118, 64, 93, 198, 153, 211, - 66, 96, 64, 93, 198, 153, 211, 66, 96, 64, 93, 251, 165, 234, 45, 159, - 219, 180, 93, 118, 57, 118, 64, 198, 216, 219, 179, 230, 204, 93, 96, 57, - 200, 229, 93, 96, 57, 118, 64, 198, 216, 200, 228, 200, 181, 93, 118, 57, - 45, 232, 237, 199, 215, 50, 232, 237, 199, 215, 133, 232, 237, 199, 215, - 144, 232, 237, 199, 215, 197, 225, 81, 249, 88, 237, 112, 191, 167, 213, - 10, 201, 201, 191, 167, 213, 10, 196, 255, 242, 83, 45, 63, 238, 171, - 248, 53, 50, 63, 238, 171, 248, 53, 45, 63, 210, 113, 50, 63, 210, 113, - 191, 167, 213, 10, 45, 223, 178, 248, 53, 191, 167, 213, 10, 50, 223, - 178, 248, 53, 191, 167, 213, 10, 45, 248, 166, 248, 53, 191, 167, 213, - 10, 50, 248, 166, 248, 53, 45, 51, 248, 54, 4, 196, 103, 50, 51, 248, 54, - 4, 196, 103, 45, 51, 248, 54, 4, 198, 183, 223, 163, 198, 54, 239, 1, 50, - 51, 248, 54, 4, 198, 183, 223, 163, 248, 77, 239, 1, 45, 51, 248, 54, 4, - 198, 183, 223, 163, 248, 77, 239, 1, 50, 51, 248, 54, 4, 198, 183, 223, - 163, 198, 54, 239, 1, 45, 251, 116, 248, 54, 4, 236, 140, 50, 251, 116, - 248, 54, 4, 236, 140, 45, 251, 17, 219, 180, 248, 53, 50, 251, 17, 230, - 204, 248, 53, 55, 45, 251, 17, 230, 204, 248, 53, 55, 50, 251, 17, 219, - 180, 248, 53, 45, 62, 198, 42, 203, 103, 248, 53, 50, 62, 198, 42, 203, - 103, 248, 53, 235, 138, 233, 39, 81, 191, 21, 219, 112, 216, 226, 251, - 116, 211, 69, 219, 224, 50, 251, 116, 195, 168, 4, 201, 190, 216, 226, - 50, 251, 116, 4, 236, 140, 251, 116, 4, 206, 9, 223, 117, 252, 47, 251, - 115, 201, 225, 251, 116, 211, 69, 219, 224, 201, 225, 251, 116, 211, 69, - 196, 77, 153, 251, 115, 207, 18, 251, 115, 251, 116, 4, 196, 103, 207, - 18, 251, 116, 4, 196, 103, 211, 172, 251, 116, 211, 69, 196, 77, 211, - 172, 251, 116, 211, 69, 235, 123, 216, 226, 251, 116, 4, 211, 77, 250, - 251, 234, 91, 223, 163, 64, 209, 58, 133, 23, 183, 216, 226, 251, 116, 4, - 211, 77, 250, 251, 234, 91, 223, 163, 64, 209, 58, 133, 23, 219, 224, - 216, 226, 251, 116, 4, 211, 77, 250, 251, 234, 91, 223, 163, 64, 209, 58, - 144, 23, 183, 216, 226, 251, 116, 4, 211, 77, 250, 251, 234, 91, 223, - 163, 64, 209, 58, 144, 23, 219, 224, 216, 226, 251, 116, 4, 211, 77, 250, - 251, 234, 91, 223, 163, 64, 209, 58, 50, 23, 196, 77, 216, 226, 251, 116, - 4, 211, 77, 250, 251, 234, 91, 223, 163, 64, 209, 58, 45, 23, 196, 77, - 216, 226, 251, 116, 4, 211, 77, 250, 251, 234, 91, 223, 163, 64, 209, 58, - 50, 23, 235, 123, 216, 226, 251, 116, 4, 211, 77, 250, 251, 234, 91, 223, - 163, 64, 209, 58, 45, 23, 235, 123, 207, 18, 234, 105, 203, 252, 234, - 105, 203, 253, 4, 211, 6, 234, 105, 203, 253, 4, 2, 243, 11, 58, 234, - 105, 203, 253, 4, 50, 64, 58, 234, 105, 203, 253, 4, 45, 64, 58, 243, 11, - 4, 228, 241, 164, 47, 81, 164, 47, 210, 118, 47, 207, 19, 202, 23, 47, - 209, 254, 243, 11, 236, 206, 247, 205, 228, 241, 249, 88, 23, 198, 54, - 132, 236, 206, 247, 205, 81, 164, 243, 11, 4, 200, 183, 192, 235, 47, - 251, 83, 236, 200, 56, 133, 64, 198, 216, 243, 10, 47, 63, 247, 248, 47, - 247, 248, 47, 219, 179, 47, 230, 203, 243, 11, 4, 2, 243, 11, 119, 199, - 34, 183, 243, 11, 4, 105, 228, 241, 201, 16, 119, 199, 34, 183, 112, 206, - 180, 237, 39, 202, 97, 112, 233, 83, 237, 39, 202, 97, 112, 250, 193, - 112, 2, 243, 10, 112, 201, 190, 105, 222, 198, 201, 188, 197, 242, 4, 75, - 58, 197, 242, 4, 196, 103, 206, 9, 223, 163, 197, 241, 197, 242, 4, 204, - 4, 250, 183, 248, 76, 50, 197, 242, 93, 45, 197, 241, 45, 197, 242, 248, - 216, 81, 164, 81, 249, 88, 248, 216, 50, 197, 241, 248, 64, 4, 45, 132, - 248, 139, 248, 64, 4, 50, 132, 248, 139, 62, 248, 63, 25, 4, 45, 132, - 248, 139, 25, 4, 50, 132, 248, 139, 63, 228, 174, 62, 228, 174, 45, 193, - 72, 233, 39, 50, 193, 72, 233, 39, 45, 55, 193, 72, 233, 39, 50, 55, 193, - 72, 233, 39, 223, 155, 223, 139, 198, 179, 139, 223, 139, 223, 140, 214, - 108, 4, 81, 164, 235, 132, 215, 131, 51, 4, 239, 25, 211, 11, 223, 152, - 250, 219, 202, 254, 208, 200, 234, 43, 3, 23, 202, 99, 210, 118, 234, 43, - 3, 23, 202, 99, 210, 119, 4, 198, 153, 58, 228, 17, 119, 23, 202, 99, - 210, 118, 231, 14, 201, 101, 199, 22, 235, 122, 197, 242, 4, 45, 132, - 248, 139, 235, 122, 197, 242, 4, 50, 132, 248, 139, 62, 237, 33, 4, 144, - 57, 62, 218, 232, 63, 243, 11, 4, 144, 57, 62, 243, 11, 4, 144, 57, 234, - 25, 63, 201, 190, 234, 25, 62, 201, 190, 234, 25, 63, 237, 32, 234, 25, - 62, 237, 32, 234, 25, 63, 243, 10, 234, 25, 62, 243, 10, 206, 51, 207, - 19, 202, 24, 211, 66, 202, 24, 4, 211, 6, 207, 19, 202, 24, 4, 228, 241, - 106, 248, 175, 202, 23, 248, 175, 207, 19, 202, 23, 55, 209, 81, 197, - 225, 209, 81, 219, 219, 238, 163, 251, 116, 248, 53, 206, 203, 238, 163, - 251, 116, 248, 53, 198, 137, 216, 32, 215, 60, 47, 75, 211, 66, 215, 60, - 47, 108, 211, 66, 215, 60, 47, 25, 211, 66, 215, 60, 196, 93, 211, 67, 4, - 236, 140, 215, 60, 196, 93, 211, 67, 4, 209, 81, 215, 60, 51, 223, 100, - 211, 66, 215, 60, 51, 196, 93, 211, 66, 105, 219, 29, 23, 211, 66, 105, - 219, 29, 211, 57, 211, 66, 215, 60, 25, 211, 66, 215, 236, 105, 200, 204, - 200, 202, 4, 223, 113, 208, 26, 223, 114, 211, 66, 232, 246, 210, 107, - 223, 113, 223, 114, 4, 55, 106, 223, 114, 250, 143, 4, 202, 97, 243, 3, - 232, 76, 251, 85, 223, 111, 219, 113, 223, 112, 4, 207, 91, 210, 86, 250, - 245, 209, 52, 219, 113, 223, 112, 4, 204, 27, 210, 86, 250, 245, 209, 52, - 219, 113, 223, 112, 213, 12, 223, 157, 199, 34, 209, 52, 223, 114, 250, - 245, 42, 209, 62, 211, 66, 208, 19, 223, 114, 211, 66, 223, 114, 4, 118, - 64, 4, 102, 223, 114, 4, 25, 56, 223, 114, 4, 223, 99, 223, 114, 4, 196, - 92, 223, 114, 4, 211, 6, 223, 114, 4, 196, 103, 222, 199, 220, 13, 45, - 197, 242, 211, 66, 191, 167, 213, 10, 205, 92, 239, 62, 191, 167, 213, - 10, 205, 92, 209, 126, 191, 167, 213, 10, 205, 92, 208, 195, 108, 3, 4, - 2, 243, 11, 58, 108, 3, 4, 243, 2, 252, 61, 58, 108, 3, 4, 198, 153, 58, - 108, 3, 4, 75, 60, 108, 3, 4, 198, 153, 60, 108, 3, 4, 200, 230, 109, - 108, 3, 4, 62, 197, 241, 216, 35, 3, 4, 242, 75, 58, 216, 35, 3, 4, 75, - 60, 216, 35, 3, 4, 233, 83, 236, 138, 216, 35, 3, 4, 206, 180, 236, 138, - 108, 3, 223, 163, 45, 132, 243, 10, 108, 3, 223, 163, 50, 132, 243, 10, - 195, 152, 211, 57, 238, 218, 208, 200, 215, 127, 3, 4, 75, 58, 215, 127, - 3, 4, 196, 103, 204, 24, 208, 201, 4, 248, 77, 242, 218, 202, 68, 208, - 200, 215, 127, 3, 223, 163, 45, 132, 243, 10, 215, 127, 3, 223, 163, 50, - 132, 243, 10, 47, 215, 127, 3, 4, 243, 2, 252, 60, 215, 127, 3, 223, 163, - 55, 243, 10, 47, 236, 200, 56, 108, 3, 223, 163, 197, 241, 216, 35, 3, - 223, 163, 197, 241, 215, 127, 3, 223, 163, 197, 241, 223, 108, 208, 200, - 206, 198, 223, 108, 208, 200, 191, 167, 213, 10, 207, 64, 239, 62, 251, - 147, 211, 57, 239, 9, 223, 100, 4, 236, 140, 196, 93, 4, 216, 35, 56, - 196, 93, 4, 211, 6, 223, 100, 4, 211, 6, 223, 100, 4, 219, 29, 251, 125, - 196, 93, 4, 219, 29, 211, 56, 196, 93, 93, 223, 99, 223, 100, 93, 196, - 92, 196, 93, 93, 249, 88, 93, 223, 99, 223, 100, 93, 249, 88, 93, 196, - 92, 196, 93, 248, 216, 23, 222, 198, 4, 196, 92, 223, 100, 248, 216, 23, - 222, 198, 4, 223, 99, 242, 219, 196, 93, 4, 204, 3, 242, 219, 223, 100, - 4, 204, 3, 55, 51, 223, 99, 55, 51, 196, 92, 242, 219, 196, 93, 4, 204, - 4, 23, 202, 68, 208, 200, 219, 29, 23, 4, 75, 58, 219, 29, 211, 57, 4, - 75, 58, 55, 219, 29, 251, 125, 55, 219, 29, 211, 56, 105, 223, 101, 219, - 29, 251, 125, 105, 223, 101, 219, 29, 211, 56, 202, 80, 220, 13, 211, 56, - 202, 80, 220, 13, 251, 125, 219, 29, 211, 57, 211, 1, 219, 29, 251, 125, - 219, 29, 23, 4, 82, 201, 80, 219, 29, 211, 57, 4, 82, 201, 80, 219, 29, - 23, 4, 228, 241, 237, 215, 219, 29, 211, 57, 4, 228, 241, 237, 215, 219, - 29, 23, 4, 55, 211, 6, 219, 29, 23, 4, 196, 103, 219, 29, 23, 4, 55, 196, - 103, 2, 195, 149, 4, 196, 103, 219, 29, 211, 57, 4, 55, 211, 6, 219, 29, - 211, 57, 4, 55, 196, 103, 191, 167, 213, 10, 236, 152, 251, 75, 191, 167, - 213, 10, 207, 137, 251, 75, 234, 43, 3, 4, 75, 60, 228, 17, 4, 75, 58, - 197, 225, 228, 241, 249, 88, 4, 55, 81, 106, 197, 225, 228, 241, 249, 88, - 4, 197, 225, 81, 106, 198, 153, 211, 67, 4, 75, 58, 198, 153, 211, 67, 4, - 206, 180, 236, 138, 202, 180, 216, 35, 202, 179, 239, 49, 4, 75, 58, 234, - 43, 4, 250, 193, 251, 165, 234, 45, 119, 4, 243, 2, 252, 60, 251, 40, - 234, 45, 211, 57, 234, 45, 159, 234, 43, 3, 93, 108, 56, 108, 3, 93, 234, - 43, 56, 234, 43, 3, 93, 198, 153, 211, 66, 55, 242, 84, 234, 44, 105, - 239, 41, 234, 43, 202, 194, 115, 239, 41, 234, 43, 202, 194, 234, 43, 3, - 4, 105, 185, 93, 23, 105, 185, 60, 234, 36, 4, 232, 128, 185, 58, 219, - 180, 4, 243, 11, 223, 117, 230, 204, 4, 243, 11, 223, 117, 219, 180, 4, - 208, 13, 87, 58, 230, 204, 4, 208, 13, 87, 58, 219, 180, 211, 57, 202, - 99, 234, 45, 159, 230, 204, 211, 57, 202, 99, 234, 45, 159, 219, 180, - 211, 57, 202, 99, 234, 45, 119, 4, 75, 223, 117, 230, 204, 211, 57, 202, - 99, 234, 45, 119, 4, 75, 223, 117, 219, 180, 211, 57, 202, 99, 234, 45, - 119, 4, 75, 58, 230, 204, 211, 57, 202, 99, 234, 45, 119, 4, 75, 58, 219, - 180, 211, 57, 202, 99, 234, 45, 119, 4, 75, 93, 183, 230, 204, 211, 57, - 202, 99, 234, 45, 119, 4, 75, 93, 219, 224, 219, 180, 211, 57, 251, 41, - 230, 204, 211, 57, 251, 41, 219, 180, 23, 202, 168, 213, 12, 234, 45, - 159, 230, 204, 23, 202, 168, 213, 12, 234, 45, 159, 219, 180, 23, 213, - 12, 251, 41, 230, 204, 23, 213, 12, 251, 41, 219, 180, 93, 235, 131, 234, - 45, 93, 230, 203, 230, 204, 93, 235, 131, 234, 45, 93, 219, 179, 219, - 180, 93, 202, 180, 211, 57, 234, 44, 230, 204, 93, 202, 180, 211, 57, - 234, 44, 219, 180, 93, 202, 180, 93, 230, 203, 230, 204, 93, 202, 180, - 93, 219, 179, 219, 180, 93, 230, 204, 93, 235, 131, 234, 44, 230, 204, - 93, 219, 180, 93, 235, 131, 234, 44, 219, 180, 93, 202, 99, 234, 45, 93, - 230, 204, 93, 202, 99, 234, 44, 230, 204, 93, 202, 99, 234, 45, 93, 219, - 180, 93, 202, 99, 234, 44, 202, 99, 234, 45, 119, 211, 57, 219, 179, 202, - 99, 234, 45, 119, 211, 57, 230, 203, 202, 99, 234, 45, 119, 211, 57, 219, - 180, 4, 75, 223, 117, 202, 99, 234, 45, 119, 211, 57, 230, 204, 4, 75, - 223, 117, 235, 131, 234, 45, 119, 211, 57, 219, 179, 235, 131, 234, 45, - 119, 211, 57, 230, 203, 235, 131, 202, 99, 234, 45, 119, 211, 57, 219, - 179, 235, 131, 202, 99, 234, 45, 119, 211, 57, 230, 203, 202, 180, 211, - 57, 219, 179, 202, 180, 211, 57, 230, 203, 202, 180, 93, 219, 180, 93, - 234, 43, 56, 202, 180, 93, 230, 204, 93, 234, 43, 56, 55, 214, 88, 219, - 179, 55, 214, 88, 230, 203, 55, 214, 88, 219, 180, 4, 196, 103, 230, 204, - 211, 1, 219, 179, 230, 204, 248, 216, 219, 179, 219, 180, 242, 219, 247, - 205, 238, 164, 230, 204, 242, 219, 247, 205, 238, 164, 219, 180, 242, - 219, 247, 205, 238, 165, 93, 202, 99, 234, 44, 230, 204, 242, 219, 247, - 205, 238, 165, 93, 202, 99, 234, 44, 202, 69, 199, 38, 220, 11, 199, 38, - 202, 69, 199, 39, 211, 57, 234, 45, 159, 220, 11, 199, 39, 211, 57, 234, - 45, 159, 234, 43, 3, 4, 247, 241, 58, 208, 232, 93, 202, 168, 234, 43, - 56, 200, 221, 93, 202, 168, 234, 43, 56, 208, 232, 93, 202, 168, 213, 12, - 234, 45, 159, 200, 221, 93, 202, 168, 213, 12, 234, 45, 159, 208, 232, - 93, 234, 43, 56, 200, 221, 93, 234, 43, 56, 208, 232, 93, 213, 12, 234, - 45, 159, 200, 221, 93, 213, 12, 234, 45, 159, 208, 232, 93, 251, 165, - 234, 45, 159, 200, 221, 93, 251, 165, 234, 45, 159, 208, 232, 93, 213, - 12, 251, 165, 234, 45, 159, 200, 221, 93, 213, 12, 251, 165, 234, 45, - 159, 55, 208, 231, 55, 200, 220, 200, 229, 4, 236, 140, 200, 181, 4, 236, - 140, 200, 229, 4, 108, 3, 60, 200, 181, 4, 108, 3, 60, 200, 229, 4, 215, - 127, 3, 60, 200, 181, 4, 215, 127, 3, 60, 200, 229, 79, 211, 57, 234, 45, - 119, 4, 75, 58, 200, 181, 79, 211, 57, 234, 45, 119, 4, 75, 58, 200, 229, - 79, 93, 234, 43, 56, 200, 181, 79, 93, 234, 43, 56, 200, 229, 79, 93, - 198, 153, 211, 66, 200, 181, 79, 93, 198, 153, 211, 66, 200, 229, 79, 93, - 251, 165, 234, 45, 159, 200, 181, 79, 93, 251, 165, 234, 45, 159, 200, - 229, 79, 93, 213, 12, 234, 45, 159, 200, 181, 79, 93, 213, 12, 234, 45, - 159, 51, 45, 211, 77, 111, 211, 66, 51, 50, 211, 77, 111, 211, 66, 242, - 219, 200, 228, 242, 219, 200, 180, 242, 219, 200, 229, 211, 57, 234, 45, - 159, 242, 219, 200, 181, 211, 57, 234, 45, 159, 200, 229, 93, 200, 180, - 200, 181, 93, 200, 228, 200, 229, 93, 200, 228, 200, 181, 93, 200, 180, - 200, 181, 248, 216, 200, 228, 200, 181, 248, 216, 23, 222, 198, 247, 205, - 237, 216, 4, 200, 228, 234, 132, 79, 211, 69, 235, 118, 209, 116, 4, 199, - 122, 198, 53, 198, 7, 223, 99, 232, 147, 213, 27, 203, 40, 45, 199, 228, - 203, 40, 144, 199, 228, 203, 40, 133, 199, 228, 209, 255, 4, 206, 8, 81, - 249, 88, 197, 225, 50, 197, 57, 55, 81, 249, 88, 45, 197, 57, 81, 249, - 88, 55, 45, 197, 57, 55, 81, 249, 88, 55, 45, 197, 57, 179, 237, 216, - 232, 98, 45, 216, 191, 79, 55, 195, 135, 203, 40, 144, 199, 229, 4, 211, - 6, 203, 40, 133, 199, 229, 4, 196, 103, 203, 40, 133, 199, 229, 93, 203, - 40, 144, 199, 228, 55, 144, 199, 228, 55, 133, 199, 228, 55, 201, 28, - 213, 12, 56, 207, 18, 55, 201, 28, 213, 12, 56, 236, 164, 213, 12, 236, - 208, 4, 207, 18, 214, 107, 202, 97, 81, 219, 113, 4, 243, 11, 58, 81, - 219, 113, 4, 243, 11, 60, 144, 199, 229, 4, 243, 11, 60, 210, 119, 4, - 228, 241, 106, 210, 119, 4, 198, 153, 211, 66, 197, 225, 81, 249, 88, - 248, 168, 207, 65, 197, 225, 81, 249, 88, 4, 228, 241, 106, 197, 225, - 242, 84, 211, 66, 197, 225, 214, 88, 219, 179, 197, 225, 214, 88, 230, - 203, 235, 131, 202, 99, 219, 180, 211, 57, 234, 45, 159, 235, 131, 202, - 99, 230, 204, 211, 57, 234, 45, 159, 197, 225, 202, 24, 248, 168, 207, - 65, 220, 13, 197, 225, 81, 249, 88, 211, 66, 55, 202, 24, 211, 66, 63, - 81, 164, 215, 60, 63, 81, 164, 186, 234, 204, 63, 57, 186, 193, 105, 63, - 57, 202, 2, 234, 204, 63, 57, 202, 2, 193, 105, 63, 57, 45, 50, 63, 57, - 118, 62, 57, 196, 66, 62, 57, 235, 119, 62, 57, 186, 234, 204, 62, 57, - 186, 193, 105, 62, 57, 202, 2, 234, 204, 62, 57, 202, 2, 193, 105, 62, - 57, 45, 50, 62, 57, 133, 144, 62, 57, 96, 64, 4, 198, 136, 235, 118, 96, - 64, 4, 198, 136, 196, 65, 118, 64, 4, 198, 136, 235, 118, 118, 64, 4, - 198, 136, 196, 65, 51, 4, 198, 54, 132, 248, 139, 51, 4, 248, 77, 132, - 248, 139, 51, 4, 116, 50, 237, 39, 132, 248, 139, 51, 4, 110, 45, 237, - 39, 132, 248, 139, 237, 33, 4, 45, 132, 248, 139, 237, 33, 4, 50, 132, - 248, 139, 237, 33, 4, 198, 54, 132, 248, 139, 237, 33, 4, 248, 77, 132, - 248, 139, 235, 138, 201, 190, 62, 220, 13, 201, 190, 63, 220, 13, 201, - 190, 62, 195, 83, 2, 201, 190, 63, 195, 83, 2, 201, 190, 62, 210, 24, 63, - 210, 24, 63, 229, 182, 62, 229, 182, 228, 241, 62, 229, 182, 62, 220, 13, - 243, 10, 62, 216, 213, 237, 32, 63, 216, 213, 237, 32, 62, 216, 213, 218, - 232, 63, 216, 213, 218, 232, 62, 2, 237, 32, 62, 2, 218, 232, 63, 2, 218, - 232, 62, 228, 241, 234, 121, 63, 228, 241, 234, 121, 62, 81, 234, 121, - 63, 81, 234, 121, 45, 64, 4, 2, 243, 10, 115, 118, 250, 231, 45, 64, 4, - 47, 209, 81, 179, 118, 201, 183, 57, 118, 197, 13, 64, 4, 81, 106, 118, - 197, 13, 64, 4, 55, 81, 106, 118, 197, 13, 64, 232, 98, 164, 118, 197, - 13, 197, 225, 237, 216, 57, 118, 64, 4, 235, 138, 201, 80, 118, 64, 4, - 199, 216, 4, 81, 106, 118, 64, 4, 199, 216, 4, 55, 81, 106, 118, 197, 13, - 64, 4, 199, 215, 118, 197, 13, 64, 4, 199, 216, 4, 81, 106, 118, 197, 13, - 64, 4, 199, 216, 4, 55, 81, 106, 118, 64, 198, 216, 192, 235, 193, 139, - 64, 209, 58, 236, 231, 219, 224, 234, 43, 3, 93, 118, 57, 207, 19, 198, - 153, 211, 67, 93, 118, 57, 118, 64, 93, 207, 19, 251, 165, 234, 45, 159, - 96, 64, 198, 216, 230, 203, 96, 64, 198, 216, 200, 180, 118, 208, 26, 57, - 96, 208, 26, 57, 207, 19, 198, 153, 211, 67, 93, 96, 57, 96, 64, 93, 207, - 19, 251, 165, 234, 45, 159, 198, 153, 211, 67, 93, 118, 57, 118, 64, 93, - 251, 165, 234, 45, 159, 118, 64, 93, 207, 19, 198, 153, 211, 66, 96, 64, - 93, 207, 19, 198, 153, 211, 66, 235, 119, 197, 240, 191, 21, 57, 203, 40, - 202, 99, 186, 57, 203, 40, 249, 143, 202, 2, 57, 63, 216, 213, 201, 102, - 62, 2, 201, 102, 63, 2, 201, 102, 62, 206, 203, 210, 24, 63, 206, 203, - 210, 24, 88, 220, 13, 243, 10, 88, 211, 8, 4, 211, 8, 223, 117, 88, 243, - 11, 4, 243, 11, 223, 117, 88, 243, 10, 88, 47, 205, 154, 202, 99, 186, - 64, 4, 228, 250, 229, 235, 249, 143, 202, 2, 64, 4, 228, 250, 199, 215, - 202, 99, 186, 64, 4, 228, 241, 199, 215, 249, 143, 202, 2, 64, 4, 228, - 241, 199, 215, 248, 224, 64, 209, 58, 235, 119, 199, 25, 186, 234, 203, - 203, 40, 248, 224, 64, 209, 58, 235, 119, 199, 25, 186, 234, 203, 118, - 197, 240, 57, 196, 66, 197, 240, 57, 96, 197, 240, 57, 235, 119, 197, - 240, 57, 45, 50, 197, 240, 57, 133, 144, 197, 240, 57, 186, 193, 105, - 197, 240, 57, 186, 234, 204, 197, 240, 57, 202, 2, 234, 204, 197, 240, - 57, 202, 2, 193, 105, 197, 240, 57, 118, 197, 240, 237, 214, 57, 196, 66, - 197, 240, 237, 214, 57, 96, 197, 240, 237, 214, 57, 235, 119, 197, 240, - 237, 214, 57, 242, 221, 197, 240, 211, 77, 243, 11, 57, 251, 85, 197, - 240, 211, 77, 243, 11, 57, 118, 197, 240, 64, 119, 164, 196, 66, 197, - 240, 64, 119, 164, 96, 197, 240, 64, 119, 164, 235, 119, 197, 240, 64, - 119, 164, 186, 193, 105, 197, 240, 64, 119, 164, 186, 234, 204, 197, 240, - 64, 119, 164, 202, 2, 234, 204, 197, 240, 64, 119, 164, 202, 2, 193, 105, - 197, 240, 64, 119, 164, 118, 197, 240, 64, 4, 55, 228, 241, 106, 196, 66, - 197, 240, 64, 4, 55, 228, 241, 106, 96, 197, 240, 64, 4, 55, 228, 241, - 106, 235, 119, 197, 240, 64, 4, 55, 228, 241, 106, 228, 241, 199, 237, - 221, 222, 81, 199, 237, 221, 222, 118, 197, 240, 64, 139, 96, 197, 240, - 57, 196, 66, 197, 240, 64, 118, 79, 235, 119, 197, 240, 57, 96, 197, 240, - 64, 139, 118, 197, 240, 57, 235, 119, 197, 240, 64, 118, 79, 196, 66, - 197, 240, 57, 118, 197, 240, 210, 196, 250, 231, 196, 66, 197, 240, 210, - 196, 250, 231, 96, 197, 240, 210, 196, 250, 231, 235, 119, 197, 240, 210, - 196, 250, 231, 118, 62, 47, 63, 57, 196, 66, 62, 47, 63, 57, 96, 62, 47, - 63, 57, 235, 119, 62, 47, 63, 57, 251, 85, 197, 240, 50, 196, 221, 57, - 251, 85, 197, 240, 248, 77, 196, 221, 57, 251, 85, 197, 240, 45, 196, - 221, 57, 251, 85, 197, 240, 198, 54, 196, 221, 57, 207, 23, 219, 224, - 207, 23, 183, 214, 77, 219, 224, 214, 77, 183, 232, 128, 239, 2, 250, - 232, 243, 6, 251, 84, 96, 62, 57, 16, 40, 196, 255, 42, 234, 133, 198, - 225, 198, 52, 118, 234, 37, 250, 235, 198, 225, 206, 204, 196, 66, 234, - 37, 250, 235, 198, 225, 198, 52, 96, 234, 37, 250, 235, 198, 225, 219, - 220, 235, 119, 234, 37, 250, 235, 62, 118, 234, 37, 250, 235, 62, 196, - 66, 234, 37, 250, 235, 62, 96, 234, 37, 250, 235, 62, 235, 119, 234, 37, - 250, 235, 235, 119, 197, 240, 64, 4, 179, 198, 136, 219, 214, 235, 119, - 197, 240, 64, 4, 179, 198, 136, 206, 197, 196, 66, 197, 240, 64, 4, 179, - 198, 136, 219, 214, 196, 66, 197, 240, 64, 4, 179, 198, 136, 206, 197, - 118, 197, 240, 64, 4, 179, 198, 136, 196, 65, 96, 197, 240, 64, 4, 179, - 198, 136, 196, 65, 118, 197, 240, 64, 4, 179, 198, 136, 235, 118, 96, - 197, 240, 64, 4, 179, 198, 136, 235, 118, 62, 238, 163, 235, 119, 23, - 118, 57, 62, 238, 163, 235, 119, 23, 96, 57, 62, 238, 163, 196, 66, 23, - 118, 57, 62, 238, 163, 196, 66, 23, 96, 57, 62, 238, 163, 118, 23, 196, - 66, 57, 62, 238, 163, 96, 23, 196, 66, 57, 62, 238, 163, 118, 23, 235, - 119, 57, 62, 238, 163, 96, 23, 235, 119, 57, 206, 248, 64, 144, 219, 224, - 206, 248, 64, 144, 183, 206, 248, 64, 133, 219, 224, 206, 248, 64, 133, - 183, 206, 248, 64, 45, 196, 77, 206, 248, 64, 50, 196, 77, 206, 248, 64, - 45, 235, 123, 206, 248, 64, 50, 235, 123, 196, 66, 63, 64, 232, 98, 249, - 88, 4, 228, 241, 164, 133, 250, 236, 223, 163, 42, 207, 93, 248, 62, 211, - 1, 63, 201, 188, 211, 1, 63, 23, 62, 201, 188, 211, 1, 62, 201, 188, 249, - 107, 111, 4, 156, 192, 235, 47, 192, 235, 47, 28, 192, 235, 62, 51, 247, - 19, 62, 237, 33, 247, 19, 153, 62, 210, 24, 228, 241, 62, 211, 160, 62, - 211, 160, 62, 216, 213, 196, 76, 197, 242, 247, 19, 62, 216, 213, 235, - 122, 197, 242, 247, 19, 62, 216, 213, 219, 219, 197, 242, 247, 19, 62, - 216, 213, 206, 203, 197, 242, 247, 19, 214, 95, 232, 146, 109, 198, 54, - 132, 62, 243, 10, 248, 77, 132, 62, 243, 10, 156, 232, 128, 209, 60, 62, - 238, 159, 206, 122, 156, 232, 128, 209, 60, 62, 238, 159, 63, 232, 128, - 209, 60, 238, 159, 206, 122, 63, 232, 128, 209, 60, 238, 159, 51, 209, - 25, 223, 144, 196, 107, 56, 230, 187, 77, 209, 78, 232, 146, 109, 209, - 78, 232, 146, 138, 209, 78, 232, 146, 134, 209, 78, 232, 146, 149, 198, - 9, 208, 185, 250, 189, 228, 91, 209, 196, 214, 91, 63, 215, 206, 204, 33, - 62, 237, 33, 211, 105, 238, 217, 197, 202, 156, 215, 206, 250, 227, 238, - 179, 230, 88, 191, 75, 221, 2, 251, 53, 252, 32, 193, 247, 209, 26, 45, - 132, 62, 201, 102, 50, 132, 62, 201, 102, 201, 103, 4, 45, 132, 248, 139, - 201, 103, 4, 50, 132, 248, 139, 118, 197, 13, 64, 4, 197, 242, 250, 233, - 196, 66, 197, 13, 64, 4, 197, 242, 250, 233, 96, 197, 13, 64, 4, 197, - 242, 250, 233, 235, 119, 197, 13, 64, 4, 197, 242, 250, 233, 234, 27, - 232, 146, 107, 234, 27, 232, 146, 109, 205, 51, 206, 31, 250, 188, 16, - 195, 52, 206, 31, 250, 188, 16, 212, 254, 206, 31, 250, 188, 16, 208, 1, - 206, 31, 250, 188, 16, 248, 163, 206, 31, 250, 188, 16, 204, 16, 206, 31, - 250, 188, 16, 198, 0, 234, 43, 3, 4, 223, 140, 60, 196, 89, 113, 204, 12, - 113, 235, 128, 113, 210, 96, 113, 207, 18, 50, 251, 115, 229, 203, 210, - 78, 113, 135, 6, 1, 250, 122, 135, 6, 1, 247, 252, 135, 6, 1, 195, 151, - 135, 6, 1, 231, 18, 135, 6, 1, 236, 169, 135, 6, 1, 192, 49, 135, 6, 1, - 191, 55, 135, 6, 1, 235, 30, 135, 6, 1, 191, 82, 135, 6, 1, 223, 39, 135, - 6, 1, 89, 223, 39, 135, 6, 1, 68, 135, 6, 1, 236, 190, 135, 6, 1, 222, - 94, 135, 6, 1, 219, 75, 135, 6, 1, 215, 66, 135, 6, 1, 214, 210, 135, 6, - 1, 211, 89, 135, 6, 1, 209, 55, 135, 6, 1, 206, 179, 135, 6, 1, 202, 77, - 135, 6, 1, 197, 44, 135, 6, 1, 196, 124, 135, 6, 1, 232, 101, 135, 6, 1, - 229, 188, 135, 6, 1, 211, 20, 135, 6, 1, 210, 63, 135, 6, 1, 203, 8, 135, - 6, 1, 197, 146, 135, 6, 1, 243, 54, 135, 6, 1, 203, 165, 135, 6, 1, 192, - 58, 135, 6, 1, 192, 60, 135, 6, 1, 192, 93, 135, 6, 1, 201, 220, 140, - 135, 6, 1, 191, 225, 135, 6, 1, 2, 191, 190, 135, 6, 1, 2, 191, 191, 4, - 199, 215, 135, 6, 1, 192, 12, 135, 6, 1, 223, 82, 2, 191, 190, 135, 6, 1, - 248, 175, 191, 190, 135, 6, 1, 223, 82, 248, 175, 191, 190, 135, 6, 1, - 232, 228, 135, 6, 1, 223, 37, 135, 6, 1, 203, 7, 135, 6, 1, 197, 215, 65, - 135, 6, 1, 220, 1, 215, 66, 135, 6, 1, 247, 73, 243, 54, 135, 2, 1, 250, - 122, 135, 2, 1, 247, 252, 135, 2, 1, 195, 151, 135, 2, 1, 231, 18, 135, - 2, 1, 236, 169, 135, 2, 1, 192, 49, 135, 2, 1, 191, 55, 135, 2, 1, 235, - 30, 135, 2, 1, 191, 82, 135, 2, 1, 223, 39, 135, 2, 1, 89, 223, 39, 135, - 2, 1, 68, 135, 2, 1, 236, 190, 135, 2, 1, 222, 94, 135, 2, 1, 219, 75, - 135, 2, 1, 215, 66, 135, 2, 1, 214, 210, 135, 2, 1, 211, 89, 135, 2, 1, - 209, 55, 135, 2, 1, 206, 179, 135, 2, 1, 202, 77, 135, 2, 1, 197, 44, - 135, 2, 1, 196, 124, 135, 2, 1, 232, 101, 135, 2, 1, 229, 188, 135, 2, 1, - 211, 20, 135, 2, 1, 210, 63, 135, 2, 1, 203, 8, 135, 2, 1, 197, 146, 135, - 2, 1, 243, 54, 135, 2, 1, 203, 165, 135, 2, 1, 192, 58, 135, 2, 1, 192, - 60, 135, 2, 1, 192, 93, 135, 2, 1, 201, 220, 140, 135, 2, 1, 191, 225, - 135, 2, 1, 2, 191, 190, 135, 2, 1, 2, 191, 191, 4, 199, 215, 135, 2, 1, - 192, 12, 135, 2, 1, 223, 82, 2, 191, 190, 135, 2, 1, 248, 175, 191, 190, - 135, 2, 1, 223, 82, 248, 175, 191, 190, 135, 2, 1, 232, 228, 135, 2, 1, - 223, 37, 135, 2, 1, 203, 7, 135, 2, 1, 197, 215, 65, 135, 2, 1, 220, 1, - 215, 66, 135, 2, 1, 247, 73, 243, 54, 8, 6, 1, 220, 143, 4, 55, 164, 8, - 2, 1, 220, 143, 4, 55, 164, 8, 6, 1, 220, 143, 4, 82, 198, 152, 8, 6, 1, - 210, 237, 4, 106, 8, 6, 1, 207, 222, 4, 199, 215, 8, 2, 1, 42, 4, 106, 8, - 2, 1, 200, 44, 4, 237, 39, 106, 8, 6, 1, 230, 117, 4, 237, 87, 8, 2, 1, - 230, 117, 4, 237, 87, 8, 6, 1, 222, 153, 4, 237, 87, 8, 2, 1, 222, 153, - 4, 237, 87, 8, 6, 1, 191, 167, 4, 237, 87, 8, 2, 1, 191, 167, 4, 237, 87, - 8, 6, 1, 251, 160, 8, 6, 1, 218, 169, 4, 102, 8, 6, 1, 153, 65, 8, 6, 1, - 153, 251, 160, 8, 2, 1, 196, 13, 4, 50, 102, 8, 6, 1, 193, 225, 4, 102, - 8, 2, 1, 193, 225, 4, 102, 8, 2, 1, 196, 13, 4, 238, 175, 8, 6, 1, 132, - 230, 116, 8, 2, 1, 132, 230, 116, 8, 2, 1, 199, 213, 209, 211, 8, 2, 1, - 235, 15, 4, 213, 9, 8, 2, 1, 153, 207, 222, 4, 199, 215, 8, 2, 1, 187, 4, - 130, 206, 189, 223, 117, 8, 1, 2, 6, 153, 71, 8, 200, 230, 2, 1, 223, 35, - 52, 1, 6, 196, 12, 8, 6, 1, 206, 9, 4, 200, 146, 199, 215, 8, 6, 1, 191, - 167, 4, 200, 146, 199, 215, 94, 6, 1, 251, 186, 94, 2, 1, 251, 186, 94, - 6, 1, 195, 66, 94, 2, 1, 195, 66, 94, 6, 1, 231, 211, 94, 2, 1, 231, 211, - 94, 6, 1, 237, 255, 94, 2, 1, 237, 255, 94, 6, 1, 234, 165, 94, 2, 1, - 234, 165, 94, 6, 1, 202, 7, 94, 2, 1, 202, 7, 94, 6, 1, 191, 95, 94, 2, - 1, 191, 95, 94, 6, 1, 230, 6, 94, 2, 1, 230, 6, 94, 6, 1, 199, 13, 94, 2, - 1, 199, 13, 94, 6, 1, 228, 32, 94, 2, 1, 228, 32, 94, 6, 1, 222, 77, 94, - 2, 1, 222, 77, 94, 6, 1, 219, 252, 94, 2, 1, 219, 252, 94, 6, 1, 216, - 100, 94, 2, 1, 216, 100, 94, 6, 1, 213, 219, 94, 2, 1, 213, 219, 94, 6, - 1, 220, 248, 94, 2, 1, 220, 248, 94, 6, 1, 74, 94, 2, 1, 74, 94, 6, 1, - 209, 185, 94, 2, 1, 209, 185, 94, 6, 1, 206, 162, 94, 2, 1, 206, 162, 94, - 6, 1, 202, 183, 94, 2, 1, 202, 183, 94, 6, 1, 199, 166, 94, 2, 1, 199, - 166, 94, 6, 1, 196, 168, 94, 2, 1, 196, 168, 94, 6, 1, 233, 23, 94, 2, 1, - 233, 23, 94, 6, 1, 221, 190, 94, 2, 1, 221, 190, 94, 6, 1, 208, 176, 94, - 2, 1, 208, 176, 94, 6, 1, 211, 81, 94, 2, 1, 211, 81, 94, 6, 1, 237, 37, - 251, 192, 94, 2, 1, 237, 37, 251, 192, 94, 6, 1, 39, 94, 251, 230, 94, 2, - 1, 39, 94, 251, 230, 94, 6, 1, 238, 198, 234, 165, 94, 2, 1, 238, 198, - 234, 165, 94, 6, 1, 237, 37, 222, 77, 94, 2, 1, 237, 37, 222, 77, 94, 6, - 1, 237, 37, 213, 219, 94, 2, 1, 237, 37, 213, 219, 94, 6, 1, 238, 198, - 213, 219, 94, 2, 1, 238, 198, 213, 219, 94, 6, 1, 39, 94, 211, 81, 94, 2, - 1, 39, 94, 211, 81, 94, 6, 1, 205, 145, 94, 2, 1, 205, 145, 94, 6, 1, - 238, 214, 203, 105, 94, 2, 1, 238, 214, 203, 105, 94, 6, 1, 39, 94, 203, - 105, 94, 2, 1, 39, 94, 203, 105, 94, 6, 1, 39, 94, 234, 12, 94, 2, 1, 39, - 94, 234, 12, 94, 6, 1, 251, 212, 221, 195, 94, 2, 1, 251, 212, 221, 195, - 94, 6, 1, 237, 37, 228, 242, 94, 2, 1, 237, 37, 228, 242, 94, 6, 1, 39, - 94, 228, 242, 94, 2, 1, 39, 94, 228, 242, 94, 6, 1, 39, 94, 140, 94, 2, - 1, 39, 94, 140, 94, 6, 1, 220, 142, 140, 94, 2, 1, 220, 142, 140, 94, 6, - 1, 39, 94, 229, 209, 94, 2, 1, 39, 94, 229, 209, 94, 6, 1, 39, 94, 230, - 9, 94, 2, 1, 39, 94, 230, 9, 94, 6, 1, 39, 94, 231, 206, 94, 2, 1, 39, - 94, 231, 206, 94, 6, 1, 39, 94, 236, 193, 94, 2, 1, 39, 94, 236, 193, 94, - 6, 1, 39, 94, 203, 71, 94, 2, 1, 39, 94, 203, 71, 94, 6, 1, 39, 212, 145, - 203, 71, 94, 2, 1, 39, 212, 145, 203, 71, 94, 6, 1, 39, 212, 145, 214, - 16, 94, 2, 1, 39, 212, 145, 214, 16, 94, 6, 1, 39, 212, 145, 212, 81, 94, - 2, 1, 39, 212, 145, 212, 81, 94, 6, 1, 39, 212, 145, 193, 140, 94, 2, 1, - 39, 212, 145, 193, 140, 94, 16, 222, 102, 94, 16, 216, 101, 206, 162, 94, - 16, 209, 186, 206, 162, 94, 16, 201, 89, 94, 16, 199, 167, 206, 162, 94, - 16, 221, 191, 206, 162, 94, 16, 203, 72, 202, 183, 94, 6, 1, 238, 198, - 203, 105, 94, 2, 1, 238, 198, 203, 105, 94, 6, 1, 238, 198, 231, 206, 94, - 2, 1, 238, 198, 231, 206, 94, 33, 213, 220, 58, 94, 33, 201, 213, 250, - 201, 94, 33, 201, 213, 219, 188, 94, 6, 1, 248, 103, 221, 195, 94, 2, 1, - 248, 103, 221, 195, 94, 39, 212, 145, 232, 80, 201, 63, 94, 39, 212, 145, - 236, 234, 208, 13, 77, 94, 39, 212, 145, 223, 142, 208, 13, 77, 94, 39, - 212, 145, 195, 137, 236, 205, 94, 232, 118, 91, 230, 70, 94, 232, 80, - 201, 63, 94, 215, 200, 236, 205, 101, 2, 1, 251, 132, 101, 2, 1, 249, - 101, 101, 2, 1, 231, 210, 101, 2, 1, 236, 150, 101, 2, 1, 234, 103, 101, - 2, 1, 195, 49, 101, 2, 1, 191, 80, 101, 2, 1, 199, 193, 101, 2, 1, 223, - 162, 101, 2, 1, 222, 87, 101, 2, 1, 220, 7, 101, 2, 1, 217, 90, 101, 2, - 1, 214, 216, 101, 2, 1, 211, 104, 101, 2, 1, 210, 131, 101, 2, 1, 191, - 67, 101, 2, 1, 207, 163, 101, 2, 1, 205, 142, 101, 2, 1, 199, 179, 101, - 2, 1, 196, 113, 101, 2, 1, 209, 220, 101, 2, 1, 221, 200, 101, 2, 1, 231, - 82, 101, 2, 1, 208, 81, 101, 2, 1, 203, 69, 101, 2, 1, 243, 81, 101, 2, - 1, 247, 128, 101, 2, 1, 222, 234, 101, 2, 1, 243, 18, 101, 2, 1, 246, - 241, 101, 2, 1, 192, 218, 101, 2, 1, 222, 249, 101, 2, 1, 230, 87, 101, - 2, 1, 229, 245, 101, 2, 1, 229, 145, 101, 2, 1, 193, 125, 101, 2, 1, 230, - 19, 101, 2, 1, 229, 11, 101, 2, 1, 192, 14, 101, 2, 1, 252, 14, 198, 175, - 1, 170, 198, 175, 1, 192, 136, 198, 175, 1, 192, 135, 198, 175, 1, 192, - 125, 198, 175, 1, 192, 123, 198, 175, 1, 248, 218, 252, 62, 192, 118, - 198, 175, 1, 192, 118, 198, 175, 1, 192, 133, 198, 175, 1, 192, 130, 198, - 175, 1, 192, 132, 198, 175, 1, 192, 131, 198, 175, 1, 192, 40, 198, 175, - 1, 192, 127, 198, 175, 1, 192, 116, 198, 175, 1, 197, 86, 192, 116, 198, - 175, 1, 192, 113, 198, 175, 1, 192, 121, 198, 175, 1, 248, 218, 252, 62, - 192, 121, 198, 175, 1, 197, 86, 192, 121, 198, 175, 1, 192, 120, 198, - 175, 1, 192, 140, 198, 175, 1, 192, 114, 198, 175, 1, 197, 86, 192, 114, - 198, 175, 1, 192, 103, 198, 175, 1, 197, 86, 192, 103, 198, 175, 1, 192, - 33, 198, 175, 1, 192, 82, 198, 175, 1, 251, 243, 192, 82, 198, 175, 1, - 197, 86, 192, 82, 198, 175, 1, 192, 112, 198, 175, 1, 192, 111, 198, 175, - 1, 192, 108, 198, 175, 1, 197, 86, 192, 122, 198, 175, 1, 197, 86, 192, - 106, 198, 175, 1, 192, 104, 198, 175, 1, 191, 225, 198, 175, 1, 192, 101, - 198, 175, 1, 192, 99, 198, 175, 1, 192, 124, 198, 175, 1, 197, 86, 192, - 124, 198, 175, 1, 250, 127, 192, 124, 198, 175, 1, 192, 98, 198, 175, 1, - 192, 96, 198, 175, 1, 192, 97, 198, 175, 1, 192, 95, 198, 175, 1, 192, - 94, 198, 175, 1, 192, 134, 198, 175, 1, 192, 92, 198, 175, 1, 192, 90, - 198, 175, 1, 192, 89, 198, 175, 1, 192, 86, 198, 175, 1, 192, 83, 198, - 175, 1, 199, 157, 192, 83, 198, 175, 1, 192, 81, 198, 175, 1, 192, 80, - 198, 175, 1, 192, 12, 198, 175, 52, 1, 220, 115, 77, 198, 175, 204, 11, - 77, 198, 175, 120, 222, 196, 36, 5, 219, 42, 36, 5, 216, 5, 36, 5, 206, - 154, 36, 5, 202, 38, 36, 5, 203, 55, 36, 5, 248, 110, 36, 5, 198, 91, 36, - 5, 242, 98, 36, 5, 213, 36, 36, 5, 212, 64, 36, 5, 231, 11, 211, 182, 36, - 5, 191, 6, 36, 5, 236, 172, 36, 5, 237, 160, 36, 5, 222, 200, 36, 5, 198, - 240, 36, 5, 243, 67, 36, 5, 209, 198, 36, 5, 209, 72, 36, 5, 231, 97, 36, - 5, 231, 93, 36, 5, 231, 94, 36, 5, 231, 95, 36, 5, 201, 175, 36, 5, 201, - 129, 36, 5, 201, 142, 36, 5, 201, 174, 36, 5, 201, 147, 36, 5, 201, 148, - 36, 5, 201, 134, 36, 5, 247, 65, 36, 5, 247, 44, 36, 5, 247, 46, 36, 5, - 247, 64, 36, 5, 247, 62, 36, 5, 247, 63, 36, 5, 247, 45, 36, 5, 190, 224, - 36, 5, 190, 202, 36, 5, 190, 215, 36, 5, 190, 223, 36, 5, 190, 218, 36, - 5, 190, 219, 36, 5, 190, 207, 36, 5, 247, 60, 36, 5, 247, 47, 36, 5, 247, - 49, 36, 5, 247, 59, 36, 5, 247, 57, 36, 5, 247, 58, 36, 5, 247, 48, 36, - 5, 207, 234, 36, 5, 207, 224, 36, 5, 207, 230, 36, 5, 207, 233, 36, 5, - 207, 231, 36, 5, 207, 232, 36, 5, 207, 229, 36, 5, 220, 153, 36, 5, 220, - 145, 36, 5, 220, 148, 36, 5, 220, 152, 36, 5, 220, 149, 36, 5, 220, 150, - 36, 5, 220, 146, 36, 5, 192, 175, 36, 5, 192, 162, 36, 5, 192, 170, 36, - 5, 192, 174, 36, 5, 192, 172, 36, 5, 192, 173, 36, 5, 192, 169, 36, 5, - 230, 128, 36, 5, 230, 118, 36, 5, 230, 121, 36, 5, 230, 127, 36, 5, 230, - 123, 36, 5, 230, 124, 36, 5, 230, 120, 33, 38, 1, 249, 17, 33, 38, 1, - 195, 153, 33, 38, 1, 231, 77, 33, 38, 1, 237, 146, 33, 38, 1, 191, 62, - 33, 38, 1, 191, 87, 33, 38, 1, 155, 33, 38, 1, 234, 140, 33, 38, 1, 234, - 114, 33, 38, 1, 234, 103, 33, 38, 1, 74, 33, 38, 1, 210, 63, 33, 38, 1, - 234, 34, 33, 38, 1, 234, 22, 33, 38, 1, 199, 145, 33, 38, 1, 140, 33, 38, - 1, 197, 161, 33, 38, 1, 243, 127, 33, 38, 1, 203, 165, 33, 38, 1, 203, - 116, 33, 38, 1, 232, 228, 33, 38, 1, 234, 18, 33, 38, 1, 65, 33, 38, 1, - 223, 226, 33, 38, 1, 236, 191, 33, 38, 1, 215, 219, 196, 128, 33, 38, 1, - 192, 95, 33, 38, 1, 191, 225, 33, 38, 1, 223, 81, 65, 33, 38, 1, 219, 83, - 191, 190, 33, 38, 1, 248, 175, 191, 190, 33, 38, 1, 223, 81, 248, 175, - 191, 190, 50, 251, 116, 200, 225, 217, 51, 50, 251, 116, 235, 138, 200, - 225, 217, 51, 45, 200, 225, 248, 53, 50, 200, 225, 248, 53, 45, 235, 138, - 200, 225, 248, 53, 50, 235, 138, 200, 225, 248, 53, 207, 147, 223, 104, - 217, 51, 207, 147, 235, 138, 223, 104, 217, 51, 235, 138, 198, 8, 217, - 51, 45, 198, 8, 248, 53, 50, 198, 8, 248, 53, 207, 147, 201, 190, 45, - 207, 147, 211, 106, 248, 53, 50, 207, 147, 211, 106, 248, 53, 234, 189, - 238, 254, 210, 126, 232, 148, 210, 126, 207, 18, 232, 148, 210, 126, 228, - 85, 235, 138, 211, 177, 235, 119, 251, 126, 196, 66, 251, 126, 235, 138, - 206, 203, 251, 115, 55, 211, 172, 228, 88, 223, 93, 223, 102, 210, 183, - 248, 47, 228, 89, 4, 237, 42, 198, 153, 4, 206, 189, 58, 45, 130, 210, - 116, 248, 53, 50, 130, 210, 116, 248, 53, 198, 153, 4, 75, 58, 198, 153, - 4, 75, 60, 45, 81, 249, 88, 4, 208, 7, 50, 81, 249, 88, 4, 208, 7, 198, - 54, 45, 132, 248, 53, 198, 54, 50, 132, 248, 53, 248, 77, 45, 132, 248, - 53, 248, 77, 50, 132, 248, 53, 45, 202, 206, 126, 248, 53, 50, 202, 206, - 126, 248, 53, 45, 55, 210, 113, 50, 55, 210, 113, 105, 185, 139, 91, 75, - 208, 151, 91, 75, 139, 105, 185, 208, 151, 112, 232, 128, 75, 208, 151, - 232, 226, 75, 77, 207, 18, 208, 13, 77, 81, 198, 152, 206, 189, 209, 61, - 193, 23, 204, 11, 82, 236, 140, 153, 242, 74, 207, 147, 236, 140, 207, - 147, 242, 74, 153, 204, 25, 238, 15, 4, 45, 230, 173, 238, 15, 4, 50, - 230, 173, 153, 238, 14, 198, 54, 132, 205, 54, 56, 197, 14, 237, 215, - 198, 223, 237, 215, 201, 79, 232, 80, 201, 63, 81, 202, 136, 236, 138, - 193, 72, 81, 219, 112, 247, 109, 55, 228, 88, 207, 18, 242, 74, 55, 218, - 237, 207, 252, 77, 237, 216, 4, 45, 196, 69, 55, 200, 164, 77, 223, 93, - 130, 222, 35, 223, 93, 130, 222, 36, 4, 222, 36, 58, 130, 222, 35, 130, - 222, 36, 4, 236, 140, 55, 201, 114, 242, 74, 235, 138, 202, 23, 197, 225, - 238, 14, 216, 214, 242, 74, 210, 125, 77, 208, 150, 234, 129, 77, 238, - 255, 195, 137, 236, 205, 238, 218, 210, 82, 4, 50, 238, 216, 238, 218, - 210, 82, 4, 45, 238, 216, 198, 128, 3, 6, 233, 255, 216, 214, 233, 216, - 77, 216, 214, 208, 13, 77, 45, 51, 248, 54, 4, 106, 50, 51, 248, 54, 4, - 106, 45, 51, 248, 54, 4, 55, 106, 50, 51, 248, 54, 4, 55, 106, 198, 54, - 132, 45, 210, 113, 198, 54, 132, 50, 210, 113, 248, 77, 132, 45, 210, - 113, 248, 77, 132, 50, 210, 113, 211, 172, 228, 88, 12, 48, 207, 48, 12, - 48, 242, 230, 12, 48, 205, 57, 107, 12, 48, 205, 57, 109, 12, 48, 205, - 57, 138, 12, 48, 209, 250, 12, 48, 248, 62, 12, 48, 199, 233, 12, 48, - 221, 79, 107, 12, 48, 221, 79, 109, 12, 48, 236, 202, 12, 48, 205, 61, - 12, 48, 2, 107, 12, 48, 2, 109, 12, 48, 220, 30, 107, 12, 48, 220, 30, - 109, 12, 48, 220, 30, 138, 12, 48, 220, 30, 134, 12, 48, 202, 58, 12, 48, - 198, 227, 12, 48, 202, 55, 107, 12, 48, 202, 55, 109, 12, 48, 229, 224, - 107, 12, 48, 229, 224, 109, 12, 48, 230, 53, 12, 48, 207, 136, 12, 48, - 243, 64, 12, 48, 200, 198, 12, 48, 215, 205, 12, 48, 237, 143, 12, 48, - 215, 193, 12, 48, 242, 249, 12, 48, 193, 144, 107, 12, 48, 193, 144, 109, - 12, 48, 232, 243, 12, 48, 210, 76, 107, 12, 48, 210, 76, 109, 12, 48, - 202, 178, 132, 197, 255, 197, 177, 12, 48, 238, 239, 12, 48, 236, 162, - 12, 48, 223, 27, 12, 48, 248, 102, 79, 242, 213, 12, 48, 233, 193, 12, - 48, 201, 215, 107, 12, 48, 201, 215, 109, 12, 48, 249, 103, 12, 48, 202, - 185, 12, 48, 247, 190, 202, 185, 12, 48, 214, 86, 107, 12, 48, 214, 86, - 109, 12, 48, 214, 86, 138, 12, 48, 214, 86, 134, 12, 48, 216, 172, 12, - 48, 203, 107, 12, 48, 207, 142, 12, 48, 233, 223, 12, 48, 211, 119, 12, - 48, 248, 18, 107, 12, 48, 248, 18, 109, 12, 48, 216, 224, 12, 48, 215, - 199, 12, 48, 230, 214, 107, 12, 48, 230, 214, 109, 12, 48, 230, 214, 138, - 12, 48, 198, 173, 12, 48, 242, 212, 12, 48, 193, 105, 107, 12, 48, 193, - 105, 109, 12, 48, 247, 190, 205, 50, 12, 48, 202, 178, 228, 187, 12, 48, - 228, 187, 12, 48, 247, 190, 201, 229, 12, 48, 247, 190, 203, 102, 12, 48, - 232, 159, 12, 48, 247, 190, 247, 85, 12, 48, 202, 178, 193, 169, 12, 48, - 193, 170, 107, 12, 48, 193, 170, 109, 12, 48, 242, 252, 12, 48, 247, 190, - 230, 250, 12, 48, 179, 107, 12, 48, 179, 109, 12, 48, 247, 190, 219, 19, - 12, 48, 247, 190, 231, 191, 12, 48, 215, 188, 107, 12, 48, 215, 188, 109, - 12, 48, 207, 149, 12, 48, 248, 114, 12, 48, 247, 190, 199, 185, 219, 230, - 12, 48, 247, 190, 219, 233, 12, 48, 247, 190, 193, 66, 12, 48, 247, 190, - 232, 179, 12, 48, 234, 201, 107, 12, 48, 234, 201, 109, 12, 48, 234, 201, - 138, 12, 48, 247, 190, 234, 200, 12, 48, 229, 235, 12, 48, 247, 190, 228, - 183, 12, 48, 248, 98, 12, 48, 231, 61, 12, 48, 247, 190, 232, 236, 12, - 48, 247, 190, 248, 160, 12, 48, 247, 190, 205, 158, 12, 48, 202, 178, - 193, 95, 12, 48, 202, 178, 192, 72, 12, 48, 247, 190, 232, 99, 12, 48, - 223, 34, 233, 228, 12, 48, 247, 190, 233, 228, 12, 48, 223, 34, 198, 56, - 12, 48, 247, 190, 198, 56, 12, 48, 223, 34, 235, 111, 12, 48, 247, 190, - 235, 111, 12, 48, 197, 55, 12, 48, 223, 34, 197, 55, 12, 48, 247, 190, - 197, 55, 83, 48, 107, 83, 48, 219, 112, 83, 48, 236, 140, 83, 48, 202, - 97, 83, 48, 205, 56, 83, 48, 102, 83, 48, 109, 83, 48, 219, 141, 83, 48, - 217, 90, 83, 48, 219, 209, 83, 48, 234, 77, 83, 48, 171, 83, 48, 144, - 248, 62, 83, 48, 238, 242, 83, 48, 228, 26, 83, 48, 199, 233, 83, 48, - 211, 77, 248, 62, 83, 48, 221, 78, 83, 48, 208, 254, 83, 48, 193, 12, 83, - 48, 201, 203, 83, 48, 50, 211, 77, 248, 62, 83, 48, 229, 146, 234, 98, - 83, 48, 199, 95, 83, 48, 236, 202, 83, 48, 205, 61, 83, 48, 242, 230, 83, - 48, 208, 204, 83, 48, 251, 252, 83, 48, 215, 179, 83, 48, 234, 98, 83, - 48, 234, 207, 83, 48, 205, 91, 83, 48, 231, 3, 83, 48, 231, 4, 202, 74, - 83, 48, 233, 227, 83, 48, 248, 174, 83, 48, 193, 35, 83, 48, 243, 86, 83, - 48, 206, 133, 83, 48, 223, 158, 83, 48, 202, 70, 83, 48, 220, 29, 83, 48, - 238, 252, 83, 48, 201, 194, 83, 48, 215, 184, 83, 48, 206, 176, 83, 48, - 193, 20, 83, 48, 211, 95, 83, 48, 197, 63, 83, 48, 235, 91, 83, 48, 203, - 40, 198, 227, 83, 48, 235, 138, 242, 230, 83, 48, 179, 201, 34, 83, 48, - 105, 230, 28, 83, 48, 203, 46, 83, 48, 248, 69, 83, 48, 202, 54, 83, 48, - 248, 25, 83, 48, 201, 78, 83, 48, 229, 223, 83, 48, 230, 71, 83, 48, 236, - 144, 83, 48, 230, 53, 83, 48, 248, 47, 83, 48, 207, 136, 83, 48, 205, 74, - 83, 48, 236, 236, 83, 48, 250, 132, 83, 48, 201, 190, 83, 48, 213, 11, - 83, 48, 200, 198, 83, 48, 205, 103, 83, 48, 215, 205, 83, 48, 197, 254, - 83, 48, 220, 111, 83, 48, 201, 63, 83, 48, 237, 143, 83, 48, 193, 120, - 83, 48, 236, 175, 213, 11, 83, 48, 242, 70, 83, 48, 232, 72, 83, 48, 242, - 243, 83, 48, 201, 84, 83, 48, 193, 143, 83, 48, 232, 243, 83, 48, 242, - 239, 83, 48, 233, 66, 83, 48, 55, 192, 235, 83, 48, 132, 197, 255, 197, - 177, 83, 48, 202, 88, 83, 48, 233, 78, 83, 48, 238, 239, 83, 48, 236, - 162, 83, 48, 208, 199, 83, 48, 223, 27, 83, 48, 216, 196, 83, 48, 198, - 151, 83, 48, 200, 141, 83, 48, 219, 135, 83, 48, 196, 43, 83, 48, 233, - 21, 83, 48, 248, 102, 79, 242, 213, 83, 48, 202, 212, 83, 48, 235, 138, - 199, 87, 83, 48, 193, 89, 83, 48, 202, 107, 83, 48, 236, 222, 83, 48, - 233, 193, 83, 48, 201, 232, 83, 48, 57, 83, 48, 201, 65, 83, 48, 201, - 214, 83, 48, 198, 25, 83, 48, 230, 223, 83, 48, 247, 70, 83, 48, 201, - 107, 83, 48, 249, 103, 83, 48, 206, 245, 83, 48, 202, 185, 83, 48, 223, - 18, 83, 48, 214, 85, 83, 48, 203, 107, 83, 48, 233, 54, 83, 48, 211, 119, - 83, 48, 251, 125, 83, 48, 209, 89, 83, 48, 234, 211, 83, 48, 248, 17, 83, - 48, 216, 224, 83, 48, 216, 37, 83, 48, 204, 32, 83, 48, 250, 239, 83, 48, - 215, 199, 83, 48, 198, 61, 83, 48, 211, 64, 83, 48, 248, 106, 83, 48, - 201, 59, 83, 48, 242, 82, 83, 48, 230, 213, 83, 48, 198, 173, 83, 48, - 223, 121, 83, 48, 248, 120, 83, 48, 193, 170, 234, 98, 83, 48, 242, 212, - 83, 48, 193, 104, 83, 48, 205, 50, 83, 48, 228, 187, 83, 48, 201, 229, - 83, 48, 195, 180, 83, 48, 249, 12, 83, 48, 209, 147, 83, 48, 249, 133, - 83, 48, 203, 102, 83, 48, 207, 86, 83, 48, 206, 45, 83, 48, 232, 159, 83, - 48, 248, 104, 83, 48, 247, 85, 83, 48, 248, 144, 83, 48, 215, 201, 83, - 48, 193, 169, 83, 48, 242, 252, 83, 48, 193, 62, 83, 48, 236, 214, 83, - 48, 195, 50, 83, 48, 230, 250, 83, 48, 219, 19, 83, 48, 231, 191, 83, 48, - 215, 187, 83, 48, 202, 96, 83, 48, 203, 40, 199, 214, 248, 160, 83, 48, - 207, 149, 83, 48, 248, 114, 83, 48, 193, 2, 83, 48, 233, 103, 83, 48, - 219, 230, 83, 48, 199, 185, 219, 230, 83, 48, 219, 226, 83, 48, 202, 4, - 83, 48, 219, 233, 83, 48, 193, 66, 83, 48, 232, 179, 83, 48, 234, 200, - 83, 48, 229, 235, 83, 48, 232, 116, 83, 48, 228, 183, 83, 48, 248, 98, - 83, 48, 199, 199, 83, 48, 230, 78, 83, 48, 233, 14, 83, 48, 205, 194, - 193, 62, 83, 48, 247, 72, 83, 48, 231, 61, 83, 48, 232, 236, 83, 48, 248, - 160, 83, 48, 205, 158, 83, 48, 237, 128, 83, 48, 193, 95, 83, 48, 229, - 199, 83, 48, 192, 72, 83, 48, 216, 49, 83, 48, 248, 139, 83, 48, 234, - 110, 83, 48, 232, 99, 83, 48, 197, 222, 83, 48, 235, 94, 83, 48, 207, - 130, 83, 48, 213, 13, 83, 48, 233, 228, 83, 48, 198, 56, 83, 48, 235, - 111, 83, 48, 197, 55, 83, 48, 232, 182, 154, 237, 85, 246, 240, 45, 119, - 183, 154, 237, 85, 246, 240, 93, 119, 60, 154, 237, 85, 246, 240, 45, - 119, 82, 23, 183, 154, 237, 85, 246, 240, 93, 119, 82, 23, 60, 154, 237, - 85, 246, 240, 232, 80, 200, 168, 154, 237, 85, 246, 240, 200, 169, 232, - 98, 58, 154, 237, 85, 246, 240, 200, 169, 232, 98, 60, 154, 237, 85, 246, - 240, 200, 169, 232, 98, 219, 224, 154, 237, 85, 246, 240, 200, 169, 232, - 98, 116, 219, 224, 154, 237, 85, 246, 240, 200, 169, 232, 98, 116, 183, - 154, 237, 85, 246, 240, 200, 169, 232, 98, 110, 219, 224, 154, 237, 85, - 246, 240, 211, 3, 154, 201, 247, 154, 242, 74, 154, 232, 80, 201, 63, - 236, 211, 77, 223, 19, 223, 141, 201, 106, 113, 154, 223, 51, 77, 154, - 242, 215, 77, 154, 31, 191, 77, 45, 251, 116, 248, 53, 50, 251, 116, 248, - 53, 45, 55, 251, 116, 248, 53, 50, 55, 251, 116, 248, 53, 45, 239, 2, - 248, 53, 50, 239, 2, 248, 53, 45, 63, 239, 2, 248, 53, 50, 63, 239, 2, - 248, 53, 45, 62, 219, 187, 248, 53, 50, 62, 219, 187, 248, 53, 209, 18, - 77, 231, 130, 77, 45, 198, 42, 203, 103, 248, 53, 50, 198, 42, 203, 103, - 248, 53, 45, 63, 219, 187, 248, 53, 50, 63, 219, 187, 248, 53, 45, 63, - 198, 42, 203, 103, 248, 53, 50, 63, 198, 42, 203, 103, 248, 53, 45, 63, - 51, 248, 53, 50, 63, 51, 248, 53, 193, 139, 237, 215, 207, 18, 55, 208, - 216, 207, 252, 77, 55, 208, 216, 207, 252, 77, 130, 55, 208, 216, 207, - 252, 77, 209, 18, 87, 233, 103, 230, 25, 212, 134, 107, 230, 25, 212, - 134, 109, 230, 25, 212, 134, 138, 230, 25, 212, 134, 134, 230, 25, 212, - 134, 149, 230, 25, 212, 134, 169, 230, 25, 212, 134, 175, 230, 25, 212, - 134, 171, 230, 25, 212, 134, 178, 154, 219, 168, 163, 77, 154, 206, 180, - 163, 77, 154, 237, 95, 163, 77, 154, 234, 76, 163, 77, 30, 202, 170, 75, - 163, 77, 30, 55, 75, 163, 77, 193, 135, 237, 215, 81, 222, 86, 207, 49, - 77, 81, 222, 86, 207, 49, 4, 195, 20, 202, 5, 77, 81, 222, 86, 207, 49, - 87, 116, 230, 70, 81, 222, 86, 207, 49, 4, 195, 20, 202, 5, 87, 116, 230, - 70, 81, 222, 86, 207, 49, 87, 110, 230, 70, 47, 209, 18, 77, 154, 199, - 109, 219, 113, 233, 51, 204, 11, 113, 230, 25, 212, 134, 199, 95, 230, - 25, 212, 134, 197, 32, 230, 25, 212, 134, 198, 249, 81, 154, 223, 51, 77, - 217, 31, 77, 210, 107, 251, 153, 77, 154, 67, 223, 144, 154, 132, 233, 6, - 201, 247, 229, 120, 1, 2, 65, 229, 120, 1, 65, 229, 120, 1, 2, 68, 229, - 120, 1, 68, 229, 120, 1, 2, 66, 229, 120, 1, 66, 229, 120, 1, 2, 71, 229, - 120, 1, 71, 229, 120, 1, 2, 74, 229, 120, 1, 74, 229, 120, 1, 155, 229, - 120, 1, 231, 240, 229, 120, 1, 221, 166, 229, 120, 1, 231, 53, 229, 120, - 1, 220, 232, 229, 120, 1, 230, 179, 229, 120, 1, 222, 22, 229, 120, 1, - 231, 165, 229, 120, 1, 221, 67, 229, 120, 1, 231, 3, 229, 120, 1, 188, - 229, 120, 1, 191, 123, 229, 120, 1, 202, 222, 229, 120, 1, 191, 30, 229, - 120, 1, 201, 4, 229, 120, 1, 190, 251, 229, 120, 1, 205, 68, 229, 120, 1, - 191, 87, 229, 120, 1, 202, 46, 229, 120, 1, 191, 7, 229, 120, 1, 190, - 190, 229, 120, 1, 238, 32, 229, 120, 1, 198, 193, 229, 120, 1, 237, 44, - 229, 120, 1, 2, 197, 94, 229, 120, 1, 197, 94, 229, 120, 1, 235, 89, 229, - 120, 1, 199, 145, 229, 120, 1, 237, 146, 229, 120, 1, 159, 229, 120, 1, - 236, 174, 229, 120, 1, 180, 229, 120, 1, 213, 219, 229, 120, 1, 212, 178, - 229, 120, 1, 214, 121, 229, 120, 1, 213, 43, 229, 120, 1, 140, 229, 120, - 1, 249, 153, 229, 120, 1, 168, 229, 120, 1, 229, 158, 229, 120, 1, 248, - 188, 229, 120, 1, 209, 185, 229, 120, 1, 228, 159, 229, 120, 1, 248, 10, - 229, 120, 1, 208, 165, 229, 120, 1, 229, 245, 229, 120, 1, 249, 17, 229, - 120, 1, 210, 63, 229, 120, 1, 229, 23, 229, 120, 1, 248, 111, 229, 120, - 1, 209, 73, 229, 120, 1, 174, 229, 120, 1, 216, 100, 229, 120, 1, 215, - 155, 229, 120, 1, 216, 232, 229, 120, 1, 216, 12, 229, 120, 1, 2, 170, - 229, 120, 1, 170, 229, 120, 1, 2, 191, 225, 229, 120, 1, 191, 225, 229, - 120, 1, 2, 192, 12, 229, 120, 1, 192, 12, 229, 120, 1, 165, 229, 120, 1, - 207, 1, 229, 120, 1, 206, 68, 229, 120, 1, 207, 113, 229, 120, 1, 206, - 162, 229, 120, 1, 2, 193, 190, 229, 120, 1, 193, 190, 229, 120, 1, 193, - 86, 229, 120, 1, 193, 125, 229, 120, 1, 193, 48, 229, 120, 1, 215, 61, - 229, 120, 1, 193, 249, 229, 120, 1, 2, 155, 229, 120, 1, 2, 222, 22, 33, - 222, 48, 195, 20, 202, 5, 77, 33, 222, 48, 204, 30, 202, 5, 77, 222, 48, - 195, 20, 202, 5, 77, 222, 48, 204, 30, 202, 5, 77, 229, 120, 223, 51, 77, - 229, 120, 195, 20, 223, 51, 77, 229, 120, 237, 3, 191, 242, 222, 48, 55, - 228, 88, 72, 1, 2, 65, 72, 1, 65, 72, 1, 2, 68, 72, 1, 68, 72, 1, 2, 66, - 72, 1, 66, 72, 1, 2, 71, 72, 1, 71, 72, 1, 2, 74, 72, 1, 74, 72, 1, 155, - 72, 1, 231, 240, 72, 1, 221, 166, 72, 1, 231, 53, 72, 1, 220, 232, 72, 1, - 230, 179, 72, 1, 222, 22, 72, 1, 231, 165, 72, 1, 221, 67, 72, 1, 231, 3, - 72, 1, 188, 72, 1, 191, 123, 72, 1, 202, 222, 72, 1, 191, 30, 72, 1, 201, - 4, 72, 1, 190, 251, 72, 1, 205, 68, 72, 1, 191, 87, 72, 1, 202, 46, 72, - 1, 191, 7, 72, 1, 190, 190, 72, 1, 238, 32, 72, 1, 198, 193, 72, 1, 237, - 44, 72, 1, 2, 197, 94, 72, 1, 197, 94, 72, 1, 235, 89, 72, 1, 199, 145, - 72, 1, 237, 146, 72, 1, 159, 72, 1, 236, 174, 72, 1, 180, 72, 1, 213, - 219, 72, 1, 212, 178, 72, 1, 214, 121, 72, 1, 213, 43, 72, 1, 140, 72, 1, - 249, 153, 72, 1, 168, 72, 1, 229, 158, 72, 1, 248, 188, 72, 1, 209, 185, - 72, 1, 228, 159, 72, 1, 248, 10, 72, 1, 208, 165, 72, 1, 229, 245, 72, 1, - 249, 17, 72, 1, 210, 63, 72, 1, 229, 23, 72, 1, 248, 111, 72, 1, 209, 73, - 72, 1, 174, 72, 1, 216, 100, 72, 1, 215, 155, 72, 1, 216, 232, 72, 1, - 216, 12, 72, 1, 2, 170, 72, 1, 170, 72, 1, 2, 191, 225, 72, 1, 191, 225, - 72, 1, 2, 192, 12, 72, 1, 192, 12, 72, 1, 165, 72, 1, 207, 1, 72, 1, 206, - 68, 72, 1, 207, 113, 72, 1, 206, 162, 72, 1, 2, 193, 190, 72, 1, 193, - 190, 72, 1, 193, 86, 72, 1, 193, 125, 72, 1, 193, 48, 72, 1, 215, 61, 72, - 1, 193, 249, 72, 1, 2, 155, 72, 1, 2, 222, 22, 72, 1, 195, 188, 72, 1, - 195, 69, 72, 1, 195, 153, 72, 1, 195, 24, 72, 82, 236, 140, 222, 48, 208, - 191, 202, 5, 77, 72, 223, 51, 77, 72, 195, 20, 223, 51, 77, 72, 237, 3, - 221, 27, 248, 88, 1, 250, 120, 248, 88, 1, 210, 236, 248, 88, 1, 218, - 168, 248, 88, 1, 233, 175, 248, 88, 1, 238, 127, 248, 88, 1, 200, 43, - 248, 88, 1, 215, 61, 248, 88, 1, 172, 248, 88, 1, 232, 51, 248, 88, 1, - 222, 152, 248, 88, 1, 230, 116, 248, 88, 1, 223, 35, 248, 88, 1, 208, - 104, 248, 88, 1, 192, 235, 248, 88, 1, 191, 72, 248, 88, 1, 247, 3, 248, - 88, 1, 203, 167, 248, 88, 1, 146, 248, 88, 1, 191, 166, 248, 88, 1, 247, - 193, 248, 88, 1, 206, 8, 248, 88, 1, 65, 248, 88, 1, 74, 248, 88, 1, 71, - 248, 88, 1, 234, 173, 248, 88, 1, 251, 236, 248, 88, 1, 234, 166, 248, - 88, 1, 250, 163, 248, 88, 1, 211, 19, 248, 88, 1, 251, 132, 248, 88, 1, - 234, 103, 248, 88, 1, 251, 122, 248, 88, 1, 234, 88, 248, 88, 1, 234, 34, - 248, 88, 1, 68, 248, 88, 1, 66, 248, 88, 1, 223, 49, 248, 88, 1, 196, 12, - 248, 88, 1, 214, 70, 248, 88, 1, 231, 7, 248, 88, 1, 223, 200, 248, 88, - 1, 187, 4, 75, 58, 248, 88, 1, 213, 80, 30, 1, 221, 113, 30, 1, 201, 167, - 30, 1, 221, 106, 30, 1, 213, 204, 30, 1, 213, 202, 30, 1, 213, 201, 30, - 1, 198, 168, 30, 1, 201, 156, 30, 1, 206, 239, 30, 1, 206, 234, 30, 1, - 206, 231, 30, 1, 206, 224, 30, 1, 206, 219, 30, 1, 206, 214, 30, 1, 206, - 225, 30, 1, 206, 237, 30, 1, 216, 77, 30, 1, 209, 169, 30, 1, 201, 164, - 30, 1, 209, 158, 30, 1, 202, 160, 30, 1, 201, 161, 30, 1, 223, 222, 30, - 1, 243, 24, 30, 1, 201, 171, 30, 1, 243, 91, 30, 1, 221, 188, 30, 1, 199, - 7, 30, 1, 209, 209, 30, 1, 229, 142, 30, 1, 65, 30, 1, 252, 25, 30, 1, - 170, 30, 1, 192, 129, 30, 1, 234, 65, 30, 1, 71, 30, 1, 192, 67, 30, 1, - 192, 80, 30, 1, 74, 30, 1, 193, 190, 30, 1, 193, 176, 30, 1, 211, 151, - 30, 1, 192, 12, 30, 1, 66, 30, 1, 193, 107, 30, 1, 193, 125, 30, 1, 193, - 86, 30, 1, 191, 225, 30, 1, 233, 242, 30, 1, 192, 33, 30, 1, 68, 30, 233, - 3, 30, 1, 201, 165, 30, 1, 213, 194, 30, 1, 213, 196, 30, 1, 213, 199, - 30, 1, 206, 232, 30, 1, 206, 213, 30, 1, 206, 221, 30, 1, 206, 226, 30, - 1, 206, 211, 30, 1, 216, 70, 30, 1, 216, 67, 30, 1, 216, 71, 30, 1, 222, - 71, 30, 1, 209, 164, 30, 1, 209, 150, 30, 1, 209, 156, 30, 1, 209, 153, - 30, 1, 209, 167, 30, 1, 209, 151, 30, 1, 222, 69, 30, 1, 222, 67, 30, 1, - 202, 153, 30, 1, 202, 151, 30, 1, 202, 143, 30, 1, 202, 148, 30, 1, 202, - 158, 30, 1, 210, 149, 30, 1, 201, 168, 30, 1, 192, 57, 30, 1, 192, 51, - 30, 1, 192, 52, 30, 1, 222, 70, 30, 1, 201, 169, 30, 1, 192, 63, 30, 1, - 192, 0, 30, 1, 191, 255, 30, 1, 192, 2, 30, 1, 191, 212, 30, 1, 191, 213, - 30, 1, 191, 216, 30, 1, 251, 25, 30, 1, 251, 19, 154, 251, 96, 219, 101, - 77, 154, 251, 96, 207, 19, 77, 154, 251, 96, 91, 77, 154, 251, 96, 105, - 77, 154, 251, 96, 115, 77, 154, 251, 96, 232, 128, 77, 154, 251, 96, 198, - 54, 77, 154, 251, 96, 82, 77, 154, 251, 96, 248, 77, 77, 154, 251, 96, - 232, 238, 77, 154, 251, 96, 205, 57, 77, 154, 251, 96, 199, 1, 77, 154, - 251, 96, 232, 121, 77, 154, 251, 96, 229, 220, 77, 154, 251, 96, 234, - 208, 77, 154, 251, 96, 217, 91, 77, 248, 88, 1, 248, 10, 248, 88, 1, 191, - 30, 248, 88, 1, 222, 244, 248, 88, 1, 230, 179, 248, 88, 1, 234, 188, - 248, 88, 1, 234, 85, 248, 88, 1, 211, 87, 248, 88, 1, 211, 91, 248, 88, - 1, 223, 77, 248, 88, 1, 251, 98, 248, 88, 1, 223, 128, 248, 88, 1, 196, - 83, 248, 88, 1, 223, 180, 248, 88, 1, 214, 48, 248, 88, 1, 251, 229, 248, - 88, 1, 250, 158, 248, 88, 1, 251, 149, 248, 88, 1, 211, 113, 248, 88, 1, - 211, 94, 248, 88, 1, 223, 125, 248, 88, 53, 1, 210, 236, 248, 88, 53, 1, - 200, 43, 248, 88, 53, 1, 222, 152, 248, 88, 53, 1, 230, 116, 248, 88, 1, - 231, 92, 248, 88, 1, 219, 160, 248, 88, 1, 190, 231, 248, 88, 53, 1, 232, - 51, 248, 88, 1, 230, 136, 248, 88, 1, 220, 180, 248, 88, 1, 211, 151, - 248, 88, 1, 251, 245, 12, 201, 28, 200, 43, 12, 201, 28, 193, 98, 12, - 201, 28, 192, 209, 12, 201, 28, 247, 206, 12, 201, 28, 200, 151, 12, 201, - 28, 228, 78, 12, 201, 28, 228, 82, 12, 201, 28, 228, 169, 12, 201, 28, - 228, 79, 12, 201, 28, 200, 46, 12, 201, 28, 228, 81, 12, 201, 28, 228, - 77, 12, 201, 28, 228, 167, 12, 201, 28, 228, 80, 12, 201, 28, 228, 76, - 12, 201, 28, 215, 61, 12, 201, 28, 230, 116, 12, 201, 28, 206, 8, 12, - 201, 28, 210, 236, 12, 201, 28, 201, 250, 12, 201, 28, 238, 127, 12, 201, - 28, 228, 83, 12, 201, 28, 229, 178, 12, 201, 28, 200, 55, 12, 201, 28, - 200, 128, 12, 201, 28, 201, 118, 12, 201, 28, 203, 173, 12, 201, 28, 210, - 67, 12, 201, 28, 208, 106, 12, 201, 28, 198, 99, 12, 201, 28, 200, 45, - 12, 201, 28, 200, 140, 12, 201, 28, 228, 94, 12, 201, 28, 228, 75, 12, - 201, 28, 209, 230, 12, 201, 28, 208, 104, 72, 1, 2, 220, 232, 72, 1, 2, - 202, 222, 72, 1, 2, 201, 4, 72, 1, 2, 159, 72, 1, 2, 212, 178, 72, 1, 2, - 140, 72, 1, 2, 229, 158, 72, 1, 2, 228, 159, 72, 1, 2, 229, 245, 72, 1, - 2, 229, 23, 72, 1, 2, 215, 155, 72, 1, 2, 165, 72, 1, 2, 207, 1, 72, 1, - 2, 206, 68, 72, 1, 2, 207, 113, 72, 1, 2, 206, 162, 127, 30, 221, 113, - 127, 30, 213, 204, 127, 30, 198, 168, 127, 30, 206, 239, 127, 30, 216, - 77, 127, 30, 209, 169, 127, 30, 202, 160, 127, 30, 223, 222, 127, 30, - 243, 24, 127, 30, 243, 91, 127, 30, 221, 188, 127, 30, 199, 7, 127, 30, - 209, 209, 127, 30, 229, 142, 127, 30, 221, 114, 65, 127, 30, 213, 205, - 65, 127, 30, 198, 169, 65, 127, 30, 206, 240, 65, 127, 30, 216, 78, 65, - 127, 30, 209, 170, 65, 127, 30, 202, 161, 65, 127, 30, 223, 223, 65, 127, - 30, 243, 25, 65, 127, 30, 243, 92, 65, 127, 30, 221, 189, 65, 127, 30, - 199, 8, 65, 127, 30, 209, 210, 65, 127, 30, 229, 143, 65, 127, 30, 243, - 25, 66, 127, 221, 32, 246, 240, 211, 129, 127, 221, 32, 246, 240, 187, - 228, 159, 127, 228, 14, 107, 127, 228, 14, 109, 127, 228, 14, 138, 127, - 228, 14, 134, 127, 228, 14, 149, 127, 228, 14, 169, 127, 228, 14, 175, - 127, 228, 14, 171, 127, 228, 14, 178, 127, 228, 14, 199, 95, 127, 228, - 14, 215, 205, 127, 228, 14, 232, 243, 127, 228, 14, 193, 143, 127, 228, - 14, 193, 28, 127, 228, 14, 216, 165, 127, 228, 14, 234, 207, 127, 228, - 14, 200, 198, 127, 228, 14, 201, 66, 127, 228, 14, 229, 255, 127, 228, - 14, 202, 35, 127, 228, 14, 214, 227, 127, 228, 14, 201, 231, 127, 228, - 14, 232, 254, 127, 228, 14, 239, 50, 127, 228, 14, 220, 114, 127, 228, - 14, 207, 42, 127, 228, 14, 247, 138, 127, 228, 14, 201, 10, 127, 228, 14, - 200, 178, 127, 228, 14, 234, 75, 127, 228, 14, 207, 32, 127, 228, 14, - 251, 168, 127, 228, 14, 233, 31, 127, 228, 14, 207, 30, 127, 228, 14, - 204, 32, 127, 228, 14, 207, 108, 47, 228, 14, 208, 12, 47, 228, 14, 221, - 140, 47, 228, 14, 205, 89, 47, 228, 14, 221, 27, 47, 31, 199, 96, 211, - 105, 62, 201, 190, 47, 31, 197, 33, 211, 105, 62, 201, 190, 47, 31, 198, - 250, 211, 105, 62, 201, 190, 47, 31, 232, 136, 211, 105, 62, 201, 190, - 47, 31, 233, 16, 211, 105, 62, 201, 190, 47, 31, 202, 121, 211, 105, 62, - 201, 190, 47, 31, 203, 242, 211, 105, 62, 201, 190, 47, 31, 234, 154, - 211, 105, 62, 201, 190, 210, 103, 56, 47, 31, 197, 33, 107, 47, 31, 197, - 33, 109, 47, 31, 197, 33, 138, 47, 31, 197, 33, 134, 47, 31, 197, 33, - 149, 47, 31, 197, 33, 169, 47, 31, 197, 33, 175, 47, 31, 197, 33, 171, - 47, 31, 197, 33, 178, 47, 31, 198, 249, 47, 31, 198, 250, 107, 47, 31, - 198, 250, 109, 47, 31, 198, 250, 138, 47, 31, 198, 250, 134, 47, 31, 198, - 250, 149, 47, 30, 221, 113, 47, 30, 213, 204, 47, 30, 198, 168, 47, 30, - 206, 239, 47, 30, 216, 77, 47, 30, 209, 169, 47, 30, 202, 160, 47, 30, - 223, 222, 47, 30, 243, 24, 47, 30, 243, 91, 47, 30, 221, 188, 47, 30, - 199, 7, 47, 30, 209, 209, 47, 30, 229, 142, 47, 30, 221, 114, 65, 47, 30, - 213, 205, 65, 47, 30, 198, 169, 65, 47, 30, 206, 240, 65, 47, 30, 216, - 78, 65, 47, 30, 209, 170, 65, 47, 30, 202, 161, 65, 47, 30, 223, 223, 65, - 47, 30, 243, 25, 65, 47, 30, 243, 92, 65, 47, 30, 221, 189, 65, 47, 30, - 199, 8, 65, 47, 30, 209, 210, 65, 47, 30, 229, 143, 65, 47, 221, 32, 246, - 240, 246, 247, 47, 221, 32, 246, 240, 222, 178, 47, 30, 223, 223, 66, - 221, 32, 201, 106, 113, 47, 228, 14, 107, 47, 228, 14, 109, 47, 228, 14, - 138, 47, 228, 14, 134, 47, 228, 14, 149, 47, 228, 14, 169, 47, 228, 14, - 175, 47, 228, 14, 171, 47, 228, 14, 178, 47, 228, 14, 199, 95, 47, 228, - 14, 215, 205, 47, 228, 14, 232, 243, 47, 228, 14, 193, 143, 47, 228, 14, - 193, 28, 47, 228, 14, 216, 165, 47, 228, 14, 234, 207, 47, 228, 14, 200, - 198, 47, 228, 14, 201, 66, 47, 228, 14, 229, 255, 47, 228, 14, 202, 35, - 47, 228, 14, 214, 227, 47, 228, 14, 201, 231, 47, 228, 14, 232, 254, 47, - 228, 14, 239, 50, 47, 228, 14, 220, 114, 47, 228, 14, 205, 55, 47, 228, - 14, 217, 96, 47, 228, 14, 233, 41, 47, 228, 14, 200, 210, 47, 228, 14, - 233, 220, 47, 228, 14, 208, 211, 47, 228, 14, 250, 167, 47, 228, 14, 223, - 52, 47, 228, 14, 207, 30, 47, 228, 14, 239, 8, 47, 228, 14, 238, 251, 47, - 228, 14, 229, 135, 47, 228, 14, 247, 21, 47, 228, 14, 218, 241, 47, 228, - 14, 219, 224, 47, 228, 14, 183, 47, 228, 14, 216, 215, 47, 228, 14, 207, - 60, 47, 228, 14, 201, 10, 47, 228, 14, 200, 178, 47, 228, 14, 234, 75, - 47, 228, 14, 207, 32, 47, 228, 14, 251, 168, 47, 228, 14, 213, 190, 47, + 250, 51, 4, 45, 132, 248, 141, 51, 4, 50, 132, 248, 141, 51, 4, 116, 45, + 237, 41, 132, 248, 141, 51, 4, 110, 50, 237, 41, 132, 248, 141, 63, 51, + 4, 81, 248, 156, 219, 114, 63, 196, 76, 197, 242, 4, 236, 142, 196, 76, + 197, 242, 4, 45, 132, 248, 141, 196, 76, 197, 242, 4, 50, 132, 248, 141, + 220, 15, 243, 12, 63, 51, 4, 116, 45, 208, 29, 63, 51, 4, 110, 45, 208, + 29, 63, 51, 4, 110, 50, 208, 29, 63, 51, 4, 116, 50, 208, 29, 63, 243, + 13, 4, 116, 45, 208, 29, 63, 243, 13, 4, 110, 45, 208, 29, 63, 243, 13, + 4, 110, 50, 208, 29, 63, 243, 13, 4, 116, 50, 208, 29, 116, 45, 197, 241, + 116, 50, 197, 241, 110, 45, 197, 241, 63, 216, 215, 201, 191, 62, 216, + 215, 201, 191, 63, 216, 215, 2, 201, 191, 62, 216, 215, 2, 201, 191, 110, + 50, 197, 241, 62, 200, 199, 4, 207, 121, 242, 212, 196, 117, 202, 49, + 242, 79, 62, 201, 103, 63, 201, 103, 219, 131, 198, 208, 200, 198, 250, + 215, 213, 37, 237, 88, 213, 37, 239, 44, 211, 64, 62, 199, 106, 63, 199, + 106, 249, 109, 248, 64, 249, 109, 111, 4, 243, 127, 249, 109, 111, 4, + 192, 235, 205, 155, 196, 118, 4, 207, 152, 235, 98, 228, 183, 248, 209, + 63, 203, 50, 209, 177, 62, 203, 50, 209, 177, 203, 141, 207, 19, 206, + 123, 232, 192, 229, 226, 247, 250, 62, 45, 209, 60, 223, 150, 62, 50, + 209, 60, 223, 150, 63, 45, 209, 60, 223, 150, 63, 133, 209, 60, 223, 150, + 63, 50, 209, 60, 223, 150, 63, 144, 209, 60, 223, 150, 202, 105, 23, 238, + 217, 247, 73, 56, 207, 166, 56, 248, 164, 56, 247, 153, 251, 101, 211, + 41, 238, 219, 243, 98, 207, 4, 238, 220, 79, 219, 1, 238, 220, 79, 223, + 0, 201, 104, 23, 238, 229, 233, 76, 113, 252, 36, 203, 144, 230, 64, 23, + 202, 214, 210, 63, 113, 192, 22, 192, 106, 197, 231, 40, 229, 221, 197, + 231, 40, 220, 45, 197, 231, 40, 232, 245, 197, 231, 40, 198, 209, 197, + 231, 40, 193, 66, 197, 231, 40, 193, 143, 197, 231, 40, 215, 186, 197, + 231, 40, 234, 209, 193, 94, 79, 237, 62, 63, 232, 94, 233, 105, 63, 202, + 65, 233, 105, 62, 202, 65, 233, 105, 63, 200, 199, 4, 207, 121, 232, 240, + 208, 25, 215, 207, 220, 8, 208, 25, 215, 207, 216, 182, 233, 44, 56, 234, + 209, 217, 99, 56, 222, 169, 205, 116, 196, 57, 214, 96, 209, 79, 251, 4, + 199, 164, 231, 154, 247, 126, 219, 188, 195, 38, 219, 145, 205, 81, 205, + 184, 247, 108, 251, 36, 209, 122, 63, 243, 107, 221, 140, 63, 243, 107, + 208, 16, 63, 243, 107, 206, 132, 63, 243, 107, 248, 154, 63, 243, 107, + 221, 78, 63, 243, 107, 210, 76, 62, 243, 107, 221, 140, 62, 243, 107, + 208, 16, 62, 243, 107, 206, 132, 62, 243, 107, 248, 154, 62, 243, 107, + 221, 78, 62, 243, 107, 210, 76, 62, 201, 246, 200, 211, 63, 229, 226, + 200, 211, 63, 237, 35, 200, 211, 62, 242, 209, 200, 211, 63, 201, 246, + 200, 211, 62, 229, 226, 200, 211, 62, 237, 35, 200, 211, 63, 242, 209, + 200, 211, 228, 183, 201, 196, 208, 25, 213, 8, 234, 162, 213, 8, 249, 15, + 234, 162, 213, 3, 249, 15, 202, 130, 213, 3, 215, 99, 232, 209, 56, 215, + 99, 214, 208, 56, 215, 99, 203, 128, 56, 193, 105, 200, 63, 238, 219, + 234, 206, 200, 63, 238, 219, 196, 87, 207, 90, 113, 207, 90, 16, 40, 196, + 254, 209, 100, 207, 90, 16, 40, 196, 252, 209, 100, 207, 90, 16, 40, 196, + 251, 209, 100, 207, 90, 16, 40, 196, 249, 209, 100, 207, 90, 16, 40, 196, + 247, 209, 100, 207, 90, 16, 40, 196, 245, 209, 100, 207, 90, 16, 40, 196, + 243, 209, 100, 207, 90, 16, 40, 231, 151, 217, 30, 62, 196, 87, 207, 90, + 113, 207, 91, 210, 138, 113, 210, 106, 210, 138, 113, 210, 5, 210, 138, + 56, 193, 92, 113, 237, 27, 233, 104, 237, 27, 233, 103, 237, 27, 233, + 102, 237, 27, 233, 101, 237, 27, 233, 100, 237, 27, 233, 99, 63, 243, 13, + 4, 75, 179, 63, 243, 13, 4, 105, 236, 140, 62, 243, 13, 4, 63, 75, 179, + 62, 243, 13, 4, 105, 63, 236, 140, 215, 223, 40, 192, 106, 215, 223, 40, + 192, 21, 237, 8, 40, 230, 207, 192, 106, 237, 8, 40, 219, 180, 192, 21, + 237, 8, 40, 219, 180, 192, 106, 237, 8, 40, 230, 207, 192, 21, 63, 232, + 219, 62, 232, 219, 230, 64, 23, 209, 182, 251, 129, 238, 216, 200, 130, + 201, 113, 79, 252, 10, 205, 99, 251, 193, 232, 188, 231, 164, 201, 113, + 79, 229, 193, 250, 174, 113, 232, 204, 211, 12, 63, 201, 103, 115, 219, + 109, 239, 21, 179, 115, 219, 109, 239, 21, 219, 226, 193, 155, 56, 137, + 195, 12, 56, 235, 130, 233, 44, 56, 235, 130, 217, 99, 56, 223, 107, 233, + 44, 23, 217, 99, 56, 217, 99, 23, 233, 44, 56, 217, 99, 4, 201, 29, 56, + 217, 99, 4, 201, 29, 23, 217, 99, 23, 233, 44, 56, 81, 217, 99, 4, 201, + 29, 56, 228, 243, 217, 99, 4, 201, 29, 56, 216, 215, 63, 243, 12, 216, + 215, 62, 243, 12, 216, 215, 2, 63, 243, 12, 217, 50, 113, 236, 200, 113, + 196, 84, 210, 105, 113, 242, 91, 232, 76, 196, 53, 214, 85, 247, 9, 210, + 187, 222, 175, 195, 80, 243, 77, 62, 215, 208, 219, 128, 203, 177, 204, + 23, 208, 6, 204, 0, 202, 37, 249, 113, 249, 75, 112, 221, 224, 63, 235, + 110, 217, 92, 63, 235, 110, 221, 140, 62, 235, 110, 217, 92, 62, 235, + 110, 221, 140, 202, 50, 193, 51, 202, 53, 200, 199, 248, 244, 242, 212, + 207, 151, 62, 202, 49, 198, 210, 242, 213, 23, 207, 151, 154, 63, 203, + 50, 209, 177, 154, 62, 203, 50, 209, 177, 63, 237, 35, 223, 165, 201, + 191, 238, 212, 220, 23, 236, 231, 247, 104, 211, 67, 209, 182, 247, 105, + 202, 86, 229, 203, 4, 63, 238, 219, 47, 238, 212, 220, 23, 246, 255, 213, + 46, 234, 74, 251, 159, 211, 98, 45, 193, 129, 198, 19, 62, 197, 10, 45, + 193, 129, 198, 19, 63, 197, 10, 45, 193, 129, 198, 19, 62, 45, 220, 24, + 216, 181, 63, 45, 220, 24, 216, 181, 235, 105, 202, 77, 56, 88, 63, 235, + 124, 197, 241, 45, 242, 221, 234, 74, 112, 205, 155, 233, 85, 237, 41, + 223, 165, 63, 243, 13, 223, 165, 62, 201, 191, 62, 197, 203, 207, 30, 45, + 234, 73, 207, 30, 45, 234, 72, 250, 189, 16, 40, 196, 57, 88, 243, 13, 4, + 201, 29, 23, 105, 185, 58, 210, 25, 206, 206, 223, 109, 210, 25, 219, + 223, 223, 109, 210, 25, 223, 95, 210, 25, 62, 238, 220, 211, 107, 203, + 79, 203, 67, 203, 13, 243, 42, 247, 82, 229, 120, 202, 138, 231, 165, + 193, 51, 228, 155, 231, 165, 4, 230, 32, 217, 74, 16, 40, 219, 133, 215, + 186, 196, 118, 211, 107, 230, 190, 232, 131, 232, 220, 223, 165, 229, 7, + 233, 34, 205, 179, 51, 232, 130, 239, 2, 202, 109, 228, 29, 202, 113, + 209, 253, 4, 249, 113, 199, 87, 223, 21, 249, 95, 113, 229, 231, 230, + 209, 113, 232, 85, 208, 155, 238, 184, 211, 107, 62, 201, 191, 63, 232, + 220, 4, 228, 243, 82, 62, 201, 30, 62, 205, 189, 205, 85, 116, 248, 136, + 205, 85, 62, 205, 85, 110, 248, 136, 205, 85, 63, 205, 85, 63, 88, 243, + 128, 77, 199, 107, 219, 42, 56, 199, 182, 235, 104, 251, 225, 234, 69, + 207, 149, 232, 233, 207, 149, 230, 55, 195, 67, 230, 55, 193, 3, 230, 55, + 110, 50, 210, 35, 210, 35, 116, 50, 210, 35, 63, 213, 210, 62, 213, 210, + 243, 128, 77, 88, 243, 128, 77, 215, 129, 192, 235, 88, 215, 129, 192, + 235, 249, 109, 192, 235, 88, 249, 109, 192, 235, 211, 12, 35, 238, 219, + 88, 35, 238, 219, 211, 79, 247, 24, 238, 219, 88, 211, 79, 247, 24, 238, + 219, 8, 238, 219, 203, 152, 63, 8, 238, 219, 211, 12, 8, 238, 219, 217, + 95, 238, 219, 201, 104, 79, 237, 210, 232, 130, 199, 127, 250, 195, 232, + 130, 249, 110, 250, 195, 88, 232, 130, 249, 110, 250, 195, 232, 130, 242, + 207, 250, 195, 62, 232, 130, 209, 62, 201, 103, 63, 232, 130, 209, 62, + 201, 103, 201, 241, 201, 39, 211, 12, 63, 201, 103, 47, 63, 201, 103, + 211, 79, 247, 24, 62, 201, 103, 62, 247, 24, 63, 201, 103, 211, 12, 62, + 201, 103, 88, 211, 12, 62, 201, 103, 209, 132, 201, 103, 203, 152, 63, + 201, 103, 88, 250, 195, 211, 79, 247, 24, 250, 195, 234, 166, 201, 207, + 250, 195, 234, 166, 209, 62, 62, 201, 103, 234, 166, 209, 62, 209, 132, + 201, 103, 202, 137, 209, 62, 62, 201, 103, 234, 166, 209, 62, 207, 92, + 62, 201, 103, 88, 234, 166, 209, 62, 207, 92, 62, 201, 103, 197, 38, 209, + 62, 62, 201, 103, 202, 132, 209, 62, 250, 195, 199, 127, 250, 195, 211, + 79, 247, 24, 199, 127, 250, 195, 88, 199, 127, 250, 195, 202, 137, 209, + 241, 62, 23, 63, 232, 191, 62, 232, 191, 63, 232, 191, 234, 166, 209, + 241, 211, 12, 62, 232, 191, 47, 211, 79, 247, 24, 234, 166, 209, 62, 201, + 103, 88, 199, 127, 209, 132, 250, 195, 202, 51, 198, 172, 197, 234, 202, + 51, 88, 243, 103, 202, 51, 201, 243, 88, 201, 243, 249, 110, 250, 195, + 234, 166, 199, 127, 208, 191, 250, 195, 88, 234, 166, 199, 127, 208, 191, + 250, 195, 238, 220, 77, 203, 152, 63, 243, 12, 214, 108, 112, 238, 220, + 77, 110, 50, 235, 100, 63, 201, 191, 116, 50, 235, 100, 63, 201, 191, + 110, 50, 203, 152, 63, 201, 191, 116, 50, 203, 152, 63, 201, 191, 62, + 208, 15, 87, 211, 44, 63, 208, 15, 87, 211, 44, 63, 233, 218, 87, 211, + 44, 62, 237, 35, 216, 37, 63, 192, 235, 88, 233, 218, 87, 113, 156, 81, + 164, 216, 215, 81, 164, 88, 81, 164, 88, 202, 171, 154, 242, 77, 207, + 254, 87, 211, 44, 88, 202, 171, 242, 77, 207, 254, 87, 211, 44, 88, 55, + 154, 242, 77, 207, 254, 87, 211, 44, 88, 55, 242, 77, 207, 254, 87, 211, + 44, 88, 130, 202, 171, 242, 77, 207, 254, 87, 211, 44, 88, 130, 55, 242, + 77, 207, 254, 87, 211, 44, 238, 165, 201, 82, 210, 130, 3, 211, 44, 88, + 233, 218, 87, 211, 44, 88, 229, 226, 233, 218, 87, 211, 44, 88, 62, 229, + 225, 206, 123, 88, 62, 229, 226, 247, 250, 232, 192, 229, 225, 206, 123, + 232, 192, 229, 226, 247, 250, 216, 215, 45, 210, 116, 211, 44, 216, 215, + 50, 210, 116, 211, 44, 216, 215, 232, 205, 45, 210, 116, 211, 44, 216, + 215, 232, 205, 50, 210, 116, 211, 44, 216, 215, 219, 221, 251, 118, 248, + 56, 211, 44, 216, 215, 206, 204, 251, 118, 248, 56, 211, 44, 88, 219, + 221, 251, 118, 207, 254, 87, 211, 44, 88, 206, 204, 251, 118, 207, 254, + 87, 211, 44, 88, 219, 221, 251, 118, 248, 56, 211, 44, 88, 206, 204, 251, + 118, 248, 56, 211, 44, 156, 45, 198, 42, 203, 104, 248, 56, 211, 44, 156, + 50, 198, 42, 203, 104, 248, 56, 211, 44, 216, 215, 45, 238, 173, 248, 56, + 211, 44, 216, 215, 50, 238, 173, 248, 56, 211, 44, 236, 243, 214, 108, + 47, 17, 107, 236, 243, 214, 108, 47, 17, 109, 236, 243, 214, 108, 47, 17, + 138, 236, 243, 214, 108, 47, 17, 134, 236, 243, 214, 108, 47, 17, 150, + 236, 243, 214, 108, 47, 17, 169, 236, 243, 214, 108, 47, 17, 175, 236, + 243, 214, 108, 47, 17, 171, 236, 243, 214, 108, 47, 17, 178, 236, 243, + 214, 108, 47, 31, 199, 95, 236, 243, 47, 49, 17, 107, 236, 243, 47, 49, + 17, 109, 236, 243, 47, 49, 17, 138, 236, 243, 47, 49, 17, 134, 236, 243, + 47, 49, 17, 150, 236, 243, 47, 49, 17, 169, 236, 243, 47, 49, 17, 175, + 236, 243, 47, 49, 17, 171, 236, 243, 47, 49, 17, 178, 236, 243, 47, 49, + 31, 199, 95, 236, 243, 214, 108, 47, 49, 17, 107, 236, 243, 214, 108, 47, + 49, 17, 109, 236, 243, 214, 108, 47, 49, 17, 138, 236, 243, 214, 108, 47, + 49, 17, 134, 236, 243, 214, 108, 47, 49, 17, 150, 236, 243, 214, 108, 47, + 49, 17, 169, 236, 243, 214, 108, 47, 49, 17, 175, 236, 243, 214, 108, 47, + 49, 17, 171, 236, 243, 214, 108, 47, 49, 17, 178, 236, 243, 214, 108, 47, + 49, 31, 199, 95, 88, 193, 77, 96, 57, 88, 108, 56, 88, 216, 37, 56, 88, + 236, 202, 56, 88, 202, 3, 234, 206, 57, 88, 96, 57, 88, 186, 234, 206, + 57, 235, 115, 209, 64, 96, 57, 88, 206, 115, 96, 57, 197, 240, 96, 57, + 88, 197, 240, 96, 57, 237, 216, 197, 240, 96, 57, 88, 237, 216, 197, 240, + 96, 57, 62, 96, 57, 198, 225, 198, 52, 96, 250, 237, 198, 225, 248, 77, + 96, 250, 237, 62, 96, 250, 237, 88, 62, 238, 165, 235, 121, 23, 96, 57, + 88, 62, 238, 165, 196, 66, 23, 96, 57, 201, 188, 62, 96, 57, 88, 239, 58, + 62, 96, 57, 206, 203, 63, 96, 57, 219, 220, 63, 96, 57, 249, 147, 203, + 152, 63, 96, 57, 232, 97, 203, 152, 63, 96, 57, 88, 110, 206, 202, 63, + 96, 57, 88, 116, 206, 202, 63, 96, 57, 213, 10, 110, 206, 202, 63, 96, + 57, 238, 173, 219, 6, 213, 10, 116, 206, 202, 63, 96, 57, 47, 88, 63, 96, + 57, 193, 88, 96, 57, 248, 140, 202, 3, 234, 206, 57, 248, 140, 96, 57, + 248, 140, 186, 234, 206, 57, 88, 248, 140, 202, 3, 234, 206, 57, 88, 248, + 140, 96, 57, 88, 248, 140, 186, 234, 206, 57, 199, 129, 96, 57, 88, 199, + 128, 96, 57, 193, 115, 96, 57, 88, 193, 115, 96, 57, 211, 73, 96, 57, 55, + 238, 173, 219, 6, 115, 236, 253, 251, 117, 63, 197, 242, 239, 35, 2, 63, + 197, 241, 210, 0, 211, 79, 200, 229, 211, 79, 200, 180, 45, 206, 8, 249, + 133, 237, 114, 50, 206, 8, 249, 133, 237, 114, 211, 59, 4, 75, 223, 119, + 207, 20, 202, 25, 208, 232, 200, 229, 200, 181, 208, 232, 202, 24, 81, + 249, 90, 4, 228, 243, 106, 13, 206, 181, 237, 40, 180, 236, 201, 13, 233, + 85, 237, 40, 112, 219, 31, 251, 127, 112, 219, 31, 211, 58, 63, 237, 35, + 4, 247, 22, 236, 142, 23, 4, 236, 142, 234, 134, 79, 211, 71, 196, 65, + 110, 50, 239, 4, 4, 236, 142, 116, 45, 239, 4, 4, 236, 142, 45, 211, 14, + 222, 201, 50, 211, 14, 222, 201, 232, 82, 211, 14, 222, 201, 220, 15, + 133, 199, 228, 220, 15, 144, 199, 228, 45, 23, 50, 55, 197, 57, 45, 23, + 50, 199, 228, 45, 215, 133, 180, 50, 199, 228, 180, 45, 199, 228, 133, + 199, 229, 4, 243, 13, 58, 218, 235, 236, 208, 247, 207, 228, 243, 206, + 53, 63, 239, 57, 237, 34, 63, 239, 57, 237, 35, 4, 118, 198, 182, 63, + 239, 57, 237, 35, 4, 96, 198, 182, 63, 51, 4, 118, 198, 182, 63, 51, 4, + 96, 198, 182, 13, 45, 63, 51, 248, 55, 13, 50, 63, 51, 248, 55, 13, 45, + 251, 118, 248, 55, 13, 50, 251, 118, 248, 55, 13, 45, 55, 251, 118, 248, + 55, 13, 50, 55, 251, 118, 248, 55, 13, 45, 63, 198, 42, 203, 104, 248, + 55, 13, 50, 63, 198, 42, 203, 104, 248, 55, 13, 45, 232, 205, 210, 115, + 13, 50, 232, 205, 210, 115, 196, 66, 208, 28, 57, 235, 121, 208, 28, 57, + 251, 87, 231, 204, 243, 13, 57, 242, 223, 231, 204, 243, 13, 57, 50, 64, + 4, 47, 209, 83, 180, 118, 57, 180, 96, 57, 180, 45, 50, 57, 180, 118, 55, + 57, 180, 96, 55, 57, 180, 45, 50, 55, 57, 180, 118, 64, 232, 100, 164, + 180, 96, 64, 232, 100, 164, 180, 118, 55, 64, 232, 100, 164, 180, 96, 55, + 64, 232, 100, 164, 180, 96, 201, 184, 57, 69, 70, 248, 134, 69, 70, 236, + 139, 69, 70, 236, 11, 69, 70, 236, 138, 69, 70, 235, 203, 69, 70, 236, + 74, 69, 70, 236, 10, 69, 70, 236, 137, 69, 70, 235, 171, 69, 70, 236, 42, + 69, 70, 235, 234, 69, 70, 236, 105, 69, 70, 235, 202, 69, 70, 236, 73, + 69, 70, 236, 9, 69, 70, 236, 136, 69, 70, 235, 155, 69, 70, 236, 26, 69, + 70, 235, 218, 69, 70, 236, 89, 69, 70, 235, 186, 69, 70, 236, 57, 69, 70, + 235, 249, 69, 70, 236, 120, 69, 70, 235, 170, 69, 70, 236, 41, 69, 70, + 235, 233, 69, 70, 236, 104, 69, 70, 235, 201, 69, 70, 236, 72, 69, 70, + 236, 8, 69, 70, 236, 135, 69, 70, 235, 147, 69, 70, 236, 18, 69, 70, 235, + 210, 69, 70, 236, 81, 69, 70, 235, 178, 69, 70, 236, 49, 69, 70, 235, + 241, 69, 70, 236, 112, 69, 70, 235, 162, 69, 70, 236, 33, 69, 70, 235, + 225, 69, 70, 236, 96, 69, 70, 235, 193, 69, 70, 236, 64, 69, 70, 236, 0, + 69, 70, 236, 127, 69, 70, 235, 154, 69, 70, 236, 25, 69, 70, 235, 217, + 69, 70, 236, 88, 69, 70, 235, 185, 69, 70, 236, 56, 69, 70, 235, 248, 69, + 70, 236, 119, 69, 70, 235, 169, 69, 70, 236, 40, 69, 70, 235, 232, 69, + 70, 236, 103, 69, 70, 235, 200, 69, 70, 236, 71, 69, 70, 236, 7, 69, 70, + 236, 134, 69, 70, 235, 143, 69, 70, 236, 14, 69, 70, 235, 206, 69, 70, + 236, 77, 69, 70, 235, 174, 69, 70, 236, 45, 69, 70, 235, 237, 69, 70, + 236, 108, 69, 70, 235, 158, 69, 70, 236, 29, 69, 70, 235, 221, 69, 70, + 236, 92, 69, 70, 235, 189, 69, 70, 236, 60, 69, 70, 235, 252, 69, 70, + 236, 123, 69, 70, 235, 150, 69, 70, 236, 21, 69, 70, 235, 213, 69, 70, + 236, 84, 69, 70, 235, 181, 69, 70, 236, 52, 69, 70, 235, 244, 69, 70, + 236, 115, 69, 70, 235, 165, 69, 70, 236, 36, 69, 70, 235, 228, 69, 70, + 236, 99, 69, 70, 235, 196, 69, 70, 236, 67, 69, 70, 236, 3, 69, 70, 236, + 130, 69, 70, 235, 146, 69, 70, 236, 17, 69, 70, 235, 209, 69, 70, 236, + 80, 69, 70, 235, 177, 69, 70, 236, 48, 69, 70, 235, 240, 69, 70, 236, + 111, 69, 70, 235, 161, 69, 70, 236, 32, 69, 70, 235, 224, 69, 70, 236, + 95, 69, 70, 235, 192, 69, 70, 236, 63, 69, 70, 235, 255, 69, 70, 236, + 126, 69, 70, 235, 153, 69, 70, 236, 24, 69, 70, 235, 216, 69, 70, 236, + 87, 69, 70, 235, 184, 69, 70, 236, 55, 69, 70, 235, 247, 69, 70, 236, + 118, 69, 70, 235, 168, 69, 70, 236, 39, 69, 70, 235, 231, 69, 70, 236, + 102, 69, 70, 235, 199, 69, 70, 236, 70, 69, 70, 236, 6, 69, 70, 236, 133, + 69, 70, 235, 141, 69, 70, 236, 12, 69, 70, 235, 204, 69, 70, 236, 75, 69, + 70, 235, 172, 69, 70, 236, 43, 69, 70, 235, 235, 69, 70, 236, 106, 69, + 70, 235, 156, 69, 70, 236, 27, 69, 70, 235, 219, 69, 70, 236, 90, 69, 70, + 235, 187, 69, 70, 236, 58, 69, 70, 235, 250, 69, 70, 236, 121, 69, 70, + 235, 148, 69, 70, 236, 19, 69, 70, 235, 211, 69, 70, 236, 82, 69, 70, + 235, 179, 69, 70, 236, 50, 69, 70, 235, 242, 69, 70, 236, 113, 69, 70, + 235, 163, 69, 70, 236, 34, 69, 70, 235, 226, 69, 70, 236, 97, 69, 70, + 235, 194, 69, 70, 236, 65, 69, 70, 236, 1, 69, 70, 236, 128, 69, 70, 235, + 144, 69, 70, 236, 15, 69, 70, 235, 207, 69, 70, 236, 78, 69, 70, 235, + 175, 69, 70, 236, 46, 69, 70, 235, 238, 69, 70, 236, 109, 69, 70, 235, + 159, 69, 70, 236, 30, 69, 70, 235, 222, 69, 70, 236, 93, 69, 70, 235, + 190, 69, 70, 236, 61, 69, 70, 235, 253, 69, 70, 236, 124, 69, 70, 235, + 151, 69, 70, 236, 22, 69, 70, 235, 214, 69, 70, 236, 85, 69, 70, 235, + 182, 69, 70, 236, 53, 69, 70, 235, 245, 69, 70, 236, 116, 69, 70, 235, + 166, 69, 70, 236, 37, 69, 70, 235, 229, 69, 70, 236, 100, 69, 70, 235, + 197, 69, 70, 236, 68, 69, 70, 236, 4, 69, 70, 236, 131, 69, 70, 235, 142, + 69, 70, 236, 13, 69, 70, 235, 205, 69, 70, 236, 76, 69, 70, 235, 173, 69, + 70, 236, 44, 69, 70, 235, 236, 69, 70, 236, 107, 69, 70, 235, 157, 69, + 70, 236, 28, 69, 70, 235, 220, 69, 70, 236, 91, 69, 70, 235, 188, 69, 70, + 236, 59, 69, 70, 235, 251, 69, 70, 236, 122, 69, 70, 235, 149, 69, 70, + 236, 20, 69, 70, 235, 212, 69, 70, 236, 83, 69, 70, 235, 180, 69, 70, + 236, 51, 69, 70, 235, 243, 69, 70, 236, 114, 69, 70, 235, 164, 69, 70, + 236, 35, 69, 70, 235, 227, 69, 70, 236, 98, 69, 70, 235, 195, 69, 70, + 236, 66, 69, 70, 236, 2, 69, 70, 236, 129, 69, 70, 235, 145, 69, 70, 236, + 16, 69, 70, 235, 208, 69, 70, 236, 79, 69, 70, 235, 176, 69, 70, 236, 47, + 69, 70, 235, 239, 69, 70, 236, 110, 69, 70, 235, 160, 69, 70, 236, 31, + 69, 70, 235, 223, 69, 70, 236, 94, 69, 70, 235, 191, 69, 70, 236, 62, 69, + 70, 235, 254, 69, 70, 236, 125, 69, 70, 235, 152, 69, 70, 236, 23, 69, + 70, 235, 215, 69, 70, 236, 86, 69, 70, 235, 183, 69, 70, 236, 54, 69, 70, + 235, 246, 69, 70, 236, 117, 69, 70, 235, 167, 69, 70, 236, 38, 69, 70, + 235, 230, 69, 70, 236, 101, 69, 70, 235, 198, 69, 70, 236, 69, 69, 70, + 236, 5, 69, 70, 236, 132, 96, 197, 13, 64, 4, 81, 106, 96, 197, 13, 64, + 4, 55, 81, 106, 118, 55, 64, 4, 81, 106, 96, 55, 64, 4, 81, 106, 45, 50, + 55, 64, 4, 81, 106, 96, 197, 13, 64, 232, 100, 164, 118, 55, 64, 232, + 100, 164, 96, 55, 64, 232, 100, 164, 235, 121, 64, 4, 228, 243, 106, 196, + 66, 64, 4, 228, 243, 106, 196, 66, 197, 225, 57, 235, 121, 197, 225, 57, + 118, 55, 237, 218, 57, 96, 55, 237, 218, 57, 118, 197, 225, 237, 218, 57, + 96, 197, 225, 237, 218, 57, 96, 197, 13, 197, 225, 237, 218, 57, 96, 64, + 4, 235, 140, 201, 81, 196, 66, 64, 119, 164, 235, 121, 64, 119, 164, 96, + 64, 4, 199, 216, 4, 81, 106, 96, 64, 4, 199, 216, 4, 55, 81, 106, 96, + 197, 13, 64, 4, 199, 215, 96, 197, 13, 64, 4, 199, 216, 4, 81, 106, 96, + 197, 13, 64, 4, 199, 216, 4, 55, 81, 106, 118, 250, 239, 96, 250, 239, + 118, 55, 250, 239, 96, 55, 250, 239, 118, 64, 119, 62, 237, 34, 96, 64, + 119, 62, 237, 34, 118, 64, 232, 100, 249, 90, 119, 62, 237, 34, 96, 64, + 232, 100, 249, 90, 119, 62, 237, 34, 186, 193, 105, 23, 202, 3, 234, 206, + 57, 186, 234, 206, 23, 202, 3, 193, 105, 57, 186, 193, 105, 64, 4, 102, + 186, 234, 206, 64, 4, 102, 202, 3, 234, 206, 64, 4, 102, 202, 3, 193, + 105, 64, 4, 102, 186, 193, 105, 64, 23, 186, 234, 206, 57, 186, 234, 206, + 64, 23, 202, 3, 234, 206, 57, 202, 3, 234, 206, 64, 23, 202, 3, 193, 105, + 57, 202, 3, 193, 105, 64, 23, 186, 193, 105, 57, 206, 181, 237, 41, 238, + 212, 233, 85, 237, 40, 233, 85, 237, 41, 238, 212, 206, 181, 237, 40, + 202, 3, 234, 206, 64, 238, 212, 186, 234, 206, 57, 186, 234, 206, 64, + 238, 212, 202, 3, 234, 206, 57, 233, 85, 237, 41, 238, 212, 186, 234, + 206, 57, 206, 181, 237, 41, 238, 212, 202, 3, 234, 206, 57, 186, 234, + 206, 64, 238, 212, 186, 193, 105, 57, 186, 193, 105, 64, 238, 212, 186, + 234, 206, 57, 193, 139, 64, 209, 60, 236, 233, 179, 64, 209, 60, 96, 199, + 25, 238, 163, 196, 65, 64, 209, 60, 96, 199, 25, 238, 163, 235, 120, 64, + 209, 60, 235, 121, 199, 25, 238, 163, 219, 216, 64, 209, 60, 235, 121, + 199, 25, 238, 163, 206, 198, 206, 201, 251, 19, 242, 223, 57, 219, 219, + 251, 19, 251, 87, 57, 198, 54, 251, 19, 251, 87, 57, 248, 79, 251, 19, + 251, 87, 57, 198, 54, 251, 19, 242, 223, 64, 4, 216, 36, 198, 54, 251, + 19, 251, 87, 64, 4, 209, 83, 110, 50, 204, 28, 242, 223, 57, 110, 45, + 204, 28, 251, 87, 57, 251, 87, 242, 221, 243, 13, 57, 242, 223, 242, 221, + 243, 13, 57, 96, 64, 93, 203, 41, 118, 57, 118, 64, 93, 203, 41, 96, 57, + 203, 41, 96, 64, 93, 118, 57, 96, 64, 4, 108, 60, 118, 64, 4, 108, 60, + 96, 64, 198, 216, 192, 235, 45, 50, 64, 198, 216, 2, 243, 12, 196, 66, + 197, 13, 64, 232, 100, 2, 243, 12, 45, 182, 133, 50, 182, 144, 230, 14, + 45, 182, 144, 50, 182, 133, 230, 14, 133, 182, 50, 144, 182, 45, 230, 14, + 133, 182, 45, 144, 182, 50, 230, 14, 45, 182, 133, 50, 182, 133, 230, 14, + 133, 182, 50, 144, 182, 50, 230, 14, 45, 182, 144, 50, 182, 144, 230, 14, + 133, 182, 45, 144, 182, 45, 230, 14, 118, 230, 15, 4, 182, 133, 119, 164, + 96, 230, 15, 4, 182, 133, 119, 164, 196, 66, 230, 15, 4, 182, 50, 119, + 164, 235, 121, 230, 15, 4, 182, 50, 119, 164, 118, 230, 15, 4, 182, 144, + 119, 164, 96, 230, 15, 4, 182, 144, 119, 164, 196, 66, 230, 15, 4, 182, + 45, 119, 164, 235, 121, 230, 15, 4, 182, 45, 119, 164, 118, 230, 15, 4, + 182, 133, 232, 100, 164, 96, 230, 15, 4, 182, 133, 232, 100, 164, 196, + 66, 230, 15, 4, 182, 50, 232, 100, 164, 235, 121, 230, 15, 4, 182, 50, + 232, 100, 164, 118, 230, 15, 4, 182, 144, 232, 100, 164, 96, 230, 15, 4, + 182, 144, 232, 100, 164, 196, 66, 230, 15, 4, 182, 45, 232, 100, 164, + 235, 121, 230, 15, 4, 182, 45, 232, 100, 164, 118, 230, 15, 4, 182, 133, + 93, 118, 230, 15, 4, 182, 235, 125, 196, 66, 230, 15, 4, 182, 45, 248, + 218, 196, 66, 230, 15, 4, 182, 179, 96, 230, 15, 4, 182, 133, 93, 96, + 230, 15, 4, 182, 235, 125, 235, 121, 230, 15, 4, 182, 45, 248, 218, 235, + 121, 230, 15, 4, 182, 179, 118, 230, 15, 4, 182, 133, 93, 96, 230, 15, 4, + 182, 196, 77, 118, 230, 15, 4, 182, 144, 93, 96, 230, 15, 4, 182, 235, + 125, 96, 230, 15, 4, 182, 133, 93, 118, 230, 15, 4, 182, 196, 77, 96, + 230, 15, 4, 182, 144, 93, 118, 230, 15, 4, 182, 235, 125, 118, 230, 15, + 4, 182, 133, 93, 180, 237, 217, 118, 230, 15, 4, 182, 144, 248, 235, 180, + 237, 217, 96, 230, 15, 4, 182, 133, 93, 180, 237, 217, 96, 230, 15, 4, + 182, 144, 248, 235, 180, 237, 217, 196, 66, 230, 15, 4, 182, 45, 248, + 218, 235, 121, 230, 15, 4, 182, 179, 235, 121, 230, 15, 4, 182, 45, 248, + 218, 196, 66, 230, 15, 4, 182, 179, 50, 55, 64, 4, 206, 114, 229, 237, + 234, 45, 3, 93, 96, 57, 198, 153, 211, 69, 93, 96, 57, 118, 64, 93, 198, + 153, 211, 68, 96, 64, 93, 198, 153, 211, 68, 96, 64, 93, 251, 167, 234, + 47, 159, 219, 182, 93, 118, 57, 118, 64, 198, 216, 219, 181, 230, 206, + 93, 96, 57, 200, 230, 93, 96, 57, 118, 64, 198, 216, 200, 229, 200, 181, + 93, 118, 57, 45, 232, 239, 199, 215, 50, 232, 239, 199, 215, 133, 232, + 239, 199, 215, 144, 232, 239, 199, 215, 197, 225, 81, 249, 90, 237, 114, + 191, 167, 213, 12, 201, 202, 191, 167, 213, 12, 196, 255, 242, 85, 45, + 63, 238, 173, 248, 55, 50, 63, 238, 173, 248, 55, 45, 63, 210, 115, 50, + 63, 210, 115, 191, 167, 213, 12, 45, 223, 180, 248, 55, 191, 167, 213, + 12, 50, 223, 180, 248, 55, 191, 167, 213, 12, 45, 248, 168, 248, 55, 191, + 167, 213, 12, 50, 248, 168, 248, 55, 45, 51, 248, 56, 4, 196, 103, 50, + 51, 248, 56, 4, 196, 103, 45, 51, 248, 56, 4, 198, 183, 223, 165, 198, + 54, 239, 3, 50, 51, 248, 56, 4, 198, 183, 223, 165, 248, 79, 239, 3, 45, + 51, 248, 56, 4, 198, 183, 223, 165, 248, 79, 239, 3, 50, 51, 248, 56, 4, + 198, 183, 223, 165, 198, 54, 239, 3, 45, 251, 118, 248, 56, 4, 236, 142, + 50, 251, 118, 248, 56, 4, 236, 142, 45, 251, 19, 219, 182, 248, 55, 50, + 251, 19, 230, 206, 248, 55, 55, 45, 251, 19, 230, 206, 248, 55, 55, 50, + 251, 19, 219, 182, 248, 55, 45, 62, 198, 42, 203, 104, 248, 55, 50, 62, + 198, 42, 203, 104, 248, 55, 235, 140, 233, 41, 81, 191, 21, 219, 114, + 216, 228, 251, 118, 211, 71, 219, 226, 50, 251, 118, 195, 168, 4, 201, + 191, 216, 228, 50, 251, 118, 4, 236, 142, 251, 118, 4, 206, 10, 223, 119, + 252, 49, 251, 117, 201, 226, 251, 118, 211, 71, 219, 226, 201, 226, 251, + 118, 211, 71, 196, 77, 154, 251, 117, 207, 19, 251, 117, 251, 118, 4, + 196, 103, 207, 19, 251, 118, 4, 196, 103, 211, 174, 251, 118, 211, 71, + 196, 77, 211, 174, 251, 118, 211, 71, 235, 125, 216, 228, 251, 118, 4, + 211, 79, 250, 253, 234, 93, 223, 165, 64, 209, 60, 133, 23, 179, 216, + 228, 251, 118, 4, 211, 79, 250, 253, 234, 93, 223, 165, 64, 209, 60, 133, + 23, 219, 226, 216, 228, 251, 118, 4, 211, 79, 250, 253, 234, 93, 223, + 165, 64, 209, 60, 144, 23, 179, 216, 228, 251, 118, 4, 211, 79, 250, 253, + 234, 93, 223, 165, 64, 209, 60, 144, 23, 219, 226, 216, 228, 251, 118, 4, + 211, 79, 250, 253, 234, 93, 223, 165, 64, 209, 60, 50, 23, 196, 77, 216, + 228, 251, 118, 4, 211, 79, 250, 253, 234, 93, 223, 165, 64, 209, 60, 45, + 23, 196, 77, 216, 228, 251, 118, 4, 211, 79, 250, 253, 234, 93, 223, 165, + 64, 209, 60, 50, 23, 235, 125, 216, 228, 251, 118, 4, 211, 79, 250, 253, + 234, 93, 223, 165, 64, 209, 60, 45, 23, 235, 125, 207, 19, 234, 107, 203, + 253, 234, 107, 203, 254, 4, 211, 8, 234, 107, 203, 254, 4, 2, 243, 13, + 58, 234, 107, 203, 254, 4, 50, 64, 58, 234, 107, 203, 254, 4, 45, 64, 58, + 243, 13, 4, 228, 243, 164, 47, 81, 164, 47, 210, 120, 47, 207, 20, 202, + 24, 47, 210, 0, 243, 13, 236, 208, 247, 207, 228, 243, 249, 90, 23, 198, + 54, 132, 236, 208, 247, 207, 81, 164, 243, 13, 4, 200, 183, 192, 235, 47, + 251, 85, 236, 202, 56, 133, 64, 198, 216, 243, 12, 47, 63, 247, 250, 47, + 247, 250, 47, 219, 181, 47, 230, 205, 243, 13, 4, 2, 243, 13, 119, 199, + 34, 179, 243, 13, 4, 105, 228, 243, 201, 17, 119, 199, 34, 179, 112, 206, + 181, 237, 41, 202, 98, 112, 233, 85, 237, 41, 202, 98, 112, 250, 195, + 112, 2, 243, 12, 112, 201, 191, 105, 222, 200, 201, 189, 197, 242, 4, 75, + 58, 197, 242, 4, 196, 103, 206, 10, 223, 165, 197, 241, 197, 242, 4, 204, + 5, 250, 185, 248, 78, 50, 197, 242, 93, 45, 197, 241, 45, 197, 242, 248, + 218, 81, 164, 81, 249, 90, 248, 218, 50, 197, 241, 248, 66, 4, 45, 132, + 248, 141, 248, 66, 4, 50, 132, 248, 141, 62, 248, 65, 25, 4, 45, 132, + 248, 141, 25, 4, 50, 132, 248, 141, 63, 228, 176, 62, 228, 176, 45, 193, + 72, 233, 41, 50, 193, 72, 233, 41, 45, 55, 193, 72, 233, 41, 50, 55, 193, + 72, 233, 41, 223, 157, 223, 141, 198, 179, 139, 223, 141, 223, 142, 214, + 110, 4, 81, 164, 235, 134, 215, 133, 51, 4, 239, 27, 211, 13, 223, 154, + 250, 221, 202, 255, 208, 202, 234, 45, 3, 23, 202, 100, 210, 120, 234, + 45, 3, 23, 202, 100, 210, 121, 4, 198, 153, 58, 228, 19, 119, 23, 202, + 100, 210, 120, 231, 16, 201, 102, 199, 22, 235, 124, 197, 242, 4, 45, + 132, 248, 141, 235, 124, 197, 242, 4, 50, 132, 248, 141, 62, 237, 35, 4, + 144, 57, 62, 218, 234, 63, 243, 13, 4, 144, 57, 62, 243, 13, 4, 144, 57, + 234, 27, 63, 201, 191, 234, 27, 62, 201, 191, 234, 27, 63, 237, 34, 234, + 27, 62, 237, 34, 234, 27, 63, 243, 12, 234, 27, 62, 243, 12, 206, 52, + 207, 20, 202, 25, 211, 68, 202, 25, 4, 211, 8, 207, 20, 202, 25, 4, 228, + 243, 106, 248, 177, 202, 24, 248, 177, 207, 20, 202, 24, 55, 209, 83, + 197, 225, 209, 83, 219, 221, 238, 165, 251, 118, 248, 55, 206, 204, 238, + 165, 251, 118, 248, 55, 198, 137, 216, 34, 215, 62, 47, 75, 211, 68, 215, + 62, 47, 108, 211, 68, 215, 62, 47, 25, 211, 68, 215, 62, 196, 93, 211, + 69, 4, 236, 142, 215, 62, 196, 93, 211, 69, 4, 209, 83, 215, 62, 51, 223, + 102, 211, 68, 215, 62, 51, 196, 93, 211, 68, 105, 219, 31, 23, 211, 68, + 105, 219, 31, 211, 59, 211, 68, 215, 62, 25, 211, 68, 215, 238, 105, 200, + 204, 200, 202, 4, 223, 115, 208, 28, 223, 116, 211, 68, 232, 248, 210, + 109, 223, 115, 223, 116, 4, 55, 106, 223, 116, 250, 145, 4, 202, 98, 243, + 5, 232, 78, 251, 87, 223, 113, 219, 115, 223, 114, 4, 207, 93, 210, 88, + 250, 247, 209, 54, 219, 115, 223, 114, 4, 204, 28, 210, 88, 250, 247, + 209, 54, 219, 115, 223, 114, 213, 14, 223, 159, 199, 34, 209, 54, 223, + 116, 250, 247, 42, 209, 64, 211, 68, 208, 21, 223, 116, 211, 68, 223, + 116, 4, 118, 64, 4, 102, 223, 116, 4, 25, 56, 223, 116, 4, 223, 101, 223, + 116, 4, 196, 92, 223, 116, 4, 211, 8, 223, 116, 4, 196, 103, 222, 201, + 220, 15, 45, 197, 242, 211, 68, 191, 167, 213, 12, 205, 93, 239, 64, 191, + 167, 213, 12, 205, 93, 209, 128, 191, 167, 213, 12, 205, 93, 208, 197, + 108, 3, 4, 2, 243, 13, 58, 108, 3, 4, 243, 4, 252, 63, 58, 108, 3, 4, + 198, 153, 58, 108, 3, 4, 75, 60, 108, 3, 4, 198, 153, 60, 108, 3, 4, 200, + 231, 109, 108, 3, 4, 62, 197, 241, 216, 37, 3, 4, 242, 77, 58, 216, 37, + 3, 4, 75, 60, 216, 37, 3, 4, 233, 85, 236, 140, 216, 37, 3, 4, 206, 181, + 236, 140, 108, 3, 223, 165, 45, 132, 243, 12, 108, 3, 223, 165, 50, 132, + 243, 12, 195, 152, 211, 59, 238, 220, 208, 202, 215, 129, 3, 4, 75, 58, + 215, 129, 3, 4, 196, 103, 204, 25, 208, 203, 4, 248, 79, 242, 220, 202, + 69, 208, 202, 215, 129, 3, 223, 165, 45, 132, 243, 12, 215, 129, 3, 223, + 165, 50, 132, 243, 12, 47, 215, 129, 3, 4, 243, 4, 252, 62, 215, 129, 3, + 223, 165, 55, 243, 12, 47, 236, 202, 56, 108, 3, 223, 165, 197, 241, 216, + 37, 3, 223, 165, 197, 241, 215, 129, 3, 223, 165, 197, 241, 223, 110, + 208, 202, 206, 199, 223, 110, 208, 202, 191, 167, 213, 12, 207, 65, 239, + 64, 251, 149, 211, 59, 239, 11, 223, 102, 4, 236, 142, 196, 93, 4, 216, + 37, 56, 196, 93, 4, 211, 8, 223, 102, 4, 211, 8, 223, 102, 4, 219, 31, + 251, 127, 196, 93, 4, 219, 31, 211, 58, 196, 93, 93, 223, 101, 223, 102, + 93, 196, 92, 196, 93, 93, 249, 90, 93, 223, 101, 223, 102, 93, 249, 90, + 93, 196, 92, 196, 93, 248, 218, 23, 222, 200, 4, 196, 92, 223, 102, 248, + 218, 23, 222, 200, 4, 223, 101, 242, 221, 196, 93, 4, 204, 4, 242, 221, + 223, 102, 4, 204, 4, 55, 51, 223, 101, 55, 51, 196, 92, 242, 221, 196, + 93, 4, 204, 5, 23, 202, 69, 208, 202, 219, 31, 23, 4, 75, 58, 219, 31, + 211, 59, 4, 75, 58, 55, 219, 31, 251, 127, 55, 219, 31, 211, 58, 105, + 223, 103, 219, 31, 251, 127, 105, 223, 103, 219, 31, 211, 58, 202, 81, + 220, 15, 211, 58, 202, 81, 220, 15, 251, 127, 219, 31, 211, 59, 211, 3, + 219, 31, 251, 127, 219, 31, 23, 4, 82, 201, 81, 219, 31, 211, 59, 4, 82, + 201, 81, 219, 31, 23, 4, 228, 243, 237, 217, 219, 31, 211, 59, 4, 228, + 243, 237, 217, 219, 31, 23, 4, 55, 211, 8, 219, 31, 23, 4, 196, 103, 219, + 31, 23, 4, 55, 196, 103, 2, 195, 149, 4, 196, 103, 219, 31, 211, 59, 4, + 55, 211, 8, 219, 31, 211, 59, 4, 55, 196, 103, 191, 167, 213, 12, 236, + 154, 251, 77, 191, 167, 213, 12, 207, 139, 251, 77, 234, 45, 3, 4, 75, + 60, 228, 19, 4, 75, 58, 197, 225, 228, 243, 249, 90, 4, 55, 81, 106, 197, + 225, 228, 243, 249, 90, 4, 197, 225, 81, 106, 198, 153, 211, 69, 4, 75, + 58, 198, 153, 211, 69, 4, 206, 181, 236, 140, 202, 181, 216, 37, 202, + 180, 239, 51, 4, 75, 58, 234, 45, 4, 250, 195, 251, 167, 234, 47, 119, 4, + 243, 4, 252, 62, 251, 42, 234, 47, 211, 59, 234, 47, 159, 234, 45, 3, 93, + 108, 56, 108, 3, 93, 234, 45, 56, 234, 45, 3, 93, 198, 153, 211, 68, 55, + 242, 86, 234, 46, 105, 239, 43, 234, 45, 202, 195, 115, 239, 43, 234, 45, + 202, 195, 234, 45, 3, 4, 105, 185, 93, 23, 105, 185, 60, 234, 38, 4, 232, + 130, 185, 58, 219, 182, 4, 243, 13, 223, 119, 230, 206, 4, 243, 13, 223, + 119, 219, 182, 4, 208, 15, 87, 58, 230, 206, 4, 208, 15, 87, 58, 219, + 182, 211, 59, 202, 100, 234, 47, 159, 230, 206, 211, 59, 202, 100, 234, + 47, 159, 219, 182, 211, 59, 202, 100, 234, 47, 119, 4, 75, 223, 119, 230, + 206, 211, 59, 202, 100, 234, 47, 119, 4, 75, 223, 119, 219, 182, 211, 59, + 202, 100, 234, 47, 119, 4, 75, 58, 230, 206, 211, 59, 202, 100, 234, 47, + 119, 4, 75, 58, 219, 182, 211, 59, 202, 100, 234, 47, 119, 4, 75, 93, + 179, 230, 206, 211, 59, 202, 100, 234, 47, 119, 4, 75, 93, 219, 226, 219, + 182, 211, 59, 251, 43, 230, 206, 211, 59, 251, 43, 219, 182, 23, 202, + 169, 213, 14, 234, 47, 159, 230, 206, 23, 202, 169, 213, 14, 234, 47, + 159, 219, 182, 23, 213, 14, 251, 43, 230, 206, 23, 213, 14, 251, 43, 219, + 182, 93, 235, 133, 234, 47, 93, 230, 205, 230, 206, 93, 235, 133, 234, + 47, 93, 219, 181, 219, 182, 93, 202, 181, 211, 59, 234, 46, 230, 206, 93, + 202, 181, 211, 59, 234, 46, 219, 182, 93, 202, 181, 93, 230, 205, 230, + 206, 93, 202, 181, 93, 219, 181, 219, 182, 93, 230, 206, 93, 235, 133, + 234, 46, 230, 206, 93, 219, 182, 93, 235, 133, 234, 46, 219, 182, 93, + 202, 100, 234, 47, 93, 230, 206, 93, 202, 100, 234, 46, 230, 206, 93, + 202, 100, 234, 47, 93, 219, 182, 93, 202, 100, 234, 46, 202, 100, 234, + 47, 119, 211, 59, 219, 181, 202, 100, 234, 47, 119, 211, 59, 230, 205, + 202, 100, 234, 47, 119, 211, 59, 219, 182, 4, 75, 223, 119, 202, 100, + 234, 47, 119, 211, 59, 230, 206, 4, 75, 223, 119, 235, 133, 234, 47, 119, + 211, 59, 219, 181, 235, 133, 234, 47, 119, 211, 59, 230, 205, 235, 133, + 202, 100, 234, 47, 119, 211, 59, 219, 181, 235, 133, 202, 100, 234, 47, + 119, 211, 59, 230, 205, 202, 181, 211, 59, 219, 181, 202, 181, 211, 59, + 230, 205, 202, 181, 93, 219, 182, 93, 234, 45, 56, 202, 181, 93, 230, + 206, 93, 234, 45, 56, 55, 214, 90, 219, 181, 55, 214, 90, 230, 205, 55, + 214, 90, 219, 182, 4, 196, 103, 230, 206, 211, 3, 219, 181, 230, 206, + 248, 218, 219, 181, 219, 182, 242, 221, 247, 207, 238, 166, 230, 206, + 242, 221, 247, 207, 238, 166, 219, 182, 242, 221, 247, 207, 238, 167, 93, + 202, 100, 234, 46, 230, 206, 242, 221, 247, 207, 238, 167, 93, 202, 100, + 234, 46, 202, 70, 199, 38, 220, 13, 199, 38, 202, 70, 199, 39, 211, 59, + 234, 47, 159, 220, 13, 199, 39, 211, 59, 234, 47, 159, 234, 45, 3, 4, + 247, 243, 58, 208, 234, 93, 202, 169, 234, 45, 56, 200, 221, 93, 202, + 169, 234, 45, 56, 208, 234, 93, 202, 169, 213, 14, 234, 47, 159, 200, + 221, 93, 202, 169, 213, 14, 234, 47, 159, 208, 234, 93, 234, 45, 56, 200, + 221, 93, 234, 45, 56, 208, 234, 93, 213, 14, 234, 47, 159, 200, 221, 93, + 213, 14, 234, 47, 159, 208, 234, 93, 251, 167, 234, 47, 159, 200, 221, + 93, 251, 167, 234, 47, 159, 208, 234, 93, 213, 14, 251, 167, 234, 47, + 159, 200, 221, 93, 213, 14, 251, 167, 234, 47, 159, 55, 208, 233, 55, + 200, 220, 200, 230, 4, 236, 142, 200, 181, 4, 236, 142, 200, 230, 4, 108, + 3, 60, 200, 181, 4, 108, 3, 60, 200, 230, 4, 215, 129, 3, 60, 200, 181, + 4, 215, 129, 3, 60, 200, 230, 79, 211, 59, 234, 47, 119, 4, 75, 58, 200, + 181, 79, 211, 59, 234, 47, 119, 4, 75, 58, 200, 230, 79, 93, 234, 45, 56, + 200, 181, 79, 93, 234, 45, 56, 200, 230, 79, 93, 198, 153, 211, 68, 200, + 181, 79, 93, 198, 153, 211, 68, 200, 230, 79, 93, 251, 167, 234, 47, 159, + 200, 181, 79, 93, 251, 167, 234, 47, 159, 200, 230, 79, 93, 213, 14, 234, + 47, 159, 200, 181, 79, 93, 213, 14, 234, 47, 159, 51, 45, 211, 79, 111, + 211, 68, 51, 50, 211, 79, 111, 211, 68, 242, 221, 200, 229, 242, 221, + 200, 180, 242, 221, 200, 230, 211, 59, 234, 47, 159, 242, 221, 200, 181, + 211, 59, 234, 47, 159, 200, 230, 93, 200, 180, 200, 181, 93, 200, 229, + 200, 230, 93, 200, 229, 200, 181, 93, 200, 180, 200, 181, 248, 218, 200, + 229, 200, 181, 248, 218, 23, 222, 200, 247, 207, 237, 218, 4, 200, 229, + 234, 134, 79, 211, 71, 235, 120, 209, 118, 4, 199, 122, 198, 53, 198, 7, + 223, 101, 232, 149, 213, 29, 203, 41, 45, 199, 228, 203, 41, 144, 199, + 228, 203, 41, 133, 199, 228, 210, 1, 4, 206, 9, 81, 249, 90, 197, 225, + 50, 197, 57, 55, 81, 249, 90, 45, 197, 57, 81, 249, 90, 55, 45, 197, 57, + 55, 81, 249, 90, 55, 45, 197, 57, 180, 237, 218, 232, 100, 45, 216, 193, + 79, 55, 195, 135, 203, 41, 144, 199, 229, 4, 211, 8, 203, 41, 133, 199, + 229, 4, 196, 103, 203, 41, 133, 199, 229, 93, 203, 41, 144, 199, 228, 55, + 144, 199, 228, 55, 133, 199, 228, 55, 201, 29, 213, 14, 56, 207, 19, 55, + 201, 29, 213, 14, 56, 236, 166, 213, 14, 236, 210, 4, 207, 19, 214, 109, + 202, 98, 81, 219, 115, 4, 243, 13, 58, 81, 219, 115, 4, 243, 13, 60, 144, + 199, 229, 4, 243, 13, 60, 210, 121, 4, 228, 243, 106, 210, 121, 4, 198, + 153, 211, 68, 197, 225, 81, 249, 90, 248, 170, 207, 66, 197, 225, 81, + 249, 90, 4, 228, 243, 106, 197, 225, 242, 86, 211, 68, 197, 225, 214, 90, + 219, 181, 197, 225, 214, 90, 230, 205, 235, 133, 202, 100, 219, 182, 211, + 59, 234, 47, 159, 235, 133, 202, 100, 230, 206, 211, 59, 234, 47, 159, + 197, 225, 202, 25, 248, 170, 207, 66, 220, 15, 197, 225, 81, 249, 90, + 211, 68, 55, 202, 25, 211, 68, 63, 81, 164, 215, 62, 63, 81, 164, 186, + 234, 206, 63, 57, 186, 193, 105, 63, 57, 202, 3, 234, 206, 63, 57, 202, + 3, 193, 105, 63, 57, 45, 50, 63, 57, 118, 62, 57, 196, 66, 62, 57, 235, + 121, 62, 57, 186, 234, 206, 62, 57, 186, 193, 105, 62, 57, 202, 3, 234, + 206, 62, 57, 202, 3, 193, 105, 62, 57, 45, 50, 62, 57, 133, 144, 62, 57, + 96, 64, 4, 198, 136, 235, 120, 96, 64, 4, 198, 136, 196, 65, 118, 64, 4, + 198, 136, 235, 120, 118, 64, 4, 198, 136, 196, 65, 51, 4, 198, 54, 132, + 248, 141, 51, 4, 248, 79, 132, 248, 141, 51, 4, 116, 50, 237, 41, 132, + 248, 141, 51, 4, 110, 45, 237, 41, 132, 248, 141, 237, 35, 4, 45, 132, + 248, 141, 237, 35, 4, 50, 132, 248, 141, 237, 35, 4, 198, 54, 132, 248, + 141, 237, 35, 4, 248, 79, 132, 248, 141, 235, 140, 201, 191, 62, 220, 15, + 201, 191, 63, 220, 15, 201, 191, 62, 195, 83, 2, 201, 191, 63, 195, 83, + 2, 201, 191, 62, 210, 26, 63, 210, 26, 63, 229, 184, 62, 229, 184, 228, + 243, 62, 229, 184, 62, 220, 15, 243, 12, 62, 216, 215, 237, 34, 63, 216, + 215, 237, 34, 62, 216, 215, 218, 234, 63, 216, 215, 218, 234, 62, 2, 237, + 34, 62, 2, 218, 234, 63, 2, 218, 234, 62, 228, 243, 234, 123, 63, 228, + 243, 234, 123, 62, 81, 234, 123, 63, 81, 234, 123, 45, 64, 4, 2, 243, 12, + 115, 118, 250, 233, 45, 64, 4, 47, 209, 83, 180, 118, 201, 184, 57, 118, + 197, 13, 64, 4, 81, 106, 118, 197, 13, 64, 4, 55, 81, 106, 118, 197, 13, + 64, 232, 100, 164, 118, 197, 13, 197, 225, 237, 218, 57, 118, 64, 4, 235, + 140, 201, 81, 118, 64, 4, 199, 216, 4, 81, 106, 118, 64, 4, 199, 216, 4, + 55, 81, 106, 118, 197, 13, 64, 4, 199, 215, 118, 197, 13, 64, 4, 199, + 216, 4, 81, 106, 118, 197, 13, 64, 4, 199, 216, 4, 55, 81, 106, 118, 64, + 198, 216, 192, 235, 193, 139, 64, 209, 60, 236, 233, 219, 226, 234, 45, + 3, 93, 118, 57, 207, 20, 198, 153, 211, 69, 93, 118, 57, 118, 64, 93, + 207, 20, 251, 167, 234, 47, 159, 96, 64, 198, 216, 230, 205, 96, 64, 198, + 216, 200, 180, 118, 208, 28, 57, 96, 208, 28, 57, 207, 20, 198, 153, 211, + 69, 93, 96, 57, 96, 64, 93, 207, 20, 251, 167, 234, 47, 159, 198, 153, + 211, 69, 93, 118, 57, 118, 64, 93, 251, 167, 234, 47, 159, 118, 64, 93, + 207, 20, 198, 153, 211, 68, 96, 64, 93, 207, 20, 198, 153, 211, 68, 235, + 121, 197, 240, 191, 21, 57, 203, 41, 202, 100, 186, 57, 203, 41, 249, + 145, 202, 3, 57, 63, 216, 215, 201, 103, 62, 2, 201, 103, 63, 2, 201, + 103, 62, 206, 204, 210, 26, 63, 206, 204, 210, 26, 88, 220, 15, 243, 12, + 88, 211, 10, 4, 211, 10, 223, 119, 88, 243, 13, 4, 243, 13, 223, 119, 88, + 243, 12, 88, 47, 205, 155, 202, 100, 186, 64, 4, 228, 252, 229, 237, 249, + 145, 202, 3, 64, 4, 228, 252, 199, 215, 202, 100, 186, 64, 4, 228, 243, + 199, 215, 249, 145, 202, 3, 64, 4, 228, 243, 199, 215, 248, 226, 64, 209, + 60, 235, 121, 199, 25, 186, 234, 205, 203, 41, 248, 226, 64, 209, 60, + 235, 121, 199, 25, 186, 234, 205, 118, 197, 240, 57, 196, 66, 197, 240, + 57, 96, 197, 240, 57, 235, 121, 197, 240, 57, 45, 50, 197, 240, 57, 133, + 144, 197, 240, 57, 186, 193, 105, 197, 240, 57, 186, 234, 206, 197, 240, + 57, 202, 3, 234, 206, 197, 240, 57, 202, 3, 193, 105, 197, 240, 57, 118, + 197, 240, 237, 216, 57, 196, 66, 197, 240, 237, 216, 57, 96, 197, 240, + 237, 216, 57, 235, 121, 197, 240, 237, 216, 57, 242, 223, 197, 240, 211, + 79, 243, 13, 57, 251, 87, 197, 240, 211, 79, 243, 13, 57, 118, 197, 240, + 64, 119, 164, 196, 66, 197, 240, 64, 119, 164, 96, 197, 240, 64, 119, + 164, 235, 121, 197, 240, 64, 119, 164, 186, 193, 105, 197, 240, 64, 119, + 164, 186, 234, 206, 197, 240, 64, 119, 164, 202, 3, 234, 206, 197, 240, + 64, 119, 164, 202, 3, 193, 105, 197, 240, 64, 119, 164, 118, 197, 240, + 64, 4, 55, 228, 243, 106, 196, 66, 197, 240, 64, 4, 55, 228, 243, 106, + 96, 197, 240, 64, 4, 55, 228, 243, 106, 235, 121, 197, 240, 64, 4, 55, + 228, 243, 106, 228, 243, 199, 237, 221, 224, 81, 199, 237, 221, 224, 118, + 197, 240, 64, 139, 96, 197, 240, 57, 196, 66, 197, 240, 64, 118, 79, 235, + 121, 197, 240, 57, 96, 197, 240, 64, 139, 118, 197, 240, 57, 235, 121, + 197, 240, 64, 118, 79, 196, 66, 197, 240, 57, 118, 197, 240, 210, 198, + 250, 233, 196, 66, 197, 240, 210, 198, 250, 233, 96, 197, 240, 210, 198, + 250, 233, 235, 121, 197, 240, 210, 198, 250, 233, 118, 62, 47, 63, 57, + 196, 66, 62, 47, 63, 57, 96, 62, 47, 63, 57, 235, 121, 62, 47, 63, 57, + 251, 87, 197, 240, 50, 196, 221, 57, 251, 87, 197, 240, 248, 79, 196, + 221, 57, 251, 87, 197, 240, 45, 196, 221, 57, 251, 87, 197, 240, 198, 54, + 196, 221, 57, 207, 24, 219, 226, 207, 24, 179, 214, 79, 219, 226, 214, + 79, 179, 232, 130, 239, 4, 250, 234, 243, 8, 251, 86, 96, 62, 57, 16, 40, + 196, 255, 42, 234, 135, 198, 225, 198, 52, 118, 234, 39, 250, 237, 198, + 225, 206, 205, 196, 66, 234, 39, 250, 237, 198, 225, 198, 52, 96, 234, + 39, 250, 237, 198, 225, 219, 222, 235, 121, 234, 39, 250, 237, 62, 118, + 234, 39, 250, 237, 62, 196, 66, 234, 39, 250, 237, 62, 96, 234, 39, 250, + 237, 62, 235, 121, 234, 39, 250, 237, 235, 121, 197, 240, 64, 4, 180, + 198, 136, 219, 216, 235, 121, 197, 240, 64, 4, 180, 198, 136, 206, 198, + 196, 66, 197, 240, 64, 4, 180, 198, 136, 219, 216, 196, 66, 197, 240, 64, + 4, 180, 198, 136, 206, 198, 118, 197, 240, 64, 4, 180, 198, 136, 196, 65, + 96, 197, 240, 64, 4, 180, 198, 136, 196, 65, 118, 197, 240, 64, 4, 180, + 198, 136, 235, 120, 96, 197, 240, 64, 4, 180, 198, 136, 235, 120, 62, + 238, 165, 235, 121, 23, 118, 57, 62, 238, 165, 235, 121, 23, 96, 57, 62, + 238, 165, 196, 66, 23, 118, 57, 62, 238, 165, 196, 66, 23, 96, 57, 62, + 238, 165, 118, 23, 196, 66, 57, 62, 238, 165, 96, 23, 196, 66, 57, 62, + 238, 165, 118, 23, 235, 121, 57, 62, 238, 165, 96, 23, 235, 121, 57, 206, + 249, 64, 144, 219, 226, 206, 249, 64, 144, 179, 206, 249, 64, 133, 219, + 226, 206, 249, 64, 133, 179, 206, 249, 64, 45, 196, 77, 206, 249, 64, 50, + 196, 77, 206, 249, 64, 45, 235, 125, 206, 249, 64, 50, 235, 125, 196, 66, + 63, 64, 232, 100, 249, 90, 4, 228, 243, 164, 133, 250, 238, 223, 165, 42, + 207, 95, 248, 64, 211, 3, 63, 201, 189, 211, 3, 63, 23, 62, 201, 189, + 211, 3, 62, 201, 189, 249, 109, 111, 4, 156, 192, 235, 47, 192, 235, 47, + 28, 192, 235, 62, 51, 247, 21, 62, 237, 35, 247, 21, 154, 62, 210, 26, + 228, 243, 62, 211, 162, 62, 211, 162, 62, 216, 215, 196, 76, 197, 242, + 247, 21, 62, 216, 215, 235, 124, 197, 242, 247, 21, 62, 216, 215, 219, + 221, 197, 242, 247, 21, 62, 216, 215, 206, 204, 197, 242, 247, 21, 214, + 97, 232, 148, 109, 198, 54, 132, 62, 243, 12, 248, 79, 132, 62, 243, 12, + 156, 232, 130, 209, 62, 62, 238, 161, 206, 123, 156, 232, 130, 209, 62, + 62, 238, 161, 63, 232, 130, 209, 62, 238, 161, 206, 123, 63, 232, 130, + 209, 62, 238, 161, 51, 209, 27, 223, 146, 196, 107, 56, 230, 189, 77, + 209, 80, 232, 148, 109, 209, 80, 232, 148, 138, 209, 80, 232, 148, 134, + 209, 80, 232, 148, 150, 198, 9, 208, 187, 250, 191, 228, 93, 209, 198, + 214, 93, 63, 215, 208, 204, 34, 62, 237, 35, 211, 107, 238, 219, 197, + 202, 156, 215, 208, 250, 229, 238, 181, 230, 90, 191, 75, 221, 4, 251, + 55, 252, 34, 193, 247, 209, 28, 45, 132, 62, 201, 103, 50, 132, 62, 201, + 103, 201, 104, 4, 45, 132, 248, 141, 201, 104, 4, 50, 132, 248, 141, 118, + 197, 13, 64, 4, 197, 242, 250, 235, 196, 66, 197, 13, 64, 4, 197, 242, + 250, 235, 96, 197, 13, 64, 4, 197, 242, 250, 235, 235, 121, 197, 13, 64, + 4, 197, 242, 250, 235, 234, 29, 232, 148, 107, 234, 29, 232, 148, 109, + 205, 52, 206, 32, 250, 190, 16, 195, 52, 206, 32, 250, 190, 16, 213, 0, + 206, 32, 250, 190, 16, 208, 3, 206, 32, 250, 190, 16, 248, 165, 206, 32, + 250, 190, 16, 204, 17, 206, 32, 250, 190, 16, 198, 0, 234, 45, 3, 4, 223, + 142, 60, 196, 89, 113, 204, 13, 113, 235, 130, 113, 210, 98, 113, 207, + 19, 50, 251, 117, 229, 205, 210, 80, 113, 135, 6, 1, 250, 124, 135, 6, 1, + 247, 254, 135, 6, 1, 195, 151, 135, 6, 1, 231, 20, 135, 6, 1, 236, 171, + 135, 6, 1, 192, 49, 135, 6, 1, 191, 55, 135, 6, 1, 235, 32, 135, 6, 1, + 191, 82, 135, 6, 1, 223, 41, 135, 6, 1, 89, 223, 41, 135, 6, 1, 68, 135, + 6, 1, 236, 192, 135, 6, 1, 222, 96, 135, 6, 1, 219, 77, 135, 6, 1, 215, + 68, 135, 6, 1, 214, 212, 135, 6, 1, 211, 91, 135, 6, 1, 209, 57, 135, 6, + 1, 206, 180, 135, 6, 1, 202, 78, 135, 6, 1, 197, 44, 135, 6, 1, 196, 124, + 135, 6, 1, 232, 103, 135, 6, 1, 229, 190, 135, 6, 1, 211, 22, 135, 6, 1, + 210, 65, 135, 6, 1, 203, 9, 135, 6, 1, 197, 146, 135, 6, 1, 243, 56, 135, + 6, 1, 203, 166, 135, 6, 1, 192, 58, 135, 6, 1, 192, 60, 135, 6, 1, 192, + 93, 135, 6, 1, 201, 221, 140, 135, 6, 1, 191, 225, 135, 6, 1, 2, 191, + 190, 135, 6, 1, 2, 191, 191, 4, 199, 215, 135, 6, 1, 192, 12, 135, 6, 1, + 223, 84, 2, 191, 190, 135, 6, 1, 248, 177, 191, 190, 135, 6, 1, 223, 84, + 248, 177, 191, 190, 135, 6, 1, 232, 230, 135, 6, 1, 223, 39, 135, 6, 1, + 203, 8, 135, 6, 1, 197, 215, 65, 135, 6, 1, 220, 3, 215, 68, 135, 6, 1, + 247, 75, 243, 56, 135, 2, 1, 250, 124, 135, 2, 1, 247, 254, 135, 2, 1, + 195, 151, 135, 2, 1, 231, 20, 135, 2, 1, 236, 171, 135, 2, 1, 192, 49, + 135, 2, 1, 191, 55, 135, 2, 1, 235, 32, 135, 2, 1, 191, 82, 135, 2, 1, + 223, 41, 135, 2, 1, 89, 223, 41, 135, 2, 1, 68, 135, 2, 1, 236, 192, 135, + 2, 1, 222, 96, 135, 2, 1, 219, 77, 135, 2, 1, 215, 68, 135, 2, 1, 214, + 212, 135, 2, 1, 211, 91, 135, 2, 1, 209, 57, 135, 2, 1, 206, 180, 135, 2, + 1, 202, 78, 135, 2, 1, 197, 44, 135, 2, 1, 196, 124, 135, 2, 1, 232, 103, + 135, 2, 1, 229, 190, 135, 2, 1, 211, 22, 135, 2, 1, 210, 65, 135, 2, 1, + 203, 9, 135, 2, 1, 197, 146, 135, 2, 1, 243, 56, 135, 2, 1, 203, 166, + 135, 2, 1, 192, 58, 135, 2, 1, 192, 60, 135, 2, 1, 192, 93, 135, 2, 1, + 201, 221, 140, 135, 2, 1, 191, 225, 135, 2, 1, 2, 191, 190, 135, 2, 1, 2, + 191, 191, 4, 199, 215, 135, 2, 1, 192, 12, 135, 2, 1, 223, 84, 2, 191, + 190, 135, 2, 1, 248, 177, 191, 190, 135, 2, 1, 223, 84, 248, 177, 191, + 190, 135, 2, 1, 232, 230, 135, 2, 1, 223, 39, 135, 2, 1, 203, 8, 135, 2, + 1, 197, 215, 65, 135, 2, 1, 220, 3, 215, 68, 135, 2, 1, 247, 75, 243, 56, + 8, 6, 1, 220, 145, 4, 55, 164, 8, 2, 1, 220, 145, 4, 55, 164, 8, 6, 1, + 220, 145, 4, 82, 198, 152, 8, 6, 1, 210, 239, 4, 106, 8, 6, 1, 207, 224, + 4, 199, 215, 8, 2, 1, 42, 4, 106, 8, 2, 1, 200, 44, 4, 237, 41, 106, 8, + 6, 1, 230, 119, 4, 237, 89, 8, 2, 1, 230, 119, 4, 237, 89, 8, 6, 1, 222, + 155, 4, 237, 89, 8, 2, 1, 222, 155, 4, 237, 89, 8, 6, 1, 191, 167, 4, + 237, 89, 8, 2, 1, 191, 167, 4, 237, 89, 8, 6, 1, 251, 162, 8, 6, 1, 218, + 171, 4, 102, 8, 6, 1, 154, 65, 8, 6, 1, 154, 251, 162, 8, 2, 1, 196, 13, + 4, 50, 102, 8, 6, 1, 193, 225, 4, 102, 8, 2, 1, 193, 225, 4, 102, 8, 2, + 1, 196, 13, 4, 238, 177, 8, 6, 1, 132, 230, 118, 8, 2, 1, 132, 230, 118, + 8, 2, 1, 199, 213, 209, 213, 8, 2, 1, 235, 17, 4, 213, 11, 8, 2, 1, 154, + 207, 224, 4, 199, 215, 8, 2, 1, 187, 4, 130, 206, 190, 223, 119, 8, 1, 2, + 6, 154, 71, 8, 200, 231, 2, 1, 223, 37, 52, 1, 6, 196, 12, 8, 6, 1, 206, + 10, 4, 200, 146, 199, 215, 8, 6, 1, 191, 167, 4, 200, 146, 199, 215, 94, + 6, 1, 251, 188, 94, 2, 1, 251, 188, 94, 6, 1, 195, 66, 94, 2, 1, 195, 66, + 94, 6, 1, 231, 213, 94, 2, 1, 231, 213, 94, 6, 1, 238, 1, 94, 2, 1, 238, + 1, 94, 6, 1, 234, 167, 94, 2, 1, 234, 167, 94, 6, 1, 202, 8, 94, 2, 1, + 202, 8, 94, 6, 1, 191, 95, 94, 2, 1, 191, 95, 94, 6, 1, 230, 8, 94, 2, 1, + 230, 8, 94, 6, 1, 199, 13, 94, 2, 1, 199, 13, 94, 6, 1, 228, 34, 94, 2, + 1, 228, 34, 94, 6, 1, 222, 79, 94, 2, 1, 222, 79, 94, 6, 1, 219, 254, 94, + 2, 1, 219, 254, 94, 6, 1, 216, 102, 94, 2, 1, 216, 102, 94, 6, 1, 213, + 221, 94, 2, 1, 213, 221, 94, 6, 1, 220, 250, 94, 2, 1, 220, 250, 94, 6, + 1, 74, 94, 2, 1, 74, 94, 6, 1, 209, 187, 94, 2, 1, 209, 187, 94, 6, 1, + 206, 163, 94, 2, 1, 206, 163, 94, 6, 1, 202, 184, 94, 2, 1, 202, 184, 94, + 6, 1, 199, 166, 94, 2, 1, 199, 166, 94, 6, 1, 196, 168, 94, 2, 1, 196, + 168, 94, 6, 1, 233, 25, 94, 2, 1, 233, 25, 94, 6, 1, 221, 192, 94, 2, 1, + 221, 192, 94, 6, 1, 208, 178, 94, 2, 1, 208, 178, 94, 6, 1, 211, 83, 94, + 2, 1, 211, 83, 94, 6, 1, 237, 39, 251, 194, 94, 2, 1, 237, 39, 251, 194, + 94, 6, 1, 39, 94, 251, 232, 94, 2, 1, 39, 94, 251, 232, 94, 6, 1, 238, + 200, 234, 167, 94, 2, 1, 238, 200, 234, 167, 94, 6, 1, 237, 39, 222, 79, + 94, 2, 1, 237, 39, 222, 79, 94, 6, 1, 237, 39, 213, 221, 94, 2, 1, 237, + 39, 213, 221, 94, 6, 1, 238, 200, 213, 221, 94, 2, 1, 238, 200, 213, 221, + 94, 6, 1, 39, 94, 211, 83, 94, 2, 1, 39, 94, 211, 83, 94, 6, 1, 205, 146, + 94, 2, 1, 205, 146, 94, 6, 1, 238, 216, 203, 106, 94, 2, 1, 238, 216, + 203, 106, 94, 6, 1, 39, 94, 203, 106, 94, 2, 1, 39, 94, 203, 106, 94, 6, + 1, 39, 94, 234, 14, 94, 2, 1, 39, 94, 234, 14, 94, 6, 1, 251, 214, 221, + 197, 94, 2, 1, 251, 214, 221, 197, 94, 6, 1, 237, 39, 228, 244, 94, 2, 1, + 237, 39, 228, 244, 94, 6, 1, 39, 94, 228, 244, 94, 2, 1, 39, 94, 228, + 244, 94, 6, 1, 39, 94, 140, 94, 2, 1, 39, 94, 140, 94, 6, 1, 220, 144, + 140, 94, 2, 1, 220, 144, 140, 94, 6, 1, 39, 94, 229, 211, 94, 2, 1, 39, + 94, 229, 211, 94, 6, 1, 39, 94, 230, 11, 94, 2, 1, 39, 94, 230, 11, 94, + 6, 1, 39, 94, 231, 208, 94, 2, 1, 39, 94, 231, 208, 94, 6, 1, 39, 94, + 236, 195, 94, 2, 1, 39, 94, 236, 195, 94, 6, 1, 39, 94, 203, 72, 94, 2, + 1, 39, 94, 203, 72, 94, 6, 1, 39, 212, 147, 203, 72, 94, 2, 1, 39, 212, + 147, 203, 72, 94, 6, 1, 39, 212, 147, 214, 18, 94, 2, 1, 39, 212, 147, + 214, 18, 94, 6, 1, 39, 212, 147, 212, 83, 94, 2, 1, 39, 212, 147, 212, + 83, 94, 6, 1, 39, 212, 147, 193, 140, 94, 2, 1, 39, 212, 147, 193, 140, + 94, 16, 222, 104, 94, 16, 216, 103, 206, 163, 94, 16, 209, 188, 206, 163, + 94, 16, 201, 90, 94, 16, 199, 167, 206, 163, 94, 16, 221, 193, 206, 163, + 94, 16, 203, 73, 202, 184, 94, 6, 1, 238, 200, 203, 106, 94, 2, 1, 238, + 200, 203, 106, 94, 6, 1, 238, 200, 231, 208, 94, 2, 1, 238, 200, 231, + 208, 94, 33, 213, 222, 58, 94, 33, 201, 214, 250, 203, 94, 33, 201, 214, + 219, 190, 94, 6, 1, 248, 105, 221, 197, 94, 2, 1, 248, 105, 221, 197, 94, + 39, 212, 147, 232, 82, 201, 64, 94, 39, 212, 147, 236, 236, 208, 15, 77, + 94, 39, 212, 147, 223, 144, 208, 15, 77, 94, 39, 212, 147, 195, 137, 236, + 207, 94, 232, 120, 91, 230, 72, 94, 232, 82, 201, 64, 94, 215, 202, 236, + 207, 101, 2, 1, 251, 134, 101, 2, 1, 249, 103, 101, 2, 1, 231, 212, 101, + 2, 1, 236, 152, 101, 2, 1, 234, 105, 101, 2, 1, 195, 49, 101, 2, 1, 191, + 80, 101, 2, 1, 199, 193, 101, 2, 1, 223, 164, 101, 2, 1, 222, 89, 101, 2, + 1, 220, 9, 101, 2, 1, 217, 92, 101, 2, 1, 214, 218, 101, 2, 1, 211, 106, + 101, 2, 1, 210, 133, 101, 2, 1, 191, 67, 101, 2, 1, 207, 165, 101, 2, 1, + 205, 143, 101, 2, 1, 199, 179, 101, 2, 1, 196, 113, 101, 2, 1, 209, 222, + 101, 2, 1, 221, 202, 101, 2, 1, 231, 84, 101, 2, 1, 208, 83, 101, 2, 1, + 203, 70, 101, 2, 1, 243, 83, 101, 2, 1, 247, 130, 101, 2, 1, 222, 236, + 101, 2, 1, 243, 20, 101, 2, 1, 246, 243, 101, 2, 1, 192, 218, 101, 2, 1, + 222, 251, 101, 2, 1, 230, 89, 101, 2, 1, 229, 247, 101, 2, 1, 229, 147, + 101, 2, 1, 193, 125, 101, 2, 1, 230, 21, 101, 2, 1, 229, 13, 101, 2, 1, + 192, 14, 101, 2, 1, 252, 16, 198, 175, 1, 170, 198, 175, 1, 192, 136, + 198, 175, 1, 192, 135, 198, 175, 1, 192, 125, 198, 175, 1, 192, 123, 198, + 175, 1, 248, 220, 252, 64, 192, 118, 198, 175, 1, 192, 118, 198, 175, 1, + 192, 133, 198, 175, 1, 192, 130, 198, 175, 1, 192, 132, 198, 175, 1, 192, + 131, 198, 175, 1, 192, 40, 198, 175, 1, 192, 127, 198, 175, 1, 192, 116, + 198, 175, 1, 197, 86, 192, 116, 198, 175, 1, 192, 113, 198, 175, 1, 192, + 121, 198, 175, 1, 248, 220, 252, 64, 192, 121, 198, 175, 1, 197, 86, 192, + 121, 198, 175, 1, 192, 120, 198, 175, 1, 192, 140, 198, 175, 1, 192, 114, + 198, 175, 1, 197, 86, 192, 114, 198, 175, 1, 192, 103, 198, 175, 1, 197, + 86, 192, 103, 198, 175, 1, 192, 33, 198, 175, 1, 192, 82, 198, 175, 1, + 251, 245, 192, 82, 198, 175, 1, 197, 86, 192, 82, 198, 175, 1, 192, 112, + 198, 175, 1, 192, 111, 198, 175, 1, 192, 108, 198, 175, 1, 197, 86, 192, + 122, 198, 175, 1, 197, 86, 192, 106, 198, 175, 1, 192, 104, 198, 175, 1, + 191, 225, 198, 175, 1, 192, 101, 198, 175, 1, 192, 99, 198, 175, 1, 192, + 124, 198, 175, 1, 197, 86, 192, 124, 198, 175, 1, 250, 129, 192, 124, + 198, 175, 1, 192, 98, 198, 175, 1, 192, 96, 198, 175, 1, 192, 97, 198, + 175, 1, 192, 95, 198, 175, 1, 192, 94, 198, 175, 1, 192, 134, 198, 175, + 1, 192, 92, 198, 175, 1, 192, 90, 198, 175, 1, 192, 89, 198, 175, 1, 192, + 86, 198, 175, 1, 192, 83, 198, 175, 1, 199, 157, 192, 83, 198, 175, 1, + 192, 81, 198, 175, 1, 192, 80, 198, 175, 1, 192, 12, 198, 175, 52, 1, + 220, 117, 77, 198, 175, 204, 12, 77, 198, 175, 120, 222, 198, 36, 5, 219, + 44, 36, 5, 216, 7, 36, 5, 206, 155, 36, 5, 202, 39, 36, 5, 203, 56, 36, + 5, 248, 112, 36, 5, 198, 91, 36, 5, 242, 100, 36, 5, 213, 38, 36, 5, 212, + 66, 36, 5, 231, 13, 211, 184, 36, 5, 191, 6, 36, 5, 236, 174, 36, 5, 237, + 162, 36, 5, 222, 202, 36, 5, 198, 240, 36, 5, 243, 69, 36, 5, 209, 200, + 36, 5, 209, 74, 36, 5, 231, 99, 36, 5, 231, 95, 36, 5, 231, 96, 36, 5, + 231, 97, 36, 5, 201, 176, 36, 5, 201, 130, 36, 5, 201, 143, 36, 5, 201, + 175, 36, 5, 201, 148, 36, 5, 201, 149, 36, 5, 201, 135, 36, 5, 247, 67, + 36, 5, 247, 46, 36, 5, 247, 48, 36, 5, 247, 66, 36, 5, 247, 64, 36, 5, + 247, 65, 36, 5, 247, 47, 36, 5, 190, 224, 36, 5, 190, 202, 36, 5, 190, + 215, 36, 5, 190, 223, 36, 5, 190, 218, 36, 5, 190, 219, 36, 5, 190, 207, + 36, 5, 247, 62, 36, 5, 247, 49, 36, 5, 247, 51, 36, 5, 247, 61, 36, 5, + 247, 59, 36, 5, 247, 60, 36, 5, 247, 50, 36, 5, 207, 236, 36, 5, 207, + 226, 36, 5, 207, 232, 36, 5, 207, 235, 36, 5, 207, 233, 36, 5, 207, 234, + 36, 5, 207, 231, 36, 5, 220, 155, 36, 5, 220, 147, 36, 5, 220, 150, 36, + 5, 220, 154, 36, 5, 220, 151, 36, 5, 220, 152, 36, 5, 220, 148, 36, 5, + 192, 175, 36, 5, 192, 162, 36, 5, 192, 170, 36, 5, 192, 174, 36, 5, 192, + 172, 36, 5, 192, 173, 36, 5, 192, 169, 36, 5, 230, 130, 36, 5, 230, 120, + 36, 5, 230, 123, 36, 5, 230, 129, 36, 5, 230, 125, 36, 5, 230, 126, 36, + 5, 230, 122, 33, 38, 1, 249, 19, 33, 38, 1, 195, 153, 33, 38, 1, 231, 79, + 33, 38, 1, 237, 148, 33, 38, 1, 191, 62, 33, 38, 1, 191, 87, 33, 38, 1, + 155, 33, 38, 1, 234, 142, 33, 38, 1, 234, 116, 33, 38, 1, 234, 105, 33, + 38, 1, 74, 33, 38, 1, 210, 65, 33, 38, 1, 234, 36, 33, 38, 1, 234, 24, + 33, 38, 1, 199, 145, 33, 38, 1, 140, 33, 38, 1, 197, 161, 33, 38, 1, 243, + 129, 33, 38, 1, 203, 166, 33, 38, 1, 203, 117, 33, 38, 1, 232, 230, 33, + 38, 1, 234, 20, 33, 38, 1, 65, 33, 38, 1, 223, 228, 33, 38, 1, 236, 193, + 33, 38, 1, 215, 221, 196, 128, 33, 38, 1, 192, 95, 33, 38, 1, 191, 225, + 33, 38, 1, 223, 83, 65, 33, 38, 1, 219, 85, 191, 190, 33, 38, 1, 248, + 177, 191, 190, 33, 38, 1, 223, 83, 248, 177, 191, 190, 50, 251, 118, 200, + 226, 217, 53, 50, 251, 118, 235, 140, 200, 226, 217, 53, 45, 200, 226, + 248, 55, 50, 200, 226, 248, 55, 45, 235, 140, 200, 226, 248, 55, 50, 235, + 140, 200, 226, 248, 55, 207, 149, 223, 106, 217, 53, 207, 149, 235, 140, + 223, 106, 217, 53, 235, 140, 198, 8, 217, 53, 45, 198, 8, 248, 55, 50, + 198, 8, 248, 55, 207, 149, 201, 191, 45, 207, 149, 211, 108, 248, 55, 50, + 207, 149, 211, 108, 248, 55, 234, 191, 239, 0, 210, 128, 232, 150, 210, + 128, 207, 19, 232, 150, 210, 128, 228, 87, 235, 140, 211, 179, 235, 121, + 251, 128, 196, 66, 251, 128, 235, 140, 206, 204, 251, 117, 55, 211, 174, + 228, 90, 223, 95, 223, 104, 210, 185, 248, 49, 228, 91, 4, 237, 44, 198, + 153, 4, 206, 190, 58, 45, 130, 210, 118, 248, 55, 50, 130, 210, 118, 248, + 55, 198, 153, 4, 75, 58, 198, 153, 4, 75, 60, 45, 81, 249, 90, 4, 208, 9, + 50, 81, 249, 90, 4, 208, 9, 198, 54, 45, 132, 248, 55, 198, 54, 50, 132, + 248, 55, 248, 79, 45, 132, 248, 55, 248, 79, 50, 132, 248, 55, 45, 202, + 207, 126, 248, 55, 50, 202, 207, 126, 248, 55, 45, 55, 210, 115, 50, 55, + 210, 115, 105, 185, 139, 91, 75, 208, 153, 91, 75, 139, 105, 185, 208, + 153, 112, 232, 130, 75, 208, 153, 232, 228, 75, 77, 207, 19, 208, 15, 77, + 81, 198, 152, 206, 190, 209, 63, 193, 23, 204, 12, 82, 236, 142, 154, + 242, 76, 207, 149, 236, 142, 207, 149, 242, 76, 154, 204, 26, 238, 17, 4, + 45, 230, 175, 238, 17, 4, 50, 230, 175, 154, 238, 16, 198, 54, 132, 205, + 55, 56, 197, 14, 237, 217, 198, 223, 237, 217, 201, 80, 232, 82, 201, 64, + 81, 202, 137, 236, 140, 193, 72, 81, 219, 114, 247, 111, 55, 228, 90, + 207, 19, 242, 76, 55, 218, 239, 207, 254, 77, 237, 218, 4, 45, 196, 69, + 55, 200, 164, 77, 223, 95, 130, 222, 37, 223, 95, 130, 222, 38, 4, 222, + 38, 58, 130, 222, 37, 130, 222, 38, 4, 236, 142, 55, 201, 115, 242, 76, + 235, 140, 202, 24, 197, 225, 238, 16, 216, 216, 242, 76, 210, 127, 77, + 208, 152, 234, 131, 77, 239, 1, 195, 137, 236, 207, 238, 220, 210, 84, 4, + 50, 238, 218, 238, 220, 210, 84, 4, 45, 238, 218, 198, 128, 3, 6, 234, 1, + 216, 216, 233, 218, 77, 216, 216, 208, 15, 77, 45, 51, 248, 56, 4, 106, + 50, 51, 248, 56, 4, 106, 45, 51, 248, 56, 4, 55, 106, 50, 51, 248, 56, 4, + 55, 106, 198, 54, 132, 45, 210, 115, 198, 54, 132, 50, 210, 115, 248, 79, + 132, 45, 210, 115, 248, 79, 132, 50, 210, 115, 211, 174, 228, 90, 12, 48, + 207, 49, 12, 48, 242, 232, 12, 48, 205, 58, 107, 12, 48, 205, 58, 109, + 12, 48, 205, 58, 138, 12, 48, 209, 252, 12, 48, 248, 64, 12, 48, 199, + 233, 12, 48, 221, 81, 107, 12, 48, 221, 81, 109, 12, 48, 236, 204, 12, + 48, 205, 62, 12, 48, 2, 107, 12, 48, 2, 109, 12, 48, 220, 32, 107, 12, + 48, 220, 32, 109, 12, 48, 220, 32, 138, 12, 48, 220, 32, 134, 12, 48, + 202, 59, 12, 48, 198, 227, 12, 48, 202, 56, 107, 12, 48, 202, 56, 109, + 12, 48, 229, 226, 107, 12, 48, 229, 226, 109, 12, 48, 230, 55, 12, 48, + 207, 138, 12, 48, 243, 66, 12, 48, 200, 198, 12, 48, 215, 207, 12, 48, + 237, 145, 12, 48, 215, 195, 12, 48, 242, 251, 12, 48, 193, 144, 107, 12, + 48, 193, 144, 109, 12, 48, 232, 245, 12, 48, 210, 78, 107, 12, 48, 210, + 78, 109, 12, 48, 202, 179, 132, 197, 255, 197, 177, 12, 48, 238, 241, 12, + 48, 236, 164, 12, 48, 223, 29, 12, 48, 248, 104, 79, 242, 215, 12, 48, + 233, 195, 12, 48, 201, 216, 107, 12, 48, 201, 216, 109, 12, 48, 249, 105, + 12, 48, 202, 186, 12, 48, 247, 192, 202, 186, 12, 48, 214, 88, 107, 12, + 48, 214, 88, 109, 12, 48, 214, 88, 138, 12, 48, 214, 88, 134, 12, 48, + 216, 174, 12, 48, 203, 108, 12, 48, 207, 144, 12, 48, 233, 225, 12, 48, + 211, 121, 12, 48, 248, 20, 107, 12, 48, 248, 20, 109, 12, 48, 216, 226, + 12, 48, 215, 201, 12, 48, 230, 216, 107, 12, 48, 230, 216, 109, 12, 48, + 230, 216, 138, 12, 48, 198, 173, 12, 48, 242, 214, 12, 48, 193, 105, 107, + 12, 48, 193, 105, 109, 12, 48, 247, 192, 205, 51, 12, 48, 202, 179, 228, + 189, 12, 48, 228, 189, 12, 48, 247, 192, 201, 230, 12, 48, 247, 192, 203, + 103, 12, 48, 232, 161, 12, 48, 247, 192, 247, 87, 12, 48, 202, 179, 193, + 169, 12, 48, 193, 170, 107, 12, 48, 193, 170, 109, 12, 48, 242, 254, 12, + 48, 247, 192, 230, 252, 12, 48, 180, 107, 12, 48, 180, 109, 12, 48, 247, + 192, 219, 21, 12, 48, 247, 192, 231, 193, 12, 48, 215, 190, 107, 12, 48, + 215, 190, 109, 12, 48, 207, 151, 12, 48, 248, 116, 12, 48, 247, 192, 199, + 185, 219, 232, 12, 48, 247, 192, 219, 235, 12, 48, 247, 192, 193, 66, 12, + 48, 247, 192, 232, 181, 12, 48, 234, 203, 107, 12, 48, 234, 203, 109, 12, + 48, 234, 203, 138, 12, 48, 247, 192, 234, 202, 12, 48, 229, 237, 12, 48, + 247, 192, 228, 185, 12, 48, 248, 100, 12, 48, 231, 63, 12, 48, 247, 192, + 232, 238, 12, 48, 247, 192, 248, 162, 12, 48, 247, 192, 205, 159, 12, 48, + 202, 179, 193, 95, 12, 48, 202, 179, 192, 72, 12, 48, 247, 192, 232, 101, + 12, 48, 223, 36, 233, 230, 12, 48, 247, 192, 233, 230, 12, 48, 223, 36, + 198, 56, 12, 48, 247, 192, 198, 56, 12, 48, 223, 36, 235, 113, 12, 48, + 247, 192, 235, 113, 12, 48, 197, 55, 12, 48, 223, 36, 197, 55, 12, 48, + 247, 192, 197, 55, 83, 48, 107, 83, 48, 219, 114, 83, 48, 236, 142, 83, + 48, 202, 98, 83, 48, 205, 57, 83, 48, 102, 83, 48, 109, 83, 48, 219, 143, + 83, 48, 217, 92, 83, 48, 219, 211, 83, 48, 234, 79, 83, 48, 171, 83, 48, + 144, 248, 64, 83, 48, 238, 244, 83, 48, 228, 28, 83, 48, 199, 233, 83, + 48, 211, 79, 248, 64, 83, 48, 221, 80, 83, 48, 209, 0, 83, 48, 193, 12, + 83, 48, 201, 204, 83, 48, 50, 211, 79, 248, 64, 83, 48, 229, 148, 234, + 100, 83, 48, 199, 95, 83, 48, 236, 204, 83, 48, 205, 62, 83, 48, 242, + 232, 83, 48, 208, 206, 83, 48, 251, 254, 83, 48, 215, 181, 83, 48, 234, + 100, 83, 48, 234, 209, 83, 48, 205, 92, 83, 48, 231, 5, 83, 48, 231, 6, + 202, 75, 83, 48, 233, 229, 83, 48, 248, 176, 83, 48, 193, 35, 83, 48, + 243, 88, 83, 48, 206, 134, 83, 48, 223, 160, 83, 48, 202, 71, 83, 48, + 220, 31, 83, 48, 238, 254, 83, 48, 201, 195, 83, 48, 215, 186, 83, 48, + 206, 177, 83, 48, 193, 20, 83, 48, 211, 97, 83, 48, 197, 63, 83, 48, 235, + 93, 83, 48, 203, 41, 198, 227, 83, 48, 235, 140, 242, 232, 83, 48, 180, + 201, 35, 83, 48, 105, 230, 30, 83, 48, 203, 47, 83, 48, 248, 71, 83, 48, + 202, 55, 83, 48, 248, 27, 83, 48, 201, 79, 83, 48, 229, 225, 83, 48, 230, + 73, 83, 48, 236, 146, 83, 48, 230, 55, 83, 48, 248, 49, 83, 48, 207, 138, + 83, 48, 205, 75, 83, 48, 236, 238, 83, 48, 250, 134, 83, 48, 201, 191, + 83, 48, 213, 13, 83, 48, 200, 198, 83, 48, 205, 104, 83, 48, 215, 207, + 83, 48, 197, 254, 83, 48, 220, 113, 83, 48, 201, 64, 83, 48, 237, 145, + 83, 48, 193, 120, 83, 48, 236, 177, 213, 13, 83, 48, 242, 72, 83, 48, + 232, 74, 83, 48, 242, 245, 83, 48, 201, 85, 83, 48, 193, 143, 83, 48, + 232, 245, 83, 48, 242, 241, 83, 48, 233, 68, 83, 48, 55, 192, 235, 83, + 48, 132, 197, 255, 197, 177, 83, 48, 202, 89, 83, 48, 233, 80, 83, 48, + 238, 241, 83, 48, 236, 164, 83, 48, 208, 201, 83, 48, 223, 29, 83, 48, + 216, 198, 83, 48, 198, 151, 83, 48, 200, 141, 83, 48, 219, 137, 83, 48, + 196, 43, 83, 48, 233, 23, 83, 48, 248, 104, 79, 242, 215, 83, 48, 202, + 213, 83, 48, 235, 140, 199, 87, 83, 48, 193, 89, 83, 48, 202, 108, 83, + 48, 236, 224, 83, 48, 233, 195, 83, 48, 201, 233, 83, 48, 57, 83, 48, + 201, 66, 83, 48, 201, 215, 83, 48, 198, 25, 83, 48, 230, 225, 83, 48, + 247, 72, 83, 48, 201, 108, 83, 48, 249, 105, 83, 48, 206, 246, 83, 48, + 202, 186, 83, 48, 223, 20, 83, 48, 214, 87, 83, 48, 203, 108, 83, 48, + 233, 56, 83, 48, 211, 121, 83, 48, 251, 127, 83, 48, 209, 91, 83, 48, + 234, 213, 83, 48, 248, 19, 83, 48, 216, 226, 83, 48, 216, 39, 83, 48, + 204, 33, 83, 48, 250, 241, 83, 48, 215, 201, 83, 48, 198, 61, 83, 48, + 211, 66, 83, 48, 248, 108, 83, 48, 201, 60, 83, 48, 242, 84, 83, 48, 230, + 215, 83, 48, 198, 173, 83, 48, 223, 123, 83, 48, 248, 122, 83, 48, 193, + 170, 234, 100, 83, 48, 242, 214, 83, 48, 193, 104, 83, 48, 205, 51, 83, + 48, 228, 189, 83, 48, 201, 230, 83, 48, 195, 180, 83, 48, 249, 14, 83, + 48, 209, 149, 83, 48, 249, 135, 83, 48, 203, 103, 83, 48, 207, 88, 83, + 48, 206, 46, 83, 48, 232, 161, 83, 48, 248, 106, 83, 48, 247, 87, 83, 48, + 248, 146, 83, 48, 215, 203, 83, 48, 193, 169, 83, 48, 242, 254, 83, 48, + 193, 62, 83, 48, 236, 216, 83, 48, 195, 50, 83, 48, 230, 252, 83, 48, + 219, 21, 83, 48, 231, 193, 83, 48, 215, 189, 83, 48, 202, 97, 83, 48, + 203, 41, 199, 214, 248, 162, 83, 48, 207, 151, 83, 48, 248, 116, 83, 48, + 193, 2, 83, 48, 233, 105, 83, 48, 219, 232, 83, 48, 199, 185, 219, 232, + 83, 48, 219, 228, 83, 48, 202, 5, 83, 48, 219, 235, 83, 48, 193, 66, 83, + 48, 232, 181, 83, 48, 234, 202, 83, 48, 229, 237, 83, 48, 232, 118, 83, + 48, 228, 185, 83, 48, 248, 100, 83, 48, 199, 199, 83, 48, 230, 80, 83, + 48, 233, 16, 83, 48, 205, 195, 193, 62, 83, 48, 247, 74, 83, 48, 231, 63, + 83, 48, 232, 238, 83, 48, 248, 162, 83, 48, 205, 159, 83, 48, 237, 130, + 83, 48, 193, 95, 83, 48, 229, 201, 83, 48, 192, 72, 83, 48, 216, 51, 83, + 48, 248, 141, 83, 48, 234, 112, 83, 48, 232, 101, 83, 48, 197, 222, 83, + 48, 235, 96, 83, 48, 207, 132, 83, 48, 213, 15, 83, 48, 233, 230, 83, 48, + 198, 56, 83, 48, 235, 113, 83, 48, 197, 55, 83, 48, 232, 184, 148, 237, + 87, 246, 242, 45, 119, 179, 148, 237, 87, 246, 242, 93, 119, 60, 148, + 237, 87, 246, 242, 45, 119, 82, 23, 179, 148, 237, 87, 246, 242, 93, 119, + 82, 23, 60, 148, 237, 87, 246, 242, 232, 82, 200, 168, 148, 237, 87, 246, + 242, 200, 169, 232, 100, 58, 148, 237, 87, 246, 242, 200, 169, 232, 100, + 60, 148, 237, 87, 246, 242, 200, 169, 232, 100, 219, 226, 148, 237, 87, + 246, 242, 200, 169, 232, 100, 116, 219, 226, 148, 237, 87, 246, 242, 200, + 169, 232, 100, 116, 179, 148, 237, 87, 246, 242, 200, 169, 232, 100, 110, + 219, 226, 148, 237, 87, 246, 242, 211, 5, 148, 237, 87, 246, 242, 200, + 169, 232, 100, 179, 148, 237, 87, 246, 242, 200, 169, 232, 100, 110, 179, + 148, 237, 87, 246, 242, 228, 243, 207, 84, 148, 237, 87, 246, 242, 206, + 121, 148, 201, 248, 148, 242, 76, 148, 232, 82, 201, 64, 236, 213, 77, + 223, 21, 223, 143, 201, 107, 113, 148, 223, 53, 77, 148, 242, 217, 77, + 148, 31, 191, 77, 45, 251, 118, 248, 55, 50, 251, 118, 248, 55, 45, 55, + 251, 118, 248, 55, 50, 55, 251, 118, 248, 55, 45, 239, 4, 248, 55, 50, + 239, 4, 248, 55, 45, 63, 239, 4, 248, 55, 50, 63, 239, 4, 248, 55, 45, + 62, 219, 189, 248, 55, 50, 62, 219, 189, 248, 55, 209, 20, 77, 231, 132, + 77, 45, 198, 42, 203, 104, 248, 55, 50, 198, 42, 203, 104, 248, 55, 45, + 63, 219, 189, 248, 55, 50, 63, 219, 189, 248, 55, 45, 63, 198, 42, 203, + 104, 248, 55, 50, 63, 198, 42, 203, 104, 248, 55, 45, 63, 51, 248, 55, + 50, 63, 51, 248, 55, 193, 139, 237, 217, 207, 19, 55, 208, 218, 207, 254, + 77, 55, 208, 218, 207, 254, 77, 130, 55, 208, 218, 207, 254, 77, 209, 20, + 87, 233, 105, 230, 27, 212, 136, 107, 230, 27, 212, 136, 109, 230, 27, + 212, 136, 138, 230, 27, 212, 136, 134, 230, 27, 212, 136, 150, 230, 27, + 212, 136, 169, 230, 27, 212, 136, 175, 230, 27, 212, 136, 171, 230, 27, + 212, 136, 178, 148, 219, 170, 163, 77, 148, 206, 181, 163, 77, 148, 237, + 97, 163, 77, 148, 234, 78, 163, 77, 30, 202, 171, 75, 163, 77, 30, 55, + 75, 163, 77, 193, 135, 237, 217, 81, 222, 88, 207, 50, 77, 81, 222, 88, + 207, 50, 4, 195, 20, 202, 6, 77, 81, 222, 88, 207, 50, 87, 116, 230, 72, + 81, 222, 88, 207, 50, 4, 195, 20, 202, 6, 87, 116, 230, 72, 81, 222, 88, + 207, 50, 87, 110, 230, 72, 47, 209, 20, 77, 148, 199, 109, 219, 115, 233, + 53, 204, 12, 113, 230, 27, 212, 136, 199, 95, 230, 27, 212, 136, 197, 32, + 230, 27, 212, 136, 198, 249, 81, 148, 223, 53, 77, 217, 33, 77, 210, 109, + 251, 155, 77, 148, 67, 223, 146, 148, 132, 233, 8, 201, 248, 229, 122, 1, + 2, 65, 229, 122, 1, 65, 229, 122, 1, 2, 68, 229, 122, 1, 68, 229, 122, 1, + 2, 66, 229, 122, 1, 66, 229, 122, 1, 2, 71, 229, 122, 1, 71, 229, 122, 1, + 2, 74, 229, 122, 1, 74, 229, 122, 1, 155, 229, 122, 1, 231, 242, 229, + 122, 1, 221, 168, 229, 122, 1, 231, 55, 229, 122, 1, 220, 234, 229, 122, + 1, 230, 181, 229, 122, 1, 222, 24, 229, 122, 1, 231, 167, 229, 122, 1, + 221, 69, 229, 122, 1, 231, 5, 229, 122, 1, 188, 229, 122, 1, 191, 123, + 229, 122, 1, 202, 223, 229, 122, 1, 191, 30, 229, 122, 1, 201, 5, 229, + 122, 1, 190, 251, 229, 122, 1, 205, 69, 229, 122, 1, 191, 87, 229, 122, + 1, 202, 47, 229, 122, 1, 191, 7, 229, 122, 1, 190, 190, 229, 122, 1, 238, + 34, 229, 122, 1, 198, 193, 229, 122, 1, 237, 46, 229, 122, 1, 2, 197, 94, + 229, 122, 1, 197, 94, 229, 122, 1, 235, 91, 229, 122, 1, 199, 145, 229, + 122, 1, 237, 148, 229, 122, 1, 159, 229, 122, 1, 236, 176, 229, 122, 1, + 181, 229, 122, 1, 213, 221, 229, 122, 1, 212, 180, 229, 122, 1, 214, 123, + 229, 122, 1, 213, 45, 229, 122, 1, 140, 229, 122, 1, 249, 155, 229, 122, + 1, 168, 229, 122, 1, 229, 160, 229, 122, 1, 248, 190, 229, 122, 1, 209, + 187, 229, 122, 1, 228, 161, 229, 122, 1, 248, 12, 229, 122, 1, 208, 167, + 229, 122, 1, 229, 247, 229, 122, 1, 249, 19, 229, 122, 1, 210, 65, 229, + 122, 1, 229, 25, 229, 122, 1, 248, 113, 229, 122, 1, 209, 75, 229, 122, + 1, 174, 229, 122, 1, 216, 102, 229, 122, 1, 215, 157, 229, 122, 1, 216, + 234, 229, 122, 1, 216, 14, 229, 122, 1, 2, 170, 229, 122, 1, 170, 229, + 122, 1, 2, 191, 225, 229, 122, 1, 191, 225, 229, 122, 1, 2, 192, 12, 229, + 122, 1, 192, 12, 229, 122, 1, 165, 229, 122, 1, 207, 2, 229, 122, 1, 206, + 69, 229, 122, 1, 207, 115, 229, 122, 1, 206, 163, 229, 122, 1, 2, 193, + 190, 229, 122, 1, 193, 190, 229, 122, 1, 193, 86, 229, 122, 1, 193, 125, + 229, 122, 1, 193, 48, 229, 122, 1, 215, 63, 229, 122, 1, 193, 249, 229, + 122, 1, 2, 155, 229, 122, 1, 2, 222, 24, 33, 222, 50, 195, 20, 202, 6, + 77, 33, 222, 50, 204, 31, 202, 6, 77, 222, 50, 195, 20, 202, 6, 77, 222, + 50, 204, 31, 202, 6, 77, 229, 122, 223, 53, 77, 229, 122, 195, 20, 223, + 53, 77, 229, 122, 237, 5, 191, 242, 222, 50, 55, 228, 90, 72, 1, 2, 65, + 72, 1, 65, 72, 1, 2, 68, 72, 1, 68, 72, 1, 2, 66, 72, 1, 66, 72, 1, 2, + 71, 72, 1, 71, 72, 1, 2, 74, 72, 1, 74, 72, 1, 155, 72, 1, 231, 242, 72, + 1, 221, 168, 72, 1, 231, 55, 72, 1, 220, 234, 72, 1, 230, 181, 72, 1, + 222, 24, 72, 1, 231, 167, 72, 1, 221, 69, 72, 1, 231, 5, 72, 1, 188, 72, + 1, 191, 123, 72, 1, 202, 223, 72, 1, 191, 30, 72, 1, 201, 5, 72, 1, 190, + 251, 72, 1, 205, 69, 72, 1, 191, 87, 72, 1, 202, 47, 72, 1, 191, 7, 72, + 1, 190, 190, 72, 1, 238, 34, 72, 1, 198, 193, 72, 1, 237, 46, 72, 1, 2, + 197, 94, 72, 1, 197, 94, 72, 1, 235, 91, 72, 1, 199, 145, 72, 1, 237, + 148, 72, 1, 159, 72, 1, 236, 176, 72, 1, 181, 72, 1, 213, 221, 72, 1, + 212, 180, 72, 1, 214, 123, 72, 1, 213, 45, 72, 1, 140, 72, 1, 249, 155, + 72, 1, 168, 72, 1, 229, 160, 72, 1, 248, 190, 72, 1, 209, 187, 72, 1, + 228, 161, 72, 1, 248, 12, 72, 1, 208, 167, 72, 1, 229, 247, 72, 1, 249, + 19, 72, 1, 210, 65, 72, 1, 229, 25, 72, 1, 248, 113, 72, 1, 209, 75, 72, + 1, 174, 72, 1, 216, 102, 72, 1, 215, 157, 72, 1, 216, 234, 72, 1, 216, + 14, 72, 1, 2, 170, 72, 1, 170, 72, 1, 2, 191, 225, 72, 1, 191, 225, 72, + 1, 2, 192, 12, 72, 1, 192, 12, 72, 1, 165, 72, 1, 207, 2, 72, 1, 206, 69, + 72, 1, 207, 115, 72, 1, 206, 163, 72, 1, 2, 193, 190, 72, 1, 193, 190, + 72, 1, 193, 86, 72, 1, 193, 125, 72, 1, 193, 48, 72, 1, 215, 63, 72, 1, + 193, 249, 72, 1, 2, 155, 72, 1, 2, 222, 24, 72, 1, 195, 188, 72, 1, 195, + 69, 72, 1, 195, 153, 72, 1, 195, 24, 72, 82, 236, 142, 222, 50, 208, 193, + 202, 6, 77, 72, 223, 53, 77, 72, 195, 20, 223, 53, 77, 72, 237, 5, 221, + 29, 248, 90, 1, 250, 122, 248, 90, 1, 210, 238, 248, 90, 1, 218, 170, + 248, 90, 1, 233, 177, 248, 90, 1, 238, 129, 248, 90, 1, 200, 43, 248, 90, + 1, 215, 63, 248, 90, 1, 172, 248, 90, 1, 232, 53, 248, 90, 1, 222, 154, + 248, 90, 1, 230, 118, 248, 90, 1, 223, 37, 248, 90, 1, 208, 106, 248, 90, + 1, 192, 235, 248, 90, 1, 191, 72, 248, 90, 1, 247, 5, 248, 90, 1, 203, + 168, 248, 90, 1, 146, 248, 90, 1, 191, 166, 248, 90, 1, 247, 195, 248, + 90, 1, 206, 9, 248, 90, 1, 65, 248, 90, 1, 74, 248, 90, 1, 71, 248, 90, + 1, 234, 175, 248, 90, 1, 251, 238, 248, 90, 1, 234, 168, 248, 90, 1, 250, + 165, 248, 90, 1, 211, 21, 248, 90, 1, 251, 134, 248, 90, 1, 234, 105, + 248, 90, 1, 251, 124, 248, 90, 1, 234, 90, 248, 90, 1, 234, 36, 248, 90, + 1, 68, 248, 90, 1, 66, 248, 90, 1, 223, 51, 248, 90, 1, 196, 12, 248, 90, + 1, 214, 72, 248, 90, 1, 231, 9, 248, 90, 1, 223, 202, 248, 90, 1, 187, 4, + 75, 58, 248, 90, 1, 213, 82, 30, 1, 221, 115, 30, 1, 201, 168, 30, 1, + 221, 108, 30, 1, 213, 206, 30, 1, 213, 204, 30, 1, 213, 203, 30, 1, 198, + 168, 30, 1, 201, 157, 30, 1, 206, 240, 30, 1, 206, 235, 30, 1, 206, 232, + 30, 1, 206, 225, 30, 1, 206, 220, 30, 1, 206, 215, 30, 1, 206, 226, 30, + 1, 206, 238, 30, 1, 216, 79, 30, 1, 209, 171, 30, 1, 201, 165, 30, 1, + 209, 160, 30, 1, 202, 161, 30, 1, 201, 162, 30, 1, 223, 224, 30, 1, 243, + 26, 30, 1, 201, 172, 30, 1, 243, 93, 30, 1, 221, 190, 30, 1, 199, 7, 30, + 1, 209, 211, 30, 1, 229, 144, 30, 1, 65, 30, 1, 252, 27, 30, 1, 170, 30, + 1, 192, 129, 30, 1, 234, 67, 30, 1, 71, 30, 1, 192, 67, 30, 1, 192, 80, + 30, 1, 74, 30, 1, 193, 190, 30, 1, 193, 176, 30, 1, 211, 153, 30, 1, 192, + 12, 30, 1, 66, 30, 1, 193, 107, 30, 1, 193, 125, 30, 1, 193, 86, 30, 1, + 191, 225, 30, 1, 233, 244, 30, 1, 192, 33, 30, 1, 68, 30, 233, 5, 30, 1, + 201, 166, 30, 1, 213, 196, 30, 1, 213, 198, 30, 1, 213, 201, 30, 1, 206, + 233, 30, 1, 206, 214, 30, 1, 206, 222, 30, 1, 206, 227, 30, 1, 206, 212, + 30, 1, 216, 72, 30, 1, 216, 69, 30, 1, 216, 73, 30, 1, 222, 73, 30, 1, + 209, 166, 30, 1, 209, 152, 30, 1, 209, 158, 30, 1, 209, 155, 30, 1, 209, + 169, 30, 1, 209, 153, 30, 1, 222, 71, 30, 1, 222, 69, 30, 1, 202, 154, + 30, 1, 202, 152, 30, 1, 202, 144, 30, 1, 202, 149, 30, 1, 202, 159, 30, + 1, 210, 151, 30, 1, 201, 169, 30, 1, 192, 57, 30, 1, 192, 51, 30, 1, 192, + 52, 30, 1, 222, 72, 30, 1, 201, 170, 30, 1, 192, 63, 30, 1, 192, 0, 30, + 1, 191, 255, 30, 1, 192, 2, 30, 1, 191, 212, 30, 1, 191, 213, 30, 1, 191, + 216, 30, 1, 251, 27, 30, 1, 251, 21, 148, 251, 98, 219, 103, 77, 148, + 251, 98, 207, 20, 77, 148, 251, 98, 91, 77, 148, 251, 98, 105, 77, 148, + 251, 98, 115, 77, 148, 251, 98, 232, 130, 77, 148, 251, 98, 198, 54, 77, + 148, 251, 98, 82, 77, 148, 251, 98, 248, 79, 77, 148, 251, 98, 232, 240, + 77, 148, 251, 98, 205, 58, 77, 148, 251, 98, 199, 1, 77, 148, 251, 98, + 232, 123, 77, 148, 251, 98, 229, 222, 77, 148, 251, 98, 234, 210, 77, + 148, 251, 98, 217, 93, 77, 248, 90, 1, 248, 12, 248, 90, 1, 191, 30, 248, + 90, 1, 222, 246, 248, 90, 1, 230, 181, 248, 90, 1, 234, 190, 248, 90, 1, + 234, 87, 248, 90, 1, 211, 89, 248, 90, 1, 211, 93, 248, 90, 1, 223, 79, + 248, 90, 1, 251, 100, 248, 90, 1, 223, 130, 248, 90, 1, 196, 83, 248, 90, + 1, 223, 182, 248, 90, 1, 214, 50, 248, 90, 1, 251, 231, 248, 90, 1, 250, + 160, 248, 90, 1, 251, 151, 248, 90, 1, 211, 115, 248, 90, 1, 211, 96, + 248, 90, 1, 223, 127, 248, 90, 53, 1, 210, 238, 248, 90, 53, 1, 200, 43, + 248, 90, 53, 1, 222, 154, 248, 90, 53, 1, 230, 118, 248, 90, 1, 231, 94, + 248, 90, 1, 219, 162, 248, 90, 1, 190, 231, 248, 90, 53, 1, 232, 53, 248, + 90, 1, 230, 138, 248, 90, 1, 220, 182, 248, 90, 1, 211, 153, 248, 90, 1, + 251, 247, 12, 201, 29, 200, 43, 12, 201, 29, 193, 98, 12, 201, 29, 192, + 209, 12, 201, 29, 247, 208, 12, 201, 29, 200, 151, 12, 201, 29, 228, 80, + 12, 201, 29, 228, 84, 12, 201, 29, 228, 171, 12, 201, 29, 228, 81, 12, + 201, 29, 200, 46, 12, 201, 29, 228, 83, 12, 201, 29, 228, 79, 12, 201, + 29, 228, 169, 12, 201, 29, 228, 82, 12, 201, 29, 228, 78, 12, 201, 29, + 215, 63, 12, 201, 29, 230, 118, 12, 201, 29, 206, 9, 12, 201, 29, 210, + 238, 12, 201, 29, 201, 251, 12, 201, 29, 238, 129, 12, 201, 29, 228, 85, + 12, 201, 29, 229, 180, 12, 201, 29, 200, 55, 12, 201, 29, 200, 128, 12, + 201, 29, 201, 119, 12, 201, 29, 203, 174, 12, 201, 29, 210, 69, 12, 201, + 29, 208, 108, 12, 201, 29, 198, 99, 12, 201, 29, 200, 45, 12, 201, 29, + 200, 140, 12, 201, 29, 228, 96, 12, 201, 29, 228, 77, 12, 201, 29, 209, + 232, 12, 201, 29, 208, 106, 148, 237, 87, 246, 242, 200, 225, 72, 1, 2, + 220, 234, 72, 1, 2, 202, 223, 72, 1, 2, 201, 5, 72, 1, 2, 159, 72, 1, 2, + 212, 180, 72, 1, 2, 140, 72, 1, 2, 229, 160, 72, 1, 2, 228, 161, 72, 1, + 2, 229, 247, 72, 1, 2, 229, 25, 72, 1, 2, 215, 157, 72, 1, 2, 165, 72, 1, + 2, 207, 2, 72, 1, 2, 206, 69, 72, 1, 2, 207, 115, 72, 1, 2, 206, 163, + 127, 30, 221, 115, 127, 30, 213, 206, 127, 30, 198, 168, 127, 30, 206, + 240, 127, 30, 216, 79, 127, 30, 209, 171, 127, 30, 202, 161, 127, 30, + 223, 224, 127, 30, 243, 26, 127, 30, 243, 93, 127, 30, 221, 190, 127, 30, + 199, 7, 127, 30, 209, 211, 127, 30, 229, 144, 127, 30, 221, 116, 65, 127, + 30, 213, 207, 65, 127, 30, 198, 169, 65, 127, 30, 206, 241, 65, 127, 30, + 216, 80, 65, 127, 30, 209, 172, 65, 127, 30, 202, 162, 65, 127, 30, 223, + 225, 65, 127, 30, 243, 27, 65, 127, 30, 243, 94, 65, 127, 30, 221, 191, + 65, 127, 30, 199, 8, 65, 127, 30, 209, 212, 65, 127, 30, 229, 145, 65, + 127, 30, 243, 27, 66, 127, 221, 34, 246, 242, 211, 131, 127, 221, 34, + 246, 242, 187, 228, 161, 127, 228, 16, 107, 127, 228, 16, 109, 127, 228, + 16, 138, 127, 228, 16, 134, 127, 228, 16, 150, 127, 228, 16, 169, 127, + 228, 16, 175, 127, 228, 16, 171, 127, 228, 16, 178, 127, 228, 16, 199, + 95, 127, 228, 16, 215, 207, 127, 228, 16, 232, 245, 127, 228, 16, 193, + 143, 127, 228, 16, 193, 28, 127, 228, 16, 216, 167, 127, 228, 16, 234, + 209, 127, 228, 16, 200, 198, 127, 228, 16, 201, 67, 127, 228, 16, 230, 1, + 127, 228, 16, 202, 36, 127, 228, 16, 214, 229, 127, 228, 16, 201, 232, + 127, 228, 16, 233, 0, 127, 228, 16, 239, 52, 127, 228, 16, 220, 116, 127, + 228, 16, 207, 43, 127, 228, 16, 247, 140, 127, 228, 16, 201, 11, 127, + 228, 16, 200, 178, 127, 228, 16, 234, 77, 127, 228, 16, 207, 33, 127, + 228, 16, 251, 170, 127, 228, 16, 233, 33, 127, 228, 16, 207, 31, 127, + 228, 16, 204, 33, 127, 228, 16, 207, 110, 47, 228, 16, 208, 14, 47, 228, + 16, 221, 142, 47, 228, 16, 205, 90, 47, 228, 16, 221, 29, 47, 31, 199, + 96, 211, 107, 62, 201, 191, 47, 31, 197, 33, 211, 107, 62, 201, 191, 47, + 31, 198, 250, 211, 107, 62, 201, 191, 47, 31, 232, 138, 211, 107, 62, + 201, 191, 47, 31, 233, 18, 211, 107, 62, 201, 191, 47, 31, 202, 122, 211, + 107, 62, 201, 191, 47, 31, 203, 243, 211, 107, 62, 201, 191, 47, 31, 234, + 156, 211, 107, 62, 201, 191, 210, 105, 56, 47, 31, 197, 33, 107, 47, 31, + 197, 33, 109, 47, 31, 197, 33, 138, 47, 31, 197, 33, 134, 47, 31, 197, + 33, 150, 47, 31, 197, 33, 169, 47, 31, 197, 33, 175, 47, 31, 197, 33, + 171, 47, 31, 197, 33, 178, 47, 31, 198, 249, 47, 31, 198, 250, 107, 47, + 31, 198, 250, 109, 47, 31, 198, 250, 138, 47, 31, 198, 250, 134, 47, 31, + 198, 250, 150, 47, 30, 221, 115, 47, 30, 213, 206, 47, 30, 198, 168, 47, + 30, 206, 240, 47, 30, 216, 79, 47, 30, 209, 171, 47, 30, 202, 161, 47, + 30, 223, 224, 47, 30, 243, 26, 47, 30, 243, 93, 47, 30, 221, 190, 47, 30, + 199, 7, 47, 30, 209, 211, 47, 30, 229, 144, 47, 30, 221, 116, 65, 47, 30, + 213, 207, 65, 47, 30, 198, 169, 65, 47, 30, 206, 241, 65, 47, 30, 216, + 80, 65, 47, 30, 209, 172, 65, 47, 30, 202, 162, 65, 47, 30, 223, 225, 65, + 47, 30, 243, 27, 65, 47, 30, 243, 94, 65, 47, 30, 221, 191, 65, 47, 30, + 199, 8, 65, 47, 30, 209, 212, 65, 47, 30, 229, 145, 65, 47, 221, 34, 246, + 242, 246, 249, 47, 221, 34, 246, 242, 222, 180, 47, 30, 223, 225, 66, + 221, 34, 201, 107, 113, 47, 228, 16, 107, 47, 228, 16, 109, 47, 228, 16, + 138, 47, 228, 16, 134, 47, 228, 16, 150, 47, 228, 16, 169, 47, 228, 16, + 175, 47, 228, 16, 171, 47, 228, 16, 178, 47, 228, 16, 199, 95, 47, 228, + 16, 215, 207, 47, 228, 16, 232, 245, 47, 228, 16, 193, 143, 47, 228, 16, + 193, 28, 47, 228, 16, 216, 167, 47, 228, 16, 234, 209, 47, 228, 16, 200, + 198, 47, 228, 16, 201, 67, 47, 228, 16, 230, 1, 47, 228, 16, 202, 36, 47, + 228, 16, 214, 229, 47, 228, 16, 201, 232, 47, 228, 16, 233, 0, 47, 228, + 16, 239, 52, 47, 228, 16, 220, 116, 47, 228, 16, 205, 56, 47, 228, 16, + 217, 98, 47, 228, 16, 233, 43, 47, 228, 16, 200, 210, 47, 228, 16, 233, + 222, 47, 228, 16, 208, 213, 47, 228, 16, 250, 169, 47, 228, 16, 223, 54, + 47, 228, 16, 207, 31, 47, 228, 16, 239, 10, 47, 228, 16, 238, 253, 47, + 228, 16, 229, 137, 47, 228, 16, 247, 23, 47, 228, 16, 218, 243, 47, 228, + 16, 219, 226, 47, 228, 16, 179, 47, 228, 16, 216, 217, 47, 228, 16, 207, + 61, 47, 228, 16, 201, 11, 47, 228, 16, 200, 178, 47, 228, 16, 234, 77, + 47, 228, 16, 207, 33, 47, 228, 16, 251, 170, 47, 228, 16, 213, 192, 47, 31, 198, 250, 169, 47, 31, 198, 250, 175, 47, 31, 198, 250, 171, 47, 31, - 198, 250, 178, 47, 31, 232, 135, 47, 31, 232, 136, 107, 47, 31, 232, 136, - 109, 47, 31, 232, 136, 138, 47, 31, 232, 136, 134, 47, 31, 232, 136, 149, - 47, 31, 232, 136, 169, 47, 31, 232, 136, 175, 47, 31, 232, 136, 171, 47, - 31, 232, 136, 178, 47, 31, 233, 15, 154, 199, 109, 16, 40, 223, 21, 154, - 199, 109, 16, 40, 233, 53, 154, 199, 109, 16, 40, 217, 58, 154, 199, 109, - 16, 40, 251, 39, 154, 199, 109, 16, 40, 217, 21, 154, 199, 109, 16, 40, - 222, 175, 154, 199, 109, 16, 40, 222, 176, 154, 199, 109, 16, 40, 250, - 159, 154, 199, 109, 16, 40, 204, 9, 154, 199, 109, 16, 40, 211, 157, 154, - 199, 109, 16, 40, 212, 255, 154, 199, 109, 16, 40, 237, 140, 51, 229, - 178, 51, 234, 30, 51, 233, 230, 219, 118, 219, 145, 56, 47, 72, 65, 47, + 198, 250, 178, 47, 31, 232, 137, 47, 31, 232, 138, 107, 47, 31, 232, 138, + 109, 47, 31, 232, 138, 138, 47, 31, 232, 138, 134, 47, 31, 232, 138, 150, + 47, 31, 232, 138, 169, 47, 31, 232, 138, 175, 47, 31, 232, 138, 171, 47, + 31, 232, 138, 178, 47, 31, 233, 17, 148, 199, 109, 16, 40, 223, 23, 148, + 199, 109, 16, 40, 233, 55, 148, 199, 109, 16, 40, 217, 60, 148, 199, 109, + 16, 40, 251, 41, 148, 199, 109, 16, 40, 217, 23, 148, 199, 109, 16, 40, + 222, 177, 148, 199, 109, 16, 40, 222, 178, 148, 199, 109, 16, 40, 250, + 161, 148, 199, 109, 16, 40, 204, 10, 148, 199, 109, 16, 40, 211, 159, + 148, 199, 109, 16, 40, 213, 1, 148, 199, 109, 16, 40, 237, 142, 51, 229, + 180, 51, 234, 32, 51, 233, 232, 219, 120, 219, 147, 56, 47, 72, 65, 47, 72, 68, 47, 72, 66, 47, 72, 71, 47, 72, 74, 47, 72, 155, 47, 72, 221, - 166, 47, 72, 220, 232, 47, 72, 222, 22, 47, 72, 221, 67, 47, 72, 188, 47, - 72, 202, 222, 47, 72, 201, 4, 47, 72, 205, 68, 47, 72, 202, 46, 47, 72, + 168, 47, 72, 220, 234, 47, 72, 222, 24, 47, 72, 221, 69, 47, 72, 188, 47, + 72, 202, 223, 47, 72, 201, 5, 47, 72, 205, 69, 47, 72, 202, 47, 47, 72, 190, 190, 47, 72, 198, 193, 47, 72, 197, 94, 47, 72, 199, 145, 47, 72, - 159, 47, 72, 180, 47, 72, 213, 219, 47, 72, 212, 178, 47, 72, 214, 121, - 47, 72, 213, 43, 47, 72, 140, 47, 72, 229, 158, 47, 72, 228, 159, 47, 72, - 229, 245, 47, 72, 229, 23, 47, 72, 174, 47, 72, 216, 100, 47, 72, 215, - 155, 47, 72, 216, 232, 47, 72, 216, 12, 47, 72, 170, 47, 72, 191, 225, - 47, 72, 192, 12, 47, 72, 165, 47, 72, 207, 1, 47, 72, 206, 68, 47, 72, - 207, 113, 47, 72, 206, 162, 47, 72, 193, 190, 47, 72, 193, 86, 47, 72, - 193, 125, 47, 72, 193, 48, 51, 234, 33, 214, 228, 207, 68, 51, 251, 64, - 51, 250, 221, 51, 251, 92, 51, 252, 163, 51, 223, 130, 51, 223, 97, 51, - 196, 80, 51, 234, 2, 51, 234, 185, 51, 211, 90, 51, 211, 83, 51, 222, - 100, 51, 222, 63, 51, 222, 58, 51, 231, 195, 51, 231, 205, 51, 231, 41, - 51, 231, 35, 51, 220, 144, 51, 231, 26, 51, 221, 131, 51, 221, 130, 51, - 221, 129, 51, 221, 128, 51, 230, 146, 51, 230, 145, 51, 220, 193, 51, - 220, 196, 51, 222, 9, 51, 221, 29, 51, 221, 38, 51, 205, 180, 51, 205, - 133, 51, 202, 141, 51, 204, 15, 51, 204, 14, 51, 238, 28, 51, 237, 81, - 51, 236, 141, 51, 198, 81, 51, 214, 221, 51, 213, 0, 51, 230, 75, 51, - 210, 214, 51, 210, 213, 51, 249, 150, 51, 209, 181, 51, 209, 143, 51, - 209, 144, 51, 248, 156, 51, 228, 154, 51, 228, 148, 51, 247, 221, 51, - 228, 132, 51, 229, 206, 51, 209, 241, 51, 210, 29, 51, 229, 187, 51, 210, - 25, 51, 210, 43, 51, 248, 252, 51, 209, 57, 51, 248, 84, 51, 228, 255, - 51, 209, 38, 51, 228, 246, 51, 228, 248, 51, 217, 110, 51, 217, 106, 51, - 217, 115, 51, 217, 44, 51, 217, 76, 51, 216, 56, 51, 216, 29, 51, 216, - 28, 51, 216, 203, 51, 216, 200, 51, 216, 204, 51, 192, 139, 51, 192, 137, - 51, 191, 210, 51, 206, 178, 51, 206, 182, 51, 206, 35, 51, 206, 28, 51, - 207, 57, 51, 207, 54, 51, 193, 141, 154, 199, 109, 16, 40, 228, 177, 191, - 77, 154, 199, 109, 16, 40, 228, 177, 107, 154, 199, 109, 16, 40, 228, - 177, 109, 154, 199, 109, 16, 40, 228, 177, 138, 154, 199, 109, 16, 40, - 228, 177, 134, 154, 199, 109, 16, 40, 228, 177, 149, 154, 199, 109, 16, - 40, 228, 177, 169, 154, 199, 109, 16, 40, 228, 177, 175, 154, 199, 109, - 16, 40, 228, 177, 171, 154, 199, 109, 16, 40, 228, 177, 178, 154, 199, - 109, 16, 40, 228, 177, 199, 95, 154, 199, 109, 16, 40, 228, 177, 234, - 127, 154, 199, 109, 16, 40, 228, 177, 197, 37, 154, 199, 109, 16, 40, - 228, 177, 198, 251, 154, 199, 109, 16, 40, 228, 177, 232, 122, 154, 199, - 109, 16, 40, 228, 177, 233, 19, 154, 199, 109, 16, 40, 228, 177, 202, - 130, 154, 199, 109, 16, 40, 228, 177, 203, 244, 154, 199, 109, 16, 40, - 228, 177, 234, 161, 154, 199, 109, 16, 40, 228, 177, 213, 171, 154, 199, - 109, 16, 40, 228, 177, 197, 32, 154, 199, 109, 16, 40, 228, 177, 197, 25, - 154, 199, 109, 16, 40, 228, 177, 197, 20, 154, 199, 109, 16, 40, 228, - 177, 197, 22, 154, 199, 109, 16, 40, 228, 177, 197, 27, 51, 228, 168, 51, - 238, 32, 51, 250, 163, 51, 164, 51, 211, 9, 51, 210, 68, 51, 236, 177, - 51, 236, 178, 201, 189, 51, 236, 178, 238, 189, 51, 223, 49, 51, 234, 33, - 214, 228, 229, 207, 51, 234, 33, 214, 228, 200, 66, 51, 234, 33, 214, - 228, 199, 212, 51, 234, 33, 214, 228, 216, 199, 51, 238, 253, 51, 210, - 221, 251, 135, 51, 180, 51, 215, 156, 65, 51, 174, 51, 155, 51, 222, 25, - 51, 217, 16, 51, 231, 183, 51, 247, 144, 51, 222, 24, 51, 209, 231, 51, - 214, 72, 51, 215, 156, 233, 175, 51, 215, 156, 232, 51, 51, 216, 141, 51, - 221, 217, 51, 228, 83, 51, 221, 168, 51, 216, 102, 51, 231, 55, 51, 198, - 195, 51, 215, 156, 172, 51, 216, 20, 51, 236, 187, 51, 221, 95, 51, 232, - 177, 51, 213, 81, 51, 215, 156, 218, 168, 51, 216, 17, 51, 242, 199, 51, - 221, 81, 51, 216, 18, 201, 189, 51, 242, 200, 201, 189, 51, 218, 169, - 201, 189, 51, 221, 82, 201, 189, 51, 216, 18, 238, 189, 51, 242, 200, - 238, 189, 51, 218, 169, 238, 189, 51, 221, 82, 238, 189, 51, 218, 169, - 139, 206, 8, 51, 218, 169, 139, 206, 9, 201, 189, 51, 168, 51, 221, 21, - 51, 215, 166, 51, 230, 229, 51, 207, 168, 51, 207, 169, 139, 206, 8, 51, - 207, 169, 139, 206, 9, 201, 189, 51, 208, 178, 51, 212, 219, 51, 215, - 156, 206, 8, 51, 215, 158, 51, 208, 124, 51, 212, 112, 51, 215, 156, 196, - 12, 51, 215, 87, 51, 220, 182, 51, 215, 88, 216, 203, 51, 208, 123, 51, - 212, 111, 51, 215, 156, 193, 224, 51, 215, 81, 51, 220, 180, 51, 215, 82, - 216, 203, 51, 222, 153, 211, 134, 51, 218, 169, 211, 134, 51, 251, 149, - 51, 248, 57, 51, 247, 66, 51, 247, 43, 51, 247, 194, 139, 221, 217, 51, - 242, 99, 51, 237, 200, 51, 230, 129, 51, 140, 51, 228, 169, 51, 223, 162, - 51, 221, 102, 51, 221, 82, 247, 110, 51, 220, 234, 51, 219, 46, 51, 219, - 45, 51, 219, 30, 51, 218, 184, 51, 217, 17, 202, 70, 51, 216, 55, 51, - 215, 233, 51, 209, 229, 51, 209, 76, 51, 208, 249, 51, 208, 247, 51, 201, - 180, 51, 200, 158, 51, 193, 127, 51, 196, 13, 139, 218, 168, 51, 42, 139, - 218, 168, 154, 199, 109, 16, 40, 237, 204, 107, 154, 199, 109, 16, 40, - 237, 204, 109, 154, 199, 109, 16, 40, 237, 204, 138, 154, 199, 109, 16, - 40, 237, 204, 134, 154, 199, 109, 16, 40, 237, 204, 149, 154, 199, 109, - 16, 40, 237, 204, 169, 154, 199, 109, 16, 40, 237, 204, 175, 154, 199, - 109, 16, 40, 237, 204, 171, 154, 199, 109, 16, 40, 237, 204, 178, 154, - 199, 109, 16, 40, 237, 204, 199, 95, 154, 199, 109, 16, 40, 237, 204, - 234, 127, 154, 199, 109, 16, 40, 237, 204, 197, 37, 154, 199, 109, 16, - 40, 237, 204, 198, 251, 154, 199, 109, 16, 40, 237, 204, 232, 122, 154, - 199, 109, 16, 40, 237, 204, 233, 19, 154, 199, 109, 16, 40, 237, 204, - 202, 130, 154, 199, 109, 16, 40, 237, 204, 203, 244, 154, 199, 109, 16, - 40, 237, 204, 234, 161, 154, 199, 109, 16, 40, 237, 204, 213, 171, 154, - 199, 109, 16, 40, 237, 204, 197, 32, 154, 199, 109, 16, 40, 237, 204, - 197, 25, 154, 199, 109, 16, 40, 237, 204, 197, 20, 154, 199, 109, 16, 40, - 237, 204, 197, 22, 154, 199, 109, 16, 40, 237, 204, 197, 27, 154, 199, - 109, 16, 40, 237, 204, 197, 28, 154, 199, 109, 16, 40, 237, 204, 197, 23, - 154, 199, 109, 16, 40, 237, 204, 197, 24, 154, 199, 109, 16, 40, 237, - 204, 197, 31, 154, 199, 109, 16, 40, 237, 204, 197, 26, 154, 199, 109, - 16, 40, 237, 204, 198, 249, 154, 199, 109, 16, 40, 237, 204, 198, 247, - 51, 231, 222, 229, 181, 40, 199, 34, 238, 231, 229, 219, 229, 181, 40, - 199, 34, 207, 100, 234, 207, 229, 181, 40, 237, 14, 250, 183, 199, 34, - 248, 247, 229, 181, 40, 191, 238, 232, 168, 229, 181, 40, 193, 171, 229, - 181, 40, 239, 53, 229, 181, 40, 199, 34, 250, 246, 229, 181, 40, 229, 6, - 198, 87, 229, 181, 40, 2, 199, 194, 229, 181, 40, 198, 1, 229, 181, 40, - 210, 60, 229, 181, 40, 201, 104, 229, 181, 40, 233, 43, 229, 181, 40, - 230, 206, 209, 21, 229, 181, 40, 215, 254, 229, 181, 40, 234, 74, 229, - 181, 40, 232, 169, 229, 181, 40, 193, 21, 211, 105, 199, 34, 237, 141, - 229, 181, 40, 251, 43, 229, 181, 40, 239, 31, 229, 181, 40, 248, 145, - 198, 215, 229, 181, 40, 230, 227, 229, 181, 40, 201, 208, 251, 63, 229, - 181, 40, 207, 22, 229, 181, 40, 223, 124, 229, 181, 40, 230, 206, 199, - 194, 229, 181, 40, 215, 180, 239, 0, 229, 181, 40, 230, 206, 208, 224, - 229, 181, 40, 199, 34, 252, 65, 193, 143, 229, 181, 40, 199, 34, 242, - 227, 232, 243, 229, 181, 40, 223, 138, 229, 181, 40, 235, 64, 229, 181, - 40, 207, 25, 229, 181, 40, 230, 206, 208, 254, 229, 181, 40, 208, 197, - 229, 181, 40, 237, 220, 79, 199, 34, 219, 132, 229, 181, 40, 199, 34, - 233, 81, 229, 181, 40, 211, 62, 229, 181, 40, 211, 167, 229, 181, 40, - 237, 111, 229, 181, 40, 237, 133, 229, 181, 40, 223, 153, 229, 181, 40, - 248, 41, 229, 181, 40, 242, 76, 119, 216, 206, 229, 181, 40, 231, 190, - 198, 87, 229, 181, 40, 208, 135, 196, 67, 229, 181, 40, 211, 61, 229, - 181, 40, 199, 34, 193, 109, 229, 181, 40, 207, 13, 229, 181, 40, 199, 34, - 247, 72, 229, 181, 40, 199, 34, 250, 242, 198, 209, 229, 181, 40, 199, - 34, 222, 10, 201, 70, 215, 184, 229, 181, 40, 237, 76, 229, 181, 40, 199, - 34, 217, 47, 217, 111, 229, 181, 40, 252, 66, 229, 181, 40, 199, 34, 193, - 161, 229, 181, 40, 199, 34, 231, 145, 193, 66, 229, 181, 40, 199, 34, - 222, 184, 220, 43, 229, 181, 40, 236, 219, 229, 181, 40, 219, 119, 229, - 181, 40, 223, 127, 197, 176, 229, 181, 40, 2, 208, 224, 229, 181, 40, - 251, 254, 242, 66, 229, 181, 40, 248, 250, 242, 66, 11, 5, 223, 53, 11, - 5, 223, 45, 11, 5, 68, 11, 5, 223, 80, 11, 5, 223, 224, 11, 5, 223, 207, - 11, 5, 223, 226, 11, 5, 223, 225, 11, 5, 250, 182, 11, 5, 250, 133, 11, - 5, 65, 11, 5, 251, 65, 11, 5, 196, 78, 11, 5, 196, 82, 11, 5, 196, 79, - 11, 5, 211, 30, 11, 5, 210, 247, 11, 5, 74, 11, 5, 211, 78, 11, 5, 233, - 221, 11, 5, 71, 11, 5, 193, 0, 11, 5, 248, 148, 11, 5, 248, 143, 11, 5, - 248, 188, 11, 5, 248, 161, 11, 5, 248, 177, 11, 5, 248, 176, 11, 5, 248, - 179, 11, 5, 248, 178, 11, 5, 249, 64, 11, 5, 249, 56, 11, 5, 249, 153, - 11, 5, 249, 89, 11, 5, 247, 234, 11, 5, 247, 238, 11, 5, 247, 235, 11, 5, - 248, 81, 11, 5, 248, 62, 11, 5, 248, 111, 11, 5, 248, 89, 11, 5, 248, - 206, 11, 5, 249, 17, 11, 5, 248, 219, 11, 5, 247, 217, 11, 5, 247, 211, - 11, 5, 248, 10, 11, 5, 247, 232, 11, 5, 247, 225, 11, 5, 247, 230, 11, 5, - 247, 199, 11, 5, 247, 197, 11, 5, 247, 204, 11, 5, 247, 202, 11, 5, 247, - 200, 11, 5, 247, 201, 11, 5, 209, 117, 11, 5, 209, 113, 11, 5, 209, 185, - 11, 5, 209, 129, 11, 5, 209, 149, 11, 5, 209, 176, 11, 5, 209, 172, 11, - 5, 210, 89, 11, 5, 210, 73, 11, 5, 168, 11, 5, 210, 137, 11, 5, 208, 145, - 11, 5, 208, 147, 11, 5, 208, 146, 11, 5, 209, 14, 11, 5, 208, 252, 11, 5, - 209, 73, 11, 5, 209, 33, 11, 5, 208, 131, 11, 5, 208, 126, 11, 5, 208, - 165, 11, 5, 208, 144, 11, 5, 208, 136, 11, 5, 208, 142, 11, 5, 208, 108, - 11, 5, 208, 107, 11, 5, 208, 112, 11, 5, 208, 111, 11, 5, 208, 109, 11, - 5, 208, 110, 11, 5, 249, 38, 11, 5, 249, 37, 11, 5, 249, 44, 11, 5, 249, - 39, 11, 5, 249, 41, 11, 5, 249, 40, 11, 5, 249, 43, 11, 5, 249, 42, 11, - 5, 249, 50, 11, 5, 249, 49, 11, 5, 249, 53, 11, 5, 249, 51, 11, 5, 249, - 29, 11, 5, 249, 31, 11, 5, 249, 30, 11, 5, 249, 34, 11, 5, 249, 33, 11, - 5, 249, 36, 11, 5, 249, 35, 11, 5, 249, 45, 11, 5, 249, 48, 11, 5, 249, - 46, 11, 5, 249, 25, 11, 5, 249, 24, 11, 5, 249, 32, 11, 5, 249, 28, 11, - 5, 249, 26, 11, 5, 249, 27, 11, 5, 249, 21, 11, 5, 249, 20, 11, 5, 249, - 23, 11, 5, 249, 22, 11, 5, 214, 185, 11, 5, 214, 184, 11, 5, 214, 190, - 11, 5, 214, 186, 11, 5, 214, 187, 11, 5, 214, 189, 11, 5, 214, 188, 11, - 5, 214, 193, 11, 5, 214, 192, 11, 5, 214, 195, 11, 5, 214, 194, 11, 5, - 214, 181, 11, 5, 214, 180, 11, 5, 214, 183, 11, 5, 214, 182, 11, 5, 214, - 174, 11, 5, 214, 173, 11, 5, 214, 178, 11, 5, 214, 177, 11, 5, 214, 175, - 11, 5, 214, 176, 11, 5, 214, 168, 11, 5, 214, 167, 11, 5, 214, 172, 11, - 5, 214, 171, 11, 5, 214, 169, 11, 5, 214, 170, 11, 5, 229, 67, 11, 5, - 229, 66, 11, 5, 229, 72, 11, 5, 229, 68, 11, 5, 229, 69, 11, 5, 229, 71, - 11, 5, 229, 70, 11, 5, 229, 75, 11, 5, 229, 74, 11, 5, 229, 77, 11, 5, - 229, 76, 11, 5, 229, 58, 11, 5, 229, 60, 11, 5, 229, 59, 11, 5, 229, 63, - 11, 5, 229, 62, 11, 5, 229, 65, 11, 5, 229, 64, 11, 5, 229, 54, 11, 5, - 229, 53, 11, 5, 229, 61, 11, 5, 229, 57, 11, 5, 229, 55, 11, 5, 229, 56, - 11, 5, 229, 48, 11, 5, 229, 52, 11, 5, 229, 51, 11, 5, 229, 49, 11, 5, - 229, 50, 11, 5, 216, 23, 11, 5, 216, 22, 11, 5, 216, 100, 11, 5, 216, 31, - 11, 5, 216, 63, 11, 5, 216, 81, 11, 5, 216, 79, 11, 5, 217, 30, 11, 5, - 217, 24, 11, 5, 174, 11, 5, 217, 71, 11, 5, 215, 115, 11, 5, 215, 114, - 11, 5, 215, 118, 11, 5, 215, 116, 11, 5, 215, 195, 11, 5, 215, 168, 11, - 5, 216, 12, 11, 5, 215, 202, 11, 5, 216, 152, 11, 5, 216, 232, 11, 5, - 215, 95, 11, 5, 215, 89, 11, 5, 215, 155, 11, 5, 215, 111, 11, 5, 215, - 104, 11, 5, 215, 109, 11, 5, 215, 65, 11, 5, 215, 64, 11, 5, 215, 70, 11, - 5, 215, 67, 11, 5, 232, 229, 11, 5, 232, 222, 11, 5, 233, 23, 11, 5, 232, - 245, 11, 5, 233, 72, 11, 5, 233, 63, 11, 5, 233, 109, 11, 5, 233, 77, 11, - 5, 232, 119, 11, 5, 232, 175, 11, 5, 232, 154, 11, 5, 232, 68, 11, 5, - 232, 67, 11, 5, 232, 86, 11, 5, 232, 73, 11, 5, 232, 71, 11, 5, 232, 72, - 11, 5, 232, 54, 11, 5, 232, 53, 11, 5, 232, 57, 11, 5, 232, 55, 11, 5, + 159, 47, 72, 181, 47, 72, 213, 221, 47, 72, 212, 180, 47, 72, 214, 123, + 47, 72, 213, 45, 47, 72, 140, 47, 72, 229, 160, 47, 72, 228, 161, 47, 72, + 229, 247, 47, 72, 229, 25, 47, 72, 174, 47, 72, 216, 102, 47, 72, 215, + 157, 47, 72, 216, 234, 47, 72, 216, 14, 47, 72, 170, 47, 72, 191, 225, + 47, 72, 192, 12, 47, 72, 165, 47, 72, 207, 2, 47, 72, 206, 69, 47, 72, + 207, 115, 47, 72, 206, 163, 47, 72, 193, 190, 47, 72, 193, 86, 47, 72, + 193, 125, 47, 72, 193, 48, 51, 234, 35, 214, 230, 207, 69, 51, 251, 66, + 51, 250, 223, 51, 251, 94, 51, 252, 165, 51, 223, 132, 51, 223, 99, 51, + 196, 80, 51, 234, 4, 51, 234, 187, 51, 211, 92, 51, 211, 85, 51, 222, + 102, 51, 222, 65, 51, 222, 60, 51, 231, 197, 51, 231, 207, 51, 231, 43, + 51, 231, 37, 51, 220, 146, 51, 231, 28, 51, 221, 133, 51, 221, 132, 51, + 221, 131, 51, 221, 130, 51, 230, 148, 51, 230, 147, 51, 220, 195, 51, + 220, 198, 51, 222, 11, 51, 221, 31, 51, 221, 40, 51, 205, 181, 51, 205, + 134, 51, 202, 142, 51, 204, 16, 51, 204, 15, 51, 238, 30, 51, 237, 83, + 51, 236, 143, 51, 198, 81, 51, 214, 223, 51, 213, 2, 51, 230, 77, 51, + 210, 216, 51, 210, 215, 51, 249, 152, 51, 209, 183, 51, 209, 145, 51, + 209, 146, 51, 248, 158, 51, 228, 156, 51, 228, 150, 51, 247, 223, 51, + 228, 134, 51, 229, 208, 51, 209, 243, 51, 210, 31, 51, 229, 189, 51, 210, + 27, 51, 210, 45, 51, 248, 254, 51, 209, 59, 51, 248, 86, 51, 229, 1, 51, + 209, 40, 51, 228, 248, 51, 228, 250, 51, 217, 112, 51, 217, 108, 51, 217, + 117, 51, 217, 46, 51, 217, 78, 51, 216, 58, 51, 216, 31, 51, 216, 30, 51, + 216, 205, 51, 216, 202, 51, 216, 206, 51, 192, 139, 51, 192, 137, 51, + 191, 210, 51, 206, 179, 51, 206, 183, 51, 206, 36, 51, 206, 29, 51, 207, + 58, 51, 207, 55, 51, 193, 141, 148, 199, 109, 16, 40, 228, 179, 191, 77, + 148, 199, 109, 16, 40, 228, 179, 107, 148, 199, 109, 16, 40, 228, 179, + 109, 148, 199, 109, 16, 40, 228, 179, 138, 148, 199, 109, 16, 40, 228, + 179, 134, 148, 199, 109, 16, 40, 228, 179, 150, 148, 199, 109, 16, 40, + 228, 179, 169, 148, 199, 109, 16, 40, 228, 179, 175, 148, 199, 109, 16, + 40, 228, 179, 171, 148, 199, 109, 16, 40, 228, 179, 178, 148, 199, 109, + 16, 40, 228, 179, 199, 95, 148, 199, 109, 16, 40, 228, 179, 234, 129, + 148, 199, 109, 16, 40, 228, 179, 197, 37, 148, 199, 109, 16, 40, 228, + 179, 198, 251, 148, 199, 109, 16, 40, 228, 179, 232, 124, 148, 199, 109, + 16, 40, 228, 179, 233, 21, 148, 199, 109, 16, 40, 228, 179, 202, 131, + 148, 199, 109, 16, 40, 228, 179, 203, 245, 148, 199, 109, 16, 40, 228, + 179, 234, 163, 148, 199, 109, 16, 40, 228, 179, 213, 173, 148, 199, 109, + 16, 40, 228, 179, 197, 32, 148, 199, 109, 16, 40, 228, 179, 197, 25, 148, + 199, 109, 16, 40, 228, 179, 197, 20, 148, 199, 109, 16, 40, 228, 179, + 197, 22, 148, 199, 109, 16, 40, 228, 179, 197, 27, 51, 228, 170, 51, 238, + 34, 51, 250, 165, 51, 164, 51, 211, 11, 51, 210, 70, 51, 236, 179, 51, + 236, 180, 201, 190, 51, 236, 180, 238, 191, 51, 223, 51, 51, 234, 35, + 214, 230, 229, 209, 51, 234, 35, 214, 230, 200, 66, 51, 234, 35, 214, + 230, 199, 212, 51, 234, 35, 214, 230, 216, 201, 51, 238, 255, 51, 210, + 223, 251, 137, 51, 181, 51, 215, 158, 65, 51, 174, 51, 155, 51, 222, 27, + 51, 217, 18, 51, 231, 185, 51, 247, 146, 51, 222, 26, 51, 209, 233, 51, + 214, 74, 51, 215, 158, 233, 177, 51, 215, 158, 232, 53, 51, 216, 143, 51, + 221, 219, 51, 228, 85, 51, 221, 170, 51, 216, 104, 51, 231, 57, 51, 198, + 195, 51, 215, 158, 172, 51, 216, 22, 51, 236, 189, 51, 221, 97, 51, 232, + 179, 51, 213, 83, 51, 215, 158, 218, 170, 51, 216, 19, 51, 242, 201, 51, + 221, 83, 51, 216, 20, 201, 190, 51, 242, 202, 201, 190, 51, 218, 171, + 201, 190, 51, 221, 84, 201, 190, 51, 216, 20, 238, 191, 51, 242, 202, + 238, 191, 51, 218, 171, 238, 191, 51, 221, 84, 238, 191, 51, 218, 171, + 139, 206, 9, 51, 218, 171, 139, 206, 10, 201, 190, 51, 168, 51, 221, 23, + 51, 215, 168, 51, 230, 231, 51, 207, 170, 51, 207, 171, 139, 206, 9, 51, + 207, 171, 139, 206, 10, 201, 190, 51, 208, 180, 51, 212, 221, 51, 215, + 158, 206, 9, 51, 215, 160, 51, 208, 126, 51, 212, 114, 51, 215, 158, 196, + 12, 51, 215, 89, 51, 220, 184, 51, 215, 90, 216, 205, 51, 208, 125, 51, + 212, 113, 51, 215, 158, 193, 224, 51, 215, 83, 51, 220, 182, 51, 215, 84, + 216, 205, 51, 222, 155, 211, 136, 51, 218, 171, 211, 136, 51, 251, 151, + 51, 248, 59, 51, 247, 68, 51, 247, 45, 51, 247, 196, 139, 221, 219, 51, + 242, 101, 51, 237, 202, 51, 230, 131, 51, 140, 51, 228, 171, 51, 223, + 164, 51, 221, 104, 51, 221, 84, 247, 112, 51, 220, 236, 51, 219, 48, 51, + 219, 47, 51, 219, 32, 51, 218, 186, 51, 217, 19, 202, 71, 51, 216, 57, + 51, 215, 235, 51, 209, 231, 51, 209, 78, 51, 208, 251, 51, 208, 249, 51, + 201, 181, 51, 200, 158, 51, 193, 127, 51, 196, 13, 139, 218, 170, 51, 42, + 139, 218, 170, 148, 199, 109, 16, 40, 237, 206, 107, 148, 199, 109, 16, + 40, 237, 206, 109, 148, 199, 109, 16, 40, 237, 206, 138, 148, 199, 109, + 16, 40, 237, 206, 134, 148, 199, 109, 16, 40, 237, 206, 150, 148, 199, + 109, 16, 40, 237, 206, 169, 148, 199, 109, 16, 40, 237, 206, 175, 148, + 199, 109, 16, 40, 237, 206, 171, 148, 199, 109, 16, 40, 237, 206, 178, + 148, 199, 109, 16, 40, 237, 206, 199, 95, 148, 199, 109, 16, 40, 237, + 206, 234, 129, 148, 199, 109, 16, 40, 237, 206, 197, 37, 148, 199, 109, + 16, 40, 237, 206, 198, 251, 148, 199, 109, 16, 40, 237, 206, 232, 124, + 148, 199, 109, 16, 40, 237, 206, 233, 21, 148, 199, 109, 16, 40, 237, + 206, 202, 131, 148, 199, 109, 16, 40, 237, 206, 203, 245, 148, 199, 109, + 16, 40, 237, 206, 234, 163, 148, 199, 109, 16, 40, 237, 206, 213, 173, + 148, 199, 109, 16, 40, 237, 206, 197, 32, 148, 199, 109, 16, 40, 237, + 206, 197, 25, 148, 199, 109, 16, 40, 237, 206, 197, 20, 148, 199, 109, + 16, 40, 237, 206, 197, 22, 148, 199, 109, 16, 40, 237, 206, 197, 27, 148, + 199, 109, 16, 40, 237, 206, 197, 28, 148, 199, 109, 16, 40, 237, 206, + 197, 23, 148, 199, 109, 16, 40, 237, 206, 197, 24, 148, 199, 109, 16, 40, + 237, 206, 197, 31, 148, 199, 109, 16, 40, 237, 206, 197, 26, 148, 199, + 109, 16, 40, 237, 206, 198, 249, 148, 199, 109, 16, 40, 237, 206, 198, + 247, 51, 231, 224, 229, 183, 40, 199, 34, 238, 233, 229, 221, 229, 183, + 40, 199, 34, 207, 102, 234, 209, 229, 183, 40, 237, 16, 250, 185, 199, + 34, 248, 249, 229, 183, 40, 191, 238, 232, 170, 229, 183, 40, 193, 171, + 229, 183, 40, 239, 55, 229, 183, 40, 199, 34, 250, 248, 229, 183, 40, + 229, 8, 198, 87, 229, 183, 40, 2, 199, 194, 229, 183, 40, 198, 1, 229, + 183, 40, 210, 62, 229, 183, 40, 201, 105, 229, 183, 40, 233, 45, 229, + 183, 40, 230, 208, 209, 23, 229, 183, 40, 216, 0, 229, 183, 40, 234, 76, + 229, 183, 40, 232, 171, 229, 183, 40, 193, 21, 211, 107, 199, 34, 237, + 143, 229, 183, 40, 251, 45, 229, 183, 40, 239, 33, 229, 183, 40, 248, + 147, 198, 215, 229, 183, 40, 230, 229, 229, 183, 40, 201, 209, 251, 65, + 229, 183, 40, 207, 23, 229, 183, 40, 223, 126, 229, 183, 40, 230, 208, + 199, 194, 229, 183, 40, 215, 182, 239, 2, 229, 183, 40, 230, 208, 208, + 226, 229, 183, 40, 199, 34, 252, 67, 193, 143, 229, 183, 40, 199, 34, + 242, 229, 232, 245, 229, 183, 40, 223, 140, 229, 183, 40, 235, 66, 229, + 183, 40, 207, 26, 229, 183, 40, 230, 208, 209, 0, 229, 183, 40, 208, 199, + 229, 183, 40, 237, 222, 79, 199, 34, 219, 134, 229, 183, 40, 199, 34, + 233, 83, 229, 183, 40, 211, 64, 229, 183, 40, 211, 169, 229, 183, 40, + 237, 113, 229, 183, 40, 237, 135, 229, 183, 40, 223, 155, 229, 183, 40, + 248, 43, 229, 183, 40, 242, 78, 119, 216, 208, 229, 183, 40, 231, 192, + 198, 87, 229, 183, 40, 208, 137, 196, 67, 229, 183, 40, 211, 63, 229, + 183, 40, 199, 34, 193, 109, 229, 183, 40, 207, 14, 229, 183, 40, 199, 34, + 247, 74, 229, 183, 40, 199, 34, 250, 244, 198, 209, 229, 183, 40, 199, + 34, 222, 12, 201, 71, 215, 186, 229, 183, 40, 237, 78, 229, 183, 40, 199, + 34, 217, 49, 217, 113, 229, 183, 40, 252, 68, 229, 183, 40, 199, 34, 193, + 161, 229, 183, 40, 199, 34, 231, 147, 193, 66, 229, 183, 40, 199, 34, + 222, 186, 220, 45, 229, 183, 40, 236, 221, 229, 183, 40, 219, 121, 229, + 183, 40, 223, 129, 197, 176, 229, 183, 40, 2, 208, 226, 229, 183, 40, + 252, 0, 242, 68, 229, 183, 40, 248, 252, 242, 68, 11, 5, 223, 55, 11, 5, + 223, 47, 11, 5, 68, 11, 5, 223, 82, 11, 5, 223, 226, 11, 5, 223, 209, 11, + 5, 223, 228, 11, 5, 223, 227, 11, 5, 250, 184, 11, 5, 250, 135, 11, 5, + 65, 11, 5, 251, 67, 11, 5, 196, 78, 11, 5, 196, 82, 11, 5, 196, 79, 11, + 5, 211, 32, 11, 5, 210, 249, 11, 5, 74, 11, 5, 211, 80, 11, 5, 233, 223, + 11, 5, 71, 11, 5, 193, 0, 11, 5, 248, 150, 11, 5, 248, 145, 11, 5, 248, + 190, 11, 5, 248, 163, 11, 5, 248, 179, 11, 5, 248, 178, 11, 5, 248, 181, + 11, 5, 248, 180, 11, 5, 249, 66, 11, 5, 249, 58, 11, 5, 249, 155, 11, 5, + 249, 91, 11, 5, 247, 236, 11, 5, 247, 240, 11, 5, 247, 237, 11, 5, 248, + 83, 11, 5, 248, 64, 11, 5, 248, 113, 11, 5, 248, 91, 11, 5, 248, 208, 11, + 5, 249, 19, 11, 5, 248, 221, 11, 5, 247, 219, 11, 5, 247, 213, 11, 5, + 248, 12, 11, 5, 247, 234, 11, 5, 247, 227, 11, 5, 247, 232, 11, 5, 247, + 201, 11, 5, 247, 199, 11, 5, 247, 206, 11, 5, 247, 204, 11, 5, 247, 202, + 11, 5, 247, 203, 11, 5, 209, 119, 11, 5, 209, 115, 11, 5, 209, 187, 11, + 5, 209, 131, 11, 5, 209, 151, 11, 5, 209, 178, 11, 5, 209, 174, 11, 5, + 210, 91, 11, 5, 210, 75, 11, 5, 168, 11, 5, 210, 139, 11, 5, 208, 147, + 11, 5, 208, 149, 11, 5, 208, 148, 11, 5, 209, 16, 11, 5, 208, 254, 11, 5, + 209, 75, 11, 5, 209, 35, 11, 5, 208, 133, 11, 5, 208, 128, 11, 5, 208, + 167, 11, 5, 208, 146, 11, 5, 208, 138, 11, 5, 208, 144, 11, 5, 208, 110, + 11, 5, 208, 109, 11, 5, 208, 114, 11, 5, 208, 113, 11, 5, 208, 111, 11, + 5, 208, 112, 11, 5, 249, 40, 11, 5, 249, 39, 11, 5, 249, 46, 11, 5, 249, + 41, 11, 5, 249, 43, 11, 5, 249, 42, 11, 5, 249, 45, 11, 5, 249, 44, 11, + 5, 249, 52, 11, 5, 249, 51, 11, 5, 249, 55, 11, 5, 249, 53, 11, 5, 249, + 31, 11, 5, 249, 33, 11, 5, 249, 32, 11, 5, 249, 36, 11, 5, 249, 35, 11, + 5, 249, 38, 11, 5, 249, 37, 11, 5, 249, 47, 11, 5, 249, 50, 11, 5, 249, + 48, 11, 5, 249, 27, 11, 5, 249, 26, 11, 5, 249, 34, 11, 5, 249, 30, 11, + 5, 249, 28, 11, 5, 249, 29, 11, 5, 249, 23, 11, 5, 249, 22, 11, 5, 249, + 25, 11, 5, 249, 24, 11, 5, 214, 187, 11, 5, 214, 186, 11, 5, 214, 192, + 11, 5, 214, 188, 11, 5, 214, 189, 11, 5, 214, 191, 11, 5, 214, 190, 11, + 5, 214, 195, 11, 5, 214, 194, 11, 5, 214, 197, 11, 5, 214, 196, 11, 5, + 214, 183, 11, 5, 214, 182, 11, 5, 214, 185, 11, 5, 214, 184, 11, 5, 214, + 176, 11, 5, 214, 175, 11, 5, 214, 180, 11, 5, 214, 179, 11, 5, 214, 177, + 11, 5, 214, 178, 11, 5, 214, 170, 11, 5, 214, 169, 11, 5, 214, 174, 11, + 5, 214, 173, 11, 5, 214, 171, 11, 5, 214, 172, 11, 5, 229, 69, 11, 5, + 229, 68, 11, 5, 229, 74, 11, 5, 229, 70, 11, 5, 229, 71, 11, 5, 229, 73, + 11, 5, 229, 72, 11, 5, 229, 77, 11, 5, 229, 76, 11, 5, 229, 79, 11, 5, + 229, 78, 11, 5, 229, 60, 11, 5, 229, 62, 11, 5, 229, 61, 11, 5, 229, 65, + 11, 5, 229, 64, 11, 5, 229, 67, 11, 5, 229, 66, 11, 5, 229, 56, 11, 5, + 229, 55, 11, 5, 229, 63, 11, 5, 229, 59, 11, 5, 229, 57, 11, 5, 229, 58, + 11, 5, 229, 50, 11, 5, 229, 54, 11, 5, 229, 53, 11, 5, 229, 51, 11, 5, + 229, 52, 11, 5, 216, 25, 11, 5, 216, 24, 11, 5, 216, 102, 11, 5, 216, 33, + 11, 5, 216, 65, 11, 5, 216, 83, 11, 5, 216, 81, 11, 5, 217, 32, 11, 5, + 217, 26, 11, 5, 174, 11, 5, 217, 73, 11, 5, 215, 117, 11, 5, 215, 116, + 11, 5, 215, 120, 11, 5, 215, 118, 11, 5, 215, 197, 11, 5, 215, 170, 11, + 5, 216, 14, 11, 5, 215, 204, 11, 5, 216, 154, 11, 5, 216, 234, 11, 5, + 215, 97, 11, 5, 215, 91, 11, 5, 215, 157, 11, 5, 215, 113, 11, 5, 215, + 106, 11, 5, 215, 111, 11, 5, 215, 67, 11, 5, 215, 66, 11, 5, 215, 72, 11, + 5, 215, 69, 11, 5, 232, 231, 11, 5, 232, 224, 11, 5, 233, 25, 11, 5, 232, + 247, 11, 5, 233, 74, 11, 5, 233, 65, 11, 5, 233, 111, 11, 5, 233, 79, 11, + 5, 232, 121, 11, 5, 232, 177, 11, 5, 232, 156, 11, 5, 232, 70, 11, 5, + 232, 69, 11, 5, 232, 88, 11, 5, 232, 75, 11, 5, 232, 73, 11, 5, 232, 74, + 11, 5, 232, 56, 11, 5, 232, 55, 11, 5, 232, 59, 11, 5, 232, 57, 11, 5, 195, 32, 11, 5, 195, 26, 11, 5, 195, 69, 11, 5, 195, 41, 11, 5, 195, 58, 11, 5, 195, 53, 11, 5, 195, 61, 11, 5, 195, 60, 11, 5, 195, 162, 11, 5, 195, 157, 11, 5, 195, 188, 11, 5, 195, 175, 11, 5, 195, 4, 11, 5, 195, 0, 11, 5, 195, 24, 11, 5, 195, 6, 11, 5, 195, 73, 11, 5, 195, 141, 11, 5, 193, 242, 11, 5, 193, 240, 11, 5, 193, 249, 11, 5, 193, 245, 11, 5, 193, 243, 11, 5, 193, 244, 11, 5, 193, 229, 11, 5, 193, 228, 11, 5, 193, 235, - 11, 5, 193, 234, 11, 5, 193, 232, 11, 5, 193, 233, 11, 5, 236, 212, 11, - 5, 236, 197, 11, 5, 237, 44, 11, 5, 236, 240, 11, 5, 237, 19, 11, 5, 237, - 24, 11, 5, 237, 23, 11, 5, 237, 211, 11, 5, 237, 205, 11, 5, 238, 32, 11, - 5, 237, 231, 11, 5, 235, 69, 11, 5, 235, 70, 11, 5, 236, 140, 11, 5, 235, - 117, 11, 5, 236, 174, 11, 5, 236, 143, 11, 5, 237, 74, 11, 5, 237, 146, - 11, 5, 237, 96, 11, 5, 235, 60, 11, 5, 235, 58, 11, 5, 235, 89, 11, 5, - 235, 68, 11, 5, 235, 63, 11, 5, 235, 66, 11, 5, 198, 125, 11, 5, 198, + 11, 5, 193, 234, 11, 5, 193, 232, 11, 5, 193, 233, 11, 5, 236, 214, 11, + 5, 236, 199, 11, 5, 237, 46, 11, 5, 236, 242, 11, 5, 237, 21, 11, 5, 237, + 26, 11, 5, 237, 25, 11, 5, 237, 213, 11, 5, 237, 207, 11, 5, 238, 34, 11, + 5, 237, 233, 11, 5, 235, 71, 11, 5, 235, 72, 11, 5, 236, 142, 11, 5, 235, + 119, 11, 5, 236, 176, 11, 5, 236, 145, 11, 5, 237, 76, 11, 5, 237, 148, + 11, 5, 237, 98, 11, 5, 235, 62, 11, 5, 235, 60, 11, 5, 235, 91, 11, 5, + 235, 70, 11, 5, 235, 65, 11, 5, 235, 68, 11, 5, 198, 125, 11, 5, 198, 117, 11, 5, 198, 193, 11, 5, 198, 135, 11, 5, 198, 176, 11, 5, 198, 178, 11, 5, 198, 177, 11, 5, 199, 171, 11, 5, 199, 156, 11, 5, 190, 190, 11, 5, 199, 183, 11, 5, 197, 69, 11, 5, 197, 68, 11, 5, 197, 71, 11, 5, 197, 70, 11, 5, 198, 40, 11, 5, 198, 29, 11, 5, 159, 11, 5, 198, 53, 11, 5, 199, 55, 11, 5, 199, 145, 11, 5, 199, 82, 11, 5, 197, 52, 11, 5, 197, 47, 11, 5, 197, 94, 11, 5, 197, 67, 11, 5, 197, 53, 11, 5, 197, 64, 11, 5, - 237, 163, 11, 5, 237, 162, 11, 5, 237, 168, 11, 5, 237, 164, 11, 5, 237, - 165, 11, 5, 237, 167, 11, 5, 237, 166, 11, 5, 237, 184, 11, 5, 237, 183, - 11, 5, 237, 191, 11, 5, 237, 185, 11, 5, 237, 153, 11, 5, 237, 155, 11, - 5, 237, 154, 11, 5, 237, 158, 11, 5, 237, 157, 11, 5, 237, 161, 11, 5, - 237, 159, 11, 5, 237, 176, 11, 5, 237, 179, 11, 5, 237, 177, 11, 5, 237, - 149, 11, 5, 237, 148, 11, 5, 237, 156, 11, 5, 237, 152, 11, 5, 237, 150, - 11, 5, 237, 151, 11, 5, 214, 140, 11, 5, 214, 139, 11, 5, 214, 147, 11, - 5, 214, 142, 11, 5, 214, 143, 11, 5, 214, 144, 11, 5, 214, 156, 11, 5, - 214, 155, 11, 5, 214, 162, 11, 5, 214, 157, 11, 5, 214, 132, 11, 5, 214, - 131, 11, 5, 214, 138, 11, 5, 214, 133, 11, 5, 214, 148, 11, 5, 214, 154, - 11, 5, 214, 152, 11, 5, 214, 124, 11, 5, 214, 123, 11, 5, 214, 129, 11, - 5, 214, 127, 11, 5, 214, 125, 11, 5, 214, 126, 11, 5, 229, 33, 11, 5, - 229, 32, 11, 5, 229, 39, 11, 5, 229, 34, 11, 5, 229, 36, 11, 5, 229, 35, - 11, 5, 229, 38, 11, 5, 229, 37, 11, 5, 229, 45, 11, 5, 229, 43, 11, 5, - 229, 47, 11, 5, 229, 46, 11, 5, 229, 26, 11, 5, 229, 27, 11, 5, 229, 30, - 11, 5, 229, 29, 11, 5, 229, 31, 11, 5, 229, 40, 11, 5, 229, 42, 11, 5, - 229, 41, 11, 5, 229, 25, 11, 5, 213, 162, 11, 5, 213, 160, 11, 5, 213, - 219, 11, 5, 213, 165, 11, 5, 213, 193, 11, 5, 213, 207, 11, 5, 213, 206, - 11, 5, 214, 200, 11, 5, 180, 11, 5, 214, 218, 11, 5, 212, 122, 11, 5, - 212, 124, 11, 5, 212, 123, 11, 5, 213, 11, 11, 5, 212, 251, 11, 5, 213, - 43, 11, 5, 213, 22, 11, 5, 214, 74, 11, 5, 214, 121, 11, 5, 214, 97, 11, - 5, 212, 117, 11, 5, 212, 113, 11, 5, 212, 178, 11, 5, 212, 121, 11, 5, - 212, 119, 11, 5, 212, 120, 11, 5, 229, 98, 11, 5, 229, 97, 11, 5, 229, - 103, 11, 5, 229, 99, 11, 5, 229, 100, 11, 5, 229, 102, 11, 5, 229, 101, - 11, 5, 229, 109, 11, 5, 229, 107, 11, 5, 229, 111, 11, 5, 229, 110, 11, - 5, 229, 90, 11, 5, 229, 92, 11, 5, 229, 91, 11, 5, 229, 94, 11, 5, 229, - 96, 11, 5, 229, 95, 11, 5, 229, 104, 11, 5, 229, 106, 11, 5, 229, 105, - 11, 5, 229, 86, 11, 5, 229, 85, 11, 5, 229, 93, 11, 5, 229, 89, 11, 5, - 229, 87, 11, 5, 229, 88, 11, 5, 229, 80, 11, 5, 229, 79, 11, 5, 229, 84, - 11, 5, 229, 83, 11, 5, 229, 81, 11, 5, 229, 82, 11, 5, 219, 87, 11, 5, - 219, 79, 11, 5, 219, 146, 11, 5, 219, 98, 11, 5, 219, 137, 11, 5, 219, - 136, 11, 5, 219, 140, 11, 5, 219, 138, 11, 5, 220, 5, 11, 5, 219, 249, - 11, 5, 173, 11, 5, 220, 16, 11, 5, 218, 201, 11, 5, 218, 200, 11, 5, 218, - 203, 11, 5, 218, 202, 11, 5, 218, 249, 11, 5, 218, 234, 11, 5, 219, 43, - 11, 5, 219, 1, 11, 5, 219, 164, 11, 5, 219, 238, 11, 5, 219, 184, 11, 5, - 218, 195, 11, 5, 218, 193, 11, 5, 218, 225, 11, 5, 218, 199, 11, 5, 218, - 197, 11, 5, 218, 198, 11, 5, 218, 173, 11, 5, 218, 172, 11, 5, 218, 183, - 11, 5, 218, 176, 11, 5, 218, 174, 11, 5, 218, 175, 11, 5, 231, 22, 11, 5, - 231, 21, 11, 5, 231, 53, 11, 5, 231, 34, 11, 5, 231, 45, 11, 5, 231, 44, - 11, 5, 231, 47, 11, 5, 231, 46, 11, 5, 231, 192, 11, 5, 231, 187, 11, 5, - 231, 240, 11, 5, 231, 203, 11, 5, 230, 152, 11, 5, 230, 151, 11, 5, 230, - 154, 11, 5, 230, 153, 11, 5, 230, 232, 11, 5, 230, 230, 11, 5, 231, 3, - 11, 5, 230, 242, 11, 5, 231, 131, 11, 5, 231, 129, 11, 5, 231, 165, 11, - 5, 231, 142, 11, 5, 230, 140, 11, 5, 230, 139, 11, 5, 230, 179, 11, 5, - 230, 150, 11, 5, 230, 141, 11, 5, 230, 149, 11, 5, 221, 120, 11, 5, 221, - 115, 11, 5, 221, 166, 11, 5, 221, 134, 11, 5, 221, 147, 11, 5, 221, 151, - 11, 5, 221, 149, 11, 5, 222, 49, 11, 5, 222, 30, 11, 5, 155, 11, 5, 222, - 78, 11, 5, 220, 202, 11, 5, 220, 207, 11, 5, 220, 204, 11, 5, 221, 28, - 11, 5, 221, 23, 11, 5, 221, 67, 11, 5, 221, 36, 11, 5, 221, 241, 11, 5, - 221, 224, 11, 5, 222, 22, 11, 5, 221, 245, 11, 5, 220, 188, 11, 5, 220, - 184, 11, 5, 220, 232, 11, 5, 220, 201, 11, 5, 220, 192, 11, 5, 220, 197, - 11, 5, 231, 113, 11, 5, 231, 112, 11, 5, 231, 117, 11, 5, 231, 114, 11, - 5, 231, 116, 11, 5, 231, 115, 11, 5, 231, 124, 11, 5, 231, 123, 11, 5, - 231, 127, 11, 5, 231, 125, 11, 5, 231, 104, 11, 5, 231, 103, 11, 5, 231, - 106, 11, 5, 231, 105, 11, 5, 231, 109, 11, 5, 231, 108, 11, 5, 231, 111, - 11, 5, 231, 110, 11, 5, 231, 119, 11, 5, 231, 118, 11, 5, 231, 122, 11, - 5, 231, 120, 11, 5, 231, 99, 11, 5, 231, 98, 11, 5, 231, 107, 11, 5, 231, - 102, 11, 5, 231, 100, 11, 5, 231, 101, 11, 5, 216, 119, 11, 5, 216, 120, - 11, 5, 216, 138, 11, 5, 216, 137, 11, 5, 216, 140, 11, 5, 216, 139, 11, - 5, 216, 110, 11, 5, 216, 112, 11, 5, 216, 111, 11, 5, 216, 115, 11, 5, - 216, 114, 11, 5, 216, 117, 11, 5, 216, 116, 11, 5, 216, 121, 11, 5, 216, - 123, 11, 5, 216, 122, 11, 5, 216, 106, 11, 5, 216, 105, 11, 5, 216, 113, - 11, 5, 216, 109, 11, 5, 216, 107, 11, 5, 216, 108, 11, 5, 228, 104, 11, - 5, 228, 103, 11, 5, 228, 110, 11, 5, 228, 105, 11, 5, 228, 107, 11, 5, - 228, 106, 11, 5, 228, 109, 11, 5, 228, 108, 11, 5, 228, 115, 11, 5, 228, - 114, 11, 5, 228, 117, 11, 5, 228, 116, 11, 5, 228, 96, 11, 5, 228, 95, - 11, 5, 228, 98, 11, 5, 228, 97, 11, 5, 228, 100, 11, 5, 228, 99, 11, 5, - 228, 102, 11, 5, 228, 101, 11, 5, 228, 111, 11, 5, 228, 113, 11, 5, 228, - 112, 11, 5, 214, 13, 11, 5, 214, 15, 11, 5, 214, 14, 11, 5, 214, 58, 11, - 5, 214, 56, 11, 5, 214, 68, 11, 5, 214, 61, 11, 5, 213, 230, 11, 5, 213, - 229, 11, 5, 213, 231, 11, 5, 213, 241, 11, 5, 213, 238, 11, 5, 213, 249, - 11, 5, 213, 243, 11, 5, 214, 49, 11, 5, 214, 55, 11, 5, 214, 51, 11, 5, - 229, 117, 11, 5, 229, 136, 11, 5, 229, 145, 11, 5, 230, 9, 11, 5, 229, - 253, 11, 5, 140, 11, 5, 230, 21, 11, 5, 228, 134, 11, 5, 228, 133, 11, 5, - 228, 136, 11, 5, 228, 135, 11, 5, 228, 180, 11, 5, 228, 171, 11, 5, 229, - 23, 11, 5, 228, 244, 11, 5, 229, 183, 11, 5, 229, 245, 11, 5, 229, 195, - 11, 5, 193, 146, 11, 5, 193, 131, 11, 5, 193, 190, 11, 5, 193, 158, 11, - 5, 192, 245, 11, 5, 192, 247, 11, 5, 192, 246, 11, 5, 193, 13, 11, 5, - 193, 48, 11, 5, 193, 24, 11, 5, 193, 99, 11, 5, 193, 125, 11, 5, 193, - 106, 11, 5, 191, 15, 11, 5, 191, 14, 11, 5, 191, 30, 11, 5, 191, 18, 11, - 5, 191, 23, 11, 5, 191, 25, 11, 5, 191, 24, 11, 5, 191, 96, 11, 5, 191, - 93, 11, 5, 191, 123, 11, 5, 191, 104, 11, 5, 190, 244, 11, 5, 190, 246, - 11, 5, 190, 245, 11, 5, 191, 2, 11, 5, 191, 1, 11, 5, 191, 7, 11, 5, 191, - 3, 11, 5, 191, 73, 11, 5, 191, 87, 11, 5, 191, 79, 11, 5, 190, 240, 11, - 5, 190, 239, 11, 5, 190, 251, 11, 5, 190, 243, 11, 5, 190, 241, 11, 5, - 190, 242, 11, 5, 190, 226, 11, 5, 190, 225, 11, 5, 190, 231, 11, 5, 190, - 229, 11, 5, 190, 227, 11, 5, 190, 228, 11, 5, 242, 255, 11, 5, 242, 248, - 11, 5, 243, 29, 11, 5, 243, 12, 11, 5, 243, 26, 11, 5, 243, 20, 11, 5, - 243, 28, 11, 5, 243, 27, 11, 5, 247, 78, 11, 5, 247, 69, 11, 5, 247, 160, - 11, 5, 247, 111, 11, 5, 238, 183, 11, 5, 238, 185, 11, 5, 238, 184, 11, - 5, 238, 249, 11, 5, 238, 237, 11, 5, 242, 99, 11, 5, 239, 13, 11, 5, 247, - 5, 11, 5, 247, 42, 11, 5, 247, 11, 11, 5, 238, 154, 11, 5, 238, 152, 11, - 5, 238, 195, 11, 5, 238, 181, 11, 5, 238, 160, 11, 5, 238, 176, 11, 5, - 238, 130, 11, 5, 238, 129, 11, 5, 238, 143, 11, 5, 238, 137, 11, 5, 238, - 131, 11, 5, 238, 133, 11, 5, 190, 209, 11, 5, 190, 208, 11, 5, 190, 215, - 11, 5, 190, 210, 11, 5, 190, 212, 11, 5, 190, 211, 11, 5, 190, 214, 11, - 5, 190, 213, 11, 5, 190, 221, 11, 5, 190, 220, 11, 5, 190, 224, 11, 5, - 190, 222, 11, 5, 190, 205, 11, 5, 190, 207, 11, 5, 190, 206, 11, 5, 190, - 216, 11, 5, 190, 219, 11, 5, 190, 217, 11, 5, 190, 198, 11, 5, 190, 202, - 11, 5, 190, 201, 11, 5, 190, 199, 11, 5, 190, 200, 11, 5, 190, 192, 11, - 5, 190, 191, 11, 5, 190, 197, 11, 5, 190, 195, 11, 5, 190, 193, 11, 5, - 190, 194, 11, 5, 212, 33, 11, 5, 212, 32, 11, 5, 212, 38, 11, 5, 212, 34, - 11, 5, 212, 35, 11, 5, 212, 37, 11, 5, 212, 36, 11, 5, 212, 43, 11, 5, - 212, 42, 11, 5, 212, 46, 11, 5, 212, 45, 11, 5, 212, 26, 11, 5, 212, 27, - 11, 5, 212, 30, 11, 5, 212, 31, 11, 5, 212, 39, 11, 5, 212, 41, 11, 5, - 212, 21, 11, 5, 212, 29, 11, 5, 212, 25, 11, 5, 212, 22, 11, 5, 212, 23, - 11, 5, 212, 16, 11, 5, 212, 15, 11, 5, 212, 20, 11, 5, 212, 19, 11, 5, - 212, 17, 11, 5, 212, 18, 11, 5, 202, 138, 11, 5, 169, 11, 5, 202, 222, - 11, 5, 202, 142, 11, 5, 202, 202, 11, 5, 202, 205, 11, 5, 202, 203, 11, - 5, 205, 122, 11, 5, 205, 106, 11, 5, 188, 11, 5, 205, 130, 11, 5, 200, - 188, 11, 5, 200, 190, 11, 5, 200, 189, 11, 5, 202, 8, 11, 5, 201, 253, - 11, 5, 202, 46, 11, 5, 202, 14, 11, 5, 203, 238, 11, 5, 205, 68, 11, 5, - 204, 13, 11, 5, 200, 163, 11, 5, 200, 159, 11, 5, 201, 4, 11, 5, 200, + 237, 165, 11, 5, 237, 164, 11, 5, 237, 170, 11, 5, 237, 166, 11, 5, 237, + 167, 11, 5, 237, 169, 11, 5, 237, 168, 11, 5, 237, 186, 11, 5, 237, 185, + 11, 5, 237, 193, 11, 5, 237, 187, 11, 5, 237, 155, 11, 5, 237, 157, 11, + 5, 237, 156, 11, 5, 237, 160, 11, 5, 237, 159, 11, 5, 237, 163, 11, 5, + 237, 161, 11, 5, 237, 178, 11, 5, 237, 181, 11, 5, 237, 179, 11, 5, 237, + 151, 11, 5, 237, 150, 11, 5, 237, 158, 11, 5, 237, 154, 11, 5, 237, 152, + 11, 5, 237, 153, 11, 5, 214, 142, 11, 5, 214, 141, 11, 5, 214, 149, 11, + 5, 214, 144, 11, 5, 214, 145, 11, 5, 214, 146, 11, 5, 214, 158, 11, 5, + 214, 157, 11, 5, 214, 164, 11, 5, 214, 159, 11, 5, 214, 134, 11, 5, 214, + 133, 11, 5, 214, 140, 11, 5, 214, 135, 11, 5, 214, 150, 11, 5, 214, 156, + 11, 5, 214, 154, 11, 5, 214, 126, 11, 5, 214, 125, 11, 5, 214, 131, 11, + 5, 214, 129, 11, 5, 214, 127, 11, 5, 214, 128, 11, 5, 229, 35, 11, 5, + 229, 34, 11, 5, 229, 41, 11, 5, 229, 36, 11, 5, 229, 38, 11, 5, 229, 37, + 11, 5, 229, 40, 11, 5, 229, 39, 11, 5, 229, 47, 11, 5, 229, 45, 11, 5, + 229, 49, 11, 5, 229, 48, 11, 5, 229, 28, 11, 5, 229, 29, 11, 5, 229, 32, + 11, 5, 229, 31, 11, 5, 229, 33, 11, 5, 229, 42, 11, 5, 229, 44, 11, 5, + 229, 43, 11, 5, 229, 27, 11, 5, 213, 164, 11, 5, 213, 162, 11, 5, 213, + 221, 11, 5, 213, 167, 11, 5, 213, 195, 11, 5, 213, 209, 11, 5, 213, 208, + 11, 5, 214, 202, 11, 5, 181, 11, 5, 214, 220, 11, 5, 212, 124, 11, 5, + 212, 126, 11, 5, 212, 125, 11, 5, 213, 13, 11, 5, 212, 253, 11, 5, 213, + 45, 11, 5, 213, 24, 11, 5, 214, 76, 11, 5, 214, 123, 11, 5, 214, 99, 11, + 5, 212, 119, 11, 5, 212, 115, 11, 5, 212, 180, 11, 5, 212, 123, 11, 5, + 212, 121, 11, 5, 212, 122, 11, 5, 229, 100, 11, 5, 229, 99, 11, 5, 229, + 105, 11, 5, 229, 101, 11, 5, 229, 102, 11, 5, 229, 104, 11, 5, 229, 103, + 11, 5, 229, 111, 11, 5, 229, 109, 11, 5, 229, 113, 11, 5, 229, 112, 11, + 5, 229, 92, 11, 5, 229, 94, 11, 5, 229, 93, 11, 5, 229, 96, 11, 5, 229, + 98, 11, 5, 229, 97, 11, 5, 229, 106, 11, 5, 229, 108, 11, 5, 229, 107, + 11, 5, 229, 88, 11, 5, 229, 87, 11, 5, 229, 95, 11, 5, 229, 91, 11, 5, + 229, 89, 11, 5, 229, 90, 11, 5, 229, 82, 11, 5, 229, 81, 11, 5, 229, 86, + 11, 5, 229, 85, 11, 5, 229, 83, 11, 5, 229, 84, 11, 5, 219, 89, 11, 5, + 219, 81, 11, 5, 219, 148, 11, 5, 219, 100, 11, 5, 219, 139, 11, 5, 219, + 138, 11, 5, 219, 142, 11, 5, 219, 140, 11, 5, 220, 7, 11, 5, 219, 251, + 11, 5, 173, 11, 5, 220, 18, 11, 5, 218, 203, 11, 5, 218, 202, 11, 5, 218, + 205, 11, 5, 218, 204, 11, 5, 218, 251, 11, 5, 218, 236, 11, 5, 219, 45, + 11, 5, 219, 3, 11, 5, 219, 166, 11, 5, 219, 240, 11, 5, 219, 186, 11, 5, + 218, 197, 11, 5, 218, 195, 11, 5, 218, 227, 11, 5, 218, 201, 11, 5, 218, + 199, 11, 5, 218, 200, 11, 5, 218, 175, 11, 5, 218, 174, 11, 5, 218, 185, + 11, 5, 218, 178, 11, 5, 218, 176, 11, 5, 218, 177, 11, 5, 231, 24, 11, 5, + 231, 23, 11, 5, 231, 55, 11, 5, 231, 36, 11, 5, 231, 47, 11, 5, 231, 46, + 11, 5, 231, 49, 11, 5, 231, 48, 11, 5, 231, 194, 11, 5, 231, 189, 11, 5, + 231, 242, 11, 5, 231, 205, 11, 5, 230, 154, 11, 5, 230, 153, 11, 5, 230, + 156, 11, 5, 230, 155, 11, 5, 230, 234, 11, 5, 230, 232, 11, 5, 231, 5, + 11, 5, 230, 244, 11, 5, 231, 133, 11, 5, 231, 131, 11, 5, 231, 167, 11, + 5, 231, 144, 11, 5, 230, 142, 11, 5, 230, 141, 11, 5, 230, 181, 11, 5, + 230, 152, 11, 5, 230, 143, 11, 5, 230, 151, 11, 5, 221, 122, 11, 5, 221, + 117, 11, 5, 221, 168, 11, 5, 221, 136, 11, 5, 221, 149, 11, 5, 221, 153, + 11, 5, 221, 151, 11, 5, 222, 51, 11, 5, 222, 32, 11, 5, 155, 11, 5, 222, + 80, 11, 5, 220, 204, 11, 5, 220, 209, 11, 5, 220, 206, 11, 5, 221, 30, + 11, 5, 221, 25, 11, 5, 221, 69, 11, 5, 221, 38, 11, 5, 221, 243, 11, 5, + 221, 226, 11, 5, 222, 24, 11, 5, 221, 247, 11, 5, 220, 190, 11, 5, 220, + 186, 11, 5, 220, 234, 11, 5, 220, 203, 11, 5, 220, 194, 11, 5, 220, 199, + 11, 5, 231, 115, 11, 5, 231, 114, 11, 5, 231, 119, 11, 5, 231, 116, 11, + 5, 231, 118, 11, 5, 231, 117, 11, 5, 231, 126, 11, 5, 231, 125, 11, 5, + 231, 129, 11, 5, 231, 127, 11, 5, 231, 106, 11, 5, 231, 105, 11, 5, 231, + 108, 11, 5, 231, 107, 11, 5, 231, 111, 11, 5, 231, 110, 11, 5, 231, 113, + 11, 5, 231, 112, 11, 5, 231, 121, 11, 5, 231, 120, 11, 5, 231, 124, 11, + 5, 231, 122, 11, 5, 231, 101, 11, 5, 231, 100, 11, 5, 231, 109, 11, 5, + 231, 104, 11, 5, 231, 102, 11, 5, 231, 103, 11, 5, 216, 121, 11, 5, 216, + 122, 11, 5, 216, 140, 11, 5, 216, 139, 11, 5, 216, 142, 11, 5, 216, 141, + 11, 5, 216, 112, 11, 5, 216, 114, 11, 5, 216, 113, 11, 5, 216, 117, 11, + 5, 216, 116, 11, 5, 216, 119, 11, 5, 216, 118, 11, 5, 216, 123, 11, 5, + 216, 125, 11, 5, 216, 124, 11, 5, 216, 108, 11, 5, 216, 107, 11, 5, 216, + 115, 11, 5, 216, 111, 11, 5, 216, 109, 11, 5, 216, 110, 11, 5, 228, 106, + 11, 5, 228, 105, 11, 5, 228, 112, 11, 5, 228, 107, 11, 5, 228, 109, 11, + 5, 228, 108, 11, 5, 228, 111, 11, 5, 228, 110, 11, 5, 228, 117, 11, 5, + 228, 116, 11, 5, 228, 119, 11, 5, 228, 118, 11, 5, 228, 98, 11, 5, 228, + 97, 11, 5, 228, 100, 11, 5, 228, 99, 11, 5, 228, 102, 11, 5, 228, 101, + 11, 5, 228, 104, 11, 5, 228, 103, 11, 5, 228, 113, 11, 5, 228, 115, 11, + 5, 228, 114, 11, 5, 214, 15, 11, 5, 214, 17, 11, 5, 214, 16, 11, 5, 214, + 60, 11, 5, 214, 58, 11, 5, 214, 70, 11, 5, 214, 63, 11, 5, 213, 232, 11, + 5, 213, 231, 11, 5, 213, 233, 11, 5, 213, 243, 11, 5, 213, 240, 11, 5, + 213, 251, 11, 5, 213, 245, 11, 5, 214, 51, 11, 5, 214, 57, 11, 5, 214, + 53, 11, 5, 229, 119, 11, 5, 229, 138, 11, 5, 229, 147, 11, 5, 230, 11, + 11, 5, 229, 255, 11, 5, 140, 11, 5, 230, 23, 11, 5, 228, 136, 11, 5, 228, + 135, 11, 5, 228, 138, 11, 5, 228, 137, 11, 5, 228, 182, 11, 5, 228, 173, + 11, 5, 229, 25, 11, 5, 228, 246, 11, 5, 229, 185, 11, 5, 229, 247, 11, 5, + 229, 197, 11, 5, 193, 146, 11, 5, 193, 131, 11, 5, 193, 190, 11, 5, 193, + 158, 11, 5, 192, 245, 11, 5, 192, 247, 11, 5, 192, 246, 11, 5, 193, 13, + 11, 5, 193, 48, 11, 5, 193, 24, 11, 5, 193, 99, 11, 5, 193, 125, 11, 5, + 193, 106, 11, 5, 191, 15, 11, 5, 191, 14, 11, 5, 191, 30, 11, 5, 191, 18, + 11, 5, 191, 23, 11, 5, 191, 25, 11, 5, 191, 24, 11, 5, 191, 96, 11, 5, + 191, 93, 11, 5, 191, 123, 11, 5, 191, 104, 11, 5, 190, 244, 11, 5, 190, + 246, 11, 5, 190, 245, 11, 5, 191, 2, 11, 5, 191, 1, 11, 5, 191, 7, 11, 5, + 191, 3, 11, 5, 191, 73, 11, 5, 191, 87, 11, 5, 191, 79, 11, 5, 190, 240, + 11, 5, 190, 239, 11, 5, 190, 251, 11, 5, 190, 243, 11, 5, 190, 241, 11, + 5, 190, 242, 11, 5, 190, 226, 11, 5, 190, 225, 11, 5, 190, 231, 11, 5, + 190, 229, 11, 5, 190, 227, 11, 5, 190, 228, 11, 5, 243, 1, 11, 5, 242, + 250, 11, 5, 243, 31, 11, 5, 243, 14, 11, 5, 243, 28, 11, 5, 243, 22, 11, + 5, 243, 30, 11, 5, 243, 29, 11, 5, 247, 80, 11, 5, 247, 71, 11, 5, 247, + 162, 11, 5, 247, 113, 11, 5, 238, 185, 11, 5, 238, 187, 11, 5, 238, 186, + 11, 5, 238, 251, 11, 5, 238, 239, 11, 5, 242, 101, 11, 5, 239, 15, 11, 5, + 247, 7, 11, 5, 247, 44, 11, 5, 247, 13, 11, 5, 238, 156, 11, 5, 238, 154, + 11, 5, 238, 197, 11, 5, 238, 183, 11, 5, 238, 162, 11, 5, 238, 178, 11, + 5, 238, 132, 11, 5, 238, 131, 11, 5, 238, 145, 11, 5, 238, 139, 11, 5, + 238, 133, 11, 5, 238, 135, 11, 5, 190, 209, 11, 5, 190, 208, 11, 5, 190, + 215, 11, 5, 190, 210, 11, 5, 190, 212, 11, 5, 190, 211, 11, 5, 190, 214, + 11, 5, 190, 213, 11, 5, 190, 221, 11, 5, 190, 220, 11, 5, 190, 224, 11, + 5, 190, 222, 11, 5, 190, 205, 11, 5, 190, 207, 11, 5, 190, 206, 11, 5, + 190, 216, 11, 5, 190, 219, 11, 5, 190, 217, 11, 5, 190, 198, 11, 5, 190, + 202, 11, 5, 190, 201, 11, 5, 190, 199, 11, 5, 190, 200, 11, 5, 190, 192, + 11, 5, 190, 191, 11, 5, 190, 197, 11, 5, 190, 195, 11, 5, 190, 193, 11, + 5, 190, 194, 11, 5, 212, 35, 11, 5, 212, 34, 11, 5, 212, 40, 11, 5, 212, + 36, 11, 5, 212, 37, 11, 5, 212, 39, 11, 5, 212, 38, 11, 5, 212, 45, 11, + 5, 212, 44, 11, 5, 212, 48, 11, 5, 212, 47, 11, 5, 212, 28, 11, 5, 212, + 29, 11, 5, 212, 32, 11, 5, 212, 33, 11, 5, 212, 41, 11, 5, 212, 43, 11, + 5, 212, 23, 11, 5, 212, 31, 11, 5, 212, 27, 11, 5, 212, 24, 11, 5, 212, + 25, 11, 5, 212, 18, 11, 5, 212, 17, 11, 5, 212, 22, 11, 5, 212, 21, 11, + 5, 212, 19, 11, 5, 212, 20, 11, 5, 202, 139, 11, 5, 169, 11, 5, 202, 223, + 11, 5, 202, 143, 11, 5, 202, 203, 11, 5, 202, 206, 11, 5, 202, 204, 11, + 5, 205, 123, 11, 5, 205, 107, 11, 5, 188, 11, 5, 205, 131, 11, 5, 200, + 188, 11, 5, 200, 190, 11, 5, 200, 189, 11, 5, 202, 9, 11, 5, 201, 254, + 11, 5, 202, 47, 11, 5, 202, 15, 11, 5, 203, 239, 11, 5, 205, 69, 11, 5, + 204, 14, 11, 5, 200, 163, 11, 5, 200, 159, 11, 5, 201, 5, 11, 5, 200, 187, 11, 5, 200, 167, 11, 5, 200, 175, 11, 5, 200, 57, 11, 5, 200, 56, 11, 5, 200, 127, 11, 5, 200, 65, 11, 5, 200, 59, 11, 5, 200, 64, 11, 5, - 201, 136, 11, 5, 201, 135, 11, 5, 201, 142, 11, 5, 201, 137, 11, 5, 201, - 139, 11, 5, 201, 141, 11, 5, 201, 140, 11, 5, 201, 151, 11, 5, 201, 149, - 11, 5, 201, 175, 11, 5, 201, 152, 11, 5, 201, 131, 11, 5, 201, 130, 11, - 5, 201, 134, 11, 5, 201, 132, 11, 5, 201, 145, 11, 5, 201, 148, 11, 5, - 201, 146, 11, 5, 201, 127, 11, 5, 201, 125, 11, 5, 201, 129, 11, 5, 201, - 128, 11, 5, 201, 120, 11, 5, 201, 119, 11, 5, 201, 124, 11, 5, 201, 123, - 11, 5, 201, 121, 11, 5, 201, 122, 11, 5, 191, 66, 11, 5, 191, 65, 11, 5, + 201, 137, 11, 5, 201, 136, 11, 5, 201, 143, 11, 5, 201, 138, 11, 5, 201, + 140, 11, 5, 201, 142, 11, 5, 201, 141, 11, 5, 201, 152, 11, 5, 201, 150, + 11, 5, 201, 176, 11, 5, 201, 153, 11, 5, 201, 132, 11, 5, 201, 131, 11, + 5, 201, 135, 11, 5, 201, 133, 11, 5, 201, 146, 11, 5, 201, 149, 11, 5, + 201, 147, 11, 5, 201, 128, 11, 5, 201, 126, 11, 5, 201, 130, 11, 5, 201, + 129, 11, 5, 201, 121, 11, 5, 201, 120, 11, 5, 201, 125, 11, 5, 201, 124, + 11, 5, 201, 122, 11, 5, 201, 123, 11, 5, 191, 66, 11, 5, 191, 65, 11, 5, 191, 71, 11, 5, 191, 68, 11, 5, 191, 45, 11, 5, 191, 47, 11, 5, 191, 46, 11, 5, 191, 50, 11, 5, 191, 49, 11, 5, 191, 54, 11, 5, 191, 51, 11, 5, 191, 59, 11, 5, 191, 58, 11, 5, 191, 62, 11, 5, 191, 60, 11, 5, 191, 41, 11, 5, 191, 40, 11, 5, 191, 48, 11, 5, 191, 44, 11, 5, 191, 42, 11, 5, 191, 43, 11, 5, 191, 33, 11, 5, 191, 32, 11, 5, 191, 37, 11, 5, 191, 36, - 11, 5, 191, 34, 11, 5, 191, 35, 11, 5, 243, 133, 11, 5, 243, 129, 11, 5, - 247, 1, 11, 5, 246, 243, 11, 5, 243, 44, 11, 5, 243, 43, 11, 5, 243, 46, - 11, 5, 243, 45, 11, 5, 243, 59, 11, 5, 243, 58, 11, 5, 243, 68, 11, 5, - 243, 63, 11, 5, 243, 102, 11, 5, 243, 99, 11, 5, 243, 127, 11, 5, 243, - 110, 11, 5, 243, 38, 11, 5, 243, 48, 11, 5, 243, 42, 11, 5, 243, 39, 11, - 5, 243, 41, 11, 5, 243, 31, 11, 5, 243, 30, 11, 5, 243, 35, 11, 5, 243, - 34, 11, 5, 243, 32, 11, 5, 243, 33, 11, 5, 206, 105, 11, 5, 206, 109, 11, - 5, 206, 87, 11, 5, 206, 88, 11, 5, 206, 92, 11, 5, 206, 91, 11, 5, 206, - 95, 11, 5, 206, 93, 11, 5, 206, 99, 11, 5, 206, 98, 11, 5, 206, 104, 11, - 5, 206, 100, 11, 5, 206, 83, 11, 5, 206, 81, 11, 5, 206, 89, 11, 5, 206, - 86, 11, 5, 206, 84, 11, 5, 206, 85, 11, 5, 206, 76, 11, 5, 206, 75, 11, - 5, 206, 80, 11, 5, 206, 79, 11, 5, 206, 77, 11, 5, 206, 78, 11, 5, 212, - 242, 11, 5, 212, 241, 11, 5, 212, 244, 11, 5, 212, 243, 11, 5, 212, 233, - 11, 5, 212, 235, 11, 5, 212, 234, 11, 5, 212, 237, 11, 5, 212, 236, 11, - 5, 212, 240, 11, 5, 212, 239, 11, 5, 212, 227, 11, 5, 212, 226, 11, 5, - 212, 232, 11, 5, 212, 230, 11, 5, 212, 228, 11, 5, 212, 229, 11, 5, 212, - 221, 11, 5, 212, 220, 11, 5, 212, 225, 11, 5, 212, 224, 11, 5, 212, 222, - 11, 5, 212, 223, 11, 5, 203, 123, 11, 5, 203, 118, 11, 5, 203, 165, 11, - 5, 203, 136, 11, 5, 202, 249, 11, 5, 202, 251, 11, 5, 202, 250, 11, 5, - 203, 24, 11, 5, 203, 19, 11, 5, 203, 56, 11, 5, 203, 44, 11, 5, 203, 91, - 11, 5, 203, 84, 11, 5, 203, 113, 11, 5, 203, 100, 11, 5, 202, 245, 11, 5, - 202, 242, 11, 5, 203, 5, 11, 5, 202, 248, 11, 5, 202, 246, 11, 5, 202, - 247, 11, 5, 202, 225, 11, 5, 202, 224, 11, 5, 202, 231, 11, 5, 202, 228, - 11, 5, 202, 226, 11, 5, 202, 227, 11, 5, 207, 130, 11, 5, 207, 123, 11, - 5, 165, 11, 5, 207, 136, 11, 5, 206, 38, 11, 5, 206, 40, 11, 5, 206, 39, - 11, 5, 206, 123, 11, 5, 206, 111, 11, 5, 206, 162, 11, 5, 206, 127, 11, - 5, 207, 11, 11, 5, 207, 113, 11, 5, 207, 53, 11, 5, 206, 30, 11, 5, 206, - 27, 11, 5, 206, 68, 11, 5, 206, 37, 11, 5, 206, 33, 11, 5, 206, 34, 11, - 5, 206, 12, 11, 5, 206, 11, 11, 5, 206, 17, 11, 5, 206, 15, 11, 5, 206, - 13, 11, 5, 206, 14, 11, 5, 222, 232, 11, 5, 222, 231, 11, 5, 222, 244, - 11, 5, 222, 233, 11, 5, 222, 240, 11, 5, 222, 239, 11, 5, 222, 242, 11, - 5, 222, 241, 11, 5, 222, 170, 11, 5, 222, 169, 11, 5, 222, 172, 11, 5, - 222, 171, 11, 5, 222, 188, 11, 5, 222, 186, 11, 5, 222, 201, 11, 5, 222, - 190, 11, 5, 222, 163, 11, 5, 222, 161, 11, 5, 222, 182, 11, 5, 222, 168, - 11, 5, 222, 165, 11, 5, 222, 166, 11, 5, 222, 155, 11, 5, 222, 154, 11, - 5, 222, 159, 11, 5, 222, 158, 11, 5, 222, 156, 11, 5, 222, 157, 11, 5, - 208, 49, 11, 5, 208, 47, 11, 5, 208, 57, 11, 5, 208, 50, 11, 5, 208, 54, - 11, 5, 208, 53, 11, 5, 208, 56, 11, 5, 208, 55, 11, 5, 207, 253, 11, 5, - 207, 250, 11, 5, 207, 255, 11, 5, 207, 254, 11, 5, 208, 36, 11, 5, 208, - 35, 11, 5, 208, 45, 11, 5, 208, 39, 11, 5, 207, 245, 11, 5, 207, 241, 11, - 5, 208, 33, 11, 5, 207, 249, 11, 5, 207, 247, 11, 5, 207, 248, 11, 5, - 207, 225, 11, 5, 207, 223, 11, 5, 207, 235, 11, 5, 207, 228, 11, 5, 207, - 226, 11, 5, 207, 227, 11, 5, 222, 221, 11, 5, 222, 220, 11, 5, 222, 227, - 11, 5, 222, 222, 11, 5, 222, 224, 11, 5, 222, 223, 11, 5, 222, 226, 11, - 5, 222, 225, 11, 5, 222, 212, 11, 5, 222, 214, 11, 5, 222, 213, 11, 5, - 222, 217, 11, 5, 222, 216, 11, 5, 222, 219, 11, 5, 222, 218, 11, 5, 222, - 208, 11, 5, 222, 207, 11, 5, 222, 215, 11, 5, 222, 211, 11, 5, 222, 209, - 11, 5, 222, 210, 11, 5, 222, 204, 11, 5, 222, 203, 11, 5, 222, 206, 11, - 5, 222, 205, 11, 5, 213, 134, 11, 5, 213, 133, 11, 5, 213, 141, 11, 5, - 213, 135, 11, 5, 213, 137, 11, 5, 213, 136, 11, 5, 213, 140, 11, 5, 213, - 138, 11, 5, 213, 123, 11, 5, 213, 124, 11, 5, 213, 129, 11, 5, 213, 128, - 11, 5, 213, 132, 11, 5, 213, 130, 11, 5, 213, 118, 11, 5, 213, 127, 11, - 5, 213, 122, 11, 5, 213, 119, 11, 5, 213, 120, 11, 5, 213, 113, 11, 5, - 213, 112, 11, 5, 213, 117, 11, 5, 213, 116, 11, 5, 213, 114, 11, 5, 213, - 115, 11, 5, 212, 68, 11, 5, 212, 67, 11, 5, 212, 81, 11, 5, 212, 72, 11, - 5, 212, 77, 11, 5, 212, 76, 11, 5, 212, 79, 11, 5, 212, 78, 11, 5, 212, - 53, 11, 5, 212, 55, 11, 5, 212, 54, 11, 5, 212, 60, 11, 5, 212, 59, 11, - 5, 212, 65, 11, 5, 212, 61, 11, 5, 212, 51, 11, 5, 212, 49, 11, 5, 212, - 58, 11, 5, 212, 52, 11, 5, 192, 198, 11, 5, 192, 197, 11, 5, 192, 207, - 11, 5, 192, 200, 11, 5, 192, 202, 11, 5, 192, 201, 11, 5, 192, 204, 11, - 5, 192, 203, 11, 5, 192, 186, 11, 5, 192, 187, 11, 5, 192, 191, 11, 5, - 192, 190, 11, 5, 192, 196, 11, 5, 192, 194, 11, 5, 192, 163, 11, 5, 192, - 161, 11, 5, 192, 176, 11, 5, 192, 166, 11, 5, 192, 164, 11, 5, 192, 165, - 11, 5, 192, 18, 11, 5, 192, 16, 11, 5, 192, 33, 11, 5, 192, 19, 11, 5, - 192, 27, 11, 5, 192, 26, 11, 5, 192, 30, 11, 5, 192, 28, 11, 5, 191, 198, - 11, 5, 191, 197, 11, 5, 191, 201, 11, 5, 191, 199, 11, 5, 191, 240, 11, - 5, 191, 235, 11, 5, 192, 12, 11, 5, 191, 245, 11, 5, 191, 189, 11, 5, - 191, 185, 11, 5, 191, 225, 11, 5, 191, 196, 11, 5, 191, 192, 11, 5, 191, - 193, 11, 5, 191, 169, 11, 5, 191, 168, 11, 5, 191, 176, 11, 5, 191, 172, - 11, 5, 191, 170, 11, 5, 191, 171, 11, 48, 208, 36, 11, 48, 219, 146, 11, - 48, 221, 120, 11, 48, 212, 72, 11, 48, 238, 137, 11, 48, 201, 142, 11, - 48, 231, 110, 11, 48, 231, 142, 11, 48, 216, 100, 11, 48, 228, 104, 11, - 48, 218, 175, 11, 48, 249, 25, 11, 48, 215, 202, 11, 48, 192, 12, 11, 48, - 208, 131, 11, 48, 228, 98, 11, 48, 199, 171, 11, 48, 231, 240, 11, 48, - 190, 243, 11, 48, 238, 130, 11, 48, 237, 151, 11, 48, 247, 230, 11, 48, - 231, 106, 11, 48, 212, 61, 11, 48, 197, 94, 11, 48, 211, 78, 11, 48, 222, - 208, 11, 48, 191, 2, 11, 48, 208, 108, 11, 48, 229, 65, 11, 48, 192, 18, - 11, 48, 193, 244, 11, 48, 202, 231, 11, 48, 195, 141, 11, 48, 191, 123, - 11, 48, 222, 201, 11, 48, 212, 25, 11, 48, 222, 206, 11, 48, 230, 232, - 11, 48, 222, 226, 11, 48, 193, 48, 11, 48, 235, 89, 11, 48, 202, 247, 11, - 48, 219, 140, 11, 48, 238, 143, 11, 48, 238, 184, 11, 48, 243, 12, 11, - 48, 228, 101, 11, 48, 203, 123, 11, 48, 190, 242, 11, 48, 203, 44, 11, - 48, 243, 127, 11, 48, 190, 212, 11, 48, 214, 189, 11, 48, 222, 22, 219, - 88, 1, 249, 153, 219, 88, 1, 168, 219, 88, 1, 209, 228, 219, 88, 1, 238, - 32, 219, 88, 1, 190, 190, 219, 88, 1, 199, 49, 219, 88, 1, 231, 240, 219, - 88, 1, 155, 219, 88, 1, 221, 215, 219, 88, 1, 223, 32, 219, 88, 1, 247, - 160, 219, 88, 1, 247, 1, 219, 88, 1, 235, 35, 219, 88, 1, 197, 168, 219, - 88, 1, 197, 157, 219, 88, 1, 174, 219, 88, 1, 180, 219, 88, 1, 173, 219, - 88, 1, 188, 219, 88, 1, 191, 71, 219, 88, 1, 191, 123, 219, 88, 1, 214, - 68, 219, 88, 1, 140, 219, 88, 1, 192, 220, 219, 88, 1, 229, 177, 219, 88, - 1, 233, 109, 219, 88, 1, 193, 190, 219, 88, 1, 203, 165, 219, 88, 1, 170, - 219, 88, 1, 231, 91, 219, 88, 1, 65, 219, 88, 1, 252, 25, 219, 88, 1, 71, - 219, 88, 1, 233, 242, 219, 88, 1, 68, 219, 88, 1, 74, 219, 88, 1, 66, - 219, 88, 1, 196, 152, 219, 88, 1, 196, 141, 219, 88, 1, 211, 151, 219, - 88, 1, 163, 215, 69, 198, 193, 219, 88, 1, 163, 215, 7, 209, 73, 219, 88, - 1, 163, 215, 69, 238, 142, 219, 88, 1, 163, 215, 69, 248, 111, 219, 88, - 1, 163, 215, 69, 180, 219, 88, 1, 163, 215, 69, 222, 253, 219, 88, 208, - 152, 242, 74, 219, 88, 208, 152, 232, 80, 201, 63, 59, 5, 234, 188, 59, - 5, 234, 184, 59, 5, 229, 215, 59, 5, 193, 114, 59, 5, 193, 113, 59, 5, - 210, 49, 59, 5, 248, 195, 59, 5, 249, 1, 59, 5, 217, 3, 59, 5, 221, 16, - 59, 5, 216, 132, 59, 5, 231, 178, 59, 5, 233, 52, 59, 5, 195, 148, 59, 5, - 199, 121, 59, 5, 199, 31, 59, 5, 237, 58, 59, 5, 237, 55, 59, 5, 219, - 228, 59, 5, 207, 84, 59, 5, 237, 131, 59, 5, 214, 153, 59, 5, 205, 50, - 59, 5, 203, 111, 59, 5, 191, 84, 59, 5, 191, 61, 59, 5, 247, 34, 59, 5, - 223, 8, 59, 5, 213, 148, 59, 5, 192, 77, 59, 5, 222, 13, 59, 5, 214, 41, - 59, 5, 231, 157, 59, 5, 216, 211, 59, 5, 214, 110, 59, 5, 212, 89, 59, 5, - 68, 59, 5, 223, 162, 59, 5, 229, 158, 59, 5, 229, 128, 59, 5, 193, 86, - 59, 5, 193, 68, 59, 5, 209, 185, 59, 5, 248, 193, 59, 5, 248, 188, 59, 5, - 216, 252, 59, 5, 221, 13, 59, 5, 216, 129, 59, 5, 231, 174, 59, 5, 233, - 23, 59, 5, 195, 69, 59, 5, 198, 193, 59, 5, 199, 11, 59, 5, 237, 50, 59, - 5, 237, 54, 59, 5, 219, 146, 59, 5, 207, 1, 59, 5, 237, 44, 59, 5, 214, - 147, 59, 5, 202, 222, 59, 5, 203, 81, 59, 5, 191, 30, 59, 5, 191, 57, 59, - 5, 243, 29, 59, 5, 222, 244, 59, 5, 213, 141, 59, 5, 192, 33, 59, 5, 221, - 166, 59, 5, 214, 33, 59, 5, 231, 53, 59, 5, 216, 100, 59, 5, 213, 219, - 59, 5, 212, 81, 59, 5, 65, 59, 5, 251, 132, 59, 5, 214, 63, 59, 5, 140, - 59, 5, 230, 56, 59, 5, 193, 190, 59, 5, 193, 164, 59, 5, 168, 59, 5, 248, - 203, 59, 5, 249, 153, 59, 5, 217, 11, 59, 5, 221, 21, 59, 5, 221, 19, 59, - 5, 216, 136, 59, 5, 231, 182, 59, 5, 233, 109, 59, 5, 195, 188, 59, 5, - 190, 190, 59, 5, 199, 49, 59, 5, 237, 68, 59, 5, 237, 57, 59, 5, 173, 59, - 5, 165, 59, 5, 238, 32, 59, 5, 214, 162, 59, 5, 188, 59, 5, 203, 165, 59, - 5, 191, 123, 59, 5, 191, 71, 59, 5, 247, 160, 59, 5, 223, 32, 59, 5, 213, - 157, 59, 5, 170, 59, 5, 155, 59, 5, 222, 87, 59, 5, 214, 47, 59, 5, 231, - 240, 59, 5, 174, 59, 5, 180, 59, 5, 212, 101, 59, 5, 211, 87, 59, 5, 211, - 82, 59, 5, 228, 252, 59, 5, 193, 29, 59, 5, 193, 25, 59, 5, 209, 37, 59, - 5, 248, 191, 59, 5, 248, 97, 59, 5, 216, 247, 59, 5, 221, 11, 59, 5, 216, - 125, 59, 5, 231, 170, 59, 5, 232, 162, 59, 5, 195, 8, 59, 5, 198, 59, 59, - 5, 198, 235, 59, 5, 237, 47, 59, 5, 237, 52, 59, 5, 219, 8, 59, 5, 206, - 134, 59, 5, 236, 146, 59, 5, 214, 134, 59, 5, 202, 16, 59, 5, 203, 48, - 59, 5, 191, 4, 59, 5, 191, 52, 59, 5, 239, 18, 59, 5, 222, 191, 59, 5, - 213, 131, 59, 5, 191, 246, 59, 5, 221, 41, 59, 5, 214, 31, 59, 5, 230, - 245, 59, 5, 215, 211, 59, 5, 213, 26, 59, 5, 212, 62, 59, 5, 66, 59, 5, - 196, 113, 59, 5, 228, 159, 59, 5, 228, 142, 59, 5, 193, 0, 59, 5, 192, - 249, 59, 5, 208, 165, 59, 5, 248, 190, 59, 5, 248, 10, 59, 5, 216, 246, - 59, 5, 221, 9, 59, 5, 216, 124, 59, 5, 231, 169, 59, 5, 232, 86, 59, 5, - 193, 249, 59, 5, 197, 94, 59, 5, 198, 213, 59, 5, 237, 45, 59, 5, 237, - 51, 59, 5, 218, 225, 59, 5, 206, 68, 59, 5, 235, 89, 59, 5, 214, 129, 59, - 5, 201, 4, 59, 5, 203, 5, 59, 5, 190, 251, 59, 5, 191, 48, 59, 5, 238, - 195, 59, 5, 222, 182, 59, 5, 213, 127, 59, 5, 191, 225, 59, 5, 220, 232, - 59, 5, 214, 30, 59, 5, 230, 179, 59, 5, 215, 155, 59, 5, 212, 178, 59, 5, - 212, 58, 59, 5, 74, 59, 5, 211, 104, 59, 5, 213, 245, 59, 5, 229, 23, 59, - 5, 228, 255, 59, 5, 193, 48, 59, 5, 193, 30, 59, 5, 209, 73, 59, 5, 248, - 192, 59, 5, 248, 111, 59, 5, 216, 248, 59, 5, 221, 12, 59, 5, 216, 127, - 59, 5, 231, 172, 59, 5, 231, 171, 59, 5, 232, 175, 59, 5, 195, 24, 59, 5, - 159, 59, 5, 198, 241, 59, 5, 237, 48, 59, 5, 237, 53, 59, 5, 219, 43, 59, - 5, 206, 162, 59, 5, 236, 174, 59, 5, 214, 138, 59, 5, 202, 46, 59, 5, - 203, 56, 59, 5, 191, 7, 59, 5, 191, 54, 59, 5, 242, 99, 59, 5, 222, 201, - 59, 5, 213, 132, 59, 5, 192, 12, 59, 5, 221, 67, 59, 5, 214, 32, 59, 5, - 231, 3, 59, 5, 216, 12, 59, 5, 213, 43, 59, 5, 212, 65, 59, 5, 71, 59, 5, - 234, 103, 59, 5, 214, 52, 59, 5, 229, 245, 59, 5, 229, 198, 59, 5, 193, - 125, 59, 5, 193, 108, 59, 5, 210, 63, 59, 5, 248, 196, 59, 5, 249, 17, - 59, 5, 217, 4, 59, 5, 221, 17, 59, 5, 221, 15, 59, 5, 216, 133, 59, 5, - 231, 179, 59, 5, 231, 177, 59, 5, 233, 59, 59, 5, 195, 153, 59, 5, 199, - 145, 59, 5, 199, 33, 59, 5, 237, 59, 59, 5, 237, 56, 59, 5, 219, 238, 59, - 5, 207, 113, 59, 5, 237, 146, 59, 5, 214, 154, 59, 5, 205, 68, 59, 5, - 203, 113, 59, 5, 191, 87, 59, 5, 191, 62, 59, 5, 247, 42, 59, 5, 223, 10, - 59, 5, 213, 150, 59, 5, 192, 80, 59, 5, 222, 22, 59, 5, 214, 42, 59, 5, - 214, 38, 59, 5, 231, 165, 59, 5, 231, 151, 59, 5, 216, 232, 59, 5, 214, - 121, 59, 5, 212, 90, 59, 5, 214, 70, 59, 5, 219, 190, 59, 242, 74, 59, - 232, 80, 201, 63, 59, 208, 13, 77, 59, 5, 214, 137, 233, 109, 59, 5, 214, - 137, 155, 59, 5, 214, 137, 202, 16, 59, 16, 233, 48, 59, 16, 222, 11, 59, - 16, 198, 140, 59, 16, 213, 186, 59, 16, 249, 95, 59, 16, 233, 108, 59, - 16, 199, 245, 59, 16, 237, 236, 59, 16, 236, 145, 59, 16, 220, 208, 59, - 16, 198, 63, 59, 16, 236, 173, 59, 16, 222, 192, 59, 17, 191, 77, 59, 17, - 107, 59, 17, 109, 59, 17, 138, 59, 17, 134, 59, 17, 149, 59, 17, 169, 59, - 17, 175, 59, 17, 171, 59, 17, 178, 59, 5, 214, 137, 174, 59, 5, 214, 137, - 236, 174, 38, 6, 1, 191, 81, 38, 2, 1, 191, 81, 38, 6, 1, 235, 30, 38, 2, - 1, 235, 30, 38, 6, 1, 207, 18, 235, 32, 38, 2, 1, 207, 18, 235, 32, 38, - 6, 1, 223, 83, 38, 2, 1, 223, 83, 38, 6, 1, 236, 191, 38, 2, 1, 236, 191, - 38, 6, 1, 215, 219, 196, 128, 38, 2, 1, 215, 219, 196, 128, 38, 6, 1, - 248, 24, 211, 110, 38, 2, 1, 248, 24, 211, 110, 38, 6, 1, 214, 82, 192, - 62, 38, 2, 1, 214, 82, 192, 62, 38, 6, 1, 192, 59, 4, 249, 147, 192, 62, - 38, 2, 1, 192, 59, 4, 249, 147, 192, 62, 38, 6, 1, 223, 81, 192, 95, 38, - 2, 1, 223, 81, 192, 95, 38, 6, 1, 207, 18, 191, 225, 38, 2, 1, 207, 18, - 191, 225, 38, 6, 1, 223, 81, 65, 38, 2, 1, 223, 81, 65, 38, 6, 1, 242, - 219, 219, 83, 191, 190, 38, 2, 1, 242, 219, 219, 83, 191, 190, 38, 6, 1, - 248, 131, 191, 190, 38, 2, 1, 248, 131, 191, 190, 38, 6, 1, 223, 81, 242, - 219, 219, 83, 191, 190, 38, 2, 1, 223, 81, 242, 219, 219, 83, 191, 190, - 38, 6, 1, 192, 14, 38, 2, 1, 192, 14, 38, 6, 1, 207, 18, 197, 161, 38, 2, - 1, 207, 18, 197, 161, 38, 6, 1, 202, 32, 237, 146, 38, 2, 1, 202, 32, - 237, 146, 38, 6, 1, 202, 32, 234, 140, 38, 2, 1, 202, 32, 234, 140, 38, - 6, 1, 202, 32, 234, 114, 38, 2, 1, 202, 32, 234, 114, 38, 6, 1, 215, 223, - 74, 38, 2, 1, 215, 223, 74, 38, 6, 1, 248, 164, 74, 38, 2, 1, 248, 164, - 74, 38, 6, 1, 55, 215, 223, 74, 38, 2, 1, 55, 215, 223, 74, 38, 1, 215, - 130, 74, 33, 38, 193, 226, 33, 38, 199, 96, 216, 48, 56, 33, 38, 228, - 141, 216, 48, 56, 33, 38, 198, 230, 216, 48, 56, 202, 95, 250, 193, 33, - 38, 1, 196, 125, 223, 226, 33, 38, 1, 68, 33, 38, 1, 192, 33, 33, 38, 1, - 66, 33, 38, 1, 230, 17, 56, 33, 38, 1, 192, 58, 33, 38, 1, 202, 32, 56, - 33, 38, 1, 211, 110, 33, 38, 222, 35, 33, 38, 210, 70, 38, 222, 35, 38, - 210, 70, 38, 6, 1, 235, 45, 38, 2, 1, 235, 45, 38, 6, 1, 235, 21, 38, 2, - 1, 235, 21, 38, 6, 1, 191, 38, 38, 2, 1, 191, 38, 38, 6, 1, 247, 58, 38, - 2, 1, 247, 58, 38, 6, 1, 235, 17, 38, 2, 1, 235, 17, 38, 6, 1, 199, 146, + 11, 5, 191, 34, 11, 5, 191, 35, 11, 5, 243, 135, 11, 5, 243, 131, 11, 5, + 247, 3, 11, 5, 246, 245, 11, 5, 243, 46, 11, 5, 243, 45, 11, 5, 243, 48, + 11, 5, 243, 47, 11, 5, 243, 61, 11, 5, 243, 60, 11, 5, 243, 70, 11, 5, + 243, 65, 11, 5, 243, 104, 11, 5, 243, 101, 11, 5, 243, 129, 11, 5, 243, + 112, 11, 5, 243, 40, 11, 5, 243, 50, 11, 5, 243, 44, 11, 5, 243, 41, 11, + 5, 243, 43, 11, 5, 243, 33, 11, 5, 243, 32, 11, 5, 243, 37, 11, 5, 243, + 36, 11, 5, 243, 34, 11, 5, 243, 35, 11, 5, 206, 106, 11, 5, 206, 110, 11, + 5, 206, 88, 11, 5, 206, 89, 11, 5, 206, 93, 11, 5, 206, 92, 11, 5, 206, + 96, 11, 5, 206, 94, 11, 5, 206, 100, 11, 5, 206, 99, 11, 5, 206, 105, 11, + 5, 206, 101, 11, 5, 206, 84, 11, 5, 206, 82, 11, 5, 206, 90, 11, 5, 206, + 87, 11, 5, 206, 85, 11, 5, 206, 86, 11, 5, 206, 77, 11, 5, 206, 76, 11, + 5, 206, 81, 11, 5, 206, 80, 11, 5, 206, 78, 11, 5, 206, 79, 11, 5, 212, + 244, 11, 5, 212, 243, 11, 5, 212, 246, 11, 5, 212, 245, 11, 5, 212, 235, + 11, 5, 212, 237, 11, 5, 212, 236, 11, 5, 212, 239, 11, 5, 212, 238, 11, + 5, 212, 242, 11, 5, 212, 241, 11, 5, 212, 229, 11, 5, 212, 228, 11, 5, + 212, 234, 11, 5, 212, 232, 11, 5, 212, 230, 11, 5, 212, 231, 11, 5, 212, + 223, 11, 5, 212, 222, 11, 5, 212, 227, 11, 5, 212, 226, 11, 5, 212, 224, + 11, 5, 212, 225, 11, 5, 203, 124, 11, 5, 203, 119, 11, 5, 203, 166, 11, + 5, 203, 137, 11, 5, 202, 250, 11, 5, 202, 252, 11, 5, 202, 251, 11, 5, + 203, 25, 11, 5, 203, 20, 11, 5, 203, 57, 11, 5, 203, 45, 11, 5, 203, 92, + 11, 5, 203, 85, 11, 5, 203, 114, 11, 5, 203, 101, 11, 5, 202, 246, 11, 5, + 202, 243, 11, 5, 203, 6, 11, 5, 202, 249, 11, 5, 202, 247, 11, 5, 202, + 248, 11, 5, 202, 226, 11, 5, 202, 225, 11, 5, 202, 232, 11, 5, 202, 229, + 11, 5, 202, 227, 11, 5, 202, 228, 11, 5, 207, 132, 11, 5, 207, 125, 11, + 5, 165, 11, 5, 207, 138, 11, 5, 206, 39, 11, 5, 206, 41, 11, 5, 206, 40, + 11, 5, 206, 124, 11, 5, 206, 112, 11, 5, 206, 163, 11, 5, 206, 128, 11, + 5, 207, 12, 11, 5, 207, 115, 11, 5, 207, 54, 11, 5, 206, 31, 11, 5, 206, + 28, 11, 5, 206, 69, 11, 5, 206, 38, 11, 5, 206, 34, 11, 5, 206, 35, 11, + 5, 206, 13, 11, 5, 206, 12, 11, 5, 206, 18, 11, 5, 206, 16, 11, 5, 206, + 14, 11, 5, 206, 15, 11, 5, 222, 234, 11, 5, 222, 233, 11, 5, 222, 246, + 11, 5, 222, 235, 11, 5, 222, 242, 11, 5, 222, 241, 11, 5, 222, 244, 11, + 5, 222, 243, 11, 5, 222, 172, 11, 5, 222, 171, 11, 5, 222, 174, 11, 5, + 222, 173, 11, 5, 222, 190, 11, 5, 222, 188, 11, 5, 222, 203, 11, 5, 222, + 192, 11, 5, 222, 165, 11, 5, 222, 163, 11, 5, 222, 184, 11, 5, 222, 170, + 11, 5, 222, 167, 11, 5, 222, 168, 11, 5, 222, 157, 11, 5, 222, 156, 11, + 5, 222, 161, 11, 5, 222, 160, 11, 5, 222, 158, 11, 5, 222, 159, 11, 5, + 208, 51, 11, 5, 208, 49, 11, 5, 208, 59, 11, 5, 208, 52, 11, 5, 208, 56, + 11, 5, 208, 55, 11, 5, 208, 58, 11, 5, 208, 57, 11, 5, 207, 255, 11, 5, + 207, 252, 11, 5, 208, 1, 11, 5, 208, 0, 11, 5, 208, 38, 11, 5, 208, 37, + 11, 5, 208, 47, 11, 5, 208, 41, 11, 5, 207, 247, 11, 5, 207, 243, 11, 5, + 208, 35, 11, 5, 207, 251, 11, 5, 207, 249, 11, 5, 207, 250, 11, 5, 207, + 227, 11, 5, 207, 225, 11, 5, 207, 237, 11, 5, 207, 230, 11, 5, 207, 228, + 11, 5, 207, 229, 11, 5, 222, 223, 11, 5, 222, 222, 11, 5, 222, 229, 11, + 5, 222, 224, 11, 5, 222, 226, 11, 5, 222, 225, 11, 5, 222, 228, 11, 5, + 222, 227, 11, 5, 222, 214, 11, 5, 222, 216, 11, 5, 222, 215, 11, 5, 222, + 219, 11, 5, 222, 218, 11, 5, 222, 221, 11, 5, 222, 220, 11, 5, 222, 210, + 11, 5, 222, 209, 11, 5, 222, 217, 11, 5, 222, 213, 11, 5, 222, 211, 11, + 5, 222, 212, 11, 5, 222, 206, 11, 5, 222, 205, 11, 5, 222, 208, 11, 5, + 222, 207, 11, 5, 213, 136, 11, 5, 213, 135, 11, 5, 213, 143, 11, 5, 213, + 137, 11, 5, 213, 139, 11, 5, 213, 138, 11, 5, 213, 142, 11, 5, 213, 140, + 11, 5, 213, 125, 11, 5, 213, 126, 11, 5, 213, 131, 11, 5, 213, 130, 11, + 5, 213, 134, 11, 5, 213, 132, 11, 5, 213, 120, 11, 5, 213, 129, 11, 5, + 213, 124, 11, 5, 213, 121, 11, 5, 213, 122, 11, 5, 213, 115, 11, 5, 213, + 114, 11, 5, 213, 119, 11, 5, 213, 118, 11, 5, 213, 116, 11, 5, 213, 117, + 11, 5, 212, 70, 11, 5, 212, 69, 11, 5, 212, 83, 11, 5, 212, 74, 11, 5, + 212, 79, 11, 5, 212, 78, 11, 5, 212, 81, 11, 5, 212, 80, 11, 5, 212, 55, + 11, 5, 212, 57, 11, 5, 212, 56, 11, 5, 212, 62, 11, 5, 212, 61, 11, 5, + 212, 67, 11, 5, 212, 63, 11, 5, 212, 53, 11, 5, 212, 51, 11, 5, 212, 60, + 11, 5, 212, 54, 11, 5, 192, 198, 11, 5, 192, 197, 11, 5, 192, 207, 11, 5, + 192, 200, 11, 5, 192, 202, 11, 5, 192, 201, 11, 5, 192, 204, 11, 5, 192, + 203, 11, 5, 192, 186, 11, 5, 192, 187, 11, 5, 192, 191, 11, 5, 192, 190, + 11, 5, 192, 196, 11, 5, 192, 194, 11, 5, 192, 163, 11, 5, 192, 161, 11, + 5, 192, 176, 11, 5, 192, 166, 11, 5, 192, 164, 11, 5, 192, 165, 11, 5, + 192, 18, 11, 5, 192, 16, 11, 5, 192, 33, 11, 5, 192, 19, 11, 5, 192, 27, + 11, 5, 192, 26, 11, 5, 192, 30, 11, 5, 192, 28, 11, 5, 191, 198, 11, 5, + 191, 197, 11, 5, 191, 201, 11, 5, 191, 199, 11, 5, 191, 240, 11, 5, 191, + 235, 11, 5, 192, 12, 11, 5, 191, 245, 11, 5, 191, 189, 11, 5, 191, 185, + 11, 5, 191, 225, 11, 5, 191, 196, 11, 5, 191, 192, 11, 5, 191, 193, 11, + 5, 191, 169, 11, 5, 191, 168, 11, 5, 191, 176, 11, 5, 191, 172, 11, 5, + 191, 170, 11, 5, 191, 171, 11, 48, 208, 38, 11, 48, 219, 148, 11, 48, + 221, 122, 11, 48, 212, 74, 11, 48, 238, 139, 11, 48, 201, 143, 11, 48, + 231, 112, 11, 48, 231, 144, 11, 48, 216, 102, 11, 48, 228, 106, 11, 48, + 218, 177, 11, 48, 249, 27, 11, 48, 215, 204, 11, 48, 192, 12, 11, 48, + 208, 133, 11, 48, 228, 100, 11, 48, 199, 171, 11, 48, 231, 242, 11, 48, + 190, 243, 11, 48, 238, 132, 11, 48, 237, 153, 11, 48, 247, 232, 11, 48, + 231, 108, 11, 48, 212, 63, 11, 48, 197, 94, 11, 48, 211, 80, 11, 48, 222, + 210, 11, 48, 191, 2, 11, 48, 208, 110, 11, 48, 229, 67, 11, 48, 192, 18, + 11, 48, 193, 244, 11, 48, 202, 232, 11, 48, 195, 141, 11, 48, 191, 123, + 11, 48, 222, 203, 11, 48, 212, 27, 11, 48, 222, 208, 11, 48, 230, 234, + 11, 48, 222, 228, 11, 48, 193, 48, 11, 48, 235, 91, 11, 48, 202, 248, 11, + 48, 219, 142, 11, 48, 238, 145, 11, 48, 238, 186, 11, 48, 243, 14, 11, + 48, 228, 103, 11, 48, 203, 124, 11, 48, 190, 242, 11, 48, 203, 45, 11, + 48, 243, 129, 11, 48, 190, 212, 11, 48, 214, 191, 11, 48, 222, 24, 219, + 90, 1, 249, 155, 219, 90, 1, 168, 219, 90, 1, 209, 230, 219, 90, 1, 238, + 34, 219, 90, 1, 190, 190, 219, 90, 1, 199, 49, 219, 90, 1, 231, 242, 219, + 90, 1, 155, 219, 90, 1, 221, 217, 219, 90, 1, 223, 34, 219, 90, 1, 247, + 162, 219, 90, 1, 247, 3, 219, 90, 1, 235, 37, 219, 90, 1, 197, 168, 219, + 90, 1, 197, 157, 219, 90, 1, 174, 219, 90, 1, 181, 219, 90, 1, 173, 219, + 90, 1, 188, 219, 90, 1, 191, 71, 219, 90, 1, 191, 123, 219, 90, 1, 214, + 70, 219, 90, 1, 140, 219, 90, 1, 192, 220, 219, 90, 1, 229, 179, 219, 90, + 1, 233, 111, 219, 90, 1, 193, 190, 219, 90, 1, 203, 166, 219, 90, 1, 170, + 219, 90, 1, 231, 93, 219, 90, 1, 65, 219, 90, 1, 252, 27, 219, 90, 1, 71, + 219, 90, 1, 233, 244, 219, 90, 1, 68, 219, 90, 1, 74, 219, 90, 1, 66, + 219, 90, 1, 196, 152, 219, 90, 1, 196, 141, 219, 90, 1, 211, 153, 219, + 90, 1, 163, 215, 71, 198, 193, 219, 90, 1, 163, 215, 9, 209, 75, 219, 90, + 1, 163, 215, 71, 238, 144, 219, 90, 1, 163, 215, 71, 248, 113, 219, 90, + 1, 163, 215, 71, 181, 219, 90, 1, 163, 215, 71, 222, 255, 219, 90, 208, + 154, 242, 76, 219, 90, 208, 154, 232, 82, 201, 64, 59, 5, 234, 190, 59, + 5, 234, 186, 59, 5, 229, 217, 59, 5, 193, 114, 59, 5, 193, 113, 59, 5, + 210, 51, 59, 5, 248, 197, 59, 5, 249, 3, 59, 5, 217, 5, 59, 5, 221, 18, + 59, 5, 216, 134, 59, 5, 231, 180, 59, 5, 233, 54, 59, 5, 195, 148, 59, 5, + 199, 121, 59, 5, 199, 31, 59, 5, 237, 60, 59, 5, 237, 57, 59, 5, 219, + 230, 59, 5, 207, 86, 59, 5, 237, 133, 59, 5, 214, 155, 59, 5, 205, 51, + 59, 5, 203, 112, 59, 5, 191, 84, 59, 5, 191, 61, 59, 5, 247, 36, 59, 5, + 223, 10, 59, 5, 213, 150, 59, 5, 192, 77, 59, 5, 222, 15, 59, 5, 214, 43, + 59, 5, 231, 159, 59, 5, 216, 213, 59, 5, 214, 112, 59, 5, 212, 91, 59, 5, + 68, 59, 5, 223, 164, 59, 5, 229, 160, 59, 5, 229, 130, 59, 5, 193, 86, + 59, 5, 193, 68, 59, 5, 209, 187, 59, 5, 248, 195, 59, 5, 248, 190, 59, 5, + 216, 254, 59, 5, 221, 15, 59, 5, 216, 131, 59, 5, 231, 176, 59, 5, 233, + 25, 59, 5, 195, 69, 59, 5, 198, 193, 59, 5, 199, 11, 59, 5, 237, 52, 59, + 5, 237, 56, 59, 5, 219, 148, 59, 5, 207, 2, 59, 5, 237, 46, 59, 5, 214, + 149, 59, 5, 202, 223, 59, 5, 203, 82, 59, 5, 191, 30, 59, 5, 191, 57, 59, + 5, 243, 31, 59, 5, 222, 246, 59, 5, 213, 143, 59, 5, 192, 33, 59, 5, 221, + 168, 59, 5, 214, 35, 59, 5, 231, 55, 59, 5, 216, 102, 59, 5, 213, 221, + 59, 5, 212, 83, 59, 5, 65, 59, 5, 251, 134, 59, 5, 214, 65, 59, 5, 140, + 59, 5, 230, 58, 59, 5, 193, 190, 59, 5, 193, 164, 59, 5, 168, 59, 5, 248, + 205, 59, 5, 249, 155, 59, 5, 217, 13, 59, 5, 221, 23, 59, 5, 221, 21, 59, + 5, 216, 138, 59, 5, 231, 184, 59, 5, 233, 111, 59, 5, 195, 188, 59, 5, + 190, 190, 59, 5, 199, 49, 59, 5, 237, 70, 59, 5, 237, 59, 59, 5, 173, 59, + 5, 165, 59, 5, 238, 34, 59, 5, 214, 164, 59, 5, 188, 59, 5, 203, 166, 59, + 5, 191, 123, 59, 5, 191, 71, 59, 5, 247, 162, 59, 5, 223, 34, 59, 5, 213, + 159, 59, 5, 170, 59, 5, 155, 59, 5, 222, 89, 59, 5, 214, 49, 59, 5, 231, + 242, 59, 5, 174, 59, 5, 181, 59, 5, 212, 103, 59, 5, 211, 89, 59, 5, 211, + 84, 59, 5, 228, 254, 59, 5, 193, 29, 59, 5, 193, 25, 59, 5, 209, 39, 59, + 5, 248, 193, 59, 5, 248, 99, 59, 5, 216, 249, 59, 5, 221, 13, 59, 5, 216, + 127, 59, 5, 231, 172, 59, 5, 232, 164, 59, 5, 195, 8, 59, 5, 198, 59, 59, + 5, 198, 235, 59, 5, 237, 49, 59, 5, 237, 54, 59, 5, 219, 10, 59, 5, 206, + 135, 59, 5, 236, 148, 59, 5, 214, 136, 59, 5, 202, 17, 59, 5, 203, 49, + 59, 5, 191, 4, 59, 5, 191, 52, 59, 5, 239, 20, 59, 5, 222, 193, 59, 5, + 213, 133, 59, 5, 191, 246, 59, 5, 221, 43, 59, 5, 214, 33, 59, 5, 230, + 247, 59, 5, 215, 213, 59, 5, 213, 28, 59, 5, 212, 64, 59, 5, 66, 59, 5, + 196, 113, 59, 5, 228, 161, 59, 5, 228, 144, 59, 5, 193, 0, 59, 5, 192, + 249, 59, 5, 208, 167, 59, 5, 248, 192, 59, 5, 248, 12, 59, 5, 216, 248, + 59, 5, 221, 11, 59, 5, 216, 126, 59, 5, 231, 171, 59, 5, 232, 88, 59, 5, + 193, 249, 59, 5, 197, 94, 59, 5, 198, 213, 59, 5, 237, 47, 59, 5, 237, + 53, 59, 5, 218, 227, 59, 5, 206, 69, 59, 5, 235, 91, 59, 5, 214, 131, 59, + 5, 201, 5, 59, 5, 203, 6, 59, 5, 190, 251, 59, 5, 191, 48, 59, 5, 238, + 197, 59, 5, 222, 184, 59, 5, 213, 129, 59, 5, 191, 225, 59, 5, 220, 234, + 59, 5, 214, 32, 59, 5, 230, 181, 59, 5, 215, 157, 59, 5, 212, 180, 59, 5, + 212, 60, 59, 5, 74, 59, 5, 211, 106, 59, 5, 213, 247, 59, 5, 229, 25, 59, + 5, 229, 1, 59, 5, 193, 48, 59, 5, 193, 30, 59, 5, 209, 75, 59, 5, 248, + 194, 59, 5, 248, 113, 59, 5, 216, 250, 59, 5, 221, 14, 59, 5, 216, 129, + 59, 5, 231, 174, 59, 5, 231, 173, 59, 5, 232, 177, 59, 5, 195, 24, 59, 5, + 159, 59, 5, 198, 241, 59, 5, 237, 50, 59, 5, 237, 55, 59, 5, 219, 45, 59, + 5, 206, 163, 59, 5, 236, 176, 59, 5, 214, 140, 59, 5, 202, 47, 59, 5, + 203, 57, 59, 5, 191, 7, 59, 5, 191, 54, 59, 5, 242, 101, 59, 5, 222, 203, + 59, 5, 213, 134, 59, 5, 192, 12, 59, 5, 221, 69, 59, 5, 214, 34, 59, 5, + 231, 5, 59, 5, 216, 14, 59, 5, 213, 45, 59, 5, 212, 67, 59, 5, 71, 59, 5, + 234, 105, 59, 5, 214, 54, 59, 5, 229, 247, 59, 5, 229, 200, 59, 5, 193, + 125, 59, 5, 193, 108, 59, 5, 210, 65, 59, 5, 248, 198, 59, 5, 249, 19, + 59, 5, 217, 6, 59, 5, 221, 19, 59, 5, 221, 17, 59, 5, 216, 135, 59, 5, + 231, 181, 59, 5, 231, 179, 59, 5, 233, 61, 59, 5, 195, 153, 59, 5, 199, + 145, 59, 5, 199, 33, 59, 5, 237, 61, 59, 5, 237, 58, 59, 5, 219, 240, 59, + 5, 207, 115, 59, 5, 237, 148, 59, 5, 214, 156, 59, 5, 205, 69, 59, 5, + 203, 114, 59, 5, 191, 87, 59, 5, 191, 62, 59, 5, 247, 44, 59, 5, 223, 12, + 59, 5, 213, 152, 59, 5, 192, 80, 59, 5, 222, 24, 59, 5, 214, 44, 59, 5, + 214, 40, 59, 5, 231, 167, 59, 5, 231, 153, 59, 5, 216, 234, 59, 5, 214, + 123, 59, 5, 212, 92, 59, 5, 214, 72, 59, 5, 219, 192, 59, 242, 76, 59, + 232, 82, 201, 64, 59, 208, 15, 77, 59, 5, 214, 139, 233, 111, 59, 5, 214, + 139, 155, 59, 5, 214, 139, 202, 17, 59, 16, 233, 50, 59, 16, 222, 13, 59, + 16, 198, 140, 59, 16, 213, 188, 59, 16, 249, 97, 59, 16, 233, 110, 59, + 16, 199, 245, 59, 16, 237, 238, 59, 16, 236, 147, 59, 16, 220, 210, 59, + 16, 198, 63, 59, 16, 236, 175, 59, 16, 222, 194, 59, 17, 191, 77, 59, 17, + 107, 59, 17, 109, 59, 17, 138, 59, 17, 134, 59, 17, 150, 59, 17, 169, 59, + 17, 175, 59, 17, 171, 59, 17, 178, 59, 5, 214, 139, 174, 59, 5, 214, 139, + 236, 176, 38, 6, 1, 191, 81, 38, 2, 1, 191, 81, 38, 6, 1, 235, 32, 38, 2, + 1, 235, 32, 38, 6, 1, 207, 19, 235, 34, 38, 2, 1, 207, 19, 235, 34, 38, + 6, 1, 223, 85, 38, 2, 1, 223, 85, 38, 6, 1, 236, 193, 38, 2, 1, 236, 193, + 38, 6, 1, 215, 221, 196, 128, 38, 2, 1, 215, 221, 196, 128, 38, 6, 1, + 248, 26, 211, 112, 38, 2, 1, 248, 26, 211, 112, 38, 6, 1, 214, 84, 192, + 62, 38, 2, 1, 214, 84, 192, 62, 38, 6, 1, 192, 59, 4, 249, 149, 192, 62, + 38, 2, 1, 192, 59, 4, 249, 149, 192, 62, 38, 6, 1, 223, 83, 192, 95, 38, + 2, 1, 223, 83, 192, 95, 38, 6, 1, 207, 19, 191, 225, 38, 2, 1, 207, 19, + 191, 225, 38, 6, 1, 223, 83, 65, 38, 2, 1, 223, 83, 65, 38, 6, 1, 242, + 221, 219, 85, 191, 190, 38, 2, 1, 242, 221, 219, 85, 191, 190, 38, 6, 1, + 248, 133, 191, 190, 38, 2, 1, 248, 133, 191, 190, 38, 6, 1, 223, 83, 242, + 221, 219, 85, 191, 190, 38, 2, 1, 223, 83, 242, 221, 219, 85, 191, 190, + 38, 6, 1, 192, 14, 38, 2, 1, 192, 14, 38, 6, 1, 207, 19, 197, 161, 38, 2, + 1, 207, 19, 197, 161, 38, 6, 1, 202, 33, 237, 148, 38, 2, 1, 202, 33, + 237, 148, 38, 6, 1, 202, 33, 234, 142, 38, 2, 1, 202, 33, 234, 142, 38, + 6, 1, 202, 33, 234, 116, 38, 2, 1, 202, 33, 234, 116, 38, 6, 1, 215, 225, + 74, 38, 2, 1, 215, 225, 74, 38, 6, 1, 248, 166, 74, 38, 2, 1, 248, 166, + 74, 38, 6, 1, 55, 215, 225, 74, 38, 2, 1, 55, 215, 225, 74, 38, 1, 215, + 132, 74, 33, 38, 193, 226, 33, 38, 199, 96, 216, 50, 56, 33, 38, 228, + 143, 216, 50, 56, 33, 38, 198, 230, 216, 50, 56, 202, 96, 250, 195, 33, + 38, 1, 196, 125, 223, 228, 33, 38, 1, 68, 33, 38, 1, 192, 33, 33, 38, 1, + 66, 33, 38, 1, 230, 19, 56, 33, 38, 1, 192, 58, 33, 38, 1, 202, 33, 56, + 33, 38, 1, 211, 112, 33, 38, 222, 37, 33, 38, 210, 72, 38, 222, 37, 38, + 210, 72, 38, 6, 1, 235, 47, 38, 2, 1, 235, 47, 38, 6, 1, 235, 23, 38, 2, + 1, 235, 23, 38, 6, 1, 191, 38, 38, 2, 1, 191, 38, 38, 6, 1, 247, 60, 38, + 2, 1, 247, 60, 38, 6, 1, 235, 19, 38, 2, 1, 235, 19, 38, 6, 1, 199, 146, 4, 82, 102, 38, 2, 1, 199, 146, 4, 82, 102, 38, 6, 1, 197, 41, 38, 2, 1, 197, 41, 38, 6, 1, 197, 136, 38, 2, 1, 197, 136, 38, 6, 1, 197, 141, 38, 2, 1, 197, 141, 38, 6, 1, 199, 151, 38, 2, 1, 199, 151, 38, 6, 1, 228, - 122, 38, 2, 1, 228, 122, 38, 6, 1, 202, 237, 38, 2, 1, 202, 237, 38, 6, - 1, 55, 74, 38, 2, 1, 55, 74, 38, 6, 1, 238, 214, 74, 38, 2, 1, 238, 214, - 74, 52, 1, 38, 230, 17, 56, 52, 1, 38, 202, 32, 56, 33, 38, 1, 234, 181, - 33, 38, 1, 223, 81, 71, 26, 1, 65, 26, 1, 155, 26, 1, 66, 26, 1, 220, - 232, 26, 1, 234, 188, 26, 1, 207, 84, 26, 1, 199, 226, 26, 1, 74, 26, 1, - 212, 81, 26, 1, 68, 26, 1, 173, 26, 1, 168, 26, 1, 206, 195, 26, 1, 206, - 242, 26, 1, 219, 227, 26, 1, 216, 210, 26, 1, 199, 245, 26, 1, 214, 160, - 26, 1, 213, 155, 26, 1, 218, 168, 26, 1, 200, 160, 26, 1, 215, 155, 26, - 1, 203, 76, 26, 1, 202, 222, 26, 1, 203, 86, 26, 1, 203, 248, 26, 1, 220, - 149, 26, 1, 221, 241, 26, 1, 212, 146, 26, 1, 212, 178, 26, 1, 213, 126, - 26, 1, 191, 243, 26, 1, 203, 5, 26, 1, 191, 194, 26, 1, 170, 26, 1, 212, - 215, 26, 1, 221, 227, 26, 1, 209, 232, 26, 1, 213, 148, 26, 1, 212, 195, - 26, 1, 208, 156, 26, 1, 192, 253, 26, 1, 210, 49, 26, 1, 233, 52, 26, 1, - 206, 68, 26, 1, 218, 225, 26, 1, 216, 100, 26, 1, 213, 219, 26, 1, 207, - 20, 26, 1, 207, 163, 26, 1, 221, 251, 26, 1, 213, 252, 26, 1, 214, 47, - 26, 1, 214, 68, 26, 1, 203, 56, 26, 1, 208, 161, 26, 1, 232, 86, 26, 1, - 232, 167, 26, 1, 193, 190, 26, 1, 180, 26, 1, 219, 146, 26, 1, 209, 185, - 26, 1, 219, 0, 26, 1, 221, 67, 26, 1, 217, 1, 26, 1, 207, 55, 26, 1, 216, - 186, 26, 1, 174, 26, 1, 198, 193, 26, 1, 221, 166, 26, 1, 216, 12, 26, 1, - 217, 9, 26, 1, 199, 73, 26, 1, 221, 21, 26, 1, 199, 95, 26, 1, 212, 181, - 26, 1, 205, 150, 26, 1, 233, 105, 26, 1, 221, 24, 26, 1, 221, 57, 26, 33, - 87, 221, 34, 26, 33, 87, 197, 79, 26, 213, 154, 26, 232, 80, 201, 63, 26, - 242, 83, 26, 242, 74, 26, 204, 25, 26, 208, 13, 77, 52, 1, 243, 80, 163, - 192, 22, 209, 132, 52, 1, 243, 80, 163, 192, 107, 209, 132, 52, 1, 243, - 80, 163, 192, 22, 203, 137, 52, 1, 243, 80, 163, 192, 107, 203, 137, 52, - 1, 243, 80, 163, 192, 22, 208, 33, 52, 1, 243, 80, 163, 192, 107, 208, - 33, 52, 1, 243, 80, 163, 192, 22, 206, 68, 52, 1, 243, 80, 163, 192, 107, - 206, 68, 52, 1, 233, 200, 235, 138, 163, 164, 52, 1, 137, 235, 138, 163, - 164, 52, 1, 216, 87, 235, 138, 163, 164, 52, 1, 130, 235, 138, 163, 164, - 52, 1, 233, 199, 235, 138, 163, 164, 52, 1, 233, 200, 235, 138, 219, 216, - 163, 164, 52, 1, 137, 235, 138, 219, 216, 163, 164, 52, 1, 216, 87, 235, - 138, 219, 216, 163, 164, 52, 1, 130, 235, 138, 219, 216, 163, 164, 52, 1, - 233, 199, 235, 138, 219, 216, 163, 164, 52, 1, 233, 200, 219, 216, 163, - 164, 52, 1, 137, 219, 216, 163, 164, 52, 1, 216, 87, 219, 216, 163, 164, - 52, 1, 130, 219, 216, 163, 164, 52, 1, 233, 199, 219, 216, 163, 164, 52, - 1, 75, 81, 164, 52, 1, 75, 202, 97, 52, 1, 75, 228, 241, 164, 52, 1, 110, - 50, 239, 2, 251, 115, 52, 1, 207, 147, 133, 57, 52, 1, 207, 147, 144, 57, - 52, 1, 207, 147, 233, 216, 77, 52, 1, 207, 147, 223, 93, 233, 216, 77, - 52, 1, 130, 223, 93, 233, 216, 77, 52, 1, 201, 38, 23, 137, 198, 79, 52, - 1, 201, 38, 23, 130, 198, 79, 8, 6, 1, 234, 175, 251, 192, 8, 2, 1, 234, - 175, 251, 192, 8, 6, 1, 234, 175, 251, 230, 8, 2, 1, 234, 175, 251, 230, - 8, 6, 1, 229, 196, 8, 2, 1, 229, 196, 8, 6, 1, 196, 241, 8, 2, 1, 196, - 241, 8, 6, 1, 197, 248, 8, 2, 1, 197, 248, 8, 6, 1, 238, 192, 8, 2, 1, - 238, 192, 8, 6, 1, 238, 193, 4, 242, 74, 8, 2, 1, 238, 193, 4, 242, 74, - 8, 1, 2, 6, 233, 175, 8, 1, 2, 6, 206, 8, 8, 6, 1, 252, 206, 8, 2, 1, - 252, 206, 8, 6, 1, 251, 68, 8, 2, 1, 251, 68, 8, 6, 1, 250, 163, 8, 2, 1, - 250, 163, 8, 6, 1, 250, 146, 8, 2, 1, 250, 146, 8, 6, 1, 250, 147, 4, - 228, 241, 164, 8, 2, 1, 250, 147, 4, 228, 241, 164, 8, 6, 1, 250, 131, 8, - 2, 1, 250, 131, 8, 6, 1, 207, 18, 247, 194, 4, 236, 140, 8, 2, 1, 207, - 18, 247, 194, 4, 236, 140, 8, 6, 1, 222, 153, 4, 106, 8, 2, 1, 222, 153, - 4, 106, 8, 6, 1, 222, 153, 4, 237, 39, 106, 8, 2, 1, 222, 153, 4, 237, - 39, 106, 8, 6, 1, 222, 153, 4, 201, 28, 23, 237, 39, 106, 8, 2, 1, 222, - 153, 4, 201, 28, 23, 237, 39, 106, 8, 6, 1, 248, 22, 172, 8, 2, 1, 248, - 22, 172, 8, 6, 1, 220, 143, 4, 137, 106, 8, 2, 1, 220, 143, 4, 137, 106, - 8, 6, 1, 187, 4, 179, 201, 28, 210, 255, 8, 2, 1, 187, 4, 179, 201, 28, - 210, 255, 8, 6, 1, 187, 4, 219, 4, 8, 2, 1, 187, 4, 219, 4, 8, 6, 1, 211, - 87, 8, 2, 1, 211, 87, 8, 6, 1, 210, 237, 4, 201, 28, 198, 216, 237, 87, - 8, 2, 1, 210, 237, 4, 201, 28, 198, 216, 237, 87, 8, 6, 1, 210, 237, 4, - 232, 188, 8, 2, 1, 210, 237, 4, 232, 188, 8, 6, 1, 210, 237, 4, 201, 182, - 199, 215, 8, 2, 1, 210, 237, 4, 201, 182, 199, 215, 8, 6, 1, 208, 105, 4, - 201, 28, 198, 216, 237, 87, 8, 2, 1, 208, 105, 4, 201, 28, 198, 216, 237, - 87, 8, 6, 1, 208, 105, 4, 237, 39, 106, 8, 2, 1, 208, 105, 4, 237, 39, - 106, 8, 6, 1, 207, 222, 206, 116, 8, 2, 1, 207, 222, 206, 116, 8, 6, 1, - 206, 49, 206, 116, 8, 2, 1, 206, 49, 206, 116, 8, 6, 1, 196, 13, 4, 237, - 39, 106, 8, 2, 1, 196, 13, 4, 237, 39, 106, 8, 6, 1, 193, 235, 8, 2, 1, + 124, 38, 2, 1, 228, 124, 38, 6, 1, 202, 238, 38, 2, 1, 202, 238, 38, 6, + 1, 55, 74, 38, 2, 1, 55, 74, 38, 6, 1, 238, 216, 74, 38, 2, 1, 238, 216, + 74, 52, 1, 38, 230, 19, 56, 52, 1, 38, 202, 33, 56, 33, 38, 1, 234, 183, + 33, 38, 1, 223, 83, 71, 26, 1, 65, 26, 1, 155, 26, 1, 66, 26, 1, 220, + 234, 26, 1, 234, 190, 26, 1, 207, 86, 26, 1, 199, 226, 26, 1, 74, 26, 1, + 212, 83, 26, 1, 68, 26, 1, 173, 26, 1, 168, 26, 1, 206, 196, 26, 1, 206, + 243, 26, 1, 219, 229, 26, 1, 216, 212, 26, 1, 199, 245, 26, 1, 214, 162, + 26, 1, 213, 157, 26, 1, 218, 170, 26, 1, 200, 160, 26, 1, 215, 157, 26, + 1, 203, 77, 26, 1, 202, 223, 26, 1, 203, 87, 26, 1, 203, 249, 26, 1, 220, + 151, 26, 1, 221, 243, 26, 1, 212, 148, 26, 1, 212, 180, 26, 1, 213, 128, + 26, 1, 191, 243, 26, 1, 203, 6, 26, 1, 191, 194, 26, 1, 170, 26, 1, 212, + 217, 26, 1, 221, 229, 26, 1, 209, 234, 26, 1, 213, 150, 26, 1, 212, 197, + 26, 1, 208, 158, 26, 1, 192, 253, 26, 1, 210, 51, 26, 1, 233, 54, 26, 1, + 206, 69, 26, 1, 218, 227, 26, 1, 216, 102, 26, 1, 213, 221, 26, 1, 207, + 21, 26, 1, 207, 165, 26, 1, 221, 253, 26, 1, 213, 254, 26, 1, 214, 49, + 26, 1, 214, 70, 26, 1, 203, 57, 26, 1, 208, 163, 26, 1, 232, 88, 26, 1, + 232, 169, 26, 1, 193, 190, 26, 1, 181, 26, 1, 219, 148, 26, 1, 209, 187, + 26, 1, 219, 2, 26, 1, 221, 69, 26, 1, 217, 3, 26, 1, 207, 56, 26, 1, 216, + 188, 26, 1, 174, 26, 1, 198, 193, 26, 1, 221, 168, 26, 1, 216, 14, 26, 1, + 217, 11, 26, 1, 199, 73, 26, 1, 221, 23, 26, 1, 199, 95, 26, 1, 212, 183, + 26, 1, 205, 151, 26, 1, 233, 107, 26, 1, 221, 26, 26, 1, 221, 59, 26, 33, + 87, 221, 36, 26, 33, 87, 197, 79, 26, 213, 156, 26, 232, 82, 201, 64, 26, + 242, 85, 26, 242, 76, 26, 204, 26, 26, 208, 15, 77, 52, 1, 243, 82, 163, + 192, 22, 209, 134, 52, 1, 243, 82, 163, 192, 107, 209, 134, 52, 1, 243, + 82, 163, 192, 22, 203, 138, 52, 1, 243, 82, 163, 192, 107, 203, 138, 52, + 1, 243, 82, 163, 192, 22, 208, 35, 52, 1, 243, 82, 163, 192, 107, 208, + 35, 52, 1, 243, 82, 163, 192, 22, 206, 69, 52, 1, 243, 82, 163, 192, 107, + 206, 69, 52, 1, 233, 202, 235, 140, 163, 164, 52, 1, 137, 235, 140, 163, + 164, 52, 1, 216, 89, 235, 140, 163, 164, 52, 1, 130, 235, 140, 163, 164, + 52, 1, 233, 201, 235, 140, 163, 164, 52, 1, 233, 202, 235, 140, 219, 218, + 163, 164, 52, 1, 137, 235, 140, 219, 218, 163, 164, 52, 1, 216, 89, 235, + 140, 219, 218, 163, 164, 52, 1, 130, 235, 140, 219, 218, 163, 164, 52, 1, + 233, 201, 235, 140, 219, 218, 163, 164, 52, 1, 233, 202, 219, 218, 163, + 164, 52, 1, 137, 219, 218, 163, 164, 52, 1, 216, 89, 219, 218, 163, 164, + 52, 1, 130, 219, 218, 163, 164, 52, 1, 233, 201, 219, 218, 163, 164, 52, + 1, 75, 81, 164, 52, 1, 75, 202, 98, 52, 1, 75, 228, 243, 164, 52, 1, 110, + 50, 239, 4, 251, 117, 52, 1, 207, 149, 133, 57, 52, 1, 207, 149, 144, 57, + 52, 1, 207, 149, 233, 218, 77, 52, 1, 207, 149, 223, 95, 233, 218, 77, + 52, 1, 130, 223, 95, 233, 218, 77, 52, 1, 201, 39, 23, 137, 198, 79, 52, + 1, 201, 39, 23, 130, 198, 79, 8, 6, 1, 234, 177, 251, 194, 8, 2, 1, 234, + 177, 251, 194, 8, 6, 1, 234, 177, 251, 232, 8, 2, 1, 234, 177, 251, 232, + 8, 6, 1, 229, 198, 8, 2, 1, 229, 198, 8, 6, 1, 196, 241, 8, 2, 1, 196, + 241, 8, 6, 1, 197, 248, 8, 2, 1, 197, 248, 8, 6, 1, 238, 194, 8, 2, 1, + 238, 194, 8, 6, 1, 238, 195, 4, 242, 76, 8, 2, 1, 238, 195, 4, 242, 76, + 8, 1, 2, 6, 233, 177, 8, 1, 2, 6, 206, 9, 8, 6, 1, 252, 208, 8, 2, 1, + 252, 208, 8, 6, 1, 251, 70, 8, 2, 1, 251, 70, 8, 6, 1, 250, 165, 8, 2, 1, + 250, 165, 8, 6, 1, 250, 148, 8, 2, 1, 250, 148, 8, 6, 1, 250, 149, 4, + 228, 243, 164, 8, 2, 1, 250, 149, 4, 228, 243, 164, 8, 6, 1, 250, 133, 8, + 2, 1, 250, 133, 8, 6, 1, 207, 19, 247, 196, 4, 236, 142, 8, 2, 1, 207, + 19, 247, 196, 4, 236, 142, 8, 6, 1, 222, 155, 4, 106, 8, 2, 1, 222, 155, + 4, 106, 8, 6, 1, 222, 155, 4, 237, 41, 106, 8, 2, 1, 222, 155, 4, 237, + 41, 106, 8, 6, 1, 222, 155, 4, 201, 29, 23, 237, 41, 106, 8, 2, 1, 222, + 155, 4, 201, 29, 23, 237, 41, 106, 8, 6, 1, 248, 24, 172, 8, 2, 1, 248, + 24, 172, 8, 6, 1, 220, 145, 4, 137, 106, 8, 2, 1, 220, 145, 4, 137, 106, + 8, 6, 1, 187, 4, 180, 201, 29, 211, 1, 8, 2, 1, 187, 4, 180, 201, 29, + 211, 1, 8, 6, 1, 187, 4, 219, 6, 8, 2, 1, 187, 4, 219, 6, 8, 6, 1, 211, + 89, 8, 2, 1, 211, 89, 8, 6, 1, 210, 239, 4, 201, 29, 198, 216, 237, 89, + 8, 2, 1, 210, 239, 4, 201, 29, 198, 216, 237, 89, 8, 6, 1, 210, 239, 4, + 232, 190, 8, 2, 1, 210, 239, 4, 232, 190, 8, 6, 1, 210, 239, 4, 201, 183, + 199, 215, 8, 2, 1, 210, 239, 4, 201, 183, 199, 215, 8, 6, 1, 208, 107, 4, + 201, 29, 198, 216, 237, 89, 8, 2, 1, 208, 107, 4, 201, 29, 198, 216, 237, + 89, 8, 6, 1, 208, 107, 4, 237, 41, 106, 8, 2, 1, 208, 107, 4, 237, 41, + 106, 8, 6, 1, 207, 224, 206, 117, 8, 2, 1, 207, 224, 206, 117, 8, 6, 1, + 206, 50, 206, 117, 8, 2, 1, 206, 50, 206, 117, 8, 6, 1, 196, 13, 4, 237, + 41, 106, 8, 2, 1, 196, 13, 4, 237, 41, 106, 8, 6, 1, 193, 235, 8, 2, 1, 193, 235, 8, 6, 1, 195, 33, 191, 166, 8, 2, 1, 195, 33, 191, 166, 8, 6, 1, 198, 234, 4, 106, 8, 2, 1, 198, 234, 4, 106, 8, 6, 1, 198, 234, 4, - 201, 28, 198, 216, 237, 87, 8, 2, 1, 198, 234, 4, 201, 28, 198, 216, 237, - 87, 8, 6, 1, 195, 142, 8, 2, 1, 195, 142, 8, 6, 1, 233, 255, 8, 2, 1, - 233, 255, 8, 6, 1, 223, 68, 8, 2, 1, 223, 68, 8, 6, 1, 239, 57, 8, 2, 1, - 239, 57, 52, 1, 196, 45, 8, 2, 1, 235, 77, 8, 2, 1, 218, 208, 8, 2, 1, - 215, 123, 8, 2, 1, 212, 137, 8, 2, 1, 206, 48, 8, 1, 2, 6, 206, 48, 8, 2, - 1, 197, 76, 8, 2, 1, 196, 120, 8, 6, 1, 223, 115, 238, 127, 8, 2, 1, 223, - 115, 238, 127, 8, 6, 1, 223, 115, 233, 175, 8, 2, 1, 223, 115, 233, 175, - 8, 6, 1, 223, 115, 232, 51, 8, 6, 1, 153, 223, 115, 232, 51, 8, 2, 1, - 153, 223, 115, 232, 51, 8, 6, 1, 153, 172, 8, 2, 1, 153, 172, 8, 6, 1, - 223, 115, 146, 8, 2, 1, 223, 115, 146, 8, 6, 1, 223, 115, 206, 8, 8, 2, - 1, 223, 115, 206, 8, 8, 6, 1, 223, 115, 200, 43, 8, 2, 1, 223, 115, 200, - 43, 52, 1, 130, 243, 2, 252, 60, 52, 1, 242, 83, 52, 1, 203, 40, 234, 43, - 56, 8, 6, 1, 205, 156, 8, 2, 1, 205, 156, 8, 6, 1, 153, 230, 116, 8, 2, - 1, 220, 143, 4, 207, 24, 228, 251, 23, 248, 231, 8, 1, 202, 163, 236, - 140, 8, 6, 1, 215, 62, 4, 237, 87, 8, 2, 1, 215, 62, 4, 237, 87, 8, 6, 1, - 247, 194, 4, 164, 8, 2, 1, 247, 194, 4, 164, 8, 2, 1, 247, 194, 4, 210, - 192, 102, 8, 2, 1, 230, 117, 4, 210, 192, 102, 8, 6, 1, 78, 4, 232, 188, - 8, 2, 1, 78, 4, 232, 188, 8, 6, 1, 233, 176, 4, 106, 8, 2, 1, 233, 176, - 4, 106, 8, 6, 1, 195, 15, 252, 25, 8, 2, 1, 195, 15, 252, 25, 8, 6, 1, - 195, 15, 211, 151, 8, 2, 1, 195, 15, 211, 151, 8, 6, 1, 195, 15, 196, - 152, 8, 2, 1, 195, 15, 196, 152, 8, 6, 1, 232, 52, 4, 211, 172, 106, 8, - 2, 1, 232, 52, 4, 211, 172, 106, 8, 6, 1, 222, 153, 4, 211, 172, 106, 8, - 2, 1, 222, 153, 4, 211, 172, 106, 8, 6, 1, 215, 62, 4, 211, 172, 106, 8, - 2, 1, 215, 62, 4, 211, 172, 106, 8, 6, 1, 207, 222, 4, 211, 172, 106, 8, - 2, 1, 207, 222, 4, 211, 172, 106, 8, 6, 1, 206, 9, 4, 211, 172, 106, 8, - 2, 1, 206, 9, 4, 211, 172, 106, 8, 6, 1, 230, 117, 4, 102, 8, 6, 1, 207, - 18, 211, 77, 71, 8, 6, 1, 27, 232, 51, 8, 6, 1, 220, 143, 4, 248, 231, 8, - 6, 1, 2, 6, 68, 8, 1, 2, 6, 208, 104, 8, 6, 1, 153, 222, 152, 8, 6, 1, - 153, 200, 43, 8, 6, 1, 223, 36, 4, 238, 212, 8, 6, 1, 243, 95, 8, 6, 1, - 248, 212, 8, 2, 1, 248, 212, 8, 6, 1, 211, 110, 8, 2, 1, 211, 110, 8, 6, - 1, 126, 4, 106, 8, 2, 1, 126, 4, 106, 8, 6, 1, 231, 11, 65, 8, 2, 1, 231, - 11, 65, 8, 6, 1, 231, 11, 68, 8, 2, 1, 231, 11, 68, 8, 6, 1, 231, 11, 66, - 8, 2, 1, 231, 11, 66, 8, 6, 1, 39, 209, 49, 74, 8, 2, 1, 39, 209, 49, 74, - 8, 6, 1, 251, 112, 193, 224, 8, 2, 1, 251, 112, 193, 224, 8, 6, 1, 247, - 194, 4, 210, 192, 102, 8, 6, 1, 206, 9, 4, 102, 8, 6, 1, 191, 167, 4, - 210, 192, 102, 8, 6, 1, 238, 128, 4, 203, 40, 201, 28, 210, 255, 8, 2, 1, - 238, 128, 4, 203, 40, 201, 28, 210, 255, 8, 6, 1, 206, 9, 4, 203, 40, - 201, 28, 210, 255, 8, 2, 1, 206, 9, 4, 203, 40, 201, 28, 210, 255, 8, 6, - 1, 242, 219, 223, 115, 232, 51, 8, 2, 1, 242, 219, 223, 115, 232, 51, 8, - 2, 1, 55, 198, 233, 8, 2, 1, 55, 192, 238, 8, 6, 1, 82, 205, 79, 206, 8, - 8, 2, 1, 82, 205, 79, 206, 8, 8, 6, 1, 202, 195, 206, 8, 8, 2, 1, 202, - 195, 206, 8, 52, 1, 6, 247, 193, 52, 1, 6, 233, 175, 52, 1, 6, 208, 104, - 8, 6, 1, 207, 18, 132, 230, 116, 8, 2, 1, 207, 18, 132, 230, 116, 8, 234, - 50, 1, 202, 206, 68, 52, 1, 6, 230, 117, 4, 106, 52, 1, 2, 34, 211, 151, - 8, 1, 2, 6, 153, 218, 168, 8, 234, 50, 1, 207, 18, 233, 175, 8, 234, 50, - 1, 207, 18, 210, 236, 8, 234, 50, 1, 223, 93, 218, 168, 8, 234, 50, 1, - 228, 74, 219, 10, 8, 234, 50, 1, 251, 14, 218, 168, 200, 124, 214, 238, - 1, 65, 200, 124, 214, 238, 1, 68, 200, 124, 214, 238, 3, 235, 54, 200, - 124, 214, 238, 1, 66, 200, 124, 214, 238, 1, 71, 200, 124, 214, 238, 1, - 74, 200, 124, 214, 238, 3, 230, 11, 200, 124, 214, 238, 1, 221, 67, 200, - 124, 214, 238, 1, 221, 183, 200, 124, 214, 238, 1, 231, 3, 200, 124, 214, - 238, 1, 231, 63, 200, 124, 214, 238, 3, 251, 71, 200, 124, 214, 238, 1, - 242, 99, 200, 124, 214, 238, 1, 243, 68, 200, 124, 214, 238, 1, 222, 201, - 200, 124, 214, 238, 1, 222, 246, 200, 124, 214, 238, 1, 197, 109, 200, - 124, 214, 238, 1, 197, 115, 200, 124, 214, 238, 1, 237, 161, 200, 124, - 214, 238, 1, 237, 170, 200, 124, 214, 238, 1, 159, 200, 124, 214, 238, 1, - 198, 241, 200, 124, 214, 238, 1, 236, 174, 200, 124, 214, 238, 1, 237, - 48, 200, 124, 214, 238, 1, 213, 43, 200, 124, 214, 238, 1, 209, 73, 200, - 124, 214, 238, 1, 209, 199, 200, 124, 214, 238, 1, 248, 111, 200, 124, - 214, 238, 1, 248, 192, 200, 124, 214, 238, 1, 216, 12, 200, 124, 214, - 238, 1, 206, 162, 200, 124, 214, 238, 1, 219, 43, 200, 124, 214, 238, 1, - 206, 95, 200, 124, 214, 238, 1, 202, 46, 200, 124, 214, 238, 1, 229, 23, - 200, 124, 214, 238, 18, 3, 65, 200, 124, 214, 238, 18, 3, 68, 200, 124, - 214, 238, 18, 3, 66, 200, 124, 214, 238, 18, 3, 71, 200, 124, 214, 238, - 18, 3, 211, 87, 200, 124, 214, 238, 209, 63, 217, 55, 200, 124, 214, 238, - 209, 63, 217, 54, 200, 124, 214, 238, 209, 63, 217, 53, 200, 124, 214, - 238, 209, 63, 217, 52, 200, 124, 214, 238, 3, 251, 157, 230, 11, 186, - 223, 146, 232, 118, 91, 208, 22, 186, 223, 146, 232, 118, 91, 230, 70, - 186, 223, 146, 232, 118, 115, 208, 20, 186, 223, 146, 232, 118, 91, 202, - 128, 186, 223, 146, 232, 118, 91, 234, 159, 186, 223, 146, 232, 118, 115, - 202, 125, 186, 223, 146, 208, 23, 77, 186, 223, 146, 209, 107, 77, 186, - 223, 146, 206, 36, 77, 186, 223, 146, 208, 25, 77, 209, 224, 1, 155, 209, - 224, 1, 221, 215, 209, 224, 1, 231, 240, 209, 224, 1, 214, 68, 209, 224, - 1, 247, 160, 209, 224, 1, 247, 1, 209, 224, 1, 223, 32, 209, 224, 1, 212, - 101, 209, 224, 1, 190, 190, 209, 224, 1, 199, 49, 209, 224, 1, 238, 32, - 209, 224, 1, 180, 209, 224, 1, 168, 209, 224, 1, 209, 228, 209, 224, 1, - 249, 153, 209, 224, 1, 174, 209, 224, 1, 197, 168, 209, 224, 1, 197, 157, - 209, 224, 1, 235, 35, 209, 224, 1, 193, 190, 209, 224, 1, 191, 71, 209, - 224, 1, 191, 123, 209, 224, 1, 2, 65, 209, 224, 1, 170, 209, 224, 1, 165, - 209, 224, 1, 173, 209, 224, 1, 203, 165, 209, 224, 1, 188, 209, 224, 1, - 140, 209, 224, 1, 65, 209, 224, 1, 68, 209, 224, 1, 66, 209, 224, 1, 71, - 209, 224, 1, 74, 209, 224, 1, 208, 96, 209, 224, 1, 192, 220, 209, 224, - 1, 233, 109, 209, 224, 1, 231, 127, 209, 224, 1, 234, 188, 209, 224, 200, - 239, 1, 193, 190, 209, 224, 200, 239, 1, 170, 209, 224, 1, 197, 132, 209, - 224, 1, 197, 120, 209, 224, 1, 237, 191, 209, 224, 1, 213, 79, 209, 224, - 1, 251, 157, 170, 209, 224, 1, 195, 19, 203, 165, 209, 224, 1, 195, 20, - 140, 209, 224, 1, 250, 200, 233, 109, 209, 224, 200, 239, 1, 165, 209, - 224, 200, 185, 1, 165, 209, 224, 1, 247, 119, 209, 224, 202, 170, 229, - 236, 77, 209, 224, 55, 229, 236, 77, 209, 224, 87, 203, 157, 209, 224, - 87, 55, 203, 157, 205, 111, 3, 251, 71, 205, 111, 3, 195, 35, 205, 111, - 1, 65, 205, 111, 1, 252, 206, 205, 111, 1, 68, 205, 111, 1, 223, 199, - 205, 111, 1, 66, 205, 111, 1, 196, 30, 205, 111, 1, 117, 146, 205, 111, - 1, 117, 206, 110, 205, 111, 1, 117, 172, 205, 111, 1, 117, 219, 74, 205, - 111, 1, 71, 205, 111, 1, 234, 188, 205, 111, 1, 251, 236, 205, 111, 1, - 74, 205, 111, 1, 211, 87, 205, 111, 1, 250, 163, 205, 111, 1, 155, 205, - 111, 1, 221, 215, 205, 111, 1, 231, 240, 205, 111, 1, 231, 91, 205, 111, - 1, 214, 68, 205, 111, 1, 247, 160, 205, 111, 1, 247, 1, 205, 111, 1, 223, - 32, 205, 111, 1, 222, 252, 205, 111, 1, 212, 101, 205, 111, 1, 197, 132, - 205, 111, 1, 197, 120, 205, 111, 1, 237, 191, 205, 111, 1, 237, 175, 205, - 111, 1, 213, 79, 205, 111, 1, 190, 190, 205, 111, 1, 199, 49, 205, 111, - 1, 238, 32, 205, 111, 1, 237, 68, 205, 111, 1, 180, 205, 111, 1, 168, - 205, 111, 1, 209, 228, 205, 111, 1, 249, 153, 205, 111, 1, 248, 203, 205, - 111, 1, 174, 205, 111, 1, 170, 205, 111, 1, 165, 205, 111, 1, 173, 205, - 111, 1, 195, 188, 205, 111, 1, 203, 165, 205, 111, 1, 201, 175, 205, 111, - 1, 188, 205, 111, 1, 140, 205, 111, 1, 219, 73, 205, 111, 120, 3, 230, - 89, 205, 111, 18, 3, 252, 206, 205, 111, 18, 3, 68, 205, 111, 18, 3, 223, - 199, 205, 111, 18, 3, 66, 205, 111, 18, 3, 196, 30, 205, 111, 18, 3, 117, - 146, 205, 111, 18, 3, 117, 206, 110, 205, 111, 18, 3, 117, 172, 205, 111, - 18, 3, 117, 219, 74, 205, 111, 18, 3, 71, 205, 111, 18, 3, 234, 188, 205, - 111, 18, 3, 251, 236, 205, 111, 18, 3, 74, 205, 111, 18, 3, 211, 87, 205, - 111, 18, 3, 250, 163, 205, 111, 3, 195, 40, 205, 111, 3, 247, 119, 205, - 111, 237, 238, 205, 111, 55, 237, 238, 205, 111, 17, 191, 77, 205, 111, - 17, 107, 205, 111, 17, 109, 205, 111, 17, 138, 205, 111, 17, 134, 205, - 111, 17, 149, 205, 111, 17, 169, 205, 111, 17, 175, 205, 111, 17, 171, - 205, 111, 17, 178, 33, 100, 17, 191, 77, 33, 100, 17, 107, 33, 100, 17, - 109, 33, 100, 17, 138, 33, 100, 17, 134, 33, 100, 17, 149, 33, 100, 17, + 201, 29, 198, 216, 237, 89, 8, 2, 1, 198, 234, 4, 201, 29, 198, 216, 237, + 89, 8, 6, 1, 195, 142, 8, 2, 1, 195, 142, 8, 6, 1, 234, 1, 8, 2, 1, 234, + 1, 8, 6, 1, 223, 70, 8, 2, 1, 223, 70, 8, 6, 1, 239, 59, 8, 2, 1, 239, + 59, 52, 1, 196, 45, 8, 2, 1, 235, 79, 8, 2, 1, 218, 210, 8, 2, 1, 215, + 125, 8, 2, 1, 212, 139, 8, 2, 1, 206, 49, 8, 1, 2, 6, 206, 49, 8, 2, 1, + 197, 76, 8, 2, 1, 196, 120, 8, 6, 1, 223, 117, 238, 129, 8, 2, 1, 223, + 117, 238, 129, 8, 6, 1, 223, 117, 233, 177, 8, 2, 1, 223, 117, 233, 177, + 8, 6, 1, 223, 117, 232, 53, 8, 6, 1, 154, 223, 117, 232, 53, 8, 2, 1, + 154, 223, 117, 232, 53, 8, 6, 1, 154, 172, 8, 2, 1, 154, 172, 8, 6, 1, + 223, 117, 146, 8, 2, 1, 223, 117, 146, 8, 6, 1, 223, 117, 206, 9, 8, 2, + 1, 223, 117, 206, 9, 8, 6, 1, 223, 117, 200, 43, 8, 2, 1, 223, 117, 200, + 43, 52, 1, 130, 243, 4, 252, 62, 52, 1, 242, 85, 52, 1, 203, 41, 234, 45, + 56, 8, 6, 1, 205, 157, 8, 2, 1, 205, 157, 8, 6, 1, 154, 230, 118, 8, 2, + 1, 220, 145, 4, 207, 25, 228, 253, 23, 248, 233, 8, 1, 202, 164, 236, + 142, 8, 6, 1, 215, 64, 4, 237, 89, 8, 2, 1, 215, 64, 4, 237, 89, 8, 6, 1, + 247, 196, 4, 164, 8, 2, 1, 247, 196, 4, 164, 8, 2, 1, 247, 196, 4, 210, + 194, 102, 8, 2, 1, 230, 119, 4, 210, 194, 102, 8, 6, 1, 78, 4, 232, 190, + 8, 2, 1, 78, 4, 232, 190, 8, 6, 1, 233, 178, 4, 106, 8, 2, 1, 233, 178, + 4, 106, 8, 6, 1, 195, 15, 252, 27, 8, 2, 1, 195, 15, 252, 27, 8, 6, 1, + 195, 15, 211, 153, 8, 2, 1, 195, 15, 211, 153, 8, 6, 1, 195, 15, 196, + 152, 8, 2, 1, 195, 15, 196, 152, 8, 6, 1, 232, 54, 4, 211, 174, 106, 8, + 2, 1, 232, 54, 4, 211, 174, 106, 8, 6, 1, 222, 155, 4, 211, 174, 106, 8, + 2, 1, 222, 155, 4, 211, 174, 106, 8, 6, 1, 215, 64, 4, 211, 174, 106, 8, + 2, 1, 215, 64, 4, 211, 174, 106, 8, 6, 1, 207, 224, 4, 211, 174, 106, 8, + 2, 1, 207, 224, 4, 211, 174, 106, 8, 6, 1, 206, 10, 4, 211, 174, 106, 8, + 2, 1, 206, 10, 4, 211, 174, 106, 8, 6, 1, 230, 119, 4, 102, 8, 6, 1, 207, + 19, 211, 79, 71, 8, 6, 1, 27, 232, 53, 8, 6, 1, 220, 145, 4, 248, 233, 8, + 6, 1, 2, 6, 68, 8, 1, 2, 6, 208, 106, 8, 6, 1, 154, 222, 154, 8, 6, 1, + 154, 200, 43, 8, 6, 1, 223, 38, 4, 238, 214, 8, 6, 1, 243, 97, 8, 6, 1, + 248, 214, 8, 2, 1, 248, 214, 8, 6, 1, 211, 112, 8, 2, 1, 211, 112, 8, 6, + 1, 126, 4, 106, 8, 2, 1, 126, 4, 106, 8, 6, 1, 231, 13, 65, 8, 2, 1, 231, + 13, 65, 8, 6, 1, 231, 13, 68, 8, 2, 1, 231, 13, 68, 8, 6, 1, 231, 13, 66, + 8, 2, 1, 231, 13, 66, 8, 6, 1, 39, 209, 51, 74, 8, 2, 1, 39, 209, 51, 74, + 8, 6, 1, 251, 114, 193, 224, 8, 2, 1, 251, 114, 193, 224, 8, 6, 1, 247, + 196, 4, 210, 194, 102, 8, 6, 1, 206, 10, 4, 102, 8, 6, 1, 191, 167, 4, + 210, 194, 102, 8, 6, 1, 238, 130, 4, 203, 41, 201, 29, 211, 1, 8, 2, 1, + 238, 130, 4, 203, 41, 201, 29, 211, 1, 8, 6, 1, 206, 10, 4, 203, 41, 201, + 29, 211, 1, 8, 2, 1, 206, 10, 4, 203, 41, 201, 29, 211, 1, 8, 6, 1, 242, + 221, 223, 117, 232, 53, 8, 2, 1, 242, 221, 223, 117, 232, 53, 8, 2, 1, + 55, 198, 233, 8, 2, 1, 55, 192, 238, 8, 6, 1, 82, 205, 80, 206, 9, 8, 2, + 1, 82, 205, 80, 206, 9, 8, 6, 1, 202, 196, 206, 9, 8, 2, 1, 202, 196, + 206, 9, 52, 1, 6, 247, 195, 52, 1, 6, 233, 177, 52, 1, 6, 208, 106, 8, 6, + 1, 207, 19, 132, 230, 118, 8, 2, 1, 207, 19, 132, 230, 118, 8, 234, 52, + 1, 202, 207, 68, 52, 1, 6, 230, 119, 4, 106, 52, 1, 2, 34, 211, 153, 8, + 1, 2, 6, 154, 218, 170, 8, 234, 52, 1, 207, 19, 233, 177, 8, 234, 52, 1, + 207, 19, 210, 238, 8, 234, 52, 1, 223, 95, 218, 170, 8, 234, 52, 1, 228, + 76, 219, 12, 8, 234, 52, 1, 251, 16, 218, 170, 200, 124, 214, 240, 1, 65, + 200, 124, 214, 240, 1, 68, 200, 124, 214, 240, 3, 235, 56, 200, 124, 214, + 240, 1, 66, 200, 124, 214, 240, 1, 71, 200, 124, 214, 240, 1, 74, 200, + 124, 214, 240, 3, 230, 13, 200, 124, 214, 240, 1, 221, 69, 200, 124, 214, + 240, 1, 221, 185, 200, 124, 214, 240, 1, 231, 5, 200, 124, 214, 240, 1, + 231, 65, 200, 124, 214, 240, 3, 251, 73, 200, 124, 214, 240, 1, 242, 101, + 200, 124, 214, 240, 1, 243, 70, 200, 124, 214, 240, 1, 222, 203, 200, + 124, 214, 240, 1, 222, 248, 200, 124, 214, 240, 1, 197, 109, 200, 124, + 214, 240, 1, 197, 115, 200, 124, 214, 240, 1, 237, 163, 200, 124, 214, + 240, 1, 237, 172, 200, 124, 214, 240, 1, 159, 200, 124, 214, 240, 1, 198, + 241, 200, 124, 214, 240, 1, 236, 176, 200, 124, 214, 240, 1, 237, 50, + 200, 124, 214, 240, 1, 213, 45, 200, 124, 214, 240, 1, 209, 75, 200, 124, + 214, 240, 1, 209, 201, 200, 124, 214, 240, 1, 248, 113, 200, 124, 214, + 240, 1, 248, 194, 200, 124, 214, 240, 1, 216, 14, 200, 124, 214, 240, 1, + 206, 163, 200, 124, 214, 240, 1, 219, 45, 200, 124, 214, 240, 1, 206, 96, + 200, 124, 214, 240, 1, 202, 47, 200, 124, 214, 240, 1, 229, 25, 200, 124, + 214, 240, 18, 3, 65, 200, 124, 214, 240, 18, 3, 68, 200, 124, 214, 240, + 18, 3, 66, 200, 124, 214, 240, 18, 3, 71, 200, 124, 214, 240, 18, 3, 211, + 89, 200, 124, 214, 240, 209, 65, 217, 57, 200, 124, 214, 240, 209, 65, + 217, 56, 200, 124, 214, 240, 209, 65, 217, 55, 200, 124, 214, 240, 209, + 65, 217, 54, 200, 124, 214, 240, 3, 251, 159, 230, 13, 186, 223, 148, + 232, 120, 91, 208, 24, 186, 223, 148, 232, 120, 91, 230, 72, 186, 223, + 148, 232, 120, 115, 208, 22, 186, 223, 148, 232, 120, 91, 202, 129, 186, + 223, 148, 232, 120, 91, 234, 161, 186, 223, 148, 232, 120, 115, 202, 126, + 186, 223, 148, 208, 25, 77, 186, 223, 148, 209, 109, 77, 186, 223, 148, + 206, 37, 77, 186, 223, 148, 208, 27, 77, 209, 226, 1, 155, 209, 226, 1, + 221, 217, 209, 226, 1, 231, 242, 209, 226, 1, 214, 70, 209, 226, 1, 247, + 162, 209, 226, 1, 247, 3, 209, 226, 1, 223, 34, 209, 226, 1, 212, 103, + 209, 226, 1, 190, 190, 209, 226, 1, 199, 49, 209, 226, 1, 238, 34, 209, + 226, 1, 181, 209, 226, 1, 168, 209, 226, 1, 209, 230, 209, 226, 1, 249, + 155, 209, 226, 1, 174, 209, 226, 1, 197, 168, 209, 226, 1, 197, 157, 209, + 226, 1, 235, 37, 209, 226, 1, 193, 190, 209, 226, 1, 191, 71, 209, 226, + 1, 191, 123, 209, 226, 1, 2, 65, 209, 226, 1, 170, 209, 226, 1, 165, 209, + 226, 1, 173, 209, 226, 1, 203, 166, 209, 226, 1, 188, 209, 226, 1, 140, + 209, 226, 1, 65, 209, 226, 1, 68, 209, 226, 1, 66, 209, 226, 1, 71, 209, + 226, 1, 74, 209, 226, 1, 208, 98, 209, 226, 1, 192, 220, 209, 226, 1, + 233, 111, 209, 226, 1, 231, 129, 209, 226, 1, 234, 190, 209, 226, 200, + 240, 1, 193, 190, 209, 226, 200, 240, 1, 170, 209, 226, 1, 197, 132, 209, + 226, 1, 197, 120, 209, 226, 1, 237, 193, 209, 226, 1, 213, 81, 209, 226, + 1, 251, 159, 170, 209, 226, 1, 195, 19, 203, 166, 209, 226, 1, 195, 20, + 140, 209, 226, 1, 250, 202, 233, 111, 209, 226, 200, 240, 1, 165, 209, + 226, 200, 185, 1, 165, 209, 226, 1, 247, 121, 209, 226, 202, 171, 229, + 238, 77, 209, 226, 55, 229, 238, 77, 209, 226, 87, 203, 158, 209, 226, + 87, 55, 203, 158, 205, 112, 3, 251, 73, 205, 112, 3, 195, 35, 205, 112, + 1, 65, 205, 112, 1, 252, 208, 205, 112, 1, 68, 205, 112, 1, 223, 201, + 205, 112, 1, 66, 205, 112, 1, 196, 30, 205, 112, 1, 117, 146, 205, 112, + 1, 117, 206, 111, 205, 112, 1, 117, 172, 205, 112, 1, 117, 219, 76, 205, + 112, 1, 71, 205, 112, 1, 234, 190, 205, 112, 1, 251, 238, 205, 112, 1, + 74, 205, 112, 1, 211, 89, 205, 112, 1, 250, 165, 205, 112, 1, 155, 205, + 112, 1, 221, 217, 205, 112, 1, 231, 242, 205, 112, 1, 231, 93, 205, 112, + 1, 214, 70, 205, 112, 1, 247, 162, 205, 112, 1, 247, 3, 205, 112, 1, 223, + 34, 205, 112, 1, 222, 254, 205, 112, 1, 212, 103, 205, 112, 1, 197, 132, + 205, 112, 1, 197, 120, 205, 112, 1, 237, 193, 205, 112, 1, 237, 177, 205, + 112, 1, 213, 81, 205, 112, 1, 190, 190, 205, 112, 1, 199, 49, 205, 112, + 1, 238, 34, 205, 112, 1, 237, 70, 205, 112, 1, 181, 205, 112, 1, 168, + 205, 112, 1, 209, 230, 205, 112, 1, 249, 155, 205, 112, 1, 248, 205, 205, + 112, 1, 174, 205, 112, 1, 170, 205, 112, 1, 165, 205, 112, 1, 173, 205, + 112, 1, 195, 188, 205, 112, 1, 203, 166, 205, 112, 1, 201, 176, 205, 112, + 1, 188, 205, 112, 1, 140, 205, 112, 1, 219, 75, 205, 112, 120, 3, 230, + 91, 205, 112, 18, 3, 252, 208, 205, 112, 18, 3, 68, 205, 112, 18, 3, 223, + 201, 205, 112, 18, 3, 66, 205, 112, 18, 3, 196, 30, 205, 112, 18, 3, 117, + 146, 205, 112, 18, 3, 117, 206, 111, 205, 112, 18, 3, 117, 172, 205, 112, + 18, 3, 117, 219, 76, 205, 112, 18, 3, 71, 205, 112, 18, 3, 234, 190, 205, + 112, 18, 3, 251, 238, 205, 112, 18, 3, 74, 205, 112, 18, 3, 211, 89, 205, + 112, 18, 3, 250, 165, 205, 112, 3, 195, 40, 205, 112, 3, 247, 121, 205, + 112, 237, 240, 205, 112, 55, 237, 240, 205, 112, 17, 191, 77, 205, 112, + 17, 107, 205, 112, 17, 109, 205, 112, 17, 138, 205, 112, 17, 134, 205, + 112, 17, 150, 205, 112, 17, 169, 205, 112, 17, 175, 205, 112, 17, 171, + 205, 112, 17, 178, 33, 100, 17, 191, 77, 33, 100, 17, 107, 33, 100, 17, + 109, 33, 100, 17, 138, 33, 100, 17, 134, 33, 100, 17, 150, 33, 100, 17, 169, 33, 100, 17, 175, 33, 100, 17, 171, 33, 100, 17, 178, 33, 100, 1, - 65, 33, 100, 1, 66, 33, 100, 1, 155, 33, 100, 1, 180, 33, 100, 1, 168, - 33, 100, 1, 165, 33, 100, 1, 195, 69, 33, 100, 3, 250, 145, 100, 3, 201, - 246, 247, 119, 100, 3, 247, 120, 195, 40, 100, 3, 55, 247, 120, 195, 40, - 100, 3, 247, 120, 109, 100, 3, 247, 120, 138, 100, 3, 247, 120, 250, 145, - 100, 3, 208, 134, 100, 231, 204, 233, 3, 100, 247, 96, 100, 229, 227, - 100, 3, 202, 210, 100, 223, 24, 211, 113, 100, 1, 250, 131, 100, 18, 3, - 250, 131, 222, 28, 219, 147, 17, 191, 77, 222, 28, 219, 147, 17, 107, - 222, 28, 219, 147, 17, 109, 222, 28, 219, 147, 17, 138, 222, 28, 219, - 147, 17, 134, 222, 28, 219, 147, 17, 149, 222, 28, 219, 147, 17, 169, - 222, 28, 219, 147, 17, 175, 222, 28, 219, 147, 17, 171, 222, 28, 219, - 147, 17, 178, 222, 28, 219, 147, 1, 155, 222, 28, 219, 147, 1, 221, 215, - 222, 28, 219, 147, 1, 231, 240, 222, 28, 219, 147, 1, 214, 68, 222, 28, - 219, 147, 1, 188, 222, 28, 219, 147, 1, 203, 165, 222, 28, 219, 147, 1, - 191, 123, 222, 28, 219, 147, 1, 212, 101, 222, 28, 219, 147, 1, 190, 190, - 222, 28, 219, 147, 1, 228, 164, 222, 28, 219, 147, 1, 180, 222, 28, 219, - 147, 1, 168, 222, 28, 219, 147, 1, 209, 228, 222, 28, 219, 147, 1, 174, - 222, 28, 219, 147, 1, 238, 32, 222, 28, 219, 147, 1, 249, 153, 222, 28, - 219, 147, 1, 165, 222, 28, 219, 147, 1, 170, 222, 28, 219, 147, 1, 173, - 222, 28, 219, 147, 1, 193, 190, 222, 28, 219, 147, 1, 199, 49, 222, 28, - 219, 147, 1, 140, 222, 28, 219, 147, 1, 195, 188, 222, 28, 219, 147, 1, - 247, 160, 222, 28, 219, 147, 1, 65, 222, 28, 219, 147, 1, 211, 151, 222, - 28, 219, 147, 1, 68, 222, 28, 219, 147, 1, 211, 87, 222, 28, 219, 147, - 18, 196, 152, 222, 28, 219, 147, 18, 71, 222, 28, 219, 147, 18, 66, 222, - 28, 219, 147, 18, 234, 188, 222, 28, 219, 147, 18, 74, 222, 28, 219, 147, - 163, 209, 90, 222, 28, 219, 147, 163, 247, 135, 222, 28, 219, 147, 163, - 247, 136, 209, 90, 222, 28, 219, 147, 3, 238, 147, 222, 28, 219, 147, 3, - 202, 230, 207, 67, 1, 155, 207, 67, 1, 231, 240, 207, 67, 1, 214, 68, - 207, 67, 1, 190, 190, 207, 67, 1, 238, 32, 207, 67, 1, 180, 207, 67, 1, - 168, 207, 67, 1, 249, 153, 207, 67, 1, 174, 207, 67, 1, 247, 160, 207, - 67, 1, 223, 32, 207, 67, 1, 212, 101, 207, 67, 1, 188, 207, 67, 1, 165, - 207, 67, 1, 173, 207, 67, 1, 170, 207, 67, 1, 193, 190, 207, 67, 1, 140, - 207, 67, 1, 217, 11, 207, 67, 1, 214, 47, 207, 67, 1, 214, 162, 207, 67, - 1, 212, 66, 207, 67, 1, 65, 207, 67, 18, 3, 68, 207, 67, 18, 3, 66, 207, - 67, 18, 3, 71, 207, 67, 18, 3, 251, 236, 207, 67, 18, 3, 74, 207, 67, 18, - 3, 250, 163, 207, 67, 18, 3, 233, 242, 207, 67, 18, 3, 234, 217, 207, 67, - 120, 3, 214, 70, 207, 67, 120, 3, 215, 61, 207, 67, 120, 3, 146, 207, 67, - 120, 3, 230, 116, 207, 67, 195, 40, 207, 67, 205, 54, 77, 30, 147, 198, + 65, 33, 100, 1, 66, 33, 100, 1, 155, 33, 100, 1, 181, 33, 100, 1, 168, + 33, 100, 1, 165, 33, 100, 1, 195, 69, 33, 100, 3, 250, 147, 100, 3, 201, + 247, 247, 121, 100, 3, 247, 122, 195, 40, 100, 3, 55, 247, 122, 195, 40, + 100, 3, 247, 122, 109, 100, 3, 247, 122, 138, 100, 3, 247, 122, 250, 147, + 100, 3, 208, 136, 100, 231, 206, 233, 5, 100, 247, 98, 100, 229, 229, + 100, 3, 202, 211, 100, 223, 26, 211, 115, 100, 1, 250, 133, 100, 18, 3, + 250, 133, 222, 30, 219, 149, 17, 191, 77, 222, 30, 219, 149, 17, 107, + 222, 30, 219, 149, 17, 109, 222, 30, 219, 149, 17, 138, 222, 30, 219, + 149, 17, 134, 222, 30, 219, 149, 17, 150, 222, 30, 219, 149, 17, 169, + 222, 30, 219, 149, 17, 175, 222, 30, 219, 149, 17, 171, 222, 30, 219, + 149, 17, 178, 222, 30, 219, 149, 1, 155, 222, 30, 219, 149, 1, 221, 217, + 222, 30, 219, 149, 1, 231, 242, 222, 30, 219, 149, 1, 214, 70, 222, 30, + 219, 149, 1, 188, 222, 30, 219, 149, 1, 203, 166, 222, 30, 219, 149, 1, + 191, 123, 222, 30, 219, 149, 1, 212, 103, 222, 30, 219, 149, 1, 190, 190, + 222, 30, 219, 149, 1, 228, 166, 222, 30, 219, 149, 1, 181, 222, 30, 219, + 149, 1, 168, 222, 30, 219, 149, 1, 209, 230, 222, 30, 219, 149, 1, 174, + 222, 30, 219, 149, 1, 238, 34, 222, 30, 219, 149, 1, 249, 155, 222, 30, + 219, 149, 1, 165, 222, 30, 219, 149, 1, 170, 222, 30, 219, 149, 1, 173, + 222, 30, 219, 149, 1, 193, 190, 222, 30, 219, 149, 1, 199, 49, 222, 30, + 219, 149, 1, 140, 222, 30, 219, 149, 1, 195, 188, 222, 30, 219, 149, 1, + 247, 162, 222, 30, 219, 149, 1, 65, 222, 30, 219, 149, 1, 211, 153, 222, + 30, 219, 149, 1, 68, 222, 30, 219, 149, 1, 211, 89, 222, 30, 219, 149, + 18, 196, 152, 222, 30, 219, 149, 18, 71, 222, 30, 219, 149, 18, 66, 222, + 30, 219, 149, 18, 234, 190, 222, 30, 219, 149, 18, 74, 222, 30, 219, 149, + 163, 209, 92, 222, 30, 219, 149, 163, 247, 137, 222, 30, 219, 149, 163, + 247, 138, 209, 92, 222, 30, 219, 149, 3, 238, 149, 222, 30, 219, 149, 3, + 202, 231, 207, 68, 1, 155, 207, 68, 1, 231, 242, 207, 68, 1, 214, 70, + 207, 68, 1, 190, 190, 207, 68, 1, 238, 34, 207, 68, 1, 181, 207, 68, 1, + 168, 207, 68, 1, 249, 155, 207, 68, 1, 174, 207, 68, 1, 247, 162, 207, + 68, 1, 223, 34, 207, 68, 1, 212, 103, 207, 68, 1, 188, 207, 68, 1, 165, + 207, 68, 1, 173, 207, 68, 1, 170, 207, 68, 1, 193, 190, 207, 68, 1, 140, + 207, 68, 1, 217, 13, 207, 68, 1, 214, 49, 207, 68, 1, 214, 164, 207, 68, + 1, 212, 68, 207, 68, 1, 65, 207, 68, 18, 3, 68, 207, 68, 18, 3, 66, 207, + 68, 18, 3, 71, 207, 68, 18, 3, 251, 238, 207, 68, 18, 3, 74, 207, 68, 18, + 3, 250, 165, 207, 68, 18, 3, 233, 244, 207, 68, 18, 3, 234, 219, 207, 68, + 120, 3, 214, 72, 207, 68, 120, 3, 215, 63, 207, 68, 120, 3, 146, 207, 68, + 120, 3, 230, 118, 207, 68, 195, 40, 207, 68, 205, 55, 77, 30, 147, 198, 164, 30, 147, 198, 163, 30, 147, 198, 161, 30, 147, 198, 166, 30, 147, - 206, 234, 30, 147, 206, 218, 30, 147, 206, 213, 30, 147, 206, 215, 30, - 147, 206, 231, 30, 147, 206, 224, 30, 147, 206, 217, 30, 147, 206, 236, - 30, 147, 206, 219, 30, 147, 206, 238, 30, 147, 206, 235, 30, 147, 216, - 73, 30, 147, 216, 64, 30, 147, 216, 67, 30, 147, 209, 154, 30, 147, 209, - 165, 30, 147, 209, 166, 30, 147, 201, 159, 30, 147, 223, 212, 30, 147, - 223, 219, 30, 147, 201, 170, 30, 147, 201, 157, 30, 147, 209, 208, 30, - 147, 229, 137, 30, 147, 201, 154, 223, 16, 3, 210, 143, 223, 16, 3, 247, - 39, 223, 16, 3, 219, 246, 223, 16, 3, 193, 71, 223, 16, 1, 65, 223, 16, - 1, 228, 74, 222, 32, 223, 16, 1, 68, 223, 16, 1, 223, 199, 223, 16, 1, - 66, 223, 16, 1, 210, 221, 247, 9, 223, 16, 1, 214, 69, 219, 203, 223, 16, - 1, 214, 69, 219, 204, 207, 131, 223, 16, 1, 71, 223, 16, 1, 251, 236, - 223, 16, 1, 74, 223, 16, 1, 155, 223, 16, 1, 222, 142, 205, 124, 223, 16, - 1, 222, 142, 215, 107, 223, 16, 1, 231, 240, 223, 16, 1, 231, 241, 215, - 107, 223, 16, 1, 214, 68, 223, 16, 1, 247, 160, 223, 16, 1, 247, 161, - 215, 107, 223, 16, 1, 223, 32, 223, 16, 1, 212, 102, 215, 107, 223, 16, - 1, 223, 33, 217, 116, 223, 16, 1, 212, 101, 223, 16, 1, 197, 132, 223, - 16, 1, 197, 133, 217, 116, 223, 16, 1, 237, 191, 223, 16, 1, 237, 192, - 217, 116, 223, 16, 1, 215, 7, 215, 107, 223, 16, 1, 190, 190, 223, 16, 1, - 199, 252, 215, 107, 223, 16, 1, 238, 32, 223, 16, 1, 238, 33, 217, 116, - 223, 16, 1, 180, 223, 16, 1, 168, 223, 16, 1, 210, 221, 215, 107, 223, - 16, 1, 249, 153, 223, 16, 1, 249, 154, 215, 107, 223, 16, 1, 174, 223, - 16, 1, 170, 223, 16, 1, 165, 223, 16, 1, 207, 186, 251, 246, 223, 16, 1, - 173, 223, 16, 1, 193, 190, 223, 16, 1, 205, 207, 215, 107, 223, 16, 1, - 205, 207, 217, 116, 223, 16, 1, 188, 223, 16, 1, 140, 223, 16, 3, 247, - 40, 199, 100, 223, 16, 18, 3, 199, 175, 223, 16, 18, 3, 198, 84, 223, 16, - 18, 3, 192, 250, 223, 16, 18, 3, 192, 251, 216, 198, 223, 16, 18, 3, 200, - 208, 223, 16, 18, 3, 200, 209, 216, 185, 223, 16, 18, 3, 199, 201, 223, - 16, 18, 3, 236, 230, 215, 106, 223, 16, 18, 3, 210, 16, 223, 16, 120, 3, - 221, 244, 223, 16, 120, 3, 210, 31, 223, 16, 120, 3, 247, 145, 223, 16, - 210, 157, 223, 16, 45, 207, 40, 223, 16, 50, 207, 40, 223, 16, 210, 209, - 251, 124, 223, 16, 210, 209, 217, 137, 223, 16, 210, 209, 218, 212, 223, - 16, 210, 209, 193, 64, 223, 16, 210, 209, 210, 158, 223, 16, 210, 209, - 219, 104, 223, 16, 210, 209, 218, 204, 223, 16, 210, 209, 252, 36, 223, - 16, 210, 209, 252, 37, 252, 36, 223, 16, 210, 209, 209, 119, 223, 16, - 153, 210, 209, 209, 119, 223, 16, 210, 153, 223, 16, 17, 191, 77, 223, - 16, 17, 107, 223, 16, 17, 109, 223, 16, 17, 138, 223, 16, 17, 134, 223, - 16, 17, 149, 223, 16, 17, 169, 223, 16, 17, 175, 223, 16, 17, 171, 223, - 16, 17, 178, 223, 16, 210, 209, 198, 127, 197, 73, 223, 16, 210, 209, - 223, 64, 80, 1, 203, 139, 231, 91, 80, 1, 203, 139, 247, 1, 80, 1, 203, - 139, 222, 252, 80, 1, 203, 139, 213, 79, 80, 1, 203, 139, 248, 203, 80, - 3, 203, 139, 205, 108, 80, 52, 1, 203, 139, 207, 85, 80, 1, 54, 220, 95, - 212, 101, 80, 1, 54, 220, 95, 233, 109, 80, 1, 54, 220, 95, 231, 240, 80, - 1, 54, 220, 95, 231, 91, 80, 1, 54, 220, 95, 223, 32, 80, 1, 54, 220, 95, - 222, 252, 80, 1, 54, 220, 95, 237, 191, 80, 1, 54, 220, 95, 237, 175, 80, - 1, 54, 220, 95, 213, 79, 80, 54, 220, 95, 17, 191, 77, 80, 54, 220, 95, - 17, 107, 80, 54, 220, 95, 17, 109, 80, 54, 220, 95, 17, 138, 80, 54, 220, - 95, 17, 134, 80, 54, 220, 95, 17, 149, 80, 54, 220, 95, 17, 169, 80, 54, - 220, 95, 17, 175, 80, 54, 220, 95, 17, 171, 80, 54, 220, 95, 17, 178, 80, - 1, 54, 220, 95, 219, 73, 80, 1, 54, 220, 95, 238, 32, 80, 1, 54, 220, 95, - 237, 68, 80, 1, 54, 220, 95, 249, 153, 80, 1, 54, 220, 95, 248, 203, 246, - 250, 1, 65, 246, 250, 1, 68, 246, 250, 1, 66, 246, 250, 1, 71, 246, 250, - 1, 251, 236, 246, 250, 1, 74, 246, 250, 1, 155, 246, 250, 1, 221, 215, - 246, 250, 1, 231, 240, 246, 250, 1, 231, 91, 246, 250, 1, 213, 233, 246, - 250, 1, 214, 68, 246, 250, 1, 247, 1, 246, 250, 1, 243, 98, 246, 250, 1, - 223, 32, 246, 250, 1, 222, 252, 246, 250, 1, 213, 221, 246, 250, 1, 213, - 224, 246, 250, 1, 213, 222, 246, 250, 1, 190, 190, 246, 250, 1, 199, 49, - 246, 250, 1, 238, 32, 246, 250, 1, 237, 68, 246, 250, 1, 212, 144, 246, - 250, 1, 180, 246, 250, 1, 237, 191, 246, 250, 1, 168, 246, 250, 1, 208, - 250, 246, 250, 1, 209, 228, 246, 250, 1, 249, 153, 246, 250, 1, 248, 203, - 246, 250, 1, 215, 143, 246, 250, 1, 174, 246, 250, 1, 249, 53, 246, 250, - 1, 170, 246, 250, 1, 165, 246, 250, 1, 173, 246, 250, 1, 195, 188, 246, - 250, 1, 201, 175, 246, 250, 1, 188, 246, 250, 1, 140, 246, 250, 18, 3, - 252, 206, 246, 250, 18, 3, 68, 246, 250, 18, 3, 223, 199, 246, 250, 18, - 3, 234, 166, 246, 250, 18, 3, 66, 246, 250, 18, 3, 211, 151, 246, 250, - 18, 3, 74, 246, 250, 18, 3, 251, 236, 246, 250, 18, 3, 250, 163, 246, - 250, 18, 3, 196, 152, 246, 250, 120, 3, 170, 246, 250, 120, 3, 165, 246, - 250, 120, 3, 173, 246, 250, 120, 3, 193, 190, 246, 250, 1, 53, 222, 152, - 246, 250, 1, 53, 232, 51, 246, 250, 1, 53, 214, 70, 246, 250, 120, 3, 53, - 214, 70, 246, 250, 1, 53, 247, 3, 246, 250, 1, 53, 200, 43, 246, 250, 1, - 53, 215, 61, 246, 250, 1, 53, 210, 236, 246, 250, 1, 53, 192, 159, 246, - 250, 1, 53, 146, 246, 250, 1, 53, 172, 246, 250, 1, 53, 201, 178, 246, - 250, 120, 3, 53, 218, 168, 246, 250, 120, 3, 53, 230, 116, 246, 250, 17, - 191, 77, 246, 250, 17, 107, 246, 250, 17, 109, 246, 250, 17, 138, 246, - 250, 17, 134, 246, 250, 17, 149, 246, 250, 17, 169, 246, 250, 17, 175, - 246, 250, 17, 171, 246, 250, 17, 178, 246, 250, 208, 152, 201, 217, 246, - 250, 208, 152, 237, 238, 246, 250, 208, 152, 55, 237, 238, 246, 250, 208, - 152, 197, 225, 237, 238, 80, 1, 221, 206, 231, 240, 80, 1, 221, 206, 247, - 160, 80, 1, 221, 206, 247, 1, 80, 1, 221, 206, 223, 32, 80, 1, 221, 206, - 222, 252, 80, 1, 221, 206, 212, 101, 80, 1, 221, 206, 197, 132, 80, 1, - 221, 206, 197, 120, 80, 1, 221, 206, 237, 191, 80, 1, 221, 206, 237, 175, - 80, 1, 221, 206, 237, 68, 80, 1, 221, 206, 180, 80, 1, 221, 206, 188, 80, - 1, 221, 206, 140, 80, 1, 221, 206, 229, 177, 80, 1, 221, 206, 233, 109, - 80, 52, 1, 221, 206, 207, 85, 80, 1, 221, 206, 192, 220, 80, 1, 221, 206, - 191, 123, 80, 1, 221, 206, 165, 80, 219, 28, 221, 206, 211, 179, 80, 219, - 28, 221, 206, 208, 46, 80, 219, 28, 221, 206, 229, 78, 80, 16, 251, 222, - 233, 215, 80, 16, 251, 222, 107, 80, 16, 251, 222, 109, 80, 1, 251, 222, - 165, 80, 3, 210, 139, 222, 62, 198, 79, 80, 3, 54, 220, 95, 198, 77, 80, - 3, 54, 220, 95, 198, 74, 80, 1, 202, 238, 210, 189, 247, 1, 80, 1, 202, - 238, 210, 189, 203, 165, 54, 195, 59, 1, 130, 221, 67, 54, 195, 59, 1, - 137, 221, 67, 54, 195, 59, 1, 130, 221, 183, 54, 195, 59, 1, 137, 221, - 183, 54, 195, 59, 1, 130, 221, 192, 54, 195, 59, 1, 137, 221, 192, 54, - 195, 59, 1, 130, 231, 3, 54, 195, 59, 1, 137, 231, 3, 54, 195, 59, 1, - 130, 213, 249, 54, 195, 59, 1, 137, 213, 249, 54, 195, 59, 1, 130, 242, - 99, 54, 195, 59, 1, 137, 242, 99, 54, 195, 59, 1, 130, 243, 68, 54, 195, - 59, 1, 137, 243, 68, 54, 195, 59, 1, 130, 202, 46, 54, 195, 59, 1, 137, - 202, 46, 54, 195, 59, 1, 130, 212, 65, 54, 195, 59, 1, 137, 212, 65, 54, - 195, 59, 1, 130, 236, 174, 54, 195, 59, 1, 137, 236, 174, 54, 195, 59, 1, - 130, 159, 54, 195, 59, 1, 137, 159, 54, 195, 59, 1, 130, 198, 241, 54, - 195, 59, 1, 137, 198, 241, 54, 195, 59, 1, 130, 213, 43, 54, 195, 59, 1, - 137, 213, 43, 54, 195, 59, 1, 130, 248, 111, 54, 195, 59, 1, 137, 248, - 111, 54, 195, 59, 1, 130, 209, 73, 54, 195, 59, 1, 137, 209, 73, 54, 195, - 59, 1, 130, 209, 199, 54, 195, 59, 1, 137, 209, 199, 54, 195, 59, 1, 130, - 232, 175, 54, 195, 59, 1, 137, 232, 175, 54, 195, 59, 1, 130, 216, 12, - 54, 195, 59, 1, 137, 216, 12, 54, 195, 59, 1, 130, 192, 12, 54, 195, 59, - 1, 137, 192, 12, 54, 195, 59, 1, 130, 206, 162, 54, 195, 59, 1, 137, 206, - 162, 54, 195, 59, 1, 130, 219, 43, 54, 195, 59, 1, 137, 219, 43, 54, 195, + 206, 235, 30, 147, 206, 219, 30, 147, 206, 214, 30, 147, 206, 216, 30, + 147, 206, 232, 30, 147, 206, 225, 30, 147, 206, 218, 30, 147, 206, 237, + 30, 147, 206, 220, 30, 147, 206, 239, 30, 147, 206, 236, 30, 147, 216, + 75, 30, 147, 216, 66, 30, 147, 216, 69, 30, 147, 209, 156, 30, 147, 209, + 167, 30, 147, 209, 168, 30, 147, 201, 160, 30, 147, 223, 214, 30, 147, + 223, 221, 30, 147, 201, 171, 30, 147, 201, 158, 30, 147, 209, 210, 30, + 147, 229, 139, 30, 147, 201, 155, 223, 18, 3, 210, 145, 223, 18, 3, 247, + 41, 223, 18, 3, 219, 248, 223, 18, 3, 193, 71, 223, 18, 1, 65, 223, 18, + 1, 228, 76, 222, 34, 223, 18, 1, 68, 223, 18, 1, 223, 201, 223, 18, 1, + 66, 223, 18, 1, 210, 223, 247, 11, 223, 18, 1, 214, 71, 219, 205, 223, + 18, 1, 214, 71, 219, 206, 207, 133, 223, 18, 1, 71, 223, 18, 1, 251, 238, + 223, 18, 1, 74, 223, 18, 1, 155, 223, 18, 1, 222, 144, 205, 125, 223, 18, + 1, 222, 144, 215, 109, 223, 18, 1, 231, 242, 223, 18, 1, 231, 243, 215, + 109, 223, 18, 1, 214, 70, 223, 18, 1, 247, 162, 223, 18, 1, 247, 163, + 215, 109, 223, 18, 1, 223, 34, 223, 18, 1, 212, 104, 215, 109, 223, 18, + 1, 223, 35, 217, 118, 223, 18, 1, 212, 103, 223, 18, 1, 197, 132, 223, + 18, 1, 197, 133, 217, 118, 223, 18, 1, 237, 193, 223, 18, 1, 237, 194, + 217, 118, 223, 18, 1, 215, 9, 215, 109, 223, 18, 1, 190, 190, 223, 18, 1, + 199, 252, 215, 109, 223, 18, 1, 238, 34, 223, 18, 1, 238, 35, 217, 118, + 223, 18, 1, 181, 223, 18, 1, 168, 223, 18, 1, 210, 223, 215, 109, 223, + 18, 1, 249, 155, 223, 18, 1, 249, 156, 215, 109, 223, 18, 1, 174, 223, + 18, 1, 170, 223, 18, 1, 165, 223, 18, 1, 207, 188, 251, 248, 223, 18, 1, + 173, 223, 18, 1, 193, 190, 223, 18, 1, 205, 208, 215, 109, 223, 18, 1, + 205, 208, 217, 118, 223, 18, 1, 188, 223, 18, 1, 140, 223, 18, 3, 247, + 42, 199, 100, 223, 18, 18, 3, 199, 175, 223, 18, 18, 3, 198, 84, 223, 18, + 18, 3, 192, 250, 223, 18, 18, 3, 192, 251, 216, 200, 223, 18, 18, 3, 200, + 208, 223, 18, 18, 3, 200, 209, 216, 187, 223, 18, 18, 3, 199, 201, 223, + 18, 18, 3, 236, 232, 215, 108, 223, 18, 18, 3, 210, 18, 223, 18, 120, 3, + 221, 246, 223, 18, 120, 3, 210, 33, 223, 18, 120, 3, 247, 147, 223, 18, + 210, 159, 223, 18, 45, 207, 41, 223, 18, 50, 207, 41, 223, 18, 210, 211, + 251, 126, 223, 18, 210, 211, 217, 139, 223, 18, 210, 211, 218, 214, 223, + 18, 210, 211, 193, 64, 223, 18, 210, 211, 210, 160, 223, 18, 210, 211, + 219, 106, 223, 18, 210, 211, 218, 206, 223, 18, 210, 211, 252, 38, 223, + 18, 210, 211, 252, 39, 252, 38, 223, 18, 210, 211, 209, 121, 223, 18, + 154, 210, 211, 209, 121, 223, 18, 210, 155, 223, 18, 17, 191, 77, 223, + 18, 17, 107, 223, 18, 17, 109, 223, 18, 17, 138, 223, 18, 17, 134, 223, + 18, 17, 150, 223, 18, 17, 169, 223, 18, 17, 175, 223, 18, 17, 171, 223, + 18, 17, 178, 223, 18, 210, 211, 198, 127, 197, 73, 223, 18, 210, 211, + 223, 66, 80, 1, 203, 140, 231, 93, 80, 1, 203, 140, 247, 3, 80, 1, 203, + 140, 222, 254, 80, 1, 203, 140, 213, 81, 80, 1, 203, 140, 248, 205, 80, + 3, 203, 140, 205, 109, 80, 52, 1, 203, 140, 207, 87, 80, 1, 54, 220, 97, + 212, 103, 80, 1, 54, 220, 97, 233, 111, 80, 1, 54, 220, 97, 231, 242, 80, + 1, 54, 220, 97, 231, 93, 80, 1, 54, 220, 97, 223, 34, 80, 1, 54, 220, 97, + 222, 254, 80, 1, 54, 220, 97, 237, 193, 80, 1, 54, 220, 97, 237, 177, 80, + 1, 54, 220, 97, 213, 81, 80, 54, 220, 97, 17, 191, 77, 80, 54, 220, 97, + 17, 107, 80, 54, 220, 97, 17, 109, 80, 54, 220, 97, 17, 138, 80, 54, 220, + 97, 17, 134, 80, 54, 220, 97, 17, 150, 80, 54, 220, 97, 17, 169, 80, 54, + 220, 97, 17, 175, 80, 54, 220, 97, 17, 171, 80, 54, 220, 97, 17, 178, 80, + 1, 54, 220, 97, 219, 75, 80, 1, 54, 220, 97, 238, 34, 80, 1, 54, 220, 97, + 237, 70, 80, 1, 54, 220, 97, 249, 155, 80, 1, 54, 220, 97, 248, 205, 246, + 252, 1, 65, 246, 252, 1, 68, 246, 252, 1, 66, 246, 252, 1, 71, 246, 252, + 1, 251, 238, 246, 252, 1, 74, 246, 252, 1, 155, 246, 252, 1, 221, 217, + 246, 252, 1, 231, 242, 246, 252, 1, 231, 93, 246, 252, 1, 213, 235, 246, + 252, 1, 214, 70, 246, 252, 1, 247, 3, 246, 252, 1, 243, 100, 246, 252, 1, + 223, 34, 246, 252, 1, 222, 254, 246, 252, 1, 213, 223, 246, 252, 1, 213, + 226, 246, 252, 1, 213, 224, 246, 252, 1, 190, 190, 246, 252, 1, 199, 49, + 246, 252, 1, 238, 34, 246, 252, 1, 237, 70, 246, 252, 1, 212, 146, 246, + 252, 1, 181, 246, 252, 1, 237, 193, 246, 252, 1, 168, 246, 252, 1, 208, + 252, 246, 252, 1, 209, 230, 246, 252, 1, 249, 155, 246, 252, 1, 248, 205, + 246, 252, 1, 215, 145, 246, 252, 1, 174, 246, 252, 1, 249, 55, 246, 252, + 1, 170, 246, 252, 1, 165, 246, 252, 1, 173, 246, 252, 1, 195, 188, 246, + 252, 1, 201, 176, 246, 252, 1, 188, 246, 252, 1, 140, 246, 252, 18, 3, + 252, 208, 246, 252, 18, 3, 68, 246, 252, 18, 3, 223, 201, 246, 252, 18, + 3, 234, 168, 246, 252, 18, 3, 66, 246, 252, 18, 3, 211, 153, 246, 252, + 18, 3, 74, 246, 252, 18, 3, 251, 238, 246, 252, 18, 3, 250, 165, 246, + 252, 18, 3, 196, 152, 246, 252, 120, 3, 170, 246, 252, 120, 3, 165, 246, + 252, 120, 3, 173, 246, 252, 120, 3, 193, 190, 246, 252, 1, 53, 222, 154, + 246, 252, 1, 53, 232, 53, 246, 252, 1, 53, 214, 72, 246, 252, 120, 3, 53, + 214, 72, 246, 252, 1, 53, 247, 5, 246, 252, 1, 53, 200, 43, 246, 252, 1, + 53, 215, 63, 246, 252, 1, 53, 210, 238, 246, 252, 1, 53, 192, 159, 246, + 252, 1, 53, 146, 246, 252, 1, 53, 172, 246, 252, 1, 53, 201, 179, 246, + 252, 120, 3, 53, 218, 170, 246, 252, 120, 3, 53, 230, 118, 246, 252, 17, + 191, 77, 246, 252, 17, 107, 246, 252, 17, 109, 246, 252, 17, 138, 246, + 252, 17, 134, 246, 252, 17, 150, 246, 252, 17, 169, 246, 252, 17, 175, + 246, 252, 17, 171, 246, 252, 17, 178, 246, 252, 208, 154, 201, 218, 246, + 252, 208, 154, 237, 240, 246, 252, 208, 154, 55, 237, 240, 246, 252, 208, + 154, 197, 225, 237, 240, 80, 1, 221, 208, 231, 242, 80, 1, 221, 208, 247, + 162, 80, 1, 221, 208, 247, 3, 80, 1, 221, 208, 223, 34, 80, 1, 221, 208, + 222, 254, 80, 1, 221, 208, 212, 103, 80, 1, 221, 208, 197, 132, 80, 1, + 221, 208, 197, 120, 80, 1, 221, 208, 237, 193, 80, 1, 221, 208, 237, 177, + 80, 1, 221, 208, 237, 70, 80, 1, 221, 208, 181, 80, 1, 221, 208, 188, 80, + 1, 221, 208, 140, 80, 1, 221, 208, 229, 179, 80, 1, 221, 208, 233, 111, + 80, 52, 1, 221, 208, 207, 87, 80, 1, 221, 208, 192, 220, 80, 1, 221, 208, + 191, 123, 80, 1, 221, 208, 165, 80, 219, 30, 221, 208, 211, 181, 80, 219, + 30, 221, 208, 208, 48, 80, 219, 30, 221, 208, 229, 80, 80, 16, 251, 224, + 233, 217, 80, 16, 251, 224, 107, 80, 16, 251, 224, 109, 80, 1, 251, 224, + 165, 80, 3, 210, 141, 222, 64, 198, 79, 80, 3, 54, 220, 97, 198, 77, 80, + 3, 54, 220, 97, 198, 74, 80, 1, 202, 239, 210, 191, 247, 3, 80, 1, 202, + 239, 210, 191, 203, 166, 54, 195, 59, 1, 130, 221, 69, 54, 195, 59, 1, + 137, 221, 69, 54, 195, 59, 1, 130, 221, 185, 54, 195, 59, 1, 137, 221, + 185, 54, 195, 59, 1, 130, 221, 194, 54, 195, 59, 1, 137, 221, 194, 54, + 195, 59, 1, 130, 231, 5, 54, 195, 59, 1, 137, 231, 5, 54, 195, 59, 1, + 130, 213, 251, 54, 195, 59, 1, 137, 213, 251, 54, 195, 59, 1, 130, 242, + 101, 54, 195, 59, 1, 137, 242, 101, 54, 195, 59, 1, 130, 243, 70, 54, + 195, 59, 1, 137, 243, 70, 54, 195, 59, 1, 130, 202, 47, 54, 195, 59, 1, + 137, 202, 47, 54, 195, 59, 1, 130, 212, 67, 54, 195, 59, 1, 137, 212, 67, + 54, 195, 59, 1, 130, 236, 176, 54, 195, 59, 1, 137, 236, 176, 54, 195, + 59, 1, 130, 159, 54, 195, 59, 1, 137, 159, 54, 195, 59, 1, 130, 198, 241, + 54, 195, 59, 1, 137, 198, 241, 54, 195, 59, 1, 130, 213, 45, 54, 195, 59, + 1, 137, 213, 45, 54, 195, 59, 1, 130, 248, 113, 54, 195, 59, 1, 137, 248, + 113, 54, 195, 59, 1, 130, 209, 75, 54, 195, 59, 1, 137, 209, 75, 54, 195, + 59, 1, 130, 209, 201, 54, 195, 59, 1, 137, 209, 201, 54, 195, 59, 1, 130, + 232, 177, 54, 195, 59, 1, 137, 232, 177, 54, 195, 59, 1, 130, 216, 14, + 54, 195, 59, 1, 137, 216, 14, 54, 195, 59, 1, 130, 192, 12, 54, 195, 59, + 1, 137, 192, 12, 54, 195, 59, 1, 130, 206, 163, 54, 195, 59, 1, 137, 206, + 163, 54, 195, 59, 1, 130, 219, 45, 54, 195, 59, 1, 137, 219, 45, 54, 195, 59, 1, 130, 195, 24, 54, 195, 59, 1, 137, 195, 24, 54, 195, 59, 1, 130, - 229, 23, 54, 195, 59, 1, 137, 229, 23, 54, 195, 59, 1, 130, 74, 54, 195, - 59, 1, 137, 74, 54, 195, 59, 217, 113, 222, 83, 54, 195, 59, 18, 252, - 206, 54, 195, 59, 18, 68, 54, 195, 59, 18, 196, 152, 54, 195, 59, 18, 66, - 54, 195, 59, 18, 71, 54, 195, 59, 18, 74, 54, 195, 59, 217, 113, 221, - 186, 54, 195, 59, 18, 228, 35, 54, 195, 59, 18, 196, 151, 54, 195, 59, - 18, 196, 168, 54, 195, 59, 18, 250, 161, 54, 195, 59, 18, 250, 131, 54, - 195, 59, 18, 251, 132, 54, 195, 59, 18, 251, 149, 54, 195, 59, 163, 217, - 113, 234, 147, 54, 195, 59, 163, 217, 113, 212, 143, 54, 195, 59, 163, - 217, 113, 198, 241, 54, 195, 59, 163, 217, 113, 202, 18, 54, 195, 59, 16, - 221, 44, 54, 195, 59, 16, 212, 143, 54, 195, 59, 16, 205, 152, 54, 195, - 59, 16, 229, 24, 229, 10, 54, 195, 59, 16, 221, 55, 221, 54, 216, 205, - 217, 18, 1, 71, 216, 205, 217, 18, 1, 74, 216, 205, 217, 18, 1, 247, 1, - 216, 205, 217, 18, 1, 212, 101, 216, 205, 217, 18, 1, 197, 132, 216, 205, - 217, 18, 1, 197, 120, 216, 205, 217, 18, 1, 237, 191, 216, 205, 217, 18, - 1, 237, 175, 216, 205, 217, 18, 1, 213, 79, 216, 205, 217, 18, 1, 203, - 165, 216, 205, 217, 18, 1, 201, 175, 216, 205, 217, 18, 18, 3, 223, 199, - 216, 205, 217, 18, 18, 3, 196, 30, 216, 205, 217, 18, 18, 3, 252, 170, - 216, 205, 217, 18, 18, 3, 250, 163, 216, 205, 217, 18, 18, 3, 252, 162, - 216, 205, 217, 18, 243, 116, 216, 205, 217, 18, 251, 242, 221, 173, 216, - 205, 217, 18, 251, 100, 216, 205, 217, 18, 5, 207, 46, 77, 216, 205, 217, - 18, 193, 23, 207, 46, 77, 216, 205, 217, 18, 18, 3, 195, 35, 216, 205, - 217, 18, 195, 40, 36, 5, 197, 113, 36, 5, 197, 116, 36, 5, 197, 119, 36, - 5, 197, 117, 36, 5, 197, 118, 36, 5, 197, 115, 36, 5, 237, 169, 36, 5, - 237, 171, 36, 5, 237, 174, 36, 5, 237, 172, 36, 5, 237, 173, 36, 5, 237, - 170, 36, 5, 235, 22, 36, 5, 235, 26, 36, 5, 235, 34, 36, 5, 235, 31, 36, - 5, 235, 32, 36, 5, 235, 23, 36, 5, 247, 56, 36, 5, 247, 50, 36, 5, 247, - 52, 36, 5, 247, 55, 36, 5, 247, 53, 36, 5, 247, 54, 36, 5, 247, 51, 36, - 5, 249, 53, 36, 5, 249, 32, 36, 5, 249, 44, 36, 5, 249, 52, 36, 5, 249, - 47, 36, 5, 249, 48, 36, 5, 249, 36, 8, 2, 1, 249, 82, 251, 160, 8, 2, 1, - 42, 207, 16, 8, 2, 1, 248, 135, 71, 8, 2, 1, 249, 82, 71, 8, 2, 1, 235, - 15, 4, 232, 188, 8, 2, 1, 219, 189, 233, 175, 8, 2, 1, 27, 232, 52, 4, - 238, 212, 8, 2, 1, 220, 143, 4, 223, 93, 219, 245, 206, 8, 8, 2, 1, 220, - 143, 4, 55, 82, 198, 152, 8, 2, 1, 220, 143, 4, 82, 206, 188, 8, 2, 1, - 218, 169, 4, 238, 212, 8, 2, 1, 215, 62, 4, 238, 212, 8, 2, 1, 234, 89, - 4, 238, 212, 8, 2, 1, 248, 135, 74, 8, 2, 1, 248, 135, 187, 4, 106, 8, 2, - 1, 211, 77, 187, 4, 106, 8, 2, 1, 223, 93, 211, 151, 8, 2, 1, 153, 211, - 152, 4, 106, 8, 2, 1, 153, 211, 152, 4, 228, 241, 106, 8, 2, 1, 153, 187, - 211, 72, 8, 2, 1, 153, 187, 211, 73, 4, 106, 8, 2, 1, 201, 68, 146, 8, 1, - 2, 6, 207, 222, 4, 50, 219, 212, 8, 2, 1, 207, 222, 193, 51, 230, 31, 8, - 2, 1, 55, 146, 8, 2, 1, 207, 222, 4, 238, 212, 8, 2, 1, 55, 207, 222, 4, - 238, 212, 8, 2, 1, 27, 146, 8, 2, 1, 27, 207, 222, 4, 206, 188, 8, 2, 1, - 249, 72, 234, 12, 8, 2, 1, 126, 4, 203, 40, 50, 219, 212, 8, 2, 1, 126, - 249, 88, 4, 203, 40, 50, 219, 212, 8, 2, 1, 196, 139, 8, 2, 1, 153, 196, - 139, 8, 2, 1, 126, 4, 45, 102, 8, 2, 1, 243, 95, 8, 2, 1, 243, 96, 4, - 130, 50, 206, 188, 8, 2, 1, 243, 96, 4, 130, 45, 204, 5, 8, 2, 1, 192, - 236, 4, 130, 50, 206, 188, 8, 2, 1, 192, 236, 4, 179, 45, 219, 212, 8, 2, - 1, 192, 236, 4, 179, 45, 219, 213, 23, 130, 50, 206, 188, 8, 2, 1, 192, - 236, 4, 179, 45, 219, 213, 4, 204, 5, 8, 2, 1, 192, 160, 4, 203, 40, 50, - 219, 212, 52, 248, 37, 4, 223, 93, 248, 36, 52, 1, 2, 229, 196, 52, 1, 2, - 220, 143, 4, 223, 93, 219, 245, 206, 8, 52, 1, 2, 220, 143, 4, 82, 198, - 152, 52, 1, 2, 126, 4, 45, 102, 8, 2, 1, 205, 174, 192, 95, 8, 2, 1, 223, - 81, 71, 8, 2, 1, 211, 77, 211, 151, 8, 2, 1, 196, 82, 8, 2, 1, 223, 93, - 251, 160, 35, 1, 2, 6, 211, 110, 8, 2, 1, 235, 37, 237, 3, 4, 207, 24, - 102, 8, 2, 1, 197, 170, 237, 3, 4, 207, 24, 102, 8, 2, 1, 153, 207, 222, - 4, 82, 198, 152, 52, 1, 2, 153, 193, 224, 52, 1, 45, 199, 228, 52, 1, 50, + 229, 25, 54, 195, 59, 1, 137, 229, 25, 54, 195, 59, 1, 130, 74, 54, 195, + 59, 1, 137, 74, 54, 195, 59, 217, 115, 222, 85, 54, 195, 59, 18, 252, + 208, 54, 195, 59, 18, 68, 54, 195, 59, 18, 196, 152, 54, 195, 59, 18, 66, + 54, 195, 59, 18, 71, 54, 195, 59, 18, 74, 54, 195, 59, 217, 115, 221, + 188, 54, 195, 59, 18, 228, 37, 54, 195, 59, 18, 196, 151, 54, 195, 59, + 18, 196, 168, 54, 195, 59, 18, 250, 163, 54, 195, 59, 18, 250, 133, 54, + 195, 59, 18, 251, 134, 54, 195, 59, 18, 251, 151, 54, 195, 59, 163, 217, + 115, 234, 149, 54, 195, 59, 163, 217, 115, 212, 145, 54, 195, 59, 163, + 217, 115, 198, 241, 54, 195, 59, 163, 217, 115, 202, 19, 54, 195, 59, 16, + 221, 46, 54, 195, 59, 16, 212, 145, 54, 195, 59, 16, 205, 153, 54, 195, + 59, 16, 229, 26, 229, 12, 54, 195, 59, 16, 221, 57, 221, 56, 216, 207, + 217, 20, 1, 71, 216, 207, 217, 20, 1, 74, 216, 207, 217, 20, 1, 247, 3, + 216, 207, 217, 20, 1, 212, 103, 216, 207, 217, 20, 1, 197, 132, 216, 207, + 217, 20, 1, 197, 120, 216, 207, 217, 20, 1, 237, 193, 216, 207, 217, 20, + 1, 237, 177, 216, 207, 217, 20, 1, 213, 81, 216, 207, 217, 20, 1, 203, + 166, 216, 207, 217, 20, 1, 201, 176, 216, 207, 217, 20, 18, 3, 223, 201, + 216, 207, 217, 20, 18, 3, 196, 30, 216, 207, 217, 20, 18, 3, 252, 172, + 216, 207, 217, 20, 18, 3, 250, 165, 216, 207, 217, 20, 18, 3, 252, 164, + 216, 207, 217, 20, 243, 118, 216, 207, 217, 20, 251, 244, 221, 175, 216, + 207, 217, 20, 251, 102, 216, 207, 217, 20, 5, 207, 47, 77, 216, 207, 217, + 20, 193, 23, 207, 47, 77, 216, 207, 217, 20, 18, 3, 195, 35, 216, 207, + 217, 20, 195, 40, 36, 5, 197, 113, 36, 5, 197, 116, 36, 5, 197, 119, 36, + 5, 197, 117, 36, 5, 197, 118, 36, 5, 197, 115, 36, 5, 237, 171, 36, 5, + 237, 173, 36, 5, 237, 176, 36, 5, 237, 174, 36, 5, 237, 175, 36, 5, 237, + 172, 36, 5, 235, 24, 36, 5, 235, 28, 36, 5, 235, 36, 36, 5, 235, 33, 36, + 5, 235, 34, 36, 5, 235, 25, 36, 5, 247, 58, 36, 5, 247, 52, 36, 5, 247, + 54, 36, 5, 247, 57, 36, 5, 247, 55, 36, 5, 247, 56, 36, 5, 247, 53, 36, + 5, 249, 55, 36, 5, 249, 34, 36, 5, 249, 46, 36, 5, 249, 54, 36, 5, 249, + 49, 36, 5, 249, 50, 36, 5, 249, 38, 8, 2, 1, 249, 84, 251, 162, 8, 2, 1, + 42, 207, 17, 8, 2, 1, 248, 137, 71, 8, 2, 1, 249, 84, 71, 8, 2, 1, 235, + 17, 4, 232, 190, 8, 2, 1, 219, 191, 233, 177, 8, 2, 1, 27, 232, 54, 4, + 238, 214, 8, 2, 1, 220, 145, 4, 223, 95, 219, 247, 206, 9, 8, 2, 1, 220, + 145, 4, 55, 82, 198, 152, 8, 2, 1, 220, 145, 4, 82, 206, 189, 8, 2, 1, + 218, 171, 4, 238, 214, 8, 2, 1, 215, 64, 4, 238, 214, 8, 2, 1, 234, 91, + 4, 238, 214, 8, 2, 1, 248, 137, 74, 8, 2, 1, 248, 137, 187, 4, 106, 8, 2, + 1, 211, 79, 187, 4, 106, 8, 2, 1, 223, 95, 211, 153, 8, 2, 1, 154, 211, + 154, 4, 106, 8, 2, 1, 154, 211, 154, 4, 228, 243, 106, 8, 2, 1, 154, 187, + 211, 74, 8, 2, 1, 154, 187, 211, 75, 4, 106, 8, 2, 1, 201, 69, 146, 8, 1, + 2, 6, 207, 224, 4, 50, 219, 214, 8, 2, 1, 207, 224, 193, 51, 230, 33, 8, + 2, 1, 55, 146, 8, 2, 1, 207, 224, 4, 238, 214, 8, 2, 1, 55, 207, 224, 4, + 238, 214, 8, 2, 1, 27, 146, 8, 2, 1, 27, 207, 224, 4, 206, 189, 8, 2, 1, + 249, 74, 234, 14, 8, 2, 1, 126, 4, 203, 41, 50, 219, 214, 8, 2, 1, 126, + 249, 90, 4, 203, 41, 50, 219, 214, 8, 2, 1, 196, 139, 8, 2, 1, 154, 196, + 139, 8, 2, 1, 126, 4, 45, 102, 8, 2, 1, 243, 97, 8, 2, 1, 243, 98, 4, + 130, 50, 206, 189, 8, 2, 1, 243, 98, 4, 130, 45, 204, 6, 8, 2, 1, 192, + 236, 4, 130, 50, 206, 189, 8, 2, 1, 192, 236, 4, 180, 45, 219, 214, 8, 2, + 1, 192, 236, 4, 180, 45, 219, 215, 23, 130, 50, 206, 189, 8, 2, 1, 192, + 236, 4, 180, 45, 219, 215, 4, 204, 6, 8, 2, 1, 192, 160, 4, 203, 41, 50, + 219, 214, 52, 248, 39, 4, 223, 95, 248, 38, 52, 1, 2, 229, 198, 52, 1, 2, + 220, 145, 4, 223, 95, 219, 247, 206, 9, 52, 1, 2, 220, 145, 4, 82, 198, + 152, 52, 1, 2, 126, 4, 45, 102, 8, 2, 1, 205, 175, 192, 95, 8, 2, 1, 223, + 83, 71, 8, 2, 1, 211, 79, 211, 153, 8, 2, 1, 196, 82, 8, 2, 1, 223, 95, + 251, 162, 35, 1, 2, 6, 211, 112, 8, 2, 1, 235, 39, 237, 5, 4, 207, 25, + 102, 8, 2, 1, 197, 170, 237, 5, 4, 207, 25, 102, 8, 2, 1, 154, 207, 224, + 4, 82, 198, 152, 52, 1, 2, 154, 193, 224, 52, 1, 45, 199, 228, 52, 1, 50, 199, 228, 103, 2, 1, 65, 103, 2, 1, 71, 103, 2, 1, 68, 103, 2, 1, 74, - 103, 2, 1, 66, 103, 2, 1, 196, 12, 103, 2, 1, 231, 240, 103, 2, 1, 155, - 103, 2, 1, 231, 165, 103, 2, 1, 231, 53, 103, 2, 1, 231, 3, 103, 2, 1, - 230, 179, 103, 2, 1, 230, 138, 103, 2, 1, 140, 103, 2, 1, 229, 245, 103, - 2, 1, 229, 158, 103, 2, 1, 229, 23, 103, 2, 1, 228, 159, 103, 2, 1, 228, - 126, 103, 2, 1, 173, 103, 2, 1, 219, 238, 103, 2, 1, 219, 146, 103, 2, 1, - 219, 43, 103, 2, 1, 218, 225, 103, 2, 1, 218, 192, 103, 2, 1, 174, 103, - 2, 1, 216, 232, 103, 2, 1, 216, 100, 103, 2, 1, 216, 12, 103, 2, 1, 215, - 155, 103, 2, 1, 180, 103, 2, 1, 229, 47, 103, 2, 1, 214, 237, 103, 2, 1, - 214, 121, 103, 2, 1, 213, 219, 103, 2, 1, 213, 43, 103, 2, 1, 212, 178, - 103, 2, 1, 212, 112, 103, 2, 1, 208, 32, 103, 2, 1, 208, 16, 103, 2, 1, - 208, 9, 103, 2, 1, 207, 255, 103, 2, 1, 207, 244, 103, 2, 1, 207, 242, - 103, 2, 1, 188, 103, 2, 1, 206, 8, 103, 2, 1, 205, 68, 103, 2, 1, 202, - 222, 103, 2, 1, 202, 46, 103, 2, 1, 201, 4, 103, 2, 1, 200, 158, 103, 2, - 1, 238, 32, 103, 2, 1, 190, 190, 103, 2, 1, 237, 146, 103, 2, 1, 199, - 145, 103, 2, 1, 237, 44, 103, 2, 1, 198, 193, 103, 2, 1, 236, 174, 103, - 2, 1, 235, 89, 103, 2, 1, 235, 57, 103, 2, 1, 236, 186, 103, 2, 1, 198, + 103, 2, 1, 66, 103, 2, 1, 196, 12, 103, 2, 1, 231, 242, 103, 2, 1, 155, + 103, 2, 1, 231, 167, 103, 2, 1, 231, 55, 103, 2, 1, 231, 5, 103, 2, 1, + 230, 181, 103, 2, 1, 230, 140, 103, 2, 1, 140, 103, 2, 1, 229, 247, 103, + 2, 1, 229, 160, 103, 2, 1, 229, 25, 103, 2, 1, 228, 161, 103, 2, 1, 228, + 128, 103, 2, 1, 173, 103, 2, 1, 219, 240, 103, 2, 1, 219, 148, 103, 2, 1, + 219, 45, 103, 2, 1, 218, 227, 103, 2, 1, 218, 194, 103, 2, 1, 174, 103, + 2, 1, 216, 234, 103, 2, 1, 216, 102, 103, 2, 1, 216, 14, 103, 2, 1, 215, + 157, 103, 2, 1, 181, 103, 2, 1, 229, 49, 103, 2, 1, 214, 239, 103, 2, 1, + 214, 123, 103, 2, 1, 213, 221, 103, 2, 1, 213, 45, 103, 2, 1, 212, 180, + 103, 2, 1, 212, 114, 103, 2, 1, 208, 34, 103, 2, 1, 208, 18, 103, 2, 1, + 208, 11, 103, 2, 1, 208, 1, 103, 2, 1, 207, 246, 103, 2, 1, 207, 244, + 103, 2, 1, 188, 103, 2, 1, 206, 9, 103, 2, 1, 205, 69, 103, 2, 1, 202, + 223, 103, 2, 1, 202, 47, 103, 2, 1, 201, 5, 103, 2, 1, 200, 158, 103, 2, + 1, 238, 34, 103, 2, 1, 190, 190, 103, 2, 1, 237, 148, 103, 2, 1, 199, + 145, 103, 2, 1, 237, 46, 103, 2, 1, 198, 193, 103, 2, 1, 236, 176, 103, + 2, 1, 235, 91, 103, 2, 1, 235, 59, 103, 2, 1, 236, 188, 103, 2, 1, 198, 115, 103, 2, 1, 198, 114, 103, 2, 1, 198, 103, 103, 2, 1, 198, 102, 103, 2, 1, 198, 101, 103, 2, 1, 198, 100, 103, 2, 1, 197, 168, 103, 2, 1, 197, 161, 103, 2, 1, 197, 146, 103, 2, 1, 197, 144, 103, 2, 1, 197, 140, 103, 2, 1, 197, 139, 103, 2, 1, 193, 190, 103, 2, 1, 193, 125, 103, 2, 1, 193, 86, 103, 2, 1, 193, 48, 103, 2, 1, 193, 0, 103, 2, 1, 192, 243, 103, 2, - 1, 170, 216, 205, 217, 18, 1, 221, 51, 216, 205, 217, 18, 1, 205, 152, - 216, 205, 217, 18, 1, 220, 96, 216, 205, 217, 18, 1, 216, 23, 216, 205, - 217, 18, 1, 168, 216, 205, 217, 18, 1, 180, 216, 205, 217, 18, 1, 243, - 87, 216, 205, 217, 18, 1, 198, 154, 216, 205, 217, 18, 1, 221, 176, 216, - 205, 217, 18, 1, 213, 239, 216, 205, 217, 18, 1, 198, 232, 216, 205, 217, - 18, 1, 193, 173, 216, 205, 217, 18, 1, 192, 106, 216, 205, 217, 18, 1, - 228, 147, 216, 205, 217, 18, 1, 196, 113, 216, 205, 217, 18, 1, 68, 216, - 205, 217, 18, 1, 209, 222, 216, 205, 217, 18, 1, 250, 175, 216, 205, 217, - 18, 1, 230, 251, 216, 205, 217, 18, 1, 222, 250, 216, 205, 217, 18, 1, - 207, 156, 216, 205, 217, 18, 1, 249, 153, 216, 205, 217, 18, 1, 222, 234, - 216, 205, 217, 18, 1, 237, 1, 216, 205, 217, 18, 1, 231, 60, 216, 205, - 217, 18, 1, 237, 46, 216, 205, 217, 18, 1, 248, 198, 216, 205, 217, 18, - 1, 221, 52, 219, 9, 216, 205, 217, 18, 1, 220, 97, 219, 9, 216, 205, 217, - 18, 1, 216, 24, 219, 9, 216, 205, 217, 18, 1, 210, 221, 219, 9, 216, 205, - 217, 18, 1, 215, 7, 219, 9, 216, 205, 217, 18, 1, 198, 155, 219, 9, 216, - 205, 217, 18, 1, 213, 240, 219, 9, 216, 205, 217, 18, 1, 228, 74, 219, 9, - 216, 205, 217, 18, 18, 3, 211, 102, 216, 205, 217, 18, 18, 3, 223, 160, - 216, 205, 217, 18, 18, 3, 251, 130, 216, 205, 217, 18, 18, 3, 192, 69, - 216, 205, 217, 18, 18, 3, 202, 6, 216, 205, 217, 18, 18, 3, 196, 110, - 216, 205, 217, 18, 18, 3, 243, 114, 216, 205, 217, 18, 18, 3, 212, 127, - 216, 205, 217, 18, 243, 115, 216, 205, 217, 18, 218, 209, 223, 42, 216, - 205, 217, 18, 251, 38, 223, 42, 216, 205, 217, 18, 17, 191, 77, 216, 205, - 217, 18, 17, 107, 216, 205, 217, 18, 17, 109, 216, 205, 217, 18, 17, 138, - 216, 205, 217, 18, 17, 134, 216, 205, 217, 18, 17, 149, 216, 205, 217, - 18, 17, 169, 216, 205, 217, 18, 17, 175, 216, 205, 217, 18, 17, 171, 216, - 205, 217, 18, 17, 178, 30, 222, 174, 212, 3, 30, 222, 174, 212, 8, 30, - 222, 174, 192, 5, 30, 222, 174, 192, 4, 30, 222, 174, 192, 3, 30, 222, - 174, 196, 218, 30, 222, 174, 196, 222, 30, 222, 174, 191, 219, 30, 222, - 174, 191, 215, 30, 222, 174, 233, 241, 30, 222, 174, 233, 239, 30, 222, - 174, 233, 240, 30, 222, 174, 233, 237, 30, 222, 174, 228, 60, 30, 222, - 174, 228, 59, 30, 222, 174, 228, 57, 30, 222, 174, 228, 58, 30, 222, 174, - 228, 63, 30, 222, 174, 228, 56, 30, 222, 174, 228, 55, 30, 222, 174, 228, - 65, 30, 222, 174, 251, 24, 30, 222, 174, 251, 23, 30, 125, 213, 197, 30, - 125, 213, 203, 30, 125, 201, 156, 30, 125, 201, 155, 30, 125, 198, 163, - 30, 125, 198, 161, 30, 125, 198, 160, 30, 125, 198, 166, 30, 125, 198, - 167, 30, 125, 198, 159, 30, 125, 206, 218, 30, 125, 206, 233, 30, 125, - 201, 162, 30, 125, 206, 230, 30, 125, 206, 220, 30, 125, 206, 222, 30, - 125, 206, 209, 30, 125, 206, 210, 30, 125, 222, 68, 30, 125, 216, 72, 30, - 125, 216, 66, 30, 125, 201, 166, 30, 125, 216, 69, 30, 125, 216, 75, 30, - 125, 209, 150, 30, 125, 209, 159, 30, 125, 209, 163, 30, 125, 201, 164, - 30, 125, 209, 153, 30, 125, 209, 167, 30, 125, 209, 168, 30, 125, 202, - 152, 30, 125, 202, 155, 30, 125, 201, 160, 30, 125, 201, 158, 30, 125, - 202, 150, 30, 125, 202, 158, 30, 125, 202, 159, 30, 125, 202, 144, 30, - 125, 202, 157, 30, 125, 210, 147, 30, 125, 210, 148, 30, 125, 192, 53, - 30, 125, 192, 56, 30, 125, 243, 22, 30, 125, 243, 21, 30, 125, 201, 171, - 30, 125, 209, 206, 30, 125, 209, 205, 12, 15, 225, 190, 12, 15, 225, 189, - 12, 15, 225, 188, 12, 15, 225, 187, 12, 15, 225, 186, 12, 15, 225, 185, - 12, 15, 225, 184, 12, 15, 225, 183, 12, 15, 225, 182, 12, 15, 225, 181, - 12, 15, 225, 180, 12, 15, 225, 179, 12, 15, 225, 178, 12, 15, 225, 177, - 12, 15, 225, 176, 12, 15, 225, 175, 12, 15, 225, 174, 12, 15, 225, 173, - 12, 15, 225, 172, 12, 15, 225, 171, 12, 15, 225, 170, 12, 15, 225, 169, - 12, 15, 225, 168, 12, 15, 225, 167, 12, 15, 225, 166, 12, 15, 225, 165, - 12, 15, 225, 164, 12, 15, 225, 163, 12, 15, 225, 162, 12, 15, 225, 161, - 12, 15, 225, 160, 12, 15, 225, 159, 12, 15, 225, 158, 12, 15, 225, 157, - 12, 15, 225, 156, 12, 15, 225, 155, 12, 15, 225, 154, 12, 15, 225, 153, - 12, 15, 225, 152, 12, 15, 225, 151, 12, 15, 225, 150, 12, 15, 225, 149, - 12, 15, 225, 148, 12, 15, 225, 147, 12, 15, 225, 146, 12, 15, 225, 145, - 12, 15, 225, 144, 12, 15, 225, 143, 12, 15, 225, 142, 12, 15, 225, 141, - 12, 15, 225, 140, 12, 15, 225, 139, 12, 15, 225, 138, 12, 15, 225, 137, - 12, 15, 225, 136, 12, 15, 225, 135, 12, 15, 225, 134, 12, 15, 225, 133, - 12, 15, 225, 132, 12, 15, 225, 131, 12, 15, 225, 130, 12, 15, 225, 129, - 12, 15, 225, 128, 12, 15, 225, 127, 12, 15, 225, 126, 12, 15, 225, 125, - 12, 15, 225, 124, 12, 15, 225, 123, 12, 15, 225, 122, 12, 15, 225, 121, - 12, 15, 225, 120, 12, 15, 225, 119, 12, 15, 225, 118, 12, 15, 225, 117, - 12, 15, 225, 116, 12, 15, 225, 115, 12, 15, 225, 114, 12, 15, 225, 113, - 12, 15, 225, 112, 12, 15, 225, 111, 12, 15, 225, 110, 12, 15, 225, 109, - 12, 15, 225, 108, 12, 15, 225, 107, 12, 15, 225, 106, 12, 15, 225, 105, - 12, 15, 225, 104, 12, 15, 225, 103, 12, 15, 225, 102, 12, 15, 225, 101, - 12, 15, 225, 100, 12, 15, 225, 99, 12, 15, 225, 98, 12, 15, 225, 97, 12, - 15, 225, 96, 12, 15, 225, 95, 12, 15, 225, 94, 12, 15, 225, 93, 12, 15, - 225, 92, 12, 15, 225, 91, 12, 15, 225, 90, 12, 15, 225, 89, 12, 15, 225, - 88, 12, 15, 225, 87, 12, 15, 225, 86, 12, 15, 225, 85, 12, 15, 225, 84, - 12, 15, 225, 83, 12, 15, 225, 82, 12, 15, 225, 81, 12, 15, 225, 80, 12, - 15, 225, 79, 12, 15, 225, 78, 12, 15, 225, 77, 12, 15, 225, 76, 12, 15, - 225, 75, 12, 15, 225, 74, 12, 15, 225, 73, 12, 15, 225, 72, 12, 15, 225, - 71, 12, 15, 225, 70, 12, 15, 225, 69, 12, 15, 225, 68, 12, 15, 225, 67, - 12, 15, 225, 66, 12, 15, 225, 65, 12, 15, 225, 64, 12, 15, 225, 63, 12, - 15, 225, 62, 12, 15, 225, 61, 12, 15, 225, 60, 12, 15, 225, 59, 12, 15, - 225, 58, 12, 15, 225, 57, 12, 15, 225, 56, 12, 15, 225, 55, 12, 15, 225, - 54, 12, 15, 225, 53, 12, 15, 225, 52, 12, 15, 225, 51, 12, 15, 225, 50, - 12, 15, 225, 49, 12, 15, 225, 48, 12, 15, 225, 47, 12, 15, 225, 46, 12, - 15, 225, 45, 12, 15, 225, 44, 12, 15, 225, 43, 12, 15, 225, 42, 12, 15, - 225, 41, 12, 15, 225, 40, 12, 15, 225, 39, 12, 15, 225, 38, 12, 15, 225, - 37, 12, 15, 225, 36, 12, 15, 225, 35, 12, 15, 225, 34, 12, 15, 225, 33, - 12, 15, 225, 32, 12, 15, 225, 31, 12, 15, 225, 30, 12, 15, 225, 29, 12, - 15, 225, 28, 12, 15, 225, 27, 12, 15, 225, 26, 12, 15, 225, 25, 12, 15, - 225, 24, 12, 15, 225, 23, 12, 15, 225, 22, 12, 15, 225, 21, 12, 15, 225, - 20, 12, 15, 225, 19, 12, 15, 225, 18, 12, 15, 225, 17, 12, 15, 225, 16, - 12, 15, 225, 15, 12, 15, 225, 14, 12, 15, 225, 13, 12, 15, 225, 12, 12, - 15, 225, 11, 12, 15, 225, 10, 12, 15, 225, 9, 12, 15, 225, 8, 12, 15, - 225, 7, 12, 15, 225, 6, 12, 15, 225, 5, 12, 15, 225, 4, 12, 15, 225, 3, - 12, 15, 225, 2, 12, 15, 225, 1, 12, 15, 225, 0, 12, 15, 224, 255, 12, 15, - 224, 254, 12, 15, 224, 253, 12, 15, 224, 252, 12, 15, 224, 251, 12, 15, - 224, 250, 12, 15, 224, 249, 12, 15, 224, 248, 12, 15, 224, 247, 12, 15, - 224, 246, 12, 15, 224, 245, 12, 15, 224, 244, 12, 15, 224, 243, 12, 15, - 224, 242, 12, 15, 224, 241, 12, 15, 224, 240, 12, 15, 224, 239, 12, 15, - 224, 238, 12, 15, 224, 237, 12, 15, 224, 236, 12, 15, 224, 235, 12, 15, - 224, 234, 12, 15, 224, 233, 12, 15, 224, 232, 12, 15, 224, 231, 12, 15, - 224, 230, 12, 15, 224, 229, 12, 15, 224, 228, 12, 15, 224, 227, 12, 15, - 224, 226, 12, 15, 224, 225, 12, 15, 224, 224, 12, 15, 224, 223, 12, 15, - 224, 222, 12, 15, 224, 221, 12, 15, 224, 220, 12, 15, 224, 219, 12, 15, - 224, 218, 12, 15, 224, 217, 12, 15, 224, 216, 12, 15, 224, 215, 12, 15, - 224, 214, 12, 15, 224, 213, 12, 15, 224, 212, 12, 15, 224, 211, 12, 15, - 224, 210, 12, 15, 224, 209, 12, 15, 224, 208, 12, 15, 224, 207, 12, 15, - 224, 206, 12, 15, 224, 205, 12, 15, 224, 204, 12, 15, 224, 203, 12, 15, - 224, 202, 12, 15, 224, 201, 12, 15, 224, 200, 12, 15, 224, 199, 12, 15, - 224, 198, 12, 15, 224, 197, 12, 15, 224, 196, 12, 15, 224, 195, 12, 15, - 224, 194, 12, 15, 224, 193, 12, 15, 224, 192, 12, 15, 224, 191, 12, 15, - 224, 190, 12, 15, 224, 189, 12, 15, 224, 188, 12, 15, 224, 187, 12, 15, - 224, 186, 12, 15, 224, 185, 12, 15, 224, 184, 12, 15, 224, 183, 12, 15, - 224, 182, 12, 15, 224, 181, 12, 15, 224, 180, 12, 15, 224, 179, 12, 15, - 224, 178, 12, 15, 224, 177, 12, 15, 224, 176, 12, 15, 224, 175, 12, 15, - 224, 174, 12, 15, 224, 173, 12, 15, 224, 172, 12, 15, 224, 171, 12, 15, - 224, 170, 12, 15, 224, 169, 12, 15, 224, 168, 12, 15, 224, 167, 12, 15, - 224, 166, 12, 15, 224, 165, 12, 15, 224, 164, 12, 15, 224, 163, 12, 15, - 224, 162, 12, 15, 224, 161, 12, 15, 224, 160, 12, 15, 224, 159, 12, 15, - 224, 158, 12, 15, 224, 157, 12, 15, 224, 156, 12, 15, 224, 155, 12, 15, - 224, 154, 12, 15, 224, 153, 12, 15, 224, 152, 12, 15, 224, 151, 12, 15, - 224, 150, 12, 15, 224, 149, 12, 15, 224, 148, 12, 15, 224, 147, 12, 15, - 224, 146, 12, 15, 224, 145, 12, 15, 224, 144, 12, 15, 224, 143, 12, 15, - 224, 142, 12, 15, 224, 141, 12, 15, 224, 140, 12, 15, 224, 139, 12, 15, - 224, 138, 12, 15, 224, 137, 12, 15, 224, 136, 12, 15, 224, 135, 12, 15, - 224, 134, 12, 15, 224, 133, 12, 15, 224, 132, 12, 15, 224, 131, 12, 15, - 224, 130, 12, 15, 224, 129, 12, 15, 224, 128, 12, 15, 224, 127, 12, 15, - 224, 126, 12, 15, 224, 125, 12, 15, 224, 124, 12, 15, 224, 123, 12, 15, - 224, 122, 12, 15, 224, 121, 12, 15, 224, 120, 12, 15, 224, 119, 12, 15, - 224, 118, 12, 15, 224, 117, 12, 15, 224, 116, 12, 15, 224, 115, 12, 15, - 224, 114, 12, 15, 224, 113, 12, 15, 224, 112, 12, 15, 224, 111, 12, 15, - 224, 110, 12, 15, 224, 109, 12, 15, 224, 108, 12, 15, 224, 107, 12, 15, - 224, 106, 12, 15, 224, 105, 12, 15, 224, 104, 12, 15, 224, 103, 12, 15, - 224, 102, 12, 15, 224, 101, 12, 15, 224, 100, 12, 15, 224, 99, 12, 15, - 224, 98, 12, 15, 224, 97, 12, 15, 224, 96, 12, 15, 224, 95, 12, 15, 224, - 94, 12, 15, 224, 93, 12, 15, 224, 92, 12, 15, 224, 91, 12, 15, 224, 90, - 12, 15, 224, 89, 12, 15, 224, 88, 12, 15, 224, 87, 12, 15, 224, 86, 12, - 15, 224, 85, 12, 15, 224, 84, 12, 15, 224, 83, 12, 15, 224, 82, 12, 15, - 224, 81, 12, 15, 224, 80, 12, 15, 224, 79, 12, 15, 224, 78, 12, 15, 224, - 77, 12, 15, 224, 76, 12, 15, 224, 75, 12, 15, 224, 74, 12, 15, 224, 73, - 12, 15, 224, 72, 12, 15, 224, 71, 12, 15, 224, 70, 12, 15, 224, 69, 12, - 15, 224, 68, 12, 15, 224, 67, 12, 15, 224, 66, 12, 15, 224, 65, 12, 15, - 224, 64, 12, 15, 224, 63, 12, 15, 224, 62, 12, 15, 224, 61, 12, 15, 224, - 60, 12, 15, 224, 59, 12, 15, 224, 58, 12, 15, 224, 57, 12, 15, 224, 56, - 12, 15, 224, 55, 12, 15, 224, 54, 12, 15, 224, 53, 12, 15, 224, 52, 12, - 15, 224, 51, 12, 15, 224, 50, 12, 15, 224, 49, 12, 15, 224, 48, 12, 15, - 224, 47, 12, 15, 224, 46, 12, 15, 224, 45, 12, 15, 224, 44, 12, 15, 224, - 43, 12, 15, 224, 42, 12, 15, 224, 41, 12, 15, 224, 40, 12, 15, 224, 39, - 12, 15, 224, 38, 12, 15, 224, 37, 12, 15, 224, 36, 12, 15, 224, 35, 12, - 15, 224, 34, 12, 15, 224, 33, 12, 15, 224, 32, 12, 15, 224, 31, 12, 15, - 224, 30, 12, 15, 224, 29, 12, 15, 224, 28, 12, 15, 224, 27, 12, 15, 224, - 26, 12, 15, 224, 25, 12, 15, 224, 24, 12, 15, 224, 23, 12, 15, 224, 22, - 12, 15, 224, 21, 12, 15, 224, 20, 12, 15, 224, 19, 12, 15, 224, 18, 12, - 15, 224, 17, 12, 15, 224, 16, 12, 15, 224, 15, 12, 15, 224, 14, 12, 15, - 224, 13, 12, 15, 224, 12, 12, 15, 224, 11, 12, 15, 224, 10, 12, 15, 224, - 9, 12, 15, 224, 8, 12, 15, 224, 7, 12, 15, 224, 6, 12, 15, 224, 5, 12, - 15, 224, 4, 12, 15, 224, 3, 12, 15, 224, 2, 12, 15, 224, 1, 12, 15, 224, - 0, 12, 15, 223, 255, 12, 15, 223, 254, 12, 15, 223, 253, 12, 15, 223, - 252, 12, 15, 223, 251, 12, 15, 223, 250, 12, 15, 223, 249, 12, 15, 223, - 248, 12, 15, 223, 247, 12, 15, 223, 246, 12, 15, 223, 245, 12, 15, 223, - 244, 12, 15, 223, 243, 12, 15, 223, 242, 12, 15, 223, 241, 12, 15, 223, - 240, 12, 15, 223, 239, 12, 15, 223, 238, 12, 15, 223, 237, 12, 15, 223, - 236, 12, 15, 223, 235, 12, 15, 223, 234, 12, 15, 223, 233, 12, 15, 223, - 232, 12, 15, 223, 231, 8, 2, 34, 233, 27, 8, 2, 34, 233, 23, 8, 2, 34, - 232, 220, 8, 2, 34, 233, 26, 8, 2, 34, 233, 25, 8, 2, 34, 179, 206, 9, - 200, 43, 8, 2, 34, 201, 118, 250, 249, 2, 34, 216, 187, 212, 253, 250, - 249, 2, 34, 216, 187, 234, 195, 250, 249, 2, 34, 216, 187, 223, 131, 250, - 249, 2, 34, 195, 75, 212, 253, 250, 249, 2, 34, 216, 187, 192, 212, 136, - 1, 191, 251, 4, 229, 119, 136, 209, 62, 222, 181, 195, 166, 136, 34, 192, - 31, 191, 251, 191, 251, 210, 88, 136, 1, 251, 152, 250, 126, 136, 1, 193, - 78, 251, 192, 136, 1, 193, 78, 237, 253, 136, 1, 193, 78, 229, 245, 136, - 1, 193, 78, 222, 106, 136, 1, 193, 78, 220, 27, 136, 1, 193, 78, 53, 216, - 193, 136, 1, 193, 78, 207, 38, 136, 1, 193, 78, 199, 162, 136, 1, 251, - 152, 108, 56, 136, 1, 203, 70, 4, 203, 70, 236, 140, 136, 1, 203, 70, 4, - 202, 175, 236, 140, 136, 1, 203, 70, 4, 238, 17, 23, 203, 70, 236, 140, - 136, 1, 203, 70, 4, 238, 17, 23, 202, 175, 236, 140, 136, 1, 131, 4, 210, - 88, 136, 1, 131, 4, 208, 84, 136, 1, 131, 4, 217, 70, 136, 1, 248, 215, - 4, 238, 16, 136, 1, 231, 39, 4, 238, 16, 136, 1, 237, 254, 4, 238, 16, - 136, 1, 229, 246, 4, 217, 70, 136, 1, 195, 159, 4, 238, 16, 136, 1, 191, - 92, 4, 238, 16, 136, 1, 199, 74, 4, 238, 16, 136, 1, 191, 251, 4, 238, - 16, 136, 1, 53, 222, 107, 4, 238, 16, 136, 1, 222, 107, 4, 238, 16, 136, - 1, 220, 28, 4, 238, 16, 136, 1, 216, 194, 4, 238, 16, 136, 1, 212, 131, - 4, 238, 16, 136, 1, 205, 149, 4, 238, 16, 136, 1, 53, 210, 64, 4, 238, - 16, 136, 1, 210, 64, 4, 238, 16, 136, 1, 197, 164, 4, 238, 16, 136, 1, - 208, 43, 4, 238, 16, 136, 1, 207, 39, 4, 238, 16, 136, 1, 203, 70, 4, - 238, 16, 136, 1, 199, 163, 4, 238, 16, 136, 1, 195, 159, 4, 229, 7, 136, - 1, 248, 215, 4, 207, 161, 136, 1, 222, 107, 4, 207, 161, 136, 1, 210, 64, - 4, 207, 161, 136, 34, 131, 220, 27, 9, 1, 131, 193, 151, 76, 20, 9, 1, - 131, 193, 151, 53, 20, 9, 1, 249, 0, 76, 20, 9, 1, 249, 0, 53, 20, 9, 1, - 249, 0, 89, 20, 9, 1, 249, 0, 216, 217, 20, 9, 1, 210, 42, 76, 20, 9, 1, - 210, 42, 53, 20, 9, 1, 210, 42, 89, 20, 9, 1, 210, 42, 216, 217, 20, 9, - 1, 248, 244, 76, 20, 9, 1, 248, 244, 53, 20, 9, 1, 248, 244, 89, 20, 9, - 1, 248, 244, 216, 217, 20, 9, 1, 197, 123, 76, 20, 9, 1, 197, 123, 53, - 20, 9, 1, 197, 123, 89, 20, 9, 1, 197, 123, 216, 217, 20, 9, 1, 199, 113, - 76, 20, 9, 1, 199, 113, 53, 20, 9, 1, 199, 113, 89, 20, 9, 1, 199, 113, - 216, 217, 20, 9, 1, 197, 125, 76, 20, 9, 1, 197, 125, 53, 20, 9, 1, 197, - 125, 89, 20, 9, 1, 197, 125, 216, 217, 20, 9, 1, 195, 147, 76, 20, 9, 1, - 195, 147, 53, 20, 9, 1, 195, 147, 89, 20, 9, 1, 195, 147, 216, 217, 20, - 9, 1, 210, 40, 76, 20, 9, 1, 210, 40, 53, 20, 9, 1, 210, 40, 89, 20, 9, - 1, 210, 40, 216, 217, 20, 9, 1, 235, 42, 76, 20, 9, 1, 235, 42, 53, 20, - 9, 1, 235, 42, 89, 20, 9, 1, 235, 42, 216, 217, 20, 9, 1, 212, 88, 76, - 20, 9, 1, 212, 88, 53, 20, 9, 1, 212, 88, 89, 20, 9, 1, 212, 88, 216, - 217, 20, 9, 1, 199, 150, 76, 20, 9, 1, 199, 150, 53, 20, 9, 1, 199, 150, - 89, 20, 9, 1, 199, 150, 216, 217, 20, 9, 1, 199, 148, 76, 20, 9, 1, 199, - 148, 53, 20, 9, 1, 199, 148, 89, 20, 9, 1, 199, 148, 216, 217, 20, 9, 1, - 237, 189, 76, 20, 9, 1, 237, 189, 53, 20, 9, 1, 238, 11, 76, 20, 9, 1, - 238, 11, 53, 20, 9, 1, 235, 79, 76, 20, 9, 1, 235, 79, 53, 20, 9, 1, 237, - 187, 76, 20, 9, 1, 237, 187, 53, 20, 9, 1, 223, 4, 76, 20, 9, 1, 223, 4, - 53, 20, 9, 1, 206, 102, 76, 20, 9, 1, 206, 102, 53, 20, 9, 1, 222, 5, 76, - 20, 9, 1, 222, 5, 53, 20, 9, 1, 222, 5, 89, 20, 9, 1, 222, 5, 216, 217, - 20, 9, 1, 231, 228, 76, 20, 9, 1, 231, 228, 53, 20, 9, 1, 231, 228, 89, - 20, 9, 1, 231, 228, 216, 217, 20, 9, 1, 230, 167, 76, 20, 9, 1, 230, 167, - 53, 20, 9, 1, 230, 167, 89, 20, 9, 1, 230, 167, 216, 217, 20, 9, 1, 213, - 248, 76, 20, 9, 1, 213, 248, 53, 20, 9, 1, 213, 248, 89, 20, 9, 1, 213, - 248, 216, 217, 20, 9, 1, 213, 25, 231, 58, 76, 20, 9, 1, 213, 25, 231, - 58, 53, 20, 9, 1, 206, 166, 76, 20, 9, 1, 206, 166, 53, 20, 9, 1, 206, - 166, 89, 20, 9, 1, 206, 166, 216, 217, 20, 9, 1, 229, 211, 4, 99, 93, 76, - 20, 9, 1, 229, 211, 4, 99, 93, 53, 20, 9, 1, 229, 211, 231, 1, 76, 20, 9, - 1, 229, 211, 231, 1, 53, 20, 9, 1, 229, 211, 231, 1, 89, 20, 9, 1, 229, - 211, 231, 1, 216, 217, 20, 9, 1, 229, 211, 236, 171, 76, 20, 9, 1, 229, - 211, 236, 171, 53, 20, 9, 1, 229, 211, 236, 171, 89, 20, 9, 1, 229, 211, - 236, 171, 216, 217, 20, 9, 1, 99, 249, 81, 76, 20, 9, 1, 99, 249, 81, 53, - 20, 9, 1, 99, 249, 81, 4, 230, 58, 93, 76, 20, 9, 1, 99, 249, 81, 4, 230, - 58, 93, 53, 20, 9, 16, 75, 58, 9, 16, 75, 60, 9, 16, 105, 185, 58, 9, 16, - 105, 185, 60, 9, 16, 115, 185, 58, 9, 16, 115, 185, 60, 9, 16, 115, 185, - 209, 58, 235, 119, 58, 9, 16, 115, 185, 209, 58, 235, 119, 60, 9, 16, - 232, 128, 185, 58, 9, 16, 232, 128, 185, 60, 9, 16, 55, 81, 249, 88, 60, - 9, 16, 105, 185, 195, 85, 58, 9, 16, 105, 185, 195, 85, 60, 9, 16, 206, - 188, 9, 16, 2, 199, 220, 58, 9, 16, 2, 199, 220, 60, 9, 16, 193, 151, 58, - 9, 1, 214, 71, 76, 20, 9, 1, 214, 71, 53, 20, 9, 1, 214, 71, 89, 20, 9, - 1, 214, 71, 216, 217, 20, 9, 1, 126, 76, 20, 9, 1, 126, 53, 20, 9, 1, - 211, 152, 76, 20, 9, 1, 211, 152, 53, 20, 9, 1, 191, 226, 76, 20, 9, 1, - 191, 226, 53, 20, 9, 1, 126, 4, 230, 58, 93, 76, 20, 9, 1, 195, 154, 76, - 20, 9, 1, 195, 154, 53, 20, 9, 1, 221, 132, 211, 152, 76, 20, 9, 1, 221, - 132, 211, 152, 53, 20, 9, 1, 221, 132, 191, 226, 76, 20, 9, 1, 221, 132, - 191, 226, 53, 20, 9, 1, 235, 15, 76, 20, 9, 1, 235, 15, 53, 20, 9, 1, - 235, 15, 89, 20, 9, 1, 235, 15, 216, 217, 20, 9, 1, 196, 137, 222, 26, - 221, 132, 131, 217, 100, 89, 20, 9, 1, 196, 137, 222, 26, 221, 132, 131, - 217, 100, 216, 217, 20, 9, 34, 99, 4, 230, 58, 93, 4, 131, 76, 20, 9, 34, - 99, 4, 230, 58, 93, 4, 131, 53, 20, 9, 34, 99, 4, 230, 58, 93, 4, 252, - 26, 76, 20, 9, 34, 99, 4, 230, 58, 93, 4, 252, 26, 53, 20, 9, 34, 99, 4, - 230, 58, 93, 4, 193, 134, 76, 20, 9, 34, 99, 4, 230, 58, 93, 4, 193, 134, - 53, 20, 9, 34, 99, 4, 230, 58, 93, 4, 126, 76, 20, 9, 34, 99, 4, 230, 58, - 93, 4, 126, 53, 20, 9, 34, 99, 4, 230, 58, 93, 4, 211, 152, 76, 20, 9, - 34, 99, 4, 230, 58, 93, 4, 211, 152, 53, 20, 9, 34, 99, 4, 230, 58, 93, - 4, 191, 226, 76, 20, 9, 34, 99, 4, 230, 58, 93, 4, 191, 226, 53, 20, 9, - 34, 99, 4, 230, 58, 93, 4, 235, 15, 76, 20, 9, 34, 99, 4, 230, 58, 93, 4, - 235, 15, 53, 20, 9, 34, 99, 4, 230, 58, 93, 4, 235, 15, 89, 20, 9, 34, - 196, 137, 221, 132, 99, 4, 230, 58, 93, 4, 131, 217, 100, 76, 20, 9, 34, - 196, 137, 221, 132, 99, 4, 230, 58, 93, 4, 131, 217, 100, 53, 20, 9, 34, - 196, 137, 221, 132, 99, 4, 230, 58, 93, 4, 131, 217, 100, 89, 20, 9, 1, - 233, 74, 99, 76, 20, 9, 1, 233, 74, 99, 53, 20, 9, 1, 233, 74, 99, 89, - 20, 9, 1, 233, 74, 99, 216, 217, 20, 9, 34, 99, 4, 230, 58, 93, 4, 223, - 7, 76, 20, 9, 34, 99, 4, 230, 58, 93, 4, 182, 76, 20, 9, 34, 99, 4, 230, - 58, 93, 4, 92, 76, 20, 9, 34, 99, 4, 230, 58, 93, 4, 131, 217, 100, 76, - 20, 9, 34, 99, 4, 230, 58, 93, 4, 99, 76, 20, 9, 34, 248, 246, 4, 223, 7, - 76, 20, 9, 34, 248, 246, 4, 182, 76, 20, 9, 34, 248, 246, 4, 221, 211, - 76, 20, 9, 34, 248, 246, 4, 92, 76, 20, 9, 34, 248, 246, 4, 131, 217, - 100, 76, 20, 9, 34, 248, 246, 4, 99, 76, 20, 9, 34, 199, 115, 4, 223, 7, - 76, 20, 9, 34, 199, 115, 4, 182, 76, 20, 9, 34, 199, 115, 4, 221, 211, - 76, 20, 9, 34, 199, 115, 4, 92, 76, 20, 9, 34, 199, 115, 4, 131, 217, - 100, 76, 20, 9, 34, 199, 115, 4, 99, 76, 20, 9, 34, 199, 30, 4, 223, 7, - 76, 20, 9, 34, 199, 30, 4, 92, 76, 20, 9, 34, 199, 30, 4, 131, 217, 100, - 76, 20, 9, 34, 199, 30, 4, 99, 76, 20, 9, 34, 223, 7, 4, 182, 76, 20, 9, - 34, 223, 7, 4, 92, 76, 20, 9, 34, 182, 4, 223, 7, 76, 20, 9, 34, 182, 4, - 92, 76, 20, 9, 34, 221, 211, 4, 223, 7, 76, 20, 9, 34, 221, 211, 4, 182, - 76, 20, 9, 34, 221, 211, 4, 92, 76, 20, 9, 34, 205, 47, 4, 223, 7, 76, - 20, 9, 34, 205, 47, 4, 182, 76, 20, 9, 34, 205, 47, 4, 221, 211, 76, 20, - 9, 34, 205, 47, 4, 92, 76, 20, 9, 34, 205, 193, 4, 182, 76, 20, 9, 34, - 205, 193, 4, 92, 76, 20, 9, 34, 238, 27, 4, 223, 7, 76, 20, 9, 34, 238, - 27, 4, 182, 76, 20, 9, 34, 238, 27, 4, 221, 211, 76, 20, 9, 34, 238, 27, - 4, 92, 76, 20, 9, 34, 199, 220, 4, 182, 76, 20, 9, 34, 199, 220, 4, 92, - 76, 20, 9, 34, 191, 117, 4, 92, 76, 20, 9, 34, 251, 231, 4, 223, 7, 76, - 20, 9, 34, 251, 231, 4, 92, 76, 20, 9, 34, 231, 87, 4, 223, 7, 76, 20, 9, - 34, 231, 87, 4, 92, 76, 20, 9, 34, 233, 47, 4, 223, 7, 76, 20, 9, 34, - 233, 47, 4, 182, 76, 20, 9, 34, 233, 47, 4, 221, 211, 76, 20, 9, 34, 233, - 47, 4, 92, 76, 20, 9, 34, 233, 47, 4, 131, 217, 100, 76, 20, 9, 34, 233, - 47, 4, 99, 76, 20, 9, 34, 208, 90, 4, 182, 76, 20, 9, 34, 208, 90, 4, 92, - 76, 20, 9, 34, 208, 90, 4, 131, 217, 100, 76, 20, 9, 34, 208, 90, 4, 99, - 76, 20, 9, 34, 222, 107, 4, 131, 76, 20, 9, 34, 222, 107, 4, 223, 7, 76, - 20, 9, 34, 222, 107, 4, 182, 76, 20, 9, 34, 222, 107, 4, 221, 211, 76, - 20, 9, 34, 222, 107, 4, 220, 36, 76, 20, 9, 34, 222, 107, 4, 92, 76, 20, - 9, 34, 222, 107, 4, 131, 217, 100, 76, 20, 9, 34, 222, 107, 4, 99, 76, - 20, 9, 34, 220, 36, 4, 223, 7, 76, 20, 9, 34, 220, 36, 4, 182, 76, 20, 9, - 34, 220, 36, 4, 221, 211, 76, 20, 9, 34, 220, 36, 4, 92, 76, 20, 9, 34, - 220, 36, 4, 131, 217, 100, 76, 20, 9, 34, 220, 36, 4, 99, 76, 20, 9, 34, - 92, 4, 223, 7, 76, 20, 9, 34, 92, 4, 182, 76, 20, 9, 34, 92, 4, 221, 211, - 76, 20, 9, 34, 92, 4, 92, 76, 20, 9, 34, 92, 4, 131, 217, 100, 76, 20, 9, - 34, 92, 4, 99, 76, 20, 9, 34, 213, 25, 4, 223, 7, 76, 20, 9, 34, 213, 25, - 4, 182, 76, 20, 9, 34, 213, 25, 4, 221, 211, 76, 20, 9, 34, 213, 25, 4, - 92, 76, 20, 9, 34, 213, 25, 4, 131, 217, 100, 76, 20, 9, 34, 213, 25, 4, - 99, 76, 20, 9, 34, 229, 211, 4, 223, 7, 76, 20, 9, 34, 229, 211, 4, 92, - 76, 20, 9, 34, 229, 211, 4, 131, 217, 100, 76, 20, 9, 34, 229, 211, 4, - 99, 76, 20, 9, 34, 99, 4, 223, 7, 76, 20, 9, 34, 99, 4, 182, 76, 20, 9, - 34, 99, 4, 221, 211, 76, 20, 9, 34, 99, 4, 92, 76, 20, 9, 34, 99, 4, 131, - 217, 100, 76, 20, 9, 34, 99, 4, 99, 76, 20, 9, 34, 199, 42, 4, 200, 182, - 131, 76, 20, 9, 34, 207, 72, 4, 200, 182, 131, 76, 20, 9, 34, 131, 217, - 100, 4, 200, 182, 131, 76, 20, 9, 34, 203, 156, 4, 237, 244, 76, 20, 9, - 34, 203, 156, 4, 222, 51, 76, 20, 9, 34, 203, 156, 4, 233, 71, 76, 20, 9, - 34, 203, 156, 4, 237, 246, 76, 20, 9, 34, 203, 156, 4, 222, 53, 76, 20, - 9, 34, 203, 156, 4, 200, 182, 131, 76, 20, 9, 34, 99, 4, 230, 58, 93, 4, - 207, 72, 53, 20, 9, 34, 99, 4, 230, 58, 93, 4, 191, 114, 53, 20, 9, 34, - 99, 4, 230, 58, 93, 4, 92, 53, 20, 9, 34, 99, 4, 230, 58, 93, 4, 213, 25, - 53, 20, 9, 34, 99, 4, 230, 58, 93, 4, 131, 217, 100, 53, 20, 9, 34, 99, - 4, 230, 58, 93, 4, 99, 53, 20, 9, 34, 248, 246, 4, 207, 72, 53, 20, 9, - 34, 248, 246, 4, 191, 114, 53, 20, 9, 34, 248, 246, 4, 92, 53, 20, 9, 34, - 248, 246, 4, 213, 25, 53, 20, 9, 34, 248, 246, 4, 131, 217, 100, 53, 20, - 9, 34, 248, 246, 4, 99, 53, 20, 9, 34, 199, 115, 4, 207, 72, 53, 20, 9, - 34, 199, 115, 4, 191, 114, 53, 20, 9, 34, 199, 115, 4, 92, 53, 20, 9, 34, - 199, 115, 4, 213, 25, 53, 20, 9, 34, 199, 115, 4, 131, 217, 100, 53, 20, - 9, 34, 199, 115, 4, 99, 53, 20, 9, 34, 199, 30, 4, 207, 72, 53, 20, 9, - 34, 199, 30, 4, 191, 114, 53, 20, 9, 34, 199, 30, 4, 92, 53, 20, 9, 34, - 199, 30, 4, 213, 25, 53, 20, 9, 34, 199, 30, 4, 131, 217, 100, 53, 20, 9, - 34, 199, 30, 4, 99, 53, 20, 9, 34, 233, 47, 4, 131, 217, 100, 53, 20, 9, - 34, 233, 47, 4, 99, 53, 20, 9, 34, 208, 90, 4, 131, 217, 100, 53, 20, 9, - 34, 208, 90, 4, 99, 53, 20, 9, 34, 222, 107, 4, 131, 53, 20, 9, 34, 222, - 107, 4, 220, 36, 53, 20, 9, 34, 222, 107, 4, 92, 53, 20, 9, 34, 222, 107, - 4, 131, 217, 100, 53, 20, 9, 34, 222, 107, 4, 99, 53, 20, 9, 34, 220, 36, - 4, 92, 53, 20, 9, 34, 220, 36, 4, 131, 217, 100, 53, 20, 9, 34, 220, 36, - 4, 99, 53, 20, 9, 34, 92, 4, 131, 53, 20, 9, 34, 92, 4, 92, 53, 20, 9, - 34, 213, 25, 4, 207, 72, 53, 20, 9, 34, 213, 25, 4, 191, 114, 53, 20, 9, - 34, 213, 25, 4, 92, 53, 20, 9, 34, 213, 25, 4, 213, 25, 53, 20, 9, 34, - 213, 25, 4, 131, 217, 100, 53, 20, 9, 34, 213, 25, 4, 99, 53, 20, 9, 34, - 131, 217, 100, 4, 200, 182, 131, 53, 20, 9, 34, 99, 4, 207, 72, 53, 20, - 9, 34, 99, 4, 191, 114, 53, 20, 9, 34, 99, 4, 92, 53, 20, 9, 34, 99, 4, - 213, 25, 53, 20, 9, 34, 99, 4, 131, 217, 100, 53, 20, 9, 34, 99, 4, 99, - 53, 20, 9, 34, 99, 4, 230, 58, 93, 4, 223, 7, 89, 20, 9, 34, 99, 4, 230, - 58, 93, 4, 182, 89, 20, 9, 34, 99, 4, 230, 58, 93, 4, 221, 211, 89, 20, - 9, 34, 99, 4, 230, 58, 93, 4, 92, 89, 20, 9, 34, 99, 4, 230, 58, 93, 4, - 229, 211, 89, 20, 9, 34, 248, 246, 4, 223, 7, 89, 20, 9, 34, 248, 246, 4, - 182, 89, 20, 9, 34, 248, 246, 4, 221, 211, 89, 20, 9, 34, 248, 246, 4, - 92, 89, 20, 9, 34, 248, 246, 4, 229, 211, 89, 20, 9, 34, 199, 115, 4, - 223, 7, 89, 20, 9, 34, 199, 115, 4, 182, 89, 20, 9, 34, 199, 115, 4, 221, - 211, 89, 20, 9, 34, 199, 115, 4, 92, 89, 20, 9, 34, 199, 115, 4, 229, - 211, 89, 20, 9, 34, 199, 30, 4, 92, 89, 20, 9, 34, 223, 7, 4, 182, 89, - 20, 9, 34, 223, 7, 4, 92, 89, 20, 9, 34, 182, 4, 223, 7, 89, 20, 9, 34, - 182, 4, 92, 89, 20, 9, 34, 221, 211, 4, 223, 7, 89, 20, 9, 34, 221, 211, - 4, 92, 89, 20, 9, 34, 205, 47, 4, 223, 7, 89, 20, 9, 34, 205, 47, 4, 182, - 89, 20, 9, 34, 205, 47, 4, 221, 211, 89, 20, 9, 34, 205, 47, 4, 92, 89, - 20, 9, 34, 205, 193, 4, 182, 89, 20, 9, 34, 205, 193, 4, 221, 211, 89, - 20, 9, 34, 205, 193, 4, 92, 89, 20, 9, 34, 238, 27, 4, 223, 7, 89, 20, 9, - 34, 238, 27, 4, 182, 89, 20, 9, 34, 238, 27, 4, 221, 211, 89, 20, 9, 34, - 238, 27, 4, 92, 89, 20, 9, 34, 199, 220, 4, 182, 89, 20, 9, 34, 191, 117, - 4, 92, 89, 20, 9, 34, 251, 231, 4, 223, 7, 89, 20, 9, 34, 251, 231, 4, - 92, 89, 20, 9, 34, 231, 87, 4, 223, 7, 89, 20, 9, 34, 231, 87, 4, 92, 89, - 20, 9, 34, 233, 47, 4, 223, 7, 89, 20, 9, 34, 233, 47, 4, 182, 89, 20, 9, - 34, 233, 47, 4, 221, 211, 89, 20, 9, 34, 233, 47, 4, 92, 89, 20, 9, 34, - 208, 90, 4, 182, 89, 20, 9, 34, 208, 90, 4, 92, 89, 20, 9, 34, 222, 107, - 4, 223, 7, 89, 20, 9, 34, 222, 107, 4, 182, 89, 20, 9, 34, 222, 107, 4, - 221, 211, 89, 20, 9, 34, 222, 107, 4, 220, 36, 89, 20, 9, 34, 222, 107, - 4, 92, 89, 20, 9, 34, 220, 36, 4, 223, 7, 89, 20, 9, 34, 220, 36, 4, 182, - 89, 20, 9, 34, 220, 36, 4, 221, 211, 89, 20, 9, 34, 220, 36, 4, 92, 89, - 20, 9, 34, 220, 36, 4, 229, 211, 89, 20, 9, 34, 92, 4, 223, 7, 89, 20, 9, - 34, 92, 4, 182, 89, 20, 9, 34, 92, 4, 221, 211, 89, 20, 9, 34, 92, 4, 92, - 89, 20, 9, 34, 213, 25, 4, 223, 7, 89, 20, 9, 34, 213, 25, 4, 182, 89, - 20, 9, 34, 213, 25, 4, 221, 211, 89, 20, 9, 34, 213, 25, 4, 92, 89, 20, - 9, 34, 213, 25, 4, 229, 211, 89, 20, 9, 34, 229, 211, 4, 223, 7, 89, 20, - 9, 34, 229, 211, 4, 92, 89, 20, 9, 34, 229, 211, 4, 200, 182, 131, 89, - 20, 9, 34, 99, 4, 223, 7, 89, 20, 9, 34, 99, 4, 182, 89, 20, 9, 34, 99, - 4, 221, 211, 89, 20, 9, 34, 99, 4, 92, 89, 20, 9, 34, 99, 4, 229, 211, - 89, 20, 9, 34, 99, 4, 230, 58, 93, 4, 92, 216, 217, 20, 9, 34, 99, 4, - 230, 58, 93, 4, 229, 211, 216, 217, 20, 9, 34, 248, 246, 4, 92, 216, 217, - 20, 9, 34, 248, 246, 4, 229, 211, 216, 217, 20, 9, 34, 199, 115, 4, 92, - 216, 217, 20, 9, 34, 199, 115, 4, 229, 211, 216, 217, 20, 9, 34, 199, 30, - 4, 92, 216, 217, 20, 9, 34, 199, 30, 4, 229, 211, 216, 217, 20, 9, 34, - 205, 47, 4, 92, 216, 217, 20, 9, 34, 205, 47, 4, 229, 211, 216, 217, 20, - 9, 34, 203, 110, 4, 92, 216, 217, 20, 9, 34, 203, 110, 4, 229, 211, 216, - 217, 20, 9, 34, 222, 107, 4, 220, 36, 216, 217, 20, 9, 34, 222, 107, 4, - 92, 216, 217, 20, 9, 34, 220, 36, 4, 92, 216, 217, 20, 9, 34, 213, 25, 4, - 92, 216, 217, 20, 9, 34, 213, 25, 4, 229, 211, 216, 217, 20, 9, 34, 99, - 4, 92, 216, 217, 20, 9, 34, 99, 4, 229, 211, 216, 217, 20, 9, 34, 203, - 156, 4, 233, 71, 216, 217, 20, 9, 34, 203, 156, 4, 237, 246, 216, 217, - 20, 9, 34, 203, 156, 4, 222, 53, 216, 217, 20, 9, 34, 199, 220, 4, 131, - 217, 100, 76, 20, 9, 34, 199, 220, 4, 99, 76, 20, 9, 34, 251, 231, 4, - 131, 217, 100, 76, 20, 9, 34, 251, 231, 4, 99, 76, 20, 9, 34, 231, 87, 4, - 131, 217, 100, 76, 20, 9, 34, 231, 87, 4, 99, 76, 20, 9, 34, 205, 47, 4, - 131, 217, 100, 76, 20, 9, 34, 205, 47, 4, 99, 76, 20, 9, 34, 203, 110, 4, - 131, 217, 100, 76, 20, 9, 34, 203, 110, 4, 99, 76, 20, 9, 34, 182, 4, - 131, 217, 100, 76, 20, 9, 34, 182, 4, 99, 76, 20, 9, 34, 223, 7, 4, 131, - 217, 100, 76, 20, 9, 34, 223, 7, 4, 99, 76, 20, 9, 34, 221, 211, 4, 131, - 217, 100, 76, 20, 9, 34, 221, 211, 4, 99, 76, 20, 9, 34, 205, 193, 4, - 131, 217, 100, 76, 20, 9, 34, 205, 193, 4, 99, 76, 20, 9, 34, 238, 27, 4, - 131, 217, 100, 76, 20, 9, 34, 238, 27, 4, 99, 76, 20, 9, 34, 203, 110, 4, - 223, 7, 76, 20, 9, 34, 203, 110, 4, 182, 76, 20, 9, 34, 203, 110, 4, 221, - 211, 76, 20, 9, 34, 203, 110, 4, 92, 76, 20, 9, 34, 203, 110, 4, 207, 72, - 76, 20, 9, 34, 205, 47, 4, 207, 72, 76, 20, 9, 34, 205, 193, 4, 207, 72, - 76, 20, 9, 34, 238, 27, 4, 207, 72, 76, 20, 9, 34, 199, 220, 4, 131, 217, - 100, 53, 20, 9, 34, 199, 220, 4, 99, 53, 20, 9, 34, 251, 231, 4, 131, - 217, 100, 53, 20, 9, 34, 251, 231, 4, 99, 53, 20, 9, 34, 231, 87, 4, 131, - 217, 100, 53, 20, 9, 34, 231, 87, 4, 99, 53, 20, 9, 34, 205, 47, 4, 131, - 217, 100, 53, 20, 9, 34, 205, 47, 4, 99, 53, 20, 9, 34, 203, 110, 4, 131, - 217, 100, 53, 20, 9, 34, 203, 110, 4, 99, 53, 20, 9, 34, 182, 4, 131, - 217, 100, 53, 20, 9, 34, 182, 4, 99, 53, 20, 9, 34, 223, 7, 4, 131, 217, - 100, 53, 20, 9, 34, 223, 7, 4, 99, 53, 20, 9, 34, 221, 211, 4, 131, 217, - 100, 53, 20, 9, 34, 221, 211, 4, 99, 53, 20, 9, 34, 205, 193, 4, 131, - 217, 100, 53, 20, 9, 34, 205, 193, 4, 99, 53, 20, 9, 34, 238, 27, 4, 131, - 217, 100, 53, 20, 9, 34, 238, 27, 4, 99, 53, 20, 9, 34, 203, 110, 4, 223, - 7, 53, 20, 9, 34, 203, 110, 4, 182, 53, 20, 9, 34, 203, 110, 4, 221, 211, - 53, 20, 9, 34, 203, 110, 4, 92, 53, 20, 9, 34, 203, 110, 4, 207, 72, 53, - 20, 9, 34, 205, 47, 4, 207, 72, 53, 20, 9, 34, 205, 193, 4, 207, 72, 53, - 20, 9, 34, 238, 27, 4, 207, 72, 53, 20, 9, 34, 203, 110, 4, 223, 7, 89, - 20, 9, 34, 203, 110, 4, 182, 89, 20, 9, 34, 203, 110, 4, 221, 211, 89, - 20, 9, 34, 203, 110, 4, 92, 89, 20, 9, 34, 205, 47, 4, 229, 211, 89, 20, - 9, 34, 203, 110, 4, 229, 211, 89, 20, 9, 34, 199, 220, 4, 92, 89, 20, 9, - 34, 205, 47, 4, 223, 7, 216, 217, 20, 9, 34, 205, 47, 4, 182, 216, 217, - 20, 9, 34, 205, 47, 4, 221, 211, 216, 217, 20, 9, 34, 203, 110, 4, 223, - 7, 216, 217, 20, 9, 34, 203, 110, 4, 182, 216, 217, 20, 9, 34, 203, 110, - 4, 221, 211, 216, 217, 20, 9, 34, 199, 220, 4, 92, 216, 217, 20, 9, 34, - 191, 117, 4, 92, 216, 217, 20, 9, 34, 131, 4, 233, 69, 53, 20, 9, 34, - 131, 4, 233, 69, 76, 20, 211, 40, 45, 210, 113, 211, 40, 50, 210, 113, 9, - 34, 207, 159, 251, 173, 9, 34, 207, 167, 251, 172, 251, 107, 9, 34, 207, - 167, 251, 172, 251, 106, 9, 34, 207, 167, 251, 172, 251, 104, 9, 34, 207, - 167, 251, 172, 251, 103, 9, 34, 207, 167, 251, 172, 251, 102, 9, 34, 205, - 162, 251, 197, 193, 184, 9, 34, 251, 197, 250, 217, 9, 34, 251, 196, 250, - 217, 9, 34, 251, 195, 250, 217, 9, 34, 251, 197, 250, 216, 193, 154, 9, - 34, 208, 17, 202, 140, 9, 34, 205, 160, 251, 197, 193, 180, 193, 183, 9, - 34, 251, 200, 250, 217, 9, 34, 199, 235, 193, 182, 9, 34, 207, 158, 251, - 173, 9, 34, 199, 115, 4, 223, 7, 4, 92, 89, 20, 9, 34, 199, 115, 4, 182, - 4, 223, 7, 53, 20, 9, 34, 199, 115, 4, 182, 4, 223, 7, 89, 20, 9, 34, - 199, 115, 4, 182, 4, 92, 89, 20, 9, 34, 199, 115, 4, 221, 211, 4, 92, 89, - 20, 9, 34, 199, 115, 4, 92, 4, 223, 7, 89, 20, 9, 34, 199, 115, 4, 92, 4, - 182, 89, 20, 9, 34, 199, 115, 4, 92, 4, 221, 211, 89, 20, 9, 34, 223, 7, - 4, 92, 4, 182, 53, 20, 9, 34, 223, 7, 4, 92, 4, 182, 89, 20, 9, 34, 182, - 4, 92, 4, 99, 53, 20, 9, 34, 182, 4, 92, 4, 131, 217, 100, 53, 20, 9, 34, - 205, 47, 4, 182, 4, 223, 7, 89, 20, 9, 34, 205, 47, 4, 223, 7, 4, 182, - 89, 20, 9, 34, 205, 47, 4, 223, 7, 4, 131, 217, 100, 53, 20, 9, 34, 205, - 47, 4, 92, 4, 182, 53, 20, 9, 34, 205, 47, 4, 92, 4, 182, 89, 20, 9, 34, - 205, 47, 4, 92, 4, 223, 7, 89, 20, 9, 34, 205, 47, 4, 92, 4, 92, 53, 20, - 9, 34, 205, 47, 4, 92, 4, 92, 89, 20, 9, 34, 205, 193, 4, 182, 4, 182, - 53, 20, 9, 34, 205, 193, 4, 182, 4, 182, 89, 20, 9, 34, 205, 193, 4, 92, - 4, 92, 53, 20, 9, 34, 203, 110, 4, 182, 4, 92, 53, 20, 9, 34, 203, 110, - 4, 182, 4, 92, 89, 20, 9, 34, 203, 110, 4, 223, 7, 4, 99, 53, 20, 9, 34, - 203, 110, 4, 92, 4, 221, 211, 53, 20, 9, 34, 203, 110, 4, 92, 4, 221, - 211, 89, 20, 9, 34, 203, 110, 4, 92, 4, 92, 53, 20, 9, 34, 203, 110, 4, - 92, 4, 92, 89, 20, 9, 34, 238, 27, 4, 182, 4, 131, 217, 100, 53, 20, 9, - 34, 238, 27, 4, 221, 211, 4, 92, 53, 20, 9, 34, 238, 27, 4, 221, 211, 4, - 92, 89, 20, 9, 34, 199, 220, 4, 92, 4, 182, 53, 20, 9, 34, 199, 220, 4, - 92, 4, 182, 89, 20, 9, 34, 199, 220, 4, 92, 4, 92, 89, 20, 9, 34, 199, - 220, 4, 92, 4, 99, 53, 20, 9, 34, 251, 231, 4, 223, 7, 4, 92, 53, 20, 9, - 34, 251, 231, 4, 92, 4, 92, 53, 20, 9, 34, 251, 231, 4, 92, 4, 92, 89, - 20, 9, 34, 251, 231, 4, 92, 4, 131, 217, 100, 53, 20, 9, 34, 231, 87, 4, - 92, 4, 92, 53, 20, 9, 34, 231, 87, 4, 92, 4, 99, 53, 20, 9, 34, 231, 87, - 4, 92, 4, 131, 217, 100, 53, 20, 9, 34, 233, 47, 4, 221, 211, 4, 92, 53, - 20, 9, 34, 233, 47, 4, 221, 211, 4, 92, 89, 20, 9, 34, 208, 90, 4, 92, 4, - 182, 53, 20, 9, 34, 208, 90, 4, 92, 4, 92, 53, 20, 9, 34, 220, 36, 4, - 182, 4, 92, 53, 20, 9, 34, 220, 36, 4, 182, 4, 99, 53, 20, 9, 34, 220, - 36, 4, 182, 4, 131, 217, 100, 53, 20, 9, 34, 220, 36, 4, 223, 7, 4, 223, - 7, 89, 20, 9, 34, 220, 36, 4, 223, 7, 4, 223, 7, 53, 20, 9, 34, 220, 36, - 4, 221, 211, 4, 92, 53, 20, 9, 34, 220, 36, 4, 221, 211, 4, 92, 89, 20, - 9, 34, 220, 36, 4, 92, 4, 182, 53, 20, 9, 34, 220, 36, 4, 92, 4, 182, 89, - 20, 9, 34, 92, 4, 182, 4, 223, 7, 89, 20, 9, 34, 92, 4, 182, 4, 92, 89, - 20, 9, 34, 92, 4, 182, 4, 99, 53, 20, 9, 34, 92, 4, 223, 7, 4, 182, 89, - 20, 9, 34, 92, 4, 223, 7, 4, 92, 89, 20, 9, 34, 92, 4, 221, 211, 4, 223, - 7, 89, 20, 9, 34, 92, 4, 221, 211, 4, 92, 89, 20, 9, 34, 92, 4, 223, 7, - 4, 221, 211, 89, 20, 9, 34, 229, 211, 4, 92, 4, 223, 7, 89, 20, 9, 34, - 229, 211, 4, 92, 4, 92, 89, 20, 9, 34, 213, 25, 4, 182, 4, 92, 89, 20, 9, - 34, 213, 25, 4, 182, 4, 131, 217, 100, 53, 20, 9, 34, 213, 25, 4, 223, 7, - 4, 92, 53, 20, 9, 34, 213, 25, 4, 223, 7, 4, 92, 89, 20, 9, 34, 213, 25, - 4, 223, 7, 4, 131, 217, 100, 53, 20, 9, 34, 213, 25, 4, 92, 4, 99, 53, - 20, 9, 34, 213, 25, 4, 92, 4, 131, 217, 100, 53, 20, 9, 34, 99, 4, 92, 4, - 92, 53, 20, 9, 34, 99, 4, 92, 4, 92, 89, 20, 9, 34, 248, 246, 4, 221, - 211, 4, 99, 53, 20, 9, 34, 199, 115, 4, 223, 7, 4, 99, 53, 20, 9, 34, - 199, 115, 4, 223, 7, 4, 131, 217, 100, 53, 20, 9, 34, 199, 115, 4, 221, - 211, 4, 99, 53, 20, 9, 34, 199, 115, 4, 221, 211, 4, 131, 217, 100, 53, - 20, 9, 34, 199, 115, 4, 92, 4, 99, 53, 20, 9, 34, 199, 115, 4, 92, 4, - 131, 217, 100, 53, 20, 9, 34, 223, 7, 4, 92, 4, 99, 53, 20, 9, 34, 223, - 7, 4, 182, 4, 131, 217, 100, 53, 20, 9, 34, 223, 7, 4, 92, 4, 131, 217, - 100, 53, 20, 9, 34, 205, 47, 4, 221, 211, 4, 131, 217, 100, 53, 20, 9, - 34, 205, 193, 4, 182, 4, 99, 53, 20, 9, 34, 203, 110, 4, 182, 4, 99, 53, - 20, 9, 34, 238, 27, 4, 182, 4, 99, 53, 20, 9, 34, 220, 36, 4, 223, 7, 4, - 99, 53, 20, 9, 34, 220, 36, 4, 92, 4, 99, 53, 20, 9, 34, 99, 4, 182, 4, - 99, 53, 20, 9, 34, 99, 4, 223, 7, 4, 99, 53, 20, 9, 34, 99, 4, 92, 4, 99, - 53, 20, 9, 34, 92, 4, 92, 4, 99, 53, 20, 9, 34, 208, 90, 4, 92, 4, 99, - 53, 20, 9, 34, 213, 25, 4, 182, 4, 99, 53, 20, 9, 34, 208, 90, 4, 92, 4, - 182, 89, 20, 9, 34, 220, 36, 4, 182, 4, 92, 89, 20, 9, 34, 251, 231, 4, - 92, 4, 99, 53, 20, 9, 34, 222, 107, 4, 92, 4, 99, 53, 20, 9, 34, 213, 25, - 4, 223, 7, 4, 182, 89, 20, 9, 34, 92, 4, 221, 211, 4, 99, 53, 20, 9, 34, - 220, 36, 4, 223, 7, 4, 92, 89, 20, 9, 34, 222, 107, 4, 92, 4, 92, 53, 20, - 9, 34, 220, 36, 4, 223, 7, 4, 92, 53, 20, 9, 34, 213, 25, 4, 223, 7, 4, - 182, 53, 20, 9, 34, 223, 7, 4, 182, 4, 99, 53, 20, 9, 34, 182, 4, 223, 7, - 4, 99, 53, 20, 9, 34, 92, 4, 223, 7, 4, 99, 53, 20, 9, 34, 233, 47, 4, - 92, 4, 99, 53, 20, 9, 34, 248, 246, 4, 182, 4, 99, 53, 20, 9, 34, 222, - 107, 4, 92, 4, 92, 89, 20, 9, 34, 251, 231, 4, 223, 7, 4, 92, 89, 20, 9, - 34, 205, 193, 4, 92, 4, 92, 89, 20, 9, 34, 205, 47, 4, 221, 211, 4, 99, - 53, 20, 9, 34, 213, 25, 4, 223, 7, 4, 99, 53, 20, 9, 34, 205, 166, 251, - 194, 9, 34, 205, 163, 196, 40, 250, 220, 221, 33, 201, 64, 3, 76, 20, 9, - 34, 208, 86, 196, 40, 250, 220, 221, 33, 201, 64, 3, 76, 20, 9, 34, 251, - 171, 76, 20, 9, 34, 251, 213, 76, 20, 9, 34, 215, 235, 76, 20, 9, 34, - 205, 164, 76, 20, 9, 34, 207, 132, 76, 20, 9, 34, 251, 199, 76, 20, 9, - 34, 193, 153, 76, 20, 9, 34, 205, 163, 76, 20, 9, 34, 205, 161, 251, 199, - 193, 152, 9, 34, 223, 22, 206, 249, 56, 9, 34, 248, 151, 251, 31, 251, - 32, 9, 34, 200, 242, 193, 191, 199, 244, 9, 34, 250, 121, 193, 191, 223, - 23, 67, 205, 33, 67, 204, 178, 67, 204, 110, 67, 204, 99, 67, 204, 88, - 67, 204, 77, 67, 204, 66, 67, 204, 55, 67, 204, 44, 67, 205, 32, 67, 205, - 21, 67, 205, 10, 67, 204, 255, 67, 204, 244, 67, 204, 233, 67, 204, 222, - 208, 221, 232, 146, 40, 81, 242, 74, 208, 221, 232, 146, 40, 81, 154, - 242, 74, 208, 221, 232, 146, 40, 81, 154, 232, 80, 201, 63, 208, 221, - 232, 146, 40, 81, 242, 83, 208, 221, 232, 146, 40, 81, 204, 25, 208, 221, - 232, 146, 40, 81, 233, 216, 77, 208, 221, 232, 146, 40, 81, 208, 13, 77, - 208, 221, 232, 146, 40, 81, 45, 63, 219, 187, 248, 53, 208, 221, 232, - 146, 40, 81, 50, 63, 219, 187, 248, 49, 208, 221, 232, 146, 40, 81, 228, - 241, 234, 120, 33, 34, 45, 230, 70, 33, 34, 50, 230, 70, 33, 55, 198, - 153, 45, 230, 70, 33, 55, 198, 153, 50, 230, 70, 33, 217, 147, 45, 230, - 70, 33, 217, 147, 50, 230, 70, 33, 239, 44, 217, 146, 33, 34, 45, 132, - 60, 33, 34, 50, 132, 60, 33, 198, 153, 45, 132, 60, 33, 198, 153, 50, - 132, 60, 33, 217, 147, 45, 132, 60, 33, 217, 147, 50, 132, 60, 33, 239, - 44, 217, 147, 60, 33, 38, 198, 123, 45, 230, 70, 33, 38, 198, 123, 50, - 230, 70, 208, 221, 232, 146, 40, 81, 105, 75, 219, 236, 208, 221, 232, - 146, 40, 81, 234, 115, 237, 215, 208, 221, 232, 146, 40, 81, 234, 104, - 237, 215, 208, 221, 232, 146, 40, 81, 130, 219, 112, 208, 221, 232, 146, - 40, 81, 193, 135, 130, 219, 112, 208, 221, 232, 146, 40, 81, 45, 210, - 113, 208, 221, 232, 146, 40, 81, 50, 210, 113, 208, 221, 232, 146, 40, - 81, 45, 238, 171, 248, 53, 208, 221, 232, 146, 40, 81, 50, 238, 171, 248, - 53, 208, 221, 232, 146, 40, 81, 45, 198, 42, 203, 103, 248, 53, 208, 221, - 232, 146, 40, 81, 50, 198, 42, 203, 103, 248, 53, 208, 221, 232, 146, 40, - 81, 45, 62, 219, 187, 248, 53, 208, 221, 232, 146, 40, 81, 50, 62, 219, - 187, 248, 53, 208, 221, 232, 146, 40, 81, 45, 55, 251, 116, 248, 53, 208, - 221, 232, 146, 40, 81, 50, 55, 251, 116, 248, 53, 208, 221, 232, 146, 40, - 81, 45, 251, 116, 248, 53, 208, 221, 232, 146, 40, 81, 50, 251, 116, 248, - 53, 208, 221, 232, 146, 40, 81, 45, 239, 2, 248, 53, 208, 221, 232, 146, - 40, 81, 50, 239, 2, 248, 53, 208, 221, 232, 146, 40, 81, 45, 63, 239, 2, - 248, 53, 208, 221, 232, 146, 40, 81, 50, 63, 239, 2, 248, 53, 204, 0, - 236, 140, 63, 204, 0, 236, 140, 208, 221, 232, 146, 40, 81, 45, 51, 248, - 53, 208, 221, 232, 146, 40, 81, 50, 51, 248, 53, 237, 214, 210, 254, 247, - 18, 210, 254, 193, 135, 210, 254, 55, 193, 135, 210, 254, 237, 214, 130, - 219, 112, 247, 18, 130, 219, 112, 193, 135, 130, 219, 112, 2, 242, 74, 2, - 154, 242, 74, 2, 232, 80, 201, 63, 2, 204, 25, 2, 242, 83, 2, 208, 13, - 77, 2, 233, 216, 77, 2, 234, 115, 237, 215, 2, 45, 210, 113, 2, 50, 210, - 113, 2, 45, 238, 171, 248, 53, 2, 50, 238, 171, 248, 53, 2, 45, 198, 42, - 203, 103, 248, 53, 2, 50, 198, 42, 203, 103, 248, 53, 2, 31, 56, 2, 251, - 137, 2, 250, 193, 2, 108, 56, 2, 228, 87, 2, 219, 180, 56, 2, 230, 204, - 56, 2, 234, 43, 56, 2, 207, 19, 202, 23, 2, 236, 155, 56, 2, 210, 13, 56, - 2, 242, 72, 250, 182, 9, 233, 69, 76, 20, 9, 199, 169, 4, 233, 69, 58, 9, - 237, 244, 76, 20, 9, 199, 216, 232, 117, 9, 222, 51, 76, 20, 9, 233, 71, - 76, 20, 9, 233, 71, 216, 217, 20, 9, 237, 246, 76, 20, 9, 237, 246, 216, - 217, 20, 9, 222, 53, 76, 20, 9, 222, 53, 216, 217, 20, 9, 203, 156, 76, - 20, 9, 203, 156, 216, 217, 20, 9, 200, 207, 76, 20, 9, 200, 207, 216, - 217, 20, 9, 1, 230, 58, 76, 20, 9, 1, 131, 4, 217, 142, 93, 76, 20, 9, 1, - 131, 4, 217, 142, 93, 53, 20, 9, 1, 131, 4, 230, 58, 93, 76, 20, 9, 1, - 131, 4, 230, 58, 93, 53, 20, 9, 1, 193, 134, 4, 230, 58, 93, 76, 20, 9, - 1, 193, 134, 4, 230, 58, 93, 53, 20, 9, 1, 131, 4, 230, 58, 248, 233, 76, - 20, 9, 1, 131, 4, 230, 58, 248, 233, 53, 20, 9, 1, 99, 4, 230, 58, 93, - 76, 20, 9, 1, 99, 4, 230, 58, 93, 53, 20, 9, 1, 99, 4, 230, 58, 93, 89, - 20, 9, 1, 99, 4, 230, 58, 93, 216, 217, 20, 9, 1, 131, 76, 20, 9, 1, 131, - 53, 20, 9, 1, 248, 246, 76, 20, 9, 1, 248, 246, 53, 20, 9, 1, 248, 246, - 89, 20, 9, 1, 248, 246, 216, 217, 20, 9, 1, 199, 115, 217, 63, 76, 20, 9, - 1, 199, 115, 217, 63, 53, 20, 9, 1, 199, 115, 76, 20, 9, 1, 199, 115, 53, - 20, 9, 1, 199, 115, 89, 20, 9, 1, 199, 115, 216, 217, 20, 9, 1, 199, 30, - 76, 20, 9, 1, 199, 30, 53, 20, 9, 1, 199, 30, 89, 20, 9, 1, 199, 30, 216, - 217, 20, 9, 1, 223, 7, 76, 20, 9, 1, 223, 7, 53, 20, 9, 1, 223, 7, 89, - 20, 9, 1, 223, 7, 216, 217, 20, 9, 1, 182, 76, 20, 9, 1, 182, 53, 20, 9, - 1, 182, 89, 20, 9, 1, 182, 216, 217, 20, 9, 1, 221, 211, 76, 20, 9, 1, - 221, 211, 53, 20, 9, 1, 221, 211, 89, 20, 9, 1, 221, 211, 216, 217, 20, - 9, 1, 238, 4, 76, 20, 9, 1, 238, 4, 53, 20, 9, 1, 199, 42, 76, 20, 9, 1, - 199, 42, 53, 20, 9, 1, 207, 72, 76, 20, 9, 1, 207, 72, 53, 20, 9, 1, 191, - 114, 76, 20, 9, 1, 191, 114, 53, 20, 9, 1, 205, 47, 76, 20, 9, 1, 205, - 47, 53, 20, 9, 1, 205, 47, 89, 20, 9, 1, 205, 47, 216, 217, 20, 9, 1, - 203, 110, 76, 20, 9, 1, 203, 110, 53, 20, 9, 1, 203, 110, 89, 20, 9, 1, - 203, 110, 216, 217, 20, 9, 1, 205, 193, 76, 20, 9, 1, 205, 193, 53, 20, - 9, 1, 205, 193, 89, 20, 9, 1, 205, 193, 216, 217, 20, 9, 1, 238, 27, 76, - 20, 9, 1, 238, 27, 53, 20, 9, 1, 238, 27, 89, 20, 9, 1, 238, 27, 216, - 217, 20, 9, 1, 199, 220, 76, 20, 9, 1, 199, 220, 53, 20, 9, 1, 199, 220, - 89, 20, 9, 1, 199, 220, 216, 217, 20, 9, 1, 191, 117, 76, 20, 9, 1, 191, - 117, 53, 20, 9, 1, 191, 117, 89, 20, 9, 1, 191, 117, 216, 217, 20, 9, 1, - 251, 231, 76, 20, 9, 1, 251, 231, 53, 20, 9, 1, 251, 231, 89, 20, 9, 1, - 251, 231, 216, 217, 20, 9, 1, 231, 87, 76, 20, 9, 1, 231, 87, 53, 20, 9, - 1, 231, 87, 89, 20, 9, 1, 231, 87, 216, 217, 20, 9, 1, 233, 47, 76, 20, - 9, 1, 233, 47, 53, 20, 9, 1, 233, 47, 89, 20, 9, 1, 233, 47, 216, 217, - 20, 9, 1, 208, 90, 76, 20, 9, 1, 208, 90, 53, 20, 9, 1, 208, 90, 89, 20, - 9, 1, 208, 90, 216, 217, 20, 9, 1, 222, 107, 76, 20, 9, 1, 222, 107, 53, - 20, 9, 1, 222, 107, 89, 20, 9, 1, 222, 107, 216, 217, 20, 9, 1, 220, 36, - 76, 20, 9, 1, 220, 36, 53, 20, 9, 1, 220, 36, 89, 20, 9, 1, 220, 36, 216, - 217, 20, 9, 1, 92, 76, 20, 9, 1, 92, 53, 20, 9, 1, 92, 89, 20, 9, 1, 92, - 216, 217, 20, 9, 1, 213, 25, 76, 20, 9, 1, 213, 25, 53, 20, 9, 1, 213, - 25, 89, 20, 9, 1, 213, 25, 216, 217, 20, 9, 1, 229, 211, 76, 20, 9, 1, - 229, 211, 53, 20, 9, 1, 229, 211, 89, 20, 9, 1, 229, 211, 216, 217, 20, - 9, 1, 193, 134, 76, 20, 9, 1, 193, 134, 53, 20, 9, 1, 131, 217, 100, 76, - 20, 9, 1, 131, 217, 100, 53, 20, 9, 1, 99, 76, 20, 9, 1, 99, 53, 20, 9, - 1, 99, 89, 20, 9, 1, 99, 216, 217, 20, 9, 34, 220, 36, 4, 131, 4, 217, - 142, 93, 76, 20, 9, 34, 220, 36, 4, 131, 4, 217, 142, 93, 53, 20, 9, 34, - 220, 36, 4, 131, 4, 230, 58, 93, 76, 20, 9, 34, 220, 36, 4, 131, 4, 230, - 58, 93, 53, 20, 9, 34, 220, 36, 4, 131, 4, 230, 58, 248, 233, 76, 20, 9, - 34, 220, 36, 4, 131, 4, 230, 58, 248, 233, 53, 20, 9, 34, 220, 36, 4, - 131, 76, 20, 9, 34, 220, 36, 4, 131, 53, 20, 191, 78, 193, 75, 213, 37, - 201, 247, 232, 78, 233, 216, 77, 232, 78, 207, 252, 77, 232, 78, 31, 56, - 232, 78, 236, 155, 56, 232, 78, 210, 13, 56, 232, 78, 251, 137, 232, 78, - 251, 49, 232, 78, 45, 210, 113, 232, 78, 50, 210, 113, 232, 78, 250, 193, - 232, 78, 108, 56, 232, 78, 242, 74, 232, 78, 228, 87, 232, 78, 232, 80, - 201, 63, 232, 78, 202, 23, 232, 78, 17, 191, 77, 232, 78, 17, 107, 232, - 78, 17, 109, 232, 78, 17, 138, 232, 78, 17, 134, 232, 78, 17, 149, 232, - 78, 17, 169, 232, 78, 17, 175, 232, 78, 17, 171, 232, 78, 17, 178, 232, - 78, 242, 83, 232, 78, 204, 25, 232, 78, 219, 180, 56, 232, 78, 234, 43, - 56, 232, 78, 230, 204, 56, 232, 78, 208, 13, 77, 232, 78, 242, 72, 250, - 182, 232, 78, 8, 6, 1, 65, 232, 78, 8, 6, 1, 250, 120, 232, 78, 8, 6, 1, - 247, 193, 232, 78, 8, 6, 1, 238, 127, 232, 78, 8, 6, 1, 71, 232, 78, 8, - 6, 1, 233, 175, 232, 78, 8, 6, 1, 232, 51, 232, 78, 8, 6, 1, 230, 116, - 232, 78, 8, 6, 1, 68, 232, 78, 8, 6, 1, 223, 35, 232, 78, 8, 6, 1, 222, - 152, 232, 78, 8, 6, 1, 172, 232, 78, 8, 6, 1, 218, 168, 232, 78, 8, 6, 1, - 215, 61, 232, 78, 8, 6, 1, 74, 232, 78, 8, 6, 1, 210, 236, 232, 78, 8, 6, - 1, 208, 104, 232, 78, 8, 6, 1, 146, 232, 78, 8, 6, 1, 206, 8, 232, 78, 8, - 6, 1, 200, 43, 232, 78, 8, 6, 1, 66, 232, 78, 8, 6, 1, 196, 12, 232, 78, - 8, 6, 1, 193, 224, 232, 78, 8, 6, 1, 192, 235, 232, 78, 8, 6, 1, 192, - 159, 232, 78, 8, 6, 1, 191, 166, 232, 78, 45, 51, 248, 53, 232, 78, 207, - 19, 202, 23, 232, 78, 50, 51, 248, 53, 232, 78, 243, 2, 252, 60, 232, 78, - 130, 219, 112, 232, 78, 230, 211, 252, 60, 232, 78, 8, 2, 1, 65, 232, 78, - 8, 2, 1, 250, 120, 232, 78, 8, 2, 1, 247, 193, 232, 78, 8, 2, 1, 238, - 127, 232, 78, 8, 2, 1, 71, 232, 78, 8, 2, 1, 233, 175, 232, 78, 8, 2, 1, - 232, 51, 232, 78, 8, 2, 1, 230, 116, 232, 78, 8, 2, 1, 68, 232, 78, 8, 2, - 1, 223, 35, 232, 78, 8, 2, 1, 222, 152, 232, 78, 8, 2, 1, 172, 232, 78, - 8, 2, 1, 218, 168, 232, 78, 8, 2, 1, 215, 61, 232, 78, 8, 2, 1, 74, 232, - 78, 8, 2, 1, 210, 236, 232, 78, 8, 2, 1, 208, 104, 232, 78, 8, 2, 1, 146, - 232, 78, 8, 2, 1, 206, 8, 232, 78, 8, 2, 1, 200, 43, 232, 78, 8, 2, 1, - 66, 232, 78, 8, 2, 1, 196, 12, 232, 78, 8, 2, 1, 193, 224, 232, 78, 8, 2, - 1, 192, 235, 232, 78, 8, 2, 1, 192, 159, 232, 78, 8, 2, 1, 191, 166, 232, - 78, 45, 238, 171, 248, 53, 232, 78, 81, 219, 112, 232, 78, 50, 238, 171, - 248, 53, 232, 78, 198, 152, 232, 78, 45, 63, 210, 113, 232, 78, 50, 63, - 210, 113, 150, 154, 232, 80, 201, 63, 150, 45, 239, 2, 248, 53, 150, 50, - 239, 2, 248, 53, 150, 154, 242, 74, 150, 72, 82, 236, 140, 150, 72, 1, - 193, 48, 150, 72, 1, 2, 65, 150, 72, 1, 2, 68, 150, 72, 1, 2, 66, 150, - 72, 1, 2, 71, 150, 72, 1, 2, 74, 150, 72, 1, 2, 170, 150, 72, 1, 2, 191, - 225, 150, 72, 1, 2, 192, 12, 150, 72, 1, 2, 197, 94, 150, 222, 48, 208, - 191, 202, 5, 77, 150, 72, 1, 65, 150, 72, 1, 68, 150, 72, 1, 66, 150, 72, - 1, 71, 150, 72, 1, 74, 150, 72, 1, 155, 150, 72, 1, 221, 166, 150, 72, 1, - 220, 232, 150, 72, 1, 222, 22, 150, 72, 1, 221, 67, 150, 72, 1, 188, 150, - 72, 1, 202, 222, 150, 72, 1, 201, 4, 150, 72, 1, 205, 68, 150, 72, 1, - 202, 46, 150, 72, 1, 190, 190, 150, 72, 1, 198, 193, 150, 72, 1, 197, 94, - 150, 72, 1, 199, 145, 150, 72, 1, 159, 150, 72, 1, 180, 150, 72, 1, 213, - 219, 150, 72, 1, 212, 178, 150, 72, 1, 214, 121, 150, 72, 1, 213, 43, - 150, 72, 1, 140, 150, 72, 1, 229, 158, 150, 72, 1, 228, 159, 150, 72, 1, - 229, 245, 150, 72, 1, 229, 23, 150, 72, 1, 174, 150, 72, 1, 216, 100, - 150, 72, 1, 215, 155, 150, 72, 1, 216, 232, 150, 72, 1, 216, 12, 150, 72, - 1, 170, 150, 72, 1, 191, 225, 150, 72, 1, 192, 12, 150, 72, 1, 165, 150, - 72, 1, 207, 1, 150, 72, 1, 206, 68, 150, 72, 1, 207, 113, 150, 72, 1, - 206, 162, 150, 72, 1, 193, 190, 150, 72, 1, 215, 61, 150, 72, 195, 20, - 202, 5, 77, 150, 72, 204, 30, 202, 5, 77, 150, 30, 233, 3, 150, 30, 1, - 221, 113, 150, 30, 1, 201, 167, 150, 30, 1, 221, 106, 150, 30, 1, 213, - 204, 150, 30, 1, 213, 202, 150, 30, 1, 213, 201, 150, 30, 1, 198, 168, - 150, 30, 1, 201, 156, 150, 30, 1, 206, 239, 150, 30, 1, 206, 234, 150, - 30, 1, 206, 231, 150, 30, 1, 206, 224, 150, 30, 1, 206, 219, 150, 30, 1, - 206, 214, 150, 30, 1, 206, 225, 150, 30, 1, 206, 237, 150, 30, 1, 216, - 77, 150, 30, 1, 209, 169, 150, 30, 1, 201, 164, 150, 30, 1, 209, 158, - 150, 30, 1, 202, 160, 150, 30, 1, 201, 161, 150, 30, 1, 223, 222, 150, - 30, 1, 243, 24, 150, 30, 1, 201, 171, 150, 30, 1, 243, 91, 150, 30, 1, - 221, 188, 150, 30, 1, 199, 7, 150, 30, 1, 209, 209, 150, 30, 1, 229, 142, - 150, 30, 1, 65, 150, 30, 1, 252, 25, 150, 30, 1, 170, 150, 30, 1, 192, - 129, 150, 30, 1, 234, 65, 150, 30, 1, 71, 150, 30, 1, 192, 67, 150, 30, - 1, 192, 80, 150, 30, 1, 74, 150, 30, 1, 193, 190, 150, 30, 1, 193, 176, - 150, 30, 1, 211, 151, 150, 30, 1, 192, 12, 150, 30, 1, 66, 150, 30, 1, - 193, 107, 150, 30, 1, 193, 125, 150, 30, 1, 193, 86, 150, 30, 1, 191, - 225, 150, 30, 1, 233, 242, 150, 30, 1, 192, 33, 150, 30, 1, 68, 232, 78, - 247, 24, 56, 232, 78, 209, 8, 56, 232, 78, 213, 12, 56, 232, 78, 217, - 146, 232, 78, 248, 22, 164, 232, 78, 192, 71, 56, 232, 78, 193, 31, 56, - 150, 232, 141, 156, 195, 135, 150, 118, 57, 150, 196, 66, 57, 150, 96, - 57, 150, 235, 119, 57, 150, 62, 201, 190, 150, 63, 243, 10, 223, 106, - 251, 96, 251, 127, 223, 106, 251, 96, 204, 10, 223, 106, 251, 96, 199, - 80, 211, 175, 207, 43, 246, 239, 207, 43, 246, 239, 32, 78, 5, 250, 104, - 65, 32, 78, 5, 250, 73, 71, 32, 78, 5, 250, 82, 68, 32, 78, 5, 250, 50, - 74, 32, 78, 5, 250, 100, 66, 32, 78, 5, 250, 119, 238, 32, 32, 78, 5, - 250, 66, 237, 146, 32, 78, 5, 250, 106, 237, 44, 32, 78, 5, 250, 96, 236, - 174, 32, 78, 5, 250, 60, 235, 89, 32, 78, 5, 250, 54, 223, 32, 32, 78, 5, - 250, 65, 223, 10, 32, 78, 5, 250, 75, 222, 201, 32, 78, 5, 250, 46, 222, - 182, 32, 78, 5, 250, 34, 155, 32, 78, 5, 250, 67, 222, 22, 32, 78, 5, - 250, 44, 221, 166, 32, 78, 5, 250, 41, 221, 67, 32, 78, 5, 250, 30, 220, - 232, 32, 78, 5, 250, 31, 174, 32, 78, 5, 250, 97, 216, 232, 32, 78, 5, - 250, 38, 216, 100, 32, 78, 5, 250, 95, 216, 12, 32, 78, 5, 250, 87, 215, - 155, 32, 78, 5, 250, 108, 180, 32, 78, 5, 250, 86, 214, 121, 32, 78, 5, - 250, 80, 213, 219, 32, 78, 5, 250, 59, 213, 43, 32, 78, 5, 250, 56, 212, - 178, 32, 78, 5, 250, 115, 168, 32, 78, 5, 250, 39, 210, 63, 32, 78, 5, - 250, 72, 209, 185, 32, 78, 5, 250, 99, 209, 73, 32, 78, 5, 250, 61, 208, - 165, 32, 78, 5, 250, 94, 208, 96, 32, 78, 5, 250, 33, 208, 75, 32, 78, 5, - 250, 89, 208, 57, 32, 78, 5, 250, 78, 208, 45, 32, 78, 5, 250, 51, 165, - 32, 78, 5, 250, 83, 207, 113, 32, 78, 5, 250, 58, 207, 1, 32, 78, 5, 250, - 117, 206, 162, 32, 78, 5, 250, 84, 206, 68, 32, 78, 5, 250, 79, 188, 32, - 78, 5, 250, 102, 205, 68, 32, 78, 5, 250, 70, 202, 222, 32, 78, 5, 250, - 98, 202, 46, 32, 78, 5, 250, 53, 201, 4, 32, 78, 5, 250, 52, 190, 190, - 32, 78, 5, 250, 113, 199, 145, 32, 78, 5, 250, 74, 198, 193, 32, 78, 5, - 250, 111, 159, 32, 78, 5, 250, 42, 197, 94, 32, 78, 5, 250, 57, 193, 190, - 32, 78, 5, 250, 36, 193, 125, 32, 78, 5, 250, 71, 193, 86, 32, 78, 5, - 250, 69, 193, 48, 32, 78, 5, 250, 93, 191, 123, 32, 78, 5, 250, 37, 191, - 87, 32, 78, 5, 250, 90, 191, 7, 32, 78, 5, 250, 85, 254, 215, 32, 78, 5, - 250, 68, 254, 103, 32, 78, 5, 250, 27, 250, 163, 32, 78, 5, 250, 40, 235, - 45, 32, 78, 5, 250, 23, 235, 44, 32, 78, 5, 250, 63, 212, 110, 32, 78, 5, - 250, 81, 208, 163, 32, 78, 5, 250, 49, 208, 167, 32, 78, 5, 250, 35, 207, - 180, 32, 78, 5, 250, 77, 207, 179, 32, 78, 5, 250, 43, 206, 155, 32, 78, - 5, 250, 45, 199, 246, 32, 78, 5, 250, 25, 197, 41, 32, 78, 5, 250, 22, - 109, 32, 78, 16, 250, 92, 32, 78, 16, 250, 91, 32, 78, 16, 250, 88, 32, - 78, 16, 250, 76, 32, 78, 16, 250, 64, 32, 78, 16, 250, 62, 32, 78, 16, - 250, 55, 32, 78, 16, 250, 48, 32, 78, 16, 250, 47, 32, 78, 16, 250, 32, - 32, 78, 16, 250, 29, 32, 78, 16, 250, 28, 32, 78, 16, 250, 26, 32, 78, - 16, 250, 24, 32, 78, 157, 250, 21, 217, 90, 32, 78, 157, 250, 20, 193, - 35, 32, 78, 157, 250, 19, 237, 128, 32, 78, 157, 250, 18, 234, 40, 32, - 78, 157, 250, 17, 217, 56, 32, 78, 157, 250, 16, 201, 110, 32, 78, 157, - 250, 15, 233, 223, 32, 78, 157, 250, 14, 207, 142, 32, 78, 157, 250, 13, - 203, 112, 32, 78, 157, 250, 12, 229, 237, 32, 78, 157, 250, 11, 201, 255, - 32, 78, 157, 250, 10, 248, 109, 32, 78, 157, 250, 9, 238, 239, 32, 78, - 157, 250, 8, 247, 250, 32, 78, 157, 250, 7, 193, 95, 32, 78, 157, 250, 6, - 249, 84, 32, 78, 157, 250, 5, 211, 115, 32, 78, 157, 250, 4, 201, 223, - 32, 78, 157, 250, 3, 238, 136, 32, 78, 215, 221, 250, 2, 222, 74, 32, 78, - 215, 221, 250, 1, 222, 85, 32, 78, 157, 250, 0, 211, 131, 32, 78, 157, - 249, 255, 193, 62, 32, 78, 157, 249, 254, 32, 78, 215, 221, 249, 253, - 251, 7, 32, 78, 215, 221, 249, 252, 216, 178, 32, 78, 157, 249, 251, 248, - 21, 32, 78, 157, 249, 250, 230, 250, 32, 78, 157, 249, 249, 32, 78, 157, - 249, 248, 193, 26, 32, 78, 157, 249, 247, 32, 78, 157, 249, 246, 32, 78, - 157, 249, 245, 228, 187, 32, 78, 157, 249, 244, 32, 78, 157, 249, 243, - 32, 78, 157, 249, 242, 32, 78, 215, 221, 249, 240, 197, 56, 32, 78, 157, - 249, 239, 32, 78, 157, 249, 238, 32, 78, 157, 249, 237, 242, 213, 32, 78, - 157, 249, 236, 32, 78, 157, 249, 235, 32, 78, 157, 249, 234, 231, 196, - 32, 78, 157, 249, 233, 250, 248, 32, 78, 157, 249, 232, 32, 78, 157, 249, - 231, 32, 78, 157, 249, 230, 32, 78, 157, 249, 229, 32, 78, 157, 249, 228, - 32, 78, 157, 249, 227, 32, 78, 157, 249, 226, 32, 78, 157, 249, 225, 32, - 78, 157, 249, 224, 32, 78, 157, 249, 223, 215, 213, 32, 78, 157, 249, - 222, 32, 78, 157, 249, 221, 197, 254, 32, 78, 157, 249, 220, 32, 78, 157, - 249, 219, 32, 78, 157, 249, 218, 32, 78, 157, 249, 217, 32, 78, 157, 249, - 216, 32, 78, 157, 249, 215, 32, 78, 157, 249, 214, 32, 78, 157, 249, 213, - 32, 78, 157, 249, 212, 32, 78, 157, 249, 211, 32, 78, 157, 249, 210, 32, - 78, 157, 249, 209, 229, 200, 32, 78, 157, 249, 188, 232, 155, 32, 78, - 157, 249, 185, 249, 59, 32, 78, 157, 249, 180, 201, 232, 32, 78, 157, - 249, 179, 57, 32, 78, 157, 249, 178, 32, 78, 157, 249, 177, 200, 131, 32, - 78, 157, 249, 176, 32, 78, 157, 249, 175, 32, 78, 157, 249, 174, 193, 90, - 243, 138, 32, 78, 157, 249, 173, 243, 138, 32, 78, 157, 249, 172, 243, - 139, 232, 113, 32, 78, 157, 249, 171, 193, 93, 32, 78, 157, 249, 170, 32, - 78, 157, 249, 169, 32, 78, 215, 221, 249, 168, 236, 235, 32, 78, 157, - 249, 167, 32, 78, 157, 249, 166, 32, 78, 157, 249, 164, 32, 78, 157, 249, - 163, 32, 78, 157, 249, 162, 32, 78, 157, 249, 161, 237, 218, 32, 78, 157, - 249, 160, 32, 78, 157, 249, 159, 32, 78, 157, 249, 158, 32, 78, 157, 249, - 157, 32, 78, 157, 249, 156, 32, 78, 157, 195, 82, 249, 241, 32, 78, 157, - 195, 82, 249, 208, 32, 78, 157, 195, 82, 249, 207, 32, 78, 157, 195, 82, - 249, 206, 32, 78, 157, 195, 82, 249, 205, 32, 78, 157, 195, 82, 249, 204, - 32, 78, 157, 195, 82, 249, 203, 32, 78, 157, 195, 82, 249, 202, 32, 78, - 157, 195, 82, 249, 201, 32, 78, 157, 195, 82, 249, 200, 32, 78, 157, 195, - 82, 249, 199, 32, 78, 157, 195, 82, 249, 198, 32, 78, 157, 195, 82, 249, - 197, 32, 78, 157, 195, 82, 249, 196, 32, 78, 157, 195, 82, 249, 195, 32, - 78, 157, 195, 82, 249, 194, 32, 78, 157, 195, 82, 249, 193, 32, 78, 157, - 195, 82, 249, 192, 32, 78, 157, 195, 82, 249, 191, 32, 78, 157, 195, 82, - 249, 190, 32, 78, 157, 195, 82, 249, 189, 32, 78, 157, 195, 82, 249, 187, - 32, 78, 157, 195, 82, 249, 186, 32, 78, 157, 195, 82, 249, 184, 32, 78, - 157, 195, 82, 249, 183, 32, 78, 157, 195, 82, 249, 182, 32, 78, 157, 195, - 82, 249, 181, 32, 78, 157, 195, 82, 249, 165, 32, 78, 157, 195, 82, 249, - 155, 252, 18, 193, 23, 204, 11, 219, 112, 252, 18, 193, 23, 204, 11, 236, - 140, 252, 18, 243, 126, 77, 252, 18, 31, 107, 252, 18, 31, 109, 252, 18, - 31, 138, 252, 18, 31, 134, 252, 18, 31, 149, 252, 18, 31, 169, 252, 18, - 31, 175, 252, 18, 31, 171, 252, 18, 31, 178, 252, 18, 31, 199, 95, 252, - 18, 31, 197, 32, 252, 18, 31, 198, 249, 252, 18, 31, 232, 135, 252, 18, - 31, 233, 15, 252, 18, 31, 202, 120, 252, 18, 31, 203, 241, 252, 18, 31, - 234, 153, 252, 18, 31, 213, 169, 252, 18, 31, 91, 228, 140, 252, 18, 31, - 105, 228, 140, 252, 18, 31, 115, 228, 140, 252, 18, 31, 232, 128, 228, - 140, 252, 18, 31, 232, 226, 228, 140, 252, 18, 31, 202, 136, 228, 140, - 252, 18, 31, 203, 247, 228, 140, 252, 18, 31, 234, 164, 228, 140, 252, - 18, 31, 213, 175, 228, 140, 252, 18, 31, 91, 189, 252, 18, 31, 105, 189, - 252, 18, 31, 115, 189, 252, 18, 31, 232, 128, 189, 252, 18, 31, 232, 226, - 189, 252, 18, 31, 202, 136, 189, 252, 18, 31, 203, 247, 189, 252, 18, 31, - 234, 164, 189, 252, 18, 31, 213, 175, 189, 252, 18, 31, 199, 96, 189, - 252, 18, 31, 197, 33, 189, 252, 18, 31, 198, 250, 189, 252, 18, 31, 232, - 136, 189, 252, 18, 31, 233, 16, 189, 252, 18, 31, 202, 121, 189, 252, 18, - 31, 203, 242, 189, 252, 18, 31, 234, 154, 189, 252, 18, 31, 213, 170, - 189, 252, 18, 193, 110, 249, 75, 196, 90, 252, 18, 193, 110, 232, 238, - 200, 224, 252, 18, 193, 110, 205, 57, 200, 224, 252, 18, 193, 110, 199, - 1, 200, 224, 252, 18, 193, 110, 232, 121, 200, 224, 252, 18, 235, 92, - 216, 228, 232, 238, 200, 224, 252, 18, 219, 93, 216, 228, 232, 238, 200, - 224, 252, 18, 216, 228, 205, 57, 200, 224, 252, 18, 216, 228, 199, 1, - 200, 224, 35, 252, 50, 250, 165, 91, 208, 22, 35, 252, 50, 250, 165, 91, - 230, 70, 35, 252, 50, 250, 165, 91, 235, 115, 35, 252, 50, 250, 165, 149, - 35, 252, 50, 250, 165, 233, 15, 35, 252, 50, 250, 165, 232, 226, 228, - 140, 35, 252, 50, 250, 165, 232, 226, 189, 35, 252, 50, 250, 165, 233, - 16, 189, 35, 252, 50, 250, 165, 232, 226, 199, 203, 35, 252, 50, 250, - 165, 199, 96, 199, 203, 35, 252, 50, 250, 165, 233, 16, 199, 203, 35, - 252, 50, 250, 165, 91, 228, 141, 199, 203, 35, 252, 50, 250, 165, 232, - 226, 228, 141, 199, 203, 35, 252, 50, 250, 165, 91, 198, 230, 199, 203, - 35, 252, 50, 250, 165, 232, 226, 198, 230, 199, 203, 35, 252, 50, 250, - 165, 232, 226, 201, 94, 35, 252, 50, 250, 165, 199, 96, 201, 94, 35, 252, - 50, 250, 165, 233, 16, 201, 94, 35, 252, 50, 250, 165, 91, 228, 141, 201, - 94, 35, 252, 50, 250, 165, 232, 226, 228, 141, 201, 94, 35, 252, 50, 250, - 165, 91, 198, 230, 201, 94, 35, 252, 50, 250, 165, 199, 96, 198, 230, - 201, 94, 35, 252, 50, 250, 165, 233, 16, 198, 230, 201, 94, 35, 252, 50, - 250, 165, 199, 96, 216, 15, 35, 252, 50, 229, 194, 91, 209, 92, 35, 252, - 50, 199, 17, 107, 35, 252, 50, 229, 190, 107, 35, 252, 50, 234, 51, 109, - 35, 252, 50, 199, 17, 109, 35, 252, 50, 238, 132, 105, 235, 114, 35, 252, - 50, 234, 51, 105, 235, 114, 35, 252, 50, 197, 216, 149, 35, 252, 50, 197, - 216, 199, 95, 35, 252, 50, 197, 216, 199, 96, 251, 157, 20, 35, 252, 50, - 229, 190, 199, 95, 35, 252, 50, 216, 167, 199, 95, 35, 252, 50, 199, 17, - 199, 95, 35, 252, 50, 199, 17, 198, 249, 35, 252, 50, 197, 216, 233, 15, - 35, 252, 50, 197, 216, 233, 16, 251, 157, 20, 35, 252, 50, 229, 190, 233, - 15, 35, 252, 50, 199, 17, 233, 15, 35, 252, 50, 199, 17, 91, 228, 140, - 35, 252, 50, 199, 17, 115, 228, 140, 35, 252, 50, 234, 51, 232, 226, 228, - 140, 35, 252, 50, 197, 216, 232, 226, 228, 140, 35, 252, 50, 199, 17, - 232, 226, 228, 140, 35, 252, 50, 247, 82, 232, 226, 228, 140, 35, 252, - 50, 214, 199, 232, 226, 228, 140, 35, 252, 50, 199, 17, 91, 189, 35, 252, - 50, 199, 17, 232, 226, 189, 35, 252, 50, 237, 109, 232, 226, 216, 15, 35, - 252, 50, 201, 47, 233, 16, 216, 15, 35, 91, 132, 56, 35, 91, 132, 3, 251, - 157, 20, 35, 105, 198, 254, 56, 35, 115, 208, 21, 56, 35, 192, 78, 56, - 35, 199, 204, 56, 35, 235, 116, 56, 35, 211, 170, 56, 35, 105, 211, 169, - 56, 35, 115, 211, 169, 56, 35, 232, 128, 211, 169, 56, 35, 232, 226, 211, - 169, 56, 35, 216, 161, 56, 35, 220, 151, 249, 75, 56, 35, 219, 85, 56, - 35, 211, 16, 56, 35, 192, 211, 56, 35, 250, 226, 56, 35, 250, 243, 56, - 35, 230, 220, 56, 35, 197, 171, 249, 75, 56, 35, 191, 78, 56, 35, 91, - 208, 23, 56, 35, 202, 162, 56, 35, 223, 143, 56, 213, 32, 56, 206, 136, - 203, 237, 56, 206, 136, 196, 106, 56, 206, 136, 204, 17, 56, 206, 136, - 203, 175, 56, 206, 136, 236, 250, 203, 175, 56, 206, 136, 202, 186, 56, - 206, 136, 237, 104, 56, 206, 136, 208, 5, 56, 206, 136, 203, 254, 56, - 206, 136, 235, 67, 56, 206, 136, 250, 220, 56, 206, 136, 247, 17, 56, - 250, 211, 113, 35, 16, 199, 167, 207, 3, 209, 223, 236, 227, 3, 210, 51, - 209, 223, 236, 227, 3, 209, 84, 229, 235, 209, 223, 236, 227, 3, 199, - 170, 229, 235, 209, 223, 236, 227, 3, 247, 105, 209, 223, 236, 227, 3, - 243, 86, 209, 223, 236, 227, 3, 193, 35, 209, 223, 236, 227, 3, 229, 200, - 209, 223, 236, 227, 3, 231, 188, 209, 223, 236, 227, 3, 198, 184, 209, - 223, 236, 227, 3, 57, 209, 223, 236, 227, 3, 248, 69, 209, 223, 236, 227, - 3, 203, 78, 209, 223, 236, 227, 3, 242, 206, 209, 223, 236, 227, 3, 217, - 89, 209, 223, 236, 227, 3, 217, 26, 209, 223, 236, 227, 3, 205, 108, 209, - 223, 236, 227, 3, 219, 141, 209, 223, 236, 227, 3, 248, 92, 209, 223, - 236, 227, 3, 247, 89, 209, 101, 209, 223, 236, 227, 3, 236, 156, 209, - 223, 236, 227, 3, 242, 80, 209, 223, 236, 227, 3, 202, 83, 209, 223, 236, - 227, 3, 242, 81, 209, 223, 236, 227, 3, 248, 254, 209, 223, 236, 227, 3, - 203, 65, 209, 223, 236, 227, 3, 228, 187, 209, 223, 236, 227, 3, 229, - 148, 209, 223, 236, 227, 3, 247, 245, 219, 212, 209, 223, 236, 227, 3, - 247, 78, 209, 223, 236, 227, 3, 207, 142, 209, 223, 236, 227, 3, 234, - 214, 209, 223, 236, 227, 3, 235, 124, 209, 223, 236, 227, 3, 197, 72, - 209, 223, 236, 227, 3, 249, 1, 209, 223, 236, 227, 3, 209, 102, 197, 254, - 209, 223, 236, 227, 3, 195, 47, 209, 223, 236, 227, 3, 210, 132, 209, - 223, 236, 227, 3, 206, 125, 209, 223, 236, 227, 3, 219, 125, 209, 223, - 236, 227, 3, 210, 248, 249, 146, 209, 223, 236, 227, 3, 232, 182, 209, - 223, 236, 227, 3, 230, 212, 209, 223, 236, 227, 3, 201, 50, 209, 223, - 236, 227, 3, 2, 250, 132, 209, 223, 236, 227, 3, 193, 135, 249, 97, 209, - 223, 236, 227, 3, 33, 211, 172, 106, 218, 181, 1, 65, 218, 181, 1, 71, - 218, 181, 1, 250, 120, 218, 181, 1, 248, 204, 218, 181, 1, 232, 51, 218, - 181, 1, 238, 127, 218, 181, 1, 68, 218, 181, 1, 193, 224, 218, 181, 1, - 191, 166, 218, 181, 1, 199, 51, 218, 181, 1, 223, 35, 218, 181, 1, 222, - 152, 218, 181, 1, 208, 104, 218, 181, 1, 172, 218, 181, 1, 218, 168, 218, - 181, 1, 215, 61, 218, 181, 1, 216, 17, 218, 181, 1, 213, 80, 218, 181, 1, - 66, 218, 181, 1, 210, 236, 218, 181, 1, 221, 102, 218, 181, 1, 146, 218, - 181, 1, 206, 8, 218, 181, 1, 200, 43, 218, 181, 1, 197, 135, 218, 181, 1, - 251, 132, 218, 181, 1, 234, 103, 218, 181, 1, 230, 116, 218, 181, 1, 192, - 235, 247, 95, 1, 65, 247, 95, 1, 210, 222, 247, 95, 1, 238, 127, 247, 95, - 1, 172, 247, 95, 1, 196, 28, 247, 95, 1, 146, 247, 95, 1, 219, 242, 247, - 95, 1, 254, 215, 247, 95, 1, 208, 104, 247, 95, 1, 250, 120, 247, 95, 1, - 218, 168, 247, 95, 1, 74, 247, 95, 1, 238, 34, 247, 95, 1, 200, 43, 247, - 95, 1, 203, 167, 247, 95, 1, 203, 166, 247, 95, 1, 206, 8, 247, 95, 1, - 247, 192, 247, 95, 1, 66, 247, 95, 1, 213, 80, 247, 95, 1, 192, 235, 247, - 95, 1, 215, 61, 247, 95, 1, 197, 134, 247, 95, 1, 210, 236, 247, 95, 1, - 201, 178, 247, 95, 1, 68, 247, 95, 1, 71, 247, 95, 1, 196, 25, 247, 95, - 1, 222, 152, 247, 95, 1, 222, 143, 247, 95, 1, 214, 164, 247, 95, 1, 196, - 30, 247, 95, 1, 232, 51, 247, 95, 1, 231, 242, 247, 95, 1, 201, 118, 247, - 95, 1, 201, 117, 247, 95, 1, 214, 70, 247, 95, 1, 223, 199, 247, 95, 1, - 247, 191, 247, 95, 1, 197, 135, 247, 95, 1, 196, 27, 247, 95, 1, 206, - 110, 247, 95, 1, 217, 16, 247, 95, 1, 217, 15, 247, 95, 1, 217, 14, 247, - 95, 1, 217, 13, 247, 95, 1, 219, 241, 247, 95, 1, 234, 218, 247, 95, 1, - 196, 26, 94, 234, 54, 198, 229, 77, 94, 234, 54, 17, 107, 94, 234, 54, - 17, 109, 94, 234, 54, 17, 138, 94, 234, 54, 17, 134, 94, 234, 54, 17, - 149, 94, 234, 54, 17, 169, 94, 234, 54, 17, 175, 94, 234, 54, 17, 171, - 94, 234, 54, 17, 178, 94, 234, 54, 31, 199, 95, 94, 234, 54, 31, 197, 32, - 94, 234, 54, 31, 198, 249, 94, 234, 54, 31, 232, 135, 94, 234, 54, 31, - 233, 15, 94, 234, 54, 31, 202, 120, 94, 234, 54, 31, 203, 241, 94, 234, - 54, 31, 234, 153, 94, 234, 54, 31, 213, 169, 94, 234, 54, 31, 91, 228, - 140, 94, 234, 54, 31, 105, 228, 140, 94, 234, 54, 31, 115, 228, 140, 94, - 234, 54, 31, 232, 128, 228, 140, 94, 234, 54, 31, 232, 226, 228, 140, 94, - 234, 54, 31, 202, 136, 228, 140, 94, 234, 54, 31, 203, 247, 228, 140, 94, - 234, 54, 31, 234, 164, 228, 140, 94, 234, 54, 31, 213, 175, 228, 140, 39, - 43, 1, 65, 39, 43, 1, 249, 17, 39, 43, 1, 222, 22, 39, 43, 1, 237, 146, - 39, 43, 1, 71, 39, 43, 1, 195, 153, 39, 43, 1, 191, 87, 39, 43, 1, 229, - 245, 39, 43, 1, 199, 33, 39, 43, 1, 68, 39, 43, 1, 155, 39, 43, 1, 234, - 140, 39, 43, 1, 234, 114, 39, 43, 1, 234, 103, 39, 43, 1, 234, 12, 39, - 43, 1, 74, 39, 43, 1, 210, 63, 39, 43, 1, 203, 113, 39, 43, 1, 220, 232, - 39, 43, 1, 234, 34, 39, 43, 1, 234, 22, 39, 43, 1, 199, 145, 39, 43, 1, - 66, 39, 43, 1, 234, 143, 39, 43, 1, 209, 214, 39, 43, 1, 221, 197, 39, - 43, 1, 234, 181, 39, 43, 1, 234, 24, 39, 43, 1, 243, 127, 39, 43, 1, 223, - 199, 39, 43, 1, 196, 30, 39, 43, 1, 234, 5, 39, 43, 212, 134, 107, 39, - 43, 212, 134, 149, 39, 43, 212, 134, 199, 95, 39, 43, 212, 134, 233, 15, - 39, 43, 1, 192, 80, 39, 43, 1, 213, 16, 197, 161, 39, 43, 1, 202, 0, 197, - 161, 230, 231, 1, 251, 239, 230, 231, 1, 249, 117, 230, 231, 1, 231, 50, - 230, 231, 1, 238, 13, 230, 231, 1, 251, 234, 230, 231, 1, 208, 87, 230, - 231, 1, 223, 48, 230, 231, 1, 230, 83, 230, 231, 1, 198, 243, 230, 231, - 1, 234, 151, 230, 231, 1, 220, 189, 230, 231, 1, 220, 100, 230, 231, 1, - 217, 80, 230, 231, 1, 214, 201, 230, 231, 1, 223, 1, 230, 231, 1, 196, - 48, 230, 231, 1, 210, 195, 230, 231, 1, 213, 169, 230, 231, 1, 207, 155, - 230, 231, 1, 205, 112, 230, 231, 1, 199, 111, 230, 231, 1, 193, 59, 230, - 231, 1, 233, 89, 230, 231, 1, 223, 203, 230, 231, 1, 228, 123, 230, 231, - 1, 211, 29, 230, 231, 1, 213, 175, 228, 140, 39, 210, 2, 1, 251, 132, 39, - 210, 2, 1, 247, 230, 39, 210, 2, 1, 231, 224, 39, 210, 2, 1, 236, 160, - 39, 210, 2, 1, 71, 39, 210, 2, 1, 191, 53, 39, 210, 2, 1, 235, 27, 39, - 210, 2, 1, 191, 95, 39, 210, 2, 1, 235, 25, 39, 210, 2, 1, 68, 39, 210, - 2, 1, 221, 50, 39, 210, 2, 1, 219, 208, 39, 210, 2, 1, 216, 184, 39, 210, - 2, 1, 214, 100, 39, 210, 2, 1, 195, 7, 39, 210, 2, 1, 210, 48, 39, 210, - 2, 1, 207, 70, 39, 210, 2, 1, 202, 193, 39, 210, 2, 1, 199, 217, 39, 210, - 2, 1, 66, 39, 210, 2, 1, 243, 106, 39, 210, 2, 1, 203, 47, 39, 210, 2, 1, - 203, 115, 39, 210, 2, 1, 191, 227, 39, 210, 2, 1, 192, 58, 39, 210, 2, 1, - 74, 39, 210, 2, 1, 211, 87, 39, 210, 2, 1, 234, 181, 39, 210, 2, 1, 140, - 39, 210, 2, 1, 197, 145, 39, 210, 2, 1, 195, 140, 39, 210, 2, 1, 192, 62, - 39, 210, 2, 1, 192, 60, 39, 210, 2, 1, 192, 95, 39, 210, 2, 1, 223, 226, - 39, 210, 2, 1, 191, 225, 39, 210, 2, 1, 170, 39, 210, 2, 1, 228, 35, 33, - 39, 210, 2, 1, 251, 132, 33, 39, 210, 2, 1, 236, 160, 33, 39, 210, 2, 1, - 191, 95, 33, 39, 210, 2, 1, 214, 100, 33, 39, 210, 2, 1, 202, 193, 196, - 142, 1, 251, 164, 196, 142, 1, 248, 212, 196, 142, 1, 231, 212, 196, 142, - 1, 221, 215, 196, 142, 1, 237, 106, 196, 142, 1, 229, 23, 196, 142, 1, - 193, 48, 196, 142, 1, 191, 76, 196, 142, 1, 228, 179, 196, 142, 1, 199, - 73, 196, 142, 1, 191, 250, 196, 142, 1, 222, 106, 196, 142, 1, 203, 69, - 196, 142, 1, 220, 31, 196, 142, 1, 216, 193, 196, 142, 1, 237, 64, 196, - 142, 1, 212, 130, 196, 142, 1, 190, 251, 196, 142, 1, 205, 147, 196, 142, - 1, 251, 230, 196, 142, 1, 208, 165, 196, 142, 1, 205, 191, 196, 142, 1, - 208, 38, 196, 142, 1, 207, 133, 196, 142, 1, 199, 37, 196, 142, 1, 231, - 86, 196, 142, 1, 159, 196, 142, 1, 68, 196, 142, 1, 66, 196, 142, 1, 201, - 129, 196, 142, 193, 23, 236, 205, 39, 209, 252, 3, 65, 39, 209, 252, 3, - 68, 39, 209, 252, 3, 66, 39, 209, 252, 3, 155, 39, 209, 252, 3, 220, 232, - 39, 209, 252, 3, 231, 240, 39, 209, 252, 3, 230, 179, 39, 209, 252, 3, - 192, 220, 39, 209, 252, 3, 247, 160, 39, 209, 252, 3, 223, 32, 39, 209, - 252, 3, 222, 244, 39, 209, 252, 3, 190, 190, 39, 209, 252, 3, 197, 94, - 39, 209, 252, 3, 238, 32, 39, 209, 252, 3, 237, 44, 39, 209, 252, 3, 235, - 89, 39, 209, 252, 3, 199, 49, 39, 209, 252, 3, 168, 39, 209, 252, 3, 249, - 153, 39, 209, 252, 3, 233, 109, 39, 209, 252, 3, 180, 39, 209, 252, 3, - 212, 178, 39, 209, 252, 3, 174, 39, 209, 252, 3, 216, 100, 39, 209, 252, - 3, 215, 155, 39, 209, 252, 3, 170, 39, 209, 252, 3, 195, 188, 39, 209, - 252, 3, 195, 69, 39, 209, 252, 3, 165, 39, 209, 252, 3, 206, 68, 39, 209, - 252, 3, 173, 39, 209, 252, 3, 188, 39, 209, 252, 3, 191, 123, 39, 209, - 252, 3, 203, 165, 39, 209, 252, 3, 201, 175, 39, 209, 252, 3, 140, 39, - 209, 252, 3, 250, 157, 39, 209, 252, 3, 250, 156, 39, 209, 252, 3, 250, - 155, 39, 209, 252, 3, 192, 189, 39, 209, 252, 3, 238, 9, 39, 209, 252, 3, - 238, 8, 39, 209, 252, 3, 249, 128, 39, 209, 252, 3, 247, 212, 39, 209, - 252, 193, 23, 236, 205, 39, 209, 252, 31, 107, 39, 209, 252, 31, 109, 39, - 209, 252, 31, 199, 95, 39, 209, 252, 31, 197, 32, 39, 209, 252, 31, 228, - 140, 237, 84, 6, 1, 179, 68, 237, 84, 6, 1, 179, 71, 237, 84, 6, 1, 179, - 65, 237, 84, 6, 1, 179, 251, 245, 237, 84, 6, 1, 179, 74, 237, 84, 6, 1, - 179, 211, 87, 237, 84, 6, 1, 203, 40, 68, 237, 84, 6, 1, 203, 40, 71, - 237, 84, 6, 1, 203, 40, 65, 237, 84, 6, 1, 203, 40, 251, 245, 237, 84, 6, - 1, 203, 40, 74, 237, 84, 6, 1, 203, 40, 211, 87, 237, 84, 6, 1, 250, 131, - 237, 84, 6, 1, 210, 250, 237, 84, 6, 1, 193, 0, 237, 84, 6, 1, 192, 77, - 237, 84, 6, 1, 230, 116, 237, 84, 6, 1, 210, 49, 237, 84, 6, 1, 249, 1, - 237, 84, 6, 1, 199, 121, 237, 84, 6, 1, 237, 131, 237, 84, 6, 1, 243, - 123, 237, 84, 6, 1, 223, 8, 237, 84, 6, 1, 222, 29, 237, 84, 6, 1, 231, - 186, 237, 84, 6, 1, 234, 181, 237, 84, 6, 1, 195, 148, 237, 84, 6, 1, - 233, 248, 237, 84, 6, 1, 199, 31, 237, 84, 6, 1, 234, 22, 237, 84, 6, 1, - 191, 84, 237, 84, 6, 1, 234, 12, 237, 84, 6, 1, 191, 61, 237, 84, 6, 1, - 234, 34, 237, 84, 6, 1, 234, 140, 237, 84, 6, 1, 234, 114, 237, 84, 6, 1, - 234, 103, 237, 84, 6, 1, 234, 88, 237, 84, 6, 1, 211, 133, 237, 84, 6, 1, - 233, 224, 237, 84, 2, 1, 179, 68, 237, 84, 2, 1, 179, 71, 237, 84, 2, 1, - 179, 65, 237, 84, 2, 1, 179, 251, 245, 237, 84, 2, 1, 179, 74, 237, 84, - 2, 1, 179, 211, 87, 237, 84, 2, 1, 203, 40, 68, 237, 84, 2, 1, 203, 40, - 71, 237, 84, 2, 1, 203, 40, 65, 237, 84, 2, 1, 203, 40, 251, 245, 237, - 84, 2, 1, 203, 40, 74, 237, 84, 2, 1, 203, 40, 211, 87, 237, 84, 2, 1, - 250, 131, 237, 84, 2, 1, 210, 250, 237, 84, 2, 1, 193, 0, 237, 84, 2, 1, - 192, 77, 237, 84, 2, 1, 230, 116, 237, 84, 2, 1, 210, 49, 237, 84, 2, 1, - 249, 1, 237, 84, 2, 1, 199, 121, 237, 84, 2, 1, 237, 131, 237, 84, 2, 1, - 243, 123, 237, 84, 2, 1, 223, 8, 237, 84, 2, 1, 222, 29, 237, 84, 2, 1, - 231, 186, 237, 84, 2, 1, 234, 181, 237, 84, 2, 1, 195, 148, 237, 84, 2, - 1, 233, 248, 237, 84, 2, 1, 199, 31, 237, 84, 2, 1, 234, 22, 237, 84, 2, - 1, 191, 84, 237, 84, 2, 1, 234, 12, 237, 84, 2, 1, 191, 61, 237, 84, 2, - 1, 234, 34, 237, 84, 2, 1, 234, 140, 237, 84, 2, 1, 234, 114, 237, 84, 2, - 1, 234, 103, 237, 84, 2, 1, 234, 88, 237, 84, 2, 1, 211, 133, 237, 84, 2, - 1, 233, 224, 203, 120, 1, 210, 45, 203, 120, 1, 198, 40, 203, 120, 1, - 221, 154, 203, 120, 1, 233, 52, 203, 120, 1, 199, 6, 203, 120, 1, 202, - 46, 203, 120, 1, 200, 172, 203, 120, 1, 243, 40, 203, 120, 1, 192, 79, - 203, 120, 1, 228, 137, 203, 120, 1, 248, 187, 203, 120, 1, 237, 145, 203, - 120, 1, 231, 226, 203, 120, 1, 195, 2, 203, 120, 1, 199, 12, 203, 120, 1, - 191, 4, 203, 120, 1, 216, 227, 203, 120, 1, 222, 180, 203, 120, 1, 193, - 39, 203, 120, 1, 230, 93, 203, 120, 1, 219, 25, 203, 120, 1, 216, 45, - 203, 120, 1, 223, 206, 203, 120, 1, 234, 179, 203, 120, 1, 250, 209, 203, - 120, 1, 252, 30, 203, 120, 1, 211, 104, 203, 120, 1, 193, 26, 203, 120, - 1, 211, 14, 203, 120, 1, 251, 245, 203, 120, 1, 206, 153, 203, 120, 1, - 212, 130, 203, 120, 1, 234, 200, 203, 120, 1, 251, 250, 203, 120, 1, 228, - 26, 203, 120, 1, 196, 77, 203, 120, 1, 211, 180, 203, 120, 1, 211, 79, - 203, 120, 1, 211, 131, 203, 120, 1, 250, 137, 203, 120, 1, 251, 9, 203, - 120, 1, 211, 56, 203, 120, 1, 251, 225, 203, 120, 1, 234, 26, 203, 120, - 1, 250, 240, 203, 120, 1, 234, 211, 203, 120, 1, 228, 34, 203, 120, 1, - 192, 41, 211, 33, 1, 251, 192, 211, 33, 1, 249, 153, 211, 33, 1, 190, - 190, 211, 33, 1, 223, 32, 211, 33, 1, 192, 220, 211, 33, 1, 221, 215, - 211, 33, 1, 237, 130, 211, 33, 1, 165, 211, 33, 1, 188, 211, 33, 1, 203, - 75, 211, 33, 1, 237, 68, 211, 33, 1, 247, 67, 211, 33, 1, 231, 240, 211, - 33, 1, 233, 109, 211, 33, 1, 208, 94, 211, 33, 1, 222, 123, 211, 33, 1, - 220, 121, 211, 33, 1, 216, 59, 211, 33, 1, 212, 114, 211, 33, 1, 193, - 133, 211, 33, 1, 140, 211, 33, 1, 170, 211, 33, 1, 65, 211, 33, 1, 71, - 211, 33, 1, 68, 211, 33, 1, 74, 211, 33, 1, 66, 211, 33, 1, 252, 206, - 211, 33, 1, 234, 188, 211, 33, 1, 211, 87, 211, 33, 17, 191, 77, 211, 33, - 17, 107, 211, 33, 17, 109, 211, 33, 17, 138, 211, 33, 17, 134, 211, 33, - 17, 149, 211, 33, 17, 169, 211, 33, 17, 175, 211, 33, 17, 171, 211, 33, - 17, 178, 211, 35, 6, 1, 65, 211, 35, 6, 1, 251, 236, 211, 35, 6, 1, 251, - 230, 211, 35, 6, 1, 251, 245, 211, 35, 6, 1, 248, 56, 211, 35, 6, 1, 247, - 1, 211, 35, 6, 1, 234, 172, 211, 35, 6, 1, 71, 211, 35, 6, 1, 234, 152, - 211, 35, 6, 1, 140, 211, 35, 6, 1, 228, 93, 211, 35, 6, 1, 68, 211, 35, - 6, 1, 155, 211, 35, 6, 1, 234, 171, 211, 35, 6, 1, 220, 153, 211, 35, 6, - 1, 173, 211, 35, 6, 1, 174, 211, 35, 6, 1, 180, 211, 35, 6, 1, 74, 211, - 35, 6, 1, 211, 130, 211, 35, 6, 1, 168, 211, 35, 6, 1, 234, 170, 211, 35, - 6, 1, 188, 211, 35, 6, 1, 203, 165, 211, 35, 6, 1, 190, 190, 211, 35, 6, - 1, 234, 169, 211, 35, 6, 1, 197, 168, 211, 35, 6, 1, 234, 168, 211, 35, - 6, 1, 197, 157, 211, 35, 6, 1, 237, 68, 211, 35, 6, 1, 66, 211, 35, 6, 1, - 193, 190, 211, 35, 6, 1, 221, 215, 211, 35, 6, 1, 231, 91, 211, 35, 6, 1, - 191, 123, 211, 35, 6, 1, 191, 71, 211, 35, 2, 1, 65, 211, 35, 2, 1, 251, - 236, 211, 35, 2, 1, 251, 230, 211, 35, 2, 1, 251, 245, 211, 35, 2, 1, - 248, 56, 211, 35, 2, 1, 247, 1, 211, 35, 2, 1, 234, 172, 211, 35, 2, 1, - 71, 211, 35, 2, 1, 234, 152, 211, 35, 2, 1, 140, 211, 35, 2, 1, 228, 93, - 211, 35, 2, 1, 68, 211, 35, 2, 1, 155, 211, 35, 2, 1, 234, 171, 211, 35, - 2, 1, 220, 153, 211, 35, 2, 1, 173, 211, 35, 2, 1, 174, 211, 35, 2, 1, - 180, 211, 35, 2, 1, 74, 211, 35, 2, 1, 211, 130, 211, 35, 2, 1, 168, 211, - 35, 2, 1, 234, 170, 211, 35, 2, 1, 188, 211, 35, 2, 1, 203, 165, 211, 35, - 2, 1, 190, 190, 211, 35, 2, 1, 234, 169, 211, 35, 2, 1, 197, 168, 211, - 35, 2, 1, 234, 168, 211, 35, 2, 1, 197, 157, 211, 35, 2, 1, 237, 68, 211, - 35, 2, 1, 66, 211, 35, 2, 1, 193, 190, 211, 35, 2, 1, 221, 215, 211, 35, - 2, 1, 231, 91, 211, 35, 2, 1, 191, 123, 211, 35, 2, 1, 191, 71, 234, 136, - 1, 65, 234, 136, 1, 249, 17, 234, 136, 1, 247, 42, 234, 136, 1, 243, 127, - 234, 136, 1, 237, 146, 234, 136, 1, 214, 154, 234, 136, 1, 237, 59, 234, - 136, 1, 234, 166, 234, 136, 1, 71, 234, 136, 1, 233, 59, 234, 136, 1, - 231, 165, 234, 136, 1, 231, 20, 234, 136, 1, 229, 245, 234, 136, 1, 68, - 234, 136, 1, 223, 10, 234, 136, 1, 222, 22, 234, 136, 1, 219, 238, 234, - 136, 1, 219, 68, 234, 136, 1, 216, 232, 234, 136, 1, 214, 121, 234, 136, - 1, 180, 234, 136, 1, 213, 150, 234, 136, 1, 74, 234, 136, 1, 210, 63, - 234, 136, 1, 208, 75, 234, 136, 1, 207, 113, 234, 136, 1, 206, 104, 234, - 136, 1, 205, 68, 234, 136, 1, 203, 113, 234, 136, 1, 199, 145, 234, 136, - 1, 199, 33, 234, 136, 1, 66, 234, 136, 1, 195, 153, 234, 136, 1, 192, - 214, 234, 136, 1, 192, 159, 234, 136, 1, 191, 87, 234, 136, 1, 191, 62, - 234, 136, 1, 231, 77, 234, 136, 1, 231, 83, 234, 136, 1, 221, 197, 247, - 75, 251, 193, 1, 251, 159, 247, 75, 251, 193, 1, 248, 214, 247, 75, 251, - 193, 1, 231, 40, 247, 75, 251, 193, 1, 237, 211, 247, 75, 251, 193, 1, - 234, 199, 247, 75, 251, 193, 1, 191, 98, 247, 75, 251, 193, 1, 233, 184, - 247, 75, 251, 193, 1, 191, 56, 247, 75, 251, 193, 1, 199, 174, 247, 75, - 251, 193, 1, 247, 1, 247, 75, 251, 193, 1, 191, 236, 247, 75, 251, 193, - 1, 191, 71, 247, 75, 251, 193, 1, 223, 76, 247, 75, 251, 193, 1, 203, - 165, 247, 75, 251, 193, 1, 220, 24, 247, 75, 251, 193, 1, 223, 89, 247, - 75, 251, 193, 1, 192, 210, 247, 75, 251, 193, 1, 235, 43, 247, 75, 251, - 193, 1, 247, 102, 247, 75, 251, 193, 1, 222, 245, 247, 75, 251, 193, 1, - 222, 65, 247, 75, 251, 193, 1, 218, 177, 247, 75, 251, 193, 1, 229, 179, - 247, 75, 251, 193, 1, 208, 76, 247, 75, 251, 193, 1, 251, 67, 247, 75, - 251, 193, 1, 243, 57, 247, 75, 251, 193, 1, 243, 95, 247, 75, 251, 193, - 1, 238, 140, 247, 75, 251, 193, 1, 217, 68, 247, 75, 251, 193, 1, 208, - 81, 247, 75, 251, 193, 1, 212, 252, 247, 75, 251, 193, 1, 235, 20, 247, - 75, 251, 193, 1, 203, 147, 247, 75, 251, 193, 1, 223, 11, 247, 75, 251, - 193, 1, 211, 104, 247, 75, 251, 193, 1, 197, 3, 247, 75, 251, 193, 1, - 233, 82, 247, 75, 251, 193, 1, 235, 33, 247, 75, 251, 193, 1, 243, 133, - 247, 75, 251, 193, 1, 210, 34, 247, 75, 251, 193, 1, 231, 67, 247, 75, - 251, 193, 1, 207, 130, 247, 75, 251, 193, 1, 203, 174, 247, 75, 251, 193, - 1, 195, 72, 247, 75, 251, 193, 1, 198, 118, 247, 75, 251, 193, 1, 203, - 18, 247, 75, 251, 193, 1, 223, 46, 247, 75, 251, 193, 1, 238, 141, 247, - 75, 251, 193, 1, 247, 67, 247, 75, 251, 193, 1, 192, 84, 247, 75, 251, - 193, 1, 209, 114, 247, 75, 251, 193, 1, 221, 117, 247, 75, 251, 193, 242, - 254, 77, 195, 29, 6, 1, 65, 195, 29, 6, 1, 249, 48, 195, 29, 6, 1, 249, - 17, 195, 29, 6, 1, 247, 42, 195, 29, 6, 1, 243, 127, 195, 29, 6, 1, 237, - 146, 195, 29, 6, 1, 237, 59, 195, 29, 6, 1, 234, 166, 195, 29, 6, 1, 71, - 195, 29, 6, 1, 233, 59, 195, 29, 6, 1, 231, 240, 195, 29, 6, 1, 140, 195, - 29, 6, 1, 229, 177, 195, 29, 6, 1, 68, 195, 29, 6, 1, 223, 196, 195, 29, - 6, 1, 223, 10, 195, 29, 6, 1, 155, 195, 29, 6, 1, 173, 195, 29, 6, 1, - 219, 73, 195, 29, 6, 1, 216, 232, 195, 29, 6, 1, 214, 121, 195, 29, 6, 1, - 213, 150, 195, 29, 6, 1, 74, 195, 29, 6, 1, 210, 63, 195, 29, 6, 1, 208, - 96, 195, 29, 6, 1, 207, 113, 195, 29, 6, 1, 205, 68, 195, 29, 6, 1, 203, - 113, 195, 29, 6, 1, 199, 145, 195, 29, 6, 1, 199, 33, 195, 29, 6, 1, 66, - 195, 29, 6, 1, 195, 153, 195, 29, 6, 1, 192, 214, 195, 29, 6, 1, 192, - 159, 195, 29, 6, 1, 191, 87, 195, 29, 2, 1, 65, 195, 29, 2, 1, 249, 48, - 195, 29, 2, 1, 249, 17, 195, 29, 2, 1, 247, 42, 195, 29, 2, 1, 243, 127, - 195, 29, 2, 1, 237, 146, 195, 29, 2, 1, 237, 59, 195, 29, 2, 1, 234, 166, - 195, 29, 2, 1, 71, 195, 29, 2, 1, 233, 59, 195, 29, 2, 1, 231, 240, 195, - 29, 2, 1, 140, 195, 29, 2, 1, 229, 177, 195, 29, 2, 1, 68, 195, 29, 2, 1, - 223, 196, 195, 29, 2, 1, 223, 10, 195, 29, 2, 1, 155, 195, 29, 2, 1, 173, - 195, 29, 2, 1, 219, 73, 195, 29, 2, 1, 216, 232, 195, 29, 2, 1, 214, 121, - 195, 29, 2, 1, 213, 150, 195, 29, 2, 1, 74, 195, 29, 2, 1, 210, 63, 195, - 29, 2, 1, 208, 96, 195, 29, 2, 1, 207, 113, 195, 29, 2, 1, 205, 68, 195, - 29, 2, 1, 203, 113, 195, 29, 2, 1, 199, 145, 195, 29, 2, 1, 199, 33, 195, - 29, 2, 1, 66, 195, 29, 2, 1, 195, 153, 195, 29, 2, 1, 192, 214, 195, 29, - 2, 1, 192, 159, 195, 29, 2, 1, 191, 87, 32, 42, 3, 252, 154, 32, 42, 3, - 252, 153, 32, 42, 3, 252, 152, 32, 42, 3, 252, 151, 32, 42, 3, 252, 150, - 32, 42, 3, 252, 149, 32, 42, 3, 252, 148, 32, 42, 3, 252, 147, 32, 42, 3, - 252, 146, 32, 42, 3, 252, 145, 32, 42, 3, 252, 144, 32, 42, 3, 252, 143, - 32, 42, 3, 252, 142, 32, 42, 3, 252, 141, 32, 42, 3, 252, 140, 32, 42, 3, - 252, 139, 32, 42, 3, 252, 138, 32, 42, 3, 252, 137, 32, 42, 3, 252, 136, - 32, 42, 3, 252, 135, 32, 42, 3, 252, 134, 32, 42, 3, 252, 133, 32, 42, 3, - 252, 132, 32, 42, 3, 252, 131, 32, 42, 3, 252, 130, 32, 42, 3, 252, 129, - 32, 42, 3, 252, 128, 32, 42, 3, 255, 164, 32, 42, 3, 252, 127, 32, 42, 3, - 252, 126, 32, 42, 3, 252, 125, 32, 42, 3, 252, 124, 32, 42, 3, 252, 123, - 32, 42, 3, 252, 122, 32, 42, 3, 252, 121, 32, 42, 3, 252, 120, 32, 42, 3, - 252, 119, 32, 42, 3, 252, 118, 32, 42, 3, 252, 117, 32, 42, 3, 252, 116, - 32, 42, 3, 252, 115, 32, 42, 3, 252, 114, 32, 42, 3, 252, 113, 32, 42, 3, - 252, 112, 32, 42, 3, 252, 111, 32, 42, 3, 252, 110, 32, 42, 3, 252, 109, - 32, 42, 3, 252, 108, 32, 42, 3, 252, 107, 32, 42, 3, 252, 106, 32, 42, 3, - 252, 105, 32, 42, 3, 252, 104, 32, 42, 3, 252, 103, 32, 42, 3, 252, 102, - 32, 42, 3, 252, 101, 32, 42, 3, 252, 100, 32, 42, 3, 252, 99, 32, 42, 3, - 252, 98, 32, 42, 3, 252, 97, 32, 42, 3, 252, 96, 32, 42, 3, 252, 95, 32, - 42, 3, 252, 94, 32, 42, 3, 252, 93, 32, 42, 3, 252, 92, 32, 42, 3, 252, - 91, 32, 42, 3, 252, 90, 32, 42, 3, 252, 89, 32, 42, 3, 252, 88, 32, 42, - 3, 252, 87, 32, 42, 3, 252, 86, 32, 42, 3, 252, 85, 32, 42, 3, 255, 77, - 32, 42, 3, 252, 84, 32, 42, 3, 252, 83, 32, 42, 3, 255, 42, 32, 42, 3, - 252, 82, 32, 42, 3, 252, 81, 32, 42, 3, 252, 80, 32, 42, 3, 252, 79, 32, - 42, 3, 255, 29, 32, 42, 3, 252, 78, 32, 42, 3, 252, 77, 32, 42, 3, 252, - 76, 32, 42, 3, 252, 75, 32, 42, 3, 252, 74, 32, 42, 3, 254, 101, 32, 42, - 3, 254, 100, 32, 42, 3, 254, 99, 32, 42, 3, 254, 98, 32, 42, 3, 254, 97, - 32, 42, 3, 254, 96, 32, 42, 3, 254, 95, 32, 42, 3, 254, 94, 32, 42, 3, - 254, 92, 32, 42, 3, 254, 91, 32, 42, 3, 254, 90, 32, 42, 3, 254, 89, 32, - 42, 3, 254, 88, 32, 42, 3, 254, 87, 32, 42, 3, 254, 85, 32, 42, 3, 254, - 84, 32, 42, 3, 254, 83, 32, 42, 3, 254, 82, 32, 42, 3, 254, 81, 32, 42, - 3, 254, 80, 32, 42, 3, 254, 79, 32, 42, 3, 254, 78, 32, 42, 3, 254, 77, - 32, 42, 3, 254, 76, 32, 42, 3, 254, 75, 32, 42, 3, 254, 74, 32, 42, 3, - 254, 73, 32, 42, 3, 254, 72, 32, 42, 3, 254, 71, 32, 42, 3, 254, 70, 32, - 42, 3, 254, 69, 32, 42, 3, 254, 68, 32, 42, 3, 254, 67, 32, 42, 3, 254, - 65, 32, 42, 3, 254, 64, 32, 42, 3, 254, 63, 32, 42, 3, 254, 59, 32, 42, - 3, 254, 58, 32, 42, 3, 254, 57, 32, 42, 3, 254, 56, 32, 42, 3, 254, 52, - 32, 42, 3, 254, 51, 32, 42, 3, 254, 50, 32, 42, 3, 254, 49, 32, 42, 3, - 254, 48, 32, 42, 3, 254, 47, 32, 42, 3, 254, 46, 32, 42, 3, 254, 45, 32, - 42, 3, 254, 44, 32, 42, 3, 254, 43, 32, 42, 3, 254, 42, 32, 42, 3, 254, - 41, 32, 42, 3, 254, 40, 32, 42, 3, 254, 39, 32, 42, 3, 254, 38, 32, 42, - 3, 254, 37, 32, 42, 3, 254, 36, 32, 42, 3, 254, 35, 32, 42, 3, 254, 34, - 32, 42, 3, 254, 33, 32, 42, 3, 254, 32, 32, 42, 3, 254, 31, 32, 42, 3, - 254, 30, 32, 42, 3, 254, 28, 32, 42, 3, 254, 27, 32, 42, 3, 254, 26, 32, - 42, 3, 254, 25, 32, 42, 3, 254, 24, 32, 42, 3, 254, 22, 32, 42, 3, 254, - 21, 32, 42, 3, 254, 20, 32, 42, 3, 254, 19, 32, 42, 3, 254, 17, 32, 42, - 3, 254, 16, 32, 42, 3, 254, 15, 32, 42, 3, 253, 237, 32, 42, 3, 253, 235, - 32, 42, 3, 253, 233, 32, 42, 3, 253, 231, 32, 42, 3, 253, 229, 32, 42, 3, - 253, 227, 32, 42, 3, 253, 225, 32, 42, 3, 253, 223, 32, 42, 3, 253, 221, - 32, 42, 3, 253, 219, 32, 42, 3, 253, 217, 32, 42, 3, 253, 214, 32, 42, 3, - 253, 212, 32, 42, 3, 253, 210, 32, 42, 3, 253, 208, 32, 42, 3, 253, 206, - 32, 42, 3, 253, 204, 32, 42, 3, 253, 202, 32, 42, 3, 253, 200, 32, 42, 3, - 253, 118, 32, 42, 3, 253, 117, 32, 42, 3, 253, 116, 32, 42, 3, 253, 115, - 32, 42, 3, 253, 114, 32, 42, 3, 253, 113, 32, 42, 3, 253, 111, 32, 42, 3, - 253, 110, 32, 42, 3, 253, 109, 32, 42, 3, 253, 108, 32, 42, 3, 253, 107, - 32, 42, 3, 253, 106, 32, 42, 3, 253, 104, 32, 42, 3, 253, 103, 32, 42, 3, - 253, 99, 32, 42, 3, 253, 98, 32, 42, 3, 253, 96, 32, 42, 3, 253, 95, 32, - 42, 3, 253, 94, 32, 42, 3, 253, 93, 32, 42, 3, 253, 92, 32, 42, 3, 253, - 91, 32, 42, 3, 253, 90, 32, 42, 3, 253, 89, 32, 42, 3, 253, 88, 32, 42, - 3, 253, 87, 32, 42, 3, 253, 86, 32, 42, 3, 253, 85, 32, 42, 3, 253, 84, - 32, 42, 3, 253, 83, 32, 42, 3, 253, 82, 32, 42, 3, 253, 81, 32, 42, 3, - 253, 80, 32, 42, 3, 253, 79, 32, 42, 3, 253, 78, 32, 42, 3, 253, 77, 32, - 42, 3, 253, 76, 32, 42, 3, 253, 75, 32, 42, 3, 253, 74, 32, 42, 3, 253, - 73, 32, 42, 3, 253, 72, 32, 42, 3, 253, 71, 32, 42, 3, 253, 70, 32, 42, - 3, 253, 69, 32, 42, 3, 253, 68, 32, 42, 3, 253, 67, 32, 42, 3, 253, 66, - 32, 42, 3, 253, 65, 32, 42, 3, 253, 64, 32, 42, 3, 253, 63, 32, 42, 3, - 253, 62, 32, 42, 3, 253, 61, 32, 42, 3, 253, 60, 32, 42, 3, 253, 59, 32, - 42, 3, 253, 58, 32, 42, 3, 253, 57, 32, 42, 3, 253, 56, 32, 42, 3, 253, - 55, 32, 42, 3, 253, 54, 32, 42, 3, 253, 53, 32, 42, 3, 253, 52, 32, 42, - 3, 253, 51, 32, 42, 3, 253, 50, 32, 42, 3, 253, 49, 32, 42, 3, 253, 48, - 32, 42, 3, 253, 47, 32, 42, 3, 253, 46, 32, 42, 3, 253, 45, 32, 42, 3, - 253, 44, 32, 42, 3, 253, 43, 32, 42, 3, 253, 42, 32, 42, 3, 253, 41, 32, - 42, 3, 253, 40, 32, 42, 3, 253, 39, 32, 42, 3, 253, 38, 32, 42, 3, 253, - 37, 32, 42, 3, 253, 36, 32, 42, 3, 253, 35, 32, 42, 3, 253, 34, 32, 42, - 3, 253, 33, 32, 42, 3, 253, 32, 32, 42, 3, 253, 31, 32, 42, 3, 253, 30, - 32, 42, 3, 253, 29, 32, 42, 3, 253, 28, 32, 42, 3, 253, 27, 32, 42, 3, - 253, 26, 32, 42, 3, 253, 25, 32, 42, 3, 253, 24, 32, 42, 3, 253, 23, 32, - 42, 3, 253, 22, 32, 42, 3, 253, 21, 32, 42, 3, 253, 20, 32, 42, 3, 253, - 19, 32, 42, 3, 253, 18, 32, 42, 3, 253, 17, 32, 42, 3, 253, 16, 32, 42, - 3, 253, 15, 32, 42, 3, 253, 14, 32, 42, 3, 253, 13, 32, 42, 3, 253, 12, - 32, 42, 3, 253, 11, 32, 42, 3, 253, 10, 32, 42, 3, 253, 9, 32, 42, 3, - 253, 8, 32, 42, 3, 253, 7, 32, 42, 3, 253, 6, 32, 42, 3, 253, 5, 32, 42, - 3, 253, 4, 32, 42, 3, 253, 3, 32, 42, 3, 253, 2, 32, 42, 3, 253, 1, 32, - 42, 3, 253, 0, 32, 42, 3, 252, 255, 32, 42, 3, 252, 254, 32, 42, 3, 252, - 253, 32, 42, 3, 252, 252, 32, 42, 3, 252, 251, 32, 42, 3, 252, 250, 32, - 42, 3, 252, 249, 32, 42, 3, 252, 248, 32, 42, 3, 252, 247, 32, 42, 3, - 252, 246, 32, 42, 3, 252, 245, 32, 42, 3, 252, 244, 32, 42, 3, 252, 243, - 32, 42, 3, 252, 242, 32, 42, 3, 252, 241, 32, 42, 3, 252, 240, 32, 42, 3, - 252, 239, 32, 42, 3, 252, 238, 32, 42, 3, 252, 237, 32, 42, 3, 252, 236, - 65, 32, 42, 3, 252, 235, 250, 120, 32, 42, 3, 252, 234, 238, 127, 32, 42, - 3, 252, 233, 71, 32, 42, 3, 252, 232, 233, 175, 32, 42, 3, 252, 231, 230, - 116, 32, 42, 3, 252, 230, 223, 35, 32, 42, 3, 252, 229, 222, 152, 32, 42, - 3, 252, 228, 172, 32, 42, 3, 252, 227, 220, 130, 32, 42, 3, 252, 226, - 220, 129, 32, 42, 3, 252, 225, 220, 128, 32, 42, 3, 252, 224, 220, 127, - 32, 42, 3, 252, 223, 193, 224, 32, 42, 3, 252, 222, 192, 235, 32, 42, 3, - 252, 221, 192, 159, 32, 42, 3, 252, 220, 211, 110, 32, 42, 3, 252, 219, - 252, 69, 32, 42, 3, 252, 218, 249, 54, 32, 42, 3, 252, 217, 237, 193, 32, - 42, 3, 252, 216, 233, 183, 32, 42, 3, 252, 215, 223, 10, 32, 42, 3, 252, - 214, 32, 42, 3, 252, 213, 32, 42, 3, 252, 212, 32, 42, 3, 252, 211, 32, - 42, 3, 252, 210, 32, 42, 3, 252, 209, 32, 42, 3, 252, 208, 32, 42, 3, - 252, 207, 52, 1, 2, 6, 252, 206, 52, 1, 200, 182, 197, 238, 242, 83, 52, - 1, 200, 182, 132, 197, 238, 242, 83, 52, 1, 2, 252, 25, 52, 1, 2, 6, 250, - 120, 52, 1, 2, 78, 4, 102, 52, 1, 2, 235, 37, 237, 2, 52, 1, 2, 235, 37, - 237, 3, 4, 207, 24, 102, 52, 1, 2, 235, 37, 237, 3, 4, 238, 175, 52, 1, - 2, 237, 70, 237, 2, 52, 1, 2, 238, 128, 4, 199, 215, 52, 1, 2, 238, 128, - 4, 102, 52, 1, 2, 238, 128, 4, 228, 251, 23, 199, 215, 52, 1, 2, 207, 18, - 71, 52, 1, 2, 242, 219, 207, 18, 211, 77, 71, 52, 1, 2, 233, 37, 237, 2, - 52, 1, 2, 207, 140, 228, 187, 52, 1, 2, 6, 232, 51, 52, 1, 2, 232, 52, 4, - 102, 52, 1, 2, 6, 232, 52, 4, 102, 52, 1, 2, 230, 117, 4, 106, 52, 1, 2, - 6, 230, 116, 52, 1, 2, 229, 197, 4, 102, 52, 1, 2, 236, 139, 223, 36, 4, - 201, 28, 23, 102, 52, 1, 2, 218, 227, 237, 2, 52, 1, 2, 218, 170, 237, 2, - 52, 1, 2, 220, 143, 4, 248, 231, 52, 1, 2, 6, 220, 143, 4, 248, 231, 52, - 1, 2, 220, 143, 4, 207, 24, 228, 251, 23, 248, 231, 52, 1, 2, 219, 162, - 52, 1, 2, 219, 163, 4, 207, 24, 102, 52, 1, 2, 153, 192, 159, 52, 1, 2, - 153, 192, 160, 4, 248, 231, 52, 1, 2, 187, 4, 106, 52, 1, 2, 6, 211, 151, - 52, 1, 2, 242, 219, 211, 110, 52, 1, 2, 208, 104, 52, 1, 2, 153, 207, - 222, 4, 179, 219, 212, 52, 1, 2, 153, 207, 222, 4, 179, 219, 213, 23, - 207, 24, 102, 52, 1, 2, 207, 222, 4, 199, 215, 52, 1, 2, 207, 222, 4, - 232, 233, 52, 1, 2, 6, 146, 52, 1, 2, 199, 152, 237, 3, 4, 238, 175, 52, - 1, 2, 197, 170, 237, 2, 52, 1, 2, 197, 170, 237, 3, 4, 207, 24, 102, 52, - 1, 2, 199, 79, 237, 2, 52, 1, 2, 200, 44, 4, 207, 24, 102, 52, 1, 2, 196, - 13, 4, 50, 102, 52, 1, 2, 6, 192, 159, 52, 1, 231, 11, 201, 64, 4, 106, - 52, 1, 207, 18, 231, 11, 201, 64, 4, 106, 52, 1, 248, 172, 242, 231, 52, - 1, 237, 98, 242, 231, 52, 1, 220, 3, 242, 231, 52, 1, 251, 150, 242, 231, - 52, 1, 207, 24, 242, 232, 4, 207, 24, 102, 52, 1, 2, 206, 9, 4, 238, 175, - 238, 135, 5, 65, 238, 135, 5, 71, 238, 135, 5, 68, 238, 135, 5, 74, 238, - 135, 5, 66, 238, 135, 5, 223, 32, 238, 135, 5, 222, 201, 238, 135, 5, - 155, 238, 135, 5, 222, 22, 238, 135, 5, 221, 166, 238, 135, 5, 221, 67, - 238, 135, 5, 220, 232, 238, 135, 5, 173, 238, 135, 5, 219, 238, 238, 135, - 5, 219, 146, 238, 135, 5, 219, 43, 238, 135, 5, 218, 225, 238, 135, 5, - 174, 238, 135, 5, 216, 232, 238, 135, 5, 216, 100, 238, 135, 5, 216, 12, - 238, 135, 5, 215, 155, 238, 135, 5, 180, 238, 135, 5, 214, 121, 238, 135, - 5, 213, 219, 238, 135, 5, 213, 43, 238, 135, 5, 212, 178, 238, 135, 5, - 168, 238, 135, 5, 210, 63, 238, 135, 5, 209, 185, 238, 135, 5, 209, 73, - 238, 135, 5, 208, 165, 238, 135, 5, 165, 238, 135, 5, 207, 113, 238, 135, - 5, 207, 1, 238, 135, 5, 206, 162, 238, 135, 5, 206, 68, 238, 135, 5, 188, - 238, 135, 5, 205, 68, 238, 135, 5, 202, 222, 238, 135, 5, 202, 46, 238, - 135, 5, 201, 4, 238, 135, 5, 190, 190, 238, 135, 5, 199, 145, 238, 135, - 5, 198, 193, 238, 135, 5, 159, 238, 135, 5, 197, 94, 238, 135, 5, 193, - 190, 238, 135, 5, 193, 125, 238, 135, 5, 193, 86, 238, 135, 5, 193, 48, - 238, 135, 5, 192, 220, 238, 135, 5, 192, 214, 238, 135, 5, 191, 123, 238, - 135, 5, 191, 7, 223, 164, 251, 18, 1, 251, 190, 223, 164, 251, 18, 1, - 248, 211, 223, 164, 251, 18, 1, 231, 38, 223, 164, 251, 18, 1, 237, 252, - 223, 164, 251, 18, 1, 229, 245, 223, 164, 251, 18, 1, 193, 133, 223, 164, - 251, 18, 1, 191, 91, 223, 164, 251, 18, 1, 229, 184, 223, 164, 251, 18, - 1, 199, 69, 223, 164, 251, 18, 1, 191, 249, 223, 164, 251, 18, 1, 222, - 75, 223, 164, 251, 18, 1, 220, 26, 223, 164, 251, 18, 1, 216, 193, 223, - 164, 251, 18, 1, 212, 130, 223, 164, 251, 18, 1, 205, 148, 223, 164, 251, - 18, 1, 250, 126, 223, 164, 251, 18, 1, 210, 63, 223, 164, 251, 18, 1, - 205, 189, 223, 164, 251, 18, 1, 208, 37, 223, 164, 251, 18, 1, 207, 38, - 223, 164, 251, 18, 1, 203, 69, 223, 164, 251, 18, 1, 199, 159, 223, 164, - 251, 18, 205, 54, 56, 223, 164, 251, 18, 31, 107, 223, 164, 251, 18, 31, - 109, 223, 164, 251, 18, 31, 138, 223, 164, 251, 18, 31, 199, 95, 223, - 164, 251, 18, 31, 197, 32, 223, 164, 251, 18, 31, 91, 228, 140, 223, 164, - 251, 18, 31, 91, 189, 223, 164, 251, 18, 31, 199, 96, 189, 210, 180, 1, - 251, 190, 210, 180, 1, 248, 211, 210, 180, 1, 231, 38, 210, 180, 1, 237, - 252, 210, 180, 1, 229, 245, 210, 180, 1, 193, 133, 210, 180, 1, 191, 91, - 210, 180, 1, 229, 184, 210, 180, 1, 199, 69, 210, 180, 1, 191, 249, 210, - 180, 1, 222, 75, 210, 180, 1, 220, 26, 210, 180, 1, 216, 193, 210, 180, - 1, 53, 212, 130, 210, 180, 1, 212, 130, 210, 180, 1, 205, 148, 210, 180, - 1, 250, 126, 210, 180, 1, 210, 63, 210, 180, 1, 205, 189, 210, 180, 1, - 208, 37, 210, 180, 1, 207, 38, 210, 180, 1, 203, 69, 210, 180, 1, 199, - 159, 210, 180, 219, 219, 232, 201, 210, 180, 206, 203, 232, 201, 210, - 180, 31, 107, 210, 180, 31, 109, 210, 180, 31, 138, 210, 180, 31, 134, - 210, 180, 31, 149, 210, 180, 31, 199, 95, 210, 180, 31, 197, 32, 214, - 246, 1, 53, 251, 190, 214, 246, 1, 251, 190, 214, 246, 1, 53, 248, 211, - 214, 246, 1, 248, 211, 214, 246, 1, 231, 38, 214, 246, 1, 237, 252, 214, - 246, 1, 53, 229, 245, 214, 246, 1, 229, 245, 214, 246, 1, 193, 133, 214, - 246, 1, 191, 91, 214, 246, 1, 229, 184, 214, 246, 1, 199, 69, 214, 246, - 1, 53, 191, 249, 214, 246, 1, 191, 249, 214, 246, 1, 53, 222, 75, 214, - 246, 1, 222, 75, 214, 246, 1, 53, 220, 26, 214, 246, 1, 220, 26, 214, - 246, 1, 53, 216, 193, 214, 246, 1, 216, 193, 214, 246, 1, 53, 212, 130, - 214, 246, 1, 212, 130, 214, 246, 1, 205, 148, 214, 246, 1, 250, 126, 214, - 246, 1, 210, 63, 214, 246, 1, 205, 189, 214, 246, 1, 208, 37, 214, 246, - 1, 207, 38, 214, 246, 1, 53, 203, 69, 214, 246, 1, 203, 69, 214, 246, 1, - 199, 159, 214, 246, 31, 107, 214, 246, 31, 109, 214, 246, 31, 138, 214, - 246, 31, 134, 214, 246, 238, 202, 31, 134, 214, 246, 31, 149, 214, 246, - 31, 199, 95, 214, 246, 31, 197, 32, 214, 246, 31, 91, 228, 140, 230, 4, - 1, 251, 190, 230, 4, 1, 248, 211, 230, 4, 1, 231, 38, 230, 4, 1, 237, - 251, 230, 4, 1, 229, 245, 230, 4, 1, 193, 133, 230, 4, 1, 191, 89, 230, - 4, 1, 229, 184, 230, 4, 1, 199, 69, 230, 4, 1, 191, 249, 230, 4, 1, 222, - 75, 230, 4, 1, 220, 26, 230, 4, 1, 216, 193, 230, 4, 1, 212, 130, 230, 4, - 1, 205, 148, 230, 4, 1, 250, 124, 230, 4, 1, 210, 63, 230, 4, 1, 205, - 189, 230, 4, 1, 208, 37, 230, 4, 1, 203, 69, 230, 4, 1, 199, 159, 230, 4, - 31, 107, 230, 4, 31, 149, 230, 4, 31, 199, 95, 230, 4, 31, 197, 32, 230, - 4, 31, 91, 228, 140, 209, 197, 1, 251, 187, 209, 197, 1, 248, 214, 209, - 197, 1, 231, 213, 209, 197, 1, 237, 108, 209, 197, 1, 229, 245, 209, 197, - 1, 193, 140, 209, 197, 1, 191, 115, 209, 197, 1, 229, 186, 209, 197, 1, - 199, 73, 209, 197, 1, 191, 250, 209, 197, 1, 222, 106, 209, 197, 1, 220, - 32, 209, 197, 1, 216, 193, 209, 197, 1, 212, 130, 209, 197, 1, 204, 19, - 209, 197, 1, 251, 230, 209, 197, 1, 210, 63, 209, 197, 1, 205, 191, 209, - 197, 1, 208, 42, 209, 197, 1, 206, 124, 209, 197, 1, 203, 69, 209, 197, - 1, 199, 166, 209, 197, 31, 107, 209, 197, 31, 199, 95, 209, 197, 31, 197, - 32, 209, 197, 31, 91, 228, 140, 209, 197, 31, 109, 209, 197, 31, 138, - 209, 197, 193, 23, 204, 10, 218, 180, 1, 65, 218, 180, 1, 250, 120, 218, - 180, 1, 232, 51, 218, 180, 1, 238, 127, 218, 180, 1, 71, 218, 180, 1, - 196, 12, 218, 180, 1, 68, 218, 180, 1, 192, 159, 218, 180, 1, 222, 152, - 218, 180, 1, 172, 218, 180, 1, 218, 168, 218, 180, 1, 215, 61, 218, 180, - 1, 74, 218, 180, 1, 146, 218, 180, 1, 201, 178, 218, 180, 1, 200, 43, - 218, 180, 1, 66, 218, 180, 1, 233, 175, 218, 180, 1, 208, 104, 218, 180, - 1, 206, 8, 218, 180, 1, 197, 135, 218, 180, 1, 251, 132, 218, 180, 1, - 234, 103, 218, 180, 1, 218, 183, 218, 180, 1, 213, 80, 218, 180, 1, 247, - 193, 218, 180, 197, 238, 77, 152, 229, 144, 1, 65, 152, 229, 144, 1, 71, - 152, 229, 144, 1, 68, 152, 229, 144, 1, 74, 152, 229, 144, 1, 170, 152, - 229, 144, 1, 193, 190, 152, 229, 144, 1, 249, 153, 152, 229, 144, 1, 249, - 152, 152, 229, 144, 1, 168, 152, 229, 144, 1, 174, 152, 229, 144, 1, 180, - 152, 229, 144, 1, 215, 5, 152, 229, 144, 1, 214, 121, 152, 229, 144, 1, - 214, 119, 152, 229, 144, 1, 165, 152, 229, 144, 1, 207, 184, 152, 229, - 144, 1, 173, 152, 229, 144, 1, 221, 215, 152, 229, 144, 1, 229, 177, 152, - 229, 144, 1, 188, 152, 229, 144, 1, 205, 205, 152, 229, 144, 1, 205, 68, - 152, 229, 144, 1, 155, 152, 229, 144, 1, 208, 96, 152, 229, 144, 1, 190, - 190, 152, 229, 144, 1, 199, 250, 152, 229, 144, 1, 199, 145, 152, 229, - 144, 1, 199, 143, 152, 229, 144, 1, 159, 152, 229, 144, 1, 238, 32, 152, - 229, 144, 16, 195, 63, 152, 229, 144, 16, 195, 62, 152, 238, 166, 1, 65, - 152, 238, 166, 1, 71, 152, 238, 166, 1, 68, 152, 238, 166, 1, 74, 152, - 238, 166, 1, 170, 152, 238, 166, 1, 193, 190, 152, 238, 166, 1, 249, 153, - 152, 238, 166, 1, 168, 152, 238, 166, 1, 174, 152, 238, 166, 1, 180, 152, - 238, 166, 1, 214, 121, 152, 238, 166, 1, 165, 152, 238, 166, 1, 173, 152, - 238, 166, 1, 221, 215, 152, 238, 166, 1, 229, 177, 152, 238, 166, 1, 188, - 152, 238, 166, 1, 251, 14, 188, 152, 238, 166, 1, 205, 68, 152, 238, 166, - 1, 155, 152, 238, 166, 1, 208, 96, 152, 238, 166, 1, 190, 190, 152, 238, - 166, 1, 199, 145, 152, 238, 166, 1, 159, 152, 238, 166, 1, 238, 32, 152, - 238, 166, 232, 118, 234, 128, 197, 39, 152, 238, 166, 232, 118, 91, 230, - 70, 152, 238, 166, 219, 28, 206, 168, 152, 238, 166, 219, 28, 223, 169, - 152, 238, 166, 31, 107, 152, 238, 166, 31, 109, 152, 238, 166, 31, 138, - 152, 238, 166, 31, 134, 152, 238, 166, 31, 149, 152, 238, 166, 31, 169, - 152, 238, 166, 31, 175, 152, 238, 166, 31, 171, 152, 238, 166, 31, 178, - 152, 238, 166, 31, 199, 95, 152, 238, 166, 31, 197, 32, 152, 238, 166, - 31, 198, 249, 152, 238, 166, 31, 232, 135, 152, 238, 166, 31, 233, 15, - 152, 238, 166, 31, 202, 120, 152, 238, 166, 31, 203, 241, 152, 238, 166, - 31, 91, 228, 140, 152, 238, 166, 31, 105, 228, 140, 152, 238, 166, 31, - 115, 228, 140, 152, 238, 166, 31, 232, 128, 228, 140, 152, 238, 166, 31, - 232, 226, 228, 140, 152, 238, 166, 31, 202, 136, 228, 140, 152, 238, 166, - 31, 203, 247, 228, 140, 152, 238, 166, 31, 234, 164, 228, 140, 152, 238, - 166, 31, 213, 175, 228, 140, 152, 238, 166, 31, 91, 189, 152, 238, 166, - 31, 105, 189, 152, 238, 166, 31, 115, 189, 152, 238, 166, 31, 232, 128, - 189, 152, 238, 166, 31, 232, 226, 189, 152, 238, 166, 31, 202, 136, 189, - 152, 238, 166, 31, 203, 247, 189, 152, 238, 166, 31, 234, 164, 189, 152, - 238, 166, 31, 213, 175, 189, 152, 238, 166, 31, 199, 96, 189, 152, 238, - 166, 31, 197, 33, 189, 152, 238, 166, 31, 198, 250, 189, 152, 238, 166, - 31, 232, 136, 189, 152, 238, 166, 31, 233, 16, 189, 152, 238, 166, 31, - 202, 121, 189, 152, 238, 166, 31, 203, 242, 189, 152, 238, 166, 31, 234, - 154, 189, 152, 238, 166, 31, 213, 170, 189, 152, 238, 166, 31, 91, 228, - 141, 189, 152, 238, 166, 31, 105, 228, 141, 189, 152, 238, 166, 31, 115, - 228, 141, 189, 152, 238, 166, 31, 232, 128, 228, 141, 189, 152, 238, 166, - 31, 232, 226, 228, 141, 189, 152, 238, 166, 31, 202, 136, 228, 141, 189, - 152, 238, 166, 31, 203, 247, 228, 141, 189, 152, 238, 166, 31, 234, 164, - 228, 141, 189, 152, 238, 166, 31, 213, 175, 228, 141, 189, 152, 238, 166, - 232, 118, 91, 197, 40, 152, 238, 166, 232, 118, 105, 197, 39, 152, 238, - 166, 232, 118, 115, 197, 39, 152, 238, 166, 232, 118, 232, 128, 197, 39, - 152, 238, 166, 232, 118, 232, 226, 197, 39, 152, 238, 166, 232, 118, 202, - 136, 197, 39, 152, 238, 166, 232, 118, 203, 247, 197, 39, 152, 238, 166, - 232, 118, 234, 164, 197, 39, 152, 238, 166, 232, 118, 213, 175, 197, 39, - 152, 238, 166, 232, 118, 199, 96, 197, 39, 221, 199, 1, 65, 221, 199, 18, - 3, 68, 221, 199, 18, 3, 66, 221, 199, 18, 3, 117, 146, 221, 199, 18, 3, - 71, 221, 199, 18, 3, 74, 221, 199, 18, 219, 198, 77, 221, 199, 3, 55, - 206, 189, 60, 221, 199, 3, 251, 71, 221, 199, 3, 195, 35, 221, 199, 1, - 155, 221, 199, 1, 221, 215, 221, 199, 1, 231, 240, 221, 199, 1, 231, 91, - 221, 199, 1, 247, 160, 221, 199, 1, 247, 1, 221, 199, 1, 223, 32, 221, - 199, 1, 212, 101, 221, 199, 1, 197, 132, 221, 199, 1, 197, 120, 221, 199, - 1, 237, 191, 221, 199, 1, 237, 175, 221, 199, 1, 213, 79, 221, 199, 1, - 190, 190, 221, 199, 1, 199, 49, 221, 199, 1, 238, 32, 221, 199, 1, 237, - 68, 221, 199, 1, 180, 221, 199, 1, 168, 221, 199, 1, 209, 228, 221, 199, - 1, 249, 153, 221, 199, 1, 248, 203, 221, 199, 1, 174, 221, 199, 1, 170, - 221, 199, 1, 165, 221, 199, 1, 173, 221, 199, 1, 195, 188, 221, 199, 1, - 203, 165, 221, 199, 1, 201, 175, 221, 199, 1, 188, 221, 199, 1, 191, 123, - 221, 199, 1, 140, 221, 199, 1, 221, 101, 221, 199, 1, 197, 100, 221, 199, - 1, 197, 101, 221, 199, 1, 195, 70, 221, 199, 3, 249, 88, 58, 221, 199, 3, - 247, 74, 221, 199, 3, 75, 60, 221, 199, 195, 40, 221, 199, 17, 107, 221, - 199, 17, 109, 221, 199, 17, 138, 221, 199, 17, 134, 221, 199, 31, 199, - 95, 221, 199, 31, 197, 32, 221, 199, 31, 91, 228, 140, 221, 199, 31, 91, - 189, 221, 199, 232, 118, 91, 230, 70, 221, 199, 208, 152, 236, 140, 221, - 199, 208, 152, 2, 243, 10, 221, 199, 208, 152, 243, 10, 221, 199, 208, - 152, 238, 228, 164, 221, 199, 208, 152, 217, 83, 221, 199, 208, 152, 218, - 246, 221, 199, 208, 152, 237, 238, 221, 199, 208, 152, 55, 237, 238, 221, - 199, 208, 152, 219, 106, 39, 202, 2, 251, 29, 1, 229, 245, 39, 202, 2, - 251, 29, 1, 220, 26, 39, 202, 2, 251, 29, 1, 229, 184, 39, 202, 2, 251, - 29, 1, 216, 193, 39, 202, 2, 251, 29, 1, 208, 37, 39, 202, 2, 251, 29, 1, - 193, 133, 39, 202, 2, 251, 29, 1, 203, 69, 39, 202, 2, 251, 29, 1, 207, - 38, 39, 202, 2, 251, 29, 1, 248, 211, 39, 202, 2, 251, 29, 1, 199, 159, - 39, 202, 2, 251, 29, 1, 205, 122, 39, 202, 2, 251, 29, 1, 222, 75, 39, - 202, 2, 251, 29, 1, 212, 130, 39, 202, 2, 251, 29, 1, 221, 194, 39, 202, - 2, 251, 29, 1, 205, 189, 39, 202, 2, 251, 29, 1, 205, 148, 39, 202, 2, - 251, 29, 1, 233, 59, 39, 202, 2, 251, 29, 1, 251, 192, 39, 202, 2, 251, - 29, 1, 250, 124, 39, 202, 2, 251, 29, 1, 237, 65, 39, 202, 2, 251, 29, 1, - 231, 38, 39, 202, 2, 251, 29, 1, 237, 252, 39, 202, 2, 251, 29, 1, 231, - 79, 39, 202, 2, 251, 29, 1, 199, 69, 39, 202, 2, 251, 29, 1, 191, 89, 39, - 202, 2, 251, 29, 1, 237, 62, 39, 202, 2, 251, 29, 1, 191, 249, 39, 202, - 2, 251, 29, 1, 199, 35, 39, 202, 2, 251, 29, 1, 199, 14, 39, 202, 2, 251, - 29, 31, 107, 39, 202, 2, 251, 29, 31, 233, 15, 39, 202, 2, 251, 29, 167, - 223, 144, 39, 186, 251, 29, 1, 229, 210, 39, 186, 251, 29, 1, 220, 35, - 39, 186, 251, 29, 1, 230, 81, 39, 186, 251, 29, 1, 216, 208, 39, 186, - 251, 29, 1, 208, 89, 39, 186, 251, 29, 1, 193, 133, 39, 186, 251, 29, 1, - 234, 20, 39, 186, 251, 29, 1, 207, 71, 39, 186, 251, 29, 1, 248, 245, 39, - 186, 251, 29, 1, 199, 114, 39, 186, 251, 29, 1, 234, 21, 39, 186, 251, - 29, 1, 222, 106, 39, 186, 251, 29, 1, 213, 24, 39, 186, 251, 29, 1, 221, - 210, 39, 186, 251, 29, 1, 205, 192, 39, 186, 251, 29, 1, 234, 19, 39, - 186, 251, 29, 1, 233, 46, 39, 186, 251, 29, 1, 251, 192, 39, 186, 251, - 29, 1, 251, 230, 39, 186, 251, 29, 1, 238, 26, 39, 186, 251, 29, 1, 231, - 156, 39, 186, 251, 29, 1, 238, 3, 39, 186, 251, 29, 1, 231, 86, 39, 186, - 251, 29, 1, 199, 219, 39, 186, 251, 29, 1, 191, 113, 39, 186, 251, 29, 1, - 199, 41, 39, 186, 251, 29, 1, 192, 75, 39, 186, 251, 29, 1, 199, 29, 39, - 186, 251, 29, 1, 191, 116, 39, 186, 251, 29, 31, 107, 39, 186, 251, 29, - 31, 199, 95, 39, 186, 251, 29, 31, 197, 32, 217, 81, 1, 251, 190, 217, - 81, 1, 248, 211, 217, 81, 1, 248, 194, 217, 81, 1, 231, 38, 217, 81, 1, - 231, 64, 217, 81, 1, 237, 252, 217, 81, 1, 229, 245, 217, 81, 1, 193, - 133, 217, 81, 3, 196, 158, 217, 81, 1, 191, 91, 217, 81, 1, 191, 64, 217, - 81, 1, 223, 12, 217, 81, 1, 222, 248, 217, 81, 1, 229, 184, 217, 81, 1, - 199, 69, 217, 81, 1, 191, 249, 217, 81, 1, 222, 75, 217, 81, 1, 192, 217, - 217, 81, 1, 221, 201, 217, 81, 1, 220, 26, 217, 81, 1, 237, 61, 217, 81, - 1, 199, 40, 217, 81, 1, 216, 193, 217, 81, 1, 212, 130, 217, 81, 1, 205, - 148, 217, 81, 1, 250, 126, 217, 81, 1, 252, 158, 217, 81, 1, 210, 63, - 217, 81, 1, 233, 59, 217, 81, 1, 205, 189, 217, 81, 1, 208, 37, 217, 81, - 1, 192, 193, 217, 81, 1, 208, 64, 217, 81, 1, 207, 38, 217, 81, 1, 203, - 69, 217, 81, 1, 201, 143, 217, 81, 1, 199, 159, 217, 81, 252, 68, 87, 58, - 217, 81, 252, 68, 87, 60, 217, 81, 31, 107, 217, 81, 31, 149, 217, 81, - 31, 199, 95, 217, 81, 31, 197, 32, 217, 81, 31, 91, 228, 140, 217, 81, - 208, 152, 201, 102, 217, 81, 208, 152, 232, 201, 217, 81, 208, 152, 55, - 75, 193, 53, 236, 140, 217, 81, 208, 152, 75, 193, 53, 236, 140, 217, 81, - 208, 152, 236, 140, 217, 81, 208, 152, 105, 236, 138, 217, 81, 208, 152, - 219, 113, 233, 3, 250, 142, 1, 65, 250, 142, 1, 252, 206, 250, 142, 1, - 251, 68, 250, 142, 1, 252, 164, 250, 142, 1, 251, 132, 250, 142, 1, 252, - 166, 250, 142, 1, 252, 25, 250, 142, 1, 252, 21, 250, 142, 1, 71, 250, - 142, 1, 234, 188, 250, 142, 1, 74, 250, 142, 1, 211, 87, 250, 142, 1, 68, - 250, 142, 1, 223, 199, 250, 142, 1, 66, 250, 142, 1, 196, 30, 250, 142, - 1, 222, 22, 250, 142, 1, 192, 214, 250, 142, 1, 192, 173, 250, 142, 1, - 192, 184, 250, 142, 1, 231, 165, 250, 142, 1, 231, 122, 250, 142, 1, 231, - 77, 250, 142, 1, 247, 42, 250, 142, 1, 223, 10, 250, 142, 1, 199, 145, - 250, 142, 1, 199, 33, 250, 142, 1, 237, 146, 250, 142, 1, 237, 59, 250, - 142, 1, 197, 127, 250, 142, 1, 210, 63, 250, 142, 1, 233, 59, 250, 142, - 1, 249, 17, 250, 142, 1, 248, 196, 250, 142, 1, 214, 55, 250, 142, 1, - 213, 226, 250, 142, 1, 213, 227, 250, 142, 1, 214, 121, 250, 142, 1, 212, - 90, 250, 142, 1, 213, 74, 250, 142, 1, 216, 232, 250, 142, 1, 229, 73, - 250, 142, 1, 191, 173, 250, 142, 1, 192, 80, 250, 142, 1, 195, 153, 250, - 142, 1, 207, 113, 250, 142, 1, 219, 238, 250, 142, 1, 205, 68, 250, 142, - 1, 191, 87, 250, 142, 1, 203, 113, 250, 142, 1, 191, 62, 250, 142, 1, - 202, 229, 250, 142, 1, 201, 144, 250, 142, 1, 229, 245, 250, 142, 252, - 68, 77, 198, 138, 105, 185, 139, 91, 75, 208, 151, 2, 105, 185, 139, 91, - 75, 208, 151, 220, 13, 105, 185, 139, 91, 75, 208, 151, 220, 13, 91, 75, - 139, 105, 185, 208, 151, 220, 13, 105, 206, 185, 139, 91, 206, 189, 208, - 151, 220, 13, 91, 206, 189, 139, 105, 206, 185, 208, 151, 223, 122, 210, - 106, 1, 251, 190, 223, 122, 210, 106, 1, 248, 211, 223, 122, 210, 106, 1, - 231, 38, 223, 122, 210, 106, 1, 237, 252, 223, 122, 210, 106, 1, 229, - 245, 223, 122, 210, 106, 1, 193, 133, 223, 122, 210, 106, 1, 191, 91, - 223, 122, 210, 106, 1, 229, 184, 223, 122, 210, 106, 1, 199, 69, 223, - 122, 210, 106, 1, 191, 249, 223, 122, 210, 106, 1, 222, 75, 223, 122, - 210, 106, 1, 220, 26, 223, 122, 210, 106, 1, 216, 193, 223, 122, 210, - 106, 1, 212, 130, 223, 122, 210, 106, 1, 205, 148, 223, 122, 210, 106, 1, - 250, 126, 223, 122, 210, 106, 1, 210, 63, 223, 122, 210, 106, 1, 205, - 189, 223, 122, 210, 106, 1, 208, 37, 223, 122, 210, 106, 1, 207, 38, 223, - 122, 210, 106, 1, 203, 69, 223, 122, 210, 106, 1, 199, 159, 223, 122, - 210, 106, 31, 107, 223, 122, 210, 106, 31, 109, 223, 122, 210, 106, 31, - 138, 223, 122, 210, 106, 31, 134, 223, 122, 210, 106, 31, 199, 95, 223, - 122, 210, 106, 31, 197, 32, 223, 122, 210, 106, 31, 91, 228, 140, 223, - 122, 210, 106, 31, 91, 189, 223, 122, 210, 199, 1, 251, 190, 223, 122, - 210, 199, 1, 248, 211, 223, 122, 210, 199, 1, 231, 38, 223, 122, 210, - 199, 1, 237, 252, 223, 122, 210, 199, 1, 229, 245, 223, 122, 210, 199, 1, - 193, 132, 223, 122, 210, 199, 1, 191, 91, 223, 122, 210, 199, 1, 229, - 184, 223, 122, 210, 199, 1, 199, 69, 223, 122, 210, 199, 1, 191, 249, - 223, 122, 210, 199, 1, 222, 75, 223, 122, 210, 199, 1, 220, 26, 223, 122, - 210, 199, 1, 216, 192, 223, 122, 210, 199, 1, 212, 130, 223, 122, 210, - 199, 1, 205, 148, 223, 122, 210, 199, 1, 210, 63, 223, 122, 210, 199, 1, - 205, 189, 223, 122, 210, 199, 1, 203, 69, 223, 122, 210, 199, 1, 199, - 159, 223, 122, 210, 199, 31, 107, 223, 122, 210, 199, 31, 109, 223, 122, - 210, 199, 31, 138, 223, 122, 210, 199, 31, 134, 223, 122, 210, 199, 31, - 199, 95, 223, 122, 210, 199, 31, 197, 32, 223, 122, 210, 199, 31, 91, - 228, 140, 223, 122, 210, 199, 31, 91, 189, 208, 177, 210, 199, 1, 251, - 190, 208, 177, 210, 199, 1, 248, 211, 208, 177, 210, 199, 1, 231, 38, - 208, 177, 210, 199, 1, 237, 252, 208, 177, 210, 199, 1, 229, 245, 208, - 177, 210, 199, 1, 193, 132, 208, 177, 210, 199, 1, 191, 91, 208, 177, - 210, 199, 1, 229, 184, 208, 177, 210, 199, 1, 191, 249, 208, 177, 210, - 199, 1, 222, 75, 208, 177, 210, 199, 1, 220, 26, 208, 177, 210, 199, 1, - 216, 192, 208, 177, 210, 199, 1, 212, 130, 208, 177, 210, 199, 1, 205, - 148, 208, 177, 210, 199, 1, 210, 63, 208, 177, 210, 199, 1, 205, 189, - 208, 177, 210, 199, 1, 203, 69, 208, 177, 210, 199, 1, 199, 159, 208, - 177, 210, 199, 205, 54, 77, 208, 177, 210, 199, 153, 205, 54, 77, 208, - 177, 210, 199, 232, 128, 185, 4, 238, 217, 208, 177, 210, 199, 232, 128, - 185, 4, 236, 140, 208, 177, 210, 199, 31, 107, 208, 177, 210, 199, 31, - 109, 208, 177, 210, 199, 31, 138, 208, 177, 210, 199, 31, 134, 208, 177, - 210, 199, 31, 199, 95, 208, 177, 210, 199, 31, 197, 32, 208, 177, 210, - 199, 31, 91, 228, 140, 39, 197, 61, 1, 211, 44, 65, 39, 197, 61, 1, 192, - 68, 65, 39, 197, 61, 1, 192, 68, 252, 25, 39, 197, 61, 1, 211, 44, 68, + 1, 170, 216, 207, 217, 20, 1, 221, 53, 216, 207, 217, 20, 1, 205, 153, + 216, 207, 217, 20, 1, 220, 98, 216, 207, 217, 20, 1, 216, 25, 216, 207, + 217, 20, 1, 168, 216, 207, 217, 20, 1, 181, 216, 207, 217, 20, 1, 243, + 89, 216, 207, 217, 20, 1, 198, 154, 216, 207, 217, 20, 1, 221, 178, 216, + 207, 217, 20, 1, 213, 241, 216, 207, 217, 20, 1, 198, 232, 216, 207, 217, + 20, 1, 193, 173, 216, 207, 217, 20, 1, 192, 106, 216, 207, 217, 20, 1, + 228, 149, 216, 207, 217, 20, 1, 196, 113, 216, 207, 217, 20, 1, 68, 216, + 207, 217, 20, 1, 209, 224, 216, 207, 217, 20, 1, 250, 177, 216, 207, 217, + 20, 1, 230, 253, 216, 207, 217, 20, 1, 222, 252, 216, 207, 217, 20, 1, + 207, 158, 216, 207, 217, 20, 1, 249, 155, 216, 207, 217, 20, 1, 222, 236, + 216, 207, 217, 20, 1, 237, 3, 216, 207, 217, 20, 1, 231, 62, 216, 207, + 217, 20, 1, 237, 48, 216, 207, 217, 20, 1, 248, 200, 216, 207, 217, 20, + 1, 221, 54, 219, 11, 216, 207, 217, 20, 1, 220, 99, 219, 11, 216, 207, + 217, 20, 1, 216, 26, 219, 11, 216, 207, 217, 20, 1, 210, 223, 219, 11, + 216, 207, 217, 20, 1, 215, 9, 219, 11, 216, 207, 217, 20, 1, 198, 155, + 219, 11, 216, 207, 217, 20, 1, 213, 242, 219, 11, 216, 207, 217, 20, 1, + 228, 76, 219, 11, 216, 207, 217, 20, 18, 3, 211, 104, 216, 207, 217, 20, + 18, 3, 223, 162, 216, 207, 217, 20, 18, 3, 251, 132, 216, 207, 217, 20, + 18, 3, 192, 69, 216, 207, 217, 20, 18, 3, 202, 7, 216, 207, 217, 20, 18, + 3, 196, 110, 216, 207, 217, 20, 18, 3, 243, 116, 216, 207, 217, 20, 18, + 3, 212, 129, 216, 207, 217, 20, 243, 117, 216, 207, 217, 20, 218, 211, + 223, 44, 216, 207, 217, 20, 251, 40, 223, 44, 216, 207, 217, 20, 17, 191, + 77, 216, 207, 217, 20, 17, 107, 216, 207, 217, 20, 17, 109, 216, 207, + 217, 20, 17, 138, 216, 207, 217, 20, 17, 134, 216, 207, 217, 20, 17, 150, + 216, 207, 217, 20, 17, 169, 216, 207, 217, 20, 17, 175, 216, 207, 217, + 20, 17, 171, 216, 207, 217, 20, 17, 178, 30, 222, 176, 212, 5, 30, 222, + 176, 212, 10, 30, 222, 176, 192, 5, 30, 222, 176, 192, 4, 30, 222, 176, + 192, 3, 30, 222, 176, 196, 218, 30, 222, 176, 196, 222, 30, 222, 176, + 191, 219, 30, 222, 176, 191, 215, 30, 222, 176, 233, 243, 30, 222, 176, + 233, 241, 30, 222, 176, 233, 242, 30, 222, 176, 233, 239, 30, 222, 176, + 228, 62, 30, 222, 176, 228, 61, 30, 222, 176, 228, 59, 30, 222, 176, 228, + 60, 30, 222, 176, 228, 65, 30, 222, 176, 228, 58, 30, 222, 176, 228, 57, + 30, 222, 176, 228, 67, 30, 222, 176, 251, 26, 30, 222, 176, 251, 25, 30, + 125, 213, 199, 30, 125, 213, 205, 30, 125, 201, 157, 30, 125, 201, 156, + 30, 125, 198, 163, 30, 125, 198, 161, 30, 125, 198, 160, 30, 125, 198, + 166, 30, 125, 198, 167, 30, 125, 198, 159, 30, 125, 206, 219, 30, 125, + 206, 234, 30, 125, 201, 163, 30, 125, 206, 231, 30, 125, 206, 221, 30, + 125, 206, 223, 30, 125, 206, 210, 30, 125, 206, 211, 30, 125, 222, 70, + 30, 125, 216, 74, 30, 125, 216, 68, 30, 125, 201, 167, 30, 125, 216, 71, + 30, 125, 216, 77, 30, 125, 209, 152, 30, 125, 209, 161, 30, 125, 209, + 165, 30, 125, 201, 165, 30, 125, 209, 155, 30, 125, 209, 169, 30, 125, + 209, 170, 30, 125, 202, 153, 30, 125, 202, 156, 30, 125, 201, 161, 30, + 125, 201, 159, 30, 125, 202, 151, 30, 125, 202, 159, 30, 125, 202, 160, + 30, 125, 202, 145, 30, 125, 202, 158, 30, 125, 210, 149, 30, 125, 210, + 150, 30, 125, 192, 53, 30, 125, 192, 56, 30, 125, 243, 24, 30, 125, 243, + 23, 30, 125, 201, 172, 30, 125, 209, 208, 30, 125, 209, 207, 12, 15, 225, + 192, 12, 15, 225, 191, 12, 15, 225, 190, 12, 15, 225, 189, 12, 15, 225, + 188, 12, 15, 225, 187, 12, 15, 225, 186, 12, 15, 225, 185, 12, 15, 225, + 184, 12, 15, 225, 183, 12, 15, 225, 182, 12, 15, 225, 181, 12, 15, 225, + 180, 12, 15, 225, 179, 12, 15, 225, 178, 12, 15, 225, 177, 12, 15, 225, + 176, 12, 15, 225, 175, 12, 15, 225, 174, 12, 15, 225, 173, 12, 15, 225, + 172, 12, 15, 225, 171, 12, 15, 225, 170, 12, 15, 225, 169, 12, 15, 225, + 168, 12, 15, 225, 167, 12, 15, 225, 166, 12, 15, 225, 165, 12, 15, 225, + 164, 12, 15, 225, 163, 12, 15, 225, 162, 12, 15, 225, 161, 12, 15, 225, + 160, 12, 15, 225, 159, 12, 15, 225, 158, 12, 15, 225, 157, 12, 15, 225, + 156, 12, 15, 225, 155, 12, 15, 225, 154, 12, 15, 225, 153, 12, 15, 225, + 152, 12, 15, 225, 151, 12, 15, 225, 150, 12, 15, 225, 149, 12, 15, 225, + 148, 12, 15, 225, 147, 12, 15, 225, 146, 12, 15, 225, 145, 12, 15, 225, + 144, 12, 15, 225, 143, 12, 15, 225, 142, 12, 15, 225, 141, 12, 15, 225, + 140, 12, 15, 225, 139, 12, 15, 225, 138, 12, 15, 225, 137, 12, 15, 225, + 136, 12, 15, 225, 135, 12, 15, 225, 134, 12, 15, 225, 133, 12, 15, 225, + 132, 12, 15, 225, 131, 12, 15, 225, 130, 12, 15, 225, 129, 12, 15, 225, + 128, 12, 15, 225, 127, 12, 15, 225, 126, 12, 15, 225, 125, 12, 15, 225, + 124, 12, 15, 225, 123, 12, 15, 225, 122, 12, 15, 225, 121, 12, 15, 225, + 120, 12, 15, 225, 119, 12, 15, 225, 118, 12, 15, 225, 117, 12, 15, 225, + 116, 12, 15, 225, 115, 12, 15, 225, 114, 12, 15, 225, 113, 12, 15, 225, + 112, 12, 15, 225, 111, 12, 15, 225, 110, 12, 15, 225, 109, 12, 15, 225, + 108, 12, 15, 225, 107, 12, 15, 225, 106, 12, 15, 225, 105, 12, 15, 225, + 104, 12, 15, 225, 103, 12, 15, 225, 102, 12, 15, 225, 101, 12, 15, 225, + 100, 12, 15, 225, 99, 12, 15, 225, 98, 12, 15, 225, 97, 12, 15, 225, 96, + 12, 15, 225, 95, 12, 15, 225, 94, 12, 15, 225, 93, 12, 15, 225, 92, 12, + 15, 225, 91, 12, 15, 225, 90, 12, 15, 225, 89, 12, 15, 225, 88, 12, 15, + 225, 87, 12, 15, 225, 86, 12, 15, 225, 85, 12, 15, 225, 84, 12, 15, 225, + 83, 12, 15, 225, 82, 12, 15, 225, 81, 12, 15, 225, 80, 12, 15, 225, 79, + 12, 15, 225, 78, 12, 15, 225, 77, 12, 15, 225, 76, 12, 15, 225, 75, 12, + 15, 225, 74, 12, 15, 225, 73, 12, 15, 225, 72, 12, 15, 225, 71, 12, 15, + 225, 70, 12, 15, 225, 69, 12, 15, 225, 68, 12, 15, 225, 67, 12, 15, 225, + 66, 12, 15, 225, 65, 12, 15, 225, 64, 12, 15, 225, 63, 12, 15, 225, 62, + 12, 15, 225, 61, 12, 15, 225, 60, 12, 15, 225, 59, 12, 15, 225, 58, 12, + 15, 225, 57, 12, 15, 225, 56, 12, 15, 225, 55, 12, 15, 225, 54, 12, 15, + 225, 53, 12, 15, 225, 52, 12, 15, 225, 51, 12, 15, 225, 50, 12, 15, 225, + 49, 12, 15, 225, 48, 12, 15, 225, 47, 12, 15, 225, 46, 12, 15, 225, 45, + 12, 15, 225, 44, 12, 15, 225, 43, 12, 15, 225, 42, 12, 15, 225, 41, 12, + 15, 225, 40, 12, 15, 225, 39, 12, 15, 225, 38, 12, 15, 225, 37, 12, 15, + 225, 36, 12, 15, 225, 35, 12, 15, 225, 34, 12, 15, 225, 33, 12, 15, 225, + 32, 12, 15, 225, 31, 12, 15, 225, 30, 12, 15, 225, 29, 12, 15, 225, 28, + 12, 15, 225, 27, 12, 15, 225, 26, 12, 15, 225, 25, 12, 15, 225, 24, 12, + 15, 225, 23, 12, 15, 225, 22, 12, 15, 225, 21, 12, 15, 225, 20, 12, 15, + 225, 19, 12, 15, 225, 18, 12, 15, 225, 17, 12, 15, 225, 16, 12, 15, 225, + 15, 12, 15, 225, 14, 12, 15, 225, 13, 12, 15, 225, 12, 12, 15, 225, 11, + 12, 15, 225, 10, 12, 15, 225, 9, 12, 15, 225, 8, 12, 15, 225, 7, 12, 15, + 225, 6, 12, 15, 225, 5, 12, 15, 225, 4, 12, 15, 225, 3, 12, 15, 225, 2, + 12, 15, 225, 1, 12, 15, 225, 0, 12, 15, 224, 255, 12, 15, 224, 254, 12, + 15, 224, 253, 12, 15, 224, 252, 12, 15, 224, 251, 12, 15, 224, 250, 12, + 15, 224, 249, 12, 15, 224, 248, 12, 15, 224, 247, 12, 15, 224, 246, 12, + 15, 224, 245, 12, 15, 224, 244, 12, 15, 224, 243, 12, 15, 224, 242, 12, + 15, 224, 241, 12, 15, 224, 240, 12, 15, 224, 239, 12, 15, 224, 238, 12, + 15, 224, 237, 12, 15, 224, 236, 12, 15, 224, 235, 12, 15, 224, 234, 12, + 15, 224, 233, 12, 15, 224, 232, 12, 15, 224, 231, 12, 15, 224, 230, 12, + 15, 224, 229, 12, 15, 224, 228, 12, 15, 224, 227, 12, 15, 224, 226, 12, + 15, 224, 225, 12, 15, 224, 224, 12, 15, 224, 223, 12, 15, 224, 222, 12, + 15, 224, 221, 12, 15, 224, 220, 12, 15, 224, 219, 12, 15, 224, 218, 12, + 15, 224, 217, 12, 15, 224, 216, 12, 15, 224, 215, 12, 15, 224, 214, 12, + 15, 224, 213, 12, 15, 224, 212, 12, 15, 224, 211, 12, 15, 224, 210, 12, + 15, 224, 209, 12, 15, 224, 208, 12, 15, 224, 207, 12, 15, 224, 206, 12, + 15, 224, 205, 12, 15, 224, 204, 12, 15, 224, 203, 12, 15, 224, 202, 12, + 15, 224, 201, 12, 15, 224, 200, 12, 15, 224, 199, 12, 15, 224, 198, 12, + 15, 224, 197, 12, 15, 224, 196, 12, 15, 224, 195, 12, 15, 224, 194, 12, + 15, 224, 193, 12, 15, 224, 192, 12, 15, 224, 191, 12, 15, 224, 190, 12, + 15, 224, 189, 12, 15, 224, 188, 12, 15, 224, 187, 12, 15, 224, 186, 12, + 15, 224, 185, 12, 15, 224, 184, 12, 15, 224, 183, 12, 15, 224, 182, 12, + 15, 224, 181, 12, 15, 224, 180, 12, 15, 224, 179, 12, 15, 224, 178, 12, + 15, 224, 177, 12, 15, 224, 176, 12, 15, 224, 175, 12, 15, 224, 174, 12, + 15, 224, 173, 12, 15, 224, 172, 12, 15, 224, 171, 12, 15, 224, 170, 12, + 15, 224, 169, 12, 15, 224, 168, 12, 15, 224, 167, 12, 15, 224, 166, 12, + 15, 224, 165, 12, 15, 224, 164, 12, 15, 224, 163, 12, 15, 224, 162, 12, + 15, 224, 161, 12, 15, 224, 160, 12, 15, 224, 159, 12, 15, 224, 158, 12, + 15, 224, 157, 12, 15, 224, 156, 12, 15, 224, 155, 12, 15, 224, 154, 12, + 15, 224, 153, 12, 15, 224, 152, 12, 15, 224, 151, 12, 15, 224, 150, 12, + 15, 224, 149, 12, 15, 224, 148, 12, 15, 224, 147, 12, 15, 224, 146, 12, + 15, 224, 145, 12, 15, 224, 144, 12, 15, 224, 143, 12, 15, 224, 142, 12, + 15, 224, 141, 12, 15, 224, 140, 12, 15, 224, 139, 12, 15, 224, 138, 12, + 15, 224, 137, 12, 15, 224, 136, 12, 15, 224, 135, 12, 15, 224, 134, 12, + 15, 224, 133, 12, 15, 224, 132, 12, 15, 224, 131, 12, 15, 224, 130, 12, + 15, 224, 129, 12, 15, 224, 128, 12, 15, 224, 127, 12, 15, 224, 126, 12, + 15, 224, 125, 12, 15, 224, 124, 12, 15, 224, 123, 12, 15, 224, 122, 12, + 15, 224, 121, 12, 15, 224, 120, 12, 15, 224, 119, 12, 15, 224, 118, 12, + 15, 224, 117, 12, 15, 224, 116, 12, 15, 224, 115, 12, 15, 224, 114, 12, + 15, 224, 113, 12, 15, 224, 112, 12, 15, 224, 111, 12, 15, 224, 110, 12, + 15, 224, 109, 12, 15, 224, 108, 12, 15, 224, 107, 12, 15, 224, 106, 12, + 15, 224, 105, 12, 15, 224, 104, 12, 15, 224, 103, 12, 15, 224, 102, 12, + 15, 224, 101, 12, 15, 224, 100, 12, 15, 224, 99, 12, 15, 224, 98, 12, 15, + 224, 97, 12, 15, 224, 96, 12, 15, 224, 95, 12, 15, 224, 94, 12, 15, 224, + 93, 12, 15, 224, 92, 12, 15, 224, 91, 12, 15, 224, 90, 12, 15, 224, 89, + 12, 15, 224, 88, 12, 15, 224, 87, 12, 15, 224, 86, 12, 15, 224, 85, 12, + 15, 224, 84, 12, 15, 224, 83, 12, 15, 224, 82, 12, 15, 224, 81, 12, 15, + 224, 80, 12, 15, 224, 79, 12, 15, 224, 78, 12, 15, 224, 77, 12, 15, 224, + 76, 12, 15, 224, 75, 12, 15, 224, 74, 12, 15, 224, 73, 12, 15, 224, 72, + 12, 15, 224, 71, 12, 15, 224, 70, 12, 15, 224, 69, 12, 15, 224, 68, 12, + 15, 224, 67, 12, 15, 224, 66, 12, 15, 224, 65, 12, 15, 224, 64, 12, 15, + 224, 63, 12, 15, 224, 62, 12, 15, 224, 61, 12, 15, 224, 60, 12, 15, 224, + 59, 12, 15, 224, 58, 12, 15, 224, 57, 12, 15, 224, 56, 12, 15, 224, 55, + 12, 15, 224, 54, 12, 15, 224, 53, 12, 15, 224, 52, 12, 15, 224, 51, 12, + 15, 224, 50, 12, 15, 224, 49, 12, 15, 224, 48, 12, 15, 224, 47, 12, 15, + 224, 46, 12, 15, 224, 45, 12, 15, 224, 44, 12, 15, 224, 43, 12, 15, 224, + 42, 12, 15, 224, 41, 12, 15, 224, 40, 12, 15, 224, 39, 12, 15, 224, 38, + 12, 15, 224, 37, 12, 15, 224, 36, 12, 15, 224, 35, 12, 15, 224, 34, 12, + 15, 224, 33, 12, 15, 224, 32, 12, 15, 224, 31, 12, 15, 224, 30, 12, 15, + 224, 29, 12, 15, 224, 28, 12, 15, 224, 27, 12, 15, 224, 26, 12, 15, 224, + 25, 12, 15, 224, 24, 12, 15, 224, 23, 12, 15, 224, 22, 12, 15, 224, 21, + 12, 15, 224, 20, 12, 15, 224, 19, 12, 15, 224, 18, 12, 15, 224, 17, 12, + 15, 224, 16, 12, 15, 224, 15, 12, 15, 224, 14, 12, 15, 224, 13, 12, 15, + 224, 12, 12, 15, 224, 11, 12, 15, 224, 10, 12, 15, 224, 9, 12, 15, 224, + 8, 12, 15, 224, 7, 12, 15, 224, 6, 12, 15, 224, 5, 12, 15, 224, 4, 12, + 15, 224, 3, 12, 15, 224, 2, 12, 15, 224, 1, 12, 15, 224, 0, 12, 15, 223, + 255, 12, 15, 223, 254, 12, 15, 223, 253, 12, 15, 223, 252, 12, 15, 223, + 251, 12, 15, 223, 250, 12, 15, 223, 249, 12, 15, 223, 248, 12, 15, 223, + 247, 12, 15, 223, 246, 12, 15, 223, 245, 12, 15, 223, 244, 12, 15, 223, + 243, 12, 15, 223, 242, 12, 15, 223, 241, 12, 15, 223, 240, 12, 15, 223, + 239, 12, 15, 223, 238, 12, 15, 223, 237, 12, 15, 223, 236, 12, 15, 223, + 235, 12, 15, 223, 234, 12, 15, 223, 233, 8, 2, 34, 233, 29, 8, 2, 34, + 233, 25, 8, 2, 34, 232, 222, 8, 2, 34, 233, 28, 8, 2, 34, 233, 27, 8, 2, + 34, 180, 206, 10, 200, 43, 8, 2, 34, 201, 119, 250, 251, 2, 34, 216, 189, + 212, 255, 250, 251, 2, 34, 216, 189, 234, 197, 250, 251, 2, 34, 216, 189, + 223, 133, 250, 251, 2, 34, 195, 75, 212, 255, 250, 251, 2, 34, 216, 189, + 192, 212, 136, 1, 191, 251, 4, 229, 121, 136, 209, 64, 222, 183, 195, + 166, 136, 34, 192, 31, 191, 251, 191, 251, 210, 90, 136, 1, 251, 154, + 250, 128, 136, 1, 193, 78, 251, 194, 136, 1, 193, 78, 237, 255, 136, 1, + 193, 78, 229, 247, 136, 1, 193, 78, 222, 108, 136, 1, 193, 78, 220, 29, + 136, 1, 193, 78, 53, 216, 195, 136, 1, 193, 78, 207, 39, 136, 1, 193, 78, + 199, 162, 136, 1, 251, 154, 108, 56, 136, 1, 203, 71, 4, 203, 71, 236, + 142, 136, 1, 203, 71, 4, 202, 176, 236, 142, 136, 1, 203, 71, 4, 238, 19, + 23, 203, 71, 236, 142, 136, 1, 203, 71, 4, 238, 19, 23, 202, 176, 236, + 142, 136, 1, 131, 4, 210, 90, 136, 1, 131, 4, 208, 86, 136, 1, 131, 4, + 217, 72, 136, 1, 248, 217, 4, 238, 18, 136, 1, 231, 41, 4, 238, 18, 136, + 1, 238, 0, 4, 238, 18, 136, 1, 229, 248, 4, 217, 72, 136, 1, 195, 159, 4, + 238, 18, 136, 1, 191, 92, 4, 238, 18, 136, 1, 199, 74, 4, 238, 18, 136, + 1, 191, 251, 4, 238, 18, 136, 1, 53, 222, 109, 4, 238, 18, 136, 1, 222, + 109, 4, 238, 18, 136, 1, 220, 30, 4, 238, 18, 136, 1, 216, 196, 4, 238, + 18, 136, 1, 212, 133, 4, 238, 18, 136, 1, 205, 150, 4, 238, 18, 136, 1, + 53, 210, 66, 4, 238, 18, 136, 1, 210, 66, 4, 238, 18, 136, 1, 197, 164, + 4, 238, 18, 136, 1, 208, 45, 4, 238, 18, 136, 1, 207, 40, 4, 238, 18, + 136, 1, 203, 71, 4, 238, 18, 136, 1, 199, 163, 4, 238, 18, 136, 1, 195, + 159, 4, 229, 9, 136, 1, 248, 217, 4, 207, 163, 136, 1, 222, 109, 4, 207, + 163, 136, 1, 210, 66, 4, 207, 163, 136, 34, 131, 220, 29, 9, 1, 131, 193, + 151, 76, 20, 9, 1, 131, 193, 151, 53, 20, 9, 1, 249, 2, 76, 20, 9, 1, + 249, 2, 53, 20, 9, 1, 249, 2, 89, 20, 9, 1, 249, 2, 216, 219, 20, 9, 1, + 210, 44, 76, 20, 9, 1, 210, 44, 53, 20, 9, 1, 210, 44, 89, 20, 9, 1, 210, + 44, 216, 219, 20, 9, 1, 248, 246, 76, 20, 9, 1, 248, 246, 53, 20, 9, 1, + 248, 246, 89, 20, 9, 1, 248, 246, 216, 219, 20, 9, 1, 197, 123, 76, 20, + 9, 1, 197, 123, 53, 20, 9, 1, 197, 123, 89, 20, 9, 1, 197, 123, 216, 219, + 20, 9, 1, 199, 113, 76, 20, 9, 1, 199, 113, 53, 20, 9, 1, 199, 113, 89, + 20, 9, 1, 199, 113, 216, 219, 20, 9, 1, 197, 125, 76, 20, 9, 1, 197, 125, + 53, 20, 9, 1, 197, 125, 89, 20, 9, 1, 197, 125, 216, 219, 20, 9, 1, 195, + 147, 76, 20, 9, 1, 195, 147, 53, 20, 9, 1, 195, 147, 89, 20, 9, 1, 195, + 147, 216, 219, 20, 9, 1, 210, 42, 76, 20, 9, 1, 210, 42, 53, 20, 9, 1, + 210, 42, 89, 20, 9, 1, 210, 42, 216, 219, 20, 9, 1, 235, 44, 76, 20, 9, + 1, 235, 44, 53, 20, 9, 1, 235, 44, 89, 20, 9, 1, 235, 44, 216, 219, 20, + 9, 1, 212, 90, 76, 20, 9, 1, 212, 90, 53, 20, 9, 1, 212, 90, 89, 20, 9, + 1, 212, 90, 216, 219, 20, 9, 1, 199, 150, 76, 20, 9, 1, 199, 150, 53, 20, + 9, 1, 199, 150, 89, 20, 9, 1, 199, 150, 216, 219, 20, 9, 1, 199, 148, 76, + 20, 9, 1, 199, 148, 53, 20, 9, 1, 199, 148, 89, 20, 9, 1, 199, 148, 216, + 219, 20, 9, 1, 237, 191, 76, 20, 9, 1, 237, 191, 53, 20, 9, 1, 238, 13, + 76, 20, 9, 1, 238, 13, 53, 20, 9, 1, 235, 81, 76, 20, 9, 1, 235, 81, 53, + 20, 9, 1, 237, 189, 76, 20, 9, 1, 237, 189, 53, 20, 9, 1, 223, 6, 76, 20, + 9, 1, 223, 6, 53, 20, 9, 1, 206, 103, 76, 20, 9, 1, 206, 103, 53, 20, 9, + 1, 222, 7, 76, 20, 9, 1, 222, 7, 53, 20, 9, 1, 222, 7, 89, 20, 9, 1, 222, + 7, 216, 219, 20, 9, 1, 231, 230, 76, 20, 9, 1, 231, 230, 53, 20, 9, 1, + 231, 230, 89, 20, 9, 1, 231, 230, 216, 219, 20, 9, 1, 230, 169, 76, 20, + 9, 1, 230, 169, 53, 20, 9, 1, 230, 169, 89, 20, 9, 1, 230, 169, 216, 219, + 20, 9, 1, 213, 250, 76, 20, 9, 1, 213, 250, 53, 20, 9, 1, 213, 250, 89, + 20, 9, 1, 213, 250, 216, 219, 20, 9, 1, 213, 27, 231, 60, 76, 20, 9, 1, + 213, 27, 231, 60, 53, 20, 9, 1, 206, 167, 76, 20, 9, 1, 206, 167, 53, 20, + 9, 1, 206, 167, 89, 20, 9, 1, 206, 167, 216, 219, 20, 9, 1, 229, 213, 4, + 99, 93, 76, 20, 9, 1, 229, 213, 4, 99, 93, 53, 20, 9, 1, 229, 213, 231, + 3, 76, 20, 9, 1, 229, 213, 231, 3, 53, 20, 9, 1, 229, 213, 231, 3, 89, + 20, 9, 1, 229, 213, 231, 3, 216, 219, 20, 9, 1, 229, 213, 236, 173, 76, + 20, 9, 1, 229, 213, 236, 173, 53, 20, 9, 1, 229, 213, 236, 173, 89, 20, + 9, 1, 229, 213, 236, 173, 216, 219, 20, 9, 1, 99, 249, 83, 76, 20, 9, 1, + 99, 249, 83, 53, 20, 9, 1, 99, 249, 83, 4, 230, 60, 93, 76, 20, 9, 1, 99, + 249, 83, 4, 230, 60, 93, 53, 20, 9, 16, 75, 58, 9, 16, 75, 60, 9, 16, + 105, 185, 58, 9, 16, 105, 185, 60, 9, 16, 115, 185, 58, 9, 16, 115, 185, + 60, 9, 16, 115, 185, 209, 60, 235, 121, 58, 9, 16, 115, 185, 209, 60, + 235, 121, 60, 9, 16, 232, 130, 185, 58, 9, 16, 232, 130, 185, 60, 9, 16, + 55, 81, 249, 90, 60, 9, 16, 105, 185, 195, 85, 58, 9, 16, 105, 185, 195, + 85, 60, 9, 16, 206, 189, 9, 16, 2, 199, 220, 58, 9, 16, 2, 199, 220, 60, + 9, 16, 193, 151, 58, 9, 1, 214, 73, 76, 20, 9, 1, 214, 73, 53, 20, 9, 1, + 214, 73, 89, 20, 9, 1, 214, 73, 216, 219, 20, 9, 1, 126, 76, 20, 9, 1, + 126, 53, 20, 9, 1, 211, 154, 76, 20, 9, 1, 211, 154, 53, 20, 9, 1, 191, + 226, 76, 20, 9, 1, 191, 226, 53, 20, 9, 1, 126, 4, 230, 60, 93, 76, 20, + 9, 1, 195, 154, 76, 20, 9, 1, 195, 154, 53, 20, 9, 1, 221, 134, 211, 154, + 76, 20, 9, 1, 221, 134, 211, 154, 53, 20, 9, 1, 221, 134, 191, 226, 76, + 20, 9, 1, 221, 134, 191, 226, 53, 20, 9, 1, 235, 17, 76, 20, 9, 1, 235, + 17, 53, 20, 9, 1, 235, 17, 89, 20, 9, 1, 235, 17, 216, 219, 20, 9, 1, + 196, 137, 222, 28, 221, 134, 131, 217, 102, 89, 20, 9, 1, 196, 137, 222, + 28, 221, 134, 131, 217, 102, 216, 219, 20, 9, 34, 99, 4, 230, 60, 93, 4, + 131, 76, 20, 9, 34, 99, 4, 230, 60, 93, 4, 131, 53, 20, 9, 34, 99, 4, + 230, 60, 93, 4, 252, 28, 76, 20, 9, 34, 99, 4, 230, 60, 93, 4, 252, 28, + 53, 20, 9, 34, 99, 4, 230, 60, 93, 4, 193, 134, 76, 20, 9, 34, 99, 4, + 230, 60, 93, 4, 193, 134, 53, 20, 9, 34, 99, 4, 230, 60, 93, 4, 126, 76, + 20, 9, 34, 99, 4, 230, 60, 93, 4, 126, 53, 20, 9, 34, 99, 4, 230, 60, 93, + 4, 211, 154, 76, 20, 9, 34, 99, 4, 230, 60, 93, 4, 211, 154, 53, 20, 9, + 34, 99, 4, 230, 60, 93, 4, 191, 226, 76, 20, 9, 34, 99, 4, 230, 60, 93, + 4, 191, 226, 53, 20, 9, 34, 99, 4, 230, 60, 93, 4, 235, 17, 76, 20, 9, + 34, 99, 4, 230, 60, 93, 4, 235, 17, 53, 20, 9, 34, 99, 4, 230, 60, 93, 4, + 235, 17, 89, 20, 9, 34, 196, 137, 221, 134, 99, 4, 230, 60, 93, 4, 131, + 217, 102, 76, 20, 9, 34, 196, 137, 221, 134, 99, 4, 230, 60, 93, 4, 131, + 217, 102, 53, 20, 9, 34, 196, 137, 221, 134, 99, 4, 230, 60, 93, 4, 131, + 217, 102, 89, 20, 9, 1, 233, 76, 99, 76, 20, 9, 1, 233, 76, 99, 53, 20, + 9, 1, 233, 76, 99, 89, 20, 9, 1, 233, 76, 99, 216, 219, 20, 9, 34, 99, 4, + 230, 60, 93, 4, 223, 9, 76, 20, 9, 34, 99, 4, 230, 60, 93, 4, 183, 76, + 20, 9, 34, 99, 4, 230, 60, 93, 4, 92, 76, 20, 9, 34, 99, 4, 230, 60, 93, + 4, 131, 217, 102, 76, 20, 9, 34, 99, 4, 230, 60, 93, 4, 99, 76, 20, 9, + 34, 248, 248, 4, 223, 9, 76, 20, 9, 34, 248, 248, 4, 183, 76, 20, 9, 34, + 248, 248, 4, 221, 213, 76, 20, 9, 34, 248, 248, 4, 92, 76, 20, 9, 34, + 248, 248, 4, 131, 217, 102, 76, 20, 9, 34, 248, 248, 4, 99, 76, 20, 9, + 34, 199, 115, 4, 223, 9, 76, 20, 9, 34, 199, 115, 4, 183, 76, 20, 9, 34, + 199, 115, 4, 221, 213, 76, 20, 9, 34, 199, 115, 4, 92, 76, 20, 9, 34, + 199, 115, 4, 131, 217, 102, 76, 20, 9, 34, 199, 115, 4, 99, 76, 20, 9, + 34, 199, 30, 4, 223, 9, 76, 20, 9, 34, 199, 30, 4, 92, 76, 20, 9, 34, + 199, 30, 4, 131, 217, 102, 76, 20, 9, 34, 199, 30, 4, 99, 76, 20, 9, 34, + 223, 9, 4, 183, 76, 20, 9, 34, 223, 9, 4, 92, 76, 20, 9, 34, 183, 4, 223, + 9, 76, 20, 9, 34, 183, 4, 92, 76, 20, 9, 34, 221, 213, 4, 223, 9, 76, 20, + 9, 34, 221, 213, 4, 183, 76, 20, 9, 34, 221, 213, 4, 92, 76, 20, 9, 34, + 205, 48, 4, 223, 9, 76, 20, 9, 34, 205, 48, 4, 183, 76, 20, 9, 34, 205, + 48, 4, 221, 213, 76, 20, 9, 34, 205, 48, 4, 92, 76, 20, 9, 34, 205, 194, + 4, 183, 76, 20, 9, 34, 205, 194, 4, 92, 76, 20, 9, 34, 238, 29, 4, 223, + 9, 76, 20, 9, 34, 238, 29, 4, 183, 76, 20, 9, 34, 238, 29, 4, 221, 213, + 76, 20, 9, 34, 238, 29, 4, 92, 76, 20, 9, 34, 199, 220, 4, 183, 76, 20, + 9, 34, 199, 220, 4, 92, 76, 20, 9, 34, 191, 117, 4, 92, 76, 20, 9, 34, + 251, 233, 4, 223, 9, 76, 20, 9, 34, 251, 233, 4, 92, 76, 20, 9, 34, 231, + 89, 4, 223, 9, 76, 20, 9, 34, 231, 89, 4, 92, 76, 20, 9, 34, 233, 49, 4, + 223, 9, 76, 20, 9, 34, 233, 49, 4, 183, 76, 20, 9, 34, 233, 49, 4, 221, + 213, 76, 20, 9, 34, 233, 49, 4, 92, 76, 20, 9, 34, 233, 49, 4, 131, 217, + 102, 76, 20, 9, 34, 233, 49, 4, 99, 76, 20, 9, 34, 208, 92, 4, 183, 76, + 20, 9, 34, 208, 92, 4, 92, 76, 20, 9, 34, 208, 92, 4, 131, 217, 102, 76, + 20, 9, 34, 208, 92, 4, 99, 76, 20, 9, 34, 222, 109, 4, 131, 76, 20, 9, + 34, 222, 109, 4, 223, 9, 76, 20, 9, 34, 222, 109, 4, 183, 76, 20, 9, 34, + 222, 109, 4, 221, 213, 76, 20, 9, 34, 222, 109, 4, 220, 38, 76, 20, 9, + 34, 222, 109, 4, 92, 76, 20, 9, 34, 222, 109, 4, 131, 217, 102, 76, 20, + 9, 34, 222, 109, 4, 99, 76, 20, 9, 34, 220, 38, 4, 223, 9, 76, 20, 9, 34, + 220, 38, 4, 183, 76, 20, 9, 34, 220, 38, 4, 221, 213, 76, 20, 9, 34, 220, + 38, 4, 92, 76, 20, 9, 34, 220, 38, 4, 131, 217, 102, 76, 20, 9, 34, 220, + 38, 4, 99, 76, 20, 9, 34, 92, 4, 223, 9, 76, 20, 9, 34, 92, 4, 183, 76, + 20, 9, 34, 92, 4, 221, 213, 76, 20, 9, 34, 92, 4, 92, 76, 20, 9, 34, 92, + 4, 131, 217, 102, 76, 20, 9, 34, 92, 4, 99, 76, 20, 9, 34, 213, 27, 4, + 223, 9, 76, 20, 9, 34, 213, 27, 4, 183, 76, 20, 9, 34, 213, 27, 4, 221, + 213, 76, 20, 9, 34, 213, 27, 4, 92, 76, 20, 9, 34, 213, 27, 4, 131, 217, + 102, 76, 20, 9, 34, 213, 27, 4, 99, 76, 20, 9, 34, 229, 213, 4, 223, 9, + 76, 20, 9, 34, 229, 213, 4, 92, 76, 20, 9, 34, 229, 213, 4, 131, 217, + 102, 76, 20, 9, 34, 229, 213, 4, 99, 76, 20, 9, 34, 99, 4, 223, 9, 76, + 20, 9, 34, 99, 4, 183, 76, 20, 9, 34, 99, 4, 221, 213, 76, 20, 9, 34, 99, + 4, 92, 76, 20, 9, 34, 99, 4, 131, 217, 102, 76, 20, 9, 34, 99, 4, 99, 76, + 20, 9, 34, 199, 42, 4, 200, 182, 131, 76, 20, 9, 34, 207, 73, 4, 200, + 182, 131, 76, 20, 9, 34, 131, 217, 102, 4, 200, 182, 131, 76, 20, 9, 34, + 203, 157, 4, 237, 246, 76, 20, 9, 34, 203, 157, 4, 222, 53, 76, 20, 9, + 34, 203, 157, 4, 233, 73, 76, 20, 9, 34, 203, 157, 4, 237, 248, 76, 20, + 9, 34, 203, 157, 4, 222, 55, 76, 20, 9, 34, 203, 157, 4, 200, 182, 131, + 76, 20, 9, 34, 99, 4, 230, 60, 93, 4, 207, 73, 53, 20, 9, 34, 99, 4, 230, + 60, 93, 4, 191, 114, 53, 20, 9, 34, 99, 4, 230, 60, 93, 4, 92, 53, 20, 9, + 34, 99, 4, 230, 60, 93, 4, 213, 27, 53, 20, 9, 34, 99, 4, 230, 60, 93, 4, + 131, 217, 102, 53, 20, 9, 34, 99, 4, 230, 60, 93, 4, 99, 53, 20, 9, 34, + 248, 248, 4, 207, 73, 53, 20, 9, 34, 248, 248, 4, 191, 114, 53, 20, 9, + 34, 248, 248, 4, 92, 53, 20, 9, 34, 248, 248, 4, 213, 27, 53, 20, 9, 34, + 248, 248, 4, 131, 217, 102, 53, 20, 9, 34, 248, 248, 4, 99, 53, 20, 9, + 34, 199, 115, 4, 207, 73, 53, 20, 9, 34, 199, 115, 4, 191, 114, 53, 20, + 9, 34, 199, 115, 4, 92, 53, 20, 9, 34, 199, 115, 4, 213, 27, 53, 20, 9, + 34, 199, 115, 4, 131, 217, 102, 53, 20, 9, 34, 199, 115, 4, 99, 53, 20, + 9, 34, 199, 30, 4, 207, 73, 53, 20, 9, 34, 199, 30, 4, 191, 114, 53, 20, + 9, 34, 199, 30, 4, 92, 53, 20, 9, 34, 199, 30, 4, 213, 27, 53, 20, 9, 34, + 199, 30, 4, 131, 217, 102, 53, 20, 9, 34, 199, 30, 4, 99, 53, 20, 9, 34, + 233, 49, 4, 131, 217, 102, 53, 20, 9, 34, 233, 49, 4, 99, 53, 20, 9, 34, + 208, 92, 4, 131, 217, 102, 53, 20, 9, 34, 208, 92, 4, 99, 53, 20, 9, 34, + 222, 109, 4, 131, 53, 20, 9, 34, 222, 109, 4, 220, 38, 53, 20, 9, 34, + 222, 109, 4, 92, 53, 20, 9, 34, 222, 109, 4, 131, 217, 102, 53, 20, 9, + 34, 222, 109, 4, 99, 53, 20, 9, 34, 220, 38, 4, 92, 53, 20, 9, 34, 220, + 38, 4, 131, 217, 102, 53, 20, 9, 34, 220, 38, 4, 99, 53, 20, 9, 34, 92, + 4, 131, 53, 20, 9, 34, 92, 4, 92, 53, 20, 9, 34, 213, 27, 4, 207, 73, 53, + 20, 9, 34, 213, 27, 4, 191, 114, 53, 20, 9, 34, 213, 27, 4, 92, 53, 20, + 9, 34, 213, 27, 4, 213, 27, 53, 20, 9, 34, 213, 27, 4, 131, 217, 102, 53, + 20, 9, 34, 213, 27, 4, 99, 53, 20, 9, 34, 131, 217, 102, 4, 200, 182, + 131, 53, 20, 9, 34, 99, 4, 207, 73, 53, 20, 9, 34, 99, 4, 191, 114, 53, + 20, 9, 34, 99, 4, 92, 53, 20, 9, 34, 99, 4, 213, 27, 53, 20, 9, 34, 99, + 4, 131, 217, 102, 53, 20, 9, 34, 99, 4, 99, 53, 20, 9, 34, 99, 4, 230, + 60, 93, 4, 223, 9, 89, 20, 9, 34, 99, 4, 230, 60, 93, 4, 183, 89, 20, 9, + 34, 99, 4, 230, 60, 93, 4, 221, 213, 89, 20, 9, 34, 99, 4, 230, 60, 93, + 4, 92, 89, 20, 9, 34, 99, 4, 230, 60, 93, 4, 229, 213, 89, 20, 9, 34, + 248, 248, 4, 223, 9, 89, 20, 9, 34, 248, 248, 4, 183, 89, 20, 9, 34, 248, + 248, 4, 221, 213, 89, 20, 9, 34, 248, 248, 4, 92, 89, 20, 9, 34, 248, + 248, 4, 229, 213, 89, 20, 9, 34, 199, 115, 4, 223, 9, 89, 20, 9, 34, 199, + 115, 4, 183, 89, 20, 9, 34, 199, 115, 4, 221, 213, 89, 20, 9, 34, 199, + 115, 4, 92, 89, 20, 9, 34, 199, 115, 4, 229, 213, 89, 20, 9, 34, 199, 30, + 4, 92, 89, 20, 9, 34, 223, 9, 4, 183, 89, 20, 9, 34, 223, 9, 4, 92, 89, + 20, 9, 34, 183, 4, 223, 9, 89, 20, 9, 34, 183, 4, 92, 89, 20, 9, 34, 221, + 213, 4, 223, 9, 89, 20, 9, 34, 221, 213, 4, 92, 89, 20, 9, 34, 205, 48, + 4, 223, 9, 89, 20, 9, 34, 205, 48, 4, 183, 89, 20, 9, 34, 205, 48, 4, + 221, 213, 89, 20, 9, 34, 205, 48, 4, 92, 89, 20, 9, 34, 205, 194, 4, 183, + 89, 20, 9, 34, 205, 194, 4, 221, 213, 89, 20, 9, 34, 205, 194, 4, 92, 89, + 20, 9, 34, 238, 29, 4, 223, 9, 89, 20, 9, 34, 238, 29, 4, 183, 89, 20, 9, + 34, 238, 29, 4, 221, 213, 89, 20, 9, 34, 238, 29, 4, 92, 89, 20, 9, 34, + 199, 220, 4, 183, 89, 20, 9, 34, 191, 117, 4, 92, 89, 20, 9, 34, 251, + 233, 4, 223, 9, 89, 20, 9, 34, 251, 233, 4, 92, 89, 20, 9, 34, 231, 89, + 4, 223, 9, 89, 20, 9, 34, 231, 89, 4, 92, 89, 20, 9, 34, 233, 49, 4, 223, + 9, 89, 20, 9, 34, 233, 49, 4, 183, 89, 20, 9, 34, 233, 49, 4, 221, 213, + 89, 20, 9, 34, 233, 49, 4, 92, 89, 20, 9, 34, 208, 92, 4, 183, 89, 20, 9, + 34, 208, 92, 4, 92, 89, 20, 9, 34, 222, 109, 4, 223, 9, 89, 20, 9, 34, + 222, 109, 4, 183, 89, 20, 9, 34, 222, 109, 4, 221, 213, 89, 20, 9, 34, + 222, 109, 4, 220, 38, 89, 20, 9, 34, 222, 109, 4, 92, 89, 20, 9, 34, 220, + 38, 4, 223, 9, 89, 20, 9, 34, 220, 38, 4, 183, 89, 20, 9, 34, 220, 38, 4, + 221, 213, 89, 20, 9, 34, 220, 38, 4, 92, 89, 20, 9, 34, 220, 38, 4, 229, + 213, 89, 20, 9, 34, 92, 4, 223, 9, 89, 20, 9, 34, 92, 4, 183, 89, 20, 9, + 34, 92, 4, 221, 213, 89, 20, 9, 34, 92, 4, 92, 89, 20, 9, 34, 213, 27, 4, + 223, 9, 89, 20, 9, 34, 213, 27, 4, 183, 89, 20, 9, 34, 213, 27, 4, 221, + 213, 89, 20, 9, 34, 213, 27, 4, 92, 89, 20, 9, 34, 213, 27, 4, 229, 213, + 89, 20, 9, 34, 229, 213, 4, 223, 9, 89, 20, 9, 34, 229, 213, 4, 92, 89, + 20, 9, 34, 229, 213, 4, 200, 182, 131, 89, 20, 9, 34, 99, 4, 223, 9, 89, + 20, 9, 34, 99, 4, 183, 89, 20, 9, 34, 99, 4, 221, 213, 89, 20, 9, 34, 99, + 4, 92, 89, 20, 9, 34, 99, 4, 229, 213, 89, 20, 9, 34, 99, 4, 230, 60, 93, + 4, 92, 216, 219, 20, 9, 34, 99, 4, 230, 60, 93, 4, 229, 213, 216, 219, + 20, 9, 34, 248, 248, 4, 92, 216, 219, 20, 9, 34, 248, 248, 4, 229, 213, + 216, 219, 20, 9, 34, 199, 115, 4, 92, 216, 219, 20, 9, 34, 199, 115, 4, + 229, 213, 216, 219, 20, 9, 34, 199, 30, 4, 92, 216, 219, 20, 9, 34, 199, + 30, 4, 229, 213, 216, 219, 20, 9, 34, 205, 48, 4, 92, 216, 219, 20, 9, + 34, 205, 48, 4, 229, 213, 216, 219, 20, 9, 34, 203, 111, 4, 92, 216, 219, + 20, 9, 34, 203, 111, 4, 229, 213, 216, 219, 20, 9, 34, 222, 109, 4, 220, + 38, 216, 219, 20, 9, 34, 222, 109, 4, 92, 216, 219, 20, 9, 34, 220, 38, + 4, 92, 216, 219, 20, 9, 34, 213, 27, 4, 92, 216, 219, 20, 9, 34, 213, 27, + 4, 229, 213, 216, 219, 20, 9, 34, 99, 4, 92, 216, 219, 20, 9, 34, 99, 4, + 229, 213, 216, 219, 20, 9, 34, 203, 157, 4, 233, 73, 216, 219, 20, 9, 34, + 203, 157, 4, 237, 248, 216, 219, 20, 9, 34, 203, 157, 4, 222, 55, 216, + 219, 20, 9, 34, 199, 220, 4, 131, 217, 102, 76, 20, 9, 34, 199, 220, 4, + 99, 76, 20, 9, 34, 251, 233, 4, 131, 217, 102, 76, 20, 9, 34, 251, 233, + 4, 99, 76, 20, 9, 34, 231, 89, 4, 131, 217, 102, 76, 20, 9, 34, 231, 89, + 4, 99, 76, 20, 9, 34, 205, 48, 4, 131, 217, 102, 76, 20, 9, 34, 205, 48, + 4, 99, 76, 20, 9, 34, 203, 111, 4, 131, 217, 102, 76, 20, 9, 34, 203, + 111, 4, 99, 76, 20, 9, 34, 183, 4, 131, 217, 102, 76, 20, 9, 34, 183, 4, + 99, 76, 20, 9, 34, 223, 9, 4, 131, 217, 102, 76, 20, 9, 34, 223, 9, 4, + 99, 76, 20, 9, 34, 221, 213, 4, 131, 217, 102, 76, 20, 9, 34, 221, 213, + 4, 99, 76, 20, 9, 34, 205, 194, 4, 131, 217, 102, 76, 20, 9, 34, 205, + 194, 4, 99, 76, 20, 9, 34, 238, 29, 4, 131, 217, 102, 76, 20, 9, 34, 238, + 29, 4, 99, 76, 20, 9, 34, 203, 111, 4, 223, 9, 76, 20, 9, 34, 203, 111, + 4, 183, 76, 20, 9, 34, 203, 111, 4, 221, 213, 76, 20, 9, 34, 203, 111, 4, + 92, 76, 20, 9, 34, 203, 111, 4, 207, 73, 76, 20, 9, 34, 205, 48, 4, 207, + 73, 76, 20, 9, 34, 205, 194, 4, 207, 73, 76, 20, 9, 34, 238, 29, 4, 207, + 73, 76, 20, 9, 34, 199, 220, 4, 131, 217, 102, 53, 20, 9, 34, 199, 220, + 4, 99, 53, 20, 9, 34, 251, 233, 4, 131, 217, 102, 53, 20, 9, 34, 251, + 233, 4, 99, 53, 20, 9, 34, 231, 89, 4, 131, 217, 102, 53, 20, 9, 34, 231, + 89, 4, 99, 53, 20, 9, 34, 205, 48, 4, 131, 217, 102, 53, 20, 9, 34, 205, + 48, 4, 99, 53, 20, 9, 34, 203, 111, 4, 131, 217, 102, 53, 20, 9, 34, 203, + 111, 4, 99, 53, 20, 9, 34, 183, 4, 131, 217, 102, 53, 20, 9, 34, 183, 4, + 99, 53, 20, 9, 34, 223, 9, 4, 131, 217, 102, 53, 20, 9, 34, 223, 9, 4, + 99, 53, 20, 9, 34, 221, 213, 4, 131, 217, 102, 53, 20, 9, 34, 221, 213, + 4, 99, 53, 20, 9, 34, 205, 194, 4, 131, 217, 102, 53, 20, 9, 34, 205, + 194, 4, 99, 53, 20, 9, 34, 238, 29, 4, 131, 217, 102, 53, 20, 9, 34, 238, + 29, 4, 99, 53, 20, 9, 34, 203, 111, 4, 223, 9, 53, 20, 9, 34, 203, 111, + 4, 183, 53, 20, 9, 34, 203, 111, 4, 221, 213, 53, 20, 9, 34, 203, 111, 4, + 92, 53, 20, 9, 34, 203, 111, 4, 207, 73, 53, 20, 9, 34, 205, 48, 4, 207, + 73, 53, 20, 9, 34, 205, 194, 4, 207, 73, 53, 20, 9, 34, 238, 29, 4, 207, + 73, 53, 20, 9, 34, 203, 111, 4, 223, 9, 89, 20, 9, 34, 203, 111, 4, 183, + 89, 20, 9, 34, 203, 111, 4, 221, 213, 89, 20, 9, 34, 203, 111, 4, 92, 89, + 20, 9, 34, 205, 48, 4, 229, 213, 89, 20, 9, 34, 203, 111, 4, 229, 213, + 89, 20, 9, 34, 199, 220, 4, 92, 89, 20, 9, 34, 205, 48, 4, 223, 9, 216, + 219, 20, 9, 34, 205, 48, 4, 183, 216, 219, 20, 9, 34, 205, 48, 4, 221, + 213, 216, 219, 20, 9, 34, 203, 111, 4, 223, 9, 216, 219, 20, 9, 34, 203, + 111, 4, 183, 216, 219, 20, 9, 34, 203, 111, 4, 221, 213, 216, 219, 20, 9, + 34, 199, 220, 4, 92, 216, 219, 20, 9, 34, 191, 117, 4, 92, 216, 219, 20, + 9, 34, 131, 4, 233, 71, 53, 20, 9, 34, 131, 4, 233, 71, 76, 20, 211, 42, + 45, 210, 115, 211, 42, 50, 210, 115, 9, 34, 207, 161, 251, 175, 9, 34, + 207, 169, 251, 174, 251, 109, 9, 34, 207, 169, 251, 174, 251, 108, 9, 34, + 207, 169, 251, 174, 251, 106, 9, 34, 207, 169, 251, 174, 251, 105, 9, 34, + 207, 169, 251, 174, 251, 104, 9, 34, 205, 163, 251, 199, 193, 184, 9, 34, + 251, 199, 250, 219, 9, 34, 251, 198, 250, 219, 9, 34, 251, 197, 250, 219, + 9, 34, 251, 199, 250, 218, 193, 154, 9, 34, 208, 19, 202, 141, 9, 34, + 205, 161, 251, 199, 193, 180, 193, 183, 9, 34, 251, 202, 250, 219, 9, 34, + 199, 235, 193, 182, 9, 34, 207, 160, 251, 175, 9, 34, 199, 115, 4, 223, + 9, 4, 92, 89, 20, 9, 34, 199, 115, 4, 183, 4, 223, 9, 53, 20, 9, 34, 199, + 115, 4, 183, 4, 223, 9, 89, 20, 9, 34, 199, 115, 4, 183, 4, 92, 89, 20, + 9, 34, 199, 115, 4, 221, 213, 4, 92, 89, 20, 9, 34, 199, 115, 4, 92, 4, + 223, 9, 89, 20, 9, 34, 199, 115, 4, 92, 4, 183, 89, 20, 9, 34, 199, 115, + 4, 92, 4, 221, 213, 89, 20, 9, 34, 223, 9, 4, 92, 4, 183, 53, 20, 9, 34, + 223, 9, 4, 92, 4, 183, 89, 20, 9, 34, 183, 4, 92, 4, 99, 53, 20, 9, 34, + 183, 4, 92, 4, 131, 217, 102, 53, 20, 9, 34, 205, 48, 4, 183, 4, 223, 9, + 89, 20, 9, 34, 205, 48, 4, 223, 9, 4, 183, 89, 20, 9, 34, 205, 48, 4, + 223, 9, 4, 131, 217, 102, 53, 20, 9, 34, 205, 48, 4, 92, 4, 183, 53, 20, + 9, 34, 205, 48, 4, 92, 4, 183, 89, 20, 9, 34, 205, 48, 4, 92, 4, 223, 9, + 89, 20, 9, 34, 205, 48, 4, 92, 4, 92, 53, 20, 9, 34, 205, 48, 4, 92, 4, + 92, 89, 20, 9, 34, 205, 194, 4, 183, 4, 183, 53, 20, 9, 34, 205, 194, 4, + 183, 4, 183, 89, 20, 9, 34, 205, 194, 4, 92, 4, 92, 53, 20, 9, 34, 203, + 111, 4, 183, 4, 92, 53, 20, 9, 34, 203, 111, 4, 183, 4, 92, 89, 20, 9, + 34, 203, 111, 4, 223, 9, 4, 99, 53, 20, 9, 34, 203, 111, 4, 92, 4, 221, + 213, 53, 20, 9, 34, 203, 111, 4, 92, 4, 221, 213, 89, 20, 9, 34, 203, + 111, 4, 92, 4, 92, 53, 20, 9, 34, 203, 111, 4, 92, 4, 92, 89, 20, 9, 34, + 238, 29, 4, 183, 4, 131, 217, 102, 53, 20, 9, 34, 238, 29, 4, 221, 213, + 4, 92, 53, 20, 9, 34, 238, 29, 4, 221, 213, 4, 92, 89, 20, 9, 34, 199, + 220, 4, 92, 4, 183, 53, 20, 9, 34, 199, 220, 4, 92, 4, 183, 89, 20, 9, + 34, 199, 220, 4, 92, 4, 92, 89, 20, 9, 34, 199, 220, 4, 92, 4, 99, 53, + 20, 9, 34, 251, 233, 4, 223, 9, 4, 92, 53, 20, 9, 34, 251, 233, 4, 92, 4, + 92, 53, 20, 9, 34, 251, 233, 4, 92, 4, 92, 89, 20, 9, 34, 251, 233, 4, + 92, 4, 131, 217, 102, 53, 20, 9, 34, 231, 89, 4, 92, 4, 92, 53, 20, 9, + 34, 231, 89, 4, 92, 4, 99, 53, 20, 9, 34, 231, 89, 4, 92, 4, 131, 217, + 102, 53, 20, 9, 34, 233, 49, 4, 221, 213, 4, 92, 53, 20, 9, 34, 233, 49, + 4, 221, 213, 4, 92, 89, 20, 9, 34, 208, 92, 4, 92, 4, 183, 53, 20, 9, 34, + 208, 92, 4, 92, 4, 92, 53, 20, 9, 34, 220, 38, 4, 183, 4, 92, 53, 20, 9, + 34, 220, 38, 4, 183, 4, 99, 53, 20, 9, 34, 220, 38, 4, 183, 4, 131, 217, + 102, 53, 20, 9, 34, 220, 38, 4, 223, 9, 4, 223, 9, 89, 20, 9, 34, 220, + 38, 4, 223, 9, 4, 223, 9, 53, 20, 9, 34, 220, 38, 4, 221, 213, 4, 92, 53, + 20, 9, 34, 220, 38, 4, 221, 213, 4, 92, 89, 20, 9, 34, 220, 38, 4, 92, 4, + 183, 53, 20, 9, 34, 220, 38, 4, 92, 4, 183, 89, 20, 9, 34, 92, 4, 183, 4, + 223, 9, 89, 20, 9, 34, 92, 4, 183, 4, 92, 89, 20, 9, 34, 92, 4, 183, 4, + 99, 53, 20, 9, 34, 92, 4, 223, 9, 4, 183, 89, 20, 9, 34, 92, 4, 223, 9, + 4, 92, 89, 20, 9, 34, 92, 4, 221, 213, 4, 223, 9, 89, 20, 9, 34, 92, 4, + 221, 213, 4, 92, 89, 20, 9, 34, 92, 4, 223, 9, 4, 221, 213, 89, 20, 9, + 34, 229, 213, 4, 92, 4, 223, 9, 89, 20, 9, 34, 229, 213, 4, 92, 4, 92, + 89, 20, 9, 34, 213, 27, 4, 183, 4, 92, 89, 20, 9, 34, 213, 27, 4, 183, 4, + 131, 217, 102, 53, 20, 9, 34, 213, 27, 4, 223, 9, 4, 92, 53, 20, 9, 34, + 213, 27, 4, 223, 9, 4, 92, 89, 20, 9, 34, 213, 27, 4, 223, 9, 4, 131, + 217, 102, 53, 20, 9, 34, 213, 27, 4, 92, 4, 99, 53, 20, 9, 34, 213, 27, + 4, 92, 4, 131, 217, 102, 53, 20, 9, 34, 99, 4, 92, 4, 92, 53, 20, 9, 34, + 99, 4, 92, 4, 92, 89, 20, 9, 34, 248, 248, 4, 221, 213, 4, 99, 53, 20, 9, + 34, 199, 115, 4, 223, 9, 4, 99, 53, 20, 9, 34, 199, 115, 4, 223, 9, 4, + 131, 217, 102, 53, 20, 9, 34, 199, 115, 4, 221, 213, 4, 99, 53, 20, 9, + 34, 199, 115, 4, 221, 213, 4, 131, 217, 102, 53, 20, 9, 34, 199, 115, 4, + 92, 4, 99, 53, 20, 9, 34, 199, 115, 4, 92, 4, 131, 217, 102, 53, 20, 9, + 34, 223, 9, 4, 92, 4, 99, 53, 20, 9, 34, 223, 9, 4, 183, 4, 131, 217, + 102, 53, 20, 9, 34, 223, 9, 4, 92, 4, 131, 217, 102, 53, 20, 9, 34, 205, + 48, 4, 221, 213, 4, 131, 217, 102, 53, 20, 9, 34, 205, 194, 4, 183, 4, + 99, 53, 20, 9, 34, 203, 111, 4, 183, 4, 99, 53, 20, 9, 34, 238, 29, 4, + 183, 4, 99, 53, 20, 9, 34, 220, 38, 4, 223, 9, 4, 99, 53, 20, 9, 34, 220, + 38, 4, 92, 4, 99, 53, 20, 9, 34, 99, 4, 183, 4, 99, 53, 20, 9, 34, 99, 4, + 223, 9, 4, 99, 53, 20, 9, 34, 99, 4, 92, 4, 99, 53, 20, 9, 34, 92, 4, 92, + 4, 99, 53, 20, 9, 34, 208, 92, 4, 92, 4, 99, 53, 20, 9, 34, 213, 27, 4, + 183, 4, 99, 53, 20, 9, 34, 208, 92, 4, 92, 4, 183, 89, 20, 9, 34, 220, + 38, 4, 183, 4, 92, 89, 20, 9, 34, 251, 233, 4, 92, 4, 99, 53, 20, 9, 34, + 222, 109, 4, 92, 4, 99, 53, 20, 9, 34, 213, 27, 4, 223, 9, 4, 183, 89, + 20, 9, 34, 92, 4, 221, 213, 4, 99, 53, 20, 9, 34, 220, 38, 4, 223, 9, 4, + 92, 89, 20, 9, 34, 222, 109, 4, 92, 4, 92, 53, 20, 9, 34, 220, 38, 4, + 223, 9, 4, 92, 53, 20, 9, 34, 213, 27, 4, 223, 9, 4, 183, 53, 20, 9, 34, + 223, 9, 4, 183, 4, 99, 53, 20, 9, 34, 183, 4, 223, 9, 4, 99, 53, 20, 9, + 34, 92, 4, 223, 9, 4, 99, 53, 20, 9, 34, 233, 49, 4, 92, 4, 99, 53, 20, + 9, 34, 248, 248, 4, 183, 4, 99, 53, 20, 9, 34, 222, 109, 4, 92, 4, 92, + 89, 20, 9, 34, 251, 233, 4, 223, 9, 4, 92, 89, 20, 9, 34, 205, 194, 4, + 92, 4, 92, 89, 20, 9, 34, 205, 48, 4, 221, 213, 4, 99, 53, 20, 9, 34, + 213, 27, 4, 223, 9, 4, 99, 53, 20, 9, 34, 205, 167, 251, 196, 9, 34, 205, + 164, 196, 40, 250, 222, 221, 35, 201, 65, 3, 76, 20, 9, 34, 208, 88, 196, + 40, 250, 222, 221, 35, 201, 65, 3, 76, 20, 9, 34, 251, 173, 76, 20, 9, + 34, 251, 215, 76, 20, 9, 34, 215, 237, 76, 20, 9, 34, 205, 165, 76, 20, + 9, 34, 207, 134, 76, 20, 9, 34, 251, 201, 76, 20, 9, 34, 193, 153, 76, + 20, 9, 34, 205, 164, 76, 20, 9, 34, 205, 162, 251, 201, 193, 152, 9, 34, + 223, 24, 206, 250, 56, 9, 34, 248, 153, 251, 33, 251, 34, 9, 34, 200, + 243, 193, 191, 199, 244, 9, 34, 250, 123, 193, 191, 223, 25, 67, 205, 34, + 67, 204, 179, 67, 204, 111, 67, 204, 100, 67, 204, 89, 67, 204, 78, 67, + 204, 67, 67, 204, 56, 67, 204, 45, 67, 205, 33, 67, 205, 22, 67, 205, 11, + 67, 205, 0, 67, 204, 245, 67, 204, 234, 67, 204, 223, 208, 223, 232, 148, + 40, 81, 242, 76, 208, 223, 232, 148, 40, 81, 148, 242, 76, 208, 223, 232, + 148, 40, 81, 148, 232, 82, 201, 64, 208, 223, 232, 148, 40, 81, 242, 85, + 208, 223, 232, 148, 40, 81, 204, 26, 208, 223, 232, 148, 40, 81, 233, + 218, 77, 208, 223, 232, 148, 40, 81, 208, 15, 77, 208, 223, 232, 148, 40, + 81, 45, 63, 219, 189, 248, 55, 208, 223, 232, 148, 40, 81, 50, 63, 219, + 189, 248, 51, 208, 223, 232, 148, 40, 81, 228, 243, 234, 122, 33, 34, 45, + 230, 72, 33, 34, 50, 230, 72, 33, 55, 198, 153, 45, 230, 72, 33, 55, 198, + 153, 50, 230, 72, 33, 217, 149, 45, 230, 72, 33, 217, 149, 50, 230, 72, + 33, 239, 46, 217, 148, 33, 34, 45, 132, 60, 33, 34, 50, 132, 60, 33, 198, + 153, 45, 132, 60, 33, 198, 153, 50, 132, 60, 33, 217, 149, 45, 132, 60, + 33, 217, 149, 50, 132, 60, 33, 239, 46, 217, 149, 60, 33, 38, 198, 123, + 45, 230, 72, 33, 38, 198, 123, 50, 230, 72, 208, 223, 232, 148, 40, 81, + 105, 75, 219, 238, 208, 223, 232, 148, 40, 81, 234, 117, 237, 217, 208, + 223, 232, 148, 40, 81, 234, 106, 237, 217, 208, 223, 232, 148, 40, 81, + 130, 219, 114, 208, 223, 232, 148, 40, 81, 193, 135, 130, 219, 114, 208, + 223, 232, 148, 40, 81, 45, 210, 115, 208, 223, 232, 148, 40, 81, 50, 210, + 115, 208, 223, 232, 148, 40, 81, 45, 238, 173, 248, 55, 208, 223, 232, + 148, 40, 81, 50, 238, 173, 248, 55, 208, 223, 232, 148, 40, 81, 45, 198, + 42, 203, 104, 248, 55, 208, 223, 232, 148, 40, 81, 50, 198, 42, 203, 104, + 248, 55, 208, 223, 232, 148, 40, 81, 45, 62, 219, 189, 248, 55, 208, 223, + 232, 148, 40, 81, 50, 62, 219, 189, 248, 55, 208, 223, 232, 148, 40, 81, + 45, 55, 251, 118, 248, 55, 208, 223, 232, 148, 40, 81, 50, 55, 251, 118, + 248, 55, 208, 223, 232, 148, 40, 81, 45, 251, 118, 248, 55, 208, 223, + 232, 148, 40, 81, 50, 251, 118, 248, 55, 208, 223, 232, 148, 40, 81, 45, + 239, 4, 248, 55, 208, 223, 232, 148, 40, 81, 50, 239, 4, 248, 55, 208, + 223, 232, 148, 40, 81, 45, 63, 239, 4, 248, 55, 208, 223, 232, 148, 40, + 81, 50, 63, 239, 4, 248, 55, 204, 1, 236, 142, 63, 204, 1, 236, 142, 208, + 223, 232, 148, 40, 81, 45, 51, 248, 55, 208, 223, 232, 148, 40, 81, 50, + 51, 248, 55, 237, 216, 211, 0, 247, 20, 211, 0, 193, 135, 211, 0, 55, + 193, 135, 211, 0, 237, 216, 130, 219, 114, 247, 20, 130, 219, 114, 193, + 135, 130, 219, 114, 2, 242, 76, 2, 148, 242, 76, 2, 232, 82, 201, 64, 2, + 204, 26, 2, 242, 85, 2, 208, 15, 77, 2, 233, 218, 77, 2, 234, 117, 237, + 217, 2, 45, 210, 115, 2, 50, 210, 115, 2, 45, 238, 173, 248, 55, 2, 50, + 238, 173, 248, 55, 2, 45, 198, 42, 203, 104, 248, 55, 2, 50, 198, 42, + 203, 104, 248, 55, 2, 31, 56, 2, 251, 139, 2, 250, 195, 2, 108, 56, 2, + 228, 89, 2, 219, 182, 56, 2, 230, 206, 56, 2, 234, 45, 56, 2, 207, 20, + 202, 24, 2, 236, 157, 56, 2, 210, 15, 56, 2, 242, 74, 250, 184, 9, 233, + 71, 76, 20, 9, 199, 169, 4, 233, 71, 58, 9, 237, 246, 76, 20, 9, 199, + 216, 232, 119, 9, 222, 53, 76, 20, 9, 233, 73, 76, 20, 9, 233, 73, 216, + 219, 20, 9, 237, 248, 76, 20, 9, 237, 248, 216, 219, 20, 9, 222, 55, 76, + 20, 9, 222, 55, 216, 219, 20, 9, 203, 157, 76, 20, 9, 203, 157, 216, 219, + 20, 9, 200, 207, 76, 20, 9, 200, 207, 216, 219, 20, 9, 1, 230, 60, 76, + 20, 9, 1, 131, 4, 217, 144, 93, 76, 20, 9, 1, 131, 4, 217, 144, 93, 53, + 20, 9, 1, 131, 4, 230, 60, 93, 76, 20, 9, 1, 131, 4, 230, 60, 93, 53, 20, + 9, 1, 193, 134, 4, 230, 60, 93, 76, 20, 9, 1, 193, 134, 4, 230, 60, 93, + 53, 20, 9, 1, 131, 4, 230, 60, 248, 235, 76, 20, 9, 1, 131, 4, 230, 60, + 248, 235, 53, 20, 9, 1, 99, 4, 230, 60, 93, 76, 20, 9, 1, 99, 4, 230, 60, + 93, 53, 20, 9, 1, 99, 4, 230, 60, 93, 89, 20, 9, 1, 99, 4, 230, 60, 93, + 216, 219, 20, 9, 1, 131, 76, 20, 9, 1, 131, 53, 20, 9, 1, 248, 248, 76, + 20, 9, 1, 248, 248, 53, 20, 9, 1, 248, 248, 89, 20, 9, 1, 248, 248, 216, + 219, 20, 9, 1, 199, 115, 217, 65, 76, 20, 9, 1, 199, 115, 217, 65, 53, + 20, 9, 1, 199, 115, 76, 20, 9, 1, 199, 115, 53, 20, 9, 1, 199, 115, 89, + 20, 9, 1, 199, 115, 216, 219, 20, 9, 1, 199, 30, 76, 20, 9, 1, 199, 30, + 53, 20, 9, 1, 199, 30, 89, 20, 9, 1, 199, 30, 216, 219, 20, 9, 1, 223, 9, + 76, 20, 9, 1, 223, 9, 53, 20, 9, 1, 223, 9, 89, 20, 9, 1, 223, 9, 216, + 219, 20, 9, 1, 183, 76, 20, 9, 1, 183, 53, 20, 9, 1, 183, 89, 20, 9, 1, + 183, 216, 219, 20, 9, 1, 221, 213, 76, 20, 9, 1, 221, 213, 53, 20, 9, 1, + 221, 213, 89, 20, 9, 1, 221, 213, 216, 219, 20, 9, 1, 238, 6, 76, 20, 9, + 1, 238, 6, 53, 20, 9, 1, 199, 42, 76, 20, 9, 1, 199, 42, 53, 20, 9, 1, + 207, 73, 76, 20, 9, 1, 207, 73, 53, 20, 9, 1, 191, 114, 76, 20, 9, 1, + 191, 114, 53, 20, 9, 1, 205, 48, 76, 20, 9, 1, 205, 48, 53, 20, 9, 1, + 205, 48, 89, 20, 9, 1, 205, 48, 216, 219, 20, 9, 1, 203, 111, 76, 20, 9, + 1, 203, 111, 53, 20, 9, 1, 203, 111, 89, 20, 9, 1, 203, 111, 216, 219, + 20, 9, 1, 205, 194, 76, 20, 9, 1, 205, 194, 53, 20, 9, 1, 205, 194, 89, + 20, 9, 1, 205, 194, 216, 219, 20, 9, 1, 238, 29, 76, 20, 9, 1, 238, 29, + 53, 20, 9, 1, 238, 29, 89, 20, 9, 1, 238, 29, 216, 219, 20, 9, 1, 199, + 220, 76, 20, 9, 1, 199, 220, 53, 20, 9, 1, 199, 220, 89, 20, 9, 1, 199, + 220, 216, 219, 20, 9, 1, 191, 117, 76, 20, 9, 1, 191, 117, 53, 20, 9, 1, + 191, 117, 89, 20, 9, 1, 191, 117, 216, 219, 20, 9, 1, 251, 233, 76, 20, + 9, 1, 251, 233, 53, 20, 9, 1, 251, 233, 89, 20, 9, 1, 251, 233, 216, 219, + 20, 9, 1, 231, 89, 76, 20, 9, 1, 231, 89, 53, 20, 9, 1, 231, 89, 89, 20, + 9, 1, 231, 89, 216, 219, 20, 9, 1, 233, 49, 76, 20, 9, 1, 233, 49, 53, + 20, 9, 1, 233, 49, 89, 20, 9, 1, 233, 49, 216, 219, 20, 9, 1, 208, 92, + 76, 20, 9, 1, 208, 92, 53, 20, 9, 1, 208, 92, 89, 20, 9, 1, 208, 92, 216, + 219, 20, 9, 1, 222, 109, 76, 20, 9, 1, 222, 109, 53, 20, 9, 1, 222, 109, + 89, 20, 9, 1, 222, 109, 216, 219, 20, 9, 1, 220, 38, 76, 20, 9, 1, 220, + 38, 53, 20, 9, 1, 220, 38, 89, 20, 9, 1, 220, 38, 216, 219, 20, 9, 1, 92, + 76, 20, 9, 1, 92, 53, 20, 9, 1, 92, 89, 20, 9, 1, 92, 216, 219, 20, 9, 1, + 213, 27, 76, 20, 9, 1, 213, 27, 53, 20, 9, 1, 213, 27, 89, 20, 9, 1, 213, + 27, 216, 219, 20, 9, 1, 229, 213, 76, 20, 9, 1, 229, 213, 53, 20, 9, 1, + 229, 213, 89, 20, 9, 1, 229, 213, 216, 219, 20, 9, 1, 193, 134, 76, 20, + 9, 1, 193, 134, 53, 20, 9, 1, 131, 217, 102, 76, 20, 9, 1, 131, 217, 102, + 53, 20, 9, 1, 99, 76, 20, 9, 1, 99, 53, 20, 9, 1, 99, 89, 20, 9, 1, 99, + 216, 219, 20, 9, 34, 220, 38, 4, 131, 4, 217, 144, 93, 76, 20, 9, 34, + 220, 38, 4, 131, 4, 217, 144, 93, 53, 20, 9, 34, 220, 38, 4, 131, 4, 230, + 60, 93, 76, 20, 9, 34, 220, 38, 4, 131, 4, 230, 60, 93, 53, 20, 9, 34, + 220, 38, 4, 131, 4, 230, 60, 248, 235, 76, 20, 9, 34, 220, 38, 4, 131, 4, + 230, 60, 248, 235, 53, 20, 9, 34, 220, 38, 4, 131, 76, 20, 9, 34, 220, + 38, 4, 131, 53, 20, 191, 78, 193, 75, 213, 39, 201, 248, 232, 80, 233, + 218, 77, 232, 80, 207, 254, 77, 232, 80, 31, 56, 232, 80, 236, 157, 56, + 232, 80, 210, 15, 56, 232, 80, 251, 139, 232, 80, 251, 51, 232, 80, 45, + 210, 115, 232, 80, 50, 210, 115, 232, 80, 250, 195, 232, 80, 108, 56, + 232, 80, 242, 76, 232, 80, 228, 89, 232, 80, 232, 82, 201, 64, 232, 80, + 202, 24, 232, 80, 17, 191, 77, 232, 80, 17, 107, 232, 80, 17, 109, 232, + 80, 17, 138, 232, 80, 17, 134, 232, 80, 17, 150, 232, 80, 17, 169, 232, + 80, 17, 175, 232, 80, 17, 171, 232, 80, 17, 178, 232, 80, 242, 85, 232, + 80, 204, 26, 232, 80, 219, 182, 56, 232, 80, 234, 45, 56, 232, 80, 230, + 206, 56, 232, 80, 208, 15, 77, 232, 80, 242, 74, 250, 184, 232, 80, 8, 6, + 1, 65, 232, 80, 8, 6, 1, 250, 122, 232, 80, 8, 6, 1, 247, 195, 232, 80, + 8, 6, 1, 238, 129, 232, 80, 8, 6, 1, 71, 232, 80, 8, 6, 1, 233, 177, 232, + 80, 8, 6, 1, 232, 53, 232, 80, 8, 6, 1, 230, 118, 232, 80, 8, 6, 1, 68, + 232, 80, 8, 6, 1, 223, 37, 232, 80, 8, 6, 1, 222, 154, 232, 80, 8, 6, 1, + 172, 232, 80, 8, 6, 1, 218, 170, 232, 80, 8, 6, 1, 215, 63, 232, 80, 8, + 6, 1, 74, 232, 80, 8, 6, 1, 210, 238, 232, 80, 8, 6, 1, 208, 106, 232, + 80, 8, 6, 1, 146, 232, 80, 8, 6, 1, 206, 9, 232, 80, 8, 6, 1, 200, 43, + 232, 80, 8, 6, 1, 66, 232, 80, 8, 6, 1, 196, 12, 232, 80, 8, 6, 1, 193, + 224, 232, 80, 8, 6, 1, 192, 235, 232, 80, 8, 6, 1, 192, 159, 232, 80, 8, + 6, 1, 191, 166, 232, 80, 45, 51, 248, 55, 232, 80, 207, 20, 202, 24, 232, + 80, 50, 51, 248, 55, 232, 80, 243, 4, 252, 62, 232, 80, 130, 219, 114, + 232, 80, 230, 213, 252, 62, 232, 80, 8, 2, 1, 65, 232, 80, 8, 2, 1, 250, + 122, 232, 80, 8, 2, 1, 247, 195, 232, 80, 8, 2, 1, 238, 129, 232, 80, 8, + 2, 1, 71, 232, 80, 8, 2, 1, 233, 177, 232, 80, 8, 2, 1, 232, 53, 232, 80, + 8, 2, 1, 230, 118, 232, 80, 8, 2, 1, 68, 232, 80, 8, 2, 1, 223, 37, 232, + 80, 8, 2, 1, 222, 154, 232, 80, 8, 2, 1, 172, 232, 80, 8, 2, 1, 218, 170, + 232, 80, 8, 2, 1, 215, 63, 232, 80, 8, 2, 1, 74, 232, 80, 8, 2, 1, 210, + 238, 232, 80, 8, 2, 1, 208, 106, 232, 80, 8, 2, 1, 146, 232, 80, 8, 2, 1, + 206, 9, 232, 80, 8, 2, 1, 200, 43, 232, 80, 8, 2, 1, 66, 232, 80, 8, 2, + 1, 196, 12, 232, 80, 8, 2, 1, 193, 224, 232, 80, 8, 2, 1, 192, 235, 232, + 80, 8, 2, 1, 192, 159, 232, 80, 8, 2, 1, 191, 166, 232, 80, 45, 238, 173, + 248, 55, 232, 80, 81, 219, 114, 232, 80, 50, 238, 173, 248, 55, 232, 80, + 198, 152, 232, 80, 45, 63, 210, 115, 232, 80, 50, 63, 210, 115, 151, 148, + 232, 82, 201, 64, 151, 45, 239, 4, 248, 55, 151, 50, 239, 4, 248, 55, + 151, 148, 242, 76, 151, 72, 82, 236, 142, 151, 72, 1, 193, 48, 151, 72, + 1, 2, 65, 151, 72, 1, 2, 68, 151, 72, 1, 2, 66, 151, 72, 1, 2, 71, 151, + 72, 1, 2, 74, 151, 72, 1, 2, 170, 151, 72, 1, 2, 191, 225, 151, 72, 1, 2, + 192, 12, 151, 72, 1, 2, 197, 94, 151, 222, 50, 208, 193, 202, 6, 77, 151, + 72, 1, 65, 151, 72, 1, 68, 151, 72, 1, 66, 151, 72, 1, 71, 151, 72, 1, + 74, 151, 72, 1, 155, 151, 72, 1, 221, 168, 151, 72, 1, 220, 234, 151, 72, + 1, 222, 24, 151, 72, 1, 221, 69, 151, 72, 1, 188, 151, 72, 1, 202, 223, + 151, 72, 1, 201, 5, 151, 72, 1, 205, 69, 151, 72, 1, 202, 47, 151, 72, 1, + 190, 190, 151, 72, 1, 198, 193, 151, 72, 1, 197, 94, 151, 72, 1, 199, + 145, 151, 72, 1, 159, 151, 72, 1, 181, 151, 72, 1, 213, 221, 151, 72, 1, + 212, 180, 151, 72, 1, 214, 123, 151, 72, 1, 213, 45, 151, 72, 1, 140, + 151, 72, 1, 229, 160, 151, 72, 1, 228, 161, 151, 72, 1, 229, 247, 151, + 72, 1, 229, 25, 151, 72, 1, 174, 151, 72, 1, 216, 102, 151, 72, 1, 215, + 157, 151, 72, 1, 216, 234, 151, 72, 1, 216, 14, 151, 72, 1, 170, 151, 72, + 1, 191, 225, 151, 72, 1, 192, 12, 151, 72, 1, 165, 151, 72, 1, 207, 2, + 151, 72, 1, 206, 69, 151, 72, 1, 207, 115, 151, 72, 1, 206, 163, 151, 72, + 1, 193, 190, 151, 72, 1, 215, 63, 151, 72, 195, 20, 202, 6, 77, 151, 72, + 204, 31, 202, 6, 77, 151, 30, 233, 5, 151, 30, 1, 221, 115, 151, 30, 1, + 201, 168, 151, 30, 1, 221, 108, 151, 30, 1, 213, 206, 151, 30, 1, 213, + 204, 151, 30, 1, 213, 203, 151, 30, 1, 198, 168, 151, 30, 1, 201, 157, + 151, 30, 1, 206, 240, 151, 30, 1, 206, 235, 151, 30, 1, 206, 232, 151, + 30, 1, 206, 225, 151, 30, 1, 206, 220, 151, 30, 1, 206, 215, 151, 30, 1, + 206, 226, 151, 30, 1, 206, 238, 151, 30, 1, 216, 79, 151, 30, 1, 209, + 171, 151, 30, 1, 201, 165, 151, 30, 1, 209, 160, 151, 30, 1, 202, 161, + 151, 30, 1, 201, 162, 151, 30, 1, 223, 224, 151, 30, 1, 243, 26, 151, 30, + 1, 201, 172, 151, 30, 1, 243, 93, 151, 30, 1, 221, 190, 151, 30, 1, 199, + 7, 151, 30, 1, 209, 211, 151, 30, 1, 229, 144, 151, 30, 1, 65, 151, 30, + 1, 252, 27, 151, 30, 1, 170, 151, 30, 1, 192, 129, 151, 30, 1, 234, 67, + 151, 30, 1, 71, 151, 30, 1, 192, 67, 151, 30, 1, 192, 80, 151, 30, 1, 74, + 151, 30, 1, 193, 190, 151, 30, 1, 193, 176, 151, 30, 1, 211, 153, 151, + 30, 1, 192, 12, 151, 30, 1, 66, 151, 30, 1, 193, 107, 151, 30, 1, 193, + 125, 151, 30, 1, 193, 86, 151, 30, 1, 191, 225, 151, 30, 1, 233, 244, + 151, 30, 1, 192, 33, 151, 30, 1, 68, 232, 80, 247, 26, 56, 232, 80, 209, + 10, 56, 232, 80, 213, 14, 56, 232, 80, 217, 148, 232, 80, 248, 24, 164, + 232, 80, 192, 71, 56, 232, 80, 193, 31, 56, 151, 232, 143, 156, 195, 135, + 151, 118, 57, 151, 196, 66, 57, 151, 96, 57, 151, 235, 121, 57, 151, 62, + 201, 191, 151, 63, 243, 12, 223, 108, 251, 98, 251, 129, 223, 108, 251, + 98, 204, 11, 223, 108, 251, 98, 199, 80, 211, 177, 207, 44, 246, 241, + 207, 44, 246, 241, 32, 78, 5, 250, 106, 65, 32, 78, 5, 250, 75, 71, 32, + 78, 5, 250, 84, 68, 32, 78, 5, 250, 52, 74, 32, 78, 5, 250, 102, 66, 32, + 78, 5, 250, 121, 238, 34, 32, 78, 5, 250, 68, 237, 148, 32, 78, 5, 250, + 108, 237, 46, 32, 78, 5, 250, 98, 236, 176, 32, 78, 5, 250, 62, 235, 91, + 32, 78, 5, 250, 56, 223, 34, 32, 78, 5, 250, 67, 223, 12, 32, 78, 5, 250, + 77, 222, 203, 32, 78, 5, 250, 48, 222, 184, 32, 78, 5, 250, 36, 155, 32, + 78, 5, 250, 69, 222, 24, 32, 78, 5, 250, 46, 221, 168, 32, 78, 5, 250, + 43, 221, 69, 32, 78, 5, 250, 32, 220, 234, 32, 78, 5, 250, 33, 174, 32, + 78, 5, 250, 99, 216, 234, 32, 78, 5, 250, 40, 216, 102, 32, 78, 5, 250, + 97, 216, 14, 32, 78, 5, 250, 89, 215, 157, 32, 78, 5, 250, 110, 181, 32, + 78, 5, 250, 88, 214, 123, 32, 78, 5, 250, 82, 213, 221, 32, 78, 5, 250, + 61, 213, 45, 32, 78, 5, 250, 58, 212, 180, 32, 78, 5, 250, 117, 168, 32, + 78, 5, 250, 41, 210, 65, 32, 78, 5, 250, 74, 209, 187, 32, 78, 5, 250, + 101, 209, 75, 32, 78, 5, 250, 63, 208, 167, 32, 78, 5, 250, 96, 208, 98, + 32, 78, 5, 250, 35, 208, 77, 32, 78, 5, 250, 91, 208, 59, 32, 78, 5, 250, + 80, 208, 47, 32, 78, 5, 250, 53, 165, 32, 78, 5, 250, 85, 207, 115, 32, + 78, 5, 250, 60, 207, 2, 32, 78, 5, 250, 119, 206, 163, 32, 78, 5, 250, + 86, 206, 69, 32, 78, 5, 250, 81, 188, 32, 78, 5, 250, 104, 205, 69, 32, + 78, 5, 250, 72, 202, 223, 32, 78, 5, 250, 100, 202, 47, 32, 78, 5, 250, + 55, 201, 5, 32, 78, 5, 250, 54, 190, 190, 32, 78, 5, 250, 115, 199, 145, + 32, 78, 5, 250, 76, 198, 193, 32, 78, 5, 250, 113, 159, 32, 78, 5, 250, + 44, 197, 94, 32, 78, 5, 250, 59, 193, 190, 32, 78, 5, 250, 38, 193, 125, + 32, 78, 5, 250, 73, 193, 86, 32, 78, 5, 250, 71, 193, 48, 32, 78, 5, 250, + 95, 191, 123, 32, 78, 5, 250, 39, 191, 87, 32, 78, 5, 250, 92, 191, 7, + 32, 78, 5, 250, 87, 254, 217, 32, 78, 5, 250, 70, 254, 105, 32, 78, 5, + 250, 29, 250, 165, 32, 78, 5, 250, 42, 235, 47, 32, 78, 5, 250, 25, 235, + 46, 32, 78, 5, 250, 65, 212, 112, 32, 78, 5, 250, 83, 208, 165, 32, 78, + 5, 250, 51, 208, 169, 32, 78, 5, 250, 37, 207, 182, 32, 78, 5, 250, 79, + 207, 181, 32, 78, 5, 250, 45, 206, 156, 32, 78, 5, 250, 47, 199, 246, 32, + 78, 5, 250, 27, 197, 41, 32, 78, 5, 250, 24, 109, 32, 78, 16, 250, 94, + 32, 78, 16, 250, 93, 32, 78, 16, 250, 90, 32, 78, 16, 250, 78, 32, 78, + 16, 250, 66, 32, 78, 16, 250, 64, 32, 78, 16, 250, 57, 32, 78, 16, 250, + 50, 32, 78, 16, 250, 49, 32, 78, 16, 250, 34, 32, 78, 16, 250, 31, 32, + 78, 16, 250, 30, 32, 78, 16, 250, 28, 32, 78, 16, 250, 26, 32, 78, 157, + 250, 23, 217, 92, 32, 78, 157, 250, 22, 193, 35, 32, 78, 157, 250, 21, + 237, 130, 32, 78, 157, 250, 20, 234, 42, 32, 78, 157, 250, 19, 217, 58, + 32, 78, 157, 250, 18, 201, 111, 32, 78, 157, 250, 17, 233, 225, 32, 78, + 157, 250, 16, 207, 144, 32, 78, 157, 250, 15, 203, 113, 32, 78, 157, 250, + 14, 229, 239, 32, 78, 157, 250, 13, 202, 0, 32, 78, 157, 250, 12, 248, + 111, 32, 78, 157, 250, 11, 238, 241, 32, 78, 157, 250, 10, 247, 252, 32, + 78, 157, 250, 9, 193, 95, 32, 78, 157, 250, 8, 249, 86, 32, 78, 157, 250, + 7, 211, 117, 32, 78, 157, 250, 6, 201, 224, 32, 78, 157, 250, 5, 238, + 138, 32, 78, 215, 223, 250, 4, 222, 76, 32, 78, 215, 223, 250, 3, 222, + 87, 32, 78, 157, 250, 2, 211, 133, 32, 78, 157, 250, 1, 193, 62, 32, 78, + 157, 250, 0, 32, 78, 215, 223, 249, 255, 251, 9, 32, 78, 215, 223, 249, + 254, 216, 180, 32, 78, 157, 249, 253, 248, 23, 32, 78, 157, 249, 252, + 230, 252, 32, 78, 157, 249, 251, 32, 78, 157, 249, 250, 193, 26, 32, 78, + 157, 249, 249, 32, 78, 157, 249, 248, 32, 78, 157, 249, 247, 228, 189, + 32, 78, 157, 249, 246, 32, 78, 157, 249, 245, 32, 78, 157, 249, 244, 32, + 78, 215, 223, 249, 242, 197, 56, 32, 78, 157, 249, 241, 32, 78, 157, 249, + 240, 32, 78, 157, 249, 239, 242, 215, 32, 78, 157, 249, 238, 32, 78, 157, + 249, 237, 32, 78, 157, 249, 236, 231, 198, 32, 78, 157, 249, 235, 250, + 250, 32, 78, 157, 249, 234, 32, 78, 157, 249, 233, 32, 78, 157, 249, 232, + 32, 78, 157, 249, 231, 32, 78, 157, 249, 230, 32, 78, 157, 249, 229, 32, + 78, 157, 249, 228, 32, 78, 157, 249, 227, 32, 78, 157, 249, 226, 32, 78, + 157, 249, 225, 215, 215, 32, 78, 157, 249, 224, 32, 78, 157, 249, 223, + 197, 254, 32, 78, 157, 249, 222, 32, 78, 157, 249, 221, 32, 78, 157, 249, + 220, 32, 78, 157, 249, 219, 32, 78, 157, 249, 218, 32, 78, 157, 249, 217, + 32, 78, 157, 249, 216, 32, 78, 157, 249, 215, 32, 78, 157, 249, 214, 32, + 78, 157, 249, 213, 32, 78, 157, 249, 212, 32, 78, 157, 249, 211, 229, + 202, 32, 78, 157, 249, 190, 232, 157, 32, 78, 157, 249, 187, 249, 61, 32, + 78, 157, 249, 182, 201, 233, 32, 78, 157, 249, 181, 57, 32, 78, 157, 249, + 180, 32, 78, 157, 249, 179, 200, 131, 32, 78, 157, 249, 178, 32, 78, 157, + 249, 177, 32, 78, 157, 249, 176, 193, 90, 243, 140, 32, 78, 157, 249, + 175, 243, 140, 32, 78, 157, 249, 174, 243, 141, 232, 115, 32, 78, 157, + 249, 173, 193, 93, 32, 78, 157, 249, 172, 32, 78, 157, 249, 171, 32, 78, + 215, 223, 249, 170, 236, 237, 32, 78, 157, 249, 169, 32, 78, 157, 249, + 168, 32, 78, 157, 249, 166, 32, 78, 157, 249, 165, 32, 78, 157, 249, 164, + 32, 78, 157, 249, 163, 237, 220, 32, 78, 157, 249, 162, 32, 78, 157, 249, + 161, 32, 78, 157, 249, 160, 32, 78, 157, 249, 159, 32, 78, 157, 249, 158, + 32, 78, 157, 195, 82, 249, 243, 32, 78, 157, 195, 82, 249, 210, 32, 78, + 157, 195, 82, 249, 209, 32, 78, 157, 195, 82, 249, 208, 32, 78, 157, 195, + 82, 249, 207, 32, 78, 157, 195, 82, 249, 206, 32, 78, 157, 195, 82, 249, + 205, 32, 78, 157, 195, 82, 249, 204, 32, 78, 157, 195, 82, 249, 203, 32, + 78, 157, 195, 82, 249, 202, 32, 78, 157, 195, 82, 249, 201, 32, 78, 157, + 195, 82, 249, 200, 32, 78, 157, 195, 82, 249, 199, 32, 78, 157, 195, 82, + 249, 198, 32, 78, 157, 195, 82, 249, 197, 32, 78, 157, 195, 82, 249, 196, + 32, 78, 157, 195, 82, 249, 195, 32, 78, 157, 195, 82, 249, 194, 32, 78, + 157, 195, 82, 249, 193, 32, 78, 157, 195, 82, 249, 192, 32, 78, 157, 195, + 82, 249, 191, 32, 78, 157, 195, 82, 249, 189, 32, 78, 157, 195, 82, 249, + 188, 32, 78, 157, 195, 82, 249, 186, 32, 78, 157, 195, 82, 249, 185, 32, + 78, 157, 195, 82, 249, 184, 32, 78, 157, 195, 82, 249, 183, 32, 78, 157, + 195, 82, 249, 167, 32, 78, 157, 195, 82, 249, 157, 252, 20, 193, 23, 204, + 12, 219, 114, 252, 20, 193, 23, 204, 12, 236, 142, 252, 20, 243, 128, 77, + 252, 20, 31, 107, 252, 20, 31, 109, 252, 20, 31, 138, 252, 20, 31, 134, + 252, 20, 31, 150, 252, 20, 31, 169, 252, 20, 31, 175, 252, 20, 31, 171, + 252, 20, 31, 178, 252, 20, 31, 199, 95, 252, 20, 31, 197, 32, 252, 20, + 31, 198, 249, 252, 20, 31, 232, 137, 252, 20, 31, 233, 17, 252, 20, 31, + 202, 121, 252, 20, 31, 203, 242, 252, 20, 31, 234, 155, 252, 20, 31, 213, + 171, 252, 20, 31, 91, 228, 142, 252, 20, 31, 105, 228, 142, 252, 20, 31, + 115, 228, 142, 252, 20, 31, 232, 130, 228, 142, 252, 20, 31, 232, 228, + 228, 142, 252, 20, 31, 202, 137, 228, 142, 252, 20, 31, 203, 248, 228, + 142, 252, 20, 31, 234, 166, 228, 142, 252, 20, 31, 213, 177, 228, 142, + 252, 20, 31, 91, 189, 252, 20, 31, 105, 189, 252, 20, 31, 115, 189, 252, + 20, 31, 232, 130, 189, 252, 20, 31, 232, 228, 189, 252, 20, 31, 202, 137, + 189, 252, 20, 31, 203, 248, 189, 252, 20, 31, 234, 166, 189, 252, 20, 31, + 213, 177, 189, 252, 20, 31, 199, 96, 189, 252, 20, 31, 197, 33, 189, 252, + 20, 31, 198, 250, 189, 252, 20, 31, 232, 138, 189, 252, 20, 31, 233, 18, + 189, 252, 20, 31, 202, 122, 189, 252, 20, 31, 203, 243, 189, 252, 20, 31, + 234, 156, 189, 252, 20, 31, 213, 172, 189, 252, 20, 193, 110, 249, 77, + 196, 90, 252, 20, 193, 110, 232, 240, 200, 224, 252, 20, 193, 110, 205, + 58, 200, 224, 252, 20, 193, 110, 199, 1, 200, 224, 252, 20, 193, 110, + 232, 123, 200, 224, 252, 20, 235, 94, 216, 230, 232, 240, 200, 224, 252, + 20, 219, 95, 216, 230, 232, 240, 200, 224, 252, 20, 216, 230, 205, 58, + 200, 224, 252, 20, 216, 230, 199, 1, 200, 224, 35, 252, 52, 250, 167, 91, + 208, 24, 35, 252, 52, 250, 167, 91, 230, 72, 35, 252, 52, 250, 167, 91, + 235, 117, 35, 252, 52, 250, 167, 150, 35, 252, 52, 250, 167, 233, 17, 35, + 252, 52, 250, 167, 232, 228, 228, 142, 35, 252, 52, 250, 167, 232, 228, + 189, 35, 252, 52, 250, 167, 233, 18, 189, 35, 252, 52, 250, 167, 232, + 228, 199, 203, 35, 252, 52, 250, 167, 199, 96, 199, 203, 35, 252, 52, + 250, 167, 233, 18, 199, 203, 35, 252, 52, 250, 167, 91, 228, 143, 199, + 203, 35, 252, 52, 250, 167, 232, 228, 228, 143, 199, 203, 35, 252, 52, + 250, 167, 91, 198, 230, 199, 203, 35, 252, 52, 250, 167, 232, 228, 198, + 230, 199, 203, 35, 252, 52, 250, 167, 232, 228, 201, 95, 35, 252, 52, + 250, 167, 199, 96, 201, 95, 35, 252, 52, 250, 167, 233, 18, 201, 95, 35, + 252, 52, 250, 167, 91, 228, 143, 201, 95, 35, 252, 52, 250, 167, 232, + 228, 228, 143, 201, 95, 35, 252, 52, 250, 167, 91, 198, 230, 201, 95, 35, + 252, 52, 250, 167, 199, 96, 198, 230, 201, 95, 35, 252, 52, 250, 167, + 233, 18, 198, 230, 201, 95, 35, 252, 52, 250, 167, 199, 96, 216, 17, 35, + 252, 52, 229, 196, 91, 209, 94, 35, 252, 52, 199, 17, 107, 35, 252, 52, + 229, 192, 107, 35, 252, 52, 234, 53, 109, 35, 252, 52, 199, 17, 109, 35, + 252, 52, 238, 134, 105, 235, 116, 35, 252, 52, 234, 53, 105, 235, 116, + 35, 252, 52, 197, 216, 150, 35, 252, 52, 197, 216, 199, 95, 35, 252, 52, + 197, 216, 199, 96, 251, 159, 20, 35, 252, 52, 229, 192, 199, 95, 35, 252, + 52, 216, 169, 199, 95, 35, 252, 52, 199, 17, 199, 95, 35, 252, 52, 199, + 17, 198, 249, 35, 252, 52, 197, 216, 233, 17, 35, 252, 52, 197, 216, 233, + 18, 251, 159, 20, 35, 252, 52, 229, 192, 233, 17, 35, 252, 52, 199, 17, + 233, 17, 35, 252, 52, 199, 17, 91, 228, 142, 35, 252, 52, 199, 17, 115, + 228, 142, 35, 252, 52, 234, 53, 232, 228, 228, 142, 35, 252, 52, 197, + 216, 232, 228, 228, 142, 35, 252, 52, 199, 17, 232, 228, 228, 142, 35, + 252, 52, 247, 84, 232, 228, 228, 142, 35, 252, 52, 214, 201, 232, 228, + 228, 142, 35, 252, 52, 199, 17, 91, 189, 35, 252, 52, 199, 17, 232, 228, + 189, 35, 252, 52, 237, 111, 232, 228, 216, 17, 35, 252, 52, 201, 48, 233, + 18, 216, 17, 35, 91, 132, 56, 35, 91, 132, 3, 251, 159, 20, 35, 105, 198, + 254, 56, 35, 115, 208, 23, 56, 35, 192, 78, 56, 35, 199, 204, 56, 35, + 235, 118, 56, 35, 211, 172, 56, 35, 105, 211, 171, 56, 35, 115, 211, 171, + 56, 35, 232, 130, 211, 171, 56, 35, 232, 228, 211, 171, 56, 35, 216, 163, + 56, 35, 220, 153, 249, 77, 56, 35, 219, 87, 56, 35, 211, 18, 56, 35, 192, + 211, 56, 35, 250, 228, 56, 35, 250, 245, 56, 35, 230, 222, 56, 35, 197, + 171, 249, 77, 56, 35, 191, 78, 56, 35, 91, 208, 25, 56, 35, 202, 163, 56, + 35, 223, 145, 56, 213, 34, 56, 206, 137, 203, 238, 56, 206, 137, 196, + 106, 56, 206, 137, 204, 18, 56, 206, 137, 203, 176, 56, 206, 137, 236, + 252, 203, 176, 56, 206, 137, 202, 187, 56, 206, 137, 237, 106, 56, 206, + 137, 208, 7, 56, 206, 137, 203, 255, 56, 206, 137, 235, 69, 56, 206, 137, + 250, 222, 56, 206, 137, 247, 19, 56, 250, 213, 113, 35, 16, 199, 167, + 207, 4, 209, 225, 236, 229, 3, 210, 53, 209, 225, 236, 229, 3, 209, 86, + 229, 237, 209, 225, 236, 229, 3, 199, 170, 229, 237, 209, 225, 236, 229, + 3, 247, 107, 209, 225, 236, 229, 3, 243, 88, 209, 225, 236, 229, 3, 193, + 35, 209, 225, 236, 229, 3, 229, 202, 209, 225, 236, 229, 3, 231, 190, + 209, 225, 236, 229, 3, 198, 184, 209, 225, 236, 229, 3, 57, 209, 225, + 236, 229, 3, 248, 71, 209, 225, 236, 229, 3, 203, 79, 209, 225, 236, 229, + 3, 242, 208, 209, 225, 236, 229, 3, 217, 91, 209, 225, 236, 229, 3, 217, + 28, 209, 225, 236, 229, 3, 205, 109, 209, 225, 236, 229, 3, 219, 143, + 209, 225, 236, 229, 3, 248, 94, 209, 225, 236, 229, 3, 247, 91, 209, 103, + 209, 225, 236, 229, 3, 236, 158, 209, 225, 236, 229, 3, 242, 82, 209, + 225, 236, 229, 3, 202, 84, 209, 225, 236, 229, 3, 242, 83, 209, 225, 236, + 229, 3, 249, 0, 209, 225, 236, 229, 3, 203, 66, 209, 225, 236, 229, 3, + 228, 189, 209, 225, 236, 229, 3, 229, 150, 209, 225, 236, 229, 3, 247, + 247, 219, 214, 209, 225, 236, 229, 3, 247, 80, 209, 225, 236, 229, 3, + 207, 144, 209, 225, 236, 229, 3, 234, 216, 209, 225, 236, 229, 3, 235, + 126, 209, 225, 236, 229, 3, 197, 72, 209, 225, 236, 229, 3, 249, 3, 209, + 225, 236, 229, 3, 209, 104, 197, 254, 209, 225, 236, 229, 3, 195, 47, + 209, 225, 236, 229, 3, 210, 134, 209, 225, 236, 229, 3, 206, 126, 209, + 225, 236, 229, 3, 219, 127, 209, 225, 236, 229, 3, 210, 250, 249, 148, + 209, 225, 236, 229, 3, 232, 184, 209, 225, 236, 229, 3, 230, 214, 209, + 225, 236, 229, 3, 201, 51, 209, 225, 236, 229, 3, 2, 250, 134, 209, 225, + 236, 229, 3, 193, 135, 249, 99, 209, 225, 236, 229, 3, 33, 211, 174, 106, + 218, 183, 1, 65, 218, 183, 1, 71, 218, 183, 1, 250, 122, 218, 183, 1, + 248, 206, 218, 183, 1, 232, 53, 218, 183, 1, 238, 129, 218, 183, 1, 68, + 218, 183, 1, 193, 224, 218, 183, 1, 191, 166, 218, 183, 1, 199, 51, 218, + 183, 1, 223, 37, 218, 183, 1, 222, 154, 218, 183, 1, 208, 106, 218, 183, + 1, 172, 218, 183, 1, 218, 170, 218, 183, 1, 215, 63, 218, 183, 1, 216, + 19, 218, 183, 1, 213, 82, 218, 183, 1, 66, 218, 183, 1, 210, 238, 218, + 183, 1, 221, 104, 218, 183, 1, 146, 218, 183, 1, 206, 9, 218, 183, 1, + 200, 43, 218, 183, 1, 197, 135, 218, 183, 1, 251, 134, 218, 183, 1, 234, + 105, 218, 183, 1, 230, 118, 218, 183, 1, 192, 235, 247, 97, 1, 65, 247, + 97, 1, 210, 224, 247, 97, 1, 238, 129, 247, 97, 1, 172, 247, 97, 1, 196, + 28, 247, 97, 1, 146, 247, 97, 1, 219, 244, 247, 97, 1, 254, 217, 247, 97, + 1, 208, 106, 247, 97, 1, 250, 122, 247, 97, 1, 218, 170, 247, 97, 1, 74, + 247, 97, 1, 238, 36, 247, 97, 1, 200, 43, 247, 97, 1, 203, 168, 247, 97, + 1, 203, 167, 247, 97, 1, 206, 9, 247, 97, 1, 247, 194, 247, 97, 1, 66, + 247, 97, 1, 213, 82, 247, 97, 1, 192, 235, 247, 97, 1, 215, 63, 247, 97, + 1, 197, 134, 247, 97, 1, 210, 238, 247, 97, 1, 201, 179, 247, 97, 1, 68, + 247, 97, 1, 71, 247, 97, 1, 196, 25, 247, 97, 1, 222, 154, 247, 97, 1, + 222, 145, 247, 97, 1, 214, 166, 247, 97, 1, 196, 30, 247, 97, 1, 232, 53, + 247, 97, 1, 231, 244, 247, 97, 1, 201, 119, 247, 97, 1, 201, 118, 247, + 97, 1, 214, 72, 247, 97, 1, 223, 201, 247, 97, 1, 247, 193, 247, 97, 1, + 197, 135, 247, 97, 1, 196, 27, 247, 97, 1, 206, 111, 247, 97, 1, 217, 18, + 247, 97, 1, 217, 17, 247, 97, 1, 217, 16, 247, 97, 1, 217, 15, 247, 97, + 1, 219, 243, 247, 97, 1, 234, 220, 247, 97, 1, 196, 26, 94, 234, 56, 198, + 229, 77, 94, 234, 56, 17, 107, 94, 234, 56, 17, 109, 94, 234, 56, 17, + 138, 94, 234, 56, 17, 134, 94, 234, 56, 17, 150, 94, 234, 56, 17, 169, + 94, 234, 56, 17, 175, 94, 234, 56, 17, 171, 94, 234, 56, 17, 178, 94, + 234, 56, 31, 199, 95, 94, 234, 56, 31, 197, 32, 94, 234, 56, 31, 198, + 249, 94, 234, 56, 31, 232, 137, 94, 234, 56, 31, 233, 17, 94, 234, 56, + 31, 202, 121, 94, 234, 56, 31, 203, 242, 94, 234, 56, 31, 234, 155, 94, + 234, 56, 31, 213, 171, 94, 234, 56, 31, 91, 228, 142, 94, 234, 56, 31, + 105, 228, 142, 94, 234, 56, 31, 115, 228, 142, 94, 234, 56, 31, 232, 130, + 228, 142, 94, 234, 56, 31, 232, 228, 228, 142, 94, 234, 56, 31, 202, 137, + 228, 142, 94, 234, 56, 31, 203, 248, 228, 142, 94, 234, 56, 31, 234, 166, + 228, 142, 94, 234, 56, 31, 213, 177, 228, 142, 39, 43, 1, 65, 39, 43, 1, + 249, 19, 39, 43, 1, 222, 24, 39, 43, 1, 237, 148, 39, 43, 1, 71, 39, 43, + 1, 195, 153, 39, 43, 1, 191, 87, 39, 43, 1, 229, 247, 39, 43, 1, 199, 33, + 39, 43, 1, 68, 39, 43, 1, 155, 39, 43, 1, 234, 142, 39, 43, 1, 234, 116, + 39, 43, 1, 234, 105, 39, 43, 1, 234, 14, 39, 43, 1, 74, 39, 43, 1, 210, + 65, 39, 43, 1, 203, 114, 39, 43, 1, 220, 234, 39, 43, 1, 234, 36, 39, 43, + 1, 234, 24, 39, 43, 1, 199, 145, 39, 43, 1, 66, 39, 43, 1, 234, 145, 39, + 43, 1, 209, 216, 39, 43, 1, 221, 199, 39, 43, 1, 234, 183, 39, 43, 1, + 234, 26, 39, 43, 1, 243, 129, 39, 43, 1, 223, 201, 39, 43, 1, 196, 30, + 39, 43, 1, 234, 7, 39, 43, 212, 136, 107, 39, 43, 212, 136, 150, 39, 43, + 212, 136, 199, 95, 39, 43, 212, 136, 233, 17, 39, 43, 1, 192, 80, 39, 43, + 1, 213, 18, 197, 161, 39, 43, 1, 202, 1, 197, 161, 230, 233, 1, 251, 241, + 230, 233, 1, 249, 119, 230, 233, 1, 231, 52, 230, 233, 1, 238, 15, 230, + 233, 1, 251, 236, 230, 233, 1, 208, 89, 230, 233, 1, 223, 50, 230, 233, + 1, 230, 85, 230, 233, 1, 198, 243, 230, 233, 1, 234, 153, 230, 233, 1, + 220, 191, 230, 233, 1, 220, 102, 230, 233, 1, 217, 82, 230, 233, 1, 214, + 203, 230, 233, 1, 223, 3, 230, 233, 1, 196, 48, 230, 233, 1, 210, 197, + 230, 233, 1, 213, 171, 230, 233, 1, 207, 157, 230, 233, 1, 205, 113, 230, + 233, 1, 199, 111, 230, 233, 1, 193, 59, 230, 233, 1, 233, 91, 230, 233, + 1, 223, 205, 230, 233, 1, 228, 125, 230, 233, 1, 211, 31, 230, 233, 1, + 213, 177, 228, 142, 39, 210, 4, 1, 251, 134, 39, 210, 4, 1, 247, 232, 39, + 210, 4, 1, 231, 226, 39, 210, 4, 1, 236, 162, 39, 210, 4, 1, 71, 39, 210, + 4, 1, 191, 53, 39, 210, 4, 1, 235, 29, 39, 210, 4, 1, 191, 95, 39, 210, + 4, 1, 235, 27, 39, 210, 4, 1, 68, 39, 210, 4, 1, 221, 52, 39, 210, 4, 1, + 219, 210, 39, 210, 4, 1, 216, 186, 39, 210, 4, 1, 214, 102, 39, 210, 4, + 1, 195, 7, 39, 210, 4, 1, 210, 50, 39, 210, 4, 1, 207, 71, 39, 210, 4, 1, + 202, 194, 39, 210, 4, 1, 199, 217, 39, 210, 4, 1, 66, 39, 210, 4, 1, 243, + 108, 39, 210, 4, 1, 203, 48, 39, 210, 4, 1, 203, 116, 39, 210, 4, 1, 191, + 227, 39, 210, 4, 1, 192, 58, 39, 210, 4, 1, 74, 39, 210, 4, 1, 211, 89, + 39, 210, 4, 1, 234, 183, 39, 210, 4, 1, 140, 39, 210, 4, 1, 197, 145, 39, + 210, 4, 1, 195, 140, 39, 210, 4, 1, 192, 62, 39, 210, 4, 1, 192, 60, 39, + 210, 4, 1, 192, 95, 39, 210, 4, 1, 223, 228, 39, 210, 4, 1, 191, 225, 39, + 210, 4, 1, 170, 39, 210, 4, 1, 228, 37, 33, 39, 210, 4, 1, 251, 134, 33, + 39, 210, 4, 1, 236, 162, 33, 39, 210, 4, 1, 191, 95, 33, 39, 210, 4, 1, + 214, 102, 33, 39, 210, 4, 1, 202, 194, 196, 142, 1, 251, 166, 196, 142, + 1, 248, 214, 196, 142, 1, 231, 214, 196, 142, 1, 221, 217, 196, 142, 1, + 237, 108, 196, 142, 1, 229, 25, 196, 142, 1, 193, 48, 196, 142, 1, 191, + 76, 196, 142, 1, 228, 181, 196, 142, 1, 199, 73, 196, 142, 1, 191, 250, + 196, 142, 1, 222, 108, 196, 142, 1, 203, 70, 196, 142, 1, 220, 33, 196, + 142, 1, 216, 195, 196, 142, 1, 237, 66, 196, 142, 1, 212, 132, 196, 142, + 1, 190, 251, 196, 142, 1, 205, 148, 196, 142, 1, 251, 232, 196, 142, 1, + 208, 167, 196, 142, 1, 205, 192, 196, 142, 1, 208, 40, 196, 142, 1, 207, + 135, 196, 142, 1, 199, 37, 196, 142, 1, 231, 88, 196, 142, 1, 159, 196, + 142, 1, 68, 196, 142, 1, 66, 196, 142, 1, 201, 130, 196, 142, 193, 23, + 236, 207, 39, 209, 254, 3, 65, 39, 209, 254, 3, 68, 39, 209, 254, 3, 66, + 39, 209, 254, 3, 155, 39, 209, 254, 3, 220, 234, 39, 209, 254, 3, 231, + 242, 39, 209, 254, 3, 230, 181, 39, 209, 254, 3, 192, 220, 39, 209, 254, + 3, 247, 162, 39, 209, 254, 3, 223, 34, 39, 209, 254, 3, 222, 246, 39, + 209, 254, 3, 190, 190, 39, 209, 254, 3, 197, 94, 39, 209, 254, 3, 238, + 34, 39, 209, 254, 3, 237, 46, 39, 209, 254, 3, 235, 91, 39, 209, 254, 3, + 199, 49, 39, 209, 254, 3, 168, 39, 209, 254, 3, 249, 155, 39, 209, 254, + 3, 233, 111, 39, 209, 254, 3, 181, 39, 209, 254, 3, 212, 180, 39, 209, + 254, 3, 174, 39, 209, 254, 3, 216, 102, 39, 209, 254, 3, 215, 157, 39, + 209, 254, 3, 170, 39, 209, 254, 3, 195, 188, 39, 209, 254, 3, 195, 69, + 39, 209, 254, 3, 165, 39, 209, 254, 3, 206, 69, 39, 209, 254, 3, 173, 39, + 209, 254, 3, 188, 39, 209, 254, 3, 191, 123, 39, 209, 254, 3, 203, 166, + 39, 209, 254, 3, 201, 176, 39, 209, 254, 3, 140, 39, 209, 254, 3, 250, + 159, 39, 209, 254, 3, 250, 158, 39, 209, 254, 3, 250, 157, 39, 209, 254, + 3, 192, 189, 39, 209, 254, 3, 238, 11, 39, 209, 254, 3, 238, 10, 39, 209, + 254, 3, 249, 130, 39, 209, 254, 3, 247, 214, 39, 209, 254, 193, 23, 236, + 207, 39, 209, 254, 31, 107, 39, 209, 254, 31, 109, 39, 209, 254, 31, 199, + 95, 39, 209, 254, 31, 197, 32, 39, 209, 254, 31, 228, 142, 237, 86, 6, 1, + 180, 68, 237, 86, 6, 1, 180, 71, 237, 86, 6, 1, 180, 65, 237, 86, 6, 1, + 180, 251, 247, 237, 86, 6, 1, 180, 74, 237, 86, 6, 1, 180, 211, 89, 237, + 86, 6, 1, 203, 41, 68, 237, 86, 6, 1, 203, 41, 71, 237, 86, 6, 1, 203, + 41, 65, 237, 86, 6, 1, 203, 41, 251, 247, 237, 86, 6, 1, 203, 41, 74, + 237, 86, 6, 1, 203, 41, 211, 89, 237, 86, 6, 1, 250, 133, 237, 86, 6, 1, + 210, 252, 237, 86, 6, 1, 193, 0, 237, 86, 6, 1, 192, 77, 237, 86, 6, 1, + 230, 118, 237, 86, 6, 1, 210, 51, 237, 86, 6, 1, 249, 3, 237, 86, 6, 1, + 199, 121, 237, 86, 6, 1, 237, 133, 237, 86, 6, 1, 243, 125, 237, 86, 6, + 1, 223, 10, 237, 86, 6, 1, 222, 31, 237, 86, 6, 1, 231, 188, 237, 86, 6, + 1, 234, 183, 237, 86, 6, 1, 195, 148, 237, 86, 6, 1, 233, 250, 237, 86, + 6, 1, 199, 31, 237, 86, 6, 1, 234, 24, 237, 86, 6, 1, 191, 84, 237, 86, + 6, 1, 234, 14, 237, 86, 6, 1, 191, 61, 237, 86, 6, 1, 234, 36, 237, 86, + 6, 1, 234, 142, 237, 86, 6, 1, 234, 116, 237, 86, 6, 1, 234, 105, 237, + 86, 6, 1, 234, 90, 237, 86, 6, 1, 211, 135, 237, 86, 6, 1, 233, 226, 237, + 86, 2, 1, 180, 68, 237, 86, 2, 1, 180, 71, 237, 86, 2, 1, 180, 65, 237, + 86, 2, 1, 180, 251, 247, 237, 86, 2, 1, 180, 74, 237, 86, 2, 1, 180, 211, + 89, 237, 86, 2, 1, 203, 41, 68, 237, 86, 2, 1, 203, 41, 71, 237, 86, 2, + 1, 203, 41, 65, 237, 86, 2, 1, 203, 41, 251, 247, 237, 86, 2, 1, 203, 41, + 74, 237, 86, 2, 1, 203, 41, 211, 89, 237, 86, 2, 1, 250, 133, 237, 86, 2, + 1, 210, 252, 237, 86, 2, 1, 193, 0, 237, 86, 2, 1, 192, 77, 237, 86, 2, + 1, 230, 118, 237, 86, 2, 1, 210, 51, 237, 86, 2, 1, 249, 3, 237, 86, 2, + 1, 199, 121, 237, 86, 2, 1, 237, 133, 237, 86, 2, 1, 243, 125, 237, 86, + 2, 1, 223, 10, 237, 86, 2, 1, 222, 31, 237, 86, 2, 1, 231, 188, 237, 86, + 2, 1, 234, 183, 237, 86, 2, 1, 195, 148, 237, 86, 2, 1, 233, 250, 237, + 86, 2, 1, 199, 31, 237, 86, 2, 1, 234, 24, 237, 86, 2, 1, 191, 84, 237, + 86, 2, 1, 234, 14, 237, 86, 2, 1, 191, 61, 237, 86, 2, 1, 234, 36, 237, + 86, 2, 1, 234, 142, 237, 86, 2, 1, 234, 116, 237, 86, 2, 1, 234, 105, + 237, 86, 2, 1, 234, 90, 237, 86, 2, 1, 211, 135, 237, 86, 2, 1, 233, 226, + 203, 121, 1, 210, 47, 203, 121, 1, 198, 40, 203, 121, 1, 221, 156, 203, + 121, 1, 233, 54, 203, 121, 1, 199, 6, 203, 121, 1, 202, 47, 203, 121, 1, + 200, 172, 203, 121, 1, 243, 42, 203, 121, 1, 192, 79, 203, 121, 1, 228, + 139, 203, 121, 1, 248, 189, 203, 121, 1, 237, 147, 203, 121, 1, 231, 228, + 203, 121, 1, 195, 2, 203, 121, 1, 199, 12, 203, 121, 1, 191, 4, 203, 121, + 1, 216, 229, 203, 121, 1, 222, 182, 203, 121, 1, 193, 39, 203, 121, 1, + 230, 95, 203, 121, 1, 219, 27, 203, 121, 1, 216, 47, 203, 121, 1, 223, + 208, 203, 121, 1, 234, 181, 203, 121, 1, 250, 211, 203, 121, 1, 252, 32, + 203, 121, 1, 211, 106, 203, 121, 1, 193, 26, 203, 121, 1, 211, 16, 203, + 121, 1, 251, 247, 203, 121, 1, 206, 154, 203, 121, 1, 212, 132, 203, 121, + 1, 234, 202, 203, 121, 1, 251, 252, 203, 121, 1, 228, 28, 203, 121, 1, + 196, 77, 203, 121, 1, 211, 182, 203, 121, 1, 211, 81, 203, 121, 1, 211, + 133, 203, 121, 1, 250, 139, 203, 121, 1, 251, 11, 203, 121, 1, 211, 58, + 203, 121, 1, 251, 227, 203, 121, 1, 234, 28, 203, 121, 1, 250, 242, 203, + 121, 1, 234, 213, 203, 121, 1, 228, 36, 203, 121, 1, 192, 41, 211, 35, 1, + 251, 194, 211, 35, 1, 249, 155, 211, 35, 1, 190, 190, 211, 35, 1, 223, + 34, 211, 35, 1, 192, 220, 211, 35, 1, 221, 217, 211, 35, 1, 237, 132, + 211, 35, 1, 165, 211, 35, 1, 188, 211, 35, 1, 203, 76, 211, 35, 1, 237, + 70, 211, 35, 1, 247, 69, 211, 35, 1, 231, 242, 211, 35, 1, 233, 111, 211, + 35, 1, 208, 96, 211, 35, 1, 222, 125, 211, 35, 1, 220, 123, 211, 35, 1, + 216, 61, 211, 35, 1, 212, 116, 211, 35, 1, 193, 133, 211, 35, 1, 140, + 211, 35, 1, 170, 211, 35, 1, 65, 211, 35, 1, 71, 211, 35, 1, 68, 211, 35, + 1, 74, 211, 35, 1, 66, 211, 35, 1, 252, 208, 211, 35, 1, 234, 190, 211, + 35, 1, 211, 89, 211, 35, 17, 191, 77, 211, 35, 17, 107, 211, 35, 17, 109, + 211, 35, 17, 138, 211, 35, 17, 134, 211, 35, 17, 150, 211, 35, 17, 169, + 211, 35, 17, 175, 211, 35, 17, 171, 211, 35, 17, 178, 211, 37, 6, 1, 65, + 211, 37, 6, 1, 251, 238, 211, 37, 6, 1, 251, 232, 211, 37, 6, 1, 251, + 247, 211, 37, 6, 1, 248, 58, 211, 37, 6, 1, 247, 3, 211, 37, 6, 1, 234, + 174, 211, 37, 6, 1, 71, 211, 37, 6, 1, 234, 154, 211, 37, 6, 1, 140, 211, + 37, 6, 1, 228, 95, 211, 37, 6, 1, 68, 211, 37, 6, 1, 155, 211, 37, 6, 1, + 234, 173, 211, 37, 6, 1, 220, 155, 211, 37, 6, 1, 173, 211, 37, 6, 1, + 174, 211, 37, 6, 1, 181, 211, 37, 6, 1, 74, 211, 37, 6, 1, 211, 132, 211, + 37, 6, 1, 168, 211, 37, 6, 1, 234, 172, 211, 37, 6, 1, 188, 211, 37, 6, + 1, 203, 166, 211, 37, 6, 1, 190, 190, 211, 37, 6, 1, 234, 171, 211, 37, + 6, 1, 197, 168, 211, 37, 6, 1, 234, 170, 211, 37, 6, 1, 197, 157, 211, + 37, 6, 1, 237, 70, 211, 37, 6, 1, 66, 211, 37, 6, 1, 193, 190, 211, 37, + 6, 1, 221, 217, 211, 37, 6, 1, 231, 93, 211, 37, 6, 1, 191, 123, 211, 37, + 6, 1, 191, 71, 211, 37, 2, 1, 65, 211, 37, 2, 1, 251, 238, 211, 37, 2, 1, + 251, 232, 211, 37, 2, 1, 251, 247, 211, 37, 2, 1, 248, 58, 211, 37, 2, 1, + 247, 3, 211, 37, 2, 1, 234, 174, 211, 37, 2, 1, 71, 211, 37, 2, 1, 234, + 154, 211, 37, 2, 1, 140, 211, 37, 2, 1, 228, 95, 211, 37, 2, 1, 68, 211, + 37, 2, 1, 155, 211, 37, 2, 1, 234, 173, 211, 37, 2, 1, 220, 155, 211, 37, + 2, 1, 173, 211, 37, 2, 1, 174, 211, 37, 2, 1, 181, 211, 37, 2, 1, 74, + 211, 37, 2, 1, 211, 132, 211, 37, 2, 1, 168, 211, 37, 2, 1, 234, 172, + 211, 37, 2, 1, 188, 211, 37, 2, 1, 203, 166, 211, 37, 2, 1, 190, 190, + 211, 37, 2, 1, 234, 171, 211, 37, 2, 1, 197, 168, 211, 37, 2, 1, 234, + 170, 211, 37, 2, 1, 197, 157, 211, 37, 2, 1, 237, 70, 211, 37, 2, 1, 66, + 211, 37, 2, 1, 193, 190, 211, 37, 2, 1, 221, 217, 211, 37, 2, 1, 231, 93, + 211, 37, 2, 1, 191, 123, 211, 37, 2, 1, 191, 71, 234, 138, 1, 65, 234, + 138, 1, 249, 19, 234, 138, 1, 247, 44, 234, 138, 1, 243, 129, 234, 138, + 1, 237, 148, 234, 138, 1, 214, 156, 234, 138, 1, 237, 61, 234, 138, 1, + 234, 168, 234, 138, 1, 71, 234, 138, 1, 233, 61, 234, 138, 1, 231, 167, + 234, 138, 1, 231, 22, 234, 138, 1, 229, 247, 234, 138, 1, 68, 234, 138, + 1, 223, 12, 234, 138, 1, 222, 24, 234, 138, 1, 219, 240, 234, 138, 1, + 219, 70, 234, 138, 1, 216, 234, 234, 138, 1, 214, 123, 234, 138, 1, 181, + 234, 138, 1, 213, 152, 234, 138, 1, 74, 234, 138, 1, 210, 65, 234, 138, + 1, 208, 77, 234, 138, 1, 207, 115, 234, 138, 1, 206, 105, 234, 138, 1, + 205, 69, 234, 138, 1, 203, 114, 234, 138, 1, 199, 145, 234, 138, 1, 199, + 33, 234, 138, 1, 66, 234, 138, 1, 195, 153, 234, 138, 1, 192, 214, 234, + 138, 1, 192, 159, 234, 138, 1, 191, 87, 234, 138, 1, 191, 62, 234, 138, + 1, 231, 79, 234, 138, 1, 231, 85, 234, 138, 1, 221, 199, 247, 77, 251, + 195, 1, 251, 161, 247, 77, 251, 195, 1, 248, 216, 247, 77, 251, 195, 1, + 231, 42, 247, 77, 251, 195, 1, 237, 213, 247, 77, 251, 195, 1, 234, 201, + 247, 77, 251, 195, 1, 191, 98, 247, 77, 251, 195, 1, 233, 186, 247, 77, + 251, 195, 1, 191, 56, 247, 77, 251, 195, 1, 199, 174, 247, 77, 251, 195, + 1, 247, 3, 247, 77, 251, 195, 1, 191, 236, 247, 77, 251, 195, 1, 191, 71, + 247, 77, 251, 195, 1, 223, 78, 247, 77, 251, 195, 1, 203, 166, 247, 77, + 251, 195, 1, 220, 26, 247, 77, 251, 195, 1, 223, 91, 247, 77, 251, 195, + 1, 192, 210, 247, 77, 251, 195, 1, 235, 45, 247, 77, 251, 195, 1, 247, + 104, 247, 77, 251, 195, 1, 222, 247, 247, 77, 251, 195, 1, 222, 67, 247, + 77, 251, 195, 1, 218, 179, 247, 77, 251, 195, 1, 229, 181, 247, 77, 251, + 195, 1, 208, 78, 247, 77, 251, 195, 1, 251, 69, 247, 77, 251, 195, 1, + 243, 59, 247, 77, 251, 195, 1, 243, 97, 247, 77, 251, 195, 1, 238, 142, + 247, 77, 251, 195, 1, 217, 70, 247, 77, 251, 195, 1, 208, 83, 247, 77, + 251, 195, 1, 212, 254, 247, 77, 251, 195, 1, 235, 22, 247, 77, 251, 195, + 1, 203, 148, 247, 77, 251, 195, 1, 223, 13, 247, 77, 251, 195, 1, 211, + 106, 247, 77, 251, 195, 1, 197, 3, 247, 77, 251, 195, 1, 233, 84, 247, + 77, 251, 195, 1, 235, 35, 247, 77, 251, 195, 1, 243, 135, 247, 77, 251, + 195, 1, 210, 36, 247, 77, 251, 195, 1, 231, 69, 247, 77, 251, 195, 1, + 207, 132, 247, 77, 251, 195, 1, 203, 175, 247, 77, 251, 195, 1, 195, 72, + 247, 77, 251, 195, 1, 198, 118, 247, 77, 251, 195, 1, 203, 19, 247, 77, + 251, 195, 1, 223, 48, 247, 77, 251, 195, 1, 238, 143, 247, 77, 251, 195, + 1, 247, 69, 247, 77, 251, 195, 1, 192, 84, 247, 77, 251, 195, 1, 209, + 116, 247, 77, 251, 195, 1, 221, 119, 247, 77, 251, 195, 243, 0, 77, 195, + 29, 6, 1, 65, 195, 29, 6, 1, 249, 50, 195, 29, 6, 1, 249, 19, 195, 29, 6, + 1, 247, 44, 195, 29, 6, 1, 243, 129, 195, 29, 6, 1, 237, 148, 195, 29, 6, + 1, 237, 61, 195, 29, 6, 1, 234, 168, 195, 29, 6, 1, 71, 195, 29, 6, 1, + 233, 61, 195, 29, 6, 1, 231, 242, 195, 29, 6, 1, 140, 195, 29, 6, 1, 229, + 179, 195, 29, 6, 1, 68, 195, 29, 6, 1, 223, 198, 195, 29, 6, 1, 223, 12, + 195, 29, 6, 1, 155, 195, 29, 6, 1, 173, 195, 29, 6, 1, 219, 75, 195, 29, + 6, 1, 216, 234, 195, 29, 6, 1, 214, 123, 195, 29, 6, 1, 213, 152, 195, + 29, 6, 1, 74, 195, 29, 6, 1, 210, 65, 195, 29, 6, 1, 208, 98, 195, 29, 6, + 1, 207, 115, 195, 29, 6, 1, 205, 69, 195, 29, 6, 1, 203, 114, 195, 29, 6, + 1, 199, 145, 195, 29, 6, 1, 199, 33, 195, 29, 6, 1, 66, 195, 29, 6, 1, + 195, 153, 195, 29, 6, 1, 192, 214, 195, 29, 6, 1, 192, 159, 195, 29, 6, + 1, 191, 87, 195, 29, 2, 1, 65, 195, 29, 2, 1, 249, 50, 195, 29, 2, 1, + 249, 19, 195, 29, 2, 1, 247, 44, 195, 29, 2, 1, 243, 129, 195, 29, 2, 1, + 237, 148, 195, 29, 2, 1, 237, 61, 195, 29, 2, 1, 234, 168, 195, 29, 2, 1, + 71, 195, 29, 2, 1, 233, 61, 195, 29, 2, 1, 231, 242, 195, 29, 2, 1, 140, + 195, 29, 2, 1, 229, 179, 195, 29, 2, 1, 68, 195, 29, 2, 1, 223, 198, 195, + 29, 2, 1, 223, 12, 195, 29, 2, 1, 155, 195, 29, 2, 1, 173, 195, 29, 2, 1, + 219, 75, 195, 29, 2, 1, 216, 234, 195, 29, 2, 1, 214, 123, 195, 29, 2, 1, + 213, 152, 195, 29, 2, 1, 74, 195, 29, 2, 1, 210, 65, 195, 29, 2, 1, 208, + 98, 195, 29, 2, 1, 207, 115, 195, 29, 2, 1, 205, 69, 195, 29, 2, 1, 203, + 114, 195, 29, 2, 1, 199, 145, 195, 29, 2, 1, 199, 33, 195, 29, 2, 1, 66, + 195, 29, 2, 1, 195, 153, 195, 29, 2, 1, 192, 214, 195, 29, 2, 1, 192, + 159, 195, 29, 2, 1, 191, 87, 32, 42, 3, 252, 156, 32, 42, 3, 252, 155, + 32, 42, 3, 252, 154, 32, 42, 3, 252, 153, 32, 42, 3, 252, 152, 32, 42, 3, + 252, 151, 32, 42, 3, 252, 150, 32, 42, 3, 252, 149, 32, 42, 3, 252, 148, + 32, 42, 3, 252, 147, 32, 42, 3, 252, 146, 32, 42, 3, 252, 145, 32, 42, 3, + 252, 144, 32, 42, 3, 252, 143, 32, 42, 3, 252, 142, 32, 42, 3, 252, 141, + 32, 42, 3, 252, 140, 32, 42, 3, 252, 139, 32, 42, 3, 252, 138, 32, 42, 3, + 252, 137, 32, 42, 3, 252, 136, 32, 42, 3, 252, 135, 32, 42, 3, 252, 134, + 32, 42, 3, 252, 133, 32, 42, 3, 252, 132, 32, 42, 3, 252, 131, 32, 42, 3, + 252, 130, 32, 42, 3, 255, 166, 32, 42, 3, 252, 129, 32, 42, 3, 252, 128, + 32, 42, 3, 252, 127, 32, 42, 3, 252, 126, 32, 42, 3, 252, 125, 32, 42, 3, + 252, 124, 32, 42, 3, 252, 123, 32, 42, 3, 252, 122, 32, 42, 3, 252, 121, + 32, 42, 3, 252, 120, 32, 42, 3, 252, 119, 32, 42, 3, 252, 118, 32, 42, 3, + 252, 117, 32, 42, 3, 252, 116, 32, 42, 3, 252, 115, 32, 42, 3, 252, 114, + 32, 42, 3, 252, 113, 32, 42, 3, 252, 112, 32, 42, 3, 252, 111, 32, 42, 3, + 252, 110, 32, 42, 3, 252, 109, 32, 42, 3, 252, 108, 32, 42, 3, 252, 107, + 32, 42, 3, 252, 106, 32, 42, 3, 252, 105, 32, 42, 3, 252, 104, 32, 42, 3, + 252, 103, 32, 42, 3, 252, 102, 32, 42, 3, 252, 101, 32, 42, 3, 252, 100, + 32, 42, 3, 252, 99, 32, 42, 3, 252, 98, 32, 42, 3, 252, 97, 32, 42, 3, + 252, 96, 32, 42, 3, 252, 95, 32, 42, 3, 252, 94, 32, 42, 3, 252, 93, 32, + 42, 3, 252, 92, 32, 42, 3, 252, 91, 32, 42, 3, 252, 90, 32, 42, 3, 252, + 89, 32, 42, 3, 252, 88, 32, 42, 3, 252, 87, 32, 42, 3, 255, 79, 32, 42, + 3, 252, 86, 32, 42, 3, 252, 85, 32, 42, 3, 255, 44, 32, 42, 3, 252, 84, + 32, 42, 3, 252, 83, 32, 42, 3, 252, 82, 32, 42, 3, 252, 81, 32, 42, 3, + 255, 31, 32, 42, 3, 252, 80, 32, 42, 3, 252, 79, 32, 42, 3, 252, 78, 32, + 42, 3, 252, 77, 32, 42, 3, 252, 76, 32, 42, 3, 254, 103, 32, 42, 3, 254, + 102, 32, 42, 3, 254, 101, 32, 42, 3, 254, 100, 32, 42, 3, 254, 99, 32, + 42, 3, 254, 98, 32, 42, 3, 254, 97, 32, 42, 3, 254, 96, 32, 42, 3, 254, + 94, 32, 42, 3, 254, 93, 32, 42, 3, 254, 92, 32, 42, 3, 254, 91, 32, 42, + 3, 254, 90, 32, 42, 3, 254, 89, 32, 42, 3, 254, 87, 32, 42, 3, 254, 86, + 32, 42, 3, 254, 85, 32, 42, 3, 254, 84, 32, 42, 3, 254, 83, 32, 42, 3, + 254, 82, 32, 42, 3, 254, 81, 32, 42, 3, 254, 80, 32, 42, 3, 254, 79, 32, + 42, 3, 254, 78, 32, 42, 3, 254, 77, 32, 42, 3, 254, 76, 32, 42, 3, 254, + 75, 32, 42, 3, 254, 74, 32, 42, 3, 254, 73, 32, 42, 3, 254, 72, 32, 42, + 3, 254, 71, 32, 42, 3, 254, 70, 32, 42, 3, 254, 69, 32, 42, 3, 254, 67, + 32, 42, 3, 254, 66, 32, 42, 3, 254, 65, 32, 42, 3, 254, 61, 32, 42, 3, + 254, 60, 32, 42, 3, 254, 59, 32, 42, 3, 254, 58, 32, 42, 3, 254, 54, 32, + 42, 3, 254, 53, 32, 42, 3, 254, 52, 32, 42, 3, 254, 51, 32, 42, 3, 254, + 50, 32, 42, 3, 254, 49, 32, 42, 3, 254, 48, 32, 42, 3, 254, 47, 32, 42, + 3, 254, 46, 32, 42, 3, 254, 45, 32, 42, 3, 254, 44, 32, 42, 3, 254, 43, + 32, 42, 3, 254, 42, 32, 42, 3, 254, 41, 32, 42, 3, 254, 40, 32, 42, 3, + 254, 39, 32, 42, 3, 254, 38, 32, 42, 3, 254, 37, 32, 42, 3, 254, 36, 32, + 42, 3, 254, 35, 32, 42, 3, 254, 34, 32, 42, 3, 254, 33, 32, 42, 3, 254, + 32, 32, 42, 3, 254, 30, 32, 42, 3, 254, 29, 32, 42, 3, 254, 28, 32, 42, + 3, 254, 27, 32, 42, 3, 254, 26, 32, 42, 3, 254, 24, 32, 42, 3, 254, 23, + 32, 42, 3, 254, 22, 32, 42, 3, 254, 21, 32, 42, 3, 254, 19, 32, 42, 3, + 254, 18, 32, 42, 3, 254, 17, 32, 42, 3, 253, 239, 32, 42, 3, 253, 237, + 32, 42, 3, 253, 235, 32, 42, 3, 253, 233, 32, 42, 3, 253, 231, 32, 42, 3, + 253, 229, 32, 42, 3, 253, 227, 32, 42, 3, 253, 225, 32, 42, 3, 253, 223, + 32, 42, 3, 253, 221, 32, 42, 3, 253, 219, 32, 42, 3, 253, 216, 32, 42, 3, + 253, 214, 32, 42, 3, 253, 212, 32, 42, 3, 253, 210, 32, 42, 3, 253, 208, + 32, 42, 3, 253, 206, 32, 42, 3, 253, 204, 32, 42, 3, 253, 202, 32, 42, 3, + 253, 120, 32, 42, 3, 253, 119, 32, 42, 3, 253, 118, 32, 42, 3, 253, 117, + 32, 42, 3, 253, 116, 32, 42, 3, 253, 115, 32, 42, 3, 253, 113, 32, 42, 3, + 253, 112, 32, 42, 3, 253, 111, 32, 42, 3, 253, 110, 32, 42, 3, 253, 109, + 32, 42, 3, 253, 108, 32, 42, 3, 253, 106, 32, 42, 3, 253, 105, 32, 42, 3, + 253, 101, 32, 42, 3, 253, 100, 32, 42, 3, 253, 98, 32, 42, 3, 253, 97, + 32, 42, 3, 253, 96, 32, 42, 3, 253, 95, 32, 42, 3, 253, 94, 32, 42, 3, + 253, 93, 32, 42, 3, 253, 92, 32, 42, 3, 253, 91, 32, 42, 3, 253, 90, 32, + 42, 3, 253, 89, 32, 42, 3, 253, 88, 32, 42, 3, 253, 87, 32, 42, 3, 253, + 86, 32, 42, 3, 253, 85, 32, 42, 3, 253, 84, 32, 42, 3, 253, 83, 32, 42, + 3, 253, 82, 32, 42, 3, 253, 81, 32, 42, 3, 253, 80, 32, 42, 3, 253, 79, + 32, 42, 3, 253, 78, 32, 42, 3, 253, 77, 32, 42, 3, 253, 76, 32, 42, 3, + 253, 75, 32, 42, 3, 253, 74, 32, 42, 3, 253, 73, 32, 42, 3, 253, 72, 32, + 42, 3, 253, 71, 32, 42, 3, 253, 70, 32, 42, 3, 253, 69, 32, 42, 3, 253, + 68, 32, 42, 3, 253, 67, 32, 42, 3, 253, 66, 32, 42, 3, 253, 65, 32, 42, + 3, 253, 64, 32, 42, 3, 253, 63, 32, 42, 3, 253, 62, 32, 42, 3, 253, 61, + 32, 42, 3, 253, 60, 32, 42, 3, 253, 59, 32, 42, 3, 253, 58, 32, 42, 3, + 253, 57, 32, 42, 3, 253, 56, 32, 42, 3, 253, 55, 32, 42, 3, 253, 54, 32, + 42, 3, 253, 53, 32, 42, 3, 253, 52, 32, 42, 3, 253, 51, 32, 42, 3, 253, + 50, 32, 42, 3, 253, 49, 32, 42, 3, 253, 48, 32, 42, 3, 253, 47, 32, 42, + 3, 253, 46, 32, 42, 3, 253, 45, 32, 42, 3, 253, 44, 32, 42, 3, 253, 43, + 32, 42, 3, 253, 42, 32, 42, 3, 253, 41, 32, 42, 3, 253, 40, 32, 42, 3, + 253, 39, 32, 42, 3, 253, 38, 32, 42, 3, 253, 37, 32, 42, 3, 253, 36, 32, + 42, 3, 253, 35, 32, 42, 3, 253, 34, 32, 42, 3, 253, 33, 32, 42, 3, 253, + 32, 32, 42, 3, 253, 31, 32, 42, 3, 253, 30, 32, 42, 3, 253, 29, 32, 42, + 3, 253, 28, 32, 42, 3, 253, 27, 32, 42, 3, 253, 26, 32, 42, 3, 253, 25, + 32, 42, 3, 253, 24, 32, 42, 3, 253, 23, 32, 42, 3, 253, 22, 32, 42, 3, + 253, 21, 32, 42, 3, 253, 20, 32, 42, 3, 253, 19, 32, 42, 3, 253, 18, 32, + 42, 3, 253, 17, 32, 42, 3, 253, 16, 32, 42, 3, 253, 15, 32, 42, 3, 253, + 14, 32, 42, 3, 253, 13, 32, 42, 3, 253, 12, 32, 42, 3, 253, 11, 32, 42, + 3, 253, 10, 32, 42, 3, 253, 9, 32, 42, 3, 253, 8, 32, 42, 3, 253, 7, 32, + 42, 3, 253, 6, 32, 42, 3, 253, 5, 32, 42, 3, 253, 4, 32, 42, 3, 253, 3, + 32, 42, 3, 253, 2, 32, 42, 3, 253, 1, 32, 42, 3, 253, 0, 32, 42, 3, 252, + 255, 32, 42, 3, 252, 254, 32, 42, 3, 252, 253, 32, 42, 3, 252, 252, 32, + 42, 3, 252, 251, 32, 42, 3, 252, 250, 32, 42, 3, 252, 249, 32, 42, 3, + 252, 248, 32, 42, 3, 252, 247, 32, 42, 3, 252, 246, 32, 42, 3, 252, 245, + 32, 42, 3, 252, 244, 32, 42, 3, 252, 243, 32, 42, 3, 252, 242, 32, 42, 3, + 252, 241, 32, 42, 3, 252, 240, 32, 42, 3, 252, 239, 32, 42, 3, 252, 238, + 65, 32, 42, 3, 252, 237, 250, 122, 32, 42, 3, 252, 236, 238, 129, 32, 42, + 3, 252, 235, 71, 32, 42, 3, 252, 234, 233, 177, 32, 42, 3, 252, 233, 230, + 118, 32, 42, 3, 252, 232, 223, 37, 32, 42, 3, 252, 231, 222, 154, 32, 42, + 3, 252, 230, 172, 32, 42, 3, 252, 229, 220, 132, 32, 42, 3, 252, 228, + 220, 131, 32, 42, 3, 252, 227, 220, 130, 32, 42, 3, 252, 226, 220, 129, + 32, 42, 3, 252, 225, 193, 224, 32, 42, 3, 252, 224, 192, 235, 32, 42, 3, + 252, 223, 192, 159, 32, 42, 3, 252, 222, 211, 112, 32, 42, 3, 252, 221, + 252, 71, 32, 42, 3, 252, 220, 249, 56, 32, 42, 3, 252, 219, 237, 195, 32, + 42, 3, 252, 218, 233, 185, 32, 42, 3, 252, 217, 223, 12, 32, 42, 3, 252, + 216, 32, 42, 3, 252, 215, 32, 42, 3, 252, 214, 32, 42, 3, 252, 213, 32, + 42, 3, 252, 212, 32, 42, 3, 252, 211, 32, 42, 3, 252, 210, 32, 42, 3, + 252, 209, 52, 1, 2, 6, 252, 208, 52, 1, 200, 182, 197, 238, 242, 85, 52, + 1, 200, 182, 132, 197, 238, 242, 85, 52, 1, 2, 252, 27, 52, 1, 2, 6, 250, + 122, 52, 1, 2, 78, 4, 102, 52, 1, 2, 235, 39, 237, 4, 52, 1, 2, 235, 39, + 237, 5, 4, 207, 25, 102, 52, 1, 2, 235, 39, 237, 5, 4, 238, 177, 52, 1, + 2, 237, 72, 237, 4, 52, 1, 2, 238, 130, 4, 199, 215, 52, 1, 2, 238, 130, + 4, 102, 52, 1, 2, 238, 130, 4, 228, 253, 23, 199, 215, 52, 1, 2, 207, 19, + 71, 52, 1, 2, 242, 221, 207, 19, 211, 79, 71, 52, 1, 2, 233, 39, 237, 4, + 52, 1, 2, 207, 142, 228, 189, 52, 1, 2, 6, 232, 53, 52, 1, 2, 232, 54, 4, + 102, 52, 1, 2, 6, 232, 54, 4, 102, 52, 1, 2, 230, 119, 4, 106, 52, 1, 2, + 6, 230, 118, 52, 1, 2, 229, 199, 4, 102, 52, 1, 2, 236, 141, 223, 38, 4, + 201, 29, 23, 102, 52, 1, 2, 218, 229, 237, 4, 52, 1, 2, 218, 172, 237, 4, + 52, 1, 2, 220, 145, 4, 248, 233, 52, 1, 2, 6, 220, 145, 4, 248, 233, 52, + 1, 2, 220, 145, 4, 207, 25, 228, 253, 23, 248, 233, 52, 1, 2, 219, 164, + 52, 1, 2, 219, 165, 4, 207, 25, 102, 52, 1, 2, 154, 192, 159, 52, 1, 2, + 154, 192, 160, 4, 248, 233, 52, 1, 2, 187, 4, 106, 52, 1, 2, 6, 211, 153, + 52, 1, 2, 242, 221, 211, 112, 52, 1, 2, 208, 106, 52, 1, 2, 154, 207, + 224, 4, 180, 219, 214, 52, 1, 2, 154, 207, 224, 4, 180, 219, 215, 23, + 207, 25, 102, 52, 1, 2, 207, 224, 4, 199, 215, 52, 1, 2, 207, 224, 4, + 232, 235, 52, 1, 2, 6, 146, 52, 1, 2, 199, 152, 237, 5, 4, 238, 177, 52, + 1, 2, 197, 170, 237, 4, 52, 1, 2, 197, 170, 237, 5, 4, 207, 25, 102, 52, + 1, 2, 199, 79, 237, 4, 52, 1, 2, 200, 44, 4, 207, 25, 102, 52, 1, 2, 196, + 13, 4, 50, 102, 52, 1, 2, 6, 192, 159, 52, 1, 231, 13, 201, 65, 4, 106, + 52, 1, 207, 19, 231, 13, 201, 65, 4, 106, 52, 1, 248, 174, 242, 233, 52, + 1, 237, 100, 242, 233, 52, 1, 220, 5, 242, 233, 52, 1, 251, 152, 242, + 233, 52, 1, 207, 25, 242, 234, 4, 207, 25, 102, 52, 1, 2, 206, 10, 4, + 238, 177, 238, 137, 5, 65, 238, 137, 5, 71, 238, 137, 5, 68, 238, 137, 5, + 74, 238, 137, 5, 66, 238, 137, 5, 223, 34, 238, 137, 5, 222, 203, 238, + 137, 5, 155, 238, 137, 5, 222, 24, 238, 137, 5, 221, 168, 238, 137, 5, + 221, 69, 238, 137, 5, 220, 234, 238, 137, 5, 173, 238, 137, 5, 219, 240, + 238, 137, 5, 219, 148, 238, 137, 5, 219, 45, 238, 137, 5, 218, 227, 238, + 137, 5, 174, 238, 137, 5, 216, 234, 238, 137, 5, 216, 102, 238, 137, 5, + 216, 14, 238, 137, 5, 215, 157, 238, 137, 5, 181, 238, 137, 5, 214, 123, + 238, 137, 5, 213, 221, 238, 137, 5, 213, 45, 238, 137, 5, 212, 180, 238, + 137, 5, 168, 238, 137, 5, 210, 65, 238, 137, 5, 209, 187, 238, 137, 5, + 209, 75, 238, 137, 5, 208, 167, 238, 137, 5, 165, 238, 137, 5, 207, 115, + 238, 137, 5, 207, 2, 238, 137, 5, 206, 163, 238, 137, 5, 206, 69, 238, + 137, 5, 188, 238, 137, 5, 205, 69, 238, 137, 5, 202, 223, 238, 137, 5, + 202, 47, 238, 137, 5, 201, 5, 238, 137, 5, 190, 190, 238, 137, 5, 199, + 145, 238, 137, 5, 198, 193, 238, 137, 5, 159, 238, 137, 5, 197, 94, 238, + 137, 5, 193, 190, 238, 137, 5, 193, 125, 238, 137, 5, 193, 86, 238, 137, + 5, 193, 48, 238, 137, 5, 192, 220, 238, 137, 5, 192, 214, 238, 137, 5, + 191, 123, 238, 137, 5, 191, 7, 223, 166, 251, 20, 1, 251, 192, 223, 166, + 251, 20, 1, 248, 213, 223, 166, 251, 20, 1, 231, 40, 223, 166, 251, 20, + 1, 237, 254, 223, 166, 251, 20, 1, 229, 247, 223, 166, 251, 20, 1, 193, + 133, 223, 166, 251, 20, 1, 191, 91, 223, 166, 251, 20, 1, 229, 186, 223, + 166, 251, 20, 1, 199, 69, 223, 166, 251, 20, 1, 191, 249, 223, 166, 251, + 20, 1, 222, 77, 223, 166, 251, 20, 1, 220, 28, 223, 166, 251, 20, 1, 216, + 195, 223, 166, 251, 20, 1, 212, 132, 223, 166, 251, 20, 1, 205, 149, 223, + 166, 251, 20, 1, 250, 128, 223, 166, 251, 20, 1, 210, 65, 223, 166, 251, + 20, 1, 205, 190, 223, 166, 251, 20, 1, 208, 39, 223, 166, 251, 20, 1, + 207, 39, 223, 166, 251, 20, 1, 203, 70, 223, 166, 251, 20, 1, 199, 159, + 223, 166, 251, 20, 205, 55, 56, 223, 166, 251, 20, 31, 107, 223, 166, + 251, 20, 31, 109, 223, 166, 251, 20, 31, 138, 223, 166, 251, 20, 31, 199, + 95, 223, 166, 251, 20, 31, 197, 32, 223, 166, 251, 20, 31, 91, 228, 142, + 223, 166, 251, 20, 31, 91, 189, 223, 166, 251, 20, 31, 199, 96, 189, 210, + 182, 1, 251, 192, 210, 182, 1, 248, 213, 210, 182, 1, 231, 40, 210, 182, + 1, 237, 254, 210, 182, 1, 229, 247, 210, 182, 1, 193, 133, 210, 182, 1, + 191, 91, 210, 182, 1, 229, 186, 210, 182, 1, 199, 69, 210, 182, 1, 191, + 249, 210, 182, 1, 222, 77, 210, 182, 1, 220, 28, 210, 182, 1, 216, 195, + 210, 182, 1, 53, 212, 132, 210, 182, 1, 212, 132, 210, 182, 1, 205, 149, + 210, 182, 1, 250, 128, 210, 182, 1, 210, 65, 210, 182, 1, 205, 190, 210, + 182, 1, 208, 39, 210, 182, 1, 207, 39, 210, 182, 1, 203, 70, 210, 182, 1, + 199, 159, 210, 182, 219, 221, 232, 203, 210, 182, 206, 204, 232, 203, + 210, 182, 31, 107, 210, 182, 31, 109, 210, 182, 31, 138, 210, 182, 31, + 134, 210, 182, 31, 150, 210, 182, 31, 199, 95, 210, 182, 31, 197, 32, + 214, 248, 1, 53, 251, 192, 214, 248, 1, 251, 192, 214, 248, 1, 53, 248, + 213, 214, 248, 1, 248, 213, 214, 248, 1, 231, 40, 214, 248, 1, 237, 254, + 214, 248, 1, 53, 229, 247, 214, 248, 1, 229, 247, 214, 248, 1, 193, 133, + 214, 248, 1, 191, 91, 214, 248, 1, 229, 186, 214, 248, 1, 199, 69, 214, + 248, 1, 53, 191, 249, 214, 248, 1, 191, 249, 214, 248, 1, 53, 222, 77, + 214, 248, 1, 222, 77, 214, 248, 1, 53, 220, 28, 214, 248, 1, 220, 28, + 214, 248, 1, 53, 216, 195, 214, 248, 1, 216, 195, 214, 248, 1, 53, 212, + 132, 214, 248, 1, 212, 132, 214, 248, 1, 205, 149, 214, 248, 1, 250, 128, + 214, 248, 1, 210, 65, 214, 248, 1, 205, 190, 214, 248, 1, 208, 39, 214, + 248, 1, 207, 39, 214, 248, 1, 53, 203, 70, 214, 248, 1, 203, 70, 214, + 248, 1, 199, 159, 214, 248, 31, 107, 214, 248, 31, 109, 214, 248, 31, + 138, 214, 248, 31, 134, 214, 248, 238, 204, 31, 134, 214, 248, 31, 150, + 214, 248, 31, 199, 95, 214, 248, 31, 197, 32, 214, 248, 31, 91, 228, 142, + 230, 6, 1, 251, 192, 230, 6, 1, 248, 213, 230, 6, 1, 231, 40, 230, 6, 1, + 237, 253, 230, 6, 1, 229, 247, 230, 6, 1, 193, 133, 230, 6, 1, 191, 89, + 230, 6, 1, 229, 186, 230, 6, 1, 199, 69, 230, 6, 1, 191, 249, 230, 6, 1, + 222, 77, 230, 6, 1, 220, 28, 230, 6, 1, 216, 195, 230, 6, 1, 212, 132, + 230, 6, 1, 205, 149, 230, 6, 1, 250, 126, 230, 6, 1, 210, 65, 230, 6, 1, + 205, 190, 230, 6, 1, 208, 39, 230, 6, 1, 203, 70, 230, 6, 1, 199, 159, + 230, 6, 31, 107, 230, 6, 31, 150, 230, 6, 31, 199, 95, 230, 6, 31, 197, + 32, 230, 6, 31, 91, 228, 142, 209, 199, 1, 251, 189, 209, 199, 1, 248, + 216, 209, 199, 1, 231, 215, 209, 199, 1, 237, 110, 209, 199, 1, 229, 247, + 209, 199, 1, 193, 140, 209, 199, 1, 191, 115, 209, 199, 1, 229, 188, 209, + 199, 1, 199, 73, 209, 199, 1, 191, 250, 209, 199, 1, 222, 108, 209, 199, + 1, 220, 34, 209, 199, 1, 216, 195, 209, 199, 1, 212, 132, 209, 199, 1, + 204, 20, 209, 199, 1, 251, 232, 209, 199, 1, 210, 65, 209, 199, 1, 205, + 192, 209, 199, 1, 208, 44, 209, 199, 1, 206, 125, 209, 199, 1, 203, 70, + 209, 199, 1, 199, 166, 209, 199, 31, 107, 209, 199, 31, 199, 95, 209, + 199, 31, 197, 32, 209, 199, 31, 91, 228, 142, 209, 199, 31, 109, 209, + 199, 31, 138, 209, 199, 193, 23, 204, 11, 218, 182, 1, 65, 218, 182, 1, + 250, 122, 218, 182, 1, 232, 53, 218, 182, 1, 238, 129, 218, 182, 1, 71, + 218, 182, 1, 196, 12, 218, 182, 1, 68, 218, 182, 1, 192, 159, 218, 182, + 1, 222, 154, 218, 182, 1, 172, 218, 182, 1, 218, 170, 218, 182, 1, 215, + 63, 218, 182, 1, 74, 218, 182, 1, 146, 218, 182, 1, 201, 179, 218, 182, + 1, 200, 43, 218, 182, 1, 66, 218, 182, 1, 233, 177, 218, 182, 1, 208, + 106, 218, 182, 1, 206, 9, 218, 182, 1, 197, 135, 218, 182, 1, 251, 134, + 218, 182, 1, 234, 105, 218, 182, 1, 218, 185, 218, 182, 1, 213, 82, 218, + 182, 1, 247, 195, 218, 182, 197, 238, 77, 153, 229, 146, 1, 65, 153, 229, + 146, 1, 71, 153, 229, 146, 1, 68, 153, 229, 146, 1, 74, 153, 229, 146, 1, + 170, 153, 229, 146, 1, 193, 190, 153, 229, 146, 1, 249, 155, 153, 229, + 146, 1, 249, 154, 153, 229, 146, 1, 168, 153, 229, 146, 1, 174, 153, 229, + 146, 1, 181, 153, 229, 146, 1, 215, 7, 153, 229, 146, 1, 214, 123, 153, + 229, 146, 1, 214, 121, 153, 229, 146, 1, 165, 153, 229, 146, 1, 207, 186, + 153, 229, 146, 1, 173, 153, 229, 146, 1, 221, 217, 153, 229, 146, 1, 229, + 179, 153, 229, 146, 1, 188, 153, 229, 146, 1, 205, 206, 153, 229, 146, 1, + 205, 69, 153, 229, 146, 1, 155, 153, 229, 146, 1, 208, 98, 153, 229, 146, + 1, 190, 190, 153, 229, 146, 1, 199, 250, 153, 229, 146, 1, 199, 145, 153, + 229, 146, 1, 199, 143, 153, 229, 146, 1, 159, 153, 229, 146, 1, 238, 34, + 153, 229, 146, 16, 195, 63, 153, 229, 146, 16, 195, 62, 153, 238, 168, 1, + 65, 153, 238, 168, 1, 71, 153, 238, 168, 1, 68, 153, 238, 168, 1, 74, + 153, 238, 168, 1, 170, 153, 238, 168, 1, 193, 190, 153, 238, 168, 1, 249, + 155, 153, 238, 168, 1, 168, 153, 238, 168, 1, 174, 153, 238, 168, 1, 181, + 153, 238, 168, 1, 214, 123, 153, 238, 168, 1, 165, 153, 238, 168, 1, 173, + 153, 238, 168, 1, 221, 217, 153, 238, 168, 1, 229, 179, 153, 238, 168, 1, + 188, 153, 238, 168, 1, 251, 16, 188, 153, 238, 168, 1, 205, 69, 153, 238, + 168, 1, 155, 153, 238, 168, 1, 208, 98, 153, 238, 168, 1, 190, 190, 153, + 238, 168, 1, 199, 145, 153, 238, 168, 1, 159, 153, 238, 168, 1, 238, 34, + 153, 238, 168, 232, 120, 234, 130, 197, 39, 153, 238, 168, 232, 120, 91, + 230, 72, 153, 238, 168, 219, 30, 206, 169, 153, 238, 168, 219, 30, 223, + 171, 153, 238, 168, 31, 107, 153, 238, 168, 31, 109, 153, 238, 168, 31, + 138, 153, 238, 168, 31, 134, 153, 238, 168, 31, 150, 153, 238, 168, 31, + 169, 153, 238, 168, 31, 175, 153, 238, 168, 31, 171, 153, 238, 168, 31, + 178, 153, 238, 168, 31, 199, 95, 153, 238, 168, 31, 197, 32, 153, 238, + 168, 31, 198, 249, 153, 238, 168, 31, 232, 137, 153, 238, 168, 31, 233, + 17, 153, 238, 168, 31, 202, 121, 153, 238, 168, 31, 203, 242, 153, 238, + 168, 31, 91, 228, 142, 153, 238, 168, 31, 105, 228, 142, 153, 238, 168, + 31, 115, 228, 142, 153, 238, 168, 31, 232, 130, 228, 142, 153, 238, 168, + 31, 232, 228, 228, 142, 153, 238, 168, 31, 202, 137, 228, 142, 153, 238, + 168, 31, 203, 248, 228, 142, 153, 238, 168, 31, 234, 166, 228, 142, 153, + 238, 168, 31, 213, 177, 228, 142, 153, 238, 168, 31, 91, 189, 153, 238, + 168, 31, 105, 189, 153, 238, 168, 31, 115, 189, 153, 238, 168, 31, 232, + 130, 189, 153, 238, 168, 31, 232, 228, 189, 153, 238, 168, 31, 202, 137, + 189, 153, 238, 168, 31, 203, 248, 189, 153, 238, 168, 31, 234, 166, 189, + 153, 238, 168, 31, 213, 177, 189, 153, 238, 168, 31, 199, 96, 189, 153, + 238, 168, 31, 197, 33, 189, 153, 238, 168, 31, 198, 250, 189, 153, 238, + 168, 31, 232, 138, 189, 153, 238, 168, 31, 233, 18, 189, 153, 238, 168, + 31, 202, 122, 189, 153, 238, 168, 31, 203, 243, 189, 153, 238, 168, 31, + 234, 156, 189, 153, 238, 168, 31, 213, 172, 189, 153, 238, 168, 31, 91, + 228, 143, 189, 153, 238, 168, 31, 105, 228, 143, 189, 153, 238, 168, 31, + 115, 228, 143, 189, 153, 238, 168, 31, 232, 130, 228, 143, 189, 153, 238, + 168, 31, 232, 228, 228, 143, 189, 153, 238, 168, 31, 202, 137, 228, 143, + 189, 153, 238, 168, 31, 203, 248, 228, 143, 189, 153, 238, 168, 31, 234, + 166, 228, 143, 189, 153, 238, 168, 31, 213, 177, 228, 143, 189, 153, 238, + 168, 232, 120, 91, 197, 40, 153, 238, 168, 232, 120, 105, 197, 39, 153, + 238, 168, 232, 120, 115, 197, 39, 153, 238, 168, 232, 120, 232, 130, 197, + 39, 153, 238, 168, 232, 120, 232, 228, 197, 39, 153, 238, 168, 232, 120, + 202, 137, 197, 39, 153, 238, 168, 232, 120, 203, 248, 197, 39, 153, 238, + 168, 232, 120, 234, 166, 197, 39, 153, 238, 168, 232, 120, 213, 177, 197, + 39, 153, 238, 168, 232, 120, 199, 96, 197, 39, 221, 201, 1, 65, 221, 201, + 18, 3, 68, 221, 201, 18, 3, 66, 221, 201, 18, 3, 117, 146, 221, 201, 18, + 3, 71, 221, 201, 18, 3, 74, 221, 201, 18, 219, 200, 77, 221, 201, 3, 55, + 206, 190, 60, 221, 201, 3, 251, 73, 221, 201, 3, 195, 35, 221, 201, 1, + 155, 221, 201, 1, 221, 217, 221, 201, 1, 231, 242, 221, 201, 1, 231, 93, + 221, 201, 1, 247, 162, 221, 201, 1, 247, 3, 221, 201, 1, 223, 34, 221, + 201, 1, 212, 103, 221, 201, 1, 197, 132, 221, 201, 1, 197, 120, 221, 201, + 1, 237, 193, 221, 201, 1, 237, 177, 221, 201, 1, 213, 81, 221, 201, 1, + 190, 190, 221, 201, 1, 199, 49, 221, 201, 1, 238, 34, 221, 201, 1, 237, + 70, 221, 201, 1, 181, 221, 201, 1, 168, 221, 201, 1, 209, 230, 221, 201, + 1, 249, 155, 221, 201, 1, 248, 205, 221, 201, 1, 174, 221, 201, 1, 170, + 221, 201, 1, 165, 221, 201, 1, 173, 221, 201, 1, 195, 188, 221, 201, 1, + 203, 166, 221, 201, 1, 201, 176, 221, 201, 1, 188, 221, 201, 1, 191, 123, + 221, 201, 1, 140, 221, 201, 1, 221, 103, 221, 201, 1, 197, 100, 221, 201, + 1, 197, 101, 221, 201, 1, 195, 70, 221, 201, 3, 249, 90, 58, 221, 201, 3, + 247, 76, 221, 201, 3, 75, 60, 221, 201, 195, 40, 221, 201, 17, 107, 221, + 201, 17, 109, 221, 201, 17, 138, 221, 201, 17, 134, 221, 201, 31, 199, + 95, 221, 201, 31, 197, 32, 221, 201, 31, 91, 228, 142, 221, 201, 31, 91, + 189, 221, 201, 232, 120, 91, 230, 72, 221, 201, 208, 154, 236, 142, 221, + 201, 208, 154, 2, 243, 12, 221, 201, 208, 154, 243, 12, 221, 201, 208, + 154, 238, 230, 164, 221, 201, 208, 154, 217, 85, 221, 201, 208, 154, 218, + 248, 221, 201, 208, 154, 237, 240, 221, 201, 208, 154, 55, 237, 240, 221, + 201, 208, 154, 219, 108, 39, 202, 3, 251, 31, 1, 229, 247, 39, 202, 3, + 251, 31, 1, 220, 28, 39, 202, 3, 251, 31, 1, 229, 186, 39, 202, 3, 251, + 31, 1, 216, 195, 39, 202, 3, 251, 31, 1, 208, 39, 39, 202, 3, 251, 31, 1, + 193, 133, 39, 202, 3, 251, 31, 1, 203, 70, 39, 202, 3, 251, 31, 1, 207, + 39, 39, 202, 3, 251, 31, 1, 248, 213, 39, 202, 3, 251, 31, 1, 199, 159, + 39, 202, 3, 251, 31, 1, 205, 123, 39, 202, 3, 251, 31, 1, 222, 77, 39, + 202, 3, 251, 31, 1, 212, 132, 39, 202, 3, 251, 31, 1, 221, 196, 39, 202, + 3, 251, 31, 1, 205, 190, 39, 202, 3, 251, 31, 1, 205, 149, 39, 202, 3, + 251, 31, 1, 233, 61, 39, 202, 3, 251, 31, 1, 251, 194, 39, 202, 3, 251, + 31, 1, 250, 126, 39, 202, 3, 251, 31, 1, 237, 67, 39, 202, 3, 251, 31, 1, + 231, 40, 39, 202, 3, 251, 31, 1, 237, 254, 39, 202, 3, 251, 31, 1, 231, + 81, 39, 202, 3, 251, 31, 1, 199, 69, 39, 202, 3, 251, 31, 1, 191, 89, 39, + 202, 3, 251, 31, 1, 237, 64, 39, 202, 3, 251, 31, 1, 191, 249, 39, 202, + 3, 251, 31, 1, 199, 35, 39, 202, 3, 251, 31, 1, 199, 14, 39, 202, 3, 251, + 31, 31, 107, 39, 202, 3, 251, 31, 31, 233, 17, 39, 202, 3, 251, 31, 167, + 223, 146, 39, 186, 251, 31, 1, 229, 212, 39, 186, 251, 31, 1, 220, 37, + 39, 186, 251, 31, 1, 230, 83, 39, 186, 251, 31, 1, 216, 210, 39, 186, + 251, 31, 1, 208, 91, 39, 186, 251, 31, 1, 193, 133, 39, 186, 251, 31, 1, + 234, 22, 39, 186, 251, 31, 1, 207, 72, 39, 186, 251, 31, 1, 248, 247, 39, + 186, 251, 31, 1, 199, 114, 39, 186, 251, 31, 1, 234, 23, 39, 186, 251, + 31, 1, 222, 108, 39, 186, 251, 31, 1, 213, 26, 39, 186, 251, 31, 1, 221, + 212, 39, 186, 251, 31, 1, 205, 193, 39, 186, 251, 31, 1, 234, 21, 39, + 186, 251, 31, 1, 233, 48, 39, 186, 251, 31, 1, 251, 194, 39, 186, 251, + 31, 1, 251, 232, 39, 186, 251, 31, 1, 238, 28, 39, 186, 251, 31, 1, 231, + 158, 39, 186, 251, 31, 1, 238, 5, 39, 186, 251, 31, 1, 231, 88, 39, 186, + 251, 31, 1, 199, 219, 39, 186, 251, 31, 1, 191, 113, 39, 186, 251, 31, 1, + 199, 41, 39, 186, 251, 31, 1, 192, 75, 39, 186, 251, 31, 1, 199, 29, 39, + 186, 251, 31, 1, 191, 116, 39, 186, 251, 31, 31, 107, 39, 186, 251, 31, + 31, 199, 95, 39, 186, 251, 31, 31, 197, 32, 217, 83, 1, 251, 192, 217, + 83, 1, 248, 213, 217, 83, 1, 248, 196, 217, 83, 1, 231, 40, 217, 83, 1, + 231, 66, 217, 83, 1, 237, 254, 217, 83, 1, 229, 247, 217, 83, 1, 193, + 133, 217, 83, 3, 196, 158, 217, 83, 1, 191, 91, 217, 83, 1, 191, 64, 217, + 83, 1, 223, 14, 217, 83, 1, 222, 250, 217, 83, 1, 229, 186, 217, 83, 1, + 199, 69, 217, 83, 1, 191, 249, 217, 83, 1, 222, 77, 217, 83, 1, 192, 217, + 217, 83, 1, 221, 203, 217, 83, 1, 220, 28, 217, 83, 1, 237, 63, 217, 83, + 1, 199, 40, 217, 83, 1, 216, 195, 217, 83, 1, 212, 132, 217, 83, 1, 205, + 149, 217, 83, 1, 250, 128, 217, 83, 1, 252, 160, 217, 83, 1, 210, 65, + 217, 83, 1, 233, 61, 217, 83, 1, 205, 190, 217, 83, 1, 208, 39, 217, 83, + 1, 192, 193, 217, 83, 1, 208, 66, 217, 83, 1, 207, 39, 217, 83, 1, 203, + 70, 217, 83, 1, 201, 144, 217, 83, 1, 199, 159, 217, 83, 252, 70, 87, 58, + 217, 83, 252, 70, 87, 60, 217, 83, 31, 107, 217, 83, 31, 150, 217, 83, + 31, 199, 95, 217, 83, 31, 197, 32, 217, 83, 31, 91, 228, 142, 217, 83, + 208, 154, 201, 103, 217, 83, 208, 154, 232, 203, 217, 83, 208, 154, 55, + 75, 193, 53, 236, 142, 217, 83, 208, 154, 75, 193, 53, 236, 142, 217, 83, + 208, 154, 236, 142, 217, 83, 208, 154, 105, 236, 140, 217, 83, 208, 154, + 219, 115, 233, 5, 250, 144, 1, 65, 250, 144, 1, 252, 208, 250, 144, 1, + 251, 70, 250, 144, 1, 252, 166, 250, 144, 1, 251, 134, 250, 144, 1, 252, + 168, 250, 144, 1, 252, 27, 250, 144, 1, 252, 23, 250, 144, 1, 71, 250, + 144, 1, 234, 190, 250, 144, 1, 74, 250, 144, 1, 211, 89, 250, 144, 1, 68, + 250, 144, 1, 223, 201, 250, 144, 1, 66, 250, 144, 1, 196, 30, 250, 144, + 1, 222, 24, 250, 144, 1, 192, 214, 250, 144, 1, 192, 173, 250, 144, 1, + 192, 184, 250, 144, 1, 231, 167, 250, 144, 1, 231, 124, 250, 144, 1, 231, + 79, 250, 144, 1, 247, 44, 250, 144, 1, 223, 12, 250, 144, 1, 199, 145, + 250, 144, 1, 199, 33, 250, 144, 1, 237, 148, 250, 144, 1, 237, 61, 250, + 144, 1, 197, 127, 250, 144, 1, 210, 65, 250, 144, 1, 233, 61, 250, 144, + 1, 249, 19, 250, 144, 1, 248, 198, 250, 144, 1, 214, 57, 250, 144, 1, + 213, 228, 250, 144, 1, 213, 229, 250, 144, 1, 214, 123, 250, 144, 1, 212, + 92, 250, 144, 1, 213, 76, 250, 144, 1, 216, 234, 250, 144, 1, 229, 75, + 250, 144, 1, 191, 173, 250, 144, 1, 192, 80, 250, 144, 1, 195, 153, 250, + 144, 1, 207, 115, 250, 144, 1, 219, 240, 250, 144, 1, 205, 69, 250, 144, + 1, 191, 87, 250, 144, 1, 203, 114, 250, 144, 1, 191, 62, 250, 144, 1, + 202, 230, 250, 144, 1, 201, 145, 250, 144, 1, 229, 247, 250, 144, 252, + 70, 77, 198, 138, 105, 185, 139, 91, 75, 208, 153, 2, 105, 185, 139, 91, + 75, 208, 153, 220, 15, 105, 185, 139, 91, 75, 208, 153, 220, 15, 91, 75, + 139, 105, 185, 208, 153, 220, 15, 105, 206, 186, 139, 91, 206, 190, 208, + 153, 220, 15, 91, 206, 190, 139, 105, 206, 186, 208, 153, 223, 124, 210, + 108, 1, 251, 192, 223, 124, 210, 108, 1, 248, 213, 223, 124, 210, 108, 1, + 231, 40, 223, 124, 210, 108, 1, 237, 254, 223, 124, 210, 108, 1, 229, + 247, 223, 124, 210, 108, 1, 193, 133, 223, 124, 210, 108, 1, 191, 91, + 223, 124, 210, 108, 1, 229, 186, 223, 124, 210, 108, 1, 199, 69, 223, + 124, 210, 108, 1, 191, 249, 223, 124, 210, 108, 1, 222, 77, 223, 124, + 210, 108, 1, 220, 28, 223, 124, 210, 108, 1, 216, 195, 223, 124, 210, + 108, 1, 212, 132, 223, 124, 210, 108, 1, 205, 149, 223, 124, 210, 108, 1, + 250, 128, 223, 124, 210, 108, 1, 210, 65, 223, 124, 210, 108, 1, 205, + 190, 223, 124, 210, 108, 1, 208, 39, 223, 124, 210, 108, 1, 207, 39, 223, + 124, 210, 108, 1, 203, 70, 223, 124, 210, 108, 1, 199, 159, 223, 124, + 210, 108, 31, 107, 223, 124, 210, 108, 31, 109, 223, 124, 210, 108, 31, + 138, 223, 124, 210, 108, 31, 134, 223, 124, 210, 108, 31, 199, 95, 223, + 124, 210, 108, 31, 197, 32, 223, 124, 210, 108, 31, 91, 228, 142, 223, + 124, 210, 108, 31, 91, 189, 223, 124, 210, 201, 1, 251, 192, 223, 124, + 210, 201, 1, 248, 213, 223, 124, 210, 201, 1, 231, 40, 223, 124, 210, + 201, 1, 237, 254, 223, 124, 210, 201, 1, 229, 247, 223, 124, 210, 201, 1, + 193, 132, 223, 124, 210, 201, 1, 191, 91, 223, 124, 210, 201, 1, 229, + 186, 223, 124, 210, 201, 1, 199, 69, 223, 124, 210, 201, 1, 191, 249, + 223, 124, 210, 201, 1, 222, 77, 223, 124, 210, 201, 1, 220, 28, 223, 124, + 210, 201, 1, 216, 194, 223, 124, 210, 201, 1, 212, 132, 223, 124, 210, + 201, 1, 205, 149, 223, 124, 210, 201, 1, 210, 65, 223, 124, 210, 201, 1, + 205, 190, 223, 124, 210, 201, 1, 203, 70, 223, 124, 210, 201, 1, 199, + 159, 223, 124, 210, 201, 31, 107, 223, 124, 210, 201, 31, 109, 223, 124, + 210, 201, 31, 138, 223, 124, 210, 201, 31, 134, 223, 124, 210, 201, 31, + 199, 95, 223, 124, 210, 201, 31, 197, 32, 223, 124, 210, 201, 31, 91, + 228, 142, 223, 124, 210, 201, 31, 91, 189, 208, 179, 210, 201, 1, 251, + 192, 208, 179, 210, 201, 1, 248, 213, 208, 179, 210, 201, 1, 231, 40, + 208, 179, 210, 201, 1, 237, 254, 208, 179, 210, 201, 1, 229, 247, 208, + 179, 210, 201, 1, 193, 132, 208, 179, 210, 201, 1, 191, 91, 208, 179, + 210, 201, 1, 229, 186, 208, 179, 210, 201, 1, 191, 249, 208, 179, 210, + 201, 1, 222, 77, 208, 179, 210, 201, 1, 220, 28, 208, 179, 210, 201, 1, + 216, 194, 208, 179, 210, 201, 1, 212, 132, 208, 179, 210, 201, 1, 205, + 149, 208, 179, 210, 201, 1, 210, 65, 208, 179, 210, 201, 1, 205, 190, + 208, 179, 210, 201, 1, 203, 70, 208, 179, 210, 201, 1, 199, 159, 208, + 179, 210, 201, 205, 55, 77, 208, 179, 210, 201, 154, 205, 55, 77, 208, + 179, 210, 201, 232, 130, 185, 4, 238, 219, 208, 179, 210, 201, 232, 130, + 185, 4, 236, 142, 208, 179, 210, 201, 31, 107, 208, 179, 210, 201, 31, + 109, 208, 179, 210, 201, 31, 138, 208, 179, 210, 201, 31, 134, 208, 179, + 210, 201, 31, 199, 95, 208, 179, 210, 201, 31, 197, 32, 208, 179, 210, + 201, 31, 91, 228, 142, 39, 197, 61, 1, 211, 46, 65, 39, 197, 61, 1, 192, + 68, 65, 39, 197, 61, 1, 192, 68, 252, 27, 39, 197, 61, 1, 211, 46, 68, 39, 197, 61, 1, 192, 68, 68, 39, 197, 61, 1, 192, 68, 71, 39, 197, 61, 1, - 211, 44, 74, 39, 197, 61, 1, 211, 44, 211, 151, 39, 197, 61, 1, 192, 68, - 211, 151, 39, 197, 61, 1, 211, 44, 252, 155, 39, 197, 61, 1, 192, 68, - 252, 155, 39, 197, 61, 1, 211, 44, 252, 24, 39, 197, 61, 1, 192, 68, 252, - 24, 39, 197, 61, 1, 211, 44, 251, 253, 39, 197, 61, 1, 192, 68, 251, 253, - 39, 197, 61, 1, 211, 44, 252, 19, 39, 197, 61, 1, 192, 68, 252, 19, 39, - 197, 61, 1, 211, 44, 252, 42, 39, 197, 61, 1, 192, 68, 252, 42, 39, 197, - 61, 1, 211, 44, 252, 23, 39, 197, 61, 1, 211, 44, 233, 182, 39, 197, 61, - 1, 192, 68, 233, 182, 39, 197, 61, 1, 211, 44, 250, 131, 39, 197, 61, 1, - 192, 68, 250, 131, 39, 197, 61, 1, 211, 44, 252, 6, 39, 197, 61, 1, 192, - 68, 252, 6, 39, 197, 61, 1, 211, 44, 252, 17, 39, 197, 61, 1, 192, 68, - 252, 17, 39, 197, 61, 1, 211, 44, 211, 149, 39, 197, 61, 1, 192, 68, 211, - 149, 39, 197, 61, 1, 211, 44, 251, 207, 39, 197, 61, 1, 192, 68, 251, - 207, 39, 197, 61, 1, 211, 44, 252, 16, 39, 197, 61, 1, 211, 44, 234, 118, - 39, 197, 61, 1, 211, 44, 234, 114, 39, 197, 61, 1, 211, 44, 251, 132, 39, - 197, 61, 1, 211, 44, 252, 14, 39, 197, 61, 1, 192, 68, 252, 14, 39, 197, - 61, 1, 211, 44, 234, 80, 39, 197, 61, 1, 192, 68, 234, 80, 39, 197, 61, - 1, 211, 44, 234, 100, 39, 197, 61, 1, 192, 68, 234, 100, 39, 197, 61, 1, - 211, 44, 234, 66, 39, 197, 61, 1, 192, 68, 234, 66, 39, 197, 61, 1, 192, - 68, 251, 122, 39, 197, 61, 1, 211, 44, 234, 88, 39, 197, 61, 1, 192, 68, - 252, 13, 39, 197, 61, 1, 211, 44, 234, 56, 39, 197, 61, 1, 211, 44, 211, - 78, 39, 197, 61, 1, 211, 44, 228, 28, 39, 197, 61, 1, 211, 44, 234, 197, - 39, 197, 61, 1, 192, 68, 234, 197, 39, 197, 61, 1, 211, 44, 251, 37, 39, - 197, 61, 1, 192, 68, 251, 37, 39, 197, 61, 1, 211, 44, 223, 79, 39, 197, - 61, 1, 192, 68, 223, 79, 39, 197, 61, 1, 211, 44, 211, 58, 39, 197, 61, - 1, 192, 68, 211, 58, 39, 197, 61, 1, 211, 44, 251, 33, 39, 197, 61, 1, - 192, 68, 251, 33, 39, 197, 61, 1, 211, 44, 252, 12, 39, 197, 61, 1, 211, - 44, 250, 219, 39, 197, 61, 1, 211, 44, 252, 10, 39, 197, 61, 1, 211, 44, - 250, 209, 39, 197, 61, 1, 192, 68, 250, 209, 39, 197, 61, 1, 211, 44, - 234, 12, 39, 197, 61, 1, 192, 68, 234, 12, 39, 197, 61, 1, 211, 44, 250, - 182, 39, 197, 61, 1, 192, 68, 250, 182, 39, 197, 61, 1, 211, 44, 252, 7, - 39, 197, 61, 1, 192, 68, 252, 7, 39, 197, 61, 1, 211, 44, 211, 30, 39, - 197, 61, 1, 211, 44, 249, 71, 39, 177, 6, 1, 65, 39, 177, 6, 1, 252, 206, - 39, 177, 6, 1, 234, 199, 39, 177, 6, 1, 251, 144, 39, 177, 6, 1, 234, - 197, 39, 177, 6, 1, 234, 100, 39, 177, 6, 1, 234, 193, 39, 177, 6, 1, - 234, 192, 39, 177, 6, 1, 251, 125, 39, 177, 6, 1, 71, 39, 177, 6, 1, 242, - 220, 71, 39, 177, 6, 1, 234, 188, 39, 177, 6, 1, 234, 181, 39, 177, 6, 1, - 234, 180, 39, 177, 6, 1, 234, 176, 39, 177, 6, 1, 234, 173, 39, 177, 6, - 1, 68, 39, 177, 6, 1, 223, 199, 39, 177, 6, 1, 234, 150, 39, 177, 6, 1, - 234, 147, 39, 177, 6, 1, 251, 216, 39, 177, 6, 1, 196, 86, 39, 177, 6, 1, - 234, 140, 39, 177, 6, 1, 234, 117, 39, 177, 6, 1, 234, 114, 39, 177, 6, - 1, 234, 103, 39, 177, 6, 1, 234, 66, 39, 177, 6, 1, 74, 39, 177, 6, 1, - 211, 87, 39, 177, 6, 1, 213, 182, 211, 151, 39, 177, 6, 1, 206, 58, 211, - 151, 39, 177, 6, 1, 211, 150, 39, 177, 6, 1, 234, 56, 39, 177, 6, 1, 234, - 108, 39, 177, 6, 1, 234, 34, 39, 177, 6, 1, 203, 40, 234, 34, 39, 177, 6, - 1, 234, 22, 39, 177, 6, 1, 234, 1, 39, 177, 6, 1, 233, 255, 39, 177, 6, - 1, 234, 80, 39, 177, 6, 1, 233, 243, 39, 177, 6, 1, 234, 195, 39, 177, 6, - 1, 66, 39, 177, 6, 1, 196, 30, 39, 177, 6, 1, 213, 182, 196, 152, 39, - 177, 6, 1, 206, 58, 196, 152, 39, 177, 6, 1, 233, 230, 39, 177, 6, 1, - 233, 182, 39, 177, 6, 1, 233, 177, 39, 177, 6, 1, 234, 79, 56, 39, 177, - 6, 1, 196, 45, 39, 177, 2, 1, 65, 39, 177, 2, 1, 252, 206, 39, 177, 2, 1, - 234, 199, 39, 177, 2, 1, 251, 144, 39, 177, 2, 1, 234, 197, 39, 177, 2, - 1, 234, 100, 39, 177, 2, 1, 234, 193, 39, 177, 2, 1, 234, 192, 39, 177, - 2, 1, 251, 125, 39, 177, 2, 1, 71, 39, 177, 2, 1, 242, 220, 71, 39, 177, - 2, 1, 234, 188, 39, 177, 2, 1, 234, 181, 39, 177, 2, 1, 234, 180, 39, - 177, 2, 1, 234, 176, 39, 177, 2, 1, 234, 173, 39, 177, 2, 1, 68, 39, 177, - 2, 1, 223, 199, 39, 177, 2, 1, 234, 150, 39, 177, 2, 1, 234, 147, 39, - 177, 2, 1, 251, 216, 39, 177, 2, 1, 196, 86, 39, 177, 2, 1, 234, 140, 39, - 177, 2, 1, 234, 117, 39, 177, 2, 1, 234, 114, 39, 177, 2, 1, 234, 103, - 39, 177, 2, 1, 234, 66, 39, 177, 2, 1, 74, 39, 177, 2, 1, 211, 87, 39, - 177, 2, 1, 213, 182, 211, 151, 39, 177, 2, 1, 206, 58, 211, 151, 39, 177, - 2, 1, 211, 150, 39, 177, 2, 1, 234, 56, 39, 177, 2, 1, 234, 108, 39, 177, - 2, 1, 234, 34, 39, 177, 2, 1, 203, 40, 234, 34, 39, 177, 2, 1, 234, 22, - 39, 177, 2, 1, 234, 1, 39, 177, 2, 1, 233, 255, 39, 177, 2, 1, 234, 80, - 39, 177, 2, 1, 233, 243, 39, 177, 2, 1, 234, 195, 39, 177, 2, 1, 66, 39, - 177, 2, 1, 196, 30, 39, 177, 2, 1, 213, 182, 196, 152, 39, 177, 2, 1, - 206, 58, 196, 152, 39, 177, 2, 1, 233, 230, 39, 177, 2, 1, 233, 182, 39, - 177, 2, 1, 233, 177, 39, 177, 2, 1, 234, 79, 56, 39, 177, 2, 1, 196, 45, - 39, 177, 31, 107, 39, 177, 31, 149, 39, 177, 31, 199, 95, 39, 177, 31, - 233, 15, 39, 177, 31, 91, 228, 140, 39, 177, 31, 91, 189, 230, 24, 206, - 142, 1, 65, 230, 24, 206, 142, 1, 249, 153, 230, 24, 206, 142, 1, 168, - 230, 24, 206, 142, 1, 190, 190, 230, 24, 206, 142, 1, 197, 132, 230, 24, - 206, 142, 1, 223, 32, 230, 24, 206, 142, 1, 247, 160, 230, 24, 206, 142, - 1, 140, 230, 24, 206, 142, 1, 221, 215, 230, 24, 206, 142, 1, 233, 109, - 230, 24, 206, 142, 1, 238, 32, 230, 24, 206, 142, 1, 237, 191, 230, 24, - 206, 142, 1, 165, 230, 24, 206, 142, 1, 206, 109, 230, 24, 206, 142, 1, - 191, 123, 230, 24, 206, 142, 1, 188, 230, 24, 206, 142, 1, 203, 165, 230, - 24, 206, 142, 1, 155, 230, 24, 206, 142, 1, 231, 240, 230, 24, 206, 142, - 1, 173, 230, 24, 206, 142, 1, 174, 230, 24, 206, 142, 1, 180, 230, 24, - 206, 142, 1, 193, 190, 230, 24, 206, 142, 1, 221, 137, 193, 190, 230, 24, - 206, 142, 1, 170, 230, 24, 206, 142, 1, 221, 137, 170, 230, 24, 206, 142, - 1, 214, 68, 230, 24, 206, 142, 1, 212, 101, 230, 24, 206, 142, 1, 195, - 188, 230, 24, 206, 142, 18, 65, 230, 24, 206, 142, 18, 68, 230, 24, 206, - 142, 18, 66, 230, 24, 206, 142, 18, 71, 230, 24, 206, 142, 18, 74, 230, - 24, 206, 142, 87, 205, 173, 230, 24, 206, 142, 87, 215, 7, 221, 178, 230, - 24, 206, 142, 3, 230, 18, 230, 24, 206, 142, 3, 199, 218, 230, 24, 206, - 142, 3, 199, 192, 230, 24, 206, 142, 3, 199, 172, 230, 24, 206, 142, 17, - 191, 77, 230, 24, 206, 142, 17, 107, 230, 24, 206, 142, 17, 109, 230, 24, - 206, 142, 17, 138, 230, 24, 206, 142, 17, 134, 230, 24, 206, 142, 17, - 149, 230, 24, 206, 142, 17, 169, 230, 24, 206, 142, 17, 175, 230, 24, - 206, 142, 17, 171, 230, 24, 206, 142, 17, 178, 206, 46, 17, 107, 206, 46, - 17, 109, 206, 46, 17, 138, 206, 46, 17, 134, 206, 46, 17, 149, 206, 46, - 17, 169, 206, 46, 17, 175, 206, 46, 17, 171, 206, 46, 17, 178, 206, 46, - 31, 199, 95, 206, 46, 31, 197, 32, 206, 46, 31, 198, 249, 206, 46, 31, - 232, 135, 206, 46, 31, 233, 15, 206, 46, 31, 202, 120, 206, 46, 31, 203, - 241, 206, 46, 31, 234, 153, 206, 46, 31, 213, 169, 206, 46, 31, 91, 228, - 140, 206, 46, 31, 105, 228, 140, 206, 46, 31, 115, 228, 140, 206, 46, 31, - 232, 128, 228, 140, 206, 46, 31, 232, 226, 228, 140, 206, 46, 31, 202, - 136, 228, 140, 206, 46, 31, 203, 247, 228, 140, 206, 46, 31, 234, 164, - 228, 140, 206, 46, 31, 213, 175, 228, 140, 206, 46, 232, 118, 91, 230, - 70, 206, 46, 232, 118, 91, 208, 22, 206, 46, 232, 118, 91, 199, 0, 206, - 46, 232, 118, 105, 198, 253, 192, 39, 1, 234, 124, 192, 39, 1, 249, 17, - 192, 39, 1, 210, 63, 192, 39, 1, 209, 214, 192, 39, 1, 199, 33, 192, 39, - 1, 205, 68, 192, 39, 1, 243, 16, 192, 39, 1, 243, 83, 192, 39, 1, 243, - 97, 192, 39, 1, 229, 177, 192, 39, 1, 192, 220, 192, 39, 1, 238, 3, 192, - 39, 1, 191, 108, 192, 39, 1, 165, 192, 39, 1, 207, 6, 192, 39, 1, 191, - 123, 192, 39, 1, 223, 32, 192, 39, 1, 202, 174, 192, 39, 1, 203, 69, 192, - 39, 1, 205, 192, 192, 39, 1, 238, 26, 192, 39, 1, 190, 190, 192, 39, 1, - 191, 87, 192, 39, 1, 233, 184, 192, 39, 1, 192, 208, 192, 39, 1, 233, - 109, 192, 39, 1, 195, 188, 192, 39, 1, 195, 189, 251, 157, 20, 192, 39, - 1, 208, 89, 192, 39, 1, 222, 106, 192, 39, 1, 221, 212, 192, 39, 1, 231, - 227, 192, 39, 1, 220, 35, 192, 39, 1, 216, 46, 192, 39, 1, 212, 130, 192, - 39, 1, 196, 120, 192, 39, 1, 193, 133, 192, 39, 1, 210, 250, 192, 39, 1, - 233, 224, 192, 39, 1, 229, 252, 192, 39, 1, 191, 240, 192, 39, 1, 233, - 255, 192, 39, 33, 230, 58, 77, 192, 39, 33, 217, 142, 77, 192, 39, 228, - 86, 77, 192, 39, 1, 220, 36, 4, 75, 58, 192, 39, 1, 191, 241, 4, 243, 2, - 58, 9, 2, 130, 193, 23, 205, 171, 9, 2, 130, 193, 23, 208, 79, 9, 2, 130, - 193, 23, 217, 141, 39, 202, 28, 1, 251, 190, 39, 202, 28, 1, 53, 251, - 190, 39, 202, 28, 1, 248, 211, 39, 202, 28, 1, 53, 248, 211, 39, 202, 28, - 1, 231, 38, 39, 202, 28, 1, 229, 245, 39, 202, 28, 1, 53, 229, 245, 39, - 202, 28, 1, 193, 133, 39, 202, 28, 1, 191, 91, 39, 202, 28, 1, 229, 184, - 39, 202, 28, 1, 191, 249, 39, 202, 28, 1, 222, 75, 39, 202, 28, 1, 220, - 26, 39, 202, 28, 1, 216, 193, 39, 202, 28, 1, 212, 130, 39, 202, 28, 1, - 53, 212, 130, 39, 202, 28, 1, 53, 212, 131, 4, 81, 199, 215, 39, 202, 28, - 1, 205, 148, 39, 202, 28, 1, 250, 126, 39, 202, 28, 1, 251, 157, 250, - 126, 39, 202, 28, 1, 210, 63, 39, 202, 28, 1, 205, 189, 39, 202, 28, 1, - 53, 205, 189, 39, 202, 28, 1, 53, 205, 190, 4, 81, 199, 215, 39, 202, 28, - 1, 207, 36, 39, 202, 28, 1, 203, 69, 39, 202, 28, 1, 199, 159, 39, 202, - 28, 1, 53, 199, 159, 39, 202, 28, 1, 53, 199, 160, 4, 81, 199, 215, 39, - 202, 28, 31, 107, 39, 202, 28, 31, 109, 39, 202, 28, 31, 138, 39, 202, - 28, 31, 134, 39, 202, 28, 31, 149, 39, 202, 28, 31, 199, 95, 39, 202, 28, - 31, 197, 32, 39, 202, 28, 31, 198, 249, 39, 202, 28, 31, 91, 228, 140, - 39, 202, 28, 232, 118, 91, 230, 70, 39, 202, 28, 34, 250, 125, 202, 28, - 1, 251, 190, 202, 28, 1, 248, 211, 202, 28, 1, 231, 38, 202, 28, 1, 229, - 245, 202, 28, 1, 193, 133, 202, 28, 1, 191, 91, 202, 28, 1, 229, 184, - 202, 28, 1, 191, 249, 202, 28, 1, 222, 75, 202, 28, 1, 220, 26, 202, 28, - 1, 216, 193, 202, 28, 1, 212, 130, 202, 28, 1, 205, 148, 202, 28, 1, 250, - 126, 202, 28, 1, 210, 63, 202, 28, 1, 205, 189, 202, 28, 1, 207, 37, 202, - 28, 1, 203, 69, 202, 28, 1, 199, 159, 202, 28, 1, 233, 30, 202, 28, 1, - 219, 182, 202, 28, 223, 149, 203, 69, 202, 28, 33, 75, 60, 202, 28, 33, - 105, 185, 60, 202, 28, 33, 75, 58, 202, 28, 33, 105, 185, 58, 202, 28, - 33, 238, 165, 58, 202, 28, 33, 238, 165, 60, 202, 28, 33, 228, 251, 58, - 202, 28, 33, 228, 251, 60, 202, 28, 33, 179, 228, 251, 60, 202, 28, 33, - 207, 39, 60, 202, 28, 33, 201, 28, 60, 202, 28, 31, 107, 202, 28, 31, - 199, 95, 202, 28, 31, 197, 32, 202, 28, 31, 91, 228, 140, 202, 28, 208, - 152, 105, 81, 249, 76, 202, 28, 208, 152, 105, 81, 249, 77, 4, 236, 138, - 202, 28, 208, 152, 243, 11, 4, 236, 140, 202, 28, 208, 152, 105, 243, 8, - 4, 236, 138, 202, 28, 208, 152, 132, 243, 11, 4, 236, 140, 39, 196, 19, - 1, 251, 190, 39, 196, 19, 1, 248, 211, 39, 196, 19, 1, 231, 37, 39, 196, - 19, 1, 193, 133, 39, 196, 19, 1, 191, 91, 39, 196, 19, 1, 53, 229, 184, - 39, 196, 19, 1, 191, 249, 39, 196, 19, 1, 222, 75, 39, 196, 19, 1, 220, - 26, 39, 196, 19, 1, 216, 193, 39, 196, 19, 1, 212, 130, 39, 196, 19, 1, - 205, 148, 39, 196, 19, 1, 210, 63, 39, 196, 19, 1, 205, 189, 39, 196, 19, - 1, 207, 38, 39, 196, 19, 1, 203, 69, 39, 196, 19, 1, 199, 159, 39, 196, - 19, 1, 219, 182, 39, 196, 19, 33, 75, 58, 39, 196, 19, 33, 75, 60, 39, + 211, 46, 74, 39, 197, 61, 1, 211, 46, 211, 153, 39, 197, 61, 1, 192, 68, + 211, 153, 39, 197, 61, 1, 211, 46, 252, 157, 39, 197, 61, 1, 192, 68, + 252, 157, 39, 197, 61, 1, 211, 46, 252, 26, 39, 197, 61, 1, 192, 68, 252, + 26, 39, 197, 61, 1, 211, 46, 251, 255, 39, 197, 61, 1, 192, 68, 251, 255, + 39, 197, 61, 1, 211, 46, 252, 21, 39, 197, 61, 1, 192, 68, 252, 21, 39, + 197, 61, 1, 211, 46, 252, 44, 39, 197, 61, 1, 192, 68, 252, 44, 39, 197, + 61, 1, 211, 46, 252, 25, 39, 197, 61, 1, 211, 46, 233, 184, 39, 197, 61, + 1, 192, 68, 233, 184, 39, 197, 61, 1, 211, 46, 250, 133, 39, 197, 61, 1, + 192, 68, 250, 133, 39, 197, 61, 1, 211, 46, 252, 8, 39, 197, 61, 1, 192, + 68, 252, 8, 39, 197, 61, 1, 211, 46, 252, 19, 39, 197, 61, 1, 192, 68, + 252, 19, 39, 197, 61, 1, 211, 46, 211, 151, 39, 197, 61, 1, 192, 68, 211, + 151, 39, 197, 61, 1, 211, 46, 251, 209, 39, 197, 61, 1, 192, 68, 251, + 209, 39, 197, 61, 1, 211, 46, 252, 18, 39, 197, 61, 1, 211, 46, 234, 120, + 39, 197, 61, 1, 211, 46, 234, 116, 39, 197, 61, 1, 211, 46, 251, 134, 39, + 197, 61, 1, 211, 46, 252, 16, 39, 197, 61, 1, 192, 68, 252, 16, 39, 197, + 61, 1, 211, 46, 234, 82, 39, 197, 61, 1, 192, 68, 234, 82, 39, 197, 61, + 1, 211, 46, 234, 102, 39, 197, 61, 1, 192, 68, 234, 102, 39, 197, 61, 1, + 211, 46, 234, 68, 39, 197, 61, 1, 192, 68, 234, 68, 39, 197, 61, 1, 192, + 68, 251, 124, 39, 197, 61, 1, 211, 46, 234, 90, 39, 197, 61, 1, 192, 68, + 252, 15, 39, 197, 61, 1, 211, 46, 234, 58, 39, 197, 61, 1, 211, 46, 211, + 80, 39, 197, 61, 1, 211, 46, 228, 30, 39, 197, 61, 1, 211, 46, 234, 199, + 39, 197, 61, 1, 192, 68, 234, 199, 39, 197, 61, 1, 211, 46, 251, 39, 39, + 197, 61, 1, 192, 68, 251, 39, 39, 197, 61, 1, 211, 46, 223, 81, 39, 197, + 61, 1, 192, 68, 223, 81, 39, 197, 61, 1, 211, 46, 211, 60, 39, 197, 61, + 1, 192, 68, 211, 60, 39, 197, 61, 1, 211, 46, 251, 35, 39, 197, 61, 1, + 192, 68, 251, 35, 39, 197, 61, 1, 211, 46, 252, 14, 39, 197, 61, 1, 211, + 46, 250, 221, 39, 197, 61, 1, 211, 46, 252, 12, 39, 197, 61, 1, 211, 46, + 250, 211, 39, 197, 61, 1, 192, 68, 250, 211, 39, 197, 61, 1, 211, 46, + 234, 14, 39, 197, 61, 1, 192, 68, 234, 14, 39, 197, 61, 1, 211, 46, 250, + 184, 39, 197, 61, 1, 192, 68, 250, 184, 39, 197, 61, 1, 211, 46, 252, 9, + 39, 197, 61, 1, 192, 68, 252, 9, 39, 197, 61, 1, 211, 46, 211, 32, 39, + 197, 61, 1, 211, 46, 249, 73, 39, 177, 6, 1, 65, 39, 177, 6, 1, 252, 208, + 39, 177, 6, 1, 234, 201, 39, 177, 6, 1, 251, 146, 39, 177, 6, 1, 234, + 199, 39, 177, 6, 1, 234, 102, 39, 177, 6, 1, 234, 195, 39, 177, 6, 1, + 234, 194, 39, 177, 6, 1, 251, 127, 39, 177, 6, 1, 71, 39, 177, 6, 1, 242, + 222, 71, 39, 177, 6, 1, 234, 190, 39, 177, 6, 1, 234, 183, 39, 177, 6, 1, + 234, 182, 39, 177, 6, 1, 234, 178, 39, 177, 6, 1, 234, 175, 39, 177, 6, + 1, 68, 39, 177, 6, 1, 223, 201, 39, 177, 6, 1, 234, 152, 39, 177, 6, 1, + 234, 149, 39, 177, 6, 1, 251, 218, 39, 177, 6, 1, 196, 86, 39, 177, 6, 1, + 234, 142, 39, 177, 6, 1, 234, 119, 39, 177, 6, 1, 234, 116, 39, 177, 6, + 1, 234, 105, 39, 177, 6, 1, 234, 68, 39, 177, 6, 1, 74, 39, 177, 6, 1, + 211, 89, 39, 177, 6, 1, 213, 184, 211, 153, 39, 177, 6, 1, 206, 59, 211, + 153, 39, 177, 6, 1, 211, 152, 39, 177, 6, 1, 234, 58, 39, 177, 6, 1, 234, + 110, 39, 177, 6, 1, 234, 36, 39, 177, 6, 1, 203, 41, 234, 36, 39, 177, 6, + 1, 234, 24, 39, 177, 6, 1, 234, 3, 39, 177, 6, 1, 234, 1, 39, 177, 6, 1, + 234, 82, 39, 177, 6, 1, 233, 245, 39, 177, 6, 1, 234, 197, 39, 177, 6, 1, + 66, 39, 177, 6, 1, 196, 30, 39, 177, 6, 1, 213, 184, 196, 152, 39, 177, + 6, 1, 206, 59, 196, 152, 39, 177, 6, 1, 233, 232, 39, 177, 6, 1, 233, + 184, 39, 177, 6, 1, 233, 179, 39, 177, 6, 1, 234, 81, 56, 39, 177, 6, 1, + 196, 45, 39, 177, 2, 1, 65, 39, 177, 2, 1, 252, 208, 39, 177, 2, 1, 234, + 201, 39, 177, 2, 1, 251, 146, 39, 177, 2, 1, 234, 199, 39, 177, 2, 1, + 234, 102, 39, 177, 2, 1, 234, 195, 39, 177, 2, 1, 234, 194, 39, 177, 2, + 1, 251, 127, 39, 177, 2, 1, 71, 39, 177, 2, 1, 242, 222, 71, 39, 177, 2, + 1, 234, 190, 39, 177, 2, 1, 234, 183, 39, 177, 2, 1, 234, 182, 39, 177, + 2, 1, 234, 178, 39, 177, 2, 1, 234, 175, 39, 177, 2, 1, 68, 39, 177, 2, + 1, 223, 201, 39, 177, 2, 1, 234, 152, 39, 177, 2, 1, 234, 149, 39, 177, + 2, 1, 251, 218, 39, 177, 2, 1, 196, 86, 39, 177, 2, 1, 234, 142, 39, 177, + 2, 1, 234, 119, 39, 177, 2, 1, 234, 116, 39, 177, 2, 1, 234, 105, 39, + 177, 2, 1, 234, 68, 39, 177, 2, 1, 74, 39, 177, 2, 1, 211, 89, 39, 177, + 2, 1, 213, 184, 211, 153, 39, 177, 2, 1, 206, 59, 211, 153, 39, 177, 2, + 1, 211, 152, 39, 177, 2, 1, 234, 58, 39, 177, 2, 1, 234, 110, 39, 177, 2, + 1, 234, 36, 39, 177, 2, 1, 203, 41, 234, 36, 39, 177, 2, 1, 234, 24, 39, + 177, 2, 1, 234, 3, 39, 177, 2, 1, 234, 1, 39, 177, 2, 1, 234, 82, 39, + 177, 2, 1, 233, 245, 39, 177, 2, 1, 234, 197, 39, 177, 2, 1, 66, 39, 177, + 2, 1, 196, 30, 39, 177, 2, 1, 213, 184, 196, 152, 39, 177, 2, 1, 206, 59, + 196, 152, 39, 177, 2, 1, 233, 232, 39, 177, 2, 1, 233, 184, 39, 177, 2, + 1, 233, 179, 39, 177, 2, 1, 234, 81, 56, 39, 177, 2, 1, 196, 45, 39, 177, + 31, 107, 39, 177, 31, 150, 39, 177, 31, 199, 95, 39, 177, 31, 233, 17, + 39, 177, 31, 91, 228, 142, 39, 177, 31, 91, 189, 230, 26, 206, 143, 1, + 65, 230, 26, 206, 143, 1, 249, 155, 230, 26, 206, 143, 1, 168, 230, 26, + 206, 143, 1, 190, 190, 230, 26, 206, 143, 1, 197, 132, 230, 26, 206, 143, + 1, 223, 34, 230, 26, 206, 143, 1, 247, 162, 230, 26, 206, 143, 1, 140, + 230, 26, 206, 143, 1, 221, 217, 230, 26, 206, 143, 1, 233, 111, 230, 26, + 206, 143, 1, 238, 34, 230, 26, 206, 143, 1, 237, 193, 230, 26, 206, 143, + 1, 165, 230, 26, 206, 143, 1, 206, 110, 230, 26, 206, 143, 1, 191, 123, + 230, 26, 206, 143, 1, 188, 230, 26, 206, 143, 1, 203, 166, 230, 26, 206, + 143, 1, 155, 230, 26, 206, 143, 1, 231, 242, 230, 26, 206, 143, 1, 173, + 230, 26, 206, 143, 1, 174, 230, 26, 206, 143, 1, 181, 230, 26, 206, 143, + 1, 193, 190, 230, 26, 206, 143, 1, 221, 139, 193, 190, 230, 26, 206, 143, + 1, 170, 230, 26, 206, 143, 1, 221, 139, 170, 230, 26, 206, 143, 1, 214, + 70, 230, 26, 206, 143, 1, 212, 103, 230, 26, 206, 143, 1, 195, 188, 230, + 26, 206, 143, 18, 65, 230, 26, 206, 143, 18, 68, 230, 26, 206, 143, 18, + 66, 230, 26, 206, 143, 18, 71, 230, 26, 206, 143, 18, 74, 230, 26, 206, + 143, 87, 205, 174, 230, 26, 206, 143, 87, 215, 9, 221, 180, 230, 26, 206, + 143, 3, 230, 20, 230, 26, 206, 143, 3, 199, 218, 230, 26, 206, 143, 3, + 199, 192, 230, 26, 206, 143, 3, 199, 172, 230, 26, 206, 143, 17, 191, 77, + 230, 26, 206, 143, 17, 107, 230, 26, 206, 143, 17, 109, 230, 26, 206, + 143, 17, 138, 230, 26, 206, 143, 17, 134, 230, 26, 206, 143, 17, 150, + 230, 26, 206, 143, 17, 169, 230, 26, 206, 143, 17, 175, 230, 26, 206, + 143, 17, 171, 230, 26, 206, 143, 17, 178, 206, 47, 17, 107, 206, 47, 17, + 109, 206, 47, 17, 138, 206, 47, 17, 134, 206, 47, 17, 150, 206, 47, 17, + 169, 206, 47, 17, 175, 206, 47, 17, 171, 206, 47, 17, 178, 206, 47, 31, + 199, 95, 206, 47, 31, 197, 32, 206, 47, 31, 198, 249, 206, 47, 31, 232, + 137, 206, 47, 31, 233, 17, 206, 47, 31, 202, 121, 206, 47, 31, 203, 242, + 206, 47, 31, 234, 155, 206, 47, 31, 213, 171, 206, 47, 31, 91, 228, 142, + 206, 47, 31, 105, 228, 142, 206, 47, 31, 115, 228, 142, 206, 47, 31, 232, + 130, 228, 142, 206, 47, 31, 232, 228, 228, 142, 206, 47, 31, 202, 137, + 228, 142, 206, 47, 31, 203, 248, 228, 142, 206, 47, 31, 234, 166, 228, + 142, 206, 47, 31, 213, 177, 228, 142, 206, 47, 232, 120, 91, 230, 72, + 206, 47, 232, 120, 91, 208, 24, 206, 47, 232, 120, 91, 199, 0, 206, 47, + 232, 120, 105, 198, 253, 192, 39, 1, 234, 126, 192, 39, 1, 249, 19, 192, + 39, 1, 210, 65, 192, 39, 1, 209, 216, 192, 39, 1, 199, 33, 192, 39, 1, + 205, 69, 192, 39, 1, 243, 18, 192, 39, 1, 243, 85, 192, 39, 1, 243, 99, + 192, 39, 1, 229, 179, 192, 39, 1, 192, 220, 192, 39, 1, 238, 5, 192, 39, + 1, 191, 108, 192, 39, 1, 165, 192, 39, 1, 207, 7, 192, 39, 1, 191, 123, + 192, 39, 1, 223, 34, 192, 39, 1, 202, 175, 192, 39, 1, 203, 70, 192, 39, + 1, 205, 193, 192, 39, 1, 238, 28, 192, 39, 1, 190, 190, 192, 39, 1, 191, + 87, 192, 39, 1, 233, 186, 192, 39, 1, 192, 208, 192, 39, 1, 233, 111, + 192, 39, 1, 195, 188, 192, 39, 1, 195, 189, 251, 159, 20, 192, 39, 1, + 208, 91, 192, 39, 1, 222, 108, 192, 39, 1, 221, 214, 192, 39, 1, 231, + 229, 192, 39, 1, 220, 37, 192, 39, 1, 216, 48, 192, 39, 1, 212, 132, 192, + 39, 1, 196, 120, 192, 39, 1, 193, 133, 192, 39, 1, 210, 252, 192, 39, 1, + 233, 226, 192, 39, 1, 229, 254, 192, 39, 1, 191, 240, 192, 39, 1, 234, 1, + 192, 39, 33, 230, 60, 77, 192, 39, 33, 217, 144, 77, 192, 39, 228, 88, + 77, 192, 39, 1, 220, 38, 4, 75, 58, 192, 39, 1, 191, 241, 4, 243, 4, 58, + 9, 2, 130, 193, 23, 205, 172, 9, 2, 130, 193, 23, 208, 81, 9, 2, 130, + 193, 23, 217, 143, 39, 202, 29, 1, 251, 192, 39, 202, 29, 1, 53, 251, + 192, 39, 202, 29, 1, 248, 213, 39, 202, 29, 1, 53, 248, 213, 39, 202, 29, + 1, 231, 40, 39, 202, 29, 1, 229, 247, 39, 202, 29, 1, 53, 229, 247, 39, + 202, 29, 1, 193, 133, 39, 202, 29, 1, 191, 91, 39, 202, 29, 1, 229, 186, + 39, 202, 29, 1, 191, 249, 39, 202, 29, 1, 222, 77, 39, 202, 29, 1, 220, + 28, 39, 202, 29, 1, 216, 195, 39, 202, 29, 1, 212, 132, 39, 202, 29, 1, + 53, 212, 132, 39, 202, 29, 1, 53, 212, 133, 4, 81, 199, 215, 39, 202, 29, + 1, 205, 149, 39, 202, 29, 1, 250, 128, 39, 202, 29, 1, 251, 159, 250, + 128, 39, 202, 29, 1, 210, 65, 39, 202, 29, 1, 205, 190, 39, 202, 29, 1, + 53, 205, 190, 39, 202, 29, 1, 53, 205, 191, 4, 81, 199, 215, 39, 202, 29, + 1, 207, 37, 39, 202, 29, 1, 203, 70, 39, 202, 29, 1, 199, 159, 39, 202, + 29, 1, 53, 199, 159, 39, 202, 29, 1, 53, 199, 160, 4, 81, 199, 215, 39, + 202, 29, 31, 107, 39, 202, 29, 31, 109, 39, 202, 29, 31, 138, 39, 202, + 29, 31, 134, 39, 202, 29, 31, 150, 39, 202, 29, 31, 199, 95, 39, 202, 29, + 31, 197, 32, 39, 202, 29, 31, 198, 249, 39, 202, 29, 31, 91, 228, 142, + 39, 202, 29, 232, 120, 91, 230, 72, 39, 202, 29, 34, 250, 127, 202, 29, + 1, 251, 192, 202, 29, 1, 248, 213, 202, 29, 1, 231, 40, 202, 29, 1, 229, + 247, 202, 29, 1, 193, 133, 202, 29, 1, 191, 91, 202, 29, 1, 229, 186, + 202, 29, 1, 191, 249, 202, 29, 1, 222, 77, 202, 29, 1, 220, 28, 202, 29, + 1, 216, 195, 202, 29, 1, 212, 132, 202, 29, 1, 205, 149, 202, 29, 1, 250, + 128, 202, 29, 1, 210, 65, 202, 29, 1, 205, 190, 202, 29, 1, 207, 38, 202, + 29, 1, 203, 70, 202, 29, 1, 199, 159, 202, 29, 1, 233, 32, 202, 29, 1, + 219, 184, 202, 29, 223, 151, 203, 70, 202, 29, 33, 75, 60, 202, 29, 33, + 105, 185, 60, 202, 29, 33, 75, 58, 202, 29, 33, 105, 185, 58, 202, 29, + 33, 238, 167, 58, 202, 29, 33, 238, 167, 60, 202, 29, 33, 228, 253, 58, + 202, 29, 33, 228, 253, 60, 202, 29, 33, 180, 228, 253, 60, 202, 29, 33, + 207, 40, 60, 202, 29, 33, 201, 29, 60, 202, 29, 31, 107, 202, 29, 31, + 199, 95, 202, 29, 31, 197, 32, 202, 29, 31, 91, 228, 142, 202, 29, 208, + 154, 105, 81, 249, 78, 202, 29, 208, 154, 105, 81, 249, 79, 4, 236, 140, + 202, 29, 208, 154, 243, 13, 4, 236, 142, 202, 29, 208, 154, 105, 243, 10, + 4, 236, 140, 202, 29, 208, 154, 132, 243, 13, 4, 236, 142, 39, 196, 19, + 1, 251, 192, 39, 196, 19, 1, 248, 213, 39, 196, 19, 1, 231, 39, 39, 196, + 19, 1, 193, 133, 39, 196, 19, 1, 191, 91, 39, 196, 19, 1, 53, 229, 186, + 39, 196, 19, 1, 191, 249, 39, 196, 19, 1, 222, 77, 39, 196, 19, 1, 220, + 28, 39, 196, 19, 1, 216, 195, 39, 196, 19, 1, 212, 132, 39, 196, 19, 1, + 205, 149, 39, 196, 19, 1, 210, 65, 39, 196, 19, 1, 205, 190, 39, 196, 19, + 1, 207, 39, 39, 196, 19, 1, 203, 70, 39, 196, 19, 1, 199, 159, 39, 196, + 19, 1, 219, 184, 39, 196, 19, 33, 75, 58, 39, 196, 19, 33, 75, 60, 39, 196, 19, 33, 105, 185, 58, 39, 196, 19, 33, 105, 185, 60, 39, 196, 19, - 208, 152, 164, 39, 196, 19, 208, 152, 105, 249, 76, 39, 196, 19, 208, - 152, 105, 236, 138, 39, 196, 19, 208, 152, 232, 128, 236, 138, 243, 61, - 1, 251, 190, 243, 61, 1, 2, 251, 190, 243, 61, 1, 248, 211, 243, 61, 1, - 231, 38, 243, 61, 1, 237, 252, 243, 61, 1, 229, 245, 243, 61, 1, 193, - 133, 243, 61, 1, 238, 174, 193, 133, 243, 61, 1, 191, 91, 243, 61, 1, - 229, 184, 243, 61, 1, 191, 249, 243, 61, 1, 222, 75, 243, 61, 1, 220, 26, - 243, 61, 1, 216, 193, 243, 61, 1, 212, 130, 243, 61, 1, 205, 148, 243, - 61, 1, 250, 126, 243, 61, 1, 210, 63, 243, 61, 1, 207, 38, 243, 61, 1, - 203, 69, 243, 61, 1, 199, 159, 243, 61, 31, 107, 243, 61, 31, 109, 243, - 61, 31, 138, 243, 61, 31, 134, 243, 61, 31, 199, 95, 243, 61, 31, 197, - 32, 243, 61, 31, 91, 228, 140, 234, 116, 1, 251, 190, 234, 116, 1, 248, - 211, 234, 116, 1, 231, 38, 234, 116, 1, 237, 252, 234, 116, 1, 229, 245, - 234, 116, 1, 193, 133, 234, 116, 1, 191, 91, 234, 116, 1, 229, 184, 234, - 116, 1, 199, 69, 234, 116, 1, 191, 249, 234, 116, 1, 222, 75, 234, 116, - 1, 220, 26, 234, 116, 1, 216, 193, 234, 116, 1, 212, 130, 234, 116, 1, - 205, 148, 234, 116, 1, 250, 126, 234, 116, 1, 210, 63, 234, 116, 1, 205, - 189, 234, 116, 1, 208, 37, 234, 116, 1, 207, 38, 234, 116, 1, 203, 69, - 234, 116, 1, 199, 159, 234, 116, 34, 191, 90, 162, 3, 247, 119, 162, 3, - 251, 71, 162, 3, 195, 35, 162, 3, 222, 237, 162, 3, 196, 75, 162, 1, 65, - 162, 1, 252, 206, 162, 1, 68, 162, 1, 223, 199, 162, 1, 66, 162, 1, 196, - 30, 162, 1, 117, 146, 162, 1, 117, 206, 110, 162, 1, 117, 172, 162, 1, - 117, 219, 74, 162, 1, 71, 162, 1, 251, 236, 162, 1, 74, 162, 1, 250, 163, - 162, 1, 155, 162, 1, 221, 215, 162, 1, 231, 240, 162, 1, 231, 91, 162, 1, - 214, 68, 162, 1, 247, 160, 162, 1, 247, 1, 162, 1, 223, 32, 162, 1, 222, - 252, 162, 1, 212, 101, 162, 1, 197, 132, 162, 1, 197, 120, 162, 1, 237, - 191, 162, 1, 237, 175, 162, 1, 213, 79, 162, 1, 190, 190, 162, 1, 199, - 49, 162, 1, 238, 32, 162, 1, 237, 68, 162, 1, 180, 162, 1, 168, 162, 1, - 209, 228, 162, 1, 249, 153, 162, 1, 248, 203, 162, 1, 174, 162, 1, 170, - 162, 1, 165, 162, 1, 173, 162, 1, 195, 188, 162, 1, 203, 165, 162, 1, - 201, 175, 162, 1, 188, 162, 1, 140, 162, 1, 219, 73, 162, 1, 39, 44, 219, - 62, 162, 1, 39, 44, 206, 109, 162, 1, 39, 44, 213, 61, 162, 18, 3, 252, - 206, 162, 18, 3, 248, 197, 252, 206, 162, 18, 3, 68, 162, 18, 3, 223, - 199, 162, 18, 3, 66, 162, 18, 3, 196, 30, 162, 18, 3, 117, 146, 162, 18, - 3, 117, 206, 110, 162, 18, 3, 117, 172, 162, 18, 3, 117, 219, 74, 162, - 18, 3, 71, 162, 18, 3, 251, 236, 162, 18, 3, 74, 162, 18, 3, 250, 163, - 162, 195, 40, 162, 237, 238, 162, 55, 237, 238, 162, 208, 152, 236, 140, - 162, 208, 152, 55, 236, 140, 162, 208, 152, 219, 112, 162, 208, 152, 238, - 228, 164, 162, 208, 152, 218, 246, 162, 31, 107, 162, 31, 109, 162, 31, - 138, 162, 31, 134, 162, 31, 149, 162, 31, 169, 162, 31, 175, 162, 31, + 208, 154, 164, 39, 196, 19, 208, 154, 105, 249, 78, 39, 196, 19, 208, + 154, 105, 236, 140, 39, 196, 19, 208, 154, 232, 130, 236, 140, 243, 63, + 1, 251, 192, 243, 63, 1, 2, 251, 192, 243, 63, 1, 248, 213, 243, 63, 1, + 231, 40, 243, 63, 1, 237, 254, 243, 63, 1, 229, 247, 243, 63, 1, 193, + 133, 243, 63, 1, 238, 176, 193, 133, 243, 63, 1, 191, 91, 243, 63, 1, + 229, 186, 243, 63, 1, 191, 249, 243, 63, 1, 222, 77, 243, 63, 1, 220, 28, + 243, 63, 1, 216, 195, 243, 63, 1, 212, 132, 243, 63, 1, 205, 149, 243, + 63, 1, 250, 128, 243, 63, 1, 210, 65, 243, 63, 1, 207, 39, 243, 63, 1, + 203, 70, 243, 63, 1, 199, 159, 243, 63, 31, 107, 243, 63, 31, 109, 243, + 63, 31, 138, 243, 63, 31, 134, 243, 63, 31, 199, 95, 243, 63, 31, 197, + 32, 243, 63, 31, 91, 228, 142, 234, 118, 1, 251, 192, 234, 118, 1, 248, + 213, 234, 118, 1, 231, 40, 234, 118, 1, 237, 254, 234, 118, 1, 229, 247, + 234, 118, 1, 193, 133, 234, 118, 1, 191, 91, 234, 118, 1, 229, 186, 234, + 118, 1, 199, 69, 234, 118, 1, 191, 249, 234, 118, 1, 222, 77, 234, 118, + 1, 220, 28, 234, 118, 1, 216, 195, 234, 118, 1, 212, 132, 234, 118, 1, + 205, 149, 234, 118, 1, 250, 128, 234, 118, 1, 210, 65, 234, 118, 1, 205, + 190, 234, 118, 1, 208, 39, 234, 118, 1, 207, 39, 234, 118, 1, 203, 70, + 234, 118, 1, 199, 159, 234, 118, 34, 191, 90, 162, 3, 247, 121, 162, 3, + 251, 73, 162, 3, 195, 35, 162, 3, 222, 239, 162, 3, 196, 75, 162, 1, 65, + 162, 1, 252, 208, 162, 1, 68, 162, 1, 223, 201, 162, 1, 66, 162, 1, 196, + 30, 162, 1, 117, 146, 162, 1, 117, 206, 111, 162, 1, 117, 172, 162, 1, + 117, 219, 76, 162, 1, 71, 162, 1, 251, 238, 162, 1, 74, 162, 1, 250, 165, + 162, 1, 155, 162, 1, 221, 217, 162, 1, 231, 242, 162, 1, 231, 93, 162, 1, + 214, 70, 162, 1, 247, 162, 162, 1, 247, 3, 162, 1, 223, 34, 162, 1, 222, + 254, 162, 1, 212, 103, 162, 1, 197, 132, 162, 1, 197, 120, 162, 1, 237, + 193, 162, 1, 237, 177, 162, 1, 213, 81, 162, 1, 190, 190, 162, 1, 199, + 49, 162, 1, 238, 34, 162, 1, 237, 70, 162, 1, 181, 162, 1, 168, 162, 1, + 209, 230, 162, 1, 249, 155, 162, 1, 248, 205, 162, 1, 174, 162, 1, 170, + 162, 1, 165, 162, 1, 173, 162, 1, 195, 188, 162, 1, 203, 166, 162, 1, + 201, 176, 162, 1, 188, 162, 1, 140, 162, 1, 219, 75, 162, 1, 39, 44, 219, + 64, 162, 1, 39, 44, 206, 110, 162, 1, 39, 44, 213, 63, 162, 18, 3, 252, + 208, 162, 18, 3, 248, 199, 252, 208, 162, 18, 3, 68, 162, 18, 3, 223, + 201, 162, 18, 3, 66, 162, 18, 3, 196, 30, 162, 18, 3, 117, 146, 162, 18, + 3, 117, 206, 111, 162, 18, 3, 117, 172, 162, 18, 3, 117, 219, 76, 162, + 18, 3, 71, 162, 18, 3, 251, 238, 162, 18, 3, 74, 162, 18, 3, 250, 165, + 162, 195, 40, 162, 237, 240, 162, 55, 237, 240, 162, 208, 154, 236, 142, + 162, 208, 154, 55, 236, 142, 162, 208, 154, 219, 114, 162, 208, 154, 238, + 230, 164, 162, 208, 154, 218, 248, 162, 31, 107, 162, 31, 109, 162, 31, + 138, 162, 31, 134, 162, 31, 150, 162, 31, 169, 162, 31, 175, 162, 31, 171, 162, 31, 178, 162, 31, 199, 95, 162, 31, 197, 32, 162, 31, 198, 249, - 162, 31, 232, 135, 162, 31, 233, 15, 162, 31, 202, 120, 162, 31, 203, - 241, 162, 31, 234, 153, 162, 31, 213, 169, 162, 31, 91, 228, 140, 162, + 162, 31, 232, 137, 162, 31, 233, 17, 162, 31, 202, 121, 162, 31, 203, + 242, 162, 31, 234, 155, 162, 31, 213, 171, 162, 31, 91, 228, 142, 162, 31, 91, 189, 162, 17, 191, 77, 162, 17, 107, 162, 17, 109, 162, 17, 138, - 162, 17, 134, 162, 17, 149, 162, 17, 169, 162, 17, 175, 162, 17, 171, - 162, 17, 178, 162, 3, 39, 44, 195, 40, 162, 1, 39, 44, 203, 40, 71, 162, - 1, 39, 44, 203, 40, 74, 162, 18, 3, 39, 44, 203, 40, 71, 162, 18, 3, 39, - 44, 203, 40, 74, 162, 1, 39, 44, 219, 73, 162, 31, 222, 196, 222, 99, 3, - 247, 119, 222, 99, 3, 251, 71, 222, 99, 3, 195, 35, 222, 99, 1, 65, 222, - 99, 1, 252, 206, 222, 99, 1, 68, 222, 99, 1, 223, 199, 222, 99, 1, 66, - 222, 99, 1, 196, 30, 222, 99, 1, 71, 222, 99, 1, 251, 236, 222, 99, 1, - 74, 222, 99, 1, 250, 163, 222, 99, 1, 155, 222, 99, 1, 221, 215, 222, 99, - 1, 231, 240, 222, 99, 1, 231, 91, 222, 99, 1, 214, 68, 222, 99, 1, 247, - 160, 222, 99, 1, 247, 1, 222, 99, 1, 223, 32, 222, 99, 1, 222, 252, 222, - 99, 1, 212, 101, 222, 99, 1, 197, 132, 222, 99, 1, 197, 120, 222, 99, 1, - 237, 191, 222, 99, 1, 237, 180, 222, 99, 1, 237, 175, 222, 99, 1, 207, 6, - 222, 99, 1, 213, 79, 222, 99, 1, 190, 190, 222, 99, 1, 199, 49, 222, 99, - 1, 238, 32, 222, 99, 1, 237, 68, 222, 99, 1, 180, 222, 99, 1, 168, 222, - 99, 1, 209, 228, 222, 99, 1, 249, 153, 222, 99, 1, 248, 203, 222, 99, 1, - 174, 222, 99, 1, 170, 222, 99, 1, 165, 222, 99, 1, 173, 222, 99, 1, 195, - 188, 222, 99, 1, 203, 165, 222, 99, 1, 201, 175, 222, 99, 1, 188, 222, - 99, 1, 140, 222, 99, 18, 3, 252, 206, 222, 99, 18, 3, 68, 222, 99, 18, 3, - 223, 199, 222, 99, 18, 3, 66, 222, 99, 18, 3, 196, 30, 222, 99, 18, 3, - 71, 222, 99, 18, 3, 251, 236, 222, 99, 18, 3, 74, 222, 99, 18, 3, 250, - 163, 222, 99, 3, 195, 40, 222, 99, 3, 212, 141, 222, 99, 252, 68, 56, - 222, 99, 234, 69, 56, 222, 99, 31, 56, 222, 99, 205, 54, 77, 222, 99, 55, - 205, 54, 77, 222, 99, 237, 238, 222, 99, 55, 237, 238, 222, 99, 18, 3, - 117, 146, 222, 99, 31, 3, 58, 202, 12, 202, 20, 1, 205, 182, 202, 12, - 202, 20, 1, 199, 219, 202, 12, 202, 20, 1, 249, 123, 202, 12, 202, 20, 1, - 247, 149, 202, 12, 202, 20, 1, 238, 12, 202, 12, 202, 20, 1, 231, 225, - 202, 12, 202, 20, 1, 217, 120, 202, 12, 202, 20, 1, 214, 65, 202, 12, - 202, 20, 1, 220, 99, 202, 12, 202, 20, 1, 214, 237, 202, 12, 202, 20, 1, - 195, 184, 202, 12, 202, 20, 1, 210, 200, 202, 12, 202, 20, 1, 192, 121, - 202, 12, 202, 20, 1, 207, 160, 202, 12, 202, 20, 1, 230, 81, 202, 12, - 202, 20, 1, 222, 104, 202, 12, 202, 20, 1, 223, 26, 202, 12, 202, 20, 1, - 212, 98, 202, 12, 202, 20, 1, 251, 245, 202, 12, 202, 20, 1, 234, 186, - 202, 12, 202, 20, 1, 223, 200, 202, 12, 202, 20, 1, 196, 141, 202, 12, - 202, 20, 1, 211, 136, 202, 12, 202, 20, 1, 234, 173, 202, 12, 202, 20, 1, - 217, 136, 202, 12, 202, 20, 17, 191, 77, 202, 12, 202, 20, 17, 107, 202, - 12, 202, 20, 17, 109, 202, 12, 202, 20, 17, 138, 202, 12, 202, 20, 17, - 134, 202, 12, 202, 20, 17, 149, 202, 12, 202, 20, 17, 169, 202, 12, 202, - 20, 17, 175, 202, 12, 202, 20, 17, 171, 202, 12, 202, 20, 17, 178, 246, - 251, 3, 247, 119, 246, 251, 3, 251, 71, 246, 251, 3, 195, 35, 246, 251, - 1, 252, 206, 246, 251, 1, 68, 246, 251, 1, 66, 246, 251, 1, 71, 246, 251, - 1, 222, 127, 246, 251, 1, 221, 214, 246, 251, 1, 231, 237, 246, 251, 1, - 231, 90, 246, 251, 1, 214, 67, 246, 251, 1, 247, 159, 246, 251, 1, 247, - 0, 246, 251, 1, 223, 31, 246, 251, 1, 222, 251, 246, 251, 1, 212, 100, - 246, 251, 1, 197, 131, 246, 251, 1, 197, 119, 246, 251, 1, 237, 190, 246, - 251, 1, 237, 174, 246, 251, 1, 213, 78, 246, 251, 1, 199, 245, 246, 251, - 1, 199, 48, 246, 251, 1, 238, 31, 246, 251, 1, 237, 67, 246, 251, 1, 214, - 250, 246, 251, 1, 210, 220, 246, 251, 1, 209, 227, 246, 251, 1, 249, 151, - 246, 251, 1, 248, 202, 246, 251, 1, 217, 151, 246, 251, 1, 191, 174, 246, - 251, 1, 192, 140, 246, 251, 1, 207, 178, 246, 251, 1, 220, 125, 246, 251, - 1, 193, 181, 246, 251, 1, 205, 197, 246, 251, 1, 230, 91, 246, 251, 18, - 3, 65, 246, 251, 18, 3, 68, 246, 251, 18, 3, 223, 199, 246, 251, 18, 3, - 66, 246, 251, 18, 3, 196, 30, 246, 251, 18, 3, 71, 246, 251, 18, 3, 251, - 236, 246, 251, 18, 3, 74, 246, 251, 18, 3, 250, 163, 246, 251, 18, 3, - 211, 133, 246, 251, 187, 77, 246, 251, 250, 164, 77, 246, 251, 195, 40, - 246, 251, 217, 149, 246, 251, 17, 191, 77, 246, 251, 17, 107, 246, 251, - 17, 109, 246, 251, 17, 138, 246, 251, 17, 134, 246, 251, 17, 149, 246, - 251, 17, 169, 246, 251, 17, 175, 246, 251, 17, 171, 246, 251, 17, 178, - 246, 251, 205, 54, 77, 246, 251, 237, 238, 246, 251, 55, 237, 238, 246, - 251, 208, 13, 77, 246, 251, 1, 219, 158, 246, 251, 18, 3, 252, 206, 246, - 251, 18, 3, 234, 166, 246, 251, 1, 195, 187, 217, 118, 1, 65, 217, 118, - 1, 68, 217, 118, 1, 66, 217, 118, 1, 71, 217, 118, 1, 74, 217, 118, 1, - 155, 217, 118, 1, 221, 215, 217, 118, 1, 231, 240, 217, 118, 1, 231, 91, - 217, 118, 1, 247, 160, 217, 118, 1, 247, 1, 217, 118, 1, 223, 32, 217, - 118, 1, 222, 252, 217, 118, 1, 212, 101, 217, 118, 1, 197, 132, 217, 118, - 1, 197, 120, 217, 118, 1, 237, 191, 217, 118, 1, 237, 175, 217, 118, 1, - 213, 79, 217, 118, 1, 190, 190, 217, 118, 1, 199, 49, 217, 118, 1, 238, - 32, 217, 118, 1, 237, 68, 217, 118, 1, 180, 217, 118, 1, 168, 217, 118, - 1, 209, 228, 217, 118, 1, 249, 153, 217, 118, 1, 248, 203, 217, 118, 1, - 174, 217, 118, 1, 165, 217, 118, 1, 173, 217, 118, 1, 195, 188, 217, 118, - 1, 188, 217, 118, 1, 140, 217, 118, 1, 206, 109, 217, 118, 3, 212, 141, - 217, 118, 252, 68, 56, 217, 118, 205, 54, 77, 217, 118, 34, 203, 15, 203, - 129, 3, 247, 119, 203, 129, 3, 251, 71, 203, 129, 3, 195, 35, 203, 129, - 1, 65, 203, 129, 1, 252, 206, 203, 129, 1, 68, 203, 129, 1, 223, 199, - 203, 129, 1, 66, 203, 129, 1, 196, 30, 203, 129, 1, 117, 146, 203, 129, - 1, 117, 206, 110, 203, 129, 1, 117, 172, 203, 129, 1, 117, 219, 74, 203, - 129, 1, 71, 203, 129, 1, 251, 236, 203, 129, 1, 74, 203, 129, 1, 250, - 163, 203, 129, 1, 155, 203, 129, 1, 221, 215, 203, 129, 1, 231, 240, 203, - 129, 1, 231, 91, 203, 129, 1, 214, 68, 203, 129, 1, 247, 160, 203, 129, - 1, 247, 1, 203, 129, 1, 223, 32, 203, 129, 1, 222, 252, 203, 129, 1, 212, - 101, 203, 129, 1, 197, 132, 203, 129, 1, 197, 120, 203, 129, 1, 237, 191, - 203, 129, 1, 237, 175, 203, 129, 1, 213, 79, 203, 129, 1, 190, 190, 203, - 129, 1, 199, 49, 203, 129, 1, 238, 32, 203, 129, 1, 237, 68, 203, 129, 1, - 180, 203, 129, 1, 168, 203, 129, 1, 209, 228, 203, 129, 1, 249, 153, 203, - 129, 1, 248, 203, 203, 129, 1, 174, 203, 129, 1, 170, 203, 129, 1, 165, - 203, 129, 1, 173, 203, 129, 1, 219, 73, 203, 129, 1, 195, 188, 203, 129, - 1, 203, 165, 203, 129, 1, 201, 175, 203, 129, 1, 188, 203, 129, 1, 140, - 203, 129, 18, 3, 252, 206, 203, 129, 18, 3, 68, 203, 129, 18, 3, 223, - 199, 203, 129, 18, 3, 66, 203, 129, 18, 3, 196, 30, 203, 129, 18, 3, 117, - 146, 203, 129, 18, 3, 117, 206, 110, 203, 129, 18, 3, 117, 172, 203, 129, - 18, 3, 117, 219, 74, 203, 129, 18, 3, 71, 203, 129, 18, 3, 251, 236, 203, - 129, 18, 3, 74, 203, 129, 18, 3, 250, 163, 203, 129, 3, 195, 40, 203, - 129, 3, 250, 145, 203, 129, 3, 222, 237, 203, 129, 3, 196, 75, 203, 129, - 211, 113, 203, 129, 237, 238, 203, 129, 55, 237, 238, 203, 129, 252, 68, - 56, 203, 129, 204, 10, 203, 129, 205, 138, 77, 203, 129, 3, 212, 141, - 203, 129, 18, 52, 77, 203, 129, 233, 201, 203, 40, 18, 77, 203, 129, 200, - 162, 77, 203, 129, 18, 3, 208, 207, 71, 203, 129, 3, 223, 93, 247, 119, - 203, 129, 17, 191, 77, 203, 129, 17, 107, 203, 129, 17, 109, 203, 129, - 17, 138, 203, 129, 17, 134, 203, 129, 17, 149, 203, 129, 17, 169, 203, - 129, 17, 175, 203, 129, 17, 171, 203, 129, 17, 178, 203, 129, 234, 146, - 203, 129, 3, 202, 210, 203, 129, 229, 227, 203, 129, 239, 29, 56, 203, - 129, 205, 54, 217, 55, 203, 129, 205, 54, 217, 54, 166, 251, 14, 17, 107, - 166, 251, 14, 17, 109, 166, 251, 14, 17, 138, 166, 251, 14, 17, 134, 166, - 251, 14, 17, 149, 166, 251, 14, 17, 169, 166, 251, 14, 17, 175, 166, 251, - 14, 17, 171, 166, 251, 14, 17, 178, 166, 251, 14, 31, 199, 95, 166, 251, - 14, 31, 197, 32, 166, 251, 14, 31, 198, 249, 166, 251, 14, 31, 232, 135, - 166, 251, 14, 31, 233, 15, 166, 251, 14, 31, 202, 120, 166, 251, 14, 31, - 203, 241, 166, 251, 14, 31, 234, 153, 166, 251, 14, 31, 213, 169, 166, - 251, 14, 31, 91, 228, 140, 166, 251, 14, 31, 91, 189, 221, 182, 1, 65, - 221, 182, 1, 252, 206, 221, 182, 1, 68, 221, 182, 1, 66, 221, 182, 1, 71, - 221, 182, 1, 251, 236, 221, 182, 1, 74, 221, 182, 1, 250, 163, 221, 182, - 1, 155, 221, 182, 1, 221, 215, 221, 182, 1, 231, 240, 221, 182, 1, 231, - 127, 221, 182, 1, 231, 91, 221, 182, 1, 214, 68, 221, 182, 1, 247, 160, - 221, 182, 1, 247, 1, 221, 182, 1, 223, 32, 221, 182, 1, 222, 230, 221, - 182, 1, 212, 101, 221, 182, 1, 197, 132, 221, 182, 1, 197, 120, 221, 182, - 1, 237, 191, 221, 182, 1, 237, 175, 221, 182, 1, 213, 79, 221, 182, 1, - 190, 190, 221, 182, 1, 199, 49, 221, 182, 1, 238, 32, 221, 182, 1, 237, - 181, 221, 182, 1, 237, 68, 221, 182, 1, 180, 221, 182, 1, 168, 221, 182, - 1, 209, 228, 221, 182, 1, 249, 153, 221, 182, 1, 249, 53, 221, 182, 1, - 248, 203, 221, 182, 1, 174, 221, 182, 1, 170, 221, 182, 1, 165, 221, 182, - 1, 173, 221, 182, 1, 195, 188, 221, 182, 1, 188, 221, 182, 1, 140, 221, - 182, 1, 219, 73, 221, 182, 18, 3, 252, 206, 221, 182, 18, 3, 68, 221, - 182, 18, 3, 223, 199, 221, 182, 18, 3, 66, 221, 182, 18, 3, 71, 221, 182, - 18, 3, 251, 236, 221, 182, 18, 3, 74, 221, 182, 18, 3, 250, 163, 221, - 182, 3, 251, 71, 221, 182, 3, 195, 40, 221, 182, 3, 212, 141, 221, 182, - 3, 203, 155, 221, 182, 237, 238, 221, 182, 55, 237, 238, 221, 182, 193, - 23, 204, 10, 221, 182, 205, 54, 77, 221, 182, 55, 205, 54, 77, 221, 182, - 252, 68, 56, 221, 182, 3, 200, 206, 221, 182, 1, 208, 96, 221, 182, 1, - 203, 40, 68, 221, 182, 18, 3, 117, 146, 215, 133, 1, 65, 215, 133, 1, 68, - 215, 133, 1, 66, 215, 133, 1, 71, 215, 133, 1, 155, 215, 133, 1, 221, - 215, 215, 133, 1, 231, 240, 215, 133, 1, 231, 91, 215, 133, 1, 247, 160, - 215, 133, 1, 247, 1, 215, 133, 1, 223, 32, 215, 133, 1, 222, 230, 215, - 133, 1, 212, 101, 215, 133, 1, 197, 132, 215, 133, 1, 197, 120, 215, 133, - 1, 237, 191, 215, 133, 1, 237, 181, 215, 133, 1, 237, 175, 215, 133, 1, - 213, 79, 215, 133, 1, 190, 190, 215, 133, 1, 199, 49, 215, 133, 1, 238, - 32, 215, 133, 1, 237, 68, 215, 133, 1, 180, 215, 133, 1, 168, 215, 133, - 1, 209, 228, 215, 133, 1, 249, 153, 215, 133, 1, 248, 203, 215, 133, 1, - 174, 215, 133, 1, 170, 215, 133, 1, 165, 215, 133, 1, 173, 215, 133, 1, - 195, 188, 215, 133, 1, 188, 215, 133, 1, 140, 215, 133, 1, 206, 109, 215, - 133, 1, 207, 6, 215, 133, 205, 54, 77, 221, 172, 1, 65, 221, 172, 1, 252, - 206, 221, 172, 1, 68, 221, 172, 1, 223, 199, 221, 172, 1, 66, 221, 172, - 1, 196, 30, 221, 172, 1, 71, 221, 172, 1, 251, 236, 221, 172, 1, 74, 221, - 172, 1, 250, 163, 221, 172, 1, 155, 221, 172, 1, 221, 215, 221, 172, 1, - 231, 240, 221, 172, 1, 231, 127, 221, 172, 1, 231, 91, 221, 172, 1, 214, - 68, 221, 172, 1, 247, 160, 221, 172, 1, 247, 1, 221, 172, 1, 223, 32, - 221, 172, 1, 222, 230, 221, 172, 1, 222, 252, 221, 172, 1, 212, 101, 221, - 172, 1, 197, 132, 221, 172, 1, 197, 120, 221, 172, 1, 237, 191, 221, 172, - 1, 237, 181, 221, 172, 1, 206, 109, 221, 172, 1, 237, 175, 221, 172, 1, - 213, 79, 221, 172, 1, 190, 190, 221, 172, 1, 199, 49, 221, 172, 1, 238, - 32, 221, 172, 1, 237, 68, 221, 172, 1, 180, 221, 172, 1, 168, 221, 172, - 1, 209, 228, 221, 172, 1, 249, 153, 221, 172, 1, 249, 53, 221, 172, 1, - 248, 203, 221, 172, 1, 174, 221, 172, 1, 170, 221, 172, 1, 165, 221, 172, - 1, 173, 221, 172, 1, 195, 188, 221, 172, 1, 203, 165, 221, 172, 1, 188, - 221, 172, 1, 140, 221, 172, 3, 251, 71, 221, 172, 18, 3, 252, 206, 221, - 172, 18, 3, 68, 221, 172, 18, 3, 223, 199, 221, 172, 18, 3, 66, 221, 172, - 18, 3, 196, 30, 221, 172, 18, 3, 71, 221, 172, 18, 3, 251, 236, 221, 172, - 18, 3, 74, 221, 172, 18, 3, 250, 163, 221, 172, 3, 212, 141, 221, 172, 3, - 195, 40, 221, 172, 17, 191, 77, 221, 172, 17, 107, 221, 172, 17, 109, - 221, 172, 17, 138, 221, 172, 17, 134, 221, 172, 17, 149, 221, 172, 17, - 169, 221, 172, 17, 175, 221, 172, 17, 171, 221, 172, 17, 178, 230, 219, - 3, 33, 251, 72, 58, 230, 219, 3, 247, 119, 230, 219, 3, 251, 71, 230, - 219, 3, 195, 35, 230, 219, 1, 65, 230, 219, 1, 252, 206, 230, 219, 1, 68, - 230, 219, 1, 223, 199, 230, 219, 1, 66, 230, 219, 1, 196, 30, 230, 219, - 1, 117, 146, 230, 219, 1, 117, 172, 230, 219, 1, 234, 188, 230, 219, 1, - 251, 236, 230, 219, 1, 211, 87, 230, 219, 1, 250, 163, 230, 219, 1, 155, - 230, 219, 1, 221, 215, 230, 219, 1, 231, 240, 230, 219, 1, 231, 91, 230, - 219, 1, 214, 68, 230, 219, 1, 247, 160, 230, 219, 1, 247, 1, 230, 219, 1, - 223, 32, 230, 219, 1, 222, 252, 230, 219, 1, 212, 101, 230, 219, 1, 197, - 132, 230, 219, 1, 197, 120, 230, 219, 1, 237, 191, 230, 219, 1, 237, 175, - 230, 219, 1, 213, 79, 230, 219, 1, 190, 190, 230, 219, 1, 199, 49, 230, - 219, 1, 238, 32, 230, 219, 1, 237, 68, 230, 219, 1, 180, 230, 219, 1, - 168, 230, 219, 1, 209, 228, 230, 219, 1, 249, 153, 230, 219, 1, 248, 203, - 230, 219, 1, 174, 230, 219, 1, 170, 230, 219, 1, 165, 230, 219, 1, 173, - 230, 219, 1, 219, 73, 230, 219, 1, 195, 188, 230, 219, 1, 203, 165, 230, - 219, 1, 201, 175, 230, 219, 1, 188, 230, 219, 1, 140, 33, 248, 165, 60, - 230, 219, 3, 212, 141, 230, 219, 3, 250, 145, 230, 219, 18, 3, 252, 206, - 230, 219, 18, 3, 68, 230, 219, 18, 3, 223, 199, 230, 219, 18, 3, 66, 230, - 219, 18, 3, 196, 30, 230, 219, 18, 3, 117, 146, 230, 219, 18, 3, 117, - 206, 110, 230, 219, 18, 3, 234, 188, 230, 219, 18, 3, 251, 236, 230, 219, - 18, 3, 211, 87, 230, 219, 18, 3, 250, 163, 230, 219, 3, 195, 40, 230, - 219, 211, 113, 230, 219, 250, 164, 219, 198, 77, 230, 219, 3, 209, 79, - 230, 219, 1, 195, 150, 251, 71, 230, 219, 1, 195, 150, 55, 251, 71, 230, - 219, 1, 117, 206, 110, 230, 219, 1, 117, 219, 74, 230, 219, 18, 3, 117, - 172, 230, 219, 18, 3, 117, 219, 74, 33, 230, 219, 17, 191, 77, 33, 230, - 219, 17, 107, 33, 230, 219, 17, 109, 33, 230, 219, 17, 138, 33, 230, 219, - 17, 134, 33, 230, 219, 17, 149, 33, 230, 219, 17, 169, 33, 230, 219, 1, - 65, 33, 230, 219, 1, 155, 33, 230, 219, 1, 180, 33, 230, 219, 1, 195, 69, - 33, 230, 219, 1, 168, 214, 78, 1, 65, 214, 78, 1, 252, 206, 214, 78, 1, - 68, 214, 78, 1, 223, 199, 214, 78, 1, 66, 214, 78, 1, 196, 30, 214, 78, - 1, 117, 146, 214, 78, 1, 117, 206, 110, 214, 78, 1, 117, 172, 214, 78, 1, - 117, 219, 74, 214, 78, 1, 71, 214, 78, 1, 251, 236, 214, 78, 1, 74, 214, - 78, 1, 250, 163, 214, 78, 1, 155, 214, 78, 1, 221, 215, 214, 78, 1, 231, - 240, 214, 78, 1, 231, 91, 214, 78, 1, 214, 68, 214, 78, 1, 214, 17, 214, - 78, 1, 247, 160, 214, 78, 1, 247, 1, 214, 78, 1, 223, 32, 214, 78, 1, - 222, 252, 214, 78, 1, 212, 101, 214, 78, 1, 212, 83, 214, 78, 1, 197, - 132, 214, 78, 1, 197, 120, 214, 78, 1, 237, 191, 214, 78, 1, 237, 175, - 214, 78, 1, 213, 79, 214, 78, 1, 190, 190, 214, 78, 1, 199, 49, 214, 78, - 1, 238, 32, 214, 78, 1, 237, 68, 214, 78, 1, 180, 214, 78, 1, 213, 224, - 214, 78, 1, 168, 214, 78, 1, 209, 228, 214, 78, 1, 249, 153, 214, 78, 1, - 248, 203, 214, 78, 1, 174, 214, 78, 1, 216, 103, 214, 78, 1, 170, 214, - 78, 1, 165, 214, 78, 1, 207, 6, 214, 78, 1, 173, 214, 78, 1, 219, 159, - 214, 78, 1, 193, 190, 214, 78, 1, 203, 165, 214, 78, 1, 201, 175, 214, - 78, 1, 188, 214, 78, 1, 140, 214, 78, 18, 3, 252, 206, 214, 78, 18, 3, - 68, 214, 78, 18, 3, 223, 199, 214, 78, 18, 3, 66, 214, 78, 18, 3, 196, - 30, 214, 78, 18, 3, 117, 146, 214, 78, 18, 3, 117, 206, 110, 214, 78, 18, - 3, 117, 172, 214, 78, 18, 3, 117, 219, 74, 214, 78, 18, 3, 71, 214, 78, - 18, 3, 251, 236, 214, 78, 18, 3, 74, 214, 78, 18, 3, 250, 163, 214, 78, - 3, 195, 40, 214, 78, 3, 247, 119, 214, 78, 3, 251, 71, 214, 78, 3, 195, - 35, 214, 78, 3, 212, 141, 214, 78, 3, 250, 145, 214, 78, 3, 53, 251, 71, - 214, 78, 211, 113, 214, 78, 202, 209, 214, 78, 237, 238, 214, 78, 55, - 237, 238, 214, 78, 242, 74, 214, 78, 231, 204, 233, 3, 214, 78, 252, 68, - 56, 214, 78, 17, 191, 77, 214, 78, 17, 107, 214, 78, 17, 109, 214, 78, - 17, 138, 214, 78, 17, 134, 214, 78, 17, 149, 214, 78, 17, 169, 214, 78, - 17, 175, 214, 78, 17, 171, 214, 78, 17, 178, 214, 78, 55, 242, 74, 214, - 78, 209, 107, 77, 214, 78, 223, 119, 56, 214, 78, 205, 138, 77, 214, 78, - 1, 195, 150, 251, 71, 214, 78, 3, 222, 237, 214, 78, 3, 196, 75, 198, - 129, 251, 100, 198, 129, 1, 65, 198, 129, 1, 252, 206, 198, 129, 1, 68, - 198, 129, 1, 223, 199, 198, 129, 1, 66, 198, 129, 1, 196, 30, 198, 129, - 1, 117, 146, 198, 129, 1, 117, 206, 110, 198, 129, 1, 117, 172, 198, 129, - 1, 117, 219, 74, 198, 129, 1, 71, 198, 129, 1, 251, 236, 198, 129, 1, 74, - 198, 129, 1, 250, 163, 198, 129, 1, 155, 198, 129, 1, 221, 215, 198, 129, - 1, 231, 240, 198, 129, 1, 231, 91, 198, 129, 1, 214, 68, 198, 129, 1, - 247, 160, 198, 129, 1, 247, 1, 198, 129, 1, 223, 32, 198, 129, 1, 222, - 252, 198, 129, 1, 212, 101, 198, 129, 1, 197, 132, 198, 129, 1, 197, 120, - 198, 129, 1, 237, 191, 198, 129, 1, 237, 175, 198, 129, 1, 213, 79, 198, - 129, 1, 190, 190, 198, 129, 1, 199, 49, 198, 129, 1, 238, 32, 198, 129, - 1, 237, 68, 198, 129, 1, 180, 198, 129, 1, 168, 198, 129, 1, 209, 228, - 198, 129, 1, 249, 153, 198, 129, 1, 248, 203, 198, 129, 1, 174, 198, 129, + 162, 17, 134, 162, 17, 150, 162, 17, 169, 162, 17, 175, 162, 17, 171, + 162, 17, 178, 162, 3, 39, 44, 195, 40, 162, 1, 39, 44, 203, 41, 71, 162, + 1, 39, 44, 203, 41, 74, 162, 18, 3, 39, 44, 203, 41, 71, 162, 18, 3, 39, + 44, 203, 41, 74, 162, 1, 39, 44, 219, 75, 162, 31, 222, 198, 222, 101, 3, + 247, 121, 222, 101, 3, 251, 73, 222, 101, 3, 195, 35, 222, 101, 1, 65, + 222, 101, 1, 252, 208, 222, 101, 1, 68, 222, 101, 1, 223, 201, 222, 101, + 1, 66, 222, 101, 1, 196, 30, 222, 101, 1, 71, 222, 101, 1, 251, 238, 222, + 101, 1, 74, 222, 101, 1, 250, 165, 222, 101, 1, 155, 222, 101, 1, 221, + 217, 222, 101, 1, 231, 242, 222, 101, 1, 231, 93, 222, 101, 1, 214, 70, + 222, 101, 1, 247, 162, 222, 101, 1, 247, 3, 222, 101, 1, 223, 34, 222, + 101, 1, 222, 254, 222, 101, 1, 212, 103, 222, 101, 1, 197, 132, 222, 101, + 1, 197, 120, 222, 101, 1, 237, 193, 222, 101, 1, 237, 182, 222, 101, 1, + 237, 177, 222, 101, 1, 207, 7, 222, 101, 1, 213, 81, 222, 101, 1, 190, + 190, 222, 101, 1, 199, 49, 222, 101, 1, 238, 34, 222, 101, 1, 237, 70, + 222, 101, 1, 181, 222, 101, 1, 168, 222, 101, 1, 209, 230, 222, 101, 1, + 249, 155, 222, 101, 1, 248, 205, 222, 101, 1, 174, 222, 101, 1, 170, 222, + 101, 1, 165, 222, 101, 1, 173, 222, 101, 1, 195, 188, 222, 101, 1, 203, + 166, 222, 101, 1, 201, 176, 222, 101, 1, 188, 222, 101, 1, 140, 222, 101, + 18, 3, 252, 208, 222, 101, 18, 3, 68, 222, 101, 18, 3, 223, 201, 222, + 101, 18, 3, 66, 222, 101, 18, 3, 196, 30, 222, 101, 18, 3, 71, 222, 101, + 18, 3, 251, 238, 222, 101, 18, 3, 74, 222, 101, 18, 3, 250, 165, 222, + 101, 3, 195, 40, 222, 101, 3, 212, 143, 222, 101, 252, 70, 56, 222, 101, + 234, 71, 56, 222, 101, 31, 56, 222, 101, 205, 55, 77, 222, 101, 55, 205, + 55, 77, 222, 101, 237, 240, 222, 101, 55, 237, 240, 222, 101, 18, 3, 117, + 146, 222, 101, 31, 3, 58, 202, 13, 202, 21, 1, 205, 183, 202, 13, 202, + 21, 1, 199, 219, 202, 13, 202, 21, 1, 249, 125, 202, 13, 202, 21, 1, 247, + 151, 202, 13, 202, 21, 1, 238, 14, 202, 13, 202, 21, 1, 231, 227, 202, + 13, 202, 21, 1, 217, 122, 202, 13, 202, 21, 1, 214, 67, 202, 13, 202, 21, + 1, 220, 101, 202, 13, 202, 21, 1, 214, 239, 202, 13, 202, 21, 1, 195, + 184, 202, 13, 202, 21, 1, 210, 202, 202, 13, 202, 21, 1, 192, 121, 202, + 13, 202, 21, 1, 207, 162, 202, 13, 202, 21, 1, 230, 83, 202, 13, 202, 21, + 1, 222, 106, 202, 13, 202, 21, 1, 223, 28, 202, 13, 202, 21, 1, 212, 100, + 202, 13, 202, 21, 1, 251, 247, 202, 13, 202, 21, 1, 234, 188, 202, 13, + 202, 21, 1, 223, 202, 202, 13, 202, 21, 1, 196, 141, 202, 13, 202, 21, 1, + 211, 138, 202, 13, 202, 21, 1, 234, 175, 202, 13, 202, 21, 1, 217, 138, + 202, 13, 202, 21, 17, 191, 77, 202, 13, 202, 21, 17, 107, 202, 13, 202, + 21, 17, 109, 202, 13, 202, 21, 17, 138, 202, 13, 202, 21, 17, 134, 202, + 13, 202, 21, 17, 150, 202, 13, 202, 21, 17, 169, 202, 13, 202, 21, 17, + 175, 202, 13, 202, 21, 17, 171, 202, 13, 202, 21, 17, 178, 246, 253, 3, + 247, 121, 246, 253, 3, 251, 73, 246, 253, 3, 195, 35, 246, 253, 1, 252, + 208, 246, 253, 1, 68, 246, 253, 1, 66, 246, 253, 1, 71, 246, 253, 1, 222, + 129, 246, 253, 1, 221, 216, 246, 253, 1, 231, 239, 246, 253, 1, 231, 92, + 246, 253, 1, 214, 69, 246, 253, 1, 247, 161, 246, 253, 1, 247, 2, 246, + 253, 1, 223, 33, 246, 253, 1, 222, 253, 246, 253, 1, 212, 102, 246, 253, + 1, 197, 131, 246, 253, 1, 197, 119, 246, 253, 1, 237, 192, 246, 253, 1, + 237, 176, 246, 253, 1, 213, 80, 246, 253, 1, 199, 245, 246, 253, 1, 199, + 48, 246, 253, 1, 238, 33, 246, 253, 1, 237, 69, 246, 253, 1, 214, 252, + 246, 253, 1, 210, 222, 246, 253, 1, 209, 229, 246, 253, 1, 249, 153, 246, + 253, 1, 248, 204, 246, 253, 1, 217, 153, 246, 253, 1, 191, 174, 246, 253, + 1, 192, 140, 246, 253, 1, 207, 180, 246, 253, 1, 220, 127, 246, 253, 1, + 193, 181, 246, 253, 1, 205, 198, 246, 253, 1, 230, 93, 246, 253, 18, 3, + 65, 246, 253, 18, 3, 68, 246, 253, 18, 3, 223, 201, 246, 253, 18, 3, 66, + 246, 253, 18, 3, 196, 30, 246, 253, 18, 3, 71, 246, 253, 18, 3, 251, 238, + 246, 253, 18, 3, 74, 246, 253, 18, 3, 250, 165, 246, 253, 18, 3, 211, + 135, 246, 253, 187, 77, 246, 253, 250, 166, 77, 246, 253, 195, 40, 246, + 253, 217, 151, 246, 253, 17, 191, 77, 246, 253, 17, 107, 246, 253, 17, + 109, 246, 253, 17, 138, 246, 253, 17, 134, 246, 253, 17, 150, 246, 253, + 17, 169, 246, 253, 17, 175, 246, 253, 17, 171, 246, 253, 17, 178, 246, + 253, 205, 55, 77, 246, 253, 237, 240, 246, 253, 55, 237, 240, 246, 253, + 208, 15, 77, 246, 253, 1, 219, 160, 246, 253, 18, 3, 252, 208, 246, 253, + 18, 3, 234, 168, 246, 253, 1, 195, 187, 217, 120, 1, 65, 217, 120, 1, 68, + 217, 120, 1, 66, 217, 120, 1, 71, 217, 120, 1, 74, 217, 120, 1, 155, 217, + 120, 1, 221, 217, 217, 120, 1, 231, 242, 217, 120, 1, 231, 93, 217, 120, + 1, 247, 162, 217, 120, 1, 247, 3, 217, 120, 1, 223, 34, 217, 120, 1, 222, + 254, 217, 120, 1, 212, 103, 217, 120, 1, 197, 132, 217, 120, 1, 197, 120, + 217, 120, 1, 237, 193, 217, 120, 1, 237, 177, 217, 120, 1, 213, 81, 217, + 120, 1, 190, 190, 217, 120, 1, 199, 49, 217, 120, 1, 238, 34, 217, 120, + 1, 237, 70, 217, 120, 1, 181, 217, 120, 1, 168, 217, 120, 1, 209, 230, + 217, 120, 1, 249, 155, 217, 120, 1, 248, 205, 217, 120, 1, 174, 217, 120, + 1, 165, 217, 120, 1, 173, 217, 120, 1, 195, 188, 217, 120, 1, 188, 217, + 120, 1, 140, 217, 120, 1, 206, 110, 217, 120, 3, 212, 143, 217, 120, 252, + 70, 56, 217, 120, 205, 55, 77, 217, 120, 34, 203, 16, 203, 130, 3, 247, + 121, 203, 130, 3, 251, 73, 203, 130, 3, 195, 35, 203, 130, 1, 65, 203, + 130, 1, 252, 208, 203, 130, 1, 68, 203, 130, 1, 223, 201, 203, 130, 1, + 66, 203, 130, 1, 196, 30, 203, 130, 1, 117, 146, 203, 130, 1, 117, 206, + 111, 203, 130, 1, 117, 172, 203, 130, 1, 117, 219, 76, 203, 130, 1, 71, + 203, 130, 1, 251, 238, 203, 130, 1, 74, 203, 130, 1, 250, 165, 203, 130, + 1, 155, 203, 130, 1, 221, 217, 203, 130, 1, 231, 242, 203, 130, 1, 231, + 93, 203, 130, 1, 214, 70, 203, 130, 1, 247, 162, 203, 130, 1, 247, 3, + 203, 130, 1, 223, 34, 203, 130, 1, 222, 254, 203, 130, 1, 212, 103, 203, + 130, 1, 197, 132, 203, 130, 1, 197, 120, 203, 130, 1, 237, 193, 203, 130, + 1, 237, 177, 203, 130, 1, 213, 81, 203, 130, 1, 190, 190, 203, 130, 1, + 199, 49, 203, 130, 1, 238, 34, 203, 130, 1, 237, 70, 203, 130, 1, 181, + 203, 130, 1, 168, 203, 130, 1, 209, 230, 203, 130, 1, 249, 155, 203, 130, + 1, 248, 205, 203, 130, 1, 174, 203, 130, 1, 170, 203, 130, 1, 165, 203, + 130, 1, 173, 203, 130, 1, 219, 75, 203, 130, 1, 195, 188, 203, 130, 1, + 203, 166, 203, 130, 1, 201, 176, 203, 130, 1, 188, 203, 130, 1, 140, 203, + 130, 18, 3, 252, 208, 203, 130, 18, 3, 68, 203, 130, 18, 3, 223, 201, + 203, 130, 18, 3, 66, 203, 130, 18, 3, 196, 30, 203, 130, 18, 3, 117, 146, + 203, 130, 18, 3, 117, 206, 111, 203, 130, 18, 3, 117, 172, 203, 130, 18, + 3, 117, 219, 76, 203, 130, 18, 3, 71, 203, 130, 18, 3, 251, 238, 203, + 130, 18, 3, 74, 203, 130, 18, 3, 250, 165, 203, 130, 3, 195, 40, 203, + 130, 3, 250, 147, 203, 130, 3, 222, 239, 203, 130, 3, 196, 75, 203, 130, + 211, 115, 203, 130, 237, 240, 203, 130, 55, 237, 240, 203, 130, 252, 70, + 56, 203, 130, 204, 11, 203, 130, 205, 139, 77, 203, 130, 3, 212, 143, + 203, 130, 18, 52, 77, 203, 130, 233, 203, 203, 41, 18, 77, 203, 130, 200, + 162, 77, 203, 130, 18, 3, 208, 209, 71, 203, 130, 3, 223, 95, 247, 121, + 203, 130, 17, 191, 77, 203, 130, 17, 107, 203, 130, 17, 109, 203, 130, + 17, 138, 203, 130, 17, 134, 203, 130, 17, 150, 203, 130, 17, 169, 203, + 130, 17, 175, 203, 130, 17, 171, 203, 130, 17, 178, 203, 130, 234, 148, + 203, 130, 3, 202, 211, 203, 130, 229, 229, 203, 130, 239, 31, 56, 203, + 130, 205, 55, 217, 57, 203, 130, 205, 55, 217, 56, 166, 251, 16, 17, 107, + 166, 251, 16, 17, 109, 166, 251, 16, 17, 138, 166, 251, 16, 17, 134, 166, + 251, 16, 17, 150, 166, 251, 16, 17, 169, 166, 251, 16, 17, 175, 166, 251, + 16, 17, 171, 166, 251, 16, 17, 178, 166, 251, 16, 31, 199, 95, 166, 251, + 16, 31, 197, 32, 166, 251, 16, 31, 198, 249, 166, 251, 16, 31, 232, 137, + 166, 251, 16, 31, 233, 17, 166, 251, 16, 31, 202, 121, 166, 251, 16, 31, + 203, 242, 166, 251, 16, 31, 234, 155, 166, 251, 16, 31, 213, 171, 166, + 251, 16, 31, 91, 228, 142, 166, 251, 16, 31, 91, 189, 221, 184, 1, 65, + 221, 184, 1, 252, 208, 221, 184, 1, 68, 221, 184, 1, 66, 221, 184, 1, 71, + 221, 184, 1, 251, 238, 221, 184, 1, 74, 221, 184, 1, 250, 165, 221, 184, + 1, 155, 221, 184, 1, 221, 217, 221, 184, 1, 231, 242, 221, 184, 1, 231, + 129, 221, 184, 1, 231, 93, 221, 184, 1, 214, 70, 221, 184, 1, 247, 162, + 221, 184, 1, 247, 3, 221, 184, 1, 223, 34, 221, 184, 1, 222, 232, 221, + 184, 1, 212, 103, 221, 184, 1, 197, 132, 221, 184, 1, 197, 120, 221, 184, + 1, 237, 193, 221, 184, 1, 237, 177, 221, 184, 1, 213, 81, 221, 184, 1, + 190, 190, 221, 184, 1, 199, 49, 221, 184, 1, 238, 34, 221, 184, 1, 237, + 183, 221, 184, 1, 237, 70, 221, 184, 1, 181, 221, 184, 1, 168, 221, 184, + 1, 209, 230, 221, 184, 1, 249, 155, 221, 184, 1, 249, 55, 221, 184, 1, + 248, 205, 221, 184, 1, 174, 221, 184, 1, 170, 221, 184, 1, 165, 221, 184, + 1, 173, 221, 184, 1, 195, 188, 221, 184, 1, 188, 221, 184, 1, 140, 221, + 184, 1, 219, 75, 221, 184, 18, 3, 252, 208, 221, 184, 18, 3, 68, 221, + 184, 18, 3, 223, 201, 221, 184, 18, 3, 66, 221, 184, 18, 3, 71, 221, 184, + 18, 3, 251, 238, 221, 184, 18, 3, 74, 221, 184, 18, 3, 250, 165, 221, + 184, 3, 251, 73, 221, 184, 3, 195, 40, 221, 184, 3, 212, 143, 221, 184, + 3, 203, 156, 221, 184, 237, 240, 221, 184, 55, 237, 240, 221, 184, 193, + 23, 204, 11, 221, 184, 205, 55, 77, 221, 184, 55, 205, 55, 77, 221, 184, + 252, 70, 56, 221, 184, 3, 200, 206, 221, 184, 1, 208, 98, 221, 184, 1, + 203, 41, 68, 221, 184, 18, 3, 117, 146, 215, 135, 1, 65, 215, 135, 1, 68, + 215, 135, 1, 66, 215, 135, 1, 71, 215, 135, 1, 155, 215, 135, 1, 221, + 217, 215, 135, 1, 231, 242, 215, 135, 1, 231, 93, 215, 135, 1, 247, 162, + 215, 135, 1, 247, 3, 215, 135, 1, 223, 34, 215, 135, 1, 222, 232, 215, + 135, 1, 212, 103, 215, 135, 1, 197, 132, 215, 135, 1, 197, 120, 215, 135, + 1, 237, 193, 215, 135, 1, 237, 183, 215, 135, 1, 237, 177, 215, 135, 1, + 213, 81, 215, 135, 1, 190, 190, 215, 135, 1, 199, 49, 215, 135, 1, 238, + 34, 215, 135, 1, 237, 70, 215, 135, 1, 181, 215, 135, 1, 168, 215, 135, + 1, 209, 230, 215, 135, 1, 249, 155, 215, 135, 1, 248, 205, 215, 135, 1, + 174, 215, 135, 1, 170, 215, 135, 1, 165, 215, 135, 1, 173, 215, 135, 1, + 195, 188, 215, 135, 1, 188, 215, 135, 1, 140, 215, 135, 1, 206, 110, 215, + 135, 1, 207, 7, 215, 135, 205, 55, 77, 221, 174, 1, 65, 221, 174, 1, 252, + 208, 221, 174, 1, 68, 221, 174, 1, 223, 201, 221, 174, 1, 66, 221, 174, + 1, 196, 30, 221, 174, 1, 71, 221, 174, 1, 251, 238, 221, 174, 1, 74, 221, + 174, 1, 250, 165, 221, 174, 1, 155, 221, 174, 1, 221, 217, 221, 174, 1, + 231, 242, 221, 174, 1, 231, 129, 221, 174, 1, 231, 93, 221, 174, 1, 214, + 70, 221, 174, 1, 247, 162, 221, 174, 1, 247, 3, 221, 174, 1, 223, 34, + 221, 174, 1, 222, 232, 221, 174, 1, 222, 254, 221, 174, 1, 212, 103, 221, + 174, 1, 197, 132, 221, 174, 1, 197, 120, 221, 174, 1, 237, 193, 221, 174, + 1, 237, 183, 221, 174, 1, 206, 110, 221, 174, 1, 237, 177, 221, 174, 1, + 213, 81, 221, 174, 1, 190, 190, 221, 174, 1, 199, 49, 221, 174, 1, 238, + 34, 221, 174, 1, 237, 70, 221, 174, 1, 181, 221, 174, 1, 168, 221, 174, + 1, 209, 230, 221, 174, 1, 249, 155, 221, 174, 1, 249, 55, 221, 174, 1, + 248, 205, 221, 174, 1, 174, 221, 174, 1, 170, 221, 174, 1, 165, 221, 174, + 1, 173, 221, 174, 1, 195, 188, 221, 174, 1, 203, 166, 221, 174, 1, 188, + 221, 174, 1, 140, 221, 174, 3, 251, 73, 221, 174, 18, 3, 252, 208, 221, + 174, 18, 3, 68, 221, 174, 18, 3, 223, 201, 221, 174, 18, 3, 66, 221, 174, + 18, 3, 196, 30, 221, 174, 18, 3, 71, 221, 174, 18, 3, 251, 238, 221, 174, + 18, 3, 74, 221, 174, 18, 3, 250, 165, 221, 174, 3, 212, 143, 221, 174, 3, + 195, 40, 221, 174, 17, 191, 77, 221, 174, 17, 107, 221, 174, 17, 109, + 221, 174, 17, 138, 221, 174, 17, 134, 221, 174, 17, 150, 221, 174, 17, + 169, 221, 174, 17, 175, 221, 174, 17, 171, 221, 174, 17, 178, 230, 221, + 3, 33, 251, 74, 58, 230, 221, 3, 247, 121, 230, 221, 3, 251, 73, 230, + 221, 3, 195, 35, 230, 221, 1, 65, 230, 221, 1, 252, 208, 230, 221, 1, 68, + 230, 221, 1, 223, 201, 230, 221, 1, 66, 230, 221, 1, 196, 30, 230, 221, + 1, 117, 146, 230, 221, 1, 117, 172, 230, 221, 1, 234, 190, 230, 221, 1, + 251, 238, 230, 221, 1, 211, 89, 230, 221, 1, 250, 165, 230, 221, 1, 155, + 230, 221, 1, 221, 217, 230, 221, 1, 231, 242, 230, 221, 1, 231, 93, 230, + 221, 1, 214, 70, 230, 221, 1, 247, 162, 230, 221, 1, 247, 3, 230, 221, 1, + 223, 34, 230, 221, 1, 222, 254, 230, 221, 1, 212, 103, 230, 221, 1, 197, + 132, 230, 221, 1, 197, 120, 230, 221, 1, 237, 193, 230, 221, 1, 237, 177, + 230, 221, 1, 213, 81, 230, 221, 1, 190, 190, 230, 221, 1, 199, 49, 230, + 221, 1, 238, 34, 230, 221, 1, 237, 70, 230, 221, 1, 181, 230, 221, 1, + 168, 230, 221, 1, 209, 230, 230, 221, 1, 249, 155, 230, 221, 1, 248, 205, + 230, 221, 1, 174, 230, 221, 1, 170, 230, 221, 1, 165, 230, 221, 1, 173, + 230, 221, 1, 219, 75, 230, 221, 1, 195, 188, 230, 221, 1, 203, 166, 230, + 221, 1, 201, 176, 230, 221, 1, 188, 230, 221, 1, 140, 33, 248, 167, 60, + 230, 221, 3, 212, 143, 230, 221, 3, 250, 147, 230, 221, 18, 3, 252, 208, + 230, 221, 18, 3, 68, 230, 221, 18, 3, 223, 201, 230, 221, 18, 3, 66, 230, + 221, 18, 3, 196, 30, 230, 221, 18, 3, 117, 146, 230, 221, 18, 3, 117, + 206, 111, 230, 221, 18, 3, 234, 190, 230, 221, 18, 3, 251, 238, 230, 221, + 18, 3, 211, 89, 230, 221, 18, 3, 250, 165, 230, 221, 3, 195, 40, 230, + 221, 211, 115, 230, 221, 250, 166, 219, 200, 77, 230, 221, 3, 209, 81, + 230, 221, 1, 195, 150, 251, 73, 230, 221, 1, 195, 150, 55, 251, 73, 230, + 221, 1, 117, 206, 111, 230, 221, 1, 117, 219, 76, 230, 221, 18, 3, 117, + 172, 230, 221, 18, 3, 117, 219, 76, 33, 230, 221, 17, 191, 77, 33, 230, + 221, 17, 107, 33, 230, 221, 17, 109, 33, 230, 221, 17, 138, 33, 230, 221, + 17, 134, 33, 230, 221, 17, 150, 33, 230, 221, 17, 169, 33, 230, 221, 1, + 65, 33, 230, 221, 1, 155, 33, 230, 221, 1, 181, 33, 230, 221, 1, 195, 69, + 33, 230, 221, 1, 168, 214, 80, 1, 65, 214, 80, 1, 252, 208, 214, 80, 1, + 68, 214, 80, 1, 223, 201, 214, 80, 1, 66, 214, 80, 1, 196, 30, 214, 80, + 1, 117, 146, 214, 80, 1, 117, 206, 111, 214, 80, 1, 117, 172, 214, 80, 1, + 117, 219, 76, 214, 80, 1, 71, 214, 80, 1, 251, 238, 214, 80, 1, 74, 214, + 80, 1, 250, 165, 214, 80, 1, 155, 214, 80, 1, 221, 217, 214, 80, 1, 231, + 242, 214, 80, 1, 231, 93, 214, 80, 1, 214, 70, 214, 80, 1, 214, 19, 214, + 80, 1, 247, 162, 214, 80, 1, 247, 3, 214, 80, 1, 223, 34, 214, 80, 1, + 222, 254, 214, 80, 1, 212, 103, 214, 80, 1, 212, 85, 214, 80, 1, 197, + 132, 214, 80, 1, 197, 120, 214, 80, 1, 237, 193, 214, 80, 1, 237, 177, + 214, 80, 1, 213, 81, 214, 80, 1, 190, 190, 214, 80, 1, 199, 49, 214, 80, + 1, 238, 34, 214, 80, 1, 237, 70, 214, 80, 1, 181, 214, 80, 1, 213, 226, + 214, 80, 1, 168, 214, 80, 1, 209, 230, 214, 80, 1, 249, 155, 214, 80, 1, + 248, 205, 214, 80, 1, 174, 214, 80, 1, 216, 105, 214, 80, 1, 170, 214, + 80, 1, 165, 214, 80, 1, 207, 7, 214, 80, 1, 173, 214, 80, 1, 219, 161, + 214, 80, 1, 193, 190, 214, 80, 1, 203, 166, 214, 80, 1, 201, 176, 214, + 80, 1, 188, 214, 80, 1, 140, 214, 80, 18, 3, 252, 208, 214, 80, 18, 3, + 68, 214, 80, 18, 3, 223, 201, 214, 80, 18, 3, 66, 214, 80, 18, 3, 196, + 30, 214, 80, 18, 3, 117, 146, 214, 80, 18, 3, 117, 206, 111, 214, 80, 18, + 3, 117, 172, 214, 80, 18, 3, 117, 219, 76, 214, 80, 18, 3, 71, 214, 80, + 18, 3, 251, 238, 214, 80, 18, 3, 74, 214, 80, 18, 3, 250, 165, 214, 80, + 3, 195, 40, 214, 80, 3, 247, 121, 214, 80, 3, 251, 73, 214, 80, 3, 195, + 35, 214, 80, 3, 212, 143, 214, 80, 3, 250, 147, 214, 80, 3, 53, 251, 73, + 214, 80, 211, 115, 214, 80, 202, 210, 214, 80, 237, 240, 214, 80, 55, + 237, 240, 214, 80, 242, 76, 214, 80, 231, 206, 233, 5, 214, 80, 252, 70, + 56, 214, 80, 17, 191, 77, 214, 80, 17, 107, 214, 80, 17, 109, 214, 80, + 17, 138, 214, 80, 17, 134, 214, 80, 17, 150, 214, 80, 17, 169, 214, 80, + 17, 175, 214, 80, 17, 171, 214, 80, 17, 178, 214, 80, 55, 242, 76, 214, + 80, 209, 109, 77, 214, 80, 223, 121, 56, 214, 80, 205, 139, 77, 214, 80, + 1, 195, 150, 251, 73, 214, 80, 3, 222, 239, 214, 80, 3, 196, 75, 198, + 129, 251, 102, 198, 129, 1, 65, 198, 129, 1, 252, 208, 198, 129, 1, 68, + 198, 129, 1, 223, 201, 198, 129, 1, 66, 198, 129, 1, 196, 30, 198, 129, + 1, 117, 146, 198, 129, 1, 117, 206, 111, 198, 129, 1, 117, 172, 198, 129, + 1, 117, 219, 76, 198, 129, 1, 71, 198, 129, 1, 251, 238, 198, 129, 1, 74, + 198, 129, 1, 250, 165, 198, 129, 1, 155, 198, 129, 1, 221, 217, 198, 129, + 1, 231, 242, 198, 129, 1, 231, 93, 198, 129, 1, 214, 70, 198, 129, 1, + 247, 162, 198, 129, 1, 247, 3, 198, 129, 1, 223, 34, 198, 129, 1, 222, + 254, 198, 129, 1, 212, 103, 198, 129, 1, 197, 132, 198, 129, 1, 197, 120, + 198, 129, 1, 237, 193, 198, 129, 1, 237, 177, 198, 129, 1, 213, 81, 198, + 129, 1, 190, 190, 198, 129, 1, 199, 49, 198, 129, 1, 238, 34, 198, 129, + 1, 237, 70, 198, 129, 1, 181, 198, 129, 1, 168, 198, 129, 1, 209, 230, + 198, 129, 1, 249, 155, 198, 129, 1, 248, 205, 198, 129, 1, 174, 198, 129, 1, 170, 198, 129, 1, 165, 198, 129, 1, 173, 198, 129, 1, 195, 188, 198, - 129, 1, 203, 165, 198, 129, 1, 201, 175, 198, 129, 1, 188, 198, 129, 1, - 140, 198, 129, 18, 3, 252, 206, 198, 129, 18, 3, 68, 198, 129, 18, 3, - 223, 199, 198, 129, 18, 3, 66, 198, 129, 18, 3, 196, 30, 198, 129, 18, 3, - 117, 146, 198, 129, 18, 3, 117, 206, 110, 198, 129, 18, 3, 117, 172, 198, - 129, 18, 3, 117, 219, 74, 198, 129, 18, 3, 71, 198, 129, 18, 3, 203, 40, - 71, 198, 129, 18, 3, 251, 236, 198, 129, 18, 3, 74, 198, 129, 18, 3, 203, - 40, 74, 198, 129, 18, 3, 250, 163, 198, 129, 3, 247, 119, 198, 129, 3, - 251, 71, 198, 129, 3, 195, 35, 198, 129, 3, 195, 40, 198, 129, 3, 212, - 141, 198, 129, 3, 250, 145, 198, 129, 230, 137, 198, 129, 252, 68, 56, - 198, 129, 211, 113, 198, 129, 17, 191, 77, 198, 129, 17, 107, 198, 129, - 17, 109, 198, 129, 17, 138, 198, 129, 17, 134, 198, 129, 17, 149, 198, + 129, 1, 203, 166, 198, 129, 1, 201, 176, 198, 129, 1, 188, 198, 129, 1, + 140, 198, 129, 18, 3, 252, 208, 198, 129, 18, 3, 68, 198, 129, 18, 3, + 223, 201, 198, 129, 18, 3, 66, 198, 129, 18, 3, 196, 30, 198, 129, 18, 3, + 117, 146, 198, 129, 18, 3, 117, 206, 111, 198, 129, 18, 3, 117, 172, 198, + 129, 18, 3, 117, 219, 76, 198, 129, 18, 3, 71, 198, 129, 18, 3, 203, 41, + 71, 198, 129, 18, 3, 251, 238, 198, 129, 18, 3, 74, 198, 129, 18, 3, 203, + 41, 74, 198, 129, 18, 3, 250, 165, 198, 129, 3, 247, 121, 198, 129, 3, + 251, 73, 198, 129, 3, 195, 35, 198, 129, 3, 195, 40, 198, 129, 3, 212, + 143, 198, 129, 3, 250, 147, 198, 129, 230, 139, 198, 129, 252, 70, 56, + 198, 129, 211, 115, 198, 129, 17, 191, 77, 198, 129, 17, 107, 198, 129, + 17, 109, 198, 129, 17, 138, 198, 129, 17, 134, 198, 129, 17, 150, 198, 129, 17, 169, 198, 129, 17, 175, 198, 129, 17, 171, 198, 129, 17, 178, - 202, 211, 1, 65, 202, 211, 1, 252, 206, 202, 211, 1, 68, 202, 211, 1, - 223, 199, 202, 211, 1, 66, 202, 211, 1, 196, 30, 202, 211, 1, 117, 146, - 202, 211, 1, 117, 206, 110, 202, 211, 1, 117, 172, 202, 211, 1, 117, 219, - 74, 202, 211, 1, 71, 202, 211, 1, 251, 236, 202, 211, 1, 74, 202, 211, 1, - 250, 163, 202, 211, 1, 155, 202, 211, 1, 221, 215, 202, 211, 1, 231, 240, - 202, 211, 1, 231, 91, 202, 211, 1, 214, 68, 202, 211, 1, 247, 160, 202, - 211, 1, 247, 1, 202, 211, 1, 223, 32, 202, 211, 1, 222, 252, 202, 211, 1, - 212, 101, 202, 211, 1, 197, 132, 202, 211, 1, 197, 120, 202, 211, 1, 237, - 191, 202, 211, 1, 237, 175, 202, 211, 1, 213, 79, 202, 211, 1, 190, 190, - 202, 211, 1, 199, 49, 202, 211, 1, 238, 32, 202, 211, 1, 237, 68, 202, - 211, 1, 180, 202, 211, 1, 168, 202, 211, 1, 209, 228, 202, 211, 1, 249, - 153, 202, 211, 1, 248, 203, 202, 211, 1, 174, 202, 211, 1, 170, 202, 211, - 1, 165, 202, 211, 1, 173, 202, 211, 1, 195, 188, 202, 211, 1, 203, 165, - 202, 211, 1, 201, 175, 202, 211, 1, 188, 202, 211, 1, 140, 202, 211, 18, - 3, 252, 206, 202, 211, 18, 3, 68, 202, 211, 18, 3, 223, 199, 202, 211, - 18, 3, 66, 202, 211, 18, 3, 196, 30, 202, 211, 18, 3, 117, 146, 202, 211, - 18, 3, 117, 206, 110, 202, 211, 18, 3, 71, 202, 211, 18, 3, 251, 236, - 202, 211, 18, 3, 74, 202, 211, 18, 3, 250, 163, 202, 211, 3, 247, 119, - 202, 211, 3, 251, 71, 202, 211, 3, 195, 35, 202, 211, 3, 195, 40, 202, - 211, 3, 212, 141, 202, 211, 3, 202, 210, 202, 211, 237, 238, 202, 211, - 55, 237, 238, 202, 211, 204, 11, 236, 140, 202, 211, 204, 11, 164, 202, - 211, 207, 46, 217, 55, 202, 211, 207, 46, 217, 54, 202, 211, 207, 46, - 217, 53, 202, 211, 234, 95, 79, 199, 54, 77, 202, 211, 205, 54, 87, 4, - 197, 236, 23, 196, 221, 211, 41, 202, 211, 205, 54, 87, 4, 197, 236, 23, - 235, 138, 238, 226, 202, 211, 205, 54, 87, 4, 207, 120, 23, 235, 138, - 238, 226, 202, 211, 205, 54, 87, 4, 207, 120, 23, 235, 138, 55, 238, 226, - 202, 211, 205, 54, 87, 4, 207, 120, 23, 235, 138, 197, 225, 238, 226, - 202, 211, 205, 54, 87, 55, 206, 188, 202, 211, 205, 54, 87, 55, 206, 189, - 4, 207, 119, 202, 211, 205, 54, 87, 4, 55, 238, 226, 202, 211, 205, 54, - 87, 4, 197, 225, 238, 226, 202, 211, 205, 54, 87, 4, 208, 26, 238, 226, - 202, 211, 205, 54, 87, 4, 204, 8, 238, 226, 202, 211, 205, 54, 87, 4, - 243, 8, 23, 207, 119, 202, 211, 205, 54, 87, 4, 243, 8, 23, 105, 234, 97, - 202, 211, 205, 54, 87, 4, 243, 8, 23, 232, 128, 234, 97, 202, 211, 1, - 198, 226, 251, 157, 68, 202, 211, 1, 197, 15, 251, 157, 68, 202, 211, 1, - 197, 15, 251, 157, 223, 199, 202, 211, 1, 251, 157, 66, 202, 211, 18, 3, - 251, 157, 66, 202, 211, 18, 3, 251, 157, 196, 30, 215, 253, 1, 65, 215, - 253, 1, 252, 206, 215, 253, 1, 68, 215, 253, 1, 223, 199, 215, 253, 1, - 66, 215, 253, 1, 196, 30, 215, 253, 1, 117, 146, 215, 253, 1, 117, 206, - 110, 215, 253, 1, 117, 172, 215, 253, 1, 117, 219, 74, 215, 253, 1, 71, - 215, 253, 1, 251, 236, 215, 253, 1, 74, 215, 253, 1, 250, 163, 215, 253, - 1, 155, 215, 253, 1, 221, 215, 215, 253, 1, 231, 240, 215, 253, 1, 231, - 91, 215, 253, 1, 214, 68, 215, 253, 1, 247, 160, 215, 253, 1, 247, 1, - 215, 253, 1, 223, 32, 215, 253, 1, 222, 252, 215, 253, 1, 212, 101, 215, - 253, 1, 197, 132, 215, 253, 1, 197, 120, 215, 253, 1, 237, 191, 215, 253, - 1, 237, 175, 215, 253, 1, 213, 79, 215, 253, 1, 190, 190, 215, 253, 1, - 199, 49, 215, 253, 1, 238, 32, 215, 253, 1, 237, 68, 215, 253, 1, 180, - 215, 253, 1, 168, 215, 253, 1, 209, 228, 215, 253, 1, 249, 153, 215, 253, - 1, 248, 203, 215, 253, 1, 174, 215, 253, 1, 170, 215, 253, 1, 165, 215, - 253, 1, 173, 215, 253, 1, 195, 188, 215, 253, 1, 203, 165, 215, 253, 1, - 201, 175, 215, 253, 1, 188, 215, 253, 1, 140, 215, 253, 1, 219, 73, 215, - 253, 18, 3, 252, 206, 215, 253, 18, 3, 68, 215, 253, 18, 3, 223, 199, - 215, 253, 18, 3, 66, 215, 253, 18, 3, 196, 30, 215, 253, 18, 3, 117, 146, - 215, 253, 18, 3, 117, 206, 110, 215, 253, 18, 3, 117, 172, 215, 253, 18, - 3, 117, 219, 74, 215, 253, 18, 3, 71, 215, 253, 18, 3, 251, 236, 215, - 253, 18, 3, 74, 215, 253, 18, 3, 250, 163, 215, 253, 3, 251, 71, 215, - 253, 3, 195, 35, 215, 253, 3, 195, 40, 215, 253, 3, 251, 11, 215, 253, - 237, 238, 215, 253, 55, 237, 238, 215, 253, 252, 68, 56, 215, 253, 3, - 228, 127, 215, 253, 17, 191, 77, 215, 253, 17, 107, 215, 253, 17, 109, - 215, 253, 17, 138, 215, 253, 17, 134, 215, 253, 17, 149, 215, 253, 17, - 169, 215, 253, 17, 175, 215, 253, 17, 171, 215, 253, 17, 178, 104, 248, - 159, 4, 211, 42, 104, 206, 122, 248, 158, 104, 55, 248, 159, 4, 211, 42, - 104, 197, 225, 248, 159, 4, 211, 42, 104, 248, 159, 4, 55, 211, 42, 104, - 206, 122, 248, 159, 4, 211, 42, 104, 206, 122, 248, 159, 4, 55, 211, 42, - 104, 223, 93, 248, 158, 104, 223, 93, 248, 159, 4, 55, 211, 42, 104, 200, - 134, 248, 158, 104, 200, 134, 248, 159, 4, 211, 42, 104, 200, 134, 248, - 159, 4, 55, 211, 42, 104, 153, 200, 134, 248, 159, 4, 55, 211, 42, 199, - 205, 1, 65, 199, 205, 1, 252, 206, 199, 205, 1, 68, 199, 205, 1, 223, - 199, 199, 205, 1, 66, 199, 205, 1, 196, 30, 199, 205, 1, 71, 199, 205, 1, - 251, 236, 199, 205, 1, 74, 199, 205, 1, 250, 163, 199, 205, 1, 155, 199, - 205, 1, 221, 215, 199, 205, 1, 231, 240, 199, 205, 1, 231, 91, 199, 205, - 1, 214, 68, 199, 205, 1, 247, 160, 199, 205, 1, 247, 1, 199, 205, 1, 223, - 32, 199, 205, 1, 222, 252, 199, 205, 1, 212, 101, 199, 205, 1, 197, 132, - 199, 205, 1, 197, 120, 199, 205, 1, 237, 191, 199, 205, 1, 237, 175, 199, - 205, 1, 213, 79, 199, 205, 1, 190, 190, 199, 205, 1, 199, 49, 199, 205, - 1, 238, 32, 199, 205, 1, 237, 68, 199, 205, 1, 180, 199, 205, 1, 168, - 199, 205, 1, 209, 228, 199, 205, 1, 249, 153, 199, 205, 1, 248, 203, 199, + 202, 212, 1, 65, 202, 212, 1, 252, 208, 202, 212, 1, 68, 202, 212, 1, + 223, 201, 202, 212, 1, 66, 202, 212, 1, 196, 30, 202, 212, 1, 117, 146, + 202, 212, 1, 117, 206, 111, 202, 212, 1, 117, 172, 202, 212, 1, 117, 219, + 76, 202, 212, 1, 71, 202, 212, 1, 251, 238, 202, 212, 1, 74, 202, 212, 1, + 250, 165, 202, 212, 1, 155, 202, 212, 1, 221, 217, 202, 212, 1, 231, 242, + 202, 212, 1, 231, 93, 202, 212, 1, 214, 70, 202, 212, 1, 247, 162, 202, + 212, 1, 247, 3, 202, 212, 1, 223, 34, 202, 212, 1, 222, 254, 202, 212, 1, + 212, 103, 202, 212, 1, 197, 132, 202, 212, 1, 197, 120, 202, 212, 1, 237, + 193, 202, 212, 1, 237, 177, 202, 212, 1, 213, 81, 202, 212, 1, 190, 190, + 202, 212, 1, 199, 49, 202, 212, 1, 238, 34, 202, 212, 1, 237, 70, 202, + 212, 1, 181, 202, 212, 1, 168, 202, 212, 1, 209, 230, 202, 212, 1, 249, + 155, 202, 212, 1, 248, 205, 202, 212, 1, 174, 202, 212, 1, 170, 202, 212, + 1, 165, 202, 212, 1, 173, 202, 212, 1, 195, 188, 202, 212, 1, 203, 166, + 202, 212, 1, 201, 176, 202, 212, 1, 188, 202, 212, 1, 140, 202, 212, 18, + 3, 252, 208, 202, 212, 18, 3, 68, 202, 212, 18, 3, 223, 201, 202, 212, + 18, 3, 66, 202, 212, 18, 3, 196, 30, 202, 212, 18, 3, 117, 146, 202, 212, + 18, 3, 117, 206, 111, 202, 212, 18, 3, 71, 202, 212, 18, 3, 251, 238, + 202, 212, 18, 3, 74, 202, 212, 18, 3, 250, 165, 202, 212, 3, 247, 121, + 202, 212, 3, 251, 73, 202, 212, 3, 195, 35, 202, 212, 3, 195, 40, 202, + 212, 3, 212, 143, 202, 212, 3, 202, 211, 202, 212, 237, 240, 202, 212, + 55, 237, 240, 202, 212, 204, 12, 236, 142, 202, 212, 204, 12, 164, 202, + 212, 207, 47, 217, 57, 202, 212, 207, 47, 217, 56, 202, 212, 207, 47, + 217, 55, 202, 212, 234, 97, 79, 199, 54, 77, 202, 212, 205, 55, 87, 4, + 197, 236, 23, 196, 221, 211, 43, 202, 212, 205, 55, 87, 4, 197, 236, 23, + 235, 140, 238, 228, 202, 212, 205, 55, 87, 4, 207, 122, 23, 235, 140, + 238, 228, 202, 212, 205, 55, 87, 4, 207, 122, 23, 235, 140, 55, 238, 228, + 202, 212, 205, 55, 87, 4, 207, 122, 23, 235, 140, 197, 225, 238, 228, + 202, 212, 205, 55, 87, 55, 206, 189, 202, 212, 205, 55, 87, 55, 206, 190, + 4, 207, 121, 202, 212, 205, 55, 87, 4, 55, 238, 228, 202, 212, 205, 55, + 87, 4, 197, 225, 238, 228, 202, 212, 205, 55, 87, 4, 208, 28, 238, 228, + 202, 212, 205, 55, 87, 4, 204, 9, 238, 228, 202, 212, 205, 55, 87, 4, + 243, 10, 23, 207, 121, 202, 212, 205, 55, 87, 4, 243, 10, 23, 105, 234, + 99, 202, 212, 205, 55, 87, 4, 243, 10, 23, 232, 130, 234, 99, 202, 212, + 1, 198, 226, 251, 159, 68, 202, 212, 1, 197, 15, 251, 159, 68, 202, 212, + 1, 197, 15, 251, 159, 223, 201, 202, 212, 1, 251, 159, 66, 202, 212, 18, + 3, 251, 159, 66, 202, 212, 18, 3, 251, 159, 196, 30, 215, 255, 1, 65, + 215, 255, 1, 252, 208, 215, 255, 1, 68, 215, 255, 1, 223, 201, 215, 255, + 1, 66, 215, 255, 1, 196, 30, 215, 255, 1, 117, 146, 215, 255, 1, 117, + 206, 111, 215, 255, 1, 117, 172, 215, 255, 1, 117, 219, 76, 215, 255, 1, + 71, 215, 255, 1, 251, 238, 215, 255, 1, 74, 215, 255, 1, 250, 165, 215, + 255, 1, 155, 215, 255, 1, 221, 217, 215, 255, 1, 231, 242, 215, 255, 1, + 231, 93, 215, 255, 1, 214, 70, 215, 255, 1, 247, 162, 215, 255, 1, 247, + 3, 215, 255, 1, 223, 34, 215, 255, 1, 222, 254, 215, 255, 1, 212, 103, + 215, 255, 1, 197, 132, 215, 255, 1, 197, 120, 215, 255, 1, 237, 193, 215, + 255, 1, 237, 177, 215, 255, 1, 213, 81, 215, 255, 1, 190, 190, 215, 255, + 1, 199, 49, 215, 255, 1, 238, 34, 215, 255, 1, 237, 70, 215, 255, 1, 181, + 215, 255, 1, 168, 215, 255, 1, 209, 230, 215, 255, 1, 249, 155, 215, 255, + 1, 248, 205, 215, 255, 1, 174, 215, 255, 1, 170, 215, 255, 1, 165, 215, + 255, 1, 173, 215, 255, 1, 195, 188, 215, 255, 1, 203, 166, 215, 255, 1, + 201, 176, 215, 255, 1, 188, 215, 255, 1, 140, 215, 255, 1, 219, 75, 215, + 255, 18, 3, 252, 208, 215, 255, 18, 3, 68, 215, 255, 18, 3, 223, 201, + 215, 255, 18, 3, 66, 215, 255, 18, 3, 196, 30, 215, 255, 18, 3, 117, 146, + 215, 255, 18, 3, 117, 206, 111, 215, 255, 18, 3, 117, 172, 215, 255, 18, + 3, 117, 219, 76, 215, 255, 18, 3, 71, 215, 255, 18, 3, 251, 238, 215, + 255, 18, 3, 74, 215, 255, 18, 3, 250, 165, 215, 255, 3, 251, 73, 215, + 255, 3, 195, 35, 215, 255, 3, 195, 40, 215, 255, 3, 251, 13, 215, 255, + 237, 240, 215, 255, 55, 237, 240, 215, 255, 252, 70, 56, 215, 255, 3, + 228, 129, 215, 255, 17, 191, 77, 215, 255, 17, 107, 215, 255, 17, 109, + 215, 255, 17, 138, 215, 255, 17, 134, 215, 255, 17, 150, 215, 255, 17, + 169, 215, 255, 17, 175, 215, 255, 17, 171, 215, 255, 17, 178, 104, 248, + 161, 4, 211, 44, 104, 206, 123, 248, 160, 104, 55, 248, 161, 4, 211, 44, + 104, 197, 225, 248, 161, 4, 211, 44, 104, 248, 161, 4, 55, 211, 44, 104, + 206, 123, 248, 161, 4, 211, 44, 104, 206, 123, 248, 161, 4, 55, 211, 44, + 104, 223, 95, 248, 160, 104, 223, 95, 248, 161, 4, 55, 211, 44, 104, 200, + 134, 248, 160, 104, 200, 134, 248, 161, 4, 211, 44, 104, 200, 134, 248, + 161, 4, 55, 211, 44, 104, 154, 200, 134, 248, 161, 4, 55, 211, 44, 199, + 205, 1, 65, 199, 205, 1, 252, 208, 199, 205, 1, 68, 199, 205, 1, 223, + 201, 199, 205, 1, 66, 199, 205, 1, 196, 30, 199, 205, 1, 71, 199, 205, 1, + 251, 238, 199, 205, 1, 74, 199, 205, 1, 250, 165, 199, 205, 1, 155, 199, + 205, 1, 221, 217, 199, 205, 1, 231, 242, 199, 205, 1, 231, 93, 199, 205, + 1, 214, 70, 199, 205, 1, 247, 162, 199, 205, 1, 247, 3, 199, 205, 1, 223, + 34, 199, 205, 1, 222, 254, 199, 205, 1, 212, 103, 199, 205, 1, 197, 132, + 199, 205, 1, 197, 120, 199, 205, 1, 237, 193, 199, 205, 1, 237, 177, 199, + 205, 1, 213, 81, 199, 205, 1, 190, 190, 199, 205, 1, 199, 49, 199, 205, + 1, 238, 34, 199, 205, 1, 237, 70, 199, 205, 1, 181, 199, 205, 1, 168, + 199, 205, 1, 209, 230, 199, 205, 1, 249, 155, 199, 205, 1, 248, 205, 199, 205, 1, 174, 199, 205, 1, 170, 199, 205, 1, 165, 199, 205, 1, 173, 199, - 205, 1, 195, 188, 199, 205, 1, 203, 165, 199, 205, 1, 188, 199, 205, 1, - 140, 199, 205, 1, 206, 109, 199, 205, 3, 251, 71, 199, 205, 3, 195, 35, - 199, 205, 18, 3, 252, 206, 199, 205, 18, 3, 68, 199, 205, 18, 3, 223, - 199, 199, 205, 18, 3, 66, 199, 205, 18, 3, 196, 30, 199, 205, 18, 3, 71, - 199, 205, 18, 3, 251, 236, 199, 205, 18, 3, 74, 199, 205, 18, 3, 250, - 163, 199, 205, 3, 195, 40, 199, 205, 3, 212, 141, 199, 205, 1, 251, 14, - 221, 215, 199, 205, 252, 68, 56, 199, 205, 17, 191, 77, 199, 205, 17, + 205, 1, 195, 188, 199, 205, 1, 203, 166, 199, 205, 1, 188, 199, 205, 1, + 140, 199, 205, 1, 206, 110, 199, 205, 3, 251, 73, 199, 205, 3, 195, 35, + 199, 205, 18, 3, 252, 208, 199, 205, 18, 3, 68, 199, 205, 18, 3, 223, + 201, 199, 205, 18, 3, 66, 199, 205, 18, 3, 196, 30, 199, 205, 18, 3, 71, + 199, 205, 18, 3, 251, 238, 199, 205, 18, 3, 74, 199, 205, 18, 3, 250, + 165, 199, 205, 3, 195, 40, 199, 205, 3, 212, 143, 199, 205, 1, 251, 16, + 221, 217, 199, 205, 252, 70, 56, 199, 205, 17, 191, 77, 199, 205, 17, 107, 199, 205, 17, 109, 199, 205, 17, 138, 199, 205, 17, 134, 199, 205, - 17, 149, 199, 205, 17, 169, 199, 205, 17, 175, 199, 205, 17, 171, 199, - 205, 17, 178, 251, 240, 1, 155, 251, 240, 1, 221, 215, 251, 240, 1, 214, - 68, 251, 240, 1, 180, 251, 240, 1, 190, 190, 251, 240, 1, 251, 157, 190, - 190, 251, 240, 1, 168, 251, 240, 1, 209, 228, 251, 240, 1, 249, 153, 251, - 240, 1, 174, 251, 240, 1, 223, 32, 251, 240, 1, 247, 1, 251, 240, 1, 199, - 49, 251, 240, 1, 165, 251, 240, 1, 173, 251, 240, 1, 188, 251, 240, 1, - 212, 101, 251, 240, 1, 140, 251, 240, 1, 65, 251, 240, 1, 238, 32, 251, - 240, 1, 237, 68, 251, 240, 1, 231, 240, 251, 240, 1, 251, 157, 231, 240, - 251, 240, 1, 231, 91, 251, 240, 1, 248, 203, 251, 240, 1, 222, 252, 251, - 240, 1, 251, 157, 249, 153, 251, 240, 120, 3, 216, 217, 173, 251, 240, - 120, 3, 216, 217, 165, 251, 240, 120, 3, 216, 217, 219, 133, 165, 251, - 240, 18, 3, 65, 251, 240, 18, 3, 252, 206, 251, 240, 18, 3, 68, 251, 240, - 18, 3, 223, 199, 251, 240, 18, 3, 66, 251, 240, 18, 3, 196, 30, 251, 240, - 18, 3, 71, 251, 240, 18, 3, 250, 140, 251, 240, 18, 3, 74, 251, 240, 18, - 3, 251, 236, 251, 240, 18, 3, 251, 149, 251, 240, 3, 221, 143, 251, 240, - 17, 191, 77, 251, 240, 17, 107, 251, 240, 17, 109, 251, 240, 17, 138, - 251, 240, 17, 134, 251, 240, 17, 149, 251, 240, 17, 169, 251, 240, 17, - 175, 251, 240, 17, 171, 251, 240, 17, 178, 251, 240, 31, 199, 95, 251, - 240, 31, 197, 32, 251, 240, 3, 2, 205, 53, 251, 240, 3, 205, 53, 251, - 240, 3, 206, 53, 251, 240, 16, 195, 69, 251, 240, 1, 247, 160, 251, 240, - 1, 197, 132, 251, 240, 1, 197, 120, 251, 240, 1, 237, 191, 251, 240, 1, - 237, 175, 251, 240, 1, 213, 79, 251, 240, 1, 219, 73, 236, 161, 1, 65, - 236, 161, 1, 252, 206, 236, 161, 1, 68, 236, 161, 1, 223, 199, 236, 161, - 1, 66, 236, 161, 1, 196, 30, 236, 161, 1, 71, 236, 161, 1, 251, 236, 236, - 161, 1, 74, 236, 161, 1, 250, 163, 236, 161, 1, 155, 236, 161, 1, 221, - 215, 236, 161, 1, 231, 240, 236, 161, 1, 231, 91, 236, 161, 1, 214, 68, - 236, 161, 1, 247, 160, 236, 161, 1, 247, 1, 236, 161, 1, 223, 32, 236, - 161, 1, 222, 252, 236, 161, 1, 212, 101, 236, 161, 1, 197, 132, 236, 161, - 1, 197, 120, 236, 161, 1, 237, 191, 236, 161, 1, 237, 175, 236, 161, 1, - 213, 79, 236, 161, 1, 190, 190, 236, 161, 1, 199, 49, 236, 161, 1, 238, - 32, 236, 161, 1, 237, 68, 236, 161, 1, 180, 236, 161, 1, 168, 236, 161, - 1, 209, 228, 236, 161, 1, 249, 153, 236, 161, 1, 248, 203, 236, 161, 1, - 174, 236, 161, 1, 170, 236, 161, 1, 165, 236, 161, 1, 173, 236, 161, 1, - 195, 188, 236, 161, 1, 203, 165, 236, 161, 1, 201, 175, 236, 161, 1, 188, - 236, 161, 1, 140, 236, 161, 1, 206, 109, 236, 161, 18, 3, 252, 206, 236, - 161, 18, 3, 68, 236, 161, 18, 3, 223, 199, 236, 161, 18, 3, 66, 236, 161, - 18, 3, 196, 30, 236, 161, 18, 3, 117, 146, 236, 161, 18, 3, 117, 206, - 110, 236, 161, 18, 3, 71, 236, 161, 18, 3, 251, 236, 236, 161, 18, 3, 74, - 236, 161, 18, 3, 250, 163, 236, 161, 3, 251, 71, 236, 161, 3, 195, 35, - 236, 161, 3, 195, 40, 236, 161, 3, 212, 141, 236, 161, 252, 68, 56, 193, - 156, 242, 253, 6, 1, 214, 67, 193, 156, 242, 253, 6, 1, 65, 193, 156, - 242, 253, 6, 1, 193, 86, 193, 156, 242, 253, 6, 1, 191, 225, 193, 156, - 242, 253, 6, 1, 170, 193, 156, 242, 253, 6, 1, 192, 12, 193, 156, 242, - 253, 6, 1, 223, 199, 193, 156, 242, 253, 6, 1, 196, 30, 193, 156, 242, - 253, 6, 1, 71, 193, 156, 242, 253, 6, 1, 74, 193, 156, 242, 253, 6, 1, - 251, 122, 193, 156, 242, 253, 6, 1, 231, 240, 193, 156, 242, 253, 6, 1, - 221, 67, 193, 156, 242, 253, 6, 1, 234, 66, 193, 156, 242, 253, 6, 1, - 191, 204, 193, 156, 242, 253, 6, 1, 196, 160, 193, 156, 242, 253, 6, 1, - 234, 85, 193, 156, 242, 253, 6, 1, 211, 154, 193, 156, 242, 253, 6, 1, - 197, 127, 193, 156, 242, 253, 6, 1, 212, 127, 193, 156, 242, 253, 6, 1, - 238, 32, 193, 156, 242, 253, 6, 1, 250, 182, 193, 156, 242, 253, 6, 1, - 251, 149, 193, 156, 242, 253, 6, 1, 248, 10, 193, 156, 242, 253, 6, 1, - 208, 165, 193, 156, 242, 253, 6, 1, 229, 115, 193, 156, 242, 253, 6, 1, - 229, 3, 193, 156, 242, 253, 6, 1, 228, 185, 193, 156, 242, 253, 6, 1, - 230, 19, 193, 156, 242, 253, 6, 1, 201, 126, 193, 156, 242, 253, 6, 1, - 202, 193, 193, 156, 242, 253, 6, 1, 195, 25, 193, 156, 242, 253, 2, 1, - 214, 67, 193, 156, 242, 253, 2, 1, 65, 193, 156, 242, 253, 2, 1, 193, 86, - 193, 156, 242, 253, 2, 1, 191, 225, 193, 156, 242, 253, 2, 1, 170, 193, - 156, 242, 253, 2, 1, 192, 12, 193, 156, 242, 253, 2, 1, 223, 199, 193, - 156, 242, 253, 2, 1, 196, 30, 193, 156, 242, 253, 2, 1, 71, 193, 156, - 242, 253, 2, 1, 74, 193, 156, 242, 253, 2, 1, 251, 122, 193, 156, 242, - 253, 2, 1, 231, 240, 193, 156, 242, 253, 2, 1, 221, 67, 193, 156, 242, - 253, 2, 1, 234, 66, 193, 156, 242, 253, 2, 1, 191, 204, 193, 156, 242, - 253, 2, 1, 196, 160, 193, 156, 242, 253, 2, 1, 234, 85, 193, 156, 242, - 253, 2, 1, 211, 154, 193, 156, 242, 253, 2, 1, 197, 127, 193, 156, 242, - 253, 2, 1, 212, 127, 193, 156, 242, 253, 2, 1, 238, 32, 193, 156, 242, - 253, 2, 1, 250, 182, 193, 156, 242, 253, 2, 1, 251, 149, 193, 156, 242, - 253, 2, 1, 248, 10, 193, 156, 242, 253, 2, 1, 208, 165, 193, 156, 242, - 253, 2, 1, 229, 115, 193, 156, 242, 253, 2, 1, 229, 3, 193, 156, 242, - 253, 2, 1, 228, 185, 193, 156, 242, 253, 2, 1, 230, 19, 193, 156, 242, - 253, 2, 1, 201, 126, 193, 156, 242, 253, 2, 1, 202, 193, 193, 156, 242, - 253, 2, 1, 195, 25, 193, 156, 242, 253, 17, 191, 77, 193, 156, 242, 253, - 17, 107, 193, 156, 242, 253, 17, 109, 193, 156, 242, 253, 17, 138, 193, - 156, 242, 253, 17, 134, 193, 156, 242, 253, 17, 149, 193, 156, 242, 253, - 17, 169, 193, 156, 242, 253, 17, 175, 193, 156, 242, 253, 17, 171, 193, - 156, 242, 253, 17, 178, 193, 156, 242, 253, 31, 199, 95, 193, 156, 242, - 253, 31, 197, 32, 193, 156, 242, 253, 31, 198, 249, 193, 156, 242, 253, - 31, 232, 135, 193, 156, 242, 253, 31, 233, 15, 193, 156, 242, 253, 31, - 202, 120, 193, 156, 242, 253, 31, 203, 241, 193, 156, 242, 253, 31, 234, - 153, 193, 156, 242, 253, 31, 213, 169, 193, 156, 242, 253, 211, 113, 236, - 209, 251, 209, 1, 65, 236, 209, 251, 209, 1, 252, 206, 236, 209, 251, - 209, 1, 68, 236, 209, 251, 209, 1, 223, 199, 236, 209, 251, 209, 1, 66, - 236, 209, 251, 209, 1, 196, 30, 236, 209, 251, 209, 1, 71, 236, 209, 251, - 209, 1, 74, 236, 209, 251, 209, 1, 155, 236, 209, 251, 209, 1, 221, 215, - 236, 209, 251, 209, 1, 231, 240, 236, 209, 251, 209, 1, 231, 91, 236, - 209, 251, 209, 1, 214, 68, 236, 209, 251, 209, 1, 247, 160, 236, 209, - 251, 209, 1, 247, 1, 236, 209, 251, 209, 1, 223, 32, 236, 209, 251, 209, - 1, 212, 101, 236, 209, 251, 209, 1, 197, 132, 236, 209, 251, 209, 1, 237, - 191, 236, 209, 251, 209, 1, 237, 175, 236, 209, 251, 209, 1, 213, 79, - 236, 209, 251, 209, 1, 190, 190, 236, 209, 251, 209, 1, 199, 49, 236, - 209, 251, 209, 1, 238, 32, 236, 209, 251, 209, 1, 237, 68, 236, 209, 251, - 209, 1, 180, 236, 209, 251, 209, 1, 168, 236, 209, 251, 209, 1, 209, 228, - 236, 209, 251, 209, 1, 249, 153, 236, 209, 251, 209, 1, 248, 203, 236, - 209, 251, 209, 1, 174, 236, 209, 251, 209, 1, 170, 236, 209, 251, 209, 1, - 191, 175, 236, 209, 251, 209, 1, 165, 236, 209, 251, 209, 1, 173, 236, - 209, 251, 209, 1, 195, 188, 236, 209, 251, 209, 1, 203, 165, 236, 209, - 251, 209, 1, 201, 175, 236, 209, 251, 209, 1, 188, 236, 209, 251, 209, 1, - 140, 236, 209, 251, 209, 1, 219, 73, 236, 209, 251, 209, 1, 191, 123, - 236, 209, 251, 209, 18, 3, 252, 206, 236, 209, 251, 209, 18, 3, 68, 236, - 209, 251, 209, 18, 3, 223, 199, 236, 209, 251, 209, 18, 3, 66, 236, 209, - 251, 209, 18, 3, 196, 30, 236, 209, 251, 209, 18, 3, 71, 236, 209, 251, - 209, 18, 3, 251, 236, 236, 209, 251, 209, 18, 3, 74, 236, 209, 251, 209, - 3, 251, 71, 236, 209, 251, 209, 3, 247, 119, 236, 209, 251, 209, 3, 230, - 72, 236, 209, 251, 209, 195, 40, 236, 209, 251, 209, 208, 227, 214, 214, - 56, 236, 209, 251, 209, 216, 217, 170, 236, 209, 251, 209, 89, 165, 236, - 209, 251, 209, 216, 217, 165, 236, 209, 251, 209, 3, 212, 141, 236, 209, - 251, 209, 55, 237, 238, 236, 209, 251, 209, 231, 204, 233, 3, 236, 209, - 251, 209, 234, 95, 79, 199, 54, 77, 236, 209, 251, 209, 17, 191, 77, 236, - 209, 251, 209, 17, 107, 236, 209, 251, 209, 17, 109, 236, 209, 251, 209, - 17, 138, 236, 209, 251, 209, 17, 134, 236, 209, 251, 209, 17, 149, 236, - 209, 251, 209, 17, 169, 236, 209, 251, 209, 17, 175, 236, 209, 251, 209, - 17, 171, 236, 209, 251, 209, 17, 178, 214, 223, 1, 65, 214, 223, 1, 252, - 206, 214, 223, 1, 68, 214, 223, 1, 223, 199, 214, 223, 1, 66, 214, 223, - 1, 196, 30, 214, 223, 1, 117, 146, 214, 223, 1, 117, 206, 110, 214, 223, - 1, 71, 214, 223, 1, 251, 236, 214, 223, 1, 74, 214, 223, 1, 250, 163, - 214, 223, 1, 155, 214, 223, 1, 221, 215, 214, 223, 1, 231, 240, 214, 223, - 1, 231, 91, 214, 223, 1, 214, 68, 214, 223, 1, 247, 160, 214, 223, 1, - 247, 1, 214, 223, 1, 223, 32, 214, 223, 1, 222, 252, 214, 223, 1, 212, - 101, 214, 223, 1, 197, 132, 214, 223, 1, 197, 120, 214, 223, 1, 237, 191, - 214, 223, 1, 237, 175, 214, 223, 1, 213, 79, 214, 223, 1, 190, 190, 214, - 223, 1, 199, 49, 214, 223, 1, 238, 32, 214, 223, 1, 237, 68, 214, 223, 1, - 180, 214, 223, 1, 168, 214, 223, 1, 209, 228, 214, 223, 1, 249, 153, 214, - 223, 1, 248, 203, 214, 223, 1, 174, 214, 223, 1, 170, 214, 223, 1, 165, - 214, 223, 1, 173, 214, 223, 1, 195, 188, 214, 223, 1, 203, 165, 214, 223, - 1, 201, 175, 214, 223, 1, 188, 214, 223, 1, 140, 214, 223, 1, 219, 73, - 214, 223, 1, 206, 109, 214, 223, 18, 3, 252, 206, 214, 223, 18, 3, 68, - 214, 223, 18, 3, 223, 199, 214, 223, 18, 3, 66, 214, 223, 18, 3, 196, 30, - 214, 223, 18, 3, 117, 146, 214, 223, 18, 3, 117, 206, 110, 214, 223, 18, - 3, 71, 214, 223, 18, 3, 251, 236, 214, 223, 18, 3, 74, 214, 223, 18, 3, - 250, 163, 214, 223, 3, 251, 71, 214, 223, 3, 195, 35, 214, 223, 3, 195, - 40, 214, 223, 3, 250, 145, 214, 223, 3, 202, 210, 214, 223, 229, 227, - 214, 223, 18, 3, 208, 207, 71, 191, 106, 51, 1, 65, 191, 106, 51, 18, 3, + 17, 150, 199, 205, 17, 169, 199, 205, 17, 175, 199, 205, 17, 171, 199, + 205, 17, 178, 251, 242, 1, 155, 251, 242, 1, 221, 217, 251, 242, 1, 214, + 70, 251, 242, 1, 181, 251, 242, 1, 190, 190, 251, 242, 1, 251, 159, 190, + 190, 251, 242, 1, 168, 251, 242, 1, 209, 230, 251, 242, 1, 249, 155, 251, + 242, 1, 174, 251, 242, 1, 223, 34, 251, 242, 1, 247, 3, 251, 242, 1, 199, + 49, 251, 242, 1, 165, 251, 242, 1, 173, 251, 242, 1, 188, 251, 242, 1, + 212, 103, 251, 242, 1, 140, 251, 242, 1, 65, 251, 242, 1, 238, 34, 251, + 242, 1, 237, 70, 251, 242, 1, 231, 242, 251, 242, 1, 251, 159, 231, 242, + 251, 242, 1, 231, 93, 251, 242, 1, 248, 205, 251, 242, 1, 222, 254, 251, + 242, 1, 251, 159, 249, 155, 251, 242, 120, 3, 216, 219, 173, 251, 242, + 120, 3, 216, 219, 165, 251, 242, 120, 3, 216, 219, 219, 135, 165, 251, + 242, 18, 3, 65, 251, 242, 18, 3, 252, 208, 251, 242, 18, 3, 68, 251, 242, + 18, 3, 223, 201, 251, 242, 18, 3, 66, 251, 242, 18, 3, 196, 30, 251, 242, + 18, 3, 71, 251, 242, 18, 3, 250, 142, 251, 242, 18, 3, 74, 251, 242, 18, + 3, 251, 238, 251, 242, 18, 3, 251, 151, 251, 242, 3, 221, 145, 251, 242, + 17, 191, 77, 251, 242, 17, 107, 251, 242, 17, 109, 251, 242, 17, 138, + 251, 242, 17, 134, 251, 242, 17, 150, 251, 242, 17, 169, 251, 242, 17, + 175, 251, 242, 17, 171, 251, 242, 17, 178, 251, 242, 31, 199, 95, 251, + 242, 31, 197, 32, 251, 242, 3, 2, 205, 54, 251, 242, 3, 205, 54, 251, + 242, 3, 206, 54, 251, 242, 16, 195, 69, 251, 242, 1, 247, 162, 251, 242, + 1, 197, 132, 251, 242, 1, 197, 120, 251, 242, 1, 237, 193, 251, 242, 1, + 237, 177, 251, 242, 1, 213, 81, 251, 242, 1, 219, 75, 236, 163, 1, 65, + 236, 163, 1, 252, 208, 236, 163, 1, 68, 236, 163, 1, 223, 201, 236, 163, + 1, 66, 236, 163, 1, 196, 30, 236, 163, 1, 71, 236, 163, 1, 251, 238, 236, + 163, 1, 74, 236, 163, 1, 250, 165, 236, 163, 1, 155, 236, 163, 1, 221, + 217, 236, 163, 1, 231, 242, 236, 163, 1, 231, 93, 236, 163, 1, 214, 70, + 236, 163, 1, 247, 162, 236, 163, 1, 247, 3, 236, 163, 1, 223, 34, 236, + 163, 1, 222, 254, 236, 163, 1, 212, 103, 236, 163, 1, 197, 132, 236, 163, + 1, 197, 120, 236, 163, 1, 237, 193, 236, 163, 1, 237, 177, 236, 163, 1, + 213, 81, 236, 163, 1, 190, 190, 236, 163, 1, 199, 49, 236, 163, 1, 238, + 34, 236, 163, 1, 237, 70, 236, 163, 1, 181, 236, 163, 1, 168, 236, 163, + 1, 209, 230, 236, 163, 1, 249, 155, 236, 163, 1, 248, 205, 236, 163, 1, + 174, 236, 163, 1, 170, 236, 163, 1, 165, 236, 163, 1, 173, 236, 163, 1, + 195, 188, 236, 163, 1, 203, 166, 236, 163, 1, 201, 176, 236, 163, 1, 188, + 236, 163, 1, 140, 236, 163, 1, 206, 110, 236, 163, 18, 3, 252, 208, 236, + 163, 18, 3, 68, 236, 163, 18, 3, 223, 201, 236, 163, 18, 3, 66, 236, 163, + 18, 3, 196, 30, 236, 163, 18, 3, 117, 146, 236, 163, 18, 3, 117, 206, + 111, 236, 163, 18, 3, 71, 236, 163, 18, 3, 251, 238, 236, 163, 18, 3, 74, + 236, 163, 18, 3, 250, 165, 236, 163, 3, 251, 73, 236, 163, 3, 195, 35, + 236, 163, 3, 195, 40, 236, 163, 3, 212, 143, 236, 163, 252, 70, 56, 193, + 156, 242, 255, 6, 1, 214, 69, 193, 156, 242, 255, 6, 1, 65, 193, 156, + 242, 255, 6, 1, 193, 86, 193, 156, 242, 255, 6, 1, 191, 225, 193, 156, + 242, 255, 6, 1, 170, 193, 156, 242, 255, 6, 1, 192, 12, 193, 156, 242, + 255, 6, 1, 223, 201, 193, 156, 242, 255, 6, 1, 196, 30, 193, 156, 242, + 255, 6, 1, 71, 193, 156, 242, 255, 6, 1, 74, 193, 156, 242, 255, 6, 1, + 251, 124, 193, 156, 242, 255, 6, 1, 231, 242, 193, 156, 242, 255, 6, 1, + 221, 69, 193, 156, 242, 255, 6, 1, 234, 68, 193, 156, 242, 255, 6, 1, + 191, 204, 193, 156, 242, 255, 6, 1, 196, 160, 193, 156, 242, 255, 6, 1, + 234, 87, 193, 156, 242, 255, 6, 1, 211, 156, 193, 156, 242, 255, 6, 1, + 197, 127, 193, 156, 242, 255, 6, 1, 212, 129, 193, 156, 242, 255, 6, 1, + 238, 34, 193, 156, 242, 255, 6, 1, 250, 184, 193, 156, 242, 255, 6, 1, + 251, 151, 193, 156, 242, 255, 6, 1, 248, 12, 193, 156, 242, 255, 6, 1, + 208, 167, 193, 156, 242, 255, 6, 1, 229, 117, 193, 156, 242, 255, 6, 1, + 229, 5, 193, 156, 242, 255, 6, 1, 228, 187, 193, 156, 242, 255, 6, 1, + 230, 21, 193, 156, 242, 255, 6, 1, 201, 127, 193, 156, 242, 255, 6, 1, + 202, 194, 193, 156, 242, 255, 6, 1, 195, 25, 193, 156, 242, 255, 2, 1, + 214, 69, 193, 156, 242, 255, 2, 1, 65, 193, 156, 242, 255, 2, 1, 193, 86, + 193, 156, 242, 255, 2, 1, 191, 225, 193, 156, 242, 255, 2, 1, 170, 193, + 156, 242, 255, 2, 1, 192, 12, 193, 156, 242, 255, 2, 1, 223, 201, 193, + 156, 242, 255, 2, 1, 196, 30, 193, 156, 242, 255, 2, 1, 71, 193, 156, + 242, 255, 2, 1, 74, 193, 156, 242, 255, 2, 1, 251, 124, 193, 156, 242, + 255, 2, 1, 231, 242, 193, 156, 242, 255, 2, 1, 221, 69, 193, 156, 242, + 255, 2, 1, 234, 68, 193, 156, 242, 255, 2, 1, 191, 204, 193, 156, 242, + 255, 2, 1, 196, 160, 193, 156, 242, 255, 2, 1, 234, 87, 193, 156, 242, + 255, 2, 1, 211, 156, 193, 156, 242, 255, 2, 1, 197, 127, 193, 156, 242, + 255, 2, 1, 212, 129, 193, 156, 242, 255, 2, 1, 238, 34, 193, 156, 242, + 255, 2, 1, 250, 184, 193, 156, 242, 255, 2, 1, 251, 151, 193, 156, 242, + 255, 2, 1, 248, 12, 193, 156, 242, 255, 2, 1, 208, 167, 193, 156, 242, + 255, 2, 1, 229, 117, 193, 156, 242, 255, 2, 1, 229, 5, 193, 156, 242, + 255, 2, 1, 228, 187, 193, 156, 242, 255, 2, 1, 230, 21, 193, 156, 242, + 255, 2, 1, 201, 127, 193, 156, 242, 255, 2, 1, 202, 194, 193, 156, 242, + 255, 2, 1, 195, 25, 193, 156, 242, 255, 17, 191, 77, 193, 156, 242, 255, + 17, 107, 193, 156, 242, 255, 17, 109, 193, 156, 242, 255, 17, 138, 193, + 156, 242, 255, 17, 134, 193, 156, 242, 255, 17, 150, 193, 156, 242, 255, + 17, 169, 193, 156, 242, 255, 17, 175, 193, 156, 242, 255, 17, 171, 193, + 156, 242, 255, 17, 178, 193, 156, 242, 255, 31, 199, 95, 193, 156, 242, + 255, 31, 197, 32, 193, 156, 242, 255, 31, 198, 249, 193, 156, 242, 255, + 31, 232, 137, 193, 156, 242, 255, 31, 233, 17, 193, 156, 242, 255, 31, + 202, 121, 193, 156, 242, 255, 31, 203, 242, 193, 156, 242, 255, 31, 234, + 155, 193, 156, 242, 255, 31, 213, 171, 193, 156, 242, 255, 211, 115, 236, + 211, 251, 211, 1, 65, 236, 211, 251, 211, 1, 252, 208, 236, 211, 251, + 211, 1, 68, 236, 211, 251, 211, 1, 223, 201, 236, 211, 251, 211, 1, 66, + 236, 211, 251, 211, 1, 196, 30, 236, 211, 251, 211, 1, 71, 236, 211, 251, + 211, 1, 74, 236, 211, 251, 211, 1, 155, 236, 211, 251, 211, 1, 221, 217, + 236, 211, 251, 211, 1, 231, 242, 236, 211, 251, 211, 1, 231, 93, 236, + 211, 251, 211, 1, 214, 70, 236, 211, 251, 211, 1, 247, 162, 236, 211, + 251, 211, 1, 247, 3, 236, 211, 251, 211, 1, 223, 34, 236, 211, 251, 211, + 1, 212, 103, 236, 211, 251, 211, 1, 197, 132, 236, 211, 251, 211, 1, 237, + 193, 236, 211, 251, 211, 1, 237, 177, 236, 211, 251, 211, 1, 213, 81, + 236, 211, 251, 211, 1, 190, 190, 236, 211, 251, 211, 1, 199, 49, 236, + 211, 251, 211, 1, 238, 34, 236, 211, 251, 211, 1, 237, 70, 236, 211, 251, + 211, 1, 181, 236, 211, 251, 211, 1, 168, 236, 211, 251, 211, 1, 209, 230, + 236, 211, 251, 211, 1, 249, 155, 236, 211, 251, 211, 1, 248, 205, 236, + 211, 251, 211, 1, 174, 236, 211, 251, 211, 1, 170, 236, 211, 251, 211, 1, + 191, 175, 236, 211, 251, 211, 1, 165, 236, 211, 251, 211, 1, 173, 236, + 211, 251, 211, 1, 195, 188, 236, 211, 251, 211, 1, 203, 166, 236, 211, + 251, 211, 1, 201, 176, 236, 211, 251, 211, 1, 188, 236, 211, 251, 211, 1, + 140, 236, 211, 251, 211, 1, 219, 75, 236, 211, 251, 211, 1, 191, 123, + 236, 211, 251, 211, 18, 3, 252, 208, 236, 211, 251, 211, 18, 3, 68, 236, + 211, 251, 211, 18, 3, 223, 201, 236, 211, 251, 211, 18, 3, 66, 236, 211, + 251, 211, 18, 3, 196, 30, 236, 211, 251, 211, 18, 3, 71, 236, 211, 251, + 211, 18, 3, 251, 238, 236, 211, 251, 211, 18, 3, 74, 236, 211, 251, 211, + 3, 251, 73, 236, 211, 251, 211, 3, 247, 121, 236, 211, 251, 211, 3, 230, + 74, 236, 211, 251, 211, 195, 40, 236, 211, 251, 211, 208, 229, 214, 216, + 56, 236, 211, 251, 211, 216, 219, 170, 236, 211, 251, 211, 89, 165, 236, + 211, 251, 211, 216, 219, 165, 236, 211, 251, 211, 3, 212, 143, 236, 211, + 251, 211, 55, 237, 240, 236, 211, 251, 211, 231, 206, 233, 5, 236, 211, + 251, 211, 234, 97, 79, 199, 54, 77, 236, 211, 251, 211, 17, 191, 77, 236, + 211, 251, 211, 17, 107, 236, 211, 251, 211, 17, 109, 236, 211, 251, 211, + 17, 138, 236, 211, 251, 211, 17, 134, 236, 211, 251, 211, 17, 150, 236, + 211, 251, 211, 17, 169, 236, 211, 251, 211, 17, 175, 236, 211, 251, 211, + 17, 171, 236, 211, 251, 211, 17, 178, 214, 225, 1, 65, 214, 225, 1, 252, + 208, 214, 225, 1, 68, 214, 225, 1, 223, 201, 214, 225, 1, 66, 214, 225, + 1, 196, 30, 214, 225, 1, 117, 146, 214, 225, 1, 117, 206, 111, 214, 225, + 1, 71, 214, 225, 1, 251, 238, 214, 225, 1, 74, 214, 225, 1, 250, 165, + 214, 225, 1, 155, 214, 225, 1, 221, 217, 214, 225, 1, 231, 242, 214, 225, + 1, 231, 93, 214, 225, 1, 214, 70, 214, 225, 1, 247, 162, 214, 225, 1, + 247, 3, 214, 225, 1, 223, 34, 214, 225, 1, 222, 254, 214, 225, 1, 212, + 103, 214, 225, 1, 197, 132, 214, 225, 1, 197, 120, 214, 225, 1, 237, 193, + 214, 225, 1, 237, 177, 214, 225, 1, 213, 81, 214, 225, 1, 190, 190, 214, + 225, 1, 199, 49, 214, 225, 1, 238, 34, 214, 225, 1, 237, 70, 214, 225, 1, + 181, 214, 225, 1, 168, 214, 225, 1, 209, 230, 214, 225, 1, 249, 155, 214, + 225, 1, 248, 205, 214, 225, 1, 174, 214, 225, 1, 170, 214, 225, 1, 165, + 214, 225, 1, 173, 214, 225, 1, 195, 188, 214, 225, 1, 203, 166, 214, 225, + 1, 201, 176, 214, 225, 1, 188, 214, 225, 1, 140, 214, 225, 1, 219, 75, + 214, 225, 1, 206, 110, 214, 225, 18, 3, 252, 208, 214, 225, 18, 3, 68, + 214, 225, 18, 3, 223, 201, 214, 225, 18, 3, 66, 214, 225, 18, 3, 196, 30, + 214, 225, 18, 3, 117, 146, 214, 225, 18, 3, 117, 206, 111, 214, 225, 18, + 3, 71, 214, 225, 18, 3, 251, 238, 214, 225, 18, 3, 74, 214, 225, 18, 3, + 250, 165, 214, 225, 3, 251, 73, 214, 225, 3, 195, 35, 214, 225, 3, 195, + 40, 214, 225, 3, 250, 147, 214, 225, 3, 202, 211, 214, 225, 229, 229, + 214, 225, 18, 3, 208, 209, 71, 191, 106, 51, 1, 65, 191, 106, 51, 18, 3, 68, 191, 106, 51, 18, 3, 196, 152, 191, 106, 51, 18, 3, 66, 191, 106, 51, - 18, 3, 71, 191, 106, 51, 18, 3, 211, 151, 191, 106, 51, 18, 3, 74, 191, - 106, 51, 18, 3, 251, 236, 191, 106, 51, 18, 3, 250, 163, 191, 106, 51, - 18, 3, 207, 18, 68, 191, 106, 51, 18, 219, 198, 77, 191, 106, 51, 1, 155, - 191, 106, 51, 1, 221, 215, 191, 106, 51, 1, 231, 240, 191, 106, 51, 1, - 231, 91, 191, 106, 51, 1, 214, 68, 191, 106, 51, 1, 247, 160, 191, 106, - 51, 1, 247, 1, 191, 106, 51, 1, 223, 32, 191, 106, 51, 1, 212, 101, 191, + 18, 3, 71, 191, 106, 51, 18, 3, 211, 153, 191, 106, 51, 18, 3, 74, 191, + 106, 51, 18, 3, 251, 238, 191, 106, 51, 18, 3, 250, 165, 191, 106, 51, + 18, 3, 207, 19, 68, 191, 106, 51, 18, 219, 200, 77, 191, 106, 51, 1, 155, + 191, 106, 51, 1, 221, 217, 191, 106, 51, 1, 231, 242, 191, 106, 51, 1, + 231, 93, 191, 106, 51, 1, 214, 70, 191, 106, 51, 1, 247, 162, 191, 106, + 51, 1, 247, 3, 191, 106, 51, 1, 223, 34, 191, 106, 51, 1, 212, 103, 191, 106, 51, 1, 197, 132, 191, 106, 51, 1, 197, 120, 191, 106, 51, 1, 237, - 191, 191, 106, 51, 1, 237, 175, 191, 106, 51, 1, 213, 79, 191, 106, 51, - 1, 190, 190, 191, 106, 51, 1, 199, 49, 191, 106, 51, 1, 238, 32, 191, - 106, 51, 1, 237, 68, 191, 106, 51, 1, 180, 191, 106, 51, 1, 168, 191, - 106, 51, 1, 209, 228, 191, 106, 51, 1, 249, 153, 191, 106, 51, 1, 248, - 203, 191, 106, 51, 1, 174, 191, 106, 51, 1, 197, 168, 191, 106, 51, 1, - 197, 157, 191, 106, 51, 1, 235, 35, 191, 106, 51, 1, 235, 29, 191, 106, - 51, 1, 191, 71, 191, 106, 51, 1, 191, 123, 191, 106, 51, 1, 255, 214, + 193, 191, 106, 51, 1, 237, 177, 191, 106, 51, 1, 213, 81, 191, 106, 51, + 1, 190, 190, 191, 106, 51, 1, 199, 49, 191, 106, 51, 1, 238, 34, 191, + 106, 51, 1, 237, 70, 191, 106, 51, 1, 181, 191, 106, 51, 1, 168, 191, + 106, 51, 1, 209, 230, 191, 106, 51, 1, 249, 155, 191, 106, 51, 1, 248, + 205, 191, 106, 51, 1, 174, 191, 106, 51, 1, 197, 168, 191, 106, 51, 1, + 197, 157, 191, 106, 51, 1, 235, 37, 191, 106, 51, 1, 235, 31, 191, 106, + 51, 1, 191, 71, 191, 106, 51, 1, 191, 123, 191, 106, 51, 1, 255, 216, 191, 106, 51, 1, 170, 191, 106, 51, 1, 165, 191, 106, 51, 1, 173, 191, - 106, 51, 1, 195, 188, 191, 106, 51, 1, 203, 165, 191, 106, 51, 1, 201, - 175, 191, 106, 51, 1, 188, 191, 106, 51, 1, 140, 191, 106, 51, 1, 220, - 246, 191, 106, 51, 53, 120, 77, 191, 106, 51, 3, 195, 40, 191, 106, 51, - 3, 247, 119, 191, 106, 51, 3, 247, 120, 4, 211, 42, 191, 106, 51, 3, 247, - 122, 4, 211, 42, 191, 106, 51, 3, 251, 71, 191, 106, 51, 3, 195, 35, 191, - 106, 51, 242, 201, 1, 165, 191, 106, 51, 242, 202, 1, 170, 191, 106, 51, - 242, 202, 1, 165, 191, 106, 51, 242, 202, 1, 173, 191, 106, 51, 242, 202, - 1, 195, 188, 191, 106, 51, 89, 229, 236, 77, 191, 106, 51, 242, 215, 229, - 236, 77, 191, 106, 51, 87, 197, 152, 191, 106, 51, 87, 203, 157, 191, - 106, 51, 87, 55, 203, 157, 191, 106, 51, 87, 179, 197, 152, 191, 106, 51, - 89, 235, 130, 229, 236, 77, 191, 106, 51, 242, 215, 235, 130, 229, 236, - 77, 191, 106, 51, 200, 238, 201, 251, 1, 65, 201, 251, 18, 3, 68, 201, - 251, 18, 3, 196, 152, 201, 251, 18, 3, 66, 201, 251, 18, 3, 71, 201, 251, - 18, 3, 74, 201, 251, 18, 3, 211, 151, 201, 251, 18, 3, 251, 236, 201, - 251, 18, 3, 250, 163, 201, 251, 18, 3, 117, 146, 201, 251, 18, 3, 117, - 172, 201, 251, 18, 219, 198, 77, 201, 251, 1, 155, 201, 251, 1, 221, 215, - 201, 251, 1, 231, 240, 201, 251, 1, 231, 91, 201, 251, 1, 214, 68, 201, - 251, 1, 247, 160, 201, 251, 1, 247, 1, 201, 251, 1, 223, 32, 201, 251, 1, - 222, 252, 201, 251, 1, 212, 101, 201, 251, 1, 197, 132, 201, 251, 1, 197, - 120, 201, 251, 1, 237, 191, 201, 251, 1, 237, 175, 201, 251, 1, 213, 79, - 201, 251, 1, 190, 190, 201, 251, 1, 199, 49, 201, 251, 1, 238, 32, 201, - 251, 1, 237, 68, 201, 251, 1, 180, 201, 251, 1, 168, 201, 251, 1, 209, - 228, 201, 251, 1, 249, 153, 201, 251, 1, 248, 203, 201, 251, 1, 174, 201, - 251, 1, 197, 168, 201, 251, 1, 197, 157, 201, 251, 1, 235, 35, 201, 251, - 1, 191, 71, 201, 251, 1, 191, 123, 201, 251, 1, 255, 214, 201, 251, 1, - 170, 201, 251, 1, 165, 201, 251, 1, 173, 201, 251, 1, 195, 188, 201, 251, - 1, 203, 165, 201, 251, 1, 201, 175, 201, 251, 1, 188, 201, 251, 1, 140, - 201, 251, 1, 220, 246, 201, 251, 3, 222, 237, 201, 251, 3, 196, 75, 201, - 251, 242, 201, 1, 165, 201, 251, 242, 201, 1, 173, 201, 251, 242, 201, 1, - 203, 165, 201, 251, 242, 201, 1, 188, 201, 251, 53, 120, 3, 232, 51, 201, - 251, 53, 120, 3, 222, 152, 201, 251, 53, 120, 3, 214, 70, 201, 251, 53, - 120, 3, 238, 127, 201, 251, 53, 120, 3, 215, 61, 201, 251, 53, 120, 3, - 250, 120, 201, 251, 53, 120, 3, 218, 168, 201, 251, 53, 120, 3, 146, 201, - 251, 53, 120, 3, 172, 201, 251, 53, 120, 3, 203, 167, 201, 251, 53, 120, - 3, 206, 8, 201, 251, 53, 120, 3, 255, 214, 201, 251, 3, 251, 71, 201, - 251, 3, 195, 35, 201, 251, 231, 153, 77, 201, 251, 200, 238, 201, 251, - 87, 197, 152, 201, 251, 87, 203, 157, 201, 251, 87, 55, 203, 157, 201, - 251, 87, 209, 79, 201, 251, 229, 236, 87, 4, 215, 206, 23, 200, 199, 23, - 197, 225, 232, 210, 201, 251, 229, 236, 87, 4, 215, 206, 23, 200, 199, - 23, 232, 210, 201, 251, 229, 236, 87, 4, 215, 206, 23, 200, 198, 201, - 251, 199, 81, 217, 55, 201, 251, 199, 81, 217, 54, 21, 22, 214, 207, 229, - 158, 21, 22, 214, 207, 229, 130, 21, 22, 214, 207, 229, 23, 21, 22, 214, - 207, 228, 252, 21, 22, 214, 207, 140, 21, 22, 214, 207, 230, 91, 21, 22, - 214, 207, 203, 15, 21, 22, 214, 207, 203, 14, 21, 22, 214, 207, 203, 11, - 21, 22, 214, 207, 203, 10, 21, 22, 214, 207, 203, 17, 21, 22, 214, 207, - 203, 16, 21, 22, 201, 237, 21, 22, 201, 224, 21, 22, 201, 207, 21, 22, - 201, 249, 210, 81, 243, 15, 230, 3, 1, 168, 210, 81, 243, 15, 230, 3, 1, - 155, 210, 81, 243, 15, 230, 3, 1, 173, 210, 81, 243, 15, 230, 3, 1, 174, - 210, 81, 243, 15, 230, 3, 1, 238, 32, 210, 81, 243, 15, 230, 3, 1, 191, - 123, 210, 81, 243, 15, 230, 3, 1, 195, 188, 210, 81, 243, 15, 230, 3, 1, - 214, 68, 210, 81, 243, 15, 230, 3, 1, 140, 210, 81, 243, 15, 230, 3, 1, - 231, 240, 210, 81, 243, 15, 230, 3, 1, 221, 215, 210, 81, 243, 15, 230, - 3, 1, 188, 210, 81, 243, 15, 230, 3, 1, 249, 153, 210, 81, 243, 15, 230, - 3, 1, 247, 160, 210, 81, 243, 15, 230, 3, 1, 190, 190, 210, 81, 243, 15, - 230, 3, 1, 199, 49, 210, 81, 243, 15, 230, 3, 1, 180, 210, 81, 243, 15, - 230, 3, 1, 209, 228, 210, 81, 243, 15, 230, 3, 1, 165, 210, 81, 243, 15, - 230, 3, 1, 233, 109, 210, 81, 243, 15, 230, 3, 1, 247, 1, 210, 81, 243, - 15, 230, 3, 1, 65, 210, 81, 243, 15, 230, 3, 1, 71, 210, 81, 243, 15, - 230, 3, 1, 68, 210, 81, 243, 15, 230, 3, 1, 74, 210, 81, 243, 15, 230, 3, - 1, 66, 210, 81, 243, 15, 230, 3, 1, 196, 168, 210, 81, 243, 15, 230, 3, - 1, 228, 35, 210, 81, 243, 15, 230, 3, 1, 53, 210, 236, 210, 81, 243, 15, - 230, 3, 1, 53, 222, 152, 210, 81, 243, 15, 230, 3, 1, 53, 200, 43, 210, - 81, 243, 15, 230, 3, 1, 53, 218, 168, 210, 81, 243, 15, 230, 3, 1, 53, - 215, 61, 210, 81, 243, 15, 230, 3, 1, 53, 172, 210, 81, 243, 15, 230, 3, - 1, 53, 193, 224, 210, 81, 243, 15, 230, 3, 1, 53, 214, 70, 210, 81, 243, - 15, 230, 3, 1, 53, 192, 159, 210, 81, 243, 15, 230, 3, 206, 180, 163, - 219, 19, 210, 81, 243, 15, 230, 3, 206, 180, 198, 79, 210, 81, 243, 15, - 230, 3, 205, 138, 231, 11, 201, 63, 210, 81, 243, 15, 230, 3, 206, 180, - 163, 179, 232, 255, 210, 81, 243, 15, 230, 3, 206, 180, 163, 232, 255, - 210, 81, 243, 15, 230, 3, 205, 138, 231, 11, 201, 64, 232, 255, 210, 81, - 243, 15, 230, 3, 205, 138, 163, 219, 19, 210, 81, 243, 15, 230, 3, 205, - 138, 198, 79, 210, 81, 243, 15, 230, 3, 205, 138, 163, 179, 232, 255, - 210, 81, 243, 15, 230, 3, 205, 138, 163, 232, 255, 210, 81, 243, 15, 230, - 3, 216, 85, 198, 79, 210, 81, 243, 15, 230, 3, 231, 11, 201, 64, 195, - 167, 210, 81, 243, 15, 230, 3, 216, 85, 163, 179, 232, 255, 210, 81, 243, - 15, 230, 3, 216, 85, 163, 232, 255, 210, 81, 243, 15, 230, 3, 218, 239, - 163, 219, 19, 210, 81, 243, 15, 230, 3, 218, 239, 198, 79, 210, 81, 243, - 15, 230, 3, 231, 11, 201, 63, 210, 81, 243, 15, 230, 3, 218, 239, 163, - 179, 232, 255, 210, 81, 243, 15, 230, 3, 218, 239, 163, 232, 255, 210, - 81, 243, 15, 230, 3, 231, 11, 201, 64, 232, 255, 100, 229, 236, 77, 100, - 229, 236, 87, 4, 229, 227, 100, 3, 248, 199, 100, 3, 248, 200, 4, 102, - 100, 3, 233, 205, 248, 199, 100, 3, 233, 205, 248, 200, 4, 102, 100, 3, - 193, 102, 232, 225, 248, 199, 100, 3, 193, 102, 213, 174, 248, 199, 100, - 3, 207, 18, 213, 174, 248, 199, 100, 3, 216, 43, 248, 201, 1, 65, 248, - 201, 1, 252, 206, 248, 201, 1, 68, 248, 201, 1, 223, 199, 248, 201, 1, - 66, 248, 201, 1, 196, 30, 248, 201, 1, 117, 146, 248, 201, 1, 117, 206, - 110, 248, 201, 1, 117, 172, 248, 201, 1, 71, 248, 201, 1, 251, 236, 248, - 201, 1, 74, 248, 201, 1, 250, 163, 248, 201, 1, 155, 248, 201, 1, 221, - 215, 248, 201, 1, 231, 240, 248, 201, 1, 231, 91, 248, 201, 1, 214, 68, - 248, 201, 1, 247, 160, 248, 201, 1, 247, 1, 248, 201, 1, 223, 32, 248, - 201, 1, 222, 252, 248, 201, 1, 212, 101, 248, 201, 1, 197, 132, 248, 201, - 1, 197, 120, 248, 201, 1, 237, 191, 248, 201, 1, 237, 175, 248, 201, 1, - 213, 79, 248, 201, 1, 190, 190, 248, 201, 1, 199, 49, 248, 201, 1, 238, - 32, 248, 201, 1, 237, 68, 248, 201, 1, 180, 248, 201, 1, 168, 248, 201, - 1, 209, 228, 248, 201, 1, 249, 153, 248, 201, 1, 248, 203, 248, 201, 1, - 174, 248, 201, 1, 170, 248, 201, 1, 165, 248, 201, 1, 173, 248, 201, 1, - 195, 188, 248, 201, 1, 203, 165, 248, 201, 1, 201, 175, 248, 201, 1, 188, - 248, 201, 1, 140, 248, 201, 18, 3, 252, 206, 248, 201, 18, 3, 68, 248, - 201, 18, 3, 223, 199, 248, 201, 18, 3, 66, 248, 201, 18, 3, 196, 30, 248, - 201, 18, 3, 117, 146, 248, 201, 18, 3, 117, 206, 110, 248, 201, 18, 3, - 117, 172, 248, 201, 18, 3, 71, 248, 201, 18, 3, 251, 236, 248, 201, 18, - 3, 74, 248, 201, 18, 3, 250, 163, 248, 201, 3, 247, 119, 248, 201, 3, - 251, 71, 248, 201, 3, 195, 35, 248, 201, 3, 195, 40, 248, 201, 3, 250, - 145, 248, 201, 237, 238, 248, 201, 55, 237, 238, 248, 201, 193, 23, 204, - 10, 248, 201, 231, 204, 233, 2, 248, 201, 231, 204, 233, 1, 248, 201, 17, - 191, 77, 248, 201, 17, 107, 248, 201, 17, 109, 248, 201, 17, 138, 248, - 201, 17, 134, 248, 201, 17, 149, 248, 201, 17, 169, 248, 201, 17, 175, - 248, 201, 17, 171, 248, 201, 17, 178, 248, 201, 31, 107, 248, 201, 31, - 109, 248, 201, 31, 138, 248, 201, 31, 134, 248, 201, 31, 149, 248, 201, - 31, 169, 248, 201, 31, 175, 248, 201, 31, 171, 248, 201, 31, 178, 248, - 201, 31, 199, 95, 248, 201, 31, 197, 32, 248, 201, 31, 198, 249, 248, - 201, 31, 232, 135, 248, 201, 31, 233, 15, 248, 201, 31, 202, 120, 248, - 201, 31, 203, 241, 248, 201, 31, 234, 153, 248, 201, 31, 213, 169, 248, - 201, 228, 139, 196, 91, 77, 217, 57, 229, 236, 77, 217, 57, 87, 203, 157, - 217, 57, 1, 155, 217, 57, 1, 221, 215, 217, 57, 1, 231, 240, 217, 57, 1, - 214, 68, 217, 57, 1, 247, 160, 217, 57, 1, 247, 1, 217, 57, 1, 223, 32, - 217, 57, 1, 212, 101, 217, 57, 1, 190, 190, 217, 57, 1, 199, 49, 217, 57, - 1, 238, 32, 217, 57, 1, 180, 217, 57, 1, 168, 217, 57, 1, 209, 228, 217, - 57, 1, 249, 153, 217, 57, 1, 174, 217, 57, 1, 197, 168, 217, 57, 1, 197, - 157, 217, 57, 1, 235, 35, 217, 57, 1, 193, 190, 217, 57, 1, 191, 71, 217, - 57, 1, 191, 123, 217, 57, 1, 255, 214, 217, 57, 1, 170, 217, 57, 1, 165, - 217, 57, 1, 173, 217, 57, 1, 203, 165, 217, 57, 1, 188, 217, 57, 1, 140, - 217, 57, 1, 65, 217, 57, 200, 239, 1, 155, 217, 57, 200, 239, 1, 221, - 215, 217, 57, 200, 239, 1, 231, 240, 217, 57, 200, 239, 1, 214, 68, 217, - 57, 200, 239, 1, 247, 160, 217, 57, 200, 239, 1, 247, 1, 217, 57, 200, - 239, 1, 223, 32, 217, 57, 200, 239, 1, 212, 101, 217, 57, 200, 239, 1, - 190, 190, 217, 57, 200, 239, 1, 199, 49, 217, 57, 200, 239, 1, 238, 32, - 217, 57, 200, 239, 1, 180, 217, 57, 200, 239, 1, 168, 217, 57, 200, 239, - 1, 209, 228, 217, 57, 200, 239, 1, 249, 153, 217, 57, 200, 239, 1, 174, - 217, 57, 200, 239, 1, 197, 168, 217, 57, 200, 239, 1, 197, 157, 217, 57, - 200, 239, 1, 235, 35, 217, 57, 200, 239, 1, 193, 190, 217, 57, 200, 239, - 1, 191, 71, 217, 57, 200, 239, 1, 191, 123, 217, 57, 200, 239, 1, 170, - 217, 57, 200, 239, 1, 165, 217, 57, 200, 239, 1, 173, 217, 57, 200, 239, - 1, 203, 165, 217, 57, 200, 239, 1, 188, 217, 57, 200, 239, 1, 140, 217, - 57, 200, 239, 1, 65, 217, 57, 18, 3, 252, 206, 217, 57, 18, 3, 68, 217, - 57, 18, 3, 66, 217, 57, 18, 3, 71, 217, 57, 18, 3, 74, 217, 57, 3, 251, - 71, 217, 57, 3, 247, 119, 217, 41, 129, 1, 65, 217, 41, 129, 1, 252, 206, - 217, 41, 129, 1, 68, 217, 41, 129, 1, 223, 199, 217, 41, 129, 1, 66, 217, - 41, 129, 1, 196, 30, 217, 41, 129, 1, 71, 217, 41, 129, 1, 251, 236, 217, - 41, 129, 1, 74, 217, 41, 129, 1, 250, 163, 217, 41, 129, 1, 155, 217, 41, - 129, 1, 221, 215, 217, 41, 129, 1, 231, 240, 217, 41, 129, 1, 231, 91, - 217, 41, 129, 1, 214, 68, 217, 41, 129, 1, 247, 160, 217, 41, 129, 1, - 247, 1, 217, 41, 129, 1, 223, 32, 217, 41, 129, 1, 222, 252, 217, 41, - 129, 1, 212, 101, 217, 41, 129, 1, 197, 132, 217, 41, 129, 1, 197, 120, - 217, 41, 129, 1, 237, 191, 217, 41, 129, 1, 237, 175, 217, 41, 129, 1, - 213, 79, 217, 41, 129, 1, 190, 190, 217, 41, 129, 1, 199, 49, 217, 41, - 129, 1, 238, 32, 217, 41, 129, 1, 237, 68, 217, 41, 129, 1, 180, 217, 41, - 129, 1, 168, 217, 41, 129, 1, 209, 228, 217, 41, 129, 1, 249, 153, 217, - 41, 129, 1, 248, 203, 217, 41, 129, 1, 174, 217, 41, 129, 1, 170, 217, - 41, 129, 1, 165, 217, 41, 129, 1, 173, 217, 41, 129, 1, 195, 188, 217, - 41, 129, 1, 203, 165, 217, 41, 129, 1, 201, 175, 217, 41, 129, 1, 188, - 217, 41, 129, 1, 140, 217, 41, 129, 1, 219, 73, 217, 41, 129, 1, 220, - 246, 217, 41, 129, 1, 222, 202, 217, 41, 129, 1, 198, 26, 217, 41, 129, - 18, 3, 252, 206, 217, 41, 129, 18, 3, 68, 217, 41, 129, 18, 3, 223, 199, - 217, 41, 129, 18, 3, 66, 217, 41, 129, 18, 3, 196, 30, 217, 41, 129, 18, - 3, 117, 146, 217, 41, 129, 18, 3, 71, 217, 41, 129, 18, 3, 251, 236, 217, - 41, 129, 18, 3, 74, 217, 41, 129, 18, 3, 250, 163, 217, 41, 129, 3, 251, - 71, 217, 41, 129, 3, 195, 35, 217, 41, 129, 3, 212, 141, 217, 41, 129, 3, - 247, 121, 217, 41, 129, 3, 230, 72, 217, 41, 129, 195, 40, 217, 41, 129, - 207, 44, 217, 41, 129, 207, 181, 217, 41, 129, 17, 191, 77, 217, 41, 129, - 17, 107, 217, 41, 129, 17, 109, 217, 41, 129, 17, 138, 217, 41, 129, 17, - 134, 217, 41, 129, 17, 149, 217, 41, 129, 17, 169, 217, 41, 129, 17, 175, - 217, 41, 129, 17, 171, 217, 41, 129, 17, 178, 230, 157, 129, 1, 65, 230, - 157, 129, 1, 252, 206, 230, 157, 129, 1, 68, 230, 157, 129, 1, 223, 199, - 230, 157, 129, 1, 66, 230, 157, 129, 1, 196, 30, 230, 157, 129, 1, 234, - 188, 230, 157, 129, 1, 251, 236, 230, 157, 129, 1, 211, 87, 230, 157, - 129, 1, 250, 163, 230, 157, 129, 1, 170, 230, 157, 129, 1, 195, 188, 230, - 157, 129, 1, 249, 153, 230, 157, 129, 1, 248, 203, 230, 157, 129, 1, 174, - 230, 157, 129, 1, 155, 230, 157, 129, 1, 221, 215, 230, 157, 129, 1, 190, - 190, 230, 157, 129, 1, 199, 49, 230, 157, 129, 1, 173, 230, 157, 129, 1, - 231, 240, 230, 157, 129, 1, 231, 91, 230, 157, 129, 1, 238, 32, 230, 157, - 129, 1, 237, 68, 230, 157, 129, 1, 180, 230, 157, 129, 1, 247, 160, 230, - 157, 129, 1, 247, 1, 230, 157, 129, 1, 197, 132, 230, 157, 129, 1, 197, - 120, 230, 157, 129, 1, 219, 73, 230, 157, 129, 1, 223, 32, 230, 157, 129, - 1, 222, 252, 230, 157, 129, 1, 237, 191, 230, 157, 129, 1, 237, 175, 230, - 157, 129, 1, 214, 68, 230, 157, 129, 1, 168, 230, 157, 129, 1, 209, 228, - 230, 157, 129, 1, 140, 230, 157, 129, 1, 165, 230, 157, 129, 1, 188, 230, - 157, 129, 18, 3, 252, 206, 230, 157, 129, 18, 3, 68, 230, 157, 129, 18, - 3, 223, 199, 230, 157, 129, 18, 3, 66, 230, 157, 129, 18, 3, 196, 30, - 230, 157, 129, 18, 3, 234, 188, 230, 157, 129, 18, 3, 251, 236, 230, 157, - 129, 18, 3, 211, 87, 230, 157, 129, 18, 3, 250, 163, 230, 157, 129, 3, - 251, 71, 230, 157, 129, 3, 195, 35, 230, 157, 129, 195, 40, 230, 157, - 129, 211, 113, 230, 157, 129, 17, 191, 77, 230, 157, 129, 17, 107, 230, - 157, 129, 17, 109, 230, 157, 129, 17, 138, 230, 157, 129, 17, 134, 230, - 157, 129, 17, 149, 230, 157, 129, 17, 169, 230, 157, 129, 17, 175, 230, - 157, 129, 17, 171, 230, 157, 129, 17, 178, 217, 102, 1, 155, 217, 102, 1, - 231, 240, 217, 102, 1, 214, 68, 217, 102, 1, 168, 217, 102, 1, 249, 153, - 217, 102, 1, 174, 217, 102, 1, 190, 190, 217, 102, 1, 238, 32, 217, 102, - 1, 180, 217, 102, 1, 247, 160, 217, 102, 1, 223, 32, 217, 102, 1, 212, - 101, 217, 102, 1, 170, 217, 102, 1, 165, 217, 102, 1, 173, 217, 102, 1, - 195, 188, 217, 102, 1, 188, 217, 102, 1, 65, 217, 102, 251, 118, 217, - 102, 18, 3, 68, 217, 102, 18, 3, 66, 217, 102, 18, 3, 71, 217, 102, 18, - 3, 74, 217, 102, 210, 94, 217, 102, 234, 95, 79, 205, 53, 222, 33, 3, - 247, 119, 222, 33, 3, 251, 71, 222, 33, 3, 207, 44, 222, 33, 3, 195, 35, - 222, 33, 1, 65, 222, 33, 1, 252, 206, 222, 33, 1, 68, 222, 33, 1, 223, - 199, 222, 33, 1, 66, 222, 33, 1, 196, 30, 222, 33, 1, 117, 146, 222, 33, - 1, 117, 206, 110, 222, 33, 1, 117, 172, 222, 33, 1, 117, 219, 74, 222, - 33, 1, 71, 222, 33, 1, 251, 236, 222, 33, 1, 74, 222, 33, 1, 155, 222, - 33, 1, 221, 215, 222, 33, 1, 231, 240, 222, 33, 1, 231, 91, 222, 33, 1, - 214, 68, 222, 33, 1, 247, 160, 222, 33, 1, 247, 1, 222, 33, 1, 223, 32, - 222, 33, 1, 222, 252, 222, 33, 1, 212, 101, 222, 33, 1, 197, 132, 222, - 33, 1, 197, 120, 222, 33, 1, 237, 191, 222, 33, 1, 237, 175, 222, 33, 1, - 213, 79, 222, 33, 1, 190, 190, 222, 33, 1, 199, 49, 222, 33, 1, 238, 32, - 222, 33, 1, 237, 68, 222, 33, 1, 180, 222, 33, 1, 168, 222, 33, 1, 209, - 228, 222, 33, 1, 249, 153, 222, 33, 1, 248, 203, 222, 33, 1, 174, 222, - 33, 1, 170, 222, 33, 1, 165, 222, 33, 1, 173, 222, 33, 1, 193, 190, 222, - 33, 1, 203, 165, 222, 33, 1, 201, 175, 222, 33, 1, 188, 222, 33, 1, 140, - 222, 33, 1, 222, 202, 222, 33, 18, 3, 252, 206, 222, 33, 18, 3, 251, 157, - 252, 206, 222, 33, 18, 3, 68, 222, 33, 18, 3, 223, 199, 222, 33, 18, 3, - 66, 222, 33, 18, 3, 196, 30, 222, 33, 18, 3, 117, 146, 222, 33, 18, 3, - 71, 222, 33, 18, 3, 251, 236, 222, 33, 18, 3, 233, 242, 222, 33, 3, 221, - 143, 222, 33, 239, 45, 222, 33, 237, 238, 222, 33, 55, 237, 238, 222, 33, - 208, 152, 205, 54, 217, 51, 222, 33, 208, 152, 251, 157, 205, 54, 217, - 51, 222, 33, 208, 152, 232, 186, 222, 33, 208, 152, 201, 248, 233, 3, - 222, 33, 208, 152, 236, 140, 222, 33, 208, 152, 55, 236, 140, 222, 33, - 208, 152, 197, 225, 236, 140, 222, 33, 208, 152, 243, 10, 222, 33, 208, - 152, 233, 4, 243, 10, 222, 33, 208, 152, 201, 217, 222, 33, 208, 152, - 242, 215, 201, 217, 222, 33, 17, 191, 77, 222, 33, 17, 107, 222, 33, 17, - 109, 222, 33, 17, 138, 222, 33, 17, 134, 222, 33, 17, 149, 222, 33, 17, - 169, 222, 33, 17, 175, 222, 33, 17, 171, 222, 33, 17, 178, 219, 88, 1, - 192, 35, 44, 232, 118, 91, 198, 222, 44, 232, 118, 91, 211, 100, 44, 232, - 118, 91, 234, 156, 44, 232, 118, 91, 202, 118, 44, 232, 118, 91, 232, - 139, 44, 232, 118, 91, 198, 245, 44, 232, 118, 115, 234, 155, 44, 232, - 118, 115, 202, 117, 44, 232, 118, 91, 197, 35, 44, 232, 118, 91, 202, - 127, 44, 232, 118, 91, 202, 126, 44, 232, 118, 91, 199, 86, 44, 232, 118, - 91, 234, 159, 44, 232, 118, 115, 197, 34, 44, 232, 118, 115, 202, 125, - 44, 232, 118, 91, 233, 18, 44, 232, 118, 91, 208, 22, 44, 232, 118, 91, - 230, 69, 44, 232, 118, 91, 230, 68, 44, 232, 118, 115, 208, 20, 44, 232, - 118, 235, 121, 233, 93, 221, 144, 44, 3, 214, 104, 44, 3, 247, 6, 44, 3, - 252, 157, 44, 3, 196, 15, 44, 3, 215, 90, 44, 3, 220, 194, 44, 3, 210, - 85, 44, 3, 215, 135, 44, 3, 222, 124, 44, 3, 210, 164, 44, 3, 209, 39, - 44, 3, 195, 173, 44, 3, 210, 215, 44, 3, 220, 183, 44, 3, 195, 143, 44, - 193, 101, 238, 187, 56, 44, 235, 92, 238, 187, 56, 44, 220, 23, 56, 44, - 205, 159, 210, 167, 56, 44, 198, 21, 238, 230, 56, 44, 198, 21, 31, 56, - 44, 238, 169, 56, 44, 23, 211, 155, 56, 44, 201, 227, 56, 44, 198, 39, - 56, 44, 223, 163, 209, 22, 56, 44, 201, 96, 232, 98, 56, 44, 3, 215, 94, - 44, 3, 195, 181, 44, 208, 152, 234, 95, 79, 199, 53, 10, 3, 65, 10, 3, - 42, 25, 65, 10, 3, 42, 25, 249, 135, 10, 3, 42, 25, 231, 209, 199, 84, - 10, 3, 42, 25, 140, 10, 3, 42, 25, 223, 201, 10, 3, 42, 25, 220, 103, - 230, 155, 10, 3, 42, 25, 215, 101, 10, 3, 42, 25, 205, 185, 10, 3, 254, - 215, 10, 3, 252, 155, 10, 3, 252, 156, 25, 250, 207, 10, 3, 252, 156, 25, - 235, 74, 230, 155, 10, 3, 252, 156, 25, 231, 222, 10, 3, 252, 156, 25, - 231, 209, 199, 84, 10, 3, 252, 156, 25, 140, 10, 3, 252, 156, 25, 223, - 202, 230, 155, 10, 3, 252, 156, 25, 223, 172, 10, 3, 252, 156, 25, 220, - 104, 10, 3, 252, 156, 25, 203, 97, 10, 3, 252, 156, 25, 126, 108, 126, - 108, 66, 10, 3, 252, 156, 230, 155, 10, 3, 252, 72, 10, 3, 252, 73, 25, - 249, 114, 10, 3, 252, 73, 25, 231, 209, 199, 84, 10, 3, 252, 73, 25, 216, - 233, 108, 234, 103, 10, 3, 252, 73, 25, 203, 163, 10, 3, 252, 73, 25, - 199, 209, 10, 3, 252, 42, 10, 3, 251, 216, 10, 3, 251, 217, 25, 234, 28, - 10, 3, 251, 217, 25, 203, 59, 108, 231, 23, 10, 3, 251, 207, 10, 3, 251, - 208, 25, 251, 207, 10, 3, 251, 208, 25, 236, 253, 10, 3, 251, 208, 25, - 231, 23, 10, 3, 251, 208, 25, 140, 10, 3, 251, 208, 25, 222, 111, 10, 3, - 251, 208, 25, 221, 166, 10, 3, 251, 208, 25, 203, 113, 10, 3, 251, 208, - 25, 196, 38, 10, 3, 251, 203, 10, 3, 251, 190, 10, 3, 251, 145, 10, 3, - 251, 146, 25, 203, 113, 10, 3, 251, 132, 10, 3, 251, 133, 139, 251, 132, - 10, 3, 251, 133, 115, 198, 144, 10, 3, 251, 133, 108, 214, 241, 211, 63, - 251, 133, 108, 214, 240, 10, 3, 251, 133, 108, 214, 241, 201, 189, 10, 3, - 251, 91, 10, 3, 251, 60, 10, 3, 251, 26, 10, 3, 251, 27, 25, 220, 197, - 10, 3, 250, 254, 10, 3, 250, 215, 10, 3, 250, 209, 10, 3, 250, 210, 191, - 26, 199, 84, 10, 3, 250, 210, 222, 116, 199, 84, 10, 3, 250, 210, 139, - 250, 210, 197, 83, 139, 197, 83, 197, 83, 139, 197, 83, 210, 137, 10, 3, - 250, 210, 139, 250, 210, 139, 250, 209, 10, 3, 250, 210, 139, 250, 210, - 139, 250, 210, 238, 210, 250, 210, 139, 250, 210, 139, 250, 209, 10, 3, - 250, 207, 10, 3, 250, 203, 10, 3, 249, 153, 10, 3, 249, 135, 10, 3, 249, - 129, 10, 3, 249, 121, 10, 3, 249, 115, 10, 3, 249, 116, 139, 249, 115, - 10, 3, 249, 114, 10, 3, 164, 10, 3, 249, 87, 10, 3, 248, 188, 10, 3, 248, - 189, 25, 65, 10, 3, 248, 189, 25, 231, 200, 10, 3, 248, 189, 25, 223, - 202, 230, 155, 10, 3, 248, 10, 10, 3, 248, 11, 139, 248, 11, 252, 155, - 10, 3, 248, 11, 139, 248, 11, 196, 113, 10, 3, 248, 11, 238, 210, 248, - 10, 10, 3, 247, 242, 10, 3, 247, 243, 139, 247, 242, 10, 3, 247, 230, 10, - 3, 247, 229, 10, 3, 238, 32, 10, 3, 238, 22, 10, 3, 238, 23, 221, 125, - 25, 42, 108, 217, 39, 10, 3, 238, 23, 221, 125, 25, 251, 145, 10, 3, 238, - 23, 221, 125, 25, 249, 114, 10, 3, 238, 23, 221, 125, 25, 248, 188, 10, - 3, 238, 23, 221, 125, 25, 231, 240, 10, 3, 238, 23, 221, 125, 25, 231, - 241, 108, 217, 39, 10, 3, 238, 23, 221, 125, 25, 231, 53, 10, 3, 238, 23, - 221, 125, 25, 231, 32, 10, 3, 238, 23, 221, 125, 25, 230, 168, 10, 3, - 238, 23, 221, 125, 25, 140, 10, 3, 238, 23, 221, 125, 25, 223, 77, 10, 3, - 238, 23, 221, 125, 25, 223, 78, 108, 218, 225, 10, 3, 238, 23, 221, 125, - 25, 222, 96, 10, 3, 238, 23, 221, 125, 25, 173, 10, 3, 238, 23, 221, 125, - 25, 218, 225, 10, 3, 238, 23, 221, 125, 25, 218, 226, 108, 217, 38, 10, - 3, 238, 23, 221, 125, 25, 218, 208, 10, 3, 238, 23, 221, 125, 25, 214, - 121, 10, 3, 238, 23, 221, 125, 25, 210, 138, 108, 210, 137, 10, 3, 238, - 23, 221, 125, 25, 202, 222, 10, 3, 238, 23, 221, 125, 25, 199, 209, 10, - 3, 238, 23, 221, 125, 25, 196, 170, 108, 231, 32, 10, 3, 238, 23, 221, - 125, 25, 196, 38, 10, 3, 237, 250, 10, 3, 237, 225, 10, 3, 237, 224, 10, - 3, 237, 223, 10, 3, 237, 44, 10, 3, 237, 26, 10, 3, 236, 255, 10, 3, 237, - 0, 25, 203, 113, 10, 3, 236, 253, 10, 3, 236, 243, 10, 3, 236, 244, 222, - 55, 126, 230, 156, 236, 222, 10, 3, 236, 222, 10, 3, 235, 89, 10, 3, 235, - 90, 139, 235, 89, 10, 3, 235, 90, 230, 155, 10, 3, 235, 90, 203, 94, 10, - 3, 235, 87, 10, 3, 235, 88, 25, 234, 9, 10, 3, 235, 86, 10, 3, 235, 82, - 10, 3, 235, 81, 10, 3, 235, 80, 10, 3, 235, 75, 10, 3, 235, 73, 10, 3, - 235, 74, 230, 155, 10, 3, 235, 74, 230, 156, 230, 155, 10, 3, 235, 72, - 10, 3, 235, 65, 10, 3, 71, 10, 3, 235, 15, 25, 210, 137, 10, 3, 235, 15, - 139, 235, 15, 212, 131, 139, 212, 130, 10, 3, 234, 218, 10, 3, 234, 219, - 25, 42, 108, 230, 105, 108, 238, 32, 10, 3, 234, 219, 25, 231, 200, 10, - 3, 234, 219, 25, 216, 100, 10, 3, 234, 219, 25, 205, 169, 10, 3, 234, - 219, 25, 203, 113, 10, 3, 234, 219, 25, 66, 10, 3, 234, 190, 10, 3, 234, - 177, 10, 3, 234, 140, 10, 3, 234, 103, 10, 3, 234, 104, 25, 231, 208, 10, - 3, 234, 104, 25, 231, 209, 199, 84, 10, 3, 234, 104, 25, 216, 232, 10, 3, - 234, 104, 238, 210, 234, 103, 10, 3, 234, 104, 211, 63, 234, 103, 10, 3, - 234, 104, 201, 189, 10, 3, 234, 31, 10, 3, 234, 28, 10, 3, 234, 9, 10, 3, - 233, 180, 10, 3, 233, 181, 25, 65, 10, 3, 233, 181, 25, 42, 108, 220, 37, - 10, 3, 233, 181, 25, 42, 108, 220, 38, 25, 220, 37, 10, 3, 233, 181, 25, - 251, 132, 10, 3, 233, 181, 25, 249, 135, 10, 3, 233, 181, 25, 235, 74, - 230, 155, 10, 3, 233, 181, 25, 235, 74, 230, 156, 230, 155, 10, 3, 233, - 181, 25, 140, 10, 3, 233, 181, 25, 230, 105, 230, 155, 10, 3, 233, 181, - 25, 223, 202, 230, 155, 10, 3, 233, 181, 25, 222, 54, 10, 3, 233, 181, - 25, 222, 55, 201, 189, 10, 3, 233, 181, 25, 220, 223, 10, 3, 233, 181, - 25, 173, 10, 3, 233, 181, 25, 220, 38, 25, 220, 37, 10, 3, 233, 181, 25, - 219, 146, 10, 3, 233, 181, 25, 218, 225, 10, 3, 233, 181, 25, 196, 169, - 10, 3, 233, 181, 25, 196, 158, 10, 3, 231, 240, 10, 3, 231, 241, 230, - 155, 10, 3, 231, 238, 10, 3, 231, 239, 25, 42, 108, 238, 33, 108, 140, - 10, 3, 231, 239, 25, 42, 108, 140, 10, 3, 231, 239, 25, 42, 108, 223, - 201, 10, 3, 231, 239, 25, 252, 73, 199, 85, 108, 199, 236, 10, 3, 231, - 239, 25, 251, 132, 10, 3, 231, 239, 25, 250, 209, 10, 3, 231, 239, 25, - 250, 208, 108, 231, 222, 10, 3, 231, 239, 25, 249, 135, 10, 3, 231, 239, - 25, 249, 88, 108, 165, 10, 3, 231, 239, 25, 247, 230, 10, 3, 231, 239, - 25, 247, 231, 108, 165, 10, 3, 231, 239, 25, 238, 32, 10, 3, 231, 239, - 25, 237, 44, 10, 3, 231, 239, 25, 237, 0, 25, 203, 113, 10, 3, 231, 239, - 25, 235, 87, 10, 3, 231, 239, 25, 234, 140, 10, 3, 231, 239, 25, 234, - 141, 108, 173, 10, 3, 231, 239, 25, 234, 103, 10, 3, 231, 239, 25, 234, - 104, 25, 231, 209, 199, 84, 10, 3, 231, 239, 25, 231, 209, 199, 84, 10, - 3, 231, 239, 25, 231, 200, 10, 3, 231, 239, 25, 231, 53, 10, 3, 231, 239, - 25, 231, 51, 10, 3, 231, 239, 25, 231, 52, 108, 65, 10, 3, 231, 239, 25, - 231, 33, 108, 201, 4, 10, 3, 231, 239, 25, 230, 105, 108, 218, 226, 108, - 234, 9, 10, 3, 231, 239, 25, 230, 73, 10, 3, 231, 239, 25, 230, 74, 108, - 173, 10, 3, 231, 239, 25, 229, 159, 108, 219, 146, 10, 3, 231, 239, 25, - 228, 151, 10, 3, 231, 239, 25, 223, 202, 230, 155, 10, 3, 231, 239, 25, - 223, 63, 108, 228, 160, 108, 250, 209, 10, 3, 231, 239, 25, 222, 96, 10, - 3, 231, 239, 25, 222, 54, 10, 3, 231, 239, 25, 221, 152, 10, 3, 231, 239, - 25, 221, 153, 108, 220, 37, 10, 3, 231, 239, 25, 220, 224, 108, 251, 132, - 10, 3, 231, 239, 25, 173, 10, 3, 231, 239, 25, 216, 233, 108, 234, 103, - 10, 3, 231, 239, 25, 216, 100, 10, 3, 231, 239, 25, 212, 130, 10, 3, 231, - 239, 25, 212, 131, 139, 212, 130, 10, 3, 231, 239, 25, 168, 10, 3, 231, - 239, 25, 205, 169, 10, 3, 231, 239, 25, 205, 127, 10, 3, 231, 239, 25, - 203, 113, 10, 3, 231, 239, 25, 203, 114, 108, 197, 64, 10, 3, 231, 239, - 25, 203, 79, 10, 3, 231, 239, 25, 200, 204, 10, 3, 231, 239, 25, 199, - 209, 10, 3, 231, 239, 25, 66, 10, 3, 231, 239, 25, 196, 158, 10, 3, 231, - 239, 25, 196, 159, 108, 235, 89, 10, 3, 231, 239, 139, 231, 238, 10, 3, - 231, 233, 10, 3, 231, 234, 238, 210, 231, 233, 10, 3, 231, 231, 10, 3, - 231, 232, 139, 231, 232, 231, 201, 139, 231, 200, 10, 3, 231, 222, 10, 3, - 231, 223, 231, 232, 139, 231, 232, 231, 201, 139, 231, 200, 10, 3, 231, - 221, 10, 3, 231, 219, 10, 3, 231, 210, 10, 3, 231, 208, 10, 3, 231, 209, - 199, 84, 10, 3, 231, 209, 139, 231, 208, 10, 3, 231, 209, 238, 210, 231, - 208, 10, 3, 231, 200, 10, 3, 231, 199, 10, 3, 231, 193, 10, 3, 231, 134, - 10, 3, 231, 135, 25, 220, 197, 10, 3, 231, 53, 10, 3, 231, 54, 25, 71, - 10, 3, 231, 54, 25, 66, 10, 3, 231, 54, 238, 210, 231, 53, 10, 3, 231, - 51, 10, 3, 231, 52, 139, 231, 51, 10, 3, 231, 52, 238, 210, 231, 51, 10, - 3, 231, 48, 10, 3, 231, 32, 10, 3, 231, 33, 230, 155, 10, 3, 231, 30, 10, - 3, 231, 31, 25, 42, 108, 223, 201, 10, 3, 231, 31, 25, 231, 209, 199, 84, - 10, 3, 231, 31, 25, 223, 201, 10, 3, 231, 31, 25, 218, 226, 108, 223, - 201, 10, 3, 231, 31, 25, 168, 10, 3, 231, 25, 10, 3, 231, 23, 10, 3, 231, - 24, 238, 210, 231, 23, 10, 3, 231, 24, 25, 249, 135, 10, 3, 231, 24, 25, - 199, 209, 10, 3, 231, 24, 199, 84, 10, 3, 230, 179, 10, 3, 230, 180, 238, - 210, 230, 179, 10, 3, 230, 177, 10, 3, 230, 178, 25, 222, 96, 10, 3, 230, - 178, 25, 222, 97, 25, 223, 202, 230, 155, 10, 3, 230, 178, 25, 212, 130, - 10, 3, 230, 178, 25, 205, 170, 108, 197, 82, 10, 3, 230, 178, 230, 155, - 10, 3, 230, 168, 10, 3, 230, 169, 25, 42, 108, 220, 197, 10, 3, 230, 169, - 25, 220, 197, 10, 3, 230, 169, 139, 230, 169, 218, 216, 10, 3, 230, 160, - 10, 3, 230, 158, 10, 3, 230, 159, 25, 203, 113, 10, 3, 230, 149, 10, 3, - 230, 148, 10, 3, 230, 143, 10, 3, 230, 142, 10, 3, 140, 10, 3, 230, 105, - 199, 84, 10, 3, 230, 105, 230, 155, 10, 3, 230, 73, 10, 3, 229, 158, 10, - 3, 229, 159, 25, 250, 209, 10, 3, 229, 159, 25, 250, 207, 10, 3, 229, - 159, 25, 249, 135, 10, 3, 229, 159, 25, 236, 222, 10, 3, 229, 159, 25, - 231, 231, 10, 3, 229, 159, 25, 221, 141, 10, 3, 229, 159, 25, 212, 130, - 10, 3, 229, 159, 25, 203, 113, 10, 3, 229, 159, 25, 66, 10, 3, 228, 159, - 10, 3, 228, 151, 10, 3, 228, 152, 25, 251, 132, 10, 3, 228, 152, 25, 230, - 73, 10, 3, 228, 152, 25, 222, 54, 10, 3, 228, 152, 25, 219, 89, 10, 3, - 228, 152, 25, 196, 158, 10, 3, 228, 146, 10, 3, 68, 10, 3, 228, 74, 65, - 10, 3, 228, 30, 10, 3, 223, 229, 10, 3, 223, 230, 139, 223, 230, 247, - 230, 10, 3, 223, 230, 139, 223, 230, 201, 189, 10, 3, 223, 204, 10, 3, - 223, 201, 10, 3, 223, 202, 237, 26, 10, 3, 223, 202, 207, 1, 10, 3, 223, - 202, 139, 223, 202, 203, 63, 139, 203, 63, 196, 159, 139, 196, 158, 10, - 3, 223, 202, 230, 155, 10, 3, 223, 191, 10, 3, 223, 192, 25, 231, 209, - 199, 84, 10, 3, 223, 190, 10, 3, 223, 180, 10, 3, 223, 181, 25, 199, 209, - 10, 3, 223, 181, 238, 210, 223, 180, 10, 3, 223, 181, 211, 63, 223, 180, - 10, 3, 223, 181, 201, 189, 10, 3, 223, 172, 10, 3, 223, 162, 10, 3, 223, - 77, 10, 3, 223, 62, 10, 3, 155, 10, 3, 222, 142, 25, 65, 10, 3, 222, 142, - 25, 252, 42, 10, 3, 222, 142, 25, 252, 43, 108, 220, 223, 10, 3, 222, - 142, 25, 250, 207, 10, 3, 222, 142, 25, 249, 135, 10, 3, 222, 142, 25, - 249, 114, 10, 3, 222, 142, 25, 164, 10, 3, 222, 142, 25, 248, 188, 10, 3, - 222, 142, 25, 234, 28, 10, 3, 222, 142, 25, 234, 9, 10, 3, 222, 142, 25, - 231, 240, 10, 3, 222, 142, 25, 231, 222, 10, 3, 222, 142, 25, 231, 209, - 199, 84, 10, 3, 222, 142, 25, 231, 200, 10, 3, 222, 142, 25, 231, 201, - 108, 203, 164, 108, 65, 10, 3, 222, 142, 25, 231, 53, 10, 3, 222, 142, - 25, 231, 32, 10, 3, 222, 142, 25, 231, 24, 108, 205, 127, 10, 3, 222, - 142, 25, 231, 24, 238, 210, 231, 23, 10, 3, 222, 142, 25, 230, 179, 10, - 3, 222, 142, 25, 230, 148, 10, 3, 222, 142, 25, 223, 201, 10, 3, 222, - 142, 25, 223, 180, 10, 3, 222, 142, 25, 222, 96, 10, 3, 222, 142, 25, - 221, 166, 10, 3, 222, 142, 25, 221, 152, 10, 3, 222, 142, 25, 219, 146, - 10, 3, 222, 142, 25, 218, 225, 10, 3, 222, 142, 25, 216, 232, 10, 3, 222, - 142, 25, 216, 233, 108, 235, 89, 10, 3, 222, 142, 25, 216, 233, 108, 231, - 53, 10, 3, 222, 142, 25, 216, 233, 108, 199, 145, 10, 3, 222, 142, 25, - 216, 100, 10, 3, 222, 142, 25, 216, 101, 108, 212, 125, 10, 3, 222, 142, - 25, 214, 121, 10, 3, 222, 142, 25, 212, 130, 10, 3, 222, 142, 25, 209, - 185, 10, 3, 222, 142, 25, 206, 68, 10, 3, 222, 142, 25, 188, 10, 3, 222, - 142, 25, 205, 127, 10, 3, 222, 142, 25, 203, 165, 10, 3, 222, 142, 25, - 203, 113, 10, 3, 222, 142, 25, 203, 79, 10, 3, 222, 142, 25, 203, 5, 10, - 3, 222, 142, 25, 202, 201, 10, 3, 222, 142, 25, 200, 213, 10, 3, 222, - 142, 25, 199, 179, 10, 3, 222, 142, 25, 66, 10, 3, 222, 142, 25, 196, - 169, 10, 3, 222, 142, 25, 196, 158, 10, 3, 222, 142, 25, 196, 116, 25, - 168, 10, 3, 222, 142, 25, 196, 38, 10, 3, 222, 142, 25, 191, 30, 10, 3, - 222, 128, 10, 3, 222, 129, 238, 210, 222, 128, 10, 3, 222, 117, 10, 3, - 222, 113, 10, 3, 222, 111, 10, 3, 222, 110, 10, 3, 222, 108, 10, 3, 222, - 109, 139, 222, 108, 10, 3, 222, 96, 10, 3, 222, 97, 25, 223, 202, 230, - 155, 10, 3, 222, 91, 10, 3, 222, 92, 25, 249, 135, 10, 3, 222, 92, 238, - 210, 222, 91, 10, 3, 222, 89, 10, 3, 222, 88, 10, 3, 222, 54, 10, 3, 222, - 55, 220, 105, 25, 126, 139, 220, 105, 25, 66, 10, 3, 222, 55, 139, 222, - 55, 220, 105, 25, 126, 139, 220, 105, 25, 66, 10, 3, 221, 242, 10, 3, - 221, 166, 10, 3, 221, 167, 25, 249, 135, 10, 3, 221, 167, 25, 66, 10, 3, - 221, 167, 25, 196, 158, 10, 3, 221, 152, 10, 3, 221, 141, 10, 3, 221, - 127, 10, 3, 221, 126, 10, 3, 221, 124, 10, 3, 221, 125, 139, 221, 124, - 10, 3, 220, 232, 10, 3, 220, 233, 139, 229, 159, 25, 250, 208, 220, 233, - 139, 229, 159, 25, 250, 207, 10, 3, 220, 223, 10, 3, 220, 221, 10, 3, - 220, 222, 195, 168, 20, 10, 3, 220, 220, 10, 3, 220, 211, 10, 3, 220, - 212, 230, 155, 10, 3, 220, 210, 10, 3, 220, 197, 10, 3, 220, 198, 211, - 63, 220, 197, 10, 3, 220, 190, 10, 3, 220, 167, 10, 3, 173, 10, 3, 220, - 104, 10, 3, 220, 105, 25, 65, 10, 3, 220, 105, 25, 42, 108, 238, 33, 108, - 140, 10, 3, 220, 105, 25, 42, 108, 231, 200, 10, 3, 220, 105, 25, 42, - 108, 220, 37, 10, 3, 220, 105, 25, 251, 207, 10, 3, 220, 105, 25, 251, - 132, 10, 3, 220, 105, 25, 250, 210, 191, 26, 199, 84, 10, 3, 220, 105, - 25, 249, 135, 10, 3, 220, 105, 25, 248, 188, 10, 3, 220, 105, 25, 237, - 225, 10, 3, 220, 105, 25, 234, 103, 10, 3, 220, 105, 25, 231, 240, 10, 3, - 220, 105, 25, 231, 200, 10, 3, 220, 105, 25, 230, 168, 10, 3, 220, 105, - 25, 230, 169, 108, 230, 168, 10, 3, 220, 105, 25, 140, 10, 3, 220, 105, - 25, 230, 73, 10, 3, 220, 105, 25, 229, 159, 25, 212, 130, 10, 3, 220, - 105, 25, 223, 202, 230, 155, 10, 3, 220, 105, 25, 223, 180, 10, 3, 220, - 105, 25, 223, 181, 108, 140, 10, 3, 220, 105, 25, 223, 181, 108, 218, - 225, 10, 3, 220, 105, 25, 221, 166, 10, 3, 220, 105, 25, 221, 141, 10, 3, - 220, 105, 25, 220, 223, 10, 3, 220, 105, 25, 220, 211, 10, 3, 220, 105, - 25, 220, 212, 108, 229, 159, 108, 65, 10, 3, 220, 105, 25, 220, 104, 10, - 3, 220, 105, 25, 219, 89, 10, 3, 220, 105, 25, 218, 225, 10, 3, 220, 105, - 25, 218, 210, 10, 3, 220, 105, 25, 216, 232, 10, 3, 220, 105, 25, 216, - 233, 108, 234, 103, 10, 3, 220, 105, 25, 215, 101, 10, 3, 220, 105, 25, - 214, 121, 10, 3, 220, 105, 25, 203, 114, 108, 200, 204, 10, 3, 220, 105, - 25, 203, 59, 108, 231, 24, 108, 234, 28, 10, 3, 220, 105, 25, 203, 59, - 108, 231, 24, 199, 84, 10, 3, 220, 105, 25, 203, 3, 10, 3, 220, 105, 25, - 203, 4, 108, 203, 3, 10, 3, 220, 105, 25, 200, 204, 10, 3, 220, 105, 25, - 199, 223, 10, 3, 220, 105, 25, 199, 209, 10, 3, 220, 105, 25, 199, 146, - 108, 42, 108, 201, 5, 108, 180, 10, 3, 220, 105, 25, 66, 10, 3, 220, 105, - 25, 126, 108, 65, 10, 3, 220, 105, 25, 126, 108, 126, 108, 66, 10, 3, - 220, 105, 25, 196, 170, 108, 250, 209, 10, 3, 220, 105, 25, 196, 158, 10, - 3, 220, 105, 25, 196, 38, 10, 3, 220, 105, 201, 189, 10, 3, 220, 102, 10, - 3, 220, 103, 25, 203, 113, 10, 3, 220, 103, 25, 203, 114, 108, 200, 204, - 10, 3, 220, 103, 230, 155, 10, 3, 220, 103, 230, 156, 139, 220, 103, 230, - 156, 203, 113, 10, 3, 220, 98, 10, 3, 220, 37, 10, 3, 220, 38, 25, 220, - 37, 10, 3, 220, 35, 10, 3, 220, 36, 25, 220, 197, 10, 3, 220, 36, 25, - 220, 198, 108, 206, 68, 10, 3, 219, 146, 10, 3, 219, 127, 10, 3, 219, - 115, 10, 3, 219, 89, 10, 3, 218, 225, 10, 3, 218, 226, 25, 249, 135, 10, - 3, 218, 223, 10, 3, 218, 224, 25, 251, 207, 10, 3, 218, 224, 25, 249, - 135, 10, 3, 218, 224, 25, 234, 9, 10, 3, 218, 224, 25, 234, 10, 199, 84, - 10, 3, 218, 224, 25, 231, 209, 199, 84, 10, 3, 218, 224, 25, 229, 159, - 25, 249, 135, 10, 3, 218, 224, 25, 223, 180, 10, 3, 218, 224, 25, 222, - 113, 10, 3, 218, 224, 25, 222, 111, 10, 3, 218, 224, 25, 222, 112, 108, - 250, 209, 10, 3, 218, 224, 25, 221, 166, 10, 3, 218, 224, 25, 220, 126, - 108, 250, 209, 10, 3, 218, 224, 25, 220, 104, 10, 3, 218, 224, 25, 216, - 233, 108, 234, 103, 10, 3, 218, 224, 25, 214, 121, 10, 3, 218, 224, 25, - 212, 178, 10, 3, 218, 224, 25, 202, 223, 108, 250, 209, 10, 3, 218, 224, - 25, 202, 192, 108, 248, 10, 10, 3, 218, 224, 25, 197, 82, 10, 3, 218, - 224, 199, 84, 10, 3, 218, 224, 238, 210, 218, 223, 10, 3, 218, 224, 211, - 63, 218, 223, 10, 3, 218, 224, 201, 189, 10, 3, 218, 224, 203, 94, 10, 3, - 218, 222, 10, 3, 218, 216, 10, 3, 218, 217, 139, 218, 216, 10, 3, 218, - 217, 211, 63, 218, 216, 10, 3, 218, 217, 203, 94, 10, 3, 218, 213, 10, 3, - 218, 210, 10, 3, 218, 208, 10, 3, 218, 209, 139, 218, 208, 10, 3, 218, - 209, 139, 218, 209, 231, 201, 139, 231, 200, 10, 3, 174, 10, 3, 217, 160, - 25, 199, 209, 10, 3, 217, 160, 230, 155, 10, 3, 217, 152, 10, 3, 217, - 120, 10, 3, 217, 65, 10, 3, 217, 39, 10, 3, 217, 38, 10, 3, 216, 232, 10, - 3, 216, 173, 10, 3, 216, 100, 10, 3, 216, 44, 10, 3, 215, 155, 10, 3, - 215, 156, 139, 215, 155, 10, 3, 215, 140, 10, 3, 215, 141, 230, 155, 10, - 3, 215, 119, 10, 3, 215, 105, 10, 3, 215, 101, 10, 3, 215, 102, 25, 65, - 10, 3, 215, 102, 25, 220, 197, 10, 3, 215, 102, 25, 191, 123, 10, 3, 215, - 102, 139, 215, 101, 10, 3, 215, 102, 139, 215, 102, 25, 42, 108, 180, 10, - 3, 215, 102, 238, 210, 215, 101, 10, 3, 215, 99, 10, 3, 215, 100, 25, 65, - 10, 3, 215, 100, 25, 42, 108, 237, 44, 10, 3, 215, 100, 25, 237, 44, 10, - 3, 215, 100, 230, 155, 10, 3, 180, 10, 3, 214, 253, 10, 3, 214, 240, 10, - 3, 214, 241, 223, 92, 10, 3, 214, 241, 25, 203, 6, 199, 84, 10, 3, 214, - 241, 211, 63, 214, 240, 10, 3, 214, 239, 10, 3, 214, 231, 212, 116, 10, - 3, 214, 230, 10, 3, 214, 229, 10, 3, 214, 121, 10, 3, 214, 122, 25, 65, - 10, 3, 214, 122, 25, 196, 158, 10, 3, 214, 122, 203, 94, 10, 3, 213, 219, - 10, 3, 213, 220, 25, 71, 10, 3, 213, 210, 10, 3, 213, 180, 10, 3, 213, - 181, 25, 231, 209, 199, 84, 10, 3, 213, 181, 25, 231, 201, 108, 231, 209, - 199, 84, 10, 3, 213, 176, 10, 3, 213, 177, 25, 251, 132, 10, 3, 213, 177, - 25, 250, 209, 10, 3, 213, 177, 25, 250, 210, 108, 250, 209, 10, 3, 213, - 177, 25, 230, 168, 10, 3, 213, 177, 25, 216, 233, 108, 231, 209, 199, 84, - 10, 3, 213, 177, 25, 214, 121, 10, 3, 213, 177, 25, 212, 130, 10, 3, 213, - 177, 25, 203, 113, 10, 3, 213, 177, 25, 203, 114, 108, 42, 251, 132, 10, - 3, 213, 177, 25, 203, 114, 108, 250, 209, 10, 3, 213, 177, 25, 203, 114, - 108, 250, 210, 108, 250, 209, 10, 3, 213, 177, 25, 196, 170, 108, 250, - 209, 10, 3, 213, 177, 25, 196, 38, 10, 3, 213, 163, 10, 3, 212, 178, 10, - 3, 212, 147, 10, 3, 212, 130, 10, 3, 212, 131, 220, 103, 25, 231, 200, - 10, 3, 212, 131, 220, 103, 25, 217, 39, 10, 3, 212, 131, 220, 103, 25, - 205, 169, 10, 3, 212, 131, 220, 103, 25, 205, 170, 139, 212, 131, 220, - 103, 25, 205, 169, 10, 3, 212, 131, 220, 103, 25, 196, 38, 10, 3, 212, - 131, 199, 84, 10, 3, 212, 131, 139, 212, 130, 10, 3, 212, 131, 238, 210, - 212, 130, 10, 3, 212, 131, 238, 210, 212, 131, 220, 103, 139, 220, 102, - 10, 3, 212, 125, 10, 3, 212, 126, 252, 73, 25, 250, 203, 10, 3, 212, 126, - 252, 73, 25, 248, 188, 10, 3, 212, 126, 252, 73, 25, 235, 82, 10, 3, 212, - 126, 252, 73, 25, 230, 168, 10, 3, 212, 126, 252, 73, 25, 223, 202, 230, - 155, 10, 3, 212, 126, 252, 73, 25, 222, 111, 10, 3, 212, 126, 252, 73, - 25, 173, 10, 3, 212, 126, 252, 73, 25, 214, 121, 10, 3, 212, 126, 252, - 73, 25, 202, 189, 10, 3, 212, 126, 252, 73, 25, 196, 169, 10, 3, 212, - 126, 221, 125, 25, 248, 188, 10, 3, 212, 126, 221, 125, 25, 248, 189, 66, - 10, 3, 168, 10, 3, 210, 210, 10, 3, 210, 166, 10, 3, 210, 137, 10, 3, - 209, 243, 10, 3, 209, 185, 10, 3, 209, 186, 25, 65, 10, 3, 209, 186, 25, - 252, 155, 10, 3, 209, 186, 25, 248, 188, 10, 3, 209, 186, 25, 248, 10, - 10, 3, 209, 186, 25, 71, 10, 3, 209, 186, 25, 68, 10, 3, 209, 186, 25, - 228, 30, 10, 3, 209, 186, 25, 66, 10, 3, 209, 186, 25, 196, 169, 10, 3, - 209, 186, 238, 210, 209, 185, 10, 3, 209, 121, 10, 3, 209, 122, 25, 222, - 91, 10, 3, 209, 122, 25, 196, 158, 10, 3, 209, 122, 25, 191, 123, 10, 3, - 209, 122, 211, 63, 209, 121, 10, 3, 165, 10, 3, 207, 176, 10, 3, 207, 1, - 10, 3, 206, 68, 10, 3, 188, 10, 3, 205, 186, 212, 116, 10, 3, 205, 185, - 10, 3, 205, 186, 25, 65, 10, 3, 205, 186, 25, 235, 89, 10, 3, 205, 186, - 25, 235, 87, 10, 3, 205, 186, 25, 140, 10, 3, 205, 186, 25, 222, 96, 10, - 3, 205, 186, 25, 220, 197, 10, 3, 205, 186, 25, 218, 208, 10, 3, 205, - 186, 25, 216, 100, 10, 3, 205, 186, 25, 212, 130, 10, 3, 205, 186, 25, - 205, 169, 10, 3, 205, 186, 25, 203, 79, 10, 3, 205, 186, 25, 199, 236, - 10, 3, 205, 186, 25, 196, 169, 10, 3, 205, 186, 25, 196, 164, 10, 3, 205, - 186, 25, 196, 120, 10, 3, 205, 186, 25, 196, 62, 10, 3, 205, 186, 25, - 196, 38, 10, 3, 205, 186, 139, 205, 185, 10, 3, 205, 186, 230, 155, 10, - 3, 205, 169, 10, 3, 205, 170, 220, 105, 25, 250, 207, 10, 3, 205, 136, - 10, 3, 205, 127, 10, 3, 203, 165, 10, 3, 203, 163, 10, 3, 203, 164, 25, - 65, 10, 3, 203, 164, 25, 249, 135, 10, 3, 203, 164, 25, 231, 23, 10, 3, - 203, 164, 25, 214, 121, 10, 3, 203, 164, 25, 203, 3, 10, 3, 203, 164, 25, - 197, 64, 10, 3, 203, 164, 25, 66, 10, 3, 203, 164, 25, 126, 108, 65, 10, - 3, 203, 161, 10, 3, 203, 159, 10, 3, 203, 131, 10, 3, 203, 113, 10, 3, - 203, 114, 228, 159, 10, 3, 203, 114, 139, 203, 114, 231, 232, 139, 231, - 232, 231, 201, 139, 231, 200, 10, 3, 203, 114, 139, 203, 114, 199, 237, - 139, 199, 237, 231, 201, 139, 231, 200, 10, 3, 203, 106, 10, 3, 203, 101, - 10, 3, 203, 97, 10, 3, 203, 96, 10, 3, 203, 93, 10, 3, 203, 79, 10, 3, - 203, 80, 25, 65, 10, 3, 203, 80, 25, 223, 180, 10, 3, 203, 73, 10, 3, - 203, 74, 25, 65, 10, 3, 203, 74, 25, 249, 115, 10, 3, 203, 74, 25, 247, - 242, 10, 3, 203, 74, 25, 236, 243, 10, 3, 203, 74, 25, 231, 200, 10, 3, - 203, 74, 25, 223, 201, 10, 3, 203, 74, 25, 223, 202, 230, 155, 10, 3, - 203, 74, 25, 220, 190, 10, 3, 203, 74, 25, 218, 210, 10, 3, 203, 74, 25, - 215, 140, 10, 3, 203, 74, 25, 205, 169, 10, 3, 203, 67, 10, 3, 203, 62, - 10, 3, 203, 63, 199, 84, 10, 3, 203, 63, 139, 203, 63, 247, 231, 139, - 247, 230, 10, 3, 203, 58, 10, 3, 203, 5, 10, 3, 203, 6, 139, 223, 93, - 203, 5, 10, 3, 203, 3, 10, 3, 203, 1, 10, 3, 202, 222, 10, 3, 202, 223, - 230, 155, 10, 3, 202, 201, 10, 3, 202, 199, 10, 3, 202, 200, 139, 202, - 200, 203, 3, 10, 3, 202, 191, 10, 3, 202, 189, 10, 3, 201, 4, 10, 3, 201, - 5, 139, 201, 4, 10, 3, 200, 216, 10, 3, 200, 215, 10, 3, 200, 213, 10, 3, - 200, 204, 10, 3, 200, 203, 10, 3, 200, 175, 10, 3, 200, 174, 10, 3, 190, - 190, 10, 3, 199, 252, 250, 193, 10, 3, 199, 252, 25, 229, 158, 10, 3, - 199, 252, 25, 216, 100, 10, 3, 199, 252, 230, 155, 10, 3, 199, 236, 10, - 3, 199, 237, 139, 199, 237, 213, 220, 139, 213, 220, 236, 223, 139, 236, - 222, 10, 3, 199, 237, 201, 189, 10, 3, 199, 223, 10, 3, 199, 224, 25, - 248, 188, 10, 3, 199, 224, 25, 230, 168, 10, 3, 199, 224, 25, 203, 113, - 10, 3, 199, 224, 25, 203, 5, 10, 3, 199, 224, 25, 197, 82, 10, 3, 199, - 224, 25, 196, 158, 10, 3, 199, 209, 10, 3, 199, 179, 10, 3, 199, 145, 10, - 3, 199, 146, 230, 155, 10, 3, 198, 193, 10, 3, 198, 194, 199, 84, 10, 3, - 198, 154, 10, 3, 198, 131, 10, 3, 198, 132, 25, 199, 209, 10, 3, 198, - 132, 139, 198, 131, 10, 3, 198, 132, 139, 198, 132, 231, 232, 139, 231, - 232, 231, 201, 139, 231, 200, 10, 3, 197, 94, 10, 3, 197, 82, 10, 3, 197, - 80, 10, 3, 197, 76, 10, 3, 197, 64, 10, 3, 197, 65, 139, 197, 65, 191, - 124, 139, 191, 123, 10, 3, 66, 10, 3, 126, 230, 168, 10, 3, 126, 126, 66, - 10, 3, 126, 139, 126, 210, 221, 139, 210, 221, 231, 201, 139, 231, 200, - 10, 3, 126, 139, 126, 200, 176, 139, 200, 175, 10, 3, 126, 139, 126, 126, - 207, 18, 139, 126, 207, 17, 10, 3, 196, 169, 10, 3, 196, 164, 10, 3, 196, - 158, 10, 3, 196, 159, 220, 190, 10, 3, 196, 159, 25, 249, 135, 10, 3, - 196, 159, 25, 216, 100, 10, 3, 196, 159, 25, 126, 108, 126, 108, 66, 10, - 3, 196, 159, 25, 126, 108, 126, 108, 126, 230, 155, 10, 3, 196, 159, 230, - 155, 10, 3, 196, 159, 203, 94, 10, 3, 196, 159, 203, 95, 25, 249, 135, - 10, 3, 196, 153, 10, 3, 196, 120, 10, 3, 196, 121, 25, 220, 104, 10, 3, - 196, 121, 25, 216, 233, 108, 238, 32, 10, 3, 196, 121, 25, 203, 163, 10, - 3, 196, 121, 25, 66, 10, 3, 196, 119, 10, 3, 196, 115, 10, 3, 196, 116, - 25, 222, 54, 10, 3, 196, 116, 25, 168, 10, 3, 196, 113, 10, 3, 196, 114, - 230, 155, 10, 3, 196, 62, 10, 3, 196, 63, 238, 210, 196, 62, 10, 3, 196, - 63, 203, 94, 10, 3, 196, 60, 10, 3, 196, 61, 25, 42, 108, 140, 10, 3, - 196, 61, 25, 42, 108, 180, 10, 3, 196, 61, 25, 251, 207, 10, 3, 196, 61, - 25, 140, 10, 3, 196, 61, 25, 212, 130, 10, 3, 196, 61, 25, 196, 169, 10, - 3, 196, 61, 25, 196, 170, 108, 250, 209, 10, 3, 196, 61, 25, 196, 170, - 108, 248, 188, 10, 3, 196, 59, 10, 3, 196, 56, 10, 3, 196, 55, 10, 3, - 196, 51, 10, 3, 196, 52, 25, 65, 10, 3, 196, 52, 25, 250, 203, 10, 3, - 196, 52, 25, 164, 10, 3, 196, 52, 25, 235, 75, 10, 3, 196, 52, 25, 231, - 240, 10, 3, 196, 52, 25, 231, 222, 10, 3, 196, 52, 25, 231, 209, 199, 84, - 10, 3, 196, 52, 25, 231, 200, 10, 3, 196, 52, 25, 230, 179, 10, 3, 196, - 52, 25, 140, 10, 3, 196, 52, 25, 223, 201, 10, 3, 196, 52, 25, 223, 180, - 10, 3, 196, 52, 25, 223, 62, 10, 3, 196, 52, 25, 221, 166, 10, 3, 196, - 52, 25, 218, 208, 10, 3, 196, 52, 25, 216, 44, 10, 3, 196, 52, 25, 168, - 10, 3, 196, 52, 25, 203, 113, 10, 3, 196, 52, 25, 202, 199, 10, 3, 196, - 52, 25, 197, 94, 10, 3, 196, 52, 25, 126, 108, 230, 168, 10, 3, 196, 52, - 25, 196, 158, 10, 3, 196, 52, 25, 196, 49, 10, 3, 196, 49, 10, 3, 196, - 50, 25, 66, 10, 3, 196, 38, 10, 3, 196, 39, 25, 65, 10, 3, 196, 39, 25, - 220, 232, 10, 3, 196, 39, 25, 220, 197, 10, 3, 196, 39, 25, 199, 209, 10, - 3, 196, 34, 10, 3, 196, 37, 10, 3, 196, 35, 10, 3, 196, 31, 10, 3, 196, - 16, 10, 3, 196, 17, 25, 222, 54, 10, 3, 196, 14, 10, 3, 191, 123, 10, 3, - 191, 124, 199, 84, 10, 3, 191, 124, 112, 25, 220, 197, 10, 3, 191, 118, - 10, 3, 191, 107, 10, 3, 191, 86, 10, 3, 191, 30, 10, 3, 191, 31, 139, - 191, 30, 10, 3, 191, 29, 10, 3, 191, 27, 10, 3, 191, 28, 222, 116, 199, - 84, 10, 3, 191, 22, 10, 3, 191, 13, 10, 3, 190, 251, 10, 3, 190, 249, 10, - 3, 190, 250, 25, 65, 10, 3, 190, 248, 10, 3, 190, 247, 10, 3, 222, 79, - 234, 137, 10, 3, 252, 156, 25, 212, 130, 10, 3, 252, 73, 25, 65, 10, 3, - 251, 146, 25, 220, 213, 10, 3, 238, 23, 221, 125, 25, 196, 170, 108, 217, - 39, 10, 3, 238, 21, 10, 3, 236, 223, 108, 203, 5, 10, 3, 235, 88, 25, - 203, 113, 10, 3, 233, 181, 25, 230, 168, 10, 3, 233, 181, 25, 203, 113, - 10, 3, 231, 239, 25, 251, 133, 108, 222, 97, 108, 65, 10, 3, 231, 239, - 25, 250, 207, 10, 3, 231, 164, 10, 3, 231, 42, 10, 3, 228, 131, 10, 3, - 222, 142, 25, 251, 91, 10, 3, 222, 142, 25, 250, 206, 10, 3, 222, 142, - 25, 231, 23, 10, 3, 222, 142, 25, 230, 168, 10, 3, 222, 142, 25, 229, - 159, 25, 250, 207, 10, 3, 222, 142, 25, 218, 208, 10, 3, 222, 142, 25, - 168, 10, 3, 222, 142, 25, 202, 253, 10, 3, 222, 142, 25, 197, 94, 10, 3, - 222, 142, 25, 196, 60, 10, 3, 220, 105, 25, 231, 53, 10, 3, 218, 224, - 203, 95, 25, 249, 135, 10, 3, 218, 224, 25, 234, 10, 108, 220, 37, 10, 3, - 218, 224, 25, 203, 5, 10, 3, 216, 172, 10, 3, 215, 100, 25, 191, 123, 10, - 3, 214, 252, 10, 3, 213, 179, 10, 3, 213, 178, 10, 3, 213, 177, 25, 249, - 115, 10, 3, 213, 177, 25, 231, 53, 10, 3, 212, 148, 206, 122, 213, 170, - 237, 124, 10, 3, 209, 244, 250, 193, 10, 3, 209, 125, 10, 3, 205, 186, - 25, 223, 202, 230, 155, 10, 3, 198, 185, 10, 3, 196, 121, 25, 216, 232, - 10, 3, 126, 66, 10, 167, 3, 105, 250, 209, 10, 167, 3, 115, 250, 209, 10, - 167, 3, 232, 128, 250, 209, 10, 167, 3, 232, 226, 250, 209, 10, 167, 3, - 202, 136, 250, 209, 10, 167, 3, 203, 247, 250, 209, 10, 167, 3, 234, 164, - 250, 209, 10, 167, 3, 213, 175, 250, 209, 10, 167, 3, 115, 236, 222, 10, - 167, 3, 232, 128, 236, 222, 10, 167, 3, 232, 226, 236, 222, 10, 167, 3, - 202, 136, 236, 222, 10, 167, 3, 203, 247, 236, 222, 10, 167, 3, 234, 164, - 236, 222, 10, 167, 3, 213, 175, 236, 222, 10, 167, 3, 232, 128, 66, 10, - 167, 3, 232, 226, 66, 10, 167, 3, 202, 136, 66, 10, 167, 3, 203, 247, 66, - 10, 167, 3, 234, 164, 66, 10, 167, 3, 213, 175, 66, 10, 167, 3, 91, 231, - 136, 10, 167, 3, 105, 231, 136, 10, 167, 3, 115, 231, 136, 10, 167, 3, - 232, 128, 231, 136, 10, 167, 3, 232, 226, 231, 136, 10, 167, 3, 202, 136, - 231, 136, 10, 167, 3, 203, 247, 231, 136, 10, 167, 3, 234, 164, 231, 136, - 10, 167, 3, 213, 175, 231, 136, 10, 167, 3, 91, 231, 133, 10, 167, 3, - 105, 231, 133, 10, 167, 3, 115, 231, 133, 10, 167, 3, 232, 128, 231, 133, - 10, 167, 3, 232, 226, 231, 133, 10, 167, 3, 105, 203, 131, 10, 167, 3, - 115, 203, 131, 10, 167, 3, 115, 203, 132, 195, 168, 20, 10, 167, 3, 232, - 128, 203, 131, 10, 167, 3, 232, 226, 203, 131, 10, 167, 3, 202, 136, 203, - 131, 10, 167, 3, 203, 247, 203, 131, 10, 167, 3, 234, 164, 203, 131, 10, - 167, 3, 213, 175, 203, 131, 10, 167, 3, 91, 203, 124, 10, 167, 3, 105, - 203, 124, 10, 167, 3, 115, 203, 124, 10, 167, 3, 115, 203, 125, 195, 168, - 20, 10, 167, 3, 232, 128, 203, 124, 10, 167, 3, 232, 226, 203, 124, 10, - 167, 3, 203, 132, 25, 231, 223, 108, 236, 222, 10, 167, 3, 203, 132, 25, - 231, 223, 108, 216, 44, 10, 167, 3, 91, 247, 226, 10, 167, 3, 105, 247, - 226, 10, 167, 3, 115, 247, 226, 10, 167, 3, 115, 247, 227, 195, 168, 20, - 10, 167, 3, 232, 128, 247, 226, 10, 167, 3, 232, 226, 247, 226, 10, 167, - 3, 115, 195, 168, 232, 146, 234, 11, 10, 167, 3, 115, 195, 168, 232, 146, - 234, 8, 10, 167, 3, 232, 128, 195, 168, 232, 146, 219, 116, 10, 167, 3, - 232, 128, 195, 168, 232, 146, 219, 114, 10, 167, 3, 232, 128, 195, 168, - 232, 146, 219, 117, 65, 10, 167, 3, 232, 128, 195, 168, 232, 146, 219, - 117, 250, 120, 10, 167, 3, 202, 136, 195, 168, 232, 146, 250, 205, 10, - 167, 3, 203, 247, 195, 168, 232, 146, 223, 171, 10, 167, 3, 203, 247, - 195, 168, 232, 146, 223, 173, 65, 10, 167, 3, 203, 247, 195, 168, 232, - 146, 223, 173, 250, 120, 10, 167, 3, 234, 164, 195, 168, 232, 146, 196, - 33, 10, 167, 3, 234, 164, 195, 168, 232, 146, 196, 32, 10, 167, 3, 213, - 175, 195, 168, 232, 146, 223, 188, 10, 167, 3, 213, 175, 195, 168, 232, - 146, 223, 187, 10, 167, 3, 213, 175, 195, 168, 232, 146, 223, 186, 10, - 167, 3, 213, 175, 195, 168, 232, 146, 223, 189, 65, 10, 167, 3, 105, 250, - 210, 199, 84, 10, 167, 3, 115, 250, 210, 199, 84, 10, 167, 3, 232, 128, - 250, 210, 199, 84, 10, 167, 3, 232, 226, 250, 210, 199, 84, 10, 167, 3, - 202, 136, 250, 210, 199, 84, 10, 167, 3, 91, 249, 99, 10, 167, 3, 105, - 249, 99, 10, 167, 3, 115, 249, 99, 10, 167, 3, 232, 128, 249, 99, 10, - 167, 3, 232, 128, 249, 100, 195, 168, 20, 10, 167, 3, 232, 226, 249, 99, - 10, 167, 3, 232, 226, 249, 100, 195, 168, 20, 10, 167, 3, 213, 188, 10, - 167, 3, 213, 189, 10, 167, 3, 91, 234, 7, 10, 167, 3, 105, 234, 7, 10, - 167, 3, 91, 199, 1, 236, 222, 10, 167, 3, 105, 198, 254, 236, 222, 10, - 167, 3, 232, 226, 202, 123, 236, 222, 10, 167, 3, 91, 199, 1, 195, 168, - 232, 146, 65, 10, 167, 3, 105, 198, 254, 195, 168, 232, 146, 65, 10, 167, - 3, 91, 234, 160, 250, 209, 10, 167, 3, 91, 208, 23, 250, 209, 10, 167, 3, - 39, 250, 196, 91, 202, 124, 10, 167, 3, 39, 250, 196, 91, 208, 22, 10, - 167, 3, 91, 208, 23, 230, 149, 10, 167, 3, 91, 132, 230, 149, 10, 167, 3, - 234, 138, 91, 199, 0, 10, 167, 3, 234, 138, 105, 198, 253, 10, 167, 3, - 234, 138, 232, 135, 10, 167, 3, 234, 138, 233, 15, 10, 167, 3, 232, 128, - 126, 195, 168, 20, 10, 167, 3, 232, 226, 126, 195, 168, 20, 10, 167, 3, - 202, 136, 126, 195, 168, 20, 10, 167, 3, 203, 247, 126, 195, 168, 20, 10, - 167, 3, 234, 164, 126, 195, 168, 20, 10, 167, 3, 213, 175, 126, 195, 168, - 20, 10, 208, 152, 3, 39, 250, 196, 193, 23, 236, 205, 10, 208, 152, 3, - 81, 242, 83, 10, 208, 152, 3, 237, 39, 242, 83, 10, 208, 152, 3, 237, 39, - 197, 237, 10, 208, 152, 3, 237, 39, 208, 29, 10, 3, 252, 156, 25, 212, - 131, 199, 84, 10, 3, 252, 156, 25, 203, 3, 10, 3, 252, 43, 25, 234, 9, - 10, 3, 249, 136, 25, 236, 223, 199, 84, 10, 3, 249, 122, 25, 252, 72, 10, - 3, 249, 122, 25, 213, 219, 10, 3, 249, 122, 25, 191, 123, 10, 3, 248, 11, - 139, 248, 11, 25, 214, 253, 10, 3, 238, 33, 25, 199, 209, 10, 3, 238, 23, - 25, 220, 197, 10, 3, 237, 0, 25, 223, 201, 10, 3, 237, 0, 25, 126, 126, - 66, 10, 3, 236, 254, 25, 196, 158, 10, 3, 235, 83, 25, 251, 91, 10, 3, - 235, 83, 25, 250, 209, 10, 3, 235, 83, 25, 250, 210, 250, 183, 219, 224, - 10, 3, 235, 83, 25, 236, 243, 10, 3, 235, 83, 25, 235, 75, 10, 3, 235, - 83, 25, 234, 28, 10, 3, 235, 83, 25, 231, 240, 10, 3, 235, 83, 25, 231, - 53, 10, 3, 235, 83, 25, 231, 33, 230, 155, 10, 3, 235, 83, 25, 231, 23, - 10, 3, 235, 83, 25, 140, 10, 3, 235, 83, 25, 229, 158, 10, 3, 235, 83, - 25, 223, 202, 230, 155, 10, 3, 235, 83, 25, 222, 54, 10, 3, 235, 83, 25, - 220, 197, 10, 3, 235, 83, 25, 220, 190, 10, 3, 235, 83, 25, 220, 191, - 108, 222, 54, 10, 3, 235, 83, 25, 220, 92, 10, 3, 235, 83, 25, 220, 35, - 10, 3, 235, 83, 25, 220, 36, 25, 220, 197, 10, 3, 235, 83, 25, 218, 214, - 108, 231, 23, 10, 3, 235, 83, 25, 217, 39, 10, 3, 235, 83, 25, 216, 173, - 10, 3, 235, 83, 25, 216, 100, 10, 3, 235, 83, 25, 213, 219, 10, 3, 235, - 83, 25, 209, 185, 10, 3, 235, 83, 25, 203, 113, 10, 3, 235, 83, 25, 202, - 223, 230, 155, 10, 3, 234, 219, 25, 220, 197, 10, 3, 234, 219, 25, 210, - 137, 10, 3, 234, 29, 192, 235, 10, 3, 234, 10, 238, 210, 234, 9, 10, 3, - 233, 181, 203, 95, 25, 250, 209, 10, 3, 233, 181, 203, 95, 25, 229, 158, - 10, 3, 233, 181, 203, 95, 25, 223, 202, 230, 155, 10, 3, 233, 181, 203, - 95, 25, 173, 10, 3, 233, 181, 203, 95, 25, 220, 37, 10, 3, 233, 181, 203, - 95, 25, 216, 232, 10, 3, 233, 181, 203, 95, 25, 216, 173, 10, 3, 233, - 181, 203, 95, 25, 201, 4, 10, 3, 233, 181, 25, 201, 4, 10, 3, 231, 239, - 25, 249, 121, 10, 3, 231, 239, 25, 237, 0, 230, 155, 10, 3, 231, 239, 25, - 235, 83, 25, 223, 202, 230, 155, 10, 3, 231, 239, 25, 235, 83, 25, 222, - 54, 10, 3, 231, 239, 25, 234, 31, 10, 3, 231, 239, 25, 231, 240, 10, 3, - 231, 239, 25, 231, 201, 108, 237, 44, 10, 3, 231, 239, 25, 231, 201, 108, - 214, 121, 10, 3, 231, 239, 25, 230, 105, 108, 65, 10, 3, 231, 239, 25, - 220, 191, 108, 222, 54, 10, 3, 231, 239, 25, 220, 35, 10, 3, 231, 239, - 25, 220, 36, 25, 220, 197, 10, 3, 231, 239, 25, 218, 213, 10, 3, 231, - 239, 25, 215, 101, 10, 3, 231, 239, 25, 214, 121, 10, 3, 231, 239, 25, - 214, 122, 108, 234, 218, 10, 3, 231, 239, 25, 214, 122, 108, 231, 53, 10, - 3, 231, 239, 25, 203, 73, 10, 3, 231, 239, 25, 191, 13, 10, 3, 231, 234, - 206, 122, 213, 170, 237, 124, 10, 3, 231, 135, 25, 66, 10, 3, 231, 24, - 25, 231, 24, 238, 210, 231, 23, 10, 3, 230, 178, 25, 223, 202, 230, 155, - 10, 3, 230, 169, 108, 231, 24, 25, 199, 209, 10, 3, 230, 105, 199, 85, - 230, 155, 10, 3, 229, 159, 25, 250, 210, 139, 229, 159, 25, 250, 209, 10, - 3, 222, 142, 25, 248, 10, 10, 3, 222, 142, 25, 155, 10, 3, 222, 142, 25, - 126, 126, 66, 10, 3, 222, 142, 25, 196, 62, 10, 3, 220, 105, 25, 190, - 252, 139, 190, 251, 10, 3, 220, 93, 10, 3, 220, 91, 10, 3, 220, 90, 10, - 3, 220, 89, 10, 3, 220, 88, 10, 3, 220, 87, 10, 3, 220, 86, 10, 3, 220, - 85, 139, 220, 85, 230, 155, 10, 3, 220, 84, 10, 3, 220, 83, 139, 220, 82, - 10, 3, 220, 81, 10, 3, 220, 80, 10, 3, 220, 79, 10, 3, 220, 78, 10, 3, - 220, 77, 10, 3, 220, 76, 10, 3, 220, 75, 10, 3, 220, 74, 10, 3, 220, 73, - 10, 3, 220, 72, 10, 3, 220, 71, 10, 3, 220, 70, 10, 3, 220, 69, 10, 3, - 220, 68, 10, 3, 220, 67, 10, 3, 220, 66, 10, 3, 220, 65, 10, 3, 220, 64, - 10, 3, 220, 62, 10, 3, 220, 63, 25, 230, 179, 10, 3, 220, 63, 25, 223, - 201, 10, 3, 220, 63, 25, 210, 138, 108, 218, 222, 10, 3, 220, 63, 25, - 210, 138, 108, 210, 138, 108, 218, 222, 10, 3, 220, 63, 25, 196, 170, - 108, 249, 153, 10, 3, 220, 61, 10, 3, 220, 60, 10, 3, 220, 59, 10, 3, - 220, 58, 10, 3, 220, 57, 10, 3, 220, 56, 10, 3, 220, 55, 10, 3, 220, 54, - 10, 3, 220, 53, 10, 3, 220, 52, 10, 3, 220, 50, 10, 3, 220, 51, 25, 250, - 209, 10, 3, 220, 51, 25, 249, 135, 10, 3, 220, 51, 25, 235, 74, 230, 156, - 230, 155, 10, 3, 220, 51, 25, 220, 223, 10, 3, 220, 51, 25, 173, 10, 3, - 220, 51, 25, 199, 179, 10, 3, 220, 51, 25, 199, 145, 10, 3, 220, 51, 25, - 196, 169, 10, 3, 220, 51, 25, 196, 158, 10, 3, 220, 51, 25, 196, 49, 10, - 3, 220, 49, 10, 3, 220, 47, 10, 3, 220, 48, 25, 235, 87, 10, 3, 220, 48, - 25, 231, 240, 10, 3, 220, 48, 25, 223, 201, 10, 3, 220, 48, 25, 223, 202, - 230, 155, 10, 3, 220, 48, 25, 213, 219, 10, 3, 220, 48, 25, 210, 138, - 108, 210, 138, 108, 218, 222, 10, 3, 220, 48, 25, 203, 98, 108, 221, 166, - 10, 3, 220, 48, 25, 196, 158, 10, 3, 220, 48, 25, 196, 49, 10, 3, 220, - 45, 10, 3, 220, 44, 10, 3, 218, 224, 230, 156, 25, 250, 209, 10, 3, 218, - 224, 25, 236, 222, 10, 3, 218, 224, 25, 230, 73, 10, 3, 218, 224, 25, - 210, 137, 10, 3, 218, 224, 25, 210, 138, 108, 210, 138, 108, 218, 222, - 10, 3, 218, 224, 25, 199, 209, 10, 3, 216, 101, 108, 191, 122, 10, 3, - 215, 102, 139, 215, 102, 25, 231, 240, 10, 3, 215, 102, 139, 215, 102, - 25, 222, 96, 10, 3, 213, 177, 25, 237, 0, 230, 155, 10, 3, 213, 177, 25, - 231, 23, 10, 3, 213, 177, 25, 230, 160, 10, 3, 213, 177, 25, 229, 158, - 10, 3, 213, 177, 25, 221, 242, 10, 3, 213, 177, 25, 220, 88, 10, 3, 213, - 177, 25, 217, 39, 10, 3, 213, 177, 25, 210, 138, 108, 210, 137, 10, 3, - 213, 177, 25, 66, 10, 3, 213, 177, 25, 126, 108, 66, 10, 3, 213, 177, 25, - 196, 49, 10, 3, 205, 186, 230, 156, 25, 140, 10, 3, 205, 186, 25, 234, - 103, 10, 3, 205, 186, 25, 203, 114, 250, 183, 219, 224, 10, 3, 205, 186, - 25, 199, 209, 10, 3, 203, 162, 199, 84, 10, 3, 203, 114, 139, 203, 113, - 10, 3, 203, 114, 108, 228, 151, 10, 3, 203, 114, 108, 214, 229, 10, 3, - 203, 114, 108, 205, 127, 10, 3, 203, 4, 108, 235, 83, 25, 213, 219, 10, - 3, 203, 4, 108, 234, 219, 25, 251, 132, 10, 3, 202, 223, 25, 199, 209, - 10, 3, 199, 210, 108, 205, 185, 10, 3, 197, 77, 25, 231, 209, 199, 84, - 10, 3, 197, 77, 25, 115, 236, 222, 10, 3, 196, 61, 223, 92, 10, 3, 196, - 61, 25, 196, 158, 10, 3, 196, 52, 25, 237, 224, 10, 3, 196, 52, 25, 220, - 46, 10, 3, 196, 52, 25, 218, 222, 10, 3, 191, 122, 10, 3, 190, 252, 139, - 190, 252, 108, 205, 127, 10, 3, 190, 250, 25, 115, 236, 223, 199, 84, - 238, 134, 3, 242, 198, 238, 134, 3, 242, 197, 238, 134, 3, 242, 196, 238, - 134, 3, 242, 195, 238, 134, 3, 242, 194, 238, 134, 3, 242, 193, 238, 134, - 3, 242, 192, 238, 134, 3, 242, 191, 238, 134, 3, 242, 190, 238, 134, 3, - 242, 189, 238, 134, 3, 242, 188, 238, 134, 3, 242, 187, 238, 134, 3, 242, - 186, 238, 134, 3, 242, 185, 238, 134, 3, 242, 184, 238, 134, 3, 242, 183, - 238, 134, 3, 242, 182, 238, 134, 3, 242, 181, 238, 134, 3, 242, 180, 238, - 134, 3, 242, 179, 238, 134, 3, 242, 178, 238, 134, 3, 242, 177, 238, 134, - 3, 242, 176, 238, 134, 3, 242, 175, 238, 134, 3, 242, 174, 238, 134, 3, - 242, 173, 238, 134, 3, 242, 172, 238, 134, 3, 242, 171, 238, 134, 3, 242, - 170, 238, 134, 3, 242, 169, 238, 134, 3, 242, 168, 238, 134, 3, 242, 167, - 238, 134, 3, 242, 166, 238, 134, 3, 242, 165, 238, 134, 3, 242, 164, 238, - 134, 3, 242, 163, 238, 134, 3, 242, 162, 238, 134, 3, 242, 161, 238, 134, - 3, 242, 160, 238, 134, 3, 242, 159, 238, 134, 3, 242, 158, 238, 134, 3, - 242, 157, 238, 134, 3, 242, 156, 238, 134, 3, 242, 155, 238, 134, 3, 242, - 154, 238, 134, 3, 242, 153, 238, 134, 3, 242, 152, 238, 134, 3, 242, 151, - 238, 134, 3, 242, 150, 238, 134, 3, 242, 149, 238, 134, 3, 242, 148, 238, - 134, 3, 242, 147, 238, 134, 3, 242, 146, 238, 134, 3, 242, 145, 238, 134, - 3, 242, 144, 238, 134, 3, 242, 143, 238, 134, 3, 242, 142, 238, 134, 3, - 242, 141, 238, 134, 3, 242, 140, 238, 134, 3, 242, 139, 238, 134, 3, 242, - 138, 238, 134, 3, 242, 137, 238, 134, 3, 242, 136, 238, 134, 3, 242, 135, - 238, 134, 3, 242, 134, 238, 134, 3, 242, 133, 238, 134, 3, 242, 132, 238, - 134, 3, 242, 131, 238, 134, 3, 242, 130, 238, 134, 3, 242, 129, 238, 134, - 3, 242, 128, 238, 134, 3, 242, 127, 238, 134, 3, 242, 126, 238, 134, 3, - 242, 125, 238, 134, 3, 242, 124, 238, 134, 3, 242, 123, 238, 134, 3, 242, - 122, 238, 134, 3, 242, 121, 238, 134, 3, 242, 120, 238, 134, 3, 242, 119, - 238, 134, 3, 242, 118, 238, 134, 3, 242, 117, 238, 134, 3, 242, 116, 238, - 134, 3, 242, 115, 238, 134, 3, 242, 114, 238, 134, 3, 242, 113, 238, 134, - 3, 242, 112, 238, 134, 3, 242, 111, 238, 134, 3, 242, 110, 238, 134, 3, - 242, 109, 238, 134, 3, 242, 108, 238, 134, 3, 242, 107, 238, 134, 3, 242, - 106, 238, 134, 3, 242, 105, 238, 134, 3, 242, 104, 238, 134, 3, 242, 103, - 238, 134, 3, 242, 102, 238, 134, 3, 242, 101, 238, 134, 3, 242, 100, 14, - 7, 255, 199, 14, 7, 255, 198, 14, 7, 255, 197, 14, 7, 255, 196, 14, 7, - 255, 195, 14, 7, 255, 194, 14, 7, 255, 193, 14, 7, 255, 192, 14, 7, 255, - 191, 14, 7, 255, 190, 14, 7, 255, 189, 14, 7, 255, 188, 14, 7, 255, 187, - 14, 7, 255, 185, 14, 7, 255, 184, 14, 7, 255, 183, 14, 7, 255, 182, 14, - 7, 255, 181, 14, 7, 255, 180, 14, 7, 255, 179, 14, 7, 255, 178, 14, 7, - 255, 177, 14, 7, 255, 176, 14, 7, 255, 175, 14, 7, 255, 174, 14, 7, 255, - 173, 14, 7, 255, 172, 14, 7, 255, 171, 14, 7, 255, 170, 14, 7, 255, 169, - 14, 7, 255, 168, 14, 7, 255, 166, 14, 7, 255, 165, 14, 7, 255, 163, 14, - 7, 255, 162, 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, 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, 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, 128, 14, 7, 255, 127, 14, 7, 255, 126, 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, - 113, 14, 7, 255, 112, 14, 7, 255, 111, 14, 7, 255, 110, 14, 7, 250, 118, - 14, 7, 250, 116, 14, 7, 250, 114, 14, 7, 250, 112, 14, 7, 250, 110, 14, - 7, 250, 109, 14, 7, 250, 107, 14, 7, 250, 105, 14, 7, 250, 103, 14, 7, - 250, 101, 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, 247, 174, 14, 7, - 247, 173, 14, 7, 247, 172, 14, 7, 247, 171, 14, 7, 247, 170, 14, 7, 247, - 169, 14, 7, 247, 168, 14, 7, 247, 167, 14, 7, 247, 166, 14, 7, 247, 165, - 14, 7, 247, 164, 14, 7, 247, 163, 14, 7, 247, 162, 14, 7, 238, 126, 14, - 7, 238, 125, 14, 7, 238, 124, 14, 7, 238, 123, 14, 7, 238, 122, 14, 7, - 238, 121, 14, 7, 238, 120, 14, 7, 238, 119, 14, 7, 238, 118, 14, 7, 238, - 117, 14, 7, 238, 116, 14, 7, 238, 115, 14, 7, 238, 114, 14, 7, 238, 113, - 14, 7, 238, 112, 14, 7, 238, 111, 14, 7, 238, 110, 14, 7, 238, 109, 14, - 7, 238, 108, 14, 7, 238, 107, 14, 7, 238, 106, 14, 7, 238, 105, 14, 7, - 238, 104, 14, 7, 238, 103, 14, 7, 238, 102, 14, 7, 238, 101, 14, 7, 238, - 100, 14, 7, 238, 99, 14, 7, 238, 98, 14, 7, 238, 97, 14, 7, 238, 96, 14, - 7, 238, 95, 14, 7, 238, 94, 14, 7, 238, 93, 14, 7, 238, 92, 14, 7, 238, - 91, 14, 7, 238, 90, 14, 7, 238, 89, 14, 7, 238, 88, 14, 7, 238, 87, 14, - 7, 238, 86, 14, 7, 238, 85, 14, 7, 238, 84, 14, 7, 238, 83, 14, 7, 238, - 82, 14, 7, 238, 81, 14, 7, 238, 80, 14, 7, 238, 79, 14, 7, 238, 78, 14, - 7, 238, 77, 14, 7, 238, 76, 14, 7, 238, 75, 14, 7, 238, 74, 14, 7, 238, - 73, 14, 7, 238, 72, 14, 7, 238, 71, 14, 7, 238, 70, 14, 7, 238, 69, 14, - 7, 238, 68, 14, 7, 238, 67, 14, 7, 238, 66, 14, 7, 238, 65, 14, 7, 238, - 64, 14, 7, 238, 63, 14, 7, 238, 62, 14, 7, 238, 61, 14, 7, 238, 60, 14, - 7, 238, 59, 14, 7, 238, 58, 14, 7, 238, 57, 14, 7, 238, 56, 14, 7, 238, - 55, 14, 7, 238, 54, 14, 7, 238, 53, 14, 7, 238, 52, 14, 7, 238, 51, 14, - 7, 238, 50, 14, 7, 238, 49, 14, 7, 238, 48, 14, 7, 238, 47, 14, 7, 238, - 46, 14, 7, 238, 45, 14, 7, 238, 44, 14, 7, 238, 43, 14, 7, 238, 42, 14, - 7, 238, 41, 14, 7, 238, 40, 14, 7, 238, 39, 14, 7, 238, 38, 14, 7, 238, - 37, 14, 7, 238, 36, 14, 7, 238, 35, 14, 7, 235, 7, 14, 7, 235, 6, 14, 7, - 235, 5, 14, 7, 235, 4, 14, 7, 235, 3, 14, 7, 235, 2, 14, 7, 235, 1, 14, - 7, 235, 0, 14, 7, 234, 255, 14, 7, 234, 254, 14, 7, 234, 253, 14, 7, 234, - 252, 14, 7, 234, 251, 14, 7, 234, 250, 14, 7, 234, 249, 14, 7, 234, 248, - 14, 7, 234, 247, 14, 7, 234, 246, 14, 7, 234, 245, 14, 7, 234, 244, 14, - 7, 234, 243, 14, 7, 234, 242, 14, 7, 234, 241, 14, 7, 234, 240, 14, 7, - 234, 239, 14, 7, 234, 238, 14, 7, 234, 237, 14, 7, 234, 236, 14, 7, 234, - 235, 14, 7, 234, 234, 14, 7, 234, 233, 14, 7, 234, 232, 14, 7, 234, 231, - 14, 7, 234, 230, 14, 7, 234, 229, 14, 7, 234, 228, 14, 7, 234, 227, 14, - 7, 234, 226, 14, 7, 234, 225, 14, 7, 234, 224, 14, 7, 234, 223, 14, 7, - 234, 222, 14, 7, 234, 221, 14, 7, 234, 220, 14, 7, 233, 174, 14, 7, 233, - 173, 14, 7, 233, 172, 14, 7, 233, 171, 14, 7, 233, 170, 14, 7, 233, 169, - 14, 7, 233, 168, 14, 7, 233, 167, 14, 7, 233, 166, 14, 7, 233, 165, 14, - 7, 233, 164, 14, 7, 233, 163, 14, 7, 233, 162, 14, 7, 233, 161, 14, 7, - 233, 160, 14, 7, 233, 159, 14, 7, 233, 158, 14, 7, 233, 157, 14, 7, 233, - 156, 14, 7, 233, 155, 14, 7, 233, 154, 14, 7, 233, 153, 14, 7, 233, 152, - 14, 7, 233, 151, 14, 7, 233, 150, 14, 7, 233, 149, 14, 7, 233, 148, 14, - 7, 233, 147, 14, 7, 233, 146, 14, 7, 233, 145, 14, 7, 233, 144, 14, 7, - 233, 143, 14, 7, 233, 142, 14, 7, 233, 141, 14, 7, 233, 140, 14, 7, 233, - 139, 14, 7, 233, 138, 14, 7, 233, 137, 14, 7, 233, 136, 14, 7, 233, 135, - 14, 7, 233, 134, 14, 7, 233, 133, 14, 7, 233, 132, 14, 7, 233, 131, 14, - 7, 233, 130, 14, 7, 233, 129, 14, 7, 233, 128, 14, 7, 233, 127, 14, 7, - 233, 126, 14, 7, 233, 125, 14, 7, 233, 124, 14, 7, 233, 123, 14, 7, 233, - 122, 14, 7, 233, 121, 14, 7, 233, 120, 14, 7, 233, 119, 14, 7, 233, 118, - 14, 7, 233, 117, 14, 7, 233, 116, 14, 7, 233, 115, 14, 7, 233, 114, 14, - 7, 233, 113, 14, 7, 233, 112, 14, 7, 233, 111, 14, 7, 233, 110, 14, 7, - 232, 50, 14, 7, 232, 49, 14, 7, 232, 48, 14, 7, 232, 47, 14, 7, 232, 46, - 14, 7, 232, 45, 14, 7, 232, 44, 14, 7, 232, 43, 14, 7, 232, 42, 14, 7, - 232, 41, 14, 7, 232, 40, 14, 7, 232, 39, 14, 7, 232, 38, 14, 7, 232, 37, - 14, 7, 232, 36, 14, 7, 232, 35, 14, 7, 232, 34, 14, 7, 232, 33, 14, 7, - 232, 32, 14, 7, 232, 31, 14, 7, 232, 30, 14, 7, 232, 29, 14, 7, 232, 28, - 14, 7, 232, 27, 14, 7, 232, 26, 14, 7, 232, 25, 14, 7, 232, 24, 14, 7, - 232, 23, 14, 7, 232, 22, 14, 7, 232, 21, 14, 7, 232, 20, 14, 7, 232, 19, - 14, 7, 232, 18, 14, 7, 232, 17, 14, 7, 232, 16, 14, 7, 232, 15, 14, 7, - 232, 14, 14, 7, 232, 13, 14, 7, 232, 12, 14, 7, 232, 11, 14, 7, 232, 10, - 14, 7, 232, 9, 14, 7, 232, 8, 14, 7, 232, 7, 14, 7, 232, 6, 14, 7, 232, - 5, 14, 7, 232, 4, 14, 7, 232, 3, 14, 7, 232, 2, 14, 7, 232, 1, 14, 7, - 232, 0, 14, 7, 231, 255, 14, 7, 231, 254, 14, 7, 231, 253, 14, 7, 231, - 252, 14, 7, 231, 251, 14, 7, 231, 250, 14, 7, 231, 249, 14, 7, 231, 248, - 14, 7, 231, 247, 14, 7, 231, 246, 14, 7, 231, 245, 14, 7, 231, 244, 14, - 7, 231, 243, 14, 7, 230, 114, 14, 7, 230, 113, 14, 7, 230, 112, 14, 7, - 230, 111, 14, 7, 230, 110, 14, 7, 230, 109, 14, 7, 230, 108, 14, 7, 230, - 107, 14, 7, 230, 106, 14, 7, 228, 54, 14, 7, 228, 53, 14, 7, 228, 52, 14, - 7, 228, 51, 14, 7, 228, 50, 14, 7, 228, 49, 14, 7, 228, 48, 14, 7, 228, - 47, 14, 7, 228, 46, 14, 7, 228, 45, 14, 7, 228, 44, 14, 7, 228, 43, 14, - 7, 228, 42, 14, 7, 228, 41, 14, 7, 228, 40, 14, 7, 228, 39, 14, 7, 228, - 38, 14, 7, 228, 37, 14, 7, 228, 36, 14, 7, 222, 151, 14, 7, 222, 150, 14, - 7, 222, 149, 14, 7, 222, 148, 14, 7, 222, 147, 14, 7, 222, 146, 14, 7, - 222, 145, 14, 7, 222, 144, 14, 7, 220, 140, 14, 7, 220, 139, 14, 7, 220, - 138, 14, 7, 220, 137, 14, 7, 220, 136, 14, 7, 220, 135, 14, 7, 220, 134, - 14, 7, 220, 133, 14, 7, 220, 132, 14, 7, 220, 131, 14, 7, 218, 166, 14, - 7, 218, 165, 14, 7, 218, 164, 14, 7, 218, 162, 14, 7, 218, 160, 14, 7, - 218, 159, 14, 7, 218, 157, 14, 7, 218, 155, 14, 7, 218, 153, 14, 7, 218, - 151, 14, 7, 218, 149, 14, 7, 218, 147, 14, 7, 218, 145, 14, 7, 218, 144, - 14, 7, 218, 142, 14, 7, 218, 140, 14, 7, 218, 139, 14, 7, 218, 138, 14, - 7, 218, 137, 14, 7, 218, 136, 14, 7, 218, 135, 14, 7, 218, 134, 14, 7, - 218, 133, 14, 7, 218, 132, 14, 7, 218, 130, 14, 7, 218, 128, 14, 7, 218, - 126, 14, 7, 218, 125, 14, 7, 218, 123, 14, 7, 218, 122, 14, 7, 218, 120, - 14, 7, 218, 119, 14, 7, 218, 117, 14, 7, 218, 115, 14, 7, 218, 113, 14, - 7, 218, 111, 14, 7, 218, 109, 14, 7, 218, 108, 14, 7, 218, 106, 14, 7, - 218, 104, 14, 7, 218, 103, 14, 7, 218, 101, 14, 7, 218, 99, 14, 7, 218, - 97, 14, 7, 218, 95, 14, 7, 218, 94, 14, 7, 218, 92, 14, 7, 218, 90, 14, - 7, 218, 88, 14, 7, 218, 87, 14, 7, 218, 85, 14, 7, 218, 83, 14, 7, 218, - 82, 14, 7, 218, 81, 14, 7, 218, 79, 14, 7, 218, 77, 14, 7, 218, 75, 14, - 7, 218, 73, 14, 7, 218, 71, 14, 7, 218, 69, 14, 7, 218, 67, 14, 7, 218, - 66, 14, 7, 218, 64, 14, 7, 218, 62, 14, 7, 218, 60, 14, 7, 218, 58, 14, - 7, 215, 56, 14, 7, 215, 55, 14, 7, 215, 54, 14, 7, 215, 53, 14, 7, 215, - 52, 14, 7, 215, 51, 14, 7, 215, 50, 14, 7, 215, 49, 14, 7, 215, 48, 14, - 7, 215, 47, 14, 7, 215, 46, 14, 7, 215, 45, 14, 7, 215, 44, 14, 7, 215, - 43, 14, 7, 215, 42, 14, 7, 215, 41, 14, 7, 215, 40, 14, 7, 215, 39, 14, - 7, 215, 38, 14, 7, 215, 37, 14, 7, 215, 36, 14, 7, 215, 35, 14, 7, 215, - 34, 14, 7, 215, 33, 14, 7, 215, 32, 14, 7, 215, 31, 14, 7, 215, 30, 14, - 7, 215, 29, 14, 7, 215, 28, 14, 7, 215, 27, 14, 7, 215, 26, 14, 7, 215, - 25, 14, 7, 215, 24, 14, 7, 215, 23, 14, 7, 215, 22, 14, 7, 215, 21, 14, - 7, 215, 20, 14, 7, 215, 19, 14, 7, 215, 18, 14, 7, 215, 17, 14, 7, 215, - 16, 14, 7, 215, 15, 14, 7, 215, 14, 14, 7, 215, 13, 14, 7, 215, 12, 14, - 7, 215, 11, 14, 7, 215, 10, 14, 7, 215, 9, 14, 7, 215, 8, 14, 7, 213, - 104, 14, 7, 213, 103, 14, 7, 213, 102, 14, 7, 213, 101, 14, 7, 213, 100, - 14, 7, 213, 99, 14, 7, 213, 98, 14, 7, 213, 97, 14, 7, 213, 96, 14, 7, - 213, 95, 14, 7, 213, 94, 14, 7, 213, 93, 14, 7, 213, 92, 14, 7, 213, 91, - 14, 7, 213, 90, 14, 7, 213, 89, 14, 7, 213, 88, 14, 7, 213, 87, 14, 7, - 213, 86, 14, 7, 213, 85, 14, 7, 213, 84, 14, 7, 213, 83, 14, 7, 212, 174, - 14, 7, 212, 173, 14, 7, 212, 172, 14, 7, 212, 171, 14, 7, 212, 170, 14, - 7, 212, 169, 14, 7, 212, 168, 14, 7, 212, 167, 14, 7, 212, 166, 14, 7, - 212, 165, 14, 7, 212, 164, 14, 7, 212, 163, 14, 7, 212, 162, 14, 7, 212, - 161, 14, 7, 212, 160, 14, 7, 212, 159, 14, 7, 212, 158, 14, 7, 212, 157, - 14, 7, 212, 156, 14, 7, 212, 155, 14, 7, 212, 154, 14, 7, 212, 153, 14, - 7, 212, 152, 14, 7, 212, 151, 14, 7, 212, 150, 14, 7, 212, 149, 14, 7, - 212, 2, 14, 7, 212, 1, 14, 7, 212, 0, 14, 7, 211, 255, 14, 7, 211, 254, - 14, 7, 211, 253, 14, 7, 211, 252, 14, 7, 211, 251, 14, 7, 211, 250, 14, - 7, 211, 249, 14, 7, 211, 248, 14, 7, 211, 247, 14, 7, 211, 246, 14, 7, - 211, 245, 14, 7, 211, 244, 14, 7, 211, 243, 14, 7, 211, 242, 14, 7, 211, - 241, 14, 7, 211, 240, 14, 7, 211, 239, 14, 7, 211, 238, 14, 7, 211, 237, - 14, 7, 211, 236, 14, 7, 211, 235, 14, 7, 211, 234, 14, 7, 211, 233, 14, - 7, 211, 232, 14, 7, 211, 231, 14, 7, 211, 230, 14, 7, 211, 229, 14, 7, - 211, 228, 14, 7, 211, 227, 14, 7, 211, 226, 14, 7, 211, 225, 14, 7, 211, - 224, 14, 7, 211, 223, 14, 7, 211, 222, 14, 7, 211, 221, 14, 7, 211, 220, - 14, 7, 211, 219, 14, 7, 211, 218, 14, 7, 211, 217, 14, 7, 211, 216, 14, - 7, 211, 215, 14, 7, 211, 214, 14, 7, 211, 213, 14, 7, 211, 212, 14, 7, - 211, 211, 14, 7, 211, 210, 14, 7, 211, 209, 14, 7, 211, 208, 14, 7, 211, - 207, 14, 7, 211, 206, 14, 7, 211, 205, 14, 7, 211, 204, 14, 7, 211, 203, - 14, 7, 211, 202, 14, 7, 211, 201, 14, 7, 211, 200, 14, 7, 211, 199, 14, - 7, 211, 198, 14, 7, 211, 197, 14, 7, 211, 196, 14, 7, 211, 195, 14, 7, - 211, 194, 14, 7, 211, 193, 14, 7, 211, 192, 14, 7, 211, 191, 14, 7, 211, - 190, 14, 7, 211, 189, 14, 7, 211, 188, 14, 7, 211, 187, 14, 7, 211, 186, - 14, 7, 211, 185, 14, 7, 211, 184, 14, 7, 210, 235, 14, 7, 210, 234, 14, - 7, 210, 233, 14, 7, 210, 232, 14, 7, 210, 231, 14, 7, 210, 230, 14, 7, - 210, 229, 14, 7, 210, 228, 14, 7, 210, 227, 14, 7, 210, 226, 14, 7, 210, - 225, 14, 7, 210, 224, 14, 7, 210, 223, 14, 7, 208, 103, 14, 7, 208, 102, - 14, 7, 208, 101, 14, 7, 208, 100, 14, 7, 208, 99, 14, 7, 208, 98, 14, 7, - 208, 97, 14, 7, 207, 220, 14, 7, 207, 219, 14, 7, 207, 218, 14, 7, 207, - 217, 14, 7, 207, 216, 14, 7, 207, 215, 14, 7, 207, 214, 14, 7, 207, 213, - 14, 7, 207, 212, 14, 7, 207, 211, 14, 7, 207, 210, 14, 7, 207, 209, 14, - 7, 207, 208, 14, 7, 207, 207, 14, 7, 207, 206, 14, 7, 207, 205, 14, 7, - 207, 204, 14, 7, 207, 203, 14, 7, 207, 202, 14, 7, 207, 201, 14, 7, 207, - 200, 14, 7, 207, 199, 14, 7, 207, 198, 14, 7, 207, 197, 14, 7, 207, 196, - 14, 7, 207, 195, 14, 7, 207, 194, 14, 7, 207, 193, 14, 7, 207, 192, 14, - 7, 207, 191, 14, 7, 207, 190, 14, 7, 207, 189, 14, 7, 207, 188, 14, 7, - 207, 187, 14, 7, 206, 5, 14, 7, 206, 4, 14, 7, 206, 3, 14, 7, 206, 2, 14, - 7, 206, 1, 14, 7, 206, 0, 14, 7, 205, 255, 14, 7, 205, 254, 14, 7, 205, - 253, 14, 7, 205, 252, 14, 7, 205, 251, 14, 7, 205, 250, 14, 7, 205, 249, - 14, 7, 205, 248, 14, 7, 205, 247, 14, 7, 205, 246, 14, 7, 205, 245, 14, - 7, 205, 244, 14, 7, 205, 243, 14, 7, 205, 242, 14, 7, 205, 241, 14, 7, - 205, 240, 14, 7, 205, 239, 14, 7, 205, 238, 14, 7, 205, 237, 14, 7, 205, - 236, 14, 7, 205, 235, 14, 7, 205, 234, 14, 7, 205, 233, 14, 7, 205, 232, - 14, 7, 205, 231, 14, 7, 205, 230, 14, 7, 205, 229, 14, 7, 205, 228, 14, - 7, 205, 227, 14, 7, 205, 226, 14, 7, 205, 225, 14, 7, 205, 224, 14, 7, - 205, 223, 14, 7, 205, 222, 14, 7, 205, 221, 14, 7, 205, 220, 14, 7, 205, - 219, 14, 7, 205, 218, 14, 7, 205, 217, 14, 7, 205, 216, 14, 7, 205, 215, - 14, 7, 205, 214, 14, 7, 205, 213, 14, 7, 205, 212, 14, 7, 205, 211, 14, - 7, 205, 210, 14, 7, 205, 209, 14, 7, 205, 208, 14, 7, 200, 40, 14, 7, + 106, 51, 1, 195, 188, 191, 106, 51, 1, 203, 166, 191, 106, 51, 1, 201, + 176, 191, 106, 51, 1, 188, 191, 106, 51, 1, 140, 191, 106, 51, 1, 220, + 248, 191, 106, 51, 53, 120, 77, 191, 106, 51, 3, 195, 40, 191, 106, 51, + 3, 247, 121, 191, 106, 51, 3, 247, 122, 4, 211, 44, 191, 106, 51, 3, 247, + 124, 4, 211, 44, 191, 106, 51, 3, 251, 73, 191, 106, 51, 3, 195, 35, 191, + 106, 51, 242, 203, 1, 165, 191, 106, 51, 242, 204, 1, 170, 191, 106, 51, + 242, 204, 1, 165, 191, 106, 51, 242, 204, 1, 173, 191, 106, 51, 242, 204, + 1, 195, 188, 191, 106, 51, 89, 229, 238, 77, 191, 106, 51, 242, 217, 229, + 238, 77, 191, 106, 51, 87, 197, 152, 191, 106, 51, 87, 203, 158, 191, + 106, 51, 87, 55, 203, 158, 191, 106, 51, 87, 180, 197, 152, 191, 106, 51, + 89, 235, 132, 229, 238, 77, 191, 106, 51, 242, 217, 235, 132, 229, 238, + 77, 191, 106, 51, 200, 239, 201, 252, 1, 65, 201, 252, 18, 3, 68, 201, + 252, 18, 3, 196, 152, 201, 252, 18, 3, 66, 201, 252, 18, 3, 71, 201, 252, + 18, 3, 74, 201, 252, 18, 3, 211, 153, 201, 252, 18, 3, 251, 238, 201, + 252, 18, 3, 250, 165, 201, 252, 18, 3, 117, 146, 201, 252, 18, 3, 117, + 172, 201, 252, 18, 219, 200, 77, 201, 252, 1, 155, 201, 252, 1, 221, 217, + 201, 252, 1, 231, 242, 201, 252, 1, 231, 93, 201, 252, 1, 214, 70, 201, + 252, 1, 247, 162, 201, 252, 1, 247, 3, 201, 252, 1, 223, 34, 201, 252, 1, + 222, 254, 201, 252, 1, 212, 103, 201, 252, 1, 197, 132, 201, 252, 1, 197, + 120, 201, 252, 1, 237, 193, 201, 252, 1, 237, 177, 201, 252, 1, 213, 81, + 201, 252, 1, 190, 190, 201, 252, 1, 199, 49, 201, 252, 1, 238, 34, 201, + 252, 1, 237, 70, 201, 252, 1, 181, 201, 252, 1, 168, 201, 252, 1, 209, + 230, 201, 252, 1, 249, 155, 201, 252, 1, 248, 205, 201, 252, 1, 174, 201, + 252, 1, 197, 168, 201, 252, 1, 197, 157, 201, 252, 1, 235, 37, 201, 252, + 1, 191, 71, 201, 252, 1, 191, 123, 201, 252, 1, 255, 216, 201, 252, 1, + 170, 201, 252, 1, 165, 201, 252, 1, 173, 201, 252, 1, 195, 188, 201, 252, + 1, 203, 166, 201, 252, 1, 201, 176, 201, 252, 1, 188, 201, 252, 1, 140, + 201, 252, 1, 220, 248, 201, 252, 3, 222, 239, 201, 252, 3, 196, 75, 201, + 252, 242, 203, 1, 165, 201, 252, 242, 203, 1, 173, 201, 252, 242, 203, 1, + 203, 166, 201, 252, 242, 203, 1, 188, 201, 252, 53, 120, 3, 232, 53, 201, + 252, 53, 120, 3, 222, 154, 201, 252, 53, 120, 3, 214, 72, 201, 252, 53, + 120, 3, 238, 129, 201, 252, 53, 120, 3, 215, 63, 201, 252, 53, 120, 3, + 250, 122, 201, 252, 53, 120, 3, 218, 170, 201, 252, 53, 120, 3, 146, 201, + 252, 53, 120, 3, 172, 201, 252, 53, 120, 3, 203, 168, 201, 252, 53, 120, + 3, 206, 9, 201, 252, 53, 120, 3, 255, 216, 201, 252, 3, 251, 73, 201, + 252, 3, 195, 35, 201, 252, 231, 155, 77, 201, 252, 200, 239, 201, 252, + 87, 197, 152, 201, 252, 87, 203, 158, 201, 252, 87, 55, 203, 158, 201, + 252, 87, 209, 81, 201, 252, 229, 238, 87, 4, 215, 208, 23, 200, 199, 23, + 197, 225, 232, 212, 201, 252, 229, 238, 87, 4, 215, 208, 23, 200, 199, + 23, 232, 212, 201, 252, 229, 238, 87, 4, 215, 208, 23, 200, 198, 201, + 252, 199, 81, 217, 57, 201, 252, 199, 81, 217, 56, 21, 22, 214, 209, 229, + 160, 21, 22, 214, 209, 229, 132, 21, 22, 214, 209, 229, 25, 21, 22, 214, + 209, 228, 254, 21, 22, 214, 209, 140, 21, 22, 214, 209, 230, 93, 21, 22, + 214, 209, 203, 16, 21, 22, 214, 209, 203, 15, 21, 22, 214, 209, 203, 12, + 21, 22, 214, 209, 203, 11, 21, 22, 214, 209, 203, 18, 21, 22, 214, 209, + 203, 17, 21, 22, 201, 238, 21, 22, 201, 225, 21, 22, 201, 208, 21, 22, + 201, 250, 210, 83, 243, 17, 230, 5, 1, 168, 210, 83, 243, 17, 230, 5, 1, + 155, 210, 83, 243, 17, 230, 5, 1, 173, 210, 83, 243, 17, 230, 5, 1, 174, + 210, 83, 243, 17, 230, 5, 1, 238, 34, 210, 83, 243, 17, 230, 5, 1, 191, + 123, 210, 83, 243, 17, 230, 5, 1, 195, 188, 210, 83, 243, 17, 230, 5, 1, + 214, 70, 210, 83, 243, 17, 230, 5, 1, 140, 210, 83, 243, 17, 230, 5, 1, + 231, 242, 210, 83, 243, 17, 230, 5, 1, 221, 217, 210, 83, 243, 17, 230, + 5, 1, 188, 210, 83, 243, 17, 230, 5, 1, 249, 155, 210, 83, 243, 17, 230, + 5, 1, 247, 162, 210, 83, 243, 17, 230, 5, 1, 190, 190, 210, 83, 243, 17, + 230, 5, 1, 199, 49, 210, 83, 243, 17, 230, 5, 1, 181, 210, 83, 243, 17, + 230, 5, 1, 209, 230, 210, 83, 243, 17, 230, 5, 1, 165, 210, 83, 243, 17, + 230, 5, 1, 233, 111, 210, 83, 243, 17, 230, 5, 1, 247, 3, 210, 83, 243, + 17, 230, 5, 1, 65, 210, 83, 243, 17, 230, 5, 1, 71, 210, 83, 243, 17, + 230, 5, 1, 68, 210, 83, 243, 17, 230, 5, 1, 74, 210, 83, 243, 17, 230, 5, + 1, 66, 210, 83, 243, 17, 230, 5, 1, 196, 168, 210, 83, 243, 17, 230, 5, + 1, 228, 37, 210, 83, 243, 17, 230, 5, 1, 53, 210, 238, 210, 83, 243, 17, + 230, 5, 1, 53, 222, 154, 210, 83, 243, 17, 230, 5, 1, 53, 200, 43, 210, + 83, 243, 17, 230, 5, 1, 53, 218, 170, 210, 83, 243, 17, 230, 5, 1, 53, + 215, 63, 210, 83, 243, 17, 230, 5, 1, 53, 172, 210, 83, 243, 17, 230, 5, + 1, 53, 193, 224, 210, 83, 243, 17, 230, 5, 1, 53, 214, 72, 210, 83, 243, + 17, 230, 5, 1, 53, 192, 159, 210, 83, 243, 17, 230, 5, 206, 181, 163, + 219, 21, 210, 83, 243, 17, 230, 5, 206, 181, 198, 79, 210, 83, 243, 17, + 230, 5, 205, 139, 231, 13, 201, 64, 210, 83, 243, 17, 230, 5, 206, 181, + 163, 180, 233, 1, 210, 83, 243, 17, 230, 5, 206, 181, 163, 233, 1, 210, + 83, 243, 17, 230, 5, 205, 139, 231, 13, 201, 65, 233, 1, 210, 83, 243, + 17, 230, 5, 205, 139, 163, 219, 21, 210, 83, 243, 17, 230, 5, 205, 139, + 198, 79, 210, 83, 243, 17, 230, 5, 205, 139, 163, 180, 233, 1, 210, 83, + 243, 17, 230, 5, 205, 139, 163, 233, 1, 210, 83, 243, 17, 230, 5, 216, + 87, 198, 79, 210, 83, 243, 17, 230, 5, 231, 13, 201, 65, 195, 167, 210, + 83, 243, 17, 230, 5, 216, 87, 163, 180, 233, 1, 210, 83, 243, 17, 230, 5, + 216, 87, 163, 233, 1, 210, 83, 243, 17, 230, 5, 218, 241, 163, 219, 21, + 210, 83, 243, 17, 230, 5, 218, 241, 198, 79, 210, 83, 243, 17, 230, 5, + 231, 13, 201, 64, 210, 83, 243, 17, 230, 5, 218, 241, 163, 180, 233, 1, + 210, 83, 243, 17, 230, 5, 218, 241, 163, 233, 1, 210, 83, 243, 17, 230, + 5, 231, 13, 201, 65, 233, 1, 100, 229, 238, 77, 100, 229, 238, 87, 4, + 229, 229, 100, 3, 248, 201, 100, 3, 248, 202, 4, 102, 100, 3, 233, 207, + 248, 201, 100, 3, 233, 207, 248, 202, 4, 102, 100, 3, 193, 102, 232, 227, + 248, 201, 100, 3, 193, 102, 213, 176, 248, 201, 100, 3, 207, 19, 213, + 176, 248, 201, 100, 3, 216, 45, 248, 203, 1, 65, 248, 203, 1, 252, 208, + 248, 203, 1, 68, 248, 203, 1, 223, 201, 248, 203, 1, 66, 248, 203, 1, + 196, 30, 248, 203, 1, 117, 146, 248, 203, 1, 117, 206, 111, 248, 203, 1, + 117, 172, 248, 203, 1, 71, 248, 203, 1, 251, 238, 248, 203, 1, 74, 248, + 203, 1, 250, 165, 248, 203, 1, 155, 248, 203, 1, 221, 217, 248, 203, 1, + 231, 242, 248, 203, 1, 231, 93, 248, 203, 1, 214, 70, 248, 203, 1, 247, + 162, 248, 203, 1, 247, 3, 248, 203, 1, 223, 34, 248, 203, 1, 222, 254, + 248, 203, 1, 212, 103, 248, 203, 1, 197, 132, 248, 203, 1, 197, 120, 248, + 203, 1, 237, 193, 248, 203, 1, 237, 177, 248, 203, 1, 213, 81, 248, 203, + 1, 190, 190, 248, 203, 1, 199, 49, 248, 203, 1, 238, 34, 248, 203, 1, + 237, 70, 248, 203, 1, 181, 248, 203, 1, 168, 248, 203, 1, 209, 230, 248, + 203, 1, 249, 155, 248, 203, 1, 248, 205, 248, 203, 1, 174, 248, 203, 1, + 170, 248, 203, 1, 165, 248, 203, 1, 173, 248, 203, 1, 195, 188, 248, 203, + 1, 203, 166, 248, 203, 1, 201, 176, 248, 203, 1, 188, 248, 203, 1, 140, + 248, 203, 18, 3, 252, 208, 248, 203, 18, 3, 68, 248, 203, 18, 3, 223, + 201, 248, 203, 18, 3, 66, 248, 203, 18, 3, 196, 30, 248, 203, 18, 3, 117, + 146, 248, 203, 18, 3, 117, 206, 111, 248, 203, 18, 3, 117, 172, 248, 203, + 18, 3, 71, 248, 203, 18, 3, 251, 238, 248, 203, 18, 3, 74, 248, 203, 18, + 3, 250, 165, 248, 203, 3, 247, 121, 248, 203, 3, 251, 73, 248, 203, 3, + 195, 35, 248, 203, 3, 195, 40, 248, 203, 3, 250, 147, 248, 203, 237, 240, + 248, 203, 55, 237, 240, 248, 203, 193, 23, 204, 11, 248, 203, 231, 206, + 233, 4, 248, 203, 231, 206, 233, 3, 248, 203, 17, 191, 77, 248, 203, 17, + 107, 248, 203, 17, 109, 248, 203, 17, 138, 248, 203, 17, 134, 248, 203, + 17, 150, 248, 203, 17, 169, 248, 203, 17, 175, 248, 203, 17, 171, 248, + 203, 17, 178, 248, 203, 31, 107, 248, 203, 31, 109, 248, 203, 31, 138, + 248, 203, 31, 134, 248, 203, 31, 150, 248, 203, 31, 169, 248, 203, 31, + 175, 248, 203, 31, 171, 248, 203, 31, 178, 248, 203, 31, 199, 95, 248, + 203, 31, 197, 32, 248, 203, 31, 198, 249, 248, 203, 31, 232, 137, 248, + 203, 31, 233, 17, 248, 203, 31, 202, 121, 248, 203, 31, 203, 242, 248, + 203, 31, 234, 155, 248, 203, 31, 213, 171, 248, 203, 228, 141, 196, 91, + 77, 217, 59, 229, 238, 77, 217, 59, 87, 203, 158, 217, 59, 1, 155, 217, + 59, 1, 221, 217, 217, 59, 1, 231, 242, 217, 59, 1, 214, 70, 217, 59, 1, + 247, 162, 217, 59, 1, 247, 3, 217, 59, 1, 223, 34, 217, 59, 1, 212, 103, + 217, 59, 1, 190, 190, 217, 59, 1, 199, 49, 217, 59, 1, 238, 34, 217, 59, + 1, 181, 217, 59, 1, 168, 217, 59, 1, 209, 230, 217, 59, 1, 249, 155, 217, + 59, 1, 174, 217, 59, 1, 197, 168, 217, 59, 1, 197, 157, 217, 59, 1, 235, + 37, 217, 59, 1, 193, 190, 217, 59, 1, 191, 71, 217, 59, 1, 191, 123, 217, + 59, 1, 255, 216, 217, 59, 1, 170, 217, 59, 1, 165, 217, 59, 1, 173, 217, + 59, 1, 203, 166, 217, 59, 1, 188, 217, 59, 1, 140, 217, 59, 1, 65, 217, + 59, 200, 240, 1, 155, 217, 59, 200, 240, 1, 221, 217, 217, 59, 200, 240, + 1, 231, 242, 217, 59, 200, 240, 1, 214, 70, 217, 59, 200, 240, 1, 247, + 162, 217, 59, 200, 240, 1, 247, 3, 217, 59, 200, 240, 1, 223, 34, 217, + 59, 200, 240, 1, 212, 103, 217, 59, 200, 240, 1, 190, 190, 217, 59, 200, + 240, 1, 199, 49, 217, 59, 200, 240, 1, 238, 34, 217, 59, 200, 240, 1, + 181, 217, 59, 200, 240, 1, 168, 217, 59, 200, 240, 1, 209, 230, 217, 59, + 200, 240, 1, 249, 155, 217, 59, 200, 240, 1, 174, 217, 59, 200, 240, 1, + 197, 168, 217, 59, 200, 240, 1, 197, 157, 217, 59, 200, 240, 1, 235, 37, + 217, 59, 200, 240, 1, 193, 190, 217, 59, 200, 240, 1, 191, 71, 217, 59, + 200, 240, 1, 191, 123, 217, 59, 200, 240, 1, 170, 217, 59, 200, 240, 1, + 165, 217, 59, 200, 240, 1, 173, 217, 59, 200, 240, 1, 203, 166, 217, 59, + 200, 240, 1, 188, 217, 59, 200, 240, 1, 140, 217, 59, 200, 240, 1, 65, + 217, 59, 18, 3, 252, 208, 217, 59, 18, 3, 68, 217, 59, 18, 3, 66, 217, + 59, 18, 3, 71, 217, 59, 18, 3, 74, 217, 59, 3, 251, 73, 217, 59, 3, 247, + 121, 217, 43, 129, 1, 65, 217, 43, 129, 1, 252, 208, 217, 43, 129, 1, 68, + 217, 43, 129, 1, 223, 201, 217, 43, 129, 1, 66, 217, 43, 129, 1, 196, 30, + 217, 43, 129, 1, 71, 217, 43, 129, 1, 251, 238, 217, 43, 129, 1, 74, 217, + 43, 129, 1, 250, 165, 217, 43, 129, 1, 155, 217, 43, 129, 1, 221, 217, + 217, 43, 129, 1, 231, 242, 217, 43, 129, 1, 231, 93, 217, 43, 129, 1, + 214, 70, 217, 43, 129, 1, 247, 162, 217, 43, 129, 1, 247, 3, 217, 43, + 129, 1, 223, 34, 217, 43, 129, 1, 222, 254, 217, 43, 129, 1, 212, 103, + 217, 43, 129, 1, 197, 132, 217, 43, 129, 1, 197, 120, 217, 43, 129, 1, + 237, 193, 217, 43, 129, 1, 237, 177, 217, 43, 129, 1, 213, 81, 217, 43, + 129, 1, 190, 190, 217, 43, 129, 1, 199, 49, 217, 43, 129, 1, 238, 34, + 217, 43, 129, 1, 237, 70, 217, 43, 129, 1, 181, 217, 43, 129, 1, 168, + 217, 43, 129, 1, 209, 230, 217, 43, 129, 1, 249, 155, 217, 43, 129, 1, + 248, 205, 217, 43, 129, 1, 174, 217, 43, 129, 1, 170, 217, 43, 129, 1, + 165, 217, 43, 129, 1, 173, 217, 43, 129, 1, 195, 188, 217, 43, 129, 1, + 203, 166, 217, 43, 129, 1, 201, 176, 217, 43, 129, 1, 188, 217, 43, 129, + 1, 140, 217, 43, 129, 1, 219, 75, 217, 43, 129, 1, 220, 248, 217, 43, + 129, 1, 222, 204, 217, 43, 129, 1, 198, 26, 217, 43, 129, 18, 3, 252, + 208, 217, 43, 129, 18, 3, 68, 217, 43, 129, 18, 3, 223, 201, 217, 43, + 129, 18, 3, 66, 217, 43, 129, 18, 3, 196, 30, 217, 43, 129, 18, 3, 117, + 146, 217, 43, 129, 18, 3, 71, 217, 43, 129, 18, 3, 251, 238, 217, 43, + 129, 18, 3, 74, 217, 43, 129, 18, 3, 250, 165, 217, 43, 129, 3, 251, 73, + 217, 43, 129, 3, 195, 35, 217, 43, 129, 3, 212, 143, 217, 43, 129, 3, + 247, 123, 217, 43, 129, 3, 230, 74, 217, 43, 129, 195, 40, 217, 43, 129, + 207, 45, 217, 43, 129, 207, 183, 217, 43, 129, 17, 191, 77, 217, 43, 129, + 17, 107, 217, 43, 129, 17, 109, 217, 43, 129, 17, 138, 217, 43, 129, 17, + 134, 217, 43, 129, 17, 150, 217, 43, 129, 17, 169, 217, 43, 129, 17, 175, + 217, 43, 129, 17, 171, 217, 43, 129, 17, 178, 230, 159, 129, 1, 65, 230, + 159, 129, 1, 252, 208, 230, 159, 129, 1, 68, 230, 159, 129, 1, 223, 201, + 230, 159, 129, 1, 66, 230, 159, 129, 1, 196, 30, 230, 159, 129, 1, 234, + 190, 230, 159, 129, 1, 251, 238, 230, 159, 129, 1, 211, 89, 230, 159, + 129, 1, 250, 165, 230, 159, 129, 1, 170, 230, 159, 129, 1, 195, 188, 230, + 159, 129, 1, 249, 155, 230, 159, 129, 1, 248, 205, 230, 159, 129, 1, 174, + 230, 159, 129, 1, 155, 230, 159, 129, 1, 221, 217, 230, 159, 129, 1, 190, + 190, 230, 159, 129, 1, 199, 49, 230, 159, 129, 1, 173, 230, 159, 129, 1, + 231, 242, 230, 159, 129, 1, 231, 93, 230, 159, 129, 1, 238, 34, 230, 159, + 129, 1, 237, 70, 230, 159, 129, 1, 181, 230, 159, 129, 1, 247, 162, 230, + 159, 129, 1, 247, 3, 230, 159, 129, 1, 197, 132, 230, 159, 129, 1, 197, + 120, 230, 159, 129, 1, 219, 75, 230, 159, 129, 1, 223, 34, 230, 159, 129, + 1, 222, 254, 230, 159, 129, 1, 237, 193, 230, 159, 129, 1, 237, 177, 230, + 159, 129, 1, 214, 70, 230, 159, 129, 1, 168, 230, 159, 129, 1, 209, 230, + 230, 159, 129, 1, 140, 230, 159, 129, 1, 165, 230, 159, 129, 1, 188, 230, + 159, 129, 18, 3, 252, 208, 230, 159, 129, 18, 3, 68, 230, 159, 129, 18, + 3, 223, 201, 230, 159, 129, 18, 3, 66, 230, 159, 129, 18, 3, 196, 30, + 230, 159, 129, 18, 3, 234, 190, 230, 159, 129, 18, 3, 251, 238, 230, 159, + 129, 18, 3, 211, 89, 230, 159, 129, 18, 3, 250, 165, 230, 159, 129, 3, + 251, 73, 230, 159, 129, 3, 195, 35, 230, 159, 129, 195, 40, 230, 159, + 129, 211, 115, 230, 159, 129, 17, 191, 77, 230, 159, 129, 17, 107, 230, + 159, 129, 17, 109, 230, 159, 129, 17, 138, 230, 159, 129, 17, 134, 230, + 159, 129, 17, 150, 230, 159, 129, 17, 169, 230, 159, 129, 17, 175, 230, + 159, 129, 17, 171, 230, 159, 129, 17, 178, 217, 104, 1, 155, 217, 104, 1, + 231, 242, 217, 104, 1, 214, 70, 217, 104, 1, 168, 217, 104, 1, 249, 155, + 217, 104, 1, 174, 217, 104, 1, 190, 190, 217, 104, 1, 238, 34, 217, 104, + 1, 181, 217, 104, 1, 247, 162, 217, 104, 1, 223, 34, 217, 104, 1, 212, + 103, 217, 104, 1, 170, 217, 104, 1, 165, 217, 104, 1, 173, 217, 104, 1, + 195, 188, 217, 104, 1, 188, 217, 104, 1, 65, 217, 104, 251, 120, 217, + 104, 18, 3, 68, 217, 104, 18, 3, 66, 217, 104, 18, 3, 71, 217, 104, 18, + 3, 74, 217, 104, 210, 96, 217, 104, 234, 97, 79, 205, 54, 222, 35, 3, + 247, 121, 222, 35, 3, 251, 73, 222, 35, 3, 207, 45, 222, 35, 3, 195, 35, + 222, 35, 1, 65, 222, 35, 1, 252, 208, 222, 35, 1, 68, 222, 35, 1, 223, + 201, 222, 35, 1, 66, 222, 35, 1, 196, 30, 222, 35, 1, 117, 146, 222, 35, + 1, 117, 206, 111, 222, 35, 1, 117, 172, 222, 35, 1, 117, 219, 76, 222, + 35, 1, 71, 222, 35, 1, 251, 238, 222, 35, 1, 74, 222, 35, 1, 155, 222, + 35, 1, 221, 217, 222, 35, 1, 231, 242, 222, 35, 1, 231, 93, 222, 35, 1, + 214, 70, 222, 35, 1, 247, 162, 222, 35, 1, 247, 3, 222, 35, 1, 223, 34, + 222, 35, 1, 222, 254, 222, 35, 1, 212, 103, 222, 35, 1, 197, 132, 222, + 35, 1, 197, 120, 222, 35, 1, 237, 193, 222, 35, 1, 237, 177, 222, 35, 1, + 213, 81, 222, 35, 1, 190, 190, 222, 35, 1, 199, 49, 222, 35, 1, 238, 34, + 222, 35, 1, 237, 70, 222, 35, 1, 181, 222, 35, 1, 168, 222, 35, 1, 209, + 230, 222, 35, 1, 249, 155, 222, 35, 1, 248, 205, 222, 35, 1, 174, 222, + 35, 1, 170, 222, 35, 1, 165, 222, 35, 1, 173, 222, 35, 1, 193, 190, 222, + 35, 1, 203, 166, 222, 35, 1, 201, 176, 222, 35, 1, 188, 222, 35, 1, 140, + 222, 35, 1, 222, 204, 222, 35, 18, 3, 252, 208, 222, 35, 18, 3, 251, 159, + 252, 208, 222, 35, 18, 3, 68, 222, 35, 18, 3, 223, 201, 222, 35, 18, 3, + 66, 222, 35, 18, 3, 196, 30, 222, 35, 18, 3, 117, 146, 222, 35, 18, 3, + 71, 222, 35, 18, 3, 251, 238, 222, 35, 18, 3, 233, 244, 222, 35, 3, 221, + 145, 222, 35, 239, 47, 222, 35, 237, 240, 222, 35, 55, 237, 240, 222, 35, + 208, 154, 205, 55, 217, 53, 222, 35, 208, 154, 251, 159, 205, 55, 217, + 53, 222, 35, 208, 154, 232, 188, 222, 35, 208, 154, 201, 249, 233, 5, + 222, 35, 208, 154, 236, 142, 222, 35, 208, 154, 55, 236, 142, 222, 35, + 208, 154, 197, 225, 236, 142, 222, 35, 208, 154, 243, 12, 222, 35, 208, + 154, 233, 6, 243, 12, 222, 35, 208, 154, 201, 218, 222, 35, 208, 154, + 242, 217, 201, 218, 222, 35, 17, 191, 77, 222, 35, 17, 107, 222, 35, 17, + 109, 222, 35, 17, 138, 222, 35, 17, 134, 222, 35, 17, 150, 222, 35, 17, + 169, 222, 35, 17, 175, 222, 35, 17, 171, 222, 35, 17, 178, 219, 90, 1, + 192, 35, 44, 232, 120, 91, 198, 222, 44, 232, 120, 91, 211, 102, 44, 232, + 120, 91, 234, 158, 44, 232, 120, 91, 202, 119, 44, 232, 120, 91, 232, + 141, 44, 232, 120, 91, 198, 245, 44, 232, 120, 115, 234, 157, 44, 232, + 120, 115, 202, 118, 44, 232, 120, 91, 197, 35, 44, 232, 120, 91, 202, + 128, 44, 232, 120, 91, 202, 127, 44, 232, 120, 91, 199, 86, 44, 232, 120, + 91, 234, 161, 44, 232, 120, 115, 197, 34, 44, 232, 120, 115, 202, 126, + 44, 232, 120, 91, 233, 20, 44, 232, 120, 91, 208, 24, 44, 232, 120, 91, + 230, 71, 44, 232, 120, 91, 230, 70, 44, 232, 120, 115, 208, 22, 44, 232, + 120, 235, 123, 233, 95, 221, 146, 44, 3, 214, 106, 44, 3, 247, 8, 44, 3, + 252, 159, 44, 3, 196, 15, 44, 3, 215, 92, 44, 3, 220, 196, 44, 3, 210, + 87, 44, 3, 215, 137, 44, 3, 222, 126, 44, 3, 210, 166, 44, 3, 209, 41, + 44, 3, 195, 173, 44, 3, 210, 217, 44, 3, 220, 185, 44, 3, 195, 143, 44, + 193, 101, 238, 189, 56, 44, 235, 94, 238, 189, 56, 44, 220, 25, 56, 44, + 205, 160, 210, 169, 56, 44, 198, 21, 238, 232, 56, 44, 198, 21, 31, 56, + 44, 238, 171, 56, 44, 23, 211, 157, 56, 44, 201, 228, 56, 44, 198, 39, + 56, 44, 223, 165, 209, 24, 56, 44, 201, 97, 232, 100, 56, 44, 3, 215, 96, + 44, 3, 195, 181, 44, 208, 154, 234, 97, 79, 199, 53, 10, 3, 65, 10, 3, + 42, 25, 65, 10, 3, 42, 25, 249, 137, 10, 3, 42, 25, 231, 211, 199, 84, + 10, 3, 42, 25, 140, 10, 3, 42, 25, 223, 203, 10, 3, 42, 25, 220, 105, + 230, 157, 10, 3, 42, 25, 215, 103, 10, 3, 42, 25, 205, 186, 10, 3, 254, + 217, 10, 3, 252, 157, 10, 3, 252, 158, 25, 250, 209, 10, 3, 252, 158, 25, + 235, 76, 230, 157, 10, 3, 252, 158, 25, 231, 224, 10, 3, 252, 158, 25, + 231, 211, 199, 84, 10, 3, 252, 158, 25, 140, 10, 3, 252, 158, 25, 223, + 204, 230, 157, 10, 3, 252, 158, 25, 223, 174, 10, 3, 252, 158, 25, 220, + 106, 10, 3, 252, 158, 25, 203, 98, 10, 3, 252, 158, 25, 126, 108, 126, + 108, 66, 10, 3, 252, 158, 230, 157, 10, 3, 252, 74, 10, 3, 252, 75, 25, + 249, 116, 10, 3, 252, 75, 25, 231, 211, 199, 84, 10, 3, 252, 75, 25, 216, + 235, 108, 234, 105, 10, 3, 252, 75, 25, 203, 164, 10, 3, 252, 75, 25, + 199, 209, 10, 3, 252, 44, 10, 3, 251, 218, 10, 3, 251, 219, 25, 234, 30, + 10, 3, 251, 219, 25, 203, 60, 108, 231, 25, 10, 3, 251, 209, 10, 3, 251, + 210, 25, 251, 209, 10, 3, 251, 210, 25, 236, 255, 10, 3, 251, 210, 25, + 231, 25, 10, 3, 251, 210, 25, 140, 10, 3, 251, 210, 25, 222, 113, 10, 3, + 251, 210, 25, 221, 168, 10, 3, 251, 210, 25, 203, 114, 10, 3, 251, 210, + 25, 196, 38, 10, 3, 251, 205, 10, 3, 251, 192, 10, 3, 251, 147, 10, 3, + 251, 148, 25, 203, 114, 10, 3, 251, 134, 10, 3, 251, 135, 139, 251, 134, + 10, 3, 251, 135, 115, 198, 144, 10, 3, 251, 135, 108, 214, 243, 211, 65, + 251, 135, 108, 214, 242, 10, 3, 251, 135, 108, 214, 243, 201, 190, 10, 3, + 251, 93, 10, 3, 251, 62, 10, 3, 251, 28, 10, 3, 251, 29, 25, 220, 199, + 10, 3, 251, 0, 10, 3, 250, 217, 10, 3, 250, 211, 10, 3, 250, 212, 191, + 26, 199, 84, 10, 3, 250, 212, 222, 118, 199, 84, 10, 3, 250, 212, 139, + 250, 212, 197, 83, 139, 197, 83, 197, 83, 139, 197, 83, 210, 139, 10, 3, + 250, 212, 139, 250, 212, 139, 250, 211, 10, 3, 250, 212, 139, 250, 212, + 139, 250, 212, 238, 212, 250, 212, 139, 250, 212, 139, 250, 211, 10, 3, + 250, 209, 10, 3, 250, 205, 10, 3, 249, 155, 10, 3, 249, 137, 10, 3, 249, + 131, 10, 3, 249, 123, 10, 3, 249, 117, 10, 3, 249, 118, 139, 249, 117, + 10, 3, 249, 116, 10, 3, 164, 10, 3, 249, 89, 10, 3, 248, 190, 10, 3, 248, + 191, 25, 65, 10, 3, 248, 191, 25, 231, 202, 10, 3, 248, 191, 25, 223, + 204, 230, 157, 10, 3, 248, 12, 10, 3, 248, 13, 139, 248, 13, 252, 157, + 10, 3, 248, 13, 139, 248, 13, 196, 113, 10, 3, 248, 13, 238, 212, 248, + 12, 10, 3, 247, 244, 10, 3, 247, 245, 139, 247, 244, 10, 3, 247, 232, 10, + 3, 247, 231, 10, 3, 238, 34, 10, 3, 238, 24, 10, 3, 238, 25, 221, 127, + 25, 42, 108, 217, 41, 10, 3, 238, 25, 221, 127, 25, 251, 147, 10, 3, 238, + 25, 221, 127, 25, 249, 116, 10, 3, 238, 25, 221, 127, 25, 248, 190, 10, + 3, 238, 25, 221, 127, 25, 231, 242, 10, 3, 238, 25, 221, 127, 25, 231, + 243, 108, 217, 41, 10, 3, 238, 25, 221, 127, 25, 231, 55, 10, 3, 238, 25, + 221, 127, 25, 231, 34, 10, 3, 238, 25, 221, 127, 25, 230, 170, 10, 3, + 238, 25, 221, 127, 25, 140, 10, 3, 238, 25, 221, 127, 25, 223, 79, 10, 3, + 238, 25, 221, 127, 25, 223, 80, 108, 218, 227, 10, 3, 238, 25, 221, 127, + 25, 222, 98, 10, 3, 238, 25, 221, 127, 25, 173, 10, 3, 238, 25, 221, 127, + 25, 218, 227, 10, 3, 238, 25, 221, 127, 25, 218, 228, 108, 217, 40, 10, + 3, 238, 25, 221, 127, 25, 218, 210, 10, 3, 238, 25, 221, 127, 25, 214, + 123, 10, 3, 238, 25, 221, 127, 25, 210, 140, 108, 210, 139, 10, 3, 238, + 25, 221, 127, 25, 202, 223, 10, 3, 238, 25, 221, 127, 25, 199, 209, 10, + 3, 238, 25, 221, 127, 25, 196, 170, 108, 231, 34, 10, 3, 238, 25, 221, + 127, 25, 196, 38, 10, 3, 237, 252, 10, 3, 237, 227, 10, 3, 237, 226, 10, + 3, 237, 225, 10, 3, 237, 46, 10, 3, 237, 28, 10, 3, 237, 1, 10, 3, 237, + 2, 25, 203, 114, 10, 3, 236, 255, 10, 3, 236, 245, 10, 3, 236, 246, 222, + 57, 126, 230, 158, 236, 224, 10, 3, 236, 224, 10, 3, 235, 91, 10, 3, 235, + 92, 139, 235, 91, 10, 3, 235, 92, 230, 157, 10, 3, 235, 92, 203, 95, 10, + 3, 235, 89, 10, 3, 235, 90, 25, 234, 11, 10, 3, 235, 88, 10, 3, 235, 84, + 10, 3, 235, 83, 10, 3, 235, 82, 10, 3, 235, 77, 10, 3, 235, 75, 10, 3, + 235, 76, 230, 157, 10, 3, 235, 76, 230, 158, 230, 157, 10, 3, 235, 74, + 10, 3, 235, 67, 10, 3, 71, 10, 3, 235, 17, 25, 210, 139, 10, 3, 235, 17, + 139, 235, 17, 212, 133, 139, 212, 132, 10, 3, 234, 220, 10, 3, 234, 221, + 25, 42, 108, 230, 107, 108, 238, 34, 10, 3, 234, 221, 25, 231, 202, 10, + 3, 234, 221, 25, 216, 102, 10, 3, 234, 221, 25, 205, 170, 10, 3, 234, + 221, 25, 203, 114, 10, 3, 234, 221, 25, 66, 10, 3, 234, 192, 10, 3, 234, + 179, 10, 3, 234, 142, 10, 3, 234, 105, 10, 3, 234, 106, 25, 231, 210, 10, + 3, 234, 106, 25, 231, 211, 199, 84, 10, 3, 234, 106, 25, 216, 234, 10, 3, + 234, 106, 238, 212, 234, 105, 10, 3, 234, 106, 211, 65, 234, 105, 10, 3, + 234, 106, 201, 190, 10, 3, 234, 33, 10, 3, 234, 30, 10, 3, 234, 11, 10, + 3, 233, 182, 10, 3, 233, 183, 25, 65, 10, 3, 233, 183, 25, 42, 108, 220, + 39, 10, 3, 233, 183, 25, 42, 108, 220, 40, 25, 220, 39, 10, 3, 233, 183, + 25, 251, 134, 10, 3, 233, 183, 25, 249, 137, 10, 3, 233, 183, 25, 235, + 76, 230, 157, 10, 3, 233, 183, 25, 235, 76, 230, 158, 230, 157, 10, 3, + 233, 183, 25, 140, 10, 3, 233, 183, 25, 230, 107, 230, 157, 10, 3, 233, + 183, 25, 223, 204, 230, 157, 10, 3, 233, 183, 25, 222, 56, 10, 3, 233, + 183, 25, 222, 57, 201, 190, 10, 3, 233, 183, 25, 220, 225, 10, 3, 233, + 183, 25, 173, 10, 3, 233, 183, 25, 220, 40, 25, 220, 39, 10, 3, 233, 183, + 25, 219, 148, 10, 3, 233, 183, 25, 218, 227, 10, 3, 233, 183, 25, 196, + 169, 10, 3, 233, 183, 25, 196, 158, 10, 3, 231, 242, 10, 3, 231, 243, + 230, 157, 10, 3, 231, 240, 10, 3, 231, 241, 25, 42, 108, 238, 35, 108, + 140, 10, 3, 231, 241, 25, 42, 108, 140, 10, 3, 231, 241, 25, 42, 108, + 223, 203, 10, 3, 231, 241, 25, 252, 75, 199, 85, 108, 199, 236, 10, 3, + 231, 241, 25, 251, 134, 10, 3, 231, 241, 25, 250, 211, 10, 3, 231, 241, + 25, 250, 210, 108, 231, 224, 10, 3, 231, 241, 25, 249, 137, 10, 3, 231, + 241, 25, 249, 90, 108, 165, 10, 3, 231, 241, 25, 247, 232, 10, 3, 231, + 241, 25, 247, 233, 108, 165, 10, 3, 231, 241, 25, 238, 34, 10, 3, 231, + 241, 25, 237, 46, 10, 3, 231, 241, 25, 237, 2, 25, 203, 114, 10, 3, 231, + 241, 25, 235, 89, 10, 3, 231, 241, 25, 234, 142, 10, 3, 231, 241, 25, + 234, 143, 108, 173, 10, 3, 231, 241, 25, 234, 105, 10, 3, 231, 241, 25, + 234, 106, 25, 231, 211, 199, 84, 10, 3, 231, 241, 25, 231, 211, 199, 84, + 10, 3, 231, 241, 25, 231, 202, 10, 3, 231, 241, 25, 231, 55, 10, 3, 231, + 241, 25, 231, 53, 10, 3, 231, 241, 25, 231, 54, 108, 65, 10, 3, 231, 241, + 25, 231, 35, 108, 201, 5, 10, 3, 231, 241, 25, 230, 107, 108, 218, 228, + 108, 234, 11, 10, 3, 231, 241, 25, 230, 75, 10, 3, 231, 241, 25, 230, 76, + 108, 173, 10, 3, 231, 241, 25, 229, 161, 108, 219, 148, 10, 3, 231, 241, + 25, 228, 153, 10, 3, 231, 241, 25, 223, 204, 230, 157, 10, 3, 231, 241, + 25, 223, 65, 108, 228, 162, 108, 250, 211, 10, 3, 231, 241, 25, 222, 98, + 10, 3, 231, 241, 25, 222, 56, 10, 3, 231, 241, 25, 221, 154, 10, 3, 231, + 241, 25, 221, 155, 108, 220, 39, 10, 3, 231, 241, 25, 220, 226, 108, 251, + 134, 10, 3, 231, 241, 25, 173, 10, 3, 231, 241, 25, 216, 235, 108, 234, + 105, 10, 3, 231, 241, 25, 216, 102, 10, 3, 231, 241, 25, 212, 132, 10, 3, + 231, 241, 25, 212, 133, 139, 212, 132, 10, 3, 231, 241, 25, 168, 10, 3, + 231, 241, 25, 205, 170, 10, 3, 231, 241, 25, 205, 128, 10, 3, 231, 241, + 25, 203, 114, 10, 3, 231, 241, 25, 203, 115, 108, 197, 64, 10, 3, 231, + 241, 25, 203, 80, 10, 3, 231, 241, 25, 200, 204, 10, 3, 231, 241, 25, + 199, 209, 10, 3, 231, 241, 25, 66, 10, 3, 231, 241, 25, 196, 158, 10, 3, + 231, 241, 25, 196, 159, 108, 235, 91, 10, 3, 231, 241, 139, 231, 240, 10, + 3, 231, 235, 10, 3, 231, 236, 238, 212, 231, 235, 10, 3, 231, 233, 10, 3, + 231, 234, 139, 231, 234, 231, 203, 139, 231, 202, 10, 3, 231, 224, 10, 3, + 231, 225, 231, 234, 139, 231, 234, 231, 203, 139, 231, 202, 10, 3, 231, + 223, 10, 3, 231, 221, 10, 3, 231, 212, 10, 3, 231, 210, 10, 3, 231, 211, + 199, 84, 10, 3, 231, 211, 139, 231, 210, 10, 3, 231, 211, 238, 212, 231, + 210, 10, 3, 231, 202, 10, 3, 231, 201, 10, 3, 231, 195, 10, 3, 231, 136, + 10, 3, 231, 137, 25, 220, 199, 10, 3, 231, 55, 10, 3, 231, 56, 25, 71, + 10, 3, 231, 56, 25, 66, 10, 3, 231, 56, 238, 212, 231, 55, 10, 3, 231, + 53, 10, 3, 231, 54, 139, 231, 53, 10, 3, 231, 54, 238, 212, 231, 53, 10, + 3, 231, 50, 10, 3, 231, 34, 10, 3, 231, 35, 230, 157, 10, 3, 231, 32, 10, + 3, 231, 33, 25, 42, 108, 223, 203, 10, 3, 231, 33, 25, 231, 211, 199, 84, + 10, 3, 231, 33, 25, 223, 203, 10, 3, 231, 33, 25, 218, 228, 108, 223, + 203, 10, 3, 231, 33, 25, 168, 10, 3, 231, 27, 10, 3, 231, 25, 10, 3, 231, + 26, 238, 212, 231, 25, 10, 3, 231, 26, 25, 249, 137, 10, 3, 231, 26, 25, + 199, 209, 10, 3, 231, 26, 199, 84, 10, 3, 230, 181, 10, 3, 230, 182, 238, + 212, 230, 181, 10, 3, 230, 179, 10, 3, 230, 180, 25, 222, 98, 10, 3, 230, + 180, 25, 222, 99, 25, 223, 204, 230, 157, 10, 3, 230, 180, 25, 212, 132, + 10, 3, 230, 180, 25, 205, 171, 108, 197, 82, 10, 3, 230, 180, 230, 157, + 10, 3, 230, 170, 10, 3, 230, 171, 25, 42, 108, 220, 199, 10, 3, 230, 171, + 25, 220, 199, 10, 3, 230, 171, 139, 230, 171, 218, 218, 10, 3, 230, 162, + 10, 3, 230, 160, 10, 3, 230, 161, 25, 203, 114, 10, 3, 230, 151, 10, 3, + 230, 150, 10, 3, 230, 145, 10, 3, 230, 144, 10, 3, 140, 10, 3, 230, 107, + 199, 84, 10, 3, 230, 107, 230, 157, 10, 3, 230, 75, 10, 3, 229, 160, 10, + 3, 229, 161, 25, 250, 211, 10, 3, 229, 161, 25, 250, 209, 10, 3, 229, + 161, 25, 249, 137, 10, 3, 229, 161, 25, 236, 224, 10, 3, 229, 161, 25, + 231, 233, 10, 3, 229, 161, 25, 221, 143, 10, 3, 229, 161, 25, 212, 132, + 10, 3, 229, 161, 25, 203, 114, 10, 3, 229, 161, 25, 66, 10, 3, 228, 161, + 10, 3, 228, 153, 10, 3, 228, 154, 25, 251, 134, 10, 3, 228, 154, 25, 230, + 75, 10, 3, 228, 154, 25, 222, 56, 10, 3, 228, 154, 25, 219, 91, 10, 3, + 228, 154, 25, 196, 158, 10, 3, 228, 148, 10, 3, 68, 10, 3, 228, 76, 65, + 10, 3, 228, 32, 10, 3, 223, 231, 10, 3, 223, 232, 139, 223, 232, 247, + 232, 10, 3, 223, 232, 139, 223, 232, 201, 190, 10, 3, 223, 206, 10, 3, + 223, 203, 10, 3, 223, 204, 237, 28, 10, 3, 223, 204, 207, 2, 10, 3, 223, + 204, 139, 223, 204, 203, 64, 139, 203, 64, 196, 159, 139, 196, 158, 10, + 3, 223, 204, 230, 157, 10, 3, 223, 193, 10, 3, 223, 194, 25, 231, 211, + 199, 84, 10, 3, 223, 192, 10, 3, 223, 182, 10, 3, 223, 183, 25, 199, 209, + 10, 3, 223, 183, 238, 212, 223, 182, 10, 3, 223, 183, 211, 65, 223, 182, + 10, 3, 223, 183, 201, 190, 10, 3, 223, 174, 10, 3, 223, 164, 10, 3, 223, + 79, 10, 3, 223, 64, 10, 3, 155, 10, 3, 222, 144, 25, 65, 10, 3, 222, 144, + 25, 252, 44, 10, 3, 222, 144, 25, 252, 45, 108, 220, 225, 10, 3, 222, + 144, 25, 250, 209, 10, 3, 222, 144, 25, 249, 137, 10, 3, 222, 144, 25, + 249, 116, 10, 3, 222, 144, 25, 164, 10, 3, 222, 144, 25, 248, 190, 10, 3, + 222, 144, 25, 234, 30, 10, 3, 222, 144, 25, 234, 11, 10, 3, 222, 144, 25, + 231, 242, 10, 3, 222, 144, 25, 231, 224, 10, 3, 222, 144, 25, 231, 211, + 199, 84, 10, 3, 222, 144, 25, 231, 202, 10, 3, 222, 144, 25, 231, 203, + 108, 203, 165, 108, 65, 10, 3, 222, 144, 25, 231, 55, 10, 3, 222, 144, + 25, 231, 34, 10, 3, 222, 144, 25, 231, 26, 108, 205, 128, 10, 3, 222, + 144, 25, 231, 26, 238, 212, 231, 25, 10, 3, 222, 144, 25, 230, 181, 10, + 3, 222, 144, 25, 230, 150, 10, 3, 222, 144, 25, 223, 203, 10, 3, 222, + 144, 25, 223, 182, 10, 3, 222, 144, 25, 222, 98, 10, 3, 222, 144, 25, + 221, 168, 10, 3, 222, 144, 25, 221, 154, 10, 3, 222, 144, 25, 219, 148, + 10, 3, 222, 144, 25, 218, 227, 10, 3, 222, 144, 25, 216, 234, 10, 3, 222, + 144, 25, 216, 235, 108, 235, 91, 10, 3, 222, 144, 25, 216, 235, 108, 231, + 55, 10, 3, 222, 144, 25, 216, 235, 108, 199, 145, 10, 3, 222, 144, 25, + 216, 102, 10, 3, 222, 144, 25, 216, 103, 108, 212, 127, 10, 3, 222, 144, + 25, 214, 123, 10, 3, 222, 144, 25, 212, 132, 10, 3, 222, 144, 25, 209, + 187, 10, 3, 222, 144, 25, 206, 69, 10, 3, 222, 144, 25, 188, 10, 3, 222, + 144, 25, 205, 128, 10, 3, 222, 144, 25, 203, 166, 10, 3, 222, 144, 25, + 203, 114, 10, 3, 222, 144, 25, 203, 80, 10, 3, 222, 144, 25, 203, 6, 10, + 3, 222, 144, 25, 202, 202, 10, 3, 222, 144, 25, 200, 213, 10, 3, 222, + 144, 25, 199, 179, 10, 3, 222, 144, 25, 66, 10, 3, 222, 144, 25, 196, + 169, 10, 3, 222, 144, 25, 196, 158, 10, 3, 222, 144, 25, 196, 116, 25, + 168, 10, 3, 222, 144, 25, 196, 38, 10, 3, 222, 144, 25, 191, 30, 10, 3, + 222, 130, 10, 3, 222, 131, 238, 212, 222, 130, 10, 3, 222, 119, 10, 3, + 222, 115, 10, 3, 222, 113, 10, 3, 222, 112, 10, 3, 222, 110, 10, 3, 222, + 111, 139, 222, 110, 10, 3, 222, 98, 10, 3, 222, 99, 25, 223, 204, 230, + 157, 10, 3, 222, 93, 10, 3, 222, 94, 25, 249, 137, 10, 3, 222, 94, 238, + 212, 222, 93, 10, 3, 222, 91, 10, 3, 222, 90, 10, 3, 222, 56, 10, 3, 222, + 57, 220, 107, 25, 126, 139, 220, 107, 25, 66, 10, 3, 222, 57, 139, 222, + 57, 220, 107, 25, 126, 139, 220, 107, 25, 66, 10, 3, 221, 244, 10, 3, + 221, 168, 10, 3, 221, 169, 25, 249, 137, 10, 3, 221, 169, 25, 66, 10, 3, + 221, 169, 25, 196, 158, 10, 3, 221, 154, 10, 3, 221, 143, 10, 3, 221, + 129, 10, 3, 221, 128, 10, 3, 221, 126, 10, 3, 221, 127, 139, 221, 126, + 10, 3, 220, 234, 10, 3, 220, 235, 139, 229, 161, 25, 250, 210, 220, 235, + 139, 229, 161, 25, 250, 209, 10, 3, 220, 225, 10, 3, 220, 223, 10, 3, + 220, 224, 195, 168, 20, 10, 3, 220, 222, 10, 3, 220, 213, 10, 3, 220, + 214, 230, 157, 10, 3, 220, 212, 10, 3, 220, 199, 10, 3, 220, 200, 211, + 65, 220, 199, 10, 3, 220, 192, 10, 3, 220, 169, 10, 3, 173, 10, 3, 220, + 106, 10, 3, 220, 107, 25, 65, 10, 3, 220, 107, 25, 42, 108, 238, 35, 108, + 140, 10, 3, 220, 107, 25, 42, 108, 231, 202, 10, 3, 220, 107, 25, 42, + 108, 220, 39, 10, 3, 220, 107, 25, 251, 209, 10, 3, 220, 107, 25, 251, + 134, 10, 3, 220, 107, 25, 250, 212, 191, 26, 199, 84, 10, 3, 220, 107, + 25, 249, 137, 10, 3, 220, 107, 25, 248, 190, 10, 3, 220, 107, 25, 237, + 227, 10, 3, 220, 107, 25, 234, 105, 10, 3, 220, 107, 25, 231, 242, 10, 3, + 220, 107, 25, 231, 202, 10, 3, 220, 107, 25, 230, 170, 10, 3, 220, 107, + 25, 230, 171, 108, 230, 170, 10, 3, 220, 107, 25, 140, 10, 3, 220, 107, + 25, 230, 75, 10, 3, 220, 107, 25, 229, 161, 25, 212, 132, 10, 3, 220, + 107, 25, 223, 204, 230, 157, 10, 3, 220, 107, 25, 223, 182, 10, 3, 220, + 107, 25, 223, 183, 108, 140, 10, 3, 220, 107, 25, 223, 183, 108, 218, + 227, 10, 3, 220, 107, 25, 221, 168, 10, 3, 220, 107, 25, 221, 143, 10, 3, + 220, 107, 25, 220, 225, 10, 3, 220, 107, 25, 220, 213, 10, 3, 220, 107, + 25, 220, 214, 108, 229, 161, 108, 65, 10, 3, 220, 107, 25, 220, 106, 10, + 3, 220, 107, 25, 219, 91, 10, 3, 220, 107, 25, 218, 227, 10, 3, 220, 107, + 25, 218, 212, 10, 3, 220, 107, 25, 216, 234, 10, 3, 220, 107, 25, 216, + 235, 108, 234, 105, 10, 3, 220, 107, 25, 215, 103, 10, 3, 220, 107, 25, + 214, 123, 10, 3, 220, 107, 25, 203, 115, 108, 200, 204, 10, 3, 220, 107, + 25, 203, 60, 108, 231, 26, 108, 234, 30, 10, 3, 220, 107, 25, 203, 60, + 108, 231, 26, 199, 84, 10, 3, 220, 107, 25, 203, 4, 10, 3, 220, 107, 25, + 203, 5, 108, 203, 4, 10, 3, 220, 107, 25, 200, 204, 10, 3, 220, 107, 25, + 199, 223, 10, 3, 220, 107, 25, 199, 209, 10, 3, 220, 107, 25, 199, 146, + 108, 42, 108, 201, 6, 108, 181, 10, 3, 220, 107, 25, 66, 10, 3, 220, 107, + 25, 126, 108, 65, 10, 3, 220, 107, 25, 126, 108, 126, 108, 66, 10, 3, + 220, 107, 25, 196, 170, 108, 250, 211, 10, 3, 220, 107, 25, 196, 158, 10, + 3, 220, 107, 25, 196, 38, 10, 3, 220, 107, 201, 190, 10, 3, 220, 104, 10, + 3, 220, 105, 25, 203, 114, 10, 3, 220, 105, 25, 203, 115, 108, 200, 204, + 10, 3, 220, 105, 230, 157, 10, 3, 220, 105, 230, 158, 139, 220, 105, 230, + 158, 203, 114, 10, 3, 220, 100, 10, 3, 220, 39, 10, 3, 220, 40, 25, 220, + 39, 10, 3, 220, 37, 10, 3, 220, 38, 25, 220, 199, 10, 3, 220, 38, 25, + 220, 200, 108, 206, 69, 10, 3, 219, 148, 10, 3, 219, 129, 10, 3, 219, + 117, 10, 3, 219, 91, 10, 3, 218, 227, 10, 3, 218, 228, 25, 249, 137, 10, + 3, 218, 225, 10, 3, 218, 226, 25, 251, 209, 10, 3, 218, 226, 25, 249, + 137, 10, 3, 218, 226, 25, 234, 11, 10, 3, 218, 226, 25, 234, 12, 199, 84, + 10, 3, 218, 226, 25, 231, 211, 199, 84, 10, 3, 218, 226, 25, 229, 161, + 25, 249, 137, 10, 3, 218, 226, 25, 223, 182, 10, 3, 218, 226, 25, 222, + 115, 10, 3, 218, 226, 25, 222, 113, 10, 3, 218, 226, 25, 222, 114, 108, + 250, 211, 10, 3, 218, 226, 25, 221, 168, 10, 3, 218, 226, 25, 220, 128, + 108, 250, 211, 10, 3, 218, 226, 25, 220, 106, 10, 3, 218, 226, 25, 216, + 235, 108, 234, 105, 10, 3, 218, 226, 25, 214, 123, 10, 3, 218, 226, 25, + 212, 180, 10, 3, 218, 226, 25, 202, 224, 108, 250, 211, 10, 3, 218, 226, + 25, 202, 193, 108, 248, 12, 10, 3, 218, 226, 25, 197, 82, 10, 3, 218, + 226, 199, 84, 10, 3, 218, 226, 238, 212, 218, 225, 10, 3, 218, 226, 211, + 65, 218, 225, 10, 3, 218, 226, 201, 190, 10, 3, 218, 226, 203, 95, 10, 3, + 218, 224, 10, 3, 218, 218, 10, 3, 218, 219, 139, 218, 218, 10, 3, 218, + 219, 211, 65, 218, 218, 10, 3, 218, 219, 203, 95, 10, 3, 218, 215, 10, 3, + 218, 212, 10, 3, 218, 210, 10, 3, 218, 211, 139, 218, 210, 10, 3, 218, + 211, 139, 218, 211, 231, 203, 139, 231, 202, 10, 3, 174, 10, 3, 217, 162, + 25, 199, 209, 10, 3, 217, 162, 230, 157, 10, 3, 217, 154, 10, 3, 217, + 122, 10, 3, 217, 67, 10, 3, 217, 41, 10, 3, 217, 40, 10, 3, 216, 234, 10, + 3, 216, 175, 10, 3, 216, 102, 10, 3, 216, 46, 10, 3, 215, 157, 10, 3, + 215, 158, 139, 215, 157, 10, 3, 215, 142, 10, 3, 215, 143, 230, 157, 10, + 3, 215, 121, 10, 3, 215, 107, 10, 3, 215, 103, 10, 3, 215, 104, 25, 65, + 10, 3, 215, 104, 25, 220, 199, 10, 3, 215, 104, 25, 191, 123, 10, 3, 215, + 104, 139, 215, 103, 10, 3, 215, 104, 139, 215, 104, 25, 42, 108, 181, 10, + 3, 215, 104, 238, 212, 215, 103, 10, 3, 215, 101, 10, 3, 215, 102, 25, + 65, 10, 3, 215, 102, 25, 42, 108, 237, 46, 10, 3, 215, 102, 25, 237, 46, + 10, 3, 215, 102, 230, 157, 10, 3, 181, 10, 3, 214, 255, 10, 3, 214, 242, + 10, 3, 214, 243, 223, 94, 10, 3, 214, 243, 25, 203, 7, 199, 84, 10, 3, + 214, 243, 211, 65, 214, 242, 10, 3, 214, 241, 10, 3, 214, 233, 212, 118, + 10, 3, 214, 232, 10, 3, 214, 231, 10, 3, 214, 123, 10, 3, 214, 124, 25, + 65, 10, 3, 214, 124, 25, 196, 158, 10, 3, 214, 124, 203, 95, 10, 3, 213, + 221, 10, 3, 213, 222, 25, 71, 10, 3, 213, 212, 10, 3, 213, 182, 10, 3, + 213, 183, 25, 231, 211, 199, 84, 10, 3, 213, 183, 25, 231, 203, 108, 231, + 211, 199, 84, 10, 3, 213, 178, 10, 3, 213, 179, 25, 251, 134, 10, 3, 213, + 179, 25, 250, 211, 10, 3, 213, 179, 25, 250, 212, 108, 250, 211, 10, 3, + 213, 179, 25, 230, 170, 10, 3, 213, 179, 25, 216, 235, 108, 231, 211, + 199, 84, 10, 3, 213, 179, 25, 214, 123, 10, 3, 213, 179, 25, 212, 132, + 10, 3, 213, 179, 25, 203, 114, 10, 3, 213, 179, 25, 203, 115, 108, 42, + 251, 134, 10, 3, 213, 179, 25, 203, 115, 108, 250, 211, 10, 3, 213, 179, + 25, 203, 115, 108, 250, 212, 108, 250, 211, 10, 3, 213, 179, 25, 196, + 170, 108, 250, 211, 10, 3, 213, 179, 25, 196, 38, 10, 3, 213, 165, 10, 3, + 212, 180, 10, 3, 212, 149, 10, 3, 212, 132, 10, 3, 212, 133, 220, 105, + 25, 231, 202, 10, 3, 212, 133, 220, 105, 25, 217, 41, 10, 3, 212, 133, + 220, 105, 25, 205, 170, 10, 3, 212, 133, 220, 105, 25, 205, 171, 139, + 212, 133, 220, 105, 25, 205, 170, 10, 3, 212, 133, 220, 105, 25, 196, 38, + 10, 3, 212, 133, 199, 84, 10, 3, 212, 133, 139, 212, 132, 10, 3, 212, + 133, 238, 212, 212, 132, 10, 3, 212, 133, 238, 212, 212, 133, 220, 105, + 139, 220, 104, 10, 3, 212, 127, 10, 3, 212, 128, 252, 75, 25, 250, 205, + 10, 3, 212, 128, 252, 75, 25, 248, 190, 10, 3, 212, 128, 252, 75, 25, + 235, 84, 10, 3, 212, 128, 252, 75, 25, 230, 170, 10, 3, 212, 128, 252, + 75, 25, 223, 204, 230, 157, 10, 3, 212, 128, 252, 75, 25, 222, 113, 10, + 3, 212, 128, 252, 75, 25, 173, 10, 3, 212, 128, 252, 75, 25, 214, 123, + 10, 3, 212, 128, 252, 75, 25, 202, 190, 10, 3, 212, 128, 252, 75, 25, + 196, 169, 10, 3, 212, 128, 221, 127, 25, 248, 190, 10, 3, 212, 128, 221, + 127, 25, 248, 191, 66, 10, 3, 168, 10, 3, 210, 212, 10, 3, 210, 168, 10, + 3, 210, 139, 10, 3, 209, 245, 10, 3, 209, 187, 10, 3, 209, 188, 25, 65, + 10, 3, 209, 188, 25, 252, 157, 10, 3, 209, 188, 25, 248, 190, 10, 3, 209, + 188, 25, 248, 12, 10, 3, 209, 188, 25, 71, 10, 3, 209, 188, 25, 68, 10, + 3, 209, 188, 25, 228, 32, 10, 3, 209, 188, 25, 66, 10, 3, 209, 188, 25, + 196, 169, 10, 3, 209, 188, 238, 212, 209, 187, 10, 3, 209, 123, 10, 3, + 209, 124, 25, 222, 93, 10, 3, 209, 124, 25, 196, 158, 10, 3, 209, 124, + 25, 191, 123, 10, 3, 209, 124, 211, 65, 209, 123, 10, 3, 165, 10, 3, 207, + 178, 10, 3, 207, 2, 10, 3, 206, 69, 10, 3, 188, 10, 3, 205, 187, 212, + 118, 10, 3, 205, 186, 10, 3, 205, 187, 25, 65, 10, 3, 205, 187, 25, 235, + 91, 10, 3, 205, 187, 25, 235, 89, 10, 3, 205, 187, 25, 140, 10, 3, 205, + 187, 25, 222, 98, 10, 3, 205, 187, 25, 220, 199, 10, 3, 205, 187, 25, + 218, 210, 10, 3, 205, 187, 25, 216, 102, 10, 3, 205, 187, 25, 212, 132, + 10, 3, 205, 187, 25, 205, 170, 10, 3, 205, 187, 25, 203, 80, 10, 3, 205, + 187, 25, 199, 236, 10, 3, 205, 187, 25, 196, 169, 10, 3, 205, 187, 25, + 196, 164, 10, 3, 205, 187, 25, 196, 120, 10, 3, 205, 187, 25, 196, 62, + 10, 3, 205, 187, 25, 196, 38, 10, 3, 205, 187, 139, 205, 186, 10, 3, 205, + 187, 230, 157, 10, 3, 205, 170, 10, 3, 205, 171, 220, 107, 25, 250, 209, + 10, 3, 205, 137, 10, 3, 205, 128, 10, 3, 203, 166, 10, 3, 203, 164, 10, + 3, 203, 165, 25, 65, 10, 3, 203, 165, 25, 249, 137, 10, 3, 203, 165, 25, + 231, 25, 10, 3, 203, 165, 25, 214, 123, 10, 3, 203, 165, 25, 203, 4, 10, + 3, 203, 165, 25, 197, 64, 10, 3, 203, 165, 25, 66, 10, 3, 203, 165, 25, + 126, 108, 65, 10, 3, 203, 162, 10, 3, 203, 160, 10, 3, 203, 132, 10, 3, + 203, 114, 10, 3, 203, 115, 228, 161, 10, 3, 203, 115, 139, 203, 115, 231, + 234, 139, 231, 234, 231, 203, 139, 231, 202, 10, 3, 203, 115, 139, 203, + 115, 199, 237, 139, 199, 237, 231, 203, 139, 231, 202, 10, 3, 203, 107, + 10, 3, 203, 102, 10, 3, 203, 98, 10, 3, 203, 97, 10, 3, 203, 94, 10, 3, + 203, 80, 10, 3, 203, 81, 25, 65, 10, 3, 203, 81, 25, 223, 182, 10, 3, + 203, 74, 10, 3, 203, 75, 25, 65, 10, 3, 203, 75, 25, 249, 117, 10, 3, + 203, 75, 25, 247, 244, 10, 3, 203, 75, 25, 236, 245, 10, 3, 203, 75, 25, + 231, 202, 10, 3, 203, 75, 25, 223, 203, 10, 3, 203, 75, 25, 223, 204, + 230, 157, 10, 3, 203, 75, 25, 220, 192, 10, 3, 203, 75, 25, 218, 212, 10, + 3, 203, 75, 25, 215, 142, 10, 3, 203, 75, 25, 205, 170, 10, 3, 203, 68, + 10, 3, 203, 63, 10, 3, 203, 64, 199, 84, 10, 3, 203, 64, 139, 203, 64, + 247, 233, 139, 247, 232, 10, 3, 203, 59, 10, 3, 203, 6, 10, 3, 203, 7, + 139, 223, 95, 203, 6, 10, 3, 203, 4, 10, 3, 203, 2, 10, 3, 202, 223, 10, + 3, 202, 224, 230, 157, 10, 3, 202, 202, 10, 3, 202, 200, 10, 3, 202, 201, + 139, 202, 201, 203, 4, 10, 3, 202, 192, 10, 3, 202, 190, 10, 3, 201, 5, + 10, 3, 201, 6, 139, 201, 5, 10, 3, 200, 216, 10, 3, 200, 215, 10, 3, 200, + 213, 10, 3, 200, 204, 10, 3, 200, 203, 10, 3, 200, 175, 10, 3, 200, 174, + 10, 3, 190, 190, 10, 3, 199, 252, 250, 195, 10, 3, 199, 252, 25, 229, + 160, 10, 3, 199, 252, 25, 216, 102, 10, 3, 199, 252, 230, 157, 10, 3, + 199, 236, 10, 3, 199, 237, 139, 199, 237, 213, 222, 139, 213, 222, 236, + 225, 139, 236, 224, 10, 3, 199, 237, 201, 190, 10, 3, 199, 223, 10, 3, + 199, 224, 25, 248, 190, 10, 3, 199, 224, 25, 230, 170, 10, 3, 199, 224, + 25, 203, 114, 10, 3, 199, 224, 25, 203, 6, 10, 3, 199, 224, 25, 197, 82, + 10, 3, 199, 224, 25, 196, 158, 10, 3, 199, 209, 10, 3, 199, 179, 10, 3, + 199, 145, 10, 3, 199, 146, 230, 157, 10, 3, 198, 193, 10, 3, 198, 194, + 199, 84, 10, 3, 198, 154, 10, 3, 198, 131, 10, 3, 198, 132, 25, 199, 209, + 10, 3, 198, 132, 139, 198, 131, 10, 3, 198, 132, 139, 198, 132, 231, 234, + 139, 231, 234, 231, 203, 139, 231, 202, 10, 3, 197, 94, 10, 3, 197, 82, + 10, 3, 197, 80, 10, 3, 197, 76, 10, 3, 197, 64, 10, 3, 197, 65, 139, 197, + 65, 191, 124, 139, 191, 123, 10, 3, 66, 10, 3, 126, 230, 170, 10, 3, 126, + 126, 66, 10, 3, 126, 139, 126, 210, 223, 139, 210, 223, 231, 203, 139, + 231, 202, 10, 3, 126, 139, 126, 200, 176, 139, 200, 175, 10, 3, 126, 139, + 126, 126, 207, 19, 139, 126, 207, 18, 10, 3, 196, 169, 10, 3, 196, 164, + 10, 3, 196, 158, 10, 3, 196, 159, 220, 192, 10, 3, 196, 159, 25, 249, + 137, 10, 3, 196, 159, 25, 216, 102, 10, 3, 196, 159, 25, 126, 108, 126, + 108, 66, 10, 3, 196, 159, 25, 126, 108, 126, 108, 126, 230, 157, 10, 3, + 196, 159, 230, 157, 10, 3, 196, 159, 203, 95, 10, 3, 196, 159, 203, 96, + 25, 249, 137, 10, 3, 196, 153, 10, 3, 196, 120, 10, 3, 196, 121, 25, 220, + 106, 10, 3, 196, 121, 25, 216, 235, 108, 238, 34, 10, 3, 196, 121, 25, + 203, 164, 10, 3, 196, 121, 25, 66, 10, 3, 196, 119, 10, 3, 196, 115, 10, + 3, 196, 116, 25, 222, 56, 10, 3, 196, 116, 25, 168, 10, 3, 196, 113, 10, + 3, 196, 114, 230, 157, 10, 3, 196, 62, 10, 3, 196, 63, 238, 212, 196, 62, + 10, 3, 196, 63, 203, 95, 10, 3, 196, 60, 10, 3, 196, 61, 25, 42, 108, + 140, 10, 3, 196, 61, 25, 42, 108, 181, 10, 3, 196, 61, 25, 251, 209, 10, + 3, 196, 61, 25, 140, 10, 3, 196, 61, 25, 212, 132, 10, 3, 196, 61, 25, + 196, 169, 10, 3, 196, 61, 25, 196, 170, 108, 250, 211, 10, 3, 196, 61, + 25, 196, 170, 108, 248, 190, 10, 3, 196, 59, 10, 3, 196, 56, 10, 3, 196, + 55, 10, 3, 196, 51, 10, 3, 196, 52, 25, 65, 10, 3, 196, 52, 25, 250, 205, + 10, 3, 196, 52, 25, 164, 10, 3, 196, 52, 25, 235, 77, 10, 3, 196, 52, 25, + 231, 242, 10, 3, 196, 52, 25, 231, 224, 10, 3, 196, 52, 25, 231, 211, + 199, 84, 10, 3, 196, 52, 25, 231, 202, 10, 3, 196, 52, 25, 230, 181, 10, + 3, 196, 52, 25, 140, 10, 3, 196, 52, 25, 223, 203, 10, 3, 196, 52, 25, + 223, 182, 10, 3, 196, 52, 25, 223, 64, 10, 3, 196, 52, 25, 221, 168, 10, + 3, 196, 52, 25, 218, 210, 10, 3, 196, 52, 25, 216, 46, 10, 3, 196, 52, + 25, 168, 10, 3, 196, 52, 25, 203, 114, 10, 3, 196, 52, 25, 202, 200, 10, + 3, 196, 52, 25, 197, 94, 10, 3, 196, 52, 25, 126, 108, 230, 170, 10, 3, + 196, 52, 25, 196, 158, 10, 3, 196, 52, 25, 196, 49, 10, 3, 196, 49, 10, + 3, 196, 50, 25, 66, 10, 3, 196, 38, 10, 3, 196, 39, 25, 65, 10, 3, 196, + 39, 25, 220, 234, 10, 3, 196, 39, 25, 220, 199, 10, 3, 196, 39, 25, 199, + 209, 10, 3, 196, 34, 10, 3, 196, 37, 10, 3, 196, 35, 10, 3, 196, 31, 10, + 3, 196, 16, 10, 3, 196, 17, 25, 222, 56, 10, 3, 196, 14, 10, 3, 191, 123, + 10, 3, 191, 124, 199, 84, 10, 3, 191, 124, 112, 25, 220, 199, 10, 3, 191, + 118, 10, 3, 191, 107, 10, 3, 191, 86, 10, 3, 191, 30, 10, 3, 191, 31, + 139, 191, 30, 10, 3, 191, 29, 10, 3, 191, 27, 10, 3, 191, 28, 222, 118, + 199, 84, 10, 3, 191, 22, 10, 3, 191, 13, 10, 3, 190, 251, 10, 3, 190, + 249, 10, 3, 190, 250, 25, 65, 10, 3, 190, 248, 10, 3, 190, 247, 10, 3, + 222, 81, 234, 139, 10, 3, 252, 158, 25, 212, 132, 10, 3, 252, 75, 25, 65, + 10, 3, 251, 148, 25, 220, 215, 10, 3, 238, 25, 221, 127, 25, 196, 170, + 108, 217, 41, 10, 3, 238, 23, 10, 3, 236, 225, 108, 203, 6, 10, 3, 235, + 90, 25, 203, 114, 10, 3, 233, 183, 25, 230, 170, 10, 3, 233, 183, 25, + 203, 114, 10, 3, 231, 241, 25, 251, 135, 108, 222, 99, 108, 65, 10, 3, + 231, 241, 25, 250, 209, 10, 3, 231, 166, 10, 3, 231, 44, 10, 3, 228, 133, + 10, 3, 222, 144, 25, 251, 93, 10, 3, 222, 144, 25, 250, 208, 10, 3, 222, + 144, 25, 231, 25, 10, 3, 222, 144, 25, 230, 170, 10, 3, 222, 144, 25, + 229, 161, 25, 250, 209, 10, 3, 222, 144, 25, 218, 210, 10, 3, 222, 144, + 25, 168, 10, 3, 222, 144, 25, 202, 254, 10, 3, 222, 144, 25, 197, 94, 10, + 3, 222, 144, 25, 196, 60, 10, 3, 220, 107, 25, 231, 55, 10, 3, 218, 226, + 203, 96, 25, 249, 137, 10, 3, 218, 226, 25, 234, 12, 108, 220, 39, 10, 3, + 218, 226, 25, 203, 6, 10, 3, 216, 174, 10, 3, 215, 102, 25, 191, 123, 10, + 3, 214, 254, 10, 3, 213, 181, 10, 3, 213, 180, 10, 3, 213, 179, 25, 249, + 117, 10, 3, 213, 179, 25, 231, 55, 10, 3, 212, 150, 206, 123, 213, 172, + 237, 126, 10, 3, 209, 246, 250, 195, 10, 3, 209, 127, 10, 3, 205, 187, + 25, 223, 204, 230, 157, 10, 3, 198, 185, 10, 3, 196, 121, 25, 216, 234, + 10, 3, 126, 66, 10, 167, 3, 105, 250, 211, 10, 167, 3, 115, 250, 211, 10, + 167, 3, 232, 130, 250, 211, 10, 167, 3, 232, 228, 250, 211, 10, 167, 3, + 202, 137, 250, 211, 10, 167, 3, 203, 248, 250, 211, 10, 167, 3, 234, 166, + 250, 211, 10, 167, 3, 213, 177, 250, 211, 10, 167, 3, 115, 236, 224, 10, + 167, 3, 232, 130, 236, 224, 10, 167, 3, 232, 228, 236, 224, 10, 167, 3, + 202, 137, 236, 224, 10, 167, 3, 203, 248, 236, 224, 10, 167, 3, 234, 166, + 236, 224, 10, 167, 3, 213, 177, 236, 224, 10, 167, 3, 232, 130, 66, 10, + 167, 3, 232, 228, 66, 10, 167, 3, 202, 137, 66, 10, 167, 3, 203, 248, 66, + 10, 167, 3, 234, 166, 66, 10, 167, 3, 213, 177, 66, 10, 167, 3, 91, 231, + 138, 10, 167, 3, 105, 231, 138, 10, 167, 3, 115, 231, 138, 10, 167, 3, + 232, 130, 231, 138, 10, 167, 3, 232, 228, 231, 138, 10, 167, 3, 202, 137, + 231, 138, 10, 167, 3, 203, 248, 231, 138, 10, 167, 3, 234, 166, 231, 138, + 10, 167, 3, 213, 177, 231, 138, 10, 167, 3, 91, 231, 135, 10, 167, 3, + 105, 231, 135, 10, 167, 3, 115, 231, 135, 10, 167, 3, 232, 130, 231, 135, + 10, 167, 3, 232, 228, 231, 135, 10, 167, 3, 105, 203, 132, 10, 167, 3, + 115, 203, 132, 10, 167, 3, 115, 203, 133, 195, 168, 20, 10, 167, 3, 232, + 130, 203, 132, 10, 167, 3, 232, 228, 203, 132, 10, 167, 3, 202, 137, 203, + 132, 10, 167, 3, 203, 248, 203, 132, 10, 167, 3, 234, 166, 203, 132, 10, + 167, 3, 213, 177, 203, 132, 10, 167, 3, 91, 203, 125, 10, 167, 3, 105, + 203, 125, 10, 167, 3, 115, 203, 125, 10, 167, 3, 115, 203, 126, 195, 168, + 20, 10, 167, 3, 232, 130, 203, 125, 10, 167, 3, 232, 228, 203, 125, 10, + 167, 3, 203, 133, 25, 231, 225, 108, 236, 224, 10, 167, 3, 203, 133, 25, + 231, 225, 108, 216, 46, 10, 167, 3, 91, 247, 228, 10, 167, 3, 105, 247, + 228, 10, 167, 3, 115, 247, 228, 10, 167, 3, 115, 247, 229, 195, 168, 20, + 10, 167, 3, 232, 130, 247, 228, 10, 167, 3, 232, 228, 247, 228, 10, 167, + 3, 115, 195, 168, 232, 148, 234, 13, 10, 167, 3, 115, 195, 168, 232, 148, + 234, 10, 10, 167, 3, 232, 130, 195, 168, 232, 148, 219, 118, 10, 167, 3, + 232, 130, 195, 168, 232, 148, 219, 116, 10, 167, 3, 232, 130, 195, 168, + 232, 148, 219, 119, 65, 10, 167, 3, 232, 130, 195, 168, 232, 148, 219, + 119, 250, 122, 10, 167, 3, 202, 137, 195, 168, 232, 148, 250, 207, 10, + 167, 3, 203, 248, 195, 168, 232, 148, 223, 173, 10, 167, 3, 203, 248, + 195, 168, 232, 148, 223, 175, 65, 10, 167, 3, 203, 248, 195, 168, 232, + 148, 223, 175, 250, 122, 10, 167, 3, 234, 166, 195, 168, 232, 148, 196, + 33, 10, 167, 3, 234, 166, 195, 168, 232, 148, 196, 32, 10, 167, 3, 213, + 177, 195, 168, 232, 148, 223, 190, 10, 167, 3, 213, 177, 195, 168, 232, + 148, 223, 189, 10, 167, 3, 213, 177, 195, 168, 232, 148, 223, 188, 10, + 167, 3, 213, 177, 195, 168, 232, 148, 223, 191, 65, 10, 167, 3, 105, 250, + 212, 199, 84, 10, 167, 3, 115, 250, 212, 199, 84, 10, 167, 3, 232, 130, + 250, 212, 199, 84, 10, 167, 3, 232, 228, 250, 212, 199, 84, 10, 167, 3, + 202, 137, 250, 212, 199, 84, 10, 167, 3, 91, 249, 101, 10, 167, 3, 105, + 249, 101, 10, 167, 3, 115, 249, 101, 10, 167, 3, 232, 130, 249, 101, 10, + 167, 3, 232, 130, 249, 102, 195, 168, 20, 10, 167, 3, 232, 228, 249, 101, + 10, 167, 3, 232, 228, 249, 102, 195, 168, 20, 10, 167, 3, 213, 190, 10, + 167, 3, 213, 191, 10, 167, 3, 91, 234, 9, 10, 167, 3, 105, 234, 9, 10, + 167, 3, 91, 199, 1, 236, 224, 10, 167, 3, 105, 198, 254, 236, 224, 10, + 167, 3, 232, 228, 202, 124, 236, 224, 10, 167, 3, 91, 199, 1, 195, 168, + 232, 148, 65, 10, 167, 3, 105, 198, 254, 195, 168, 232, 148, 65, 10, 167, + 3, 91, 234, 162, 250, 211, 10, 167, 3, 91, 208, 25, 250, 211, 10, 167, 3, + 39, 250, 198, 91, 202, 125, 10, 167, 3, 39, 250, 198, 91, 208, 24, 10, + 167, 3, 91, 208, 25, 230, 151, 10, 167, 3, 91, 132, 230, 151, 10, 167, 3, + 234, 140, 91, 199, 0, 10, 167, 3, 234, 140, 105, 198, 253, 10, 167, 3, + 234, 140, 232, 137, 10, 167, 3, 234, 140, 233, 17, 10, 167, 3, 232, 130, + 126, 195, 168, 20, 10, 167, 3, 232, 228, 126, 195, 168, 20, 10, 167, 3, + 202, 137, 126, 195, 168, 20, 10, 167, 3, 203, 248, 126, 195, 168, 20, 10, + 167, 3, 234, 166, 126, 195, 168, 20, 10, 167, 3, 213, 177, 126, 195, 168, + 20, 10, 208, 154, 3, 39, 250, 198, 193, 23, 236, 207, 10, 208, 154, 3, + 81, 242, 85, 10, 208, 154, 3, 237, 41, 242, 85, 10, 208, 154, 3, 237, 41, + 197, 237, 10, 208, 154, 3, 237, 41, 208, 31, 10, 3, 252, 158, 25, 212, + 133, 199, 84, 10, 3, 252, 158, 25, 203, 4, 10, 3, 252, 45, 25, 234, 11, + 10, 3, 249, 138, 25, 236, 225, 199, 84, 10, 3, 249, 124, 25, 252, 74, 10, + 3, 249, 124, 25, 213, 221, 10, 3, 249, 124, 25, 191, 123, 10, 3, 248, 13, + 139, 248, 13, 25, 214, 255, 10, 3, 238, 35, 25, 199, 209, 10, 3, 238, 25, + 25, 220, 199, 10, 3, 237, 2, 25, 223, 203, 10, 3, 237, 2, 25, 126, 126, + 66, 10, 3, 237, 0, 25, 196, 158, 10, 3, 235, 85, 25, 251, 93, 10, 3, 235, + 85, 25, 250, 211, 10, 3, 235, 85, 25, 250, 212, 250, 185, 219, 226, 10, + 3, 235, 85, 25, 236, 245, 10, 3, 235, 85, 25, 235, 77, 10, 3, 235, 85, + 25, 234, 30, 10, 3, 235, 85, 25, 231, 242, 10, 3, 235, 85, 25, 231, 55, + 10, 3, 235, 85, 25, 231, 35, 230, 157, 10, 3, 235, 85, 25, 231, 25, 10, + 3, 235, 85, 25, 140, 10, 3, 235, 85, 25, 229, 160, 10, 3, 235, 85, 25, + 223, 204, 230, 157, 10, 3, 235, 85, 25, 222, 56, 10, 3, 235, 85, 25, 220, + 199, 10, 3, 235, 85, 25, 220, 192, 10, 3, 235, 85, 25, 220, 193, 108, + 222, 56, 10, 3, 235, 85, 25, 220, 94, 10, 3, 235, 85, 25, 220, 37, 10, 3, + 235, 85, 25, 220, 38, 25, 220, 199, 10, 3, 235, 85, 25, 218, 216, 108, + 231, 25, 10, 3, 235, 85, 25, 217, 41, 10, 3, 235, 85, 25, 216, 175, 10, + 3, 235, 85, 25, 216, 102, 10, 3, 235, 85, 25, 213, 221, 10, 3, 235, 85, + 25, 209, 187, 10, 3, 235, 85, 25, 203, 114, 10, 3, 235, 85, 25, 202, 224, + 230, 157, 10, 3, 234, 221, 25, 220, 199, 10, 3, 234, 221, 25, 210, 139, + 10, 3, 234, 31, 192, 235, 10, 3, 234, 12, 238, 212, 234, 11, 10, 3, 233, + 183, 203, 96, 25, 250, 211, 10, 3, 233, 183, 203, 96, 25, 229, 160, 10, + 3, 233, 183, 203, 96, 25, 223, 204, 230, 157, 10, 3, 233, 183, 203, 96, + 25, 173, 10, 3, 233, 183, 203, 96, 25, 220, 39, 10, 3, 233, 183, 203, 96, + 25, 216, 234, 10, 3, 233, 183, 203, 96, 25, 216, 175, 10, 3, 233, 183, + 203, 96, 25, 201, 5, 10, 3, 233, 183, 25, 201, 5, 10, 3, 231, 241, 25, + 249, 123, 10, 3, 231, 241, 25, 237, 2, 230, 157, 10, 3, 231, 241, 25, + 235, 85, 25, 223, 204, 230, 157, 10, 3, 231, 241, 25, 235, 85, 25, 222, + 56, 10, 3, 231, 241, 25, 234, 33, 10, 3, 231, 241, 25, 231, 242, 10, 3, + 231, 241, 25, 231, 203, 108, 237, 46, 10, 3, 231, 241, 25, 231, 203, 108, + 214, 123, 10, 3, 231, 241, 25, 230, 107, 108, 65, 10, 3, 231, 241, 25, + 220, 193, 108, 222, 56, 10, 3, 231, 241, 25, 220, 37, 10, 3, 231, 241, + 25, 220, 38, 25, 220, 199, 10, 3, 231, 241, 25, 218, 215, 10, 3, 231, + 241, 25, 215, 103, 10, 3, 231, 241, 25, 214, 123, 10, 3, 231, 241, 25, + 214, 124, 108, 234, 220, 10, 3, 231, 241, 25, 214, 124, 108, 231, 55, 10, + 3, 231, 241, 25, 203, 74, 10, 3, 231, 241, 25, 191, 13, 10, 3, 231, 236, + 206, 123, 213, 172, 237, 126, 10, 3, 231, 137, 25, 66, 10, 3, 231, 26, + 25, 231, 26, 238, 212, 231, 25, 10, 3, 230, 180, 25, 223, 204, 230, 157, + 10, 3, 230, 171, 108, 231, 26, 25, 199, 209, 10, 3, 230, 107, 199, 85, + 230, 157, 10, 3, 229, 161, 25, 250, 212, 139, 229, 161, 25, 250, 211, 10, + 3, 222, 144, 25, 248, 12, 10, 3, 222, 144, 25, 155, 10, 3, 222, 144, 25, + 126, 126, 66, 10, 3, 222, 144, 25, 196, 62, 10, 3, 220, 107, 25, 190, + 252, 139, 190, 251, 10, 3, 220, 95, 10, 3, 220, 93, 10, 3, 220, 92, 10, + 3, 220, 91, 10, 3, 220, 90, 10, 3, 220, 89, 10, 3, 220, 88, 10, 3, 220, + 87, 139, 220, 87, 230, 157, 10, 3, 220, 86, 10, 3, 220, 85, 139, 220, 84, + 10, 3, 220, 83, 10, 3, 220, 82, 10, 3, 220, 81, 10, 3, 220, 80, 10, 3, + 220, 79, 10, 3, 220, 78, 10, 3, 220, 77, 10, 3, 220, 76, 10, 3, 220, 75, + 10, 3, 220, 74, 10, 3, 220, 73, 10, 3, 220, 72, 10, 3, 220, 71, 10, 3, + 220, 70, 10, 3, 220, 69, 10, 3, 220, 68, 10, 3, 220, 67, 10, 3, 220, 66, + 10, 3, 220, 64, 10, 3, 220, 65, 25, 230, 181, 10, 3, 220, 65, 25, 223, + 203, 10, 3, 220, 65, 25, 210, 140, 108, 218, 224, 10, 3, 220, 65, 25, + 210, 140, 108, 210, 140, 108, 218, 224, 10, 3, 220, 65, 25, 196, 170, + 108, 249, 155, 10, 3, 220, 63, 10, 3, 220, 62, 10, 3, 220, 61, 10, 3, + 220, 60, 10, 3, 220, 59, 10, 3, 220, 58, 10, 3, 220, 57, 10, 3, 220, 56, + 10, 3, 220, 55, 10, 3, 220, 54, 10, 3, 220, 52, 10, 3, 220, 53, 25, 250, + 211, 10, 3, 220, 53, 25, 249, 137, 10, 3, 220, 53, 25, 235, 76, 230, 158, + 230, 157, 10, 3, 220, 53, 25, 220, 225, 10, 3, 220, 53, 25, 173, 10, 3, + 220, 53, 25, 199, 179, 10, 3, 220, 53, 25, 199, 145, 10, 3, 220, 53, 25, + 196, 169, 10, 3, 220, 53, 25, 196, 158, 10, 3, 220, 53, 25, 196, 49, 10, + 3, 220, 51, 10, 3, 220, 49, 10, 3, 220, 50, 25, 235, 89, 10, 3, 220, 50, + 25, 231, 242, 10, 3, 220, 50, 25, 223, 203, 10, 3, 220, 50, 25, 223, 204, + 230, 157, 10, 3, 220, 50, 25, 213, 221, 10, 3, 220, 50, 25, 210, 140, + 108, 210, 140, 108, 218, 224, 10, 3, 220, 50, 25, 203, 99, 108, 221, 168, + 10, 3, 220, 50, 25, 196, 158, 10, 3, 220, 50, 25, 196, 49, 10, 3, 220, + 47, 10, 3, 220, 46, 10, 3, 218, 226, 230, 158, 25, 250, 211, 10, 3, 218, + 226, 25, 236, 224, 10, 3, 218, 226, 25, 230, 75, 10, 3, 218, 226, 25, + 210, 139, 10, 3, 218, 226, 25, 210, 140, 108, 210, 140, 108, 218, 224, + 10, 3, 218, 226, 25, 199, 209, 10, 3, 216, 103, 108, 191, 122, 10, 3, + 215, 104, 139, 215, 104, 25, 231, 242, 10, 3, 215, 104, 139, 215, 104, + 25, 222, 98, 10, 3, 213, 179, 25, 237, 2, 230, 157, 10, 3, 213, 179, 25, + 231, 25, 10, 3, 213, 179, 25, 230, 162, 10, 3, 213, 179, 25, 229, 160, + 10, 3, 213, 179, 25, 221, 244, 10, 3, 213, 179, 25, 220, 90, 10, 3, 213, + 179, 25, 217, 41, 10, 3, 213, 179, 25, 210, 140, 108, 210, 139, 10, 3, + 213, 179, 25, 66, 10, 3, 213, 179, 25, 126, 108, 66, 10, 3, 213, 179, 25, + 196, 49, 10, 3, 205, 187, 230, 158, 25, 140, 10, 3, 205, 187, 25, 234, + 105, 10, 3, 205, 187, 25, 203, 115, 250, 185, 219, 226, 10, 3, 205, 187, + 25, 199, 209, 10, 3, 203, 163, 199, 84, 10, 3, 203, 115, 139, 203, 114, + 10, 3, 203, 115, 108, 228, 153, 10, 3, 203, 115, 108, 214, 231, 10, 3, + 203, 115, 108, 205, 128, 10, 3, 203, 5, 108, 235, 85, 25, 213, 221, 10, + 3, 203, 5, 108, 234, 221, 25, 251, 134, 10, 3, 202, 224, 25, 199, 209, + 10, 3, 199, 210, 108, 205, 186, 10, 3, 197, 77, 25, 231, 211, 199, 84, + 10, 3, 197, 77, 25, 115, 236, 224, 10, 3, 196, 61, 223, 94, 10, 3, 196, + 61, 25, 196, 158, 10, 3, 196, 52, 25, 237, 226, 10, 3, 196, 52, 25, 220, + 48, 10, 3, 196, 52, 25, 218, 224, 10, 3, 191, 122, 10, 3, 190, 252, 139, + 190, 252, 108, 205, 128, 10, 3, 190, 250, 25, 115, 236, 225, 199, 84, + 238, 136, 3, 242, 200, 238, 136, 3, 242, 199, 238, 136, 3, 242, 198, 238, + 136, 3, 242, 197, 238, 136, 3, 242, 196, 238, 136, 3, 242, 195, 238, 136, + 3, 242, 194, 238, 136, 3, 242, 193, 238, 136, 3, 242, 192, 238, 136, 3, + 242, 191, 238, 136, 3, 242, 190, 238, 136, 3, 242, 189, 238, 136, 3, 242, + 188, 238, 136, 3, 242, 187, 238, 136, 3, 242, 186, 238, 136, 3, 242, 185, + 238, 136, 3, 242, 184, 238, 136, 3, 242, 183, 238, 136, 3, 242, 182, 238, + 136, 3, 242, 181, 238, 136, 3, 242, 180, 238, 136, 3, 242, 179, 238, 136, + 3, 242, 178, 238, 136, 3, 242, 177, 238, 136, 3, 242, 176, 238, 136, 3, + 242, 175, 238, 136, 3, 242, 174, 238, 136, 3, 242, 173, 238, 136, 3, 242, + 172, 238, 136, 3, 242, 171, 238, 136, 3, 242, 170, 238, 136, 3, 242, 169, + 238, 136, 3, 242, 168, 238, 136, 3, 242, 167, 238, 136, 3, 242, 166, 238, + 136, 3, 242, 165, 238, 136, 3, 242, 164, 238, 136, 3, 242, 163, 238, 136, + 3, 242, 162, 238, 136, 3, 242, 161, 238, 136, 3, 242, 160, 238, 136, 3, + 242, 159, 238, 136, 3, 242, 158, 238, 136, 3, 242, 157, 238, 136, 3, 242, + 156, 238, 136, 3, 242, 155, 238, 136, 3, 242, 154, 238, 136, 3, 242, 153, + 238, 136, 3, 242, 152, 238, 136, 3, 242, 151, 238, 136, 3, 242, 150, 238, + 136, 3, 242, 149, 238, 136, 3, 242, 148, 238, 136, 3, 242, 147, 238, 136, + 3, 242, 146, 238, 136, 3, 242, 145, 238, 136, 3, 242, 144, 238, 136, 3, + 242, 143, 238, 136, 3, 242, 142, 238, 136, 3, 242, 141, 238, 136, 3, 242, + 140, 238, 136, 3, 242, 139, 238, 136, 3, 242, 138, 238, 136, 3, 242, 137, + 238, 136, 3, 242, 136, 238, 136, 3, 242, 135, 238, 136, 3, 242, 134, 238, + 136, 3, 242, 133, 238, 136, 3, 242, 132, 238, 136, 3, 242, 131, 238, 136, + 3, 242, 130, 238, 136, 3, 242, 129, 238, 136, 3, 242, 128, 238, 136, 3, + 242, 127, 238, 136, 3, 242, 126, 238, 136, 3, 242, 125, 238, 136, 3, 242, + 124, 238, 136, 3, 242, 123, 238, 136, 3, 242, 122, 238, 136, 3, 242, 121, + 238, 136, 3, 242, 120, 238, 136, 3, 242, 119, 238, 136, 3, 242, 118, 238, + 136, 3, 242, 117, 238, 136, 3, 242, 116, 238, 136, 3, 242, 115, 238, 136, + 3, 242, 114, 238, 136, 3, 242, 113, 238, 136, 3, 242, 112, 238, 136, 3, + 242, 111, 238, 136, 3, 242, 110, 238, 136, 3, 242, 109, 238, 136, 3, 242, + 108, 238, 136, 3, 242, 107, 238, 136, 3, 242, 106, 238, 136, 3, 242, 105, + 238, 136, 3, 242, 104, 238, 136, 3, 242, 103, 238, 136, 3, 242, 102, 14, + 7, 255, 201, 14, 7, 255, 200, 14, 7, 255, 199, 14, 7, 255, 198, 14, 7, + 255, 197, 14, 7, 255, 196, 14, 7, 255, 195, 14, 7, 255, 194, 14, 7, 255, + 193, 14, 7, 255, 192, 14, 7, 255, 191, 14, 7, 255, 190, 14, 7, 255, 189, + 14, 7, 255, 187, 14, 7, 255, 186, 14, 7, 255, 185, 14, 7, 255, 184, 14, + 7, 255, 183, 14, 7, 255, 182, 14, 7, 255, 181, 14, 7, 255, 180, 14, 7, + 255, 179, 14, 7, 255, 178, 14, 7, 255, 177, 14, 7, 255, 176, 14, 7, 255, + 175, 14, 7, 255, 174, 14, 7, 255, 173, 14, 7, 255, 172, 14, 7, 255, 171, + 14, 7, 255, 170, 14, 7, 255, 168, 14, 7, 255, 167, 14, 7, 255, 165, 14, + 7, 255, 164, 14, 7, 255, 163, 14, 7, 255, 162, 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, 152, 14, 7, 255, 151, + 14, 7, 255, 150, 14, 7, 255, 148, 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, 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, 128, 14, 7, 255, 127, 14, + 7, 255, 126, 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, + 115, 14, 7, 255, 114, 14, 7, 255, 113, 14, 7, 255, 112, 14, 7, 250, 120, + 14, 7, 250, 118, 14, 7, 250, 116, 14, 7, 250, 114, 14, 7, 250, 112, 14, + 7, 250, 111, 14, 7, 250, 109, 14, 7, 250, 107, 14, 7, 250, 105, 14, 7, + 250, 103, 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, 247, 174, 14, 7, 247, 173, 14, 7, 247, 172, 14, 7, 247, + 171, 14, 7, 247, 170, 14, 7, 247, 169, 14, 7, 247, 168, 14, 7, 247, 167, + 14, 7, 247, 166, 14, 7, 247, 165, 14, 7, 247, 164, 14, 7, 238, 128, 14, + 7, 238, 127, 14, 7, 238, 126, 14, 7, 238, 125, 14, 7, 238, 124, 14, 7, + 238, 123, 14, 7, 238, 122, 14, 7, 238, 121, 14, 7, 238, 120, 14, 7, 238, + 119, 14, 7, 238, 118, 14, 7, 238, 117, 14, 7, 238, 116, 14, 7, 238, 115, + 14, 7, 238, 114, 14, 7, 238, 113, 14, 7, 238, 112, 14, 7, 238, 111, 14, + 7, 238, 110, 14, 7, 238, 109, 14, 7, 238, 108, 14, 7, 238, 107, 14, 7, + 238, 106, 14, 7, 238, 105, 14, 7, 238, 104, 14, 7, 238, 103, 14, 7, 238, + 102, 14, 7, 238, 101, 14, 7, 238, 100, 14, 7, 238, 99, 14, 7, 238, 98, + 14, 7, 238, 97, 14, 7, 238, 96, 14, 7, 238, 95, 14, 7, 238, 94, 14, 7, + 238, 93, 14, 7, 238, 92, 14, 7, 238, 91, 14, 7, 238, 90, 14, 7, 238, 89, + 14, 7, 238, 88, 14, 7, 238, 87, 14, 7, 238, 86, 14, 7, 238, 85, 14, 7, + 238, 84, 14, 7, 238, 83, 14, 7, 238, 82, 14, 7, 238, 81, 14, 7, 238, 80, + 14, 7, 238, 79, 14, 7, 238, 78, 14, 7, 238, 77, 14, 7, 238, 76, 14, 7, + 238, 75, 14, 7, 238, 74, 14, 7, 238, 73, 14, 7, 238, 72, 14, 7, 238, 71, + 14, 7, 238, 70, 14, 7, 238, 69, 14, 7, 238, 68, 14, 7, 238, 67, 14, 7, + 238, 66, 14, 7, 238, 65, 14, 7, 238, 64, 14, 7, 238, 63, 14, 7, 238, 62, + 14, 7, 238, 61, 14, 7, 238, 60, 14, 7, 238, 59, 14, 7, 238, 58, 14, 7, + 238, 57, 14, 7, 238, 56, 14, 7, 238, 55, 14, 7, 238, 54, 14, 7, 238, 53, + 14, 7, 238, 52, 14, 7, 238, 51, 14, 7, 238, 50, 14, 7, 238, 49, 14, 7, + 238, 48, 14, 7, 238, 47, 14, 7, 238, 46, 14, 7, 238, 45, 14, 7, 238, 44, + 14, 7, 238, 43, 14, 7, 238, 42, 14, 7, 238, 41, 14, 7, 238, 40, 14, 7, + 238, 39, 14, 7, 238, 38, 14, 7, 238, 37, 14, 7, 235, 9, 14, 7, 235, 8, + 14, 7, 235, 7, 14, 7, 235, 6, 14, 7, 235, 5, 14, 7, 235, 4, 14, 7, 235, + 3, 14, 7, 235, 2, 14, 7, 235, 1, 14, 7, 235, 0, 14, 7, 234, 255, 14, 7, + 234, 254, 14, 7, 234, 253, 14, 7, 234, 252, 14, 7, 234, 251, 14, 7, 234, + 250, 14, 7, 234, 249, 14, 7, 234, 248, 14, 7, 234, 247, 14, 7, 234, 246, + 14, 7, 234, 245, 14, 7, 234, 244, 14, 7, 234, 243, 14, 7, 234, 242, 14, + 7, 234, 241, 14, 7, 234, 240, 14, 7, 234, 239, 14, 7, 234, 238, 14, 7, + 234, 237, 14, 7, 234, 236, 14, 7, 234, 235, 14, 7, 234, 234, 14, 7, 234, + 233, 14, 7, 234, 232, 14, 7, 234, 231, 14, 7, 234, 230, 14, 7, 234, 229, + 14, 7, 234, 228, 14, 7, 234, 227, 14, 7, 234, 226, 14, 7, 234, 225, 14, + 7, 234, 224, 14, 7, 234, 223, 14, 7, 234, 222, 14, 7, 233, 176, 14, 7, + 233, 175, 14, 7, 233, 174, 14, 7, 233, 173, 14, 7, 233, 172, 14, 7, 233, + 171, 14, 7, 233, 170, 14, 7, 233, 169, 14, 7, 233, 168, 14, 7, 233, 167, + 14, 7, 233, 166, 14, 7, 233, 165, 14, 7, 233, 164, 14, 7, 233, 163, 14, + 7, 233, 162, 14, 7, 233, 161, 14, 7, 233, 160, 14, 7, 233, 159, 14, 7, + 233, 158, 14, 7, 233, 157, 14, 7, 233, 156, 14, 7, 233, 155, 14, 7, 233, + 154, 14, 7, 233, 153, 14, 7, 233, 152, 14, 7, 233, 151, 14, 7, 233, 150, + 14, 7, 233, 149, 14, 7, 233, 148, 14, 7, 233, 147, 14, 7, 233, 146, 14, + 7, 233, 145, 14, 7, 233, 144, 14, 7, 233, 143, 14, 7, 233, 142, 14, 7, + 233, 141, 14, 7, 233, 140, 14, 7, 233, 139, 14, 7, 233, 138, 14, 7, 233, + 137, 14, 7, 233, 136, 14, 7, 233, 135, 14, 7, 233, 134, 14, 7, 233, 133, + 14, 7, 233, 132, 14, 7, 233, 131, 14, 7, 233, 130, 14, 7, 233, 129, 14, + 7, 233, 128, 14, 7, 233, 127, 14, 7, 233, 126, 14, 7, 233, 125, 14, 7, + 233, 124, 14, 7, 233, 123, 14, 7, 233, 122, 14, 7, 233, 121, 14, 7, 233, + 120, 14, 7, 233, 119, 14, 7, 233, 118, 14, 7, 233, 117, 14, 7, 233, 116, + 14, 7, 233, 115, 14, 7, 233, 114, 14, 7, 233, 113, 14, 7, 233, 112, 14, + 7, 232, 52, 14, 7, 232, 51, 14, 7, 232, 50, 14, 7, 232, 49, 14, 7, 232, + 48, 14, 7, 232, 47, 14, 7, 232, 46, 14, 7, 232, 45, 14, 7, 232, 44, 14, + 7, 232, 43, 14, 7, 232, 42, 14, 7, 232, 41, 14, 7, 232, 40, 14, 7, 232, + 39, 14, 7, 232, 38, 14, 7, 232, 37, 14, 7, 232, 36, 14, 7, 232, 35, 14, + 7, 232, 34, 14, 7, 232, 33, 14, 7, 232, 32, 14, 7, 232, 31, 14, 7, 232, + 30, 14, 7, 232, 29, 14, 7, 232, 28, 14, 7, 232, 27, 14, 7, 232, 26, 14, + 7, 232, 25, 14, 7, 232, 24, 14, 7, 232, 23, 14, 7, 232, 22, 14, 7, 232, + 21, 14, 7, 232, 20, 14, 7, 232, 19, 14, 7, 232, 18, 14, 7, 232, 17, 14, + 7, 232, 16, 14, 7, 232, 15, 14, 7, 232, 14, 14, 7, 232, 13, 14, 7, 232, + 12, 14, 7, 232, 11, 14, 7, 232, 10, 14, 7, 232, 9, 14, 7, 232, 8, 14, 7, + 232, 7, 14, 7, 232, 6, 14, 7, 232, 5, 14, 7, 232, 4, 14, 7, 232, 3, 14, + 7, 232, 2, 14, 7, 232, 1, 14, 7, 232, 0, 14, 7, 231, 255, 14, 7, 231, + 254, 14, 7, 231, 253, 14, 7, 231, 252, 14, 7, 231, 251, 14, 7, 231, 250, + 14, 7, 231, 249, 14, 7, 231, 248, 14, 7, 231, 247, 14, 7, 231, 246, 14, + 7, 231, 245, 14, 7, 230, 116, 14, 7, 230, 115, 14, 7, 230, 114, 14, 7, + 230, 113, 14, 7, 230, 112, 14, 7, 230, 111, 14, 7, 230, 110, 14, 7, 230, + 109, 14, 7, 230, 108, 14, 7, 228, 56, 14, 7, 228, 55, 14, 7, 228, 54, 14, + 7, 228, 53, 14, 7, 228, 52, 14, 7, 228, 51, 14, 7, 228, 50, 14, 7, 228, + 49, 14, 7, 228, 48, 14, 7, 228, 47, 14, 7, 228, 46, 14, 7, 228, 45, 14, + 7, 228, 44, 14, 7, 228, 43, 14, 7, 228, 42, 14, 7, 228, 41, 14, 7, 228, + 40, 14, 7, 228, 39, 14, 7, 228, 38, 14, 7, 222, 153, 14, 7, 222, 152, 14, + 7, 222, 151, 14, 7, 222, 150, 14, 7, 222, 149, 14, 7, 222, 148, 14, 7, + 222, 147, 14, 7, 222, 146, 14, 7, 220, 142, 14, 7, 220, 141, 14, 7, 220, + 140, 14, 7, 220, 139, 14, 7, 220, 138, 14, 7, 220, 137, 14, 7, 220, 136, + 14, 7, 220, 135, 14, 7, 220, 134, 14, 7, 220, 133, 14, 7, 218, 168, 14, + 7, 218, 167, 14, 7, 218, 166, 14, 7, 218, 164, 14, 7, 218, 162, 14, 7, + 218, 161, 14, 7, 218, 159, 14, 7, 218, 157, 14, 7, 218, 155, 14, 7, 218, + 153, 14, 7, 218, 151, 14, 7, 218, 149, 14, 7, 218, 147, 14, 7, 218, 146, + 14, 7, 218, 144, 14, 7, 218, 142, 14, 7, 218, 141, 14, 7, 218, 140, 14, + 7, 218, 139, 14, 7, 218, 138, 14, 7, 218, 137, 14, 7, 218, 136, 14, 7, + 218, 135, 14, 7, 218, 134, 14, 7, 218, 132, 14, 7, 218, 130, 14, 7, 218, + 128, 14, 7, 218, 127, 14, 7, 218, 125, 14, 7, 218, 124, 14, 7, 218, 122, + 14, 7, 218, 121, 14, 7, 218, 119, 14, 7, 218, 117, 14, 7, 218, 115, 14, + 7, 218, 113, 14, 7, 218, 111, 14, 7, 218, 110, 14, 7, 218, 108, 14, 7, + 218, 106, 14, 7, 218, 105, 14, 7, 218, 103, 14, 7, 218, 101, 14, 7, 218, + 99, 14, 7, 218, 97, 14, 7, 218, 96, 14, 7, 218, 94, 14, 7, 218, 92, 14, + 7, 218, 90, 14, 7, 218, 89, 14, 7, 218, 87, 14, 7, 218, 85, 14, 7, 218, + 84, 14, 7, 218, 83, 14, 7, 218, 81, 14, 7, 218, 79, 14, 7, 218, 77, 14, + 7, 218, 75, 14, 7, 218, 73, 14, 7, 218, 71, 14, 7, 218, 69, 14, 7, 218, + 68, 14, 7, 218, 66, 14, 7, 218, 64, 14, 7, 218, 62, 14, 7, 218, 60, 14, + 7, 215, 58, 14, 7, 215, 57, 14, 7, 215, 56, 14, 7, 215, 55, 14, 7, 215, + 54, 14, 7, 215, 53, 14, 7, 215, 52, 14, 7, 215, 51, 14, 7, 215, 50, 14, + 7, 215, 49, 14, 7, 215, 48, 14, 7, 215, 47, 14, 7, 215, 46, 14, 7, 215, + 45, 14, 7, 215, 44, 14, 7, 215, 43, 14, 7, 215, 42, 14, 7, 215, 41, 14, + 7, 215, 40, 14, 7, 215, 39, 14, 7, 215, 38, 14, 7, 215, 37, 14, 7, 215, + 36, 14, 7, 215, 35, 14, 7, 215, 34, 14, 7, 215, 33, 14, 7, 215, 32, 14, + 7, 215, 31, 14, 7, 215, 30, 14, 7, 215, 29, 14, 7, 215, 28, 14, 7, 215, + 27, 14, 7, 215, 26, 14, 7, 215, 25, 14, 7, 215, 24, 14, 7, 215, 23, 14, + 7, 215, 22, 14, 7, 215, 21, 14, 7, 215, 20, 14, 7, 215, 19, 14, 7, 215, + 18, 14, 7, 215, 17, 14, 7, 215, 16, 14, 7, 215, 15, 14, 7, 215, 14, 14, + 7, 215, 13, 14, 7, 215, 12, 14, 7, 215, 11, 14, 7, 215, 10, 14, 7, 213, + 106, 14, 7, 213, 105, 14, 7, 213, 104, 14, 7, 213, 103, 14, 7, 213, 102, + 14, 7, 213, 101, 14, 7, 213, 100, 14, 7, 213, 99, 14, 7, 213, 98, 14, 7, + 213, 97, 14, 7, 213, 96, 14, 7, 213, 95, 14, 7, 213, 94, 14, 7, 213, 93, + 14, 7, 213, 92, 14, 7, 213, 91, 14, 7, 213, 90, 14, 7, 213, 89, 14, 7, + 213, 88, 14, 7, 213, 87, 14, 7, 213, 86, 14, 7, 213, 85, 14, 7, 212, 176, + 14, 7, 212, 175, 14, 7, 212, 174, 14, 7, 212, 173, 14, 7, 212, 172, 14, + 7, 212, 171, 14, 7, 212, 170, 14, 7, 212, 169, 14, 7, 212, 168, 14, 7, + 212, 167, 14, 7, 212, 166, 14, 7, 212, 165, 14, 7, 212, 164, 14, 7, 212, + 163, 14, 7, 212, 162, 14, 7, 212, 161, 14, 7, 212, 160, 14, 7, 212, 159, + 14, 7, 212, 158, 14, 7, 212, 157, 14, 7, 212, 156, 14, 7, 212, 155, 14, + 7, 212, 154, 14, 7, 212, 153, 14, 7, 212, 152, 14, 7, 212, 151, 14, 7, + 212, 4, 14, 7, 212, 3, 14, 7, 212, 2, 14, 7, 212, 1, 14, 7, 212, 0, 14, + 7, 211, 255, 14, 7, 211, 254, 14, 7, 211, 253, 14, 7, 211, 252, 14, 7, + 211, 251, 14, 7, 211, 250, 14, 7, 211, 249, 14, 7, 211, 248, 14, 7, 211, + 247, 14, 7, 211, 246, 14, 7, 211, 245, 14, 7, 211, 244, 14, 7, 211, 243, + 14, 7, 211, 242, 14, 7, 211, 241, 14, 7, 211, 240, 14, 7, 211, 239, 14, + 7, 211, 238, 14, 7, 211, 237, 14, 7, 211, 236, 14, 7, 211, 235, 14, 7, + 211, 234, 14, 7, 211, 233, 14, 7, 211, 232, 14, 7, 211, 231, 14, 7, 211, + 230, 14, 7, 211, 229, 14, 7, 211, 228, 14, 7, 211, 227, 14, 7, 211, 226, + 14, 7, 211, 225, 14, 7, 211, 224, 14, 7, 211, 223, 14, 7, 211, 222, 14, + 7, 211, 221, 14, 7, 211, 220, 14, 7, 211, 219, 14, 7, 211, 218, 14, 7, + 211, 217, 14, 7, 211, 216, 14, 7, 211, 215, 14, 7, 211, 214, 14, 7, 211, + 213, 14, 7, 211, 212, 14, 7, 211, 211, 14, 7, 211, 210, 14, 7, 211, 209, + 14, 7, 211, 208, 14, 7, 211, 207, 14, 7, 211, 206, 14, 7, 211, 205, 14, + 7, 211, 204, 14, 7, 211, 203, 14, 7, 211, 202, 14, 7, 211, 201, 14, 7, + 211, 200, 14, 7, 211, 199, 14, 7, 211, 198, 14, 7, 211, 197, 14, 7, 211, + 196, 14, 7, 211, 195, 14, 7, 211, 194, 14, 7, 211, 193, 14, 7, 211, 192, + 14, 7, 211, 191, 14, 7, 211, 190, 14, 7, 211, 189, 14, 7, 211, 188, 14, + 7, 211, 187, 14, 7, 211, 186, 14, 7, 210, 237, 14, 7, 210, 236, 14, 7, + 210, 235, 14, 7, 210, 234, 14, 7, 210, 233, 14, 7, 210, 232, 14, 7, 210, + 231, 14, 7, 210, 230, 14, 7, 210, 229, 14, 7, 210, 228, 14, 7, 210, 227, + 14, 7, 210, 226, 14, 7, 210, 225, 14, 7, 208, 105, 14, 7, 208, 104, 14, + 7, 208, 103, 14, 7, 208, 102, 14, 7, 208, 101, 14, 7, 208, 100, 14, 7, + 208, 99, 14, 7, 207, 222, 14, 7, 207, 221, 14, 7, 207, 220, 14, 7, 207, + 219, 14, 7, 207, 218, 14, 7, 207, 217, 14, 7, 207, 216, 14, 7, 207, 215, + 14, 7, 207, 214, 14, 7, 207, 213, 14, 7, 207, 212, 14, 7, 207, 211, 14, + 7, 207, 210, 14, 7, 207, 209, 14, 7, 207, 208, 14, 7, 207, 207, 14, 7, + 207, 206, 14, 7, 207, 205, 14, 7, 207, 204, 14, 7, 207, 203, 14, 7, 207, + 202, 14, 7, 207, 201, 14, 7, 207, 200, 14, 7, 207, 199, 14, 7, 207, 198, + 14, 7, 207, 197, 14, 7, 207, 196, 14, 7, 207, 195, 14, 7, 207, 194, 14, + 7, 207, 193, 14, 7, 207, 192, 14, 7, 207, 191, 14, 7, 207, 190, 14, 7, + 207, 189, 14, 7, 206, 6, 14, 7, 206, 5, 14, 7, 206, 4, 14, 7, 206, 3, 14, + 7, 206, 2, 14, 7, 206, 1, 14, 7, 206, 0, 14, 7, 205, 255, 14, 7, 205, + 254, 14, 7, 205, 253, 14, 7, 205, 252, 14, 7, 205, 251, 14, 7, 205, 250, + 14, 7, 205, 249, 14, 7, 205, 248, 14, 7, 205, 247, 14, 7, 205, 246, 14, + 7, 205, 245, 14, 7, 205, 244, 14, 7, 205, 243, 14, 7, 205, 242, 14, 7, + 205, 241, 14, 7, 205, 240, 14, 7, 205, 239, 14, 7, 205, 238, 14, 7, 205, + 237, 14, 7, 205, 236, 14, 7, 205, 235, 14, 7, 205, 234, 14, 7, 205, 233, + 14, 7, 205, 232, 14, 7, 205, 231, 14, 7, 205, 230, 14, 7, 205, 229, 14, + 7, 205, 228, 14, 7, 205, 227, 14, 7, 205, 226, 14, 7, 205, 225, 14, 7, + 205, 224, 14, 7, 205, 223, 14, 7, 205, 222, 14, 7, 205, 221, 14, 7, 205, + 220, 14, 7, 205, 219, 14, 7, 205, 218, 14, 7, 205, 217, 14, 7, 205, 216, + 14, 7, 205, 215, 14, 7, 205, 214, 14, 7, 205, 213, 14, 7, 205, 212, 14, + 7, 205, 211, 14, 7, 205, 210, 14, 7, 205, 209, 14, 7, 200, 40, 14, 7, 200, 39, 14, 7, 200, 38, 14, 7, 200, 37, 14, 7, 200, 36, 14, 7, 200, 35, 14, 7, 200, 34, 14, 7, 200, 33, 14, 7, 200, 32, 14, 7, 200, 31, 14, 7, 200, 30, 14, 7, 200, 29, 14, 7, 200, 28, 14, 7, 200, 27, 14, 7, 200, 26, @@ -16914,698 +16919,698 @@ static const unsigned char phrasebook[] = { 139, 14, 7, 191, 138, 14, 7, 191, 137, 14, 7, 191, 136, 14, 7, 191, 135, 14, 7, 191, 134, 14, 7, 191, 133, 14, 7, 191, 132, 14, 7, 191, 131, 14, 7, 191, 130, 14, 7, 191, 129, 14, 7, 191, 128, 14, 7, 191, 127, 14, 7, - 191, 126, 14, 7, 191, 125, 14, 7, 252, 205, 14, 7, 252, 204, 14, 7, 252, - 203, 14, 7, 252, 202, 14, 7, 252, 201, 14, 7, 252, 200, 14, 7, 252, 199, - 14, 7, 252, 198, 14, 7, 252, 197, 14, 7, 252, 196, 14, 7, 252, 195, 14, - 7, 252, 194, 14, 7, 252, 193, 14, 7, 252, 192, 14, 7, 252, 191, 14, 7, - 252, 190, 14, 7, 252, 189, 14, 7, 252, 188, 14, 7, 252, 187, 14, 7, 252, - 186, 14, 7, 252, 185, 14, 7, 252, 184, 14, 7, 252, 183, 14, 7, 252, 182, - 14, 7, 252, 181, 14, 7, 252, 180, 14, 7, 252, 179, 14, 7, 252, 178, 14, - 7, 252, 177, 14, 7, 252, 176, 14, 7, 252, 175, 14, 7, 252, 174, 14, 7, - 252, 173, 14, 7, 252, 172, 14, 7, 195, 241, 14, 7, 81, 222, 196, 14, 7, - 228, 241, 222, 196, 14, 7, 223, 120, 250, 183, 198, 54, 201, 97, 14, 7, - 223, 120, 250, 183, 248, 77, 201, 97, 14, 7, 223, 120, 250, 183, 198, 54, - 234, 94, 14, 7, 223, 120, 250, 183, 248, 77, 234, 94, 14, 7, 211, 0, 216, - 84, 14, 7, 248, 249, 205, 43, 14, 7, 234, 95, 205, 43, 14, 7, 223, 120, - 250, 183, 216, 84, 14, 7, 223, 120, 250, 183, 198, 53, 14, 7, 223, 120, - 250, 183, 248, 76, 14, 7, 248, 249, 234, 98, 14, 7, 234, 95, 234, 98, 14, - 7, 248, 249, 193, 166, 234, 98, 14, 7, 234, 95, 193, 166, 234, 98, 14, 7, - 216, 27, 228, 189, 14, 7, 232, 80, 248, 132, 14, 7, 132, 248, 132, 14, 7, - 218, 251, 56, 14, 7, 132, 218, 251, 56, 14, 7, 199, 200, 218, 251, 56, - 14, 7, 193, 78, 218, 251, 56, 14, 7, 52, 237, 249, 250, 183, 198, 54, - 201, 97, 14, 7, 52, 237, 249, 250, 183, 248, 77, 201, 97, 14, 7, 52, 237, - 249, 250, 183, 201, 97, 14, 7, 52, 237, 249, 250, 183, 198, 54, 234, 94, - 14, 7, 52, 237, 249, 250, 183, 198, 53, 14, 7, 52, 237, 249, 250, 183, - 248, 77, 201, 98, 23, 198, 54, 234, 94, 14, 7, 52, 237, 249, 250, 183, - 201, 98, 23, 198, 53, 14, 7, 52, 237, 249, 250, 183, 248, 77, 234, 94, - 14, 7, 52, 237, 249, 250, 183, 198, 54, 201, 98, 23, 248, 77, 234, 94, - 14, 7, 52, 237, 249, 250, 183, 248, 76, 14, 7, 52, 237, 249, 250, 183, - 201, 98, 23, 248, 76, 14, 7, 52, 237, 249, 250, 183, 234, 94, 14, 7, 52, - 237, 249, 250, 183, 198, 54, 23, 234, 94, 14, 7, 52, 237, 249, 250, 183, - 248, 77, 23, 234, 94, 14, 7, 52, 237, 248, 29, 7, 255, 199, 29, 7, 255, - 198, 29, 7, 255, 197, 29, 7, 255, 196, 29, 7, 255, 195, 29, 7, 255, 193, - 29, 7, 255, 190, 29, 7, 255, 189, 29, 7, 255, 188, 29, 7, 255, 187, 29, - 7, 255, 186, 29, 7, 255, 185, 29, 7, 255, 184, 29, 7, 255, 183, 29, 7, - 255, 182, 29, 7, 255, 180, 29, 7, 255, 179, 29, 7, 255, 178, 29, 7, 255, - 176, 29, 7, 255, 175, 29, 7, 255, 174, 29, 7, 255, 173, 29, 7, 255, 172, - 29, 7, 255, 171, 29, 7, 255, 170, 29, 7, 255, 169, 29, 7, 255, 168, 29, - 7, 255, 167, 29, 7, 255, 166, 29, 7, 255, 165, 29, 7, 255, 163, 29, 7, - 255, 162, 29, 7, 255, 161, 29, 7, 255, 160, 29, 7, 255, 158, 29, 7, 255, - 157, 29, 7, 255, 156, 29, 7, 255, 155, 29, 7, 255, 154, 29, 7, 255, 153, - 29, 7, 255, 152, 29, 7, 255, 151, 29, 7, 255, 150, 29, 7, 255, 148, 29, - 7, 255, 147, 29, 7, 255, 146, 29, 7, 255, 144, 29, 7, 255, 142, 29, 7, - 255, 141, 29, 7, 255, 140, 29, 7, 255, 139, 29, 7, 255, 138, 29, 7, 255, - 137, 29, 7, 255, 136, 29, 7, 255, 135, 29, 7, 255, 134, 29, 7, 255, 133, - 29, 7, 255, 132, 29, 7, 255, 131, 29, 7, 255, 130, 29, 7, 255, 129, 29, - 7, 255, 128, 29, 7, 255, 127, 29, 7, 255, 126, 29, 7, 255, 125, 29, 7, - 255, 124, 29, 7, 255, 123, 29, 7, 255, 122, 29, 7, 255, 121, 29, 7, 255, - 120, 29, 7, 255, 119, 29, 7, 255, 118, 29, 7, 255, 117, 29, 7, 255, 116, - 29, 7, 255, 115, 29, 7, 255, 114, 29, 7, 255, 113, 29, 7, 255, 112, 29, - 7, 255, 111, 29, 7, 255, 110, 29, 7, 255, 109, 29, 7, 255, 108, 29, 7, - 255, 107, 29, 7, 255, 106, 29, 7, 255, 105, 29, 7, 255, 104, 29, 7, 255, - 103, 29, 7, 255, 102, 29, 7, 255, 101, 29, 7, 255, 100, 29, 7, 255, 99, - 29, 7, 255, 98, 29, 7, 255, 97, 29, 7, 255, 96, 29, 7, 255, 95, 29, 7, - 255, 94, 29, 7, 255, 93, 29, 7, 255, 92, 29, 7, 255, 91, 29, 7, 255, 90, - 29, 7, 255, 89, 29, 7, 255, 88, 29, 7, 255, 87, 29, 7, 255, 86, 29, 7, - 255, 85, 29, 7, 255, 84, 29, 7, 255, 83, 29, 7, 255, 82, 29, 7, 255, 81, - 29, 7, 255, 80, 29, 7, 255, 79, 29, 7, 255, 78, 29, 7, 255, 76, 29, 7, - 255, 75, 29, 7, 255, 74, 29, 7, 255, 73, 29, 7, 255, 72, 29, 7, 255, 71, - 29, 7, 255, 70, 29, 7, 255, 69, 29, 7, 255, 68, 29, 7, 255, 67, 29, 7, - 255, 66, 29, 7, 255, 65, 29, 7, 255, 64, 29, 7, 255, 63, 29, 7, 255, 62, - 29, 7, 255, 61, 29, 7, 255, 60, 29, 7, 255, 59, 29, 7, 255, 58, 29, 7, - 255, 57, 29, 7, 255, 56, 29, 7, 255, 55, 29, 7, 255, 54, 29, 7, 255, 53, - 29, 7, 255, 52, 29, 7, 255, 51, 29, 7, 255, 50, 29, 7, 255, 49, 29, 7, - 255, 48, 29, 7, 255, 47, 29, 7, 255, 46, 29, 7, 255, 45, 29, 7, 255, 44, - 29, 7, 255, 43, 29, 7, 255, 41, 29, 7, 255, 40, 29, 7, 255, 39, 29, 7, - 255, 38, 29, 7, 255, 37, 29, 7, 255, 36, 29, 7, 255, 35, 29, 7, 255, 34, - 29, 7, 255, 33, 29, 7, 255, 32, 29, 7, 255, 31, 29, 7, 255, 30, 29, 7, - 255, 28, 29, 7, 255, 27, 29, 7, 255, 26, 29, 7, 255, 25, 29, 7, 255, 24, - 29, 7, 255, 23, 29, 7, 255, 22, 29, 7, 255, 21, 29, 7, 255, 20, 29, 7, - 255, 19, 29, 7, 255, 18, 29, 7, 255, 17, 29, 7, 255, 16, 29, 7, 255, 15, - 29, 7, 255, 14, 29, 7, 255, 13, 29, 7, 255, 12, 29, 7, 255, 11, 29, 7, - 255, 10, 29, 7, 255, 9, 29, 7, 255, 8, 29, 7, 255, 7, 29, 7, 255, 6, 29, - 7, 255, 5, 29, 7, 255, 4, 29, 7, 255, 3, 29, 7, 255, 2, 29, 7, 255, 1, - 29, 7, 255, 0, 29, 7, 254, 255, 29, 7, 254, 254, 29, 7, 254, 253, 29, 7, - 254, 252, 29, 7, 254, 251, 29, 7, 254, 250, 29, 7, 254, 249, 29, 7, 254, - 248, 29, 7, 254, 247, 29, 7, 254, 246, 29, 7, 254, 245, 29, 7, 254, 244, - 29, 7, 254, 243, 29, 7, 254, 242, 29, 7, 254, 241, 29, 7, 254, 240, 29, - 7, 254, 239, 29, 7, 254, 238, 29, 7, 254, 237, 29, 7, 254, 236, 29, 7, - 254, 235, 29, 7, 254, 234, 29, 7, 254, 233, 29, 7, 254, 232, 29, 7, 254, - 231, 29, 7, 254, 230, 29, 7, 254, 229, 29, 7, 254, 228, 29, 7, 254, 227, - 29, 7, 254, 226, 29, 7, 254, 225, 29, 7, 254, 224, 29, 7, 254, 223, 29, - 7, 254, 222, 29, 7, 254, 221, 29, 7, 254, 220, 29, 7, 254, 219, 29, 7, - 254, 218, 29, 7, 254, 217, 29, 7, 254, 216, 29, 7, 254, 214, 29, 7, 254, - 213, 29, 7, 254, 212, 29, 7, 254, 211, 29, 7, 254, 210, 29, 7, 254, 209, - 29, 7, 254, 208, 29, 7, 254, 207, 29, 7, 254, 206, 29, 7, 254, 205, 29, - 7, 254, 204, 29, 7, 254, 203, 29, 7, 254, 202, 29, 7, 254, 201, 29, 7, - 254, 200, 29, 7, 254, 199, 29, 7, 254, 198, 29, 7, 254, 197, 29, 7, 254, - 196, 29, 7, 254, 195, 29, 7, 254, 194, 29, 7, 254, 193, 29, 7, 254, 192, - 29, 7, 254, 191, 29, 7, 254, 190, 29, 7, 254, 189, 29, 7, 254, 188, 29, - 7, 254, 187, 29, 7, 254, 186, 29, 7, 254, 185, 29, 7, 254, 184, 29, 7, - 254, 183, 29, 7, 254, 182, 29, 7, 254, 181, 29, 7, 254, 180, 29, 7, 254, - 179, 29, 7, 254, 178, 29, 7, 254, 177, 29, 7, 254, 176, 29, 7, 254, 175, - 29, 7, 254, 174, 29, 7, 254, 173, 29, 7, 254, 172, 29, 7, 254, 171, 29, - 7, 254, 170, 29, 7, 254, 169, 29, 7, 254, 168, 29, 7, 254, 167, 29, 7, - 254, 166, 29, 7, 254, 165, 29, 7, 254, 164, 29, 7, 254, 163, 29, 7, 254, - 162, 29, 7, 254, 161, 29, 7, 254, 160, 29, 7, 254, 159, 29, 7, 254, 158, - 29, 7, 254, 157, 29, 7, 254, 156, 29, 7, 254, 155, 29, 7, 254, 154, 29, - 7, 254, 153, 29, 7, 254, 152, 29, 7, 254, 151, 29, 7, 254, 150, 29, 7, - 254, 149, 29, 7, 254, 148, 29, 7, 254, 147, 29, 7, 254, 146, 29, 7, 254, - 145, 29, 7, 254, 144, 29, 7, 254, 143, 29, 7, 254, 142, 29, 7, 254, 141, - 29, 7, 254, 140, 29, 7, 254, 139, 29, 7, 254, 138, 29, 7, 254, 137, 29, - 7, 254, 136, 29, 7, 254, 135, 29, 7, 254, 134, 29, 7, 254, 133, 29, 7, - 254, 132, 29, 7, 254, 131, 29, 7, 254, 130, 29, 7, 254, 129, 29, 7, 254, - 128, 29, 7, 254, 127, 29, 7, 254, 126, 29, 7, 254, 125, 29, 7, 254, 124, - 29, 7, 254, 123, 29, 7, 254, 122, 29, 7, 254, 121, 29, 7, 254, 120, 29, - 7, 254, 119, 29, 7, 254, 118, 29, 7, 254, 117, 29, 7, 254, 116, 29, 7, - 254, 115, 29, 7, 254, 114, 29, 7, 254, 113, 29, 7, 254, 112, 29, 7, 254, - 111, 29, 7, 254, 110, 29, 7, 254, 109, 29, 7, 254, 108, 29, 7, 254, 107, - 29, 7, 254, 106, 29, 7, 254, 105, 29, 7, 254, 104, 29, 7, 254, 102, 29, - 7, 254, 101, 29, 7, 254, 100, 29, 7, 254, 99, 29, 7, 254, 98, 29, 7, 254, - 97, 29, 7, 254, 96, 29, 7, 254, 95, 29, 7, 254, 94, 29, 7, 254, 93, 29, - 7, 254, 92, 29, 7, 254, 89, 29, 7, 254, 88, 29, 7, 254, 87, 29, 7, 254, - 86, 29, 7, 254, 82, 29, 7, 254, 81, 29, 7, 254, 80, 29, 7, 254, 79, 29, - 7, 254, 78, 29, 7, 254, 77, 29, 7, 254, 76, 29, 7, 254, 75, 29, 7, 254, - 74, 29, 7, 254, 73, 29, 7, 254, 72, 29, 7, 254, 71, 29, 7, 254, 70, 29, - 7, 254, 69, 29, 7, 254, 68, 29, 7, 254, 67, 29, 7, 254, 66, 29, 7, 254, - 65, 29, 7, 254, 64, 29, 7, 254, 62, 29, 7, 254, 61, 29, 7, 254, 60, 29, - 7, 254, 59, 29, 7, 254, 58, 29, 7, 254, 57, 29, 7, 254, 56, 29, 7, 254, - 55, 29, 7, 254, 54, 29, 7, 254, 53, 29, 7, 254, 52, 29, 7, 254, 51, 29, - 7, 254, 50, 29, 7, 254, 49, 29, 7, 254, 48, 29, 7, 254, 47, 29, 7, 254, - 46, 29, 7, 254, 45, 29, 7, 254, 44, 29, 7, 254, 43, 29, 7, 254, 42, 29, - 7, 254, 41, 29, 7, 254, 40, 29, 7, 254, 39, 29, 7, 254, 38, 29, 7, 254, - 37, 29, 7, 254, 36, 29, 7, 254, 35, 29, 7, 254, 34, 29, 7, 254, 33, 29, - 7, 254, 32, 29, 7, 254, 31, 29, 7, 254, 30, 29, 7, 254, 29, 29, 7, 254, - 28, 29, 7, 254, 27, 29, 7, 254, 26, 29, 7, 254, 25, 29, 7, 254, 24, 29, - 7, 254, 23, 29, 7, 254, 22, 29, 7, 254, 21, 29, 7, 254, 20, 29, 7, 254, - 19, 29, 7, 254, 18, 29, 7, 254, 17, 29, 7, 254, 16, 29, 7, 254, 15, 29, - 7, 254, 14, 29, 7, 254, 13, 29, 7, 254, 12, 29, 7, 254, 11, 29, 7, 254, - 10, 29, 7, 254, 9, 29, 7, 254, 8, 29, 7, 254, 7, 29, 7, 254, 6, 29, 7, - 254, 5, 29, 7, 254, 4, 29, 7, 254, 3, 29, 7, 254, 2, 29, 7, 254, 1, 207, - 186, 211, 57, 207, 1, 29, 7, 254, 0, 29, 7, 253, 255, 29, 7, 253, 254, - 29, 7, 253, 253, 29, 7, 253, 252, 29, 7, 253, 251, 29, 7, 253, 250, 29, - 7, 253, 249, 29, 7, 253, 248, 29, 7, 253, 247, 29, 7, 253, 246, 29, 7, - 253, 245, 171, 29, 7, 253, 244, 29, 7, 253, 243, 29, 7, 253, 242, 29, 7, - 253, 241, 29, 7, 253, 240, 29, 7, 253, 239, 29, 7, 253, 238, 29, 7, 253, - 236, 29, 7, 253, 234, 29, 7, 253, 232, 29, 7, 253, 230, 29, 7, 253, 228, - 29, 7, 253, 226, 29, 7, 253, 224, 29, 7, 253, 222, 29, 7, 253, 220, 29, - 7, 253, 218, 248, 249, 219, 28, 77, 29, 7, 253, 216, 234, 95, 219, 28, - 77, 29, 7, 253, 215, 29, 7, 253, 213, 29, 7, 253, 211, 29, 7, 253, 209, - 29, 7, 253, 207, 29, 7, 253, 205, 29, 7, 253, 203, 29, 7, 253, 201, 29, - 7, 253, 199, 29, 7, 253, 198, 29, 7, 253, 197, 29, 7, 253, 196, 29, 7, - 253, 195, 29, 7, 253, 194, 29, 7, 253, 193, 29, 7, 253, 192, 29, 7, 253, - 191, 29, 7, 253, 190, 29, 7, 253, 189, 29, 7, 253, 188, 29, 7, 253, 187, - 29, 7, 253, 186, 29, 7, 253, 185, 29, 7, 253, 184, 29, 7, 253, 183, 29, - 7, 253, 182, 29, 7, 253, 181, 29, 7, 253, 180, 29, 7, 253, 179, 29, 7, - 253, 178, 29, 7, 253, 177, 29, 7, 253, 176, 29, 7, 253, 175, 29, 7, 253, - 174, 29, 7, 253, 173, 29, 7, 253, 172, 29, 7, 253, 171, 29, 7, 253, 170, - 29, 7, 253, 169, 29, 7, 253, 168, 29, 7, 253, 167, 29, 7, 253, 166, 29, - 7, 253, 165, 29, 7, 253, 164, 29, 7, 253, 163, 29, 7, 253, 162, 29, 7, - 253, 161, 29, 7, 253, 160, 29, 7, 253, 159, 29, 7, 253, 158, 29, 7, 253, - 157, 29, 7, 253, 156, 29, 7, 253, 155, 29, 7, 253, 154, 29, 7, 253, 153, - 29, 7, 253, 152, 29, 7, 253, 151, 29, 7, 253, 150, 29, 7, 253, 149, 29, - 7, 253, 148, 29, 7, 253, 147, 29, 7, 253, 146, 29, 7, 253, 145, 29, 7, - 253, 144, 29, 7, 253, 143, 29, 7, 253, 142, 29, 7, 253, 141, 29, 7, 253, - 140, 29, 7, 253, 139, 29, 7, 253, 138, 29, 7, 253, 137, 29, 7, 253, 136, - 29, 7, 253, 135, 29, 7, 253, 134, 29, 7, 253, 133, 29, 7, 253, 132, 29, - 7, 253, 131, 29, 7, 253, 130, 29, 7, 253, 129, 29, 7, 253, 128, 29, 7, - 253, 127, 29, 7, 253, 126, 29, 7, 253, 125, 29, 7, 253, 124, 29, 7, 253, - 123, 29, 7, 253, 122, 29, 7, 253, 121, 29, 7, 253, 120, 29, 7, 253, 119, - 29, 7, 253, 118, 29, 7, 253, 117, 29, 7, 253, 116, 29, 7, 253, 115, 29, - 7, 253, 114, 29, 7, 253, 113, 29, 7, 253, 112, 29, 7, 253, 111, 29, 7, - 253, 110, 29, 7, 253, 109, 29, 7, 253, 108, 29, 7, 253, 107, 29, 7, 253, - 106, 29, 7, 253, 105, 29, 7, 253, 104, 29, 7, 253, 103, 29, 7, 253, 102, - 29, 7, 253, 101, 29, 7, 253, 100, 29, 7, 253, 99, 29, 7, 253, 98, 29, 7, - 253, 97, 29, 7, 253, 96, 29, 7, 253, 95, 29, 7, 253, 94, 29, 7, 253, 93, - 29, 7, 253, 92, 29, 7, 253, 91, 29, 7, 253, 90, 29, 7, 253, 89, 26, 1, - 209, 218, 214, 1, 216, 142, 26, 1, 209, 218, 231, 173, 232, 166, 26, 1, - 209, 218, 209, 40, 216, 143, 209, 127, 26, 1, 209, 218, 209, 40, 216, - 143, 209, 128, 26, 1, 209, 218, 214, 251, 216, 142, 26, 1, 209, 218, 203, - 0, 26, 1, 209, 218, 198, 124, 216, 142, 26, 1, 209, 218, 212, 47, 216, - 142, 26, 1, 209, 218, 203, 68, 210, 221, 213, 141, 26, 1, 209, 218, 209, - 40, 210, 221, 213, 142, 209, 127, 26, 1, 209, 218, 209, 40, 210, 221, - 213, 142, 209, 128, 26, 1, 209, 218, 217, 131, 26, 1, 209, 218, 197, 95, - 217, 132, 26, 1, 209, 218, 214, 62, 26, 1, 209, 218, 217, 128, 26, 1, - 209, 218, 217, 77, 26, 1, 209, 218, 215, 86, 26, 1, 209, 218, 203, 249, - 26, 1, 209, 218, 212, 187, 26, 1, 209, 218, 221, 234, 26, 1, 209, 218, - 213, 108, 26, 1, 209, 218, 200, 160, 26, 1, 209, 218, 214, 0, 26, 1, 209, - 218, 220, 15, 26, 1, 209, 218, 219, 177, 220, 188, 26, 1, 209, 218, 212, - 197, 216, 150, 26, 1, 209, 218, 217, 135, 26, 1, 209, 218, 210, 98, 26, - 1, 209, 218, 231, 72, 26, 1, 209, 218, 210, 170, 26, 1, 209, 218, 215, - 232, 214, 35, 26, 1, 209, 218, 212, 28, 216, 153, 26, 1, 209, 218, 126, - 191, 195, 214, 244, 26, 1, 209, 218, 231, 73, 26, 1, 209, 218, 212, 197, - 212, 198, 26, 1, 209, 218, 202, 139, 26, 1, 209, 218, 216, 135, 26, 1, - 209, 218, 216, 156, 26, 1, 209, 218, 215, 207, 26, 1, 209, 218, 222, 105, - 26, 1, 209, 218, 210, 221, 219, 225, 26, 1, 209, 218, 214, 163, 219, 225, - 26, 1, 209, 218, 209, 240, 26, 1, 209, 218, 217, 129, 26, 1, 209, 218, - 213, 185, 26, 1, 209, 218, 208, 144, 26, 1, 209, 218, 197, 87, 26, 1, - 209, 218, 218, 221, 26, 1, 209, 218, 202, 17, 26, 1, 209, 218, 199, 58, - 26, 1, 209, 218, 217, 126, 26, 1, 209, 218, 221, 241, 26, 1, 209, 218, - 214, 159, 26, 1, 209, 218, 220, 203, 26, 1, 209, 218, 215, 208, 26, 1, - 209, 218, 202, 252, 26, 1, 209, 218, 219, 20, 26, 1, 209, 218, 232, 239, - 26, 1, 209, 218, 206, 137, 26, 1, 209, 218, 221, 10, 26, 1, 209, 218, - 202, 13, 26, 1, 209, 218, 217, 72, 209, 173, 26, 1, 209, 218, 203, 61, - 26, 1, 209, 218, 212, 196, 26, 1, 209, 218, 203, 42, 212, 208, 191, 203, - 26, 1, 209, 218, 212, 69, 215, 228, 26, 1, 209, 218, 210, 216, 26, 1, - 209, 218, 213, 110, 26, 1, 209, 218, 196, 85, 26, 1, 209, 218, 214, 38, - 26, 1, 209, 218, 217, 125, 26, 1, 209, 218, 213, 153, 26, 1, 209, 218, - 217, 6, 26, 1, 209, 218, 212, 84, 26, 1, 209, 218, 199, 62, 26, 1, 209, - 218, 202, 8, 26, 1, 209, 218, 210, 217, 26, 1, 209, 218, 212, 212, 26, 1, - 209, 218, 217, 133, 26, 1, 209, 218, 212, 81, 26, 1, 209, 218, 222, 66, - 26, 1, 209, 218, 212, 215, 26, 1, 209, 218, 195, 148, 26, 1, 209, 218, - 218, 225, 26, 1, 209, 218, 214, 102, 26, 1, 209, 218, 214, 217, 26, 1, - 209, 218, 217, 5, 26, 1, 209, 217, 212, 210, 26, 1, 209, 217, 197, 95, - 217, 130, 26, 1, 209, 217, 202, 204, 26, 1, 209, 217, 203, 253, 197, 94, - 26, 1, 209, 217, 219, 23, 212, 193, 26, 1, 209, 217, 217, 12, 217, 134, - 26, 1, 209, 217, 221, 150, 26, 1, 209, 217, 192, 43, 26, 1, 209, 217, - 217, 7, 26, 1, 209, 217, 222, 90, 26, 1, 209, 217, 210, 44, 26, 1, 209, - 217, 192, 126, 219, 225, 26, 1, 209, 217, 220, 36, 212, 208, 212, 95, 26, - 1, 209, 217, 212, 190, 203, 87, 26, 1, 209, 217, 214, 130, 213, 156, 26, - 1, 209, 217, 231, 70, 26, 1, 209, 217, 209, 117, 26, 1, 209, 217, 197, - 95, 212, 206, 26, 1, 209, 217, 203, 92, 213, 151, 26, 1, 209, 217, 203, - 88, 26, 1, 209, 217, 216, 143, 199, 61, 26, 1, 209, 217, 216, 250, 217, - 8, 26, 1, 209, 217, 212, 82, 212, 193, 26, 1, 209, 217, 221, 230, 26, 1, - 209, 217, 231, 71, 26, 1, 209, 217, 221, 226, 26, 1, 209, 217, 220, 120, - 26, 1, 209, 217, 210, 101, 26, 1, 209, 217, 195, 77, 26, 1, 209, 217, - 214, 2, 215, 84, 26, 1, 209, 217, 214, 37, 216, 246, 26, 1, 209, 217, - 192, 254, 26, 1, 209, 217, 205, 175, 26, 1, 209, 217, 199, 240, 26, 1, - 209, 217, 216, 155, 26, 1, 209, 217, 214, 21, 26, 1, 209, 217, 214, 22, - 220, 12, 26, 1, 209, 217, 216, 145, 26, 1, 209, 217, 200, 214, 26, 1, - 209, 217, 216, 254, 26, 1, 209, 217, 215, 212, 26, 1, 209, 217, 212, 99, - 26, 1, 209, 217, 208, 148, 26, 1, 209, 217, 216, 154, 214, 39, 26, 1, - 209, 217, 233, 28, 26, 1, 209, 217, 216, 241, 26, 1, 209, 217, 233, 52, - 26, 1, 209, 217, 221, 238, 26, 1, 209, 217, 217, 160, 213, 145, 26, 1, - 209, 217, 217, 160, 213, 121, 26, 1, 209, 217, 219, 176, 26, 1, 209, 217, - 214, 45, 26, 1, 209, 217, 212, 217, 26, 1, 209, 217, 174, 26, 1, 209, - 217, 221, 133, 26, 1, 209, 217, 213, 246, 26, 1, 209, 216, 214, 1, 217, - 132, 26, 1, 209, 216, 212, 46, 26, 1, 209, 216, 191, 203, 26, 1, 209, - 216, 193, 160, 26, 1, 209, 216, 214, 38, 26, 1, 209, 216, 214, 151, 26, - 1, 209, 216, 214, 8, 26, 1, 209, 216, 231, 80, 26, 1, 209, 216, 217, 2, - 26, 1, 209, 216, 231, 180, 26, 1, 209, 216, 212, 71, 216, 21, 216, 157, - 26, 1, 209, 216, 212, 184, 216, 249, 26, 1, 209, 216, 216, 255, 26, 1, - 209, 216, 209, 123, 26, 1, 209, 216, 214, 136, 26, 1, 209, 216, 217, 10, - 247, 156, 26, 1, 209, 216, 221, 228, 26, 1, 209, 216, 231, 81, 26, 1, - 209, 216, 221, 235, 26, 1, 209, 216, 191, 226, 215, 117, 26, 1, 209, 216, - 212, 40, 26, 1, 209, 216, 216, 243, 26, 1, 209, 216, 212, 216, 26, 1, - 209, 216, 216, 249, 26, 1, 209, 216, 192, 44, 26, 1, 209, 216, 221, 18, - 26, 1, 209, 216, 222, 127, 26, 1, 209, 216, 203, 248, 26, 1, 209, 216, - 214, 145, 26, 1, 209, 216, 199, 238, 26, 1, 209, 216, 213, 125, 26, 1, - 209, 216, 198, 124, 191, 207, 26, 1, 209, 216, 200, 247, 26, 1, 209, 216, - 214, 28, 212, 95, 26, 1, 209, 216, 195, 76, 26, 1, 209, 216, 214, 220, - 26, 1, 209, 216, 217, 160, 221, 237, 26, 1, 209, 216, 212, 198, 26, 1, - 209, 216, 214, 23, 26, 1, 209, 216, 220, 16, 26, 1, 209, 216, 216, 251, - 26, 1, 209, 216, 216, 134, 26, 1, 209, 216, 212, 192, 26, 1, 209, 216, - 199, 57, 26, 1, 209, 216, 214, 25, 26, 1, 209, 216, 232, 84, 26, 1, 209, - 216, 214, 150, 26, 1, 209, 216, 212, 218, 26, 1, 209, 216, 212, 214, 26, - 1, 209, 216, 247, 240, 26, 1, 209, 216, 195, 78, 26, 1, 209, 216, 217, 0, - 26, 1, 209, 216, 206, 68, 26, 1, 209, 216, 213, 155, 26, 1, 209, 216, - 220, 35, 26, 1, 209, 216, 198, 121, 26, 1, 209, 216, 212, 200, 213, 246, - 26, 1, 209, 216, 213, 147, 26, 1, 209, 216, 221, 241, 26, 1, 209, 216, - 214, 30, 26, 1, 209, 216, 217, 125, 26, 1, 209, 216, 216, 244, 26, 1, - 209, 216, 218, 225, 26, 1, 209, 216, 220, 188, 26, 1, 209, 216, 213, 153, - 26, 1, 209, 216, 213, 246, 26, 1, 209, 216, 192, 244, 26, 1, 209, 216, - 214, 26, 26, 1, 209, 216, 212, 203, 26, 1, 209, 216, 212, 194, 26, 1, - 209, 216, 220, 205, 213, 110, 26, 1, 209, 216, 212, 201, 26, 1, 209, 216, - 214, 158, 26, 1, 209, 216, 217, 160, 212, 206, 26, 1, 209, 216, 192, 140, - 26, 1, 209, 216, 214, 157, 26, 1, 209, 216, 202, 255, 26, 1, 209, 216, - 203, 251, 26, 1, 209, 216, 216, 252, 26, 1, 209, 216, 217, 132, 26, 1, - 209, 216, 217, 6, 26, 1, 209, 216, 221, 229, 26, 1, 209, 216, 216, 253, - 26, 1, 209, 216, 221, 233, 26, 1, 209, 216, 217, 10, 209, 179, 26, 1, - 209, 216, 191, 186, 26, 1, 209, 216, 213, 143, 26, 1, 209, 216, 216, 80, - 26, 1, 209, 216, 215, 149, 26, 1, 209, 216, 203, 64, 26, 1, 209, 216, - 221, 252, 219, 250, 26, 1, 209, 216, 221, 252, 233, 65, 26, 1, 209, 216, - 214, 60, 26, 1, 209, 216, 214, 217, 26, 1, 209, 216, 219, 94, 26, 1, 209, - 216, 209, 139, 26, 1, 209, 216, 210, 34, 26, 1, 209, 216, 199, 73, 26, 1, - 158, 216, 242, 26, 1, 158, 193, 158, 26, 1, 158, 213, 141, 26, 1, 158, - 216, 142, 26, 1, 158, 213, 139, 26, 1, 158, 219, 139, 26, 1, 158, 213, - 144, 26, 1, 158, 212, 213, 26, 1, 158, 214, 44, 26, 1, 158, 212, 95, 26, - 1, 158, 192, 255, 26, 1, 158, 213, 254, 26, 1, 158, 203, 111, 26, 1, 158, - 214, 9, 26, 1, 158, 221, 236, 26, 1, 158, 199, 59, 26, 1, 158, 203, 90, - 26, 1, 158, 213, 152, 26, 1, 158, 200, 214, 26, 1, 158, 221, 241, 26, 1, - 158, 192, 128, 26, 1, 158, 220, 206, 26, 1, 158, 205, 130, 26, 1, 158, - 216, 147, 26, 1, 158, 214, 149, 26, 1, 158, 217, 95, 26, 1, 158, 216, - 153, 26, 1, 158, 203, 250, 26, 1, 158, 192, 70, 26, 1, 158, 213, 146, 26, - 1, 158, 221, 232, 216, 245, 26, 1, 158, 214, 5, 26, 1, 158, 197, 94, 26, - 1, 158, 231, 90, 26, 1, 158, 213, 251, 26, 1, 158, 233, 29, 26, 1, 158, - 214, 153, 26, 1, 158, 216, 126, 26, 1, 158, 219, 170, 26, 1, 158, 214, - 135, 26, 1, 158, 215, 227, 26, 1, 158, 216, 130, 26, 1, 158, 208, 127, - 26, 1, 158, 216, 128, 26, 1, 158, 216, 144, 26, 1, 158, 218, 208, 26, 1, - 158, 212, 205, 26, 1, 158, 217, 9, 26, 1, 158, 220, 177, 26, 1, 158, 212, - 84, 26, 1, 158, 199, 62, 26, 1, 158, 202, 8, 26, 1, 158, 191, 186, 26, 1, - 158, 221, 233, 26, 1, 158, 207, 162, 26, 1, 158, 199, 120, 26, 1, 158, - 214, 6, 26, 1, 158, 216, 149, 26, 1, 158, 212, 204, 26, 1, 158, 221, 231, - 26, 1, 158, 209, 129, 26, 1, 158, 209, 233, 26, 1, 158, 212, 57, 26, 1, - 158, 219, 176, 26, 1, 158, 214, 45, 26, 1, 158, 216, 146, 26, 1, 158, - 214, 18, 26, 1, 158, 191, 200, 26, 1, 158, 210, 137, 26, 1, 158, 191, - 199, 26, 1, 158, 214, 158, 26, 1, 158, 212, 193, 26, 1, 158, 200, 249, - 26, 1, 158, 220, 210, 26, 1, 158, 214, 34, 26, 1, 158, 214, 3, 26, 1, - 158, 197, 69, 26, 1, 158, 216, 157, 26, 1, 158, 220, 199, 26, 1, 158, - 212, 202, 26, 1, 158, 199, 60, 26, 1, 158, 217, 127, 26, 1, 158, 214, 43, - 26, 1, 158, 219, 169, 26, 1, 158, 214, 24, 26, 1, 158, 212, 207, 26, 1, - 158, 213, 125, 26, 1, 158, 231, 74, 26, 1, 158, 220, 232, 26, 1, 158, - 207, 56, 211, 119, 26, 1, 158, 199, 226, 26, 1, 158, 198, 50, 26, 1, 158, - 212, 81, 26, 1, 158, 206, 195, 26, 1, 158, 219, 227, 26, 1, 158, 216, - 210, 26, 1, 158, 218, 168, 26, 1, 158, 200, 160, 26, 1, 158, 215, 155, - 26, 1, 158, 203, 76, 26, 1, 158, 203, 86, 26, 1, 158, 220, 149, 26, 1, - 158, 212, 178, 26, 1, 158, 203, 5, 26, 1, 158, 212, 195, 26, 1, 158, 210, - 49, 26, 1, 158, 213, 219, 26, 1, 158, 203, 41, 26, 1, 158, 208, 143, 26, - 1, 158, 215, 84, 26, 1, 158, 219, 0, 26, 1, 158, 207, 56, 215, 144, 26, - 1, 158, 198, 193, 26, 1, 158, 212, 181, 26, 1, 158, 217, 10, 175, 26, 1, - 158, 205, 128, 26, 1, 158, 233, 108, 26, 1, 114, 214, 157, 26, 1, 114, - 198, 57, 26, 1, 114, 216, 255, 26, 1, 114, 220, 16, 26, 1, 114, 195, 10, - 26, 1, 114, 219, 6, 26, 1, 114, 210, 220, 26, 1, 114, 202, 21, 26, 1, - 114, 207, 134, 26, 1, 114, 212, 209, 26, 1, 114, 214, 128, 26, 1, 114, - 208, 161, 26, 1, 114, 199, 197, 26, 1, 114, 214, 11, 26, 1, 114, 221, 14, - 26, 1, 114, 192, 247, 26, 1, 114, 205, 50, 26, 1, 114, 214, 35, 26, 1, - 114, 210, 217, 26, 1, 114, 198, 59, 26, 1, 114, 220, 204, 26, 1, 114, - 219, 22, 26, 1, 114, 212, 212, 26, 1, 114, 213, 243, 26, 1, 114, 217, - 133, 26, 1, 114, 214, 4, 26, 1, 114, 213, 242, 26, 1, 114, 212, 211, 26, - 1, 114, 206, 192, 26, 1, 114, 213, 143, 26, 1, 114, 210, 46, 26, 1, 114, - 205, 197, 26, 1, 114, 214, 19, 26, 1, 114, 216, 136, 26, 1, 114, 231, 68, - 26, 1, 114, 214, 7, 26, 1, 114, 213, 154, 26, 1, 114, 217, 71, 26, 1, - 114, 219, 2, 26, 1, 114, 214, 40, 26, 1, 114, 214, 141, 26, 1, 114, 199, - 225, 212, 193, 26, 1, 114, 203, 252, 26, 1, 114, 208, 154, 26, 1, 114, - 214, 161, 202, 30, 26, 1, 114, 214, 27, 212, 95, 26, 1, 114, 192, 29, 26, - 1, 114, 231, 69, 26, 1, 114, 197, 88, 26, 1, 114, 192, 47, 26, 1, 114, - 209, 73, 26, 1, 114, 197, 75, 26, 1, 114, 221, 239, 26, 1, 114, 200, 248, - 26, 1, 114, 199, 61, 26, 1, 114, 195, 79, 26, 1, 114, 193, 100, 26, 1, - 114, 220, 123, 26, 1, 114, 208, 165, 26, 1, 114, 199, 239, 26, 1, 114, - 231, 89, 26, 1, 114, 214, 50, 26, 1, 114, 203, 89, 26, 1, 114, 216, 131, - 26, 1, 114, 217, 3, 26, 1, 114, 212, 44, 26, 1, 114, 213, 106, 26, 1, - 114, 231, 176, 26, 1, 114, 197, 76, 26, 1, 114, 220, 215, 26, 1, 114, - 192, 104, 26, 1, 114, 212, 82, 242, 237, 26, 1, 114, 192, 18, 26, 1, 114, - 216, 148, 26, 1, 114, 214, 146, 26, 1, 114, 209, 174, 26, 1, 114, 191, - 206, 26, 1, 114, 219, 171, 26, 1, 114, 232, 84, 26, 1, 114, 231, 175, 26, - 1, 114, 213, 253, 26, 1, 114, 221, 241, 26, 1, 114, 217, 136, 26, 1, 114, - 214, 10, 26, 1, 114, 231, 75, 26, 1, 114, 233, 109, 26, 1, 114, 212, 182, - 26, 1, 114, 209, 234, 26, 1, 114, 192, 45, 26, 1, 114, 214, 36, 26, 1, - 114, 212, 82, 248, 209, 26, 1, 114, 212, 24, 26, 1, 114, 209, 35, 26, 1, - 114, 216, 80, 26, 1, 114, 232, 82, 26, 1, 114, 214, 244, 26, 1, 114, 215, - 149, 26, 1, 114, 231, 74, 26, 1, 114, 232, 87, 68, 26, 1, 114, 215, 85, - 26, 1, 114, 208, 160, 26, 1, 114, 213, 255, 26, 1, 114, 220, 188, 26, 1, - 114, 209, 171, 26, 1, 114, 212, 196, 26, 1, 114, 192, 46, 26, 1, 114, - 214, 20, 26, 1, 114, 210, 221, 210, 19, 26, 1, 114, 232, 87, 247, 138, - 26, 1, 114, 232, 167, 26, 1, 114, 213, 148, 26, 1, 114, 65, 26, 1, 114, - 198, 50, 26, 1, 114, 74, 26, 1, 114, 68, 26, 1, 114, 220, 14, 26, 1, 114, - 210, 221, 209, 82, 26, 1, 114, 199, 245, 26, 1, 114, 199, 180, 26, 1, - 114, 214, 161, 215, 71, 228, 172, 26, 1, 114, 203, 64, 26, 1, 114, 192, - 42, 26, 1, 114, 213, 236, 26, 1, 114, 191, 211, 26, 1, 114, 191, 244, - 200, 136, 26, 1, 114, 191, 244, 238, 242, 26, 1, 114, 191, 194, 26, 1, - 114, 191, 202, 26, 1, 114, 221, 227, 26, 1, 114, 209, 232, 26, 1, 114, - 213, 149, 234, 49, 26, 1, 114, 208, 156, 26, 1, 114, 192, 253, 26, 1, - 114, 233, 52, 26, 1, 114, 195, 148, 26, 1, 114, 218, 225, 26, 1, 114, - 216, 100, 26, 1, 114, 207, 20, 26, 1, 114, 207, 163, 26, 1, 114, 213, - 235, 26, 1, 114, 214, 68, 26, 1, 114, 203, 56, 26, 1, 114, 203, 41, 26, - 1, 114, 232, 87, 207, 59, 26, 1, 114, 180, 26, 1, 114, 209, 185, 26, 1, - 114, 219, 0, 26, 1, 114, 221, 67, 26, 1, 114, 216, 186, 26, 1, 114, 174, - 26, 1, 114, 217, 68, 26, 1, 114, 199, 63, 26, 1, 114, 221, 166, 26, 1, - 114, 215, 231, 26, 1, 114, 199, 95, 26, 1, 114, 233, 76, 26, 1, 114, 231, - 62, 26, 1, 209, 215, 155, 26, 1, 209, 215, 66, 26, 1, 209, 215, 220, 232, - 26, 1, 209, 215, 234, 188, 26, 1, 209, 215, 207, 84, 26, 1, 209, 215, - 199, 226, 26, 1, 209, 215, 212, 81, 26, 1, 209, 215, 173, 26, 1, 209, - 215, 206, 195, 26, 1, 209, 215, 206, 242, 26, 1, 209, 215, 216, 210, 26, - 1, 209, 215, 199, 245, 26, 1, 209, 215, 214, 160, 26, 1, 209, 215, 213, - 155, 26, 1, 209, 215, 218, 168, 26, 1, 209, 215, 200, 160, 26, 1, 209, - 215, 203, 76, 26, 1, 209, 215, 202, 222, 26, 1, 209, 215, 203, 248, 26, - 1, 209, 215, 220, 149, 26, 1, 209, 215, 221, 241, 26, 1, 209, 215, 212, - 146, 26, 1, 209, 215, 212, 178, 26, 1, 209, 215, 213, 126, 26, 1, 209, - 215, 191, 243, 26, 1, 209, 215, 203, 5, 26, 1, 209, 215, 170, 26, 1, 209, - 215, 212, 215, 26, 1, 209, 215, 209, 232, 26, 1, 209, 215, 212, 195, 26, - 1, 209, 215, 192, 253, 26, 1, 209, 215, 210, 49, 26, 1, 209, 215, 206, - 68, 26, 1, 209, 215, 213, 219, 26, 1, 209, 215, 207, 20, 26, 1, 209, 215, - 221, 251, 26, 1, 209, 215, 213, 252, 26, 1, 209, 215, 214, 47, 26, 1, - 209, 215, 203, 56, 26, 1, 209, 215, 208, 161, 26, 1, 209, 215, 232, 167, - 26, 1, 209, 215, 193, 190, 26, 1, 209, 215, 219, 146, 26, 1, 209, 215, - 219, 0, 26, 1, 209, 215, 221, 67, 26, 1, 209, 215, 217, 1, 26, 1, 209, - 215, 207, 55, 26, 1, 209, 215, 174, 26, 1, 209, 215, 216, 12, 26, 1, 209, - 215, 217, 9, 26, 1, 209, 215, 199, 73, 26, 1, 209, 215, 221, 21, 26, 1, - 209, 215, 205, 150, 26, 1, 209, 215, 193, 248, 215, 159, 1, 190, 190, - 215, 159, 1, 214, 16, 215, 159, 1, 192, 12, 215, 159, 1, 216, 46, 215, - 159, 1, 249, 153, 215, 159, 1, 238, 32, 215, 159, 1, 65, 215, 159, 1, - 209, 211, 215, 159, 1, 221, 209, 215, 159, 1, 230, 22, 215, 159, 1, 238, - 7, 215, 159, 1, 243, 48, 215, 159, 1, 222, 15, 215, 159, 1, 211, 120, - 215, 159, 1, 217, 133, 215, 159, 1, 213, 179, 215, 159, 1, 168, 215, 159, - 1, 211, 87, 215, 159, 1, 74, 215, 159, 1, 206, 162, 215, 159, 1, 203, 81, - 215, 159, 1, 199, 32, 215, 159, 1, 234, 217, 215, 159, 1, 193, 190, 215, - 159, 1, 71, 215, 159, 1, 221, 67, 215, 159, 1, 220, 24, 215, 159, 1, 173, - 215, 159, 1, 230, 80, 215, 159, 1, 207, 1, 215, 159, 1, 199, 110, 215, - 159, 17, 191, 77, 215, 159, 17, 107, 215, 159, 17, 109, 215, 159, 17, - 138, 215, 159, 17, 134, 215, 159, 17, 149, 215, 159, 17, 169, 215, 159, - 17, 175, 215, 159, 17, 171, 215, 159, 17, 178, 215, 159, 237, 238, 215, - 159, 55, 237, 238, 199, 186, 1, 210, 238, 199, 186, 1, 211, 166, 199, - 186, 1, 211, 58, 199, 186, 1, 210, 247, 199, 186, 1, 250, 123, 199, 186, - 1, 252, 63, 199, 186, 1, 251, 37, 199, 186, 1, 250, 133, 199, 186, 1, - 193, 227, 199, 186, 1, 195, 155, 199, 186, 1, 194, 255, 199, 186, 1, 193, - 236, 199, 186, 1, 233, 182, 199, 186, 1, 234, 197, 199, 186, 1, 234, 46, - 199, 186, 1, 233, 221, 199, 186, 1, 223, 41, 199, 186, 1, 228, 28, 199, - 186, 1, 223, 79, 199, 186, 1, 223, 45, 199, 186, 1, 196, 18, 199, 186, 1, - 196, 160, 199, 186, 1, 196, 64, 199, 186, 1, 196, 22, 199, 186, 1, 250, - 134, 199, 186, 1, 250, 138, 199, 186, 1, 250, 136, 199, 186, 1, 250, 135, - 199, 186, 1, 196, 129, 199, 186, 1, 196, 138, 199, 186, 1, 196, 135, 199, - 186, 1, 196, 130, 199, 186, 1, 53, 214, 70, 199, 186, 1, 179, 196, 145, - 199, 186, 1, 203, 40, 196, 143, 199, 186, 1, 203, 40, 250, 135, 199, 186, - 1, 196, 150, 199, 186, 1, 196, 143, 199, 186, 1, 196, 146, 199, 186, 1, - 196, 145, 199, 186, 1, 196, 131, 199, 186, 1, 196, 134, 199, 186, 1, 196, - 133, 199, 186, 1, 196, 132, 199, 186, 1, 215, 63, 199, 186, 1, 216, 238, - 199, 186, 1, 215, 165, 199, 186, 1, 215, 72, 199, 186, 1, 155, 199, 186, - 1, 221, 215, 199, 186, 1, 231, 240, 199, 186, 1, 214, 68, 199, 186, 1, - 188, 199, 186, 1, 170, 199, 186, 1, 193, 190, 199, 186, 1, 168, 199, 186, - 1, 212, 101, 199, 186, 1, 209, 228, 199, 186, 1, 249, 153, 199, 186, 1, - 174, 199, 186, 1, 180, 199, 186, 1, 140, 199, 186, 1, 173, 199, 186, 1, - 228, 164, 199, 186, 1, 190, 190, 199, 186, 1, 238, 32, 199, 186, 1, 165, - 199, 186, 1, 213, 224, 199, 186, 1, 203, 165, 199, 186, 1, 247, 160, 199, - 186, 1, 197, 168, 199, 186, 1, 231, 91, 199, 186, 1, 228, 161, 199, 186, - 1, 199, 49, 199, 186, 1, 192, 220, 199, 186, 1, 233, 109, 199, 186, 1, - 237, 68, 199, 186, 1, 247, 1, 199, 186, 1, 191, 123, 199, 186, 17, 191, - 77, 199, 186, 17, 107, 199, 186, 17, 109, 199, 186, 17, 138, 199, 186, - 17, 134, 199, 186, 17, 149, 199, 186, 17, 169, 199, 186, 17, 175, 199, - 186, 17, 171, 199, 186, 17, 178, 249, 67, 195, 185, 1, 234, 84, 249, 67, - 195, 185, 1, 155, 249, 67, 195, 185, 1, 205, 68, 249, 67, 195, 185, 1, - 233, 109, 249, 67, 195, 185, 1, 217, 4, 249, 67, 195, 185, 1, 192, 30, - 249, 67, 195, 185, 1, 231, 225, 249, 67, 195, 185, 1, 237, 49, 249, 67, - 195, 185, 1, 221, 20, 249, 67, 195, 185, 1, 222, 201, 249, 67, 195, 185, - 1, 228, 124, 249, 67, 195, 185, 1, 193, 190, 249, 67, 195, 185, 1, 191, - 7, 249, 67, 195, 185, 1, 231, 169, 249, 67, 195, 185, 1, 236, 174, 249, - 67, 195, 185, 1, 247, 42, 249, 67, 195, 185, 1, 196, 23, 249, 67, 195, - 185, 1, 159, 249, 67, 195, 185, 1, 249, 153, 249, 67, 195, 185, 1, 193, - 249, 249, 67, 195, 185, 1, 192, 74, 249, 67, 195, 185, 1, 168, 249, 67, - 195, 185, 1, 193, 177, 249, 67, 195, 185, 1, 65, 249, 67, 195, 185, 1, - 74, 249, 67, 195, 185, 1, 211, 87, 249, 67, 195, 185, 1, 66, 249, 67, - 195, 185, 1, 234, 188, 249, 67, 195, 185, 1, 71, 249, 67, 195, 185, 1, - 68, 249, 67, 195, 185, 33, 137, 198, 79, 249, 67, 195, 185, 33, 130, 198, - 79, 249, 67, 195, 185, 33, 216, 87, 198, 79, 249, 67, 195, 185, 33, 218, - 238, 198, 79, 249, 67, 195, 185, 33, 229, 133, 198, 79, 249, 67, 195, - 185, 232, 80, 201, 63, 145, 90, 18, 222, 12, 145, 90, 18, 222, 8, 145, - 90, 18, 221, 155, 145, 90, 18, 221, 118, 145, 90, 18, 222, 41, 145, 90, - 18, 222, 38, 145, 90, 18, 220, 216, 145, 90, 18, 220, 185, 145, 90, 18, - 222, 14, 145, 90, 18, 221, 225, 145, 90, 18, 222, 101, 145, 90, 18, 222, - 98, 145, 90, 18, 221, 40, 145, 90, 18, 221, 37, 145, 90, 18, 222, 34, - 145, 90, 18, 222, 31, 145, 90, 18, 220, 218, 145, 90, 18, 220, 217, 145, - 90, 18, 221, 60, 145, 90, 18, 221, 25, 145, 90, 18, 221, 157, 145, 90, - 18, 221, 156, 145, 90, 18, 222, 117, 145, 90, 18, 222, 37, 145, 90, 18, - 220, 175, 145, 90, 18, 220, 166, 145, 90, 18, 222, 126, 145, 90, 18, 222, - 118, 145, 90, 120, 195, 160, 145, 90, 120, 212, 185, 145, 90, 120, 220, - 0, 145, 90, 120, 230, 2, 145, 90, 120, 213, 82, 145, 90, 120, 207, 125, - 145, 90, 120, 213, 109, 145, 90, 120, 208, 69, 145, 90, 120, 192, 91, - 145, 90, 120, 229, 108, 145, 90, 120, 217, 25, 145, 90, 120, 243, 131, - 145, 90, 120, 214, 165, 145, 90, 120, 229, 44, 145, 90, 120, 209, 91, - 145, 90, 120, 212, 191, 145, 90, 120, 214, 205, 145, 90, 120, 250, 163, - 145, 90, 120, 192, 216, 145, 90, 120, 247, 76, 145, 90, 87, 243, 17, 197, - 85, 145, 90, 87, 243, 17, 202, 46, 145, 90, 87, 243, 17, 221, 243, 145, - 90, 87, 243, 17, 221, 198, 145, 90, 87, 243, 17, 200, 246, 145, 90, 87, - 243, 17, 229, 2, 145, 90, 87, 243, 17, 199, 165, 145, 90, 3, 195, 5, 198, - 238, 145, 90, 3, 195, 5, 197, 156, 247, 33, 145, 90, 3, 243, 17, 243, - 120, 145, 90, 3, 195, 5, 199, 10, 145, 90, 3, 195, 5, 233, 49, 145, 90, - 3, 192, 171, 212, 179, 145, 90, 3, 192, 171, 207, 3, 145, 90, 3, 192, - 171, 198, 32, 145, 90, 3, 192, 171, 233, 90, 145, 90, 3, 195, 5, 205, 44, - 145, 90, 3, 216, 209, 200, 250, 145, 90, 3, 195, 5, 212, 231, 145, 90, 3, - 228, 31, 192, 111, 145, 90, 3, 192, 215, 145, 90, 3, 243, 17, 197, 143, - 206, 144, 145, 90, 17, 191, 77, 145, 90, 17, 107, 145, 90, 17, 109, 145, - 90, 17, 138, 145, 90, 17, 134, 145, 90, 17, 149, 145, 90, 17, 169, 145, - 90, 17, 175, 145, 90, 17, 171, 145, 90, 17, 178, 145, 90, 31, 199, 90, - 145, 90, 31, 228, 138, 145, 90, 31, 199, 96, 198, 228, 145, 90, 31, 216, - 47, 145, 90, 31, 228, 141, 216, 47, 145, 90, 31, 199, 96, 248, 169, 145, - 90, 31, 197, 227, 145, 90, 3, 195, 5, 218, 220, 145, 90, 3, 192, 168, - 145, 90, 3, 229, 103, 145, 90, 3, 198, 255, 229, 103, 145, 90, 3, 190, - 236, 199, 43, 145, 90, 3, 229, 28, 145, 90, 3, 212, 245, 145, 90, 3, 192, - 206, 145, 90, 3, 212, 183, 145, 90, 3, 250, 146, 145, 90, 3, 197, 7, 247, - 32, 145, 90, 3, 216, 209, 197, 159, 145, 90, 3, 199, 166, 145, 90, 3, - 218, 253, 145, 90, 3, 215, 103, 145, 90, 3, 243, 17, 230, 76, 218, 196, - 212, 189, 212, 188, 145, 90, 3, 243, 17, 238, 194, 197, 150, 145, 90, 3, - 243, 17, 197, 5, 145, 90, 3, 243, 17, 197, 6, 243, 36, 145, 90, 3, 243, - 17, 208, 159, 237, 206, 145, 90, 3, 243, 17, 212, 238, 198, 41, 145, 90, - 242, 244, 3, 197, 154, 145, 90, 242, 244, 3, 192, 76, 145, 90, 242, 244, - 3, 219, 90, 145, 90, 242, 244, 3, 219, 254, 145, 90, 242, 244, 3, 192, - 167, 145, 90, 242, 244, 3, 221, 41, 145, 90, 242, 244, 3, 229, 254, 145, - 90, 242, 244, 3, 215, 147, 145, 90, 242, 244, 3, 198, 239, 145, 90, 242, - 244, 3, 197, 165, 145, 90, 242, 244, 3, 209, 225, 145, 90, 242, 244, 3, - 221, 213, 145, 90, 242, 244, 3, 230, 64, 145, 90, 242, 244, 3, 195, 182, - 145, 90, 242, 244, 3, 233, 86, 145, 90, 242, 244, 3, 192, 118, 145, 90, - 242, 244, 3, 197, 137, 145, 90, 242, 244, 3, 220, 170, 145, 90, 242, 244, - 3, 193, 237, 216, 218, 6, 1, 218, 168, 216, 218, 6, 1, 206, 8, 216, 218, - 6, 1, 196, 12, 216, 218, 6, 1, 193, 224, 216, 218, 6, 1, 250, 176, 216, - 218, 6, 1, 191, 166, 216, 218, 6, 1, 221, 22, 216, 218, 6, 1, 210, 236, - 216, 218, 6, 1, 200, 43, 216, 218, 6, 1, 232, 51, 216, 218, 6, 1, 233, - 175, 216, 218, 6, 1, 68, 216, 218, 6, 1, 222, 152, 216, 218, 6, 1, 65, - 216, 218, 6, 1, 223, 35, 216, 218, 6, 1, 71, 216, 218, 6, 1, 250, 120, - 216, 218, 6, 1, 247, 193, 216, 218, 6, 1, 66, 216, 218, 6, 1, 191, 225, - 216, 218, 6, 1, 172, 216, 218, 6, 1, 208, 104, 216, 218, 6, 1, 228, 169, - 216, 218, 6, 1, 212, 103, 216, 218, 6, 1, 192, 235, 216, 218, 6, 1, 238, - 127, 216, 218, 6, 1, 211, 151, 216, 218, 6, 1, 215, 61, 216, 218, 6, 1, - 146, 216, 218, 6, 1, 74, 216, 218, 6, 1, 251, 236, 216, 218, 6, 1, 192, - 159, 216, 218, 2, 1, 218, 168, 216, 218, 2, 1, 206, 8, 216, 218, 2, 1, - 196, 12, 216, 218, 2, 1, 193, 224, 216, 218, 2, 1, 250, 176, 216, 218, 2, - 1, 191, 166, 216, 218, 2, 1, 221, 22, 216, 218, 2, 1, 210, 236, 216, 218, - 2, 1, 200, 43, 216, 218, 2, 1, 232, 51, 216, 218, 2, 1, 233, 175, 216, - 218, 2, 1, 68, 216, 218, 2, 1, 222, 152, 216, 218, 2, 1, 65, 216, 218, 2, - 1, 223, 35, 216, 218, 2, 1, 71, 216, 218, 2, 1, 250, 120, 216, 218, 2, 1, - 247, 193, 216, 218, 2, 1, 66, 216, 218, 2, 1, 191, 225, 216, 218, 2, 1, - 172, 216, 218, 2, 1, 208, 104, 216, 218, 2, 1, 228, 169, 216, 218, 2, 1, - 212, 103, 216, 218, 2, 1, 192, 235, 216, 218, 2, 1, 238, 127, 216, 218, - 2, 1, 211, 151, 216, 218, 2, 1, 215, 61, 216, 218, 2, 1, 146, 216, 218, - 2, 1, 74, 216, 218, 2, 1, 251, 236, 216, 218, 2, 1, 192, 159, 216, 218, - 17, 191, 77, 216, 218, 17, 107, 216, 218, 17, 109, 216, 218, 17, 138, - 216, 218, 17, 134, 216, 218, 17, 149, 216, 218, 17, 169, 216, 218, 17, - 175, 216, 218, 17, 171, 216, 218, 17, 178, 216, 218, 31, 199, 95, 216, - 218, 31, 234, 127, 216, 218, 31, 197, 37, 216, 218, 31, 198, 251, 216, - 218, 31, 232, 122, 216, 218, 31, 233, 19, 216, 218, 31, 202, 130, 216, - 218, 31, 203, 244, 216, 218, 31, 234, 161, 216, 218, 31, 213, 171, 216, - 218, 17, 91, 251, 157, 20, 216, 218, 17, 105, 251, 157, 20, 216, 218, 17, - 115, 251, 157, 20, 216, 218, 242, 74, 216, 218, 232, 80, 201, 63, 216, - 218, 16, 251, 221, 216, 218, 233, 216, 211, 136, 121, 1, 168, 121, 1, - 249, 153, 121, 1, 11, 168, 121, 1, 209, 110, 121, 1, 174, 121, 1, 216, - 103, 121, 1, 251, 14, 174, 121, 1, 233, 109, 121, 1, 195, 188, 121, 1, - 195, 71, 121, 1, 190, 190, 121, 1, 238, 32, 121, 1, 11, 197, 132, 121, 1, - 11, 190, 190, 121, 1, 197, 132, 121, 1, 237, 191, 121, 1, 180, 121, 1, - 213, 224, 121, 1, 11, 213, 79, 121, 1, 251, 14, 180, 121, 1, 213, 79, - 121, 1, 213, 65, 121, 1, 173, 121, 1, 218, 182, 121, 1, 219, 159, 121, 1, - 219, 148, 121, 1, 198, 112, 121, 1, 236, 183, 121, 1, 198, 104, 121, 1, - 236, 182, 121, 1, 155, 121, 1, 231, 240, 121, 1, 11, 155, 121, 1, 208, - 96, 121, 1, 208, 72, 121, 1, 214, 68, 121, 1, 214, 17, 121, 1, 251, 14, - 214, 68, 121, 1, 140, 121, 1, 192, 220, 121, 1, 231, 91, 121, 1, 231, 66, - 121, 1, 197, 142, 121, 1, 235, 18, 121, 1, 212, 101, 121, 1, 212, 83, - 121, 1, 197, 157, 121, 1, 235, 29, 121, 1, 11, 197, 157, 121, 1, 11, 235, - 29, 121, 1, 207, 82, 197, 157, 121, 1, 203, 165, 121, 1, 201, 175, 121, - 1, 191, 71, 121, 1, 190, 253, 121, 1, 197, 168, 121, 1, 235, 35, 121, 1, - 11, 197, 168, 121, 1, 188, 121, 1, 191, 123, 121, 1, 190, 254, 121, 1, - 190, 224, 121, 1, 190, 204, 121, 1, 251, 14, 190, 224, 121, 1, 190, 196, - 121, 1, 190, 203, 121, 1, 193, 190, 121, 1, 251, 245, 121, 1, 229, 177, - 121, 1, 248, 32, 121, 1, 200, 125, 121, 1, 235, 19, 121, 1, 199, 145, - 121, 1, 197, 161, 121, 1, 206, 71, 121, 3, 120, 52, 164, 121, 1, 214, - 212, 121, 3, 250, 199, 121, 3, 207, 82, 195, 18, 121, 3, 207, 82, 250, - 199, 121, 18, 3, 65, 121, 18, 3, 252, 206, 121, 18, 3, 251, 241, 121, 18, - 3, 251, 132, 121, 18, 3, 251, 122, 121, 18, 3, 74, 121, 18, 3, 211, 87, - 121, 18, 3, 193, 48, 121, 18, 3, 193, 224, 121, 18, 3, 71, 121, 18, 3, - 234, 103, 121, 18, 3, 234, 88, 121, 18, 3, 211, 147, 121, 18, 3, 68, 121, - 18, 3, 228, 35, 121, 18, 3, 228, 34, 121, 18, 3, 228, 33, 121, 18, 3, - 223, 88, 121, 18, 3, 223, 226, 121, 18, 3, 223, 199, 121, 18, 3, 223, 49, - 121, 18, 3, 223, 136, 121, 18, 3, 66, 121, 18, 3, 196, 168, 121, 18, 3, - 196, 167, 121, 18, 3, 196, 166, 121, 18, 3, 196, 30, 121, 18, 3, 196, - 148, 121, 18, 3, 196, 97, 121, 18, 3, 192, 159, 121, 18, 3, 192, 33, 121, - 18, 3, 252, 25, 121, 18, 3, 252, 21, 121, 18, 3, 234, 26, 121, 18, 3, - 206, 113, 234, 26, 121, 18, 3, 234, 34, 121, 18, 3, 206, 113, 234, 34, - 121, 18, 3, 251, 236, 121, 18, 3, 234, 166, 121, 18, 3, 250, 163, 121, - 18, 3, 211, 19, 121, 18, 3, 215, 61, 121, 18, 3, 214, 70, 121, 18, 3, - 196, 81, 121, 18, 3, 191, 205, 121, 18, 3, 211, 141, 121, 18, 3, 211, - 148, 121, 18, 3, 193, 239, 121, 18, 3, 223, 204, 121, 18, 3, 234, 217, - 121, 18, 3, 223, 86, 121, 18, 3, 196, 139, 121, 163, 183, 121, 163, 198, - 54, 183, 121, 163, 58, 121, 163, 60, 121, 1, 198, 77, 121, 1, 198, 76, - 121, 1, 198, 75, 121, 1, 198, 74, 121, 1, 198, 73, 121, 1, 198, 72, 121, - 1, 198, 71, 121, 1, 207, 82, 198, 78, 121, 1, 207, 82, 198, 77, 121, 1, - 207, 82, 198, 75, 121, 1, 207, 82, 198, 74, 121, 1, 207, 82, 198, 73, - 121, 1, 207, 82, 198, 71, 19, 223, 51, 77, 46, 223, 51, 77, 39, 243, 80, - 228, 251, 77, 39, 243, 80, 223, 51, 77, 41, 2, 27, 233, 3, 195, 57, 251, - 157, 207, 107, 87, 247, 160, 195, 57, 251, 157, 207, 107, 87, 213, 223, - 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, 19, 241, 160, 19, 241, 159, 19, 241, 158, 19, 241, 157, 19, - 241, 156, 19, 241, 155, 19, 241, 154, 19, 241, 153, 19, 241, 152, 19, - 241, 151, 19, 241, 150, 19, 241, 149, 19, 241, 148, 19, 241, 147, 19, - 241, 146, 19, 241, 145, 19, 241, 144, 19, 241, 143, 19, 241, 142, 19, - 241, 141, 19, 241, 140, 19, 241, 139, 19, 241, 138, 19, 241, 137, 19, - 241, 136, 19, 241, 135, 19, 241, 134, 19, 241, 133, 19, 241, 132, 19, - 241, 131, 19, 241, 130, 19, 241, 129, 19, 241, 128, 19, 241, 127, 19, - 241, 126, 19, 241, 125, 19, 241, 124, 19, 241, 123, 19, 241, 122, 19, - 241, 121, 19, 241, 120, 19, 241, 119, 19, 241, 118, 19, 241, 117, 19, - 241, 116, 19, 241, 115, 19, 241, 114, 19, 241, 113, 19, 241, 112, 19, - 241, 111, 19, 241, 110, 19, 241, 109, 19, 241, 108, 19, 241, 107, 19, - 241, 106, 19, 241, 105, 19, 241, 104, 19, 241, 103, 19, 241, 102, 19, - 241, 101, 19, 241, 100, 19, 241, 99, 19, 241, 98, 19, 241, 97, 19, 241, - 96, 19, 241, 95, 19, 241, 94, 19, 241, 93, 19, 241, 92, 19, 241, 91, 19, - 241, 90, 19, 241, 89, 19, 241, 88, 19, 241, 87, 19, 241, 86, 19, 241, 85, - 19, 241, 84, 19, 241, 83, 19, 241, 82, 19, 241, 81, 19, 241, 80, 19, 241, - 79, 19, 241, 78, 19, 241, 77, 19, 241, 76, 19, 241, 75, 19, 241, 74, 19, - 241, 73, 19, 241, 72, 19, 241, 71, 19, 241, 70, 19, 241, 69, 19, 241, 68, - 19, 241, 67, 19, 241, 66, 19, 241, 65, 19, 241, 64, 19, 241, 63, 19, 241, - 62, 19, 241, 61, 19, 241, 60, 19, 241, 59, 19, 241, 58, 19, 241, 57, 19, - 241, 56, 19, 241, 55, 19, 241, 54, 19, 241, 53, 19, 241, 52, 19, 241, 51, - 19, 241, 50, 19, 241, 49, 19, 241, 48, 19, 241, 47, 19, 241, 46, 19, 241, - 45, 19, 241, 44, 19, 241, 43, 19, 241, 42, 19, 241, 41, 19, 241, 40, 19, - 241, 39, 19, 241, 38, 19, 241, 37, 19, 241, 36, 19, 241, 35, 19, 241, 34, - 19, 241, 33, 19, 241, 32, 19, 241, 31, 19, 241, 30, 19, 241, 29, 19, 241, - 28, 19, 241, 27, 19, 241, 26, 19, 241, 25, 19, 241, 24, 19, 241, 23, 19, - 241, 22, 19, 241, 21, 19, 241, 20, 19, 241, 19, 19, 241, 18, 19, 241, 17, - 19, 241, 16, 19, 241, 15, 19, 241, 14, 19, 241, 13, 19, 241, 12, 19, 241, - 11, 19, 241, 10, 19, 241, 9, 19, 241, 8, 19, 241, 7, 19, 241, 6, 19, 241, - 5, 19, 241, 4, 19, 241, 3, 19, 241, 2, 19, 241, 1, 19, 241, 0, 19, 240, - 255, 19, 240, 254, 19, 240, 253, 19, 240, 252, 19, 240, 251, 19, 240, - 250, 19, 240, 249, 19, 240, 248, 19, 240, 247, 19, 240, 246, 19, 240, - 245, 19, 240, 244, 19, 240, 243, 19, 240, 242, 19, 240, 241, 19, 240, - 240, 19, 240, 239, 19, 240, 238, 19, 240, 237, 19, 240, 236, 19, 240, - 235, 19, 240, 234, 19, 240, 233, 19, 240, 232, 19, 240, 231, 19, 240, - 230, 19, 240, 229, 19, 240, 228, 19, 240, 227, 19, 240, 226, 19, 240, - 225, 19, 240, 224, 19, 240, 223, 19, 240, 222, 19, 240, 221, 19, 240, - 220, 19, 240, 219, 19, 240, 218, 19, 240, 217, 19, 240, 216, 19, 240, - 215, 19, 240, 214, 19, 240, 213, 19, 240, 212, 19, 240, 211, 19, 240, - 210, 19, 240, 209, 19, 240, 208, 19, 240, 207, 19, 240, 206, 19, 240, - 205, 19, 240, 204, 19, 240, 203, 19, 240, 202, 19, 240, 201, 19, 240, - 200, 19, 240, 199, 19, 240, 198, 19, 240, 197, 19, 240, 196, 19, 240, - 195, 19, 240, 194, 19, 240, 193, 19, 240, 192, 19, 240, 191, 19, 240, - 190, 19, 240, 189, 19, 240, 188, 19, 240, 187, 19, 240, 186, 19, 240, - 185, 19, 240, 184, 19, 240, 183, 19, 240, 182, 19, 240, 181, 19, 240, - 180, 19, 240, 179, 19, 240, 178, 19, 240, 177, 19, 240, 176, 19, 240, - 175, 19, 240, 174, 19, 240, 173, 19, 240, 172, 19, 240, 171, 19, 240, - 170, 19, 240, 169, 19, 240, 168, 19, 240, 167, 19, 240, 166, 19, 240, - 165, 19, 240, 164, 19, 240, 163, 19, 240, 162, 19, 240, 161, 19, 240, - 160, 19, 240, 159, 19, 240, 158, 19, 240, 157, 19, 240, 156, 19, 240, - 155, 19, 240, 154, 19, 240, 153, 19, 240, 152, 19, 240, 151, 19, 240, - 150, 19, 240, 149, 19, 240, 148, 19, 240, 147, 19, 240, 146, 19, 240, - 145, 19, 240, 144, 19, 240, 143, 19, 240, 142, 19, 240, 141, 19, 240, - 140, 19, 240, 139, 19, 240, 138, 19, 240, 137, 19, 240, 136, 19, 240, - 135, 19, 240, 134, 19, 240, 133, 19, 240, 132, 19, 240, 131, 19, 240, - 130, 19, 240, 129, 19, 240, 128, 19, 240, 127, 19, 240, 126, 19, 240, - 125, 19, 240, 124, 19, 240, 123, 19, 240, 122, 19, 240, 121, 19, 240, - 120, 19, 240, 119, 19, 240, 118, 19, 240, 117, 19, 240, 116, 19, 240, - 115, 19, 240, 114, 19, 240, 113, 19, 240, 112, 19, 240, 111, 19, 240, - 110, 19, 240, 109, 19, 240, 108, 19, 240, 107, 19, 240, 106, 19, 240, - 105, 19, 240, 104, 19, 240, 103, 19, 240, 102, 19, 240, 101, 19, 240, - 100, 19, 240, 99, 19, 240, 98, 19, 240, 97, 19, 240, 96, 19, 240, 95, 19, - 240, 94, 19, 240, 93, 19, 240, 92, 19, 240, 91, 19, 240, 90, 19, 240, 89, - 19, 240, 88, 19, 240, 87, 19, 240, 86, 19, 240, 85, 19, 240, 84, 19, 240, - 83, 19, 240, 82, 19, 240, 81, 19, 240, 80, 19, 240, 79, 19, 240, 78, 19, - 240, 77, 19, 240, 76, 19, 240, 75, 19, 240, 74, 19, 240, 73, 19, 240, 72, - 19, 240, 71, 19, 240, 70, 19, 240, 69, 19, 240, 68, 19, 240, 67, 19, 240, - 66, 19, 240, 65, 19, 240, 64, 19, 240, 63, 19, 240, 62, 19, 240, 61, 19, - 240, 60, 19, 240, 59, 19, 240, 58, 19, 240, 57, 19, 240, 56, 19, 240, 55, - 19, 240, 54, 19, 240, 53, 19, 240, 52, 19, 240, 51, 19, 240, 50, 19, 240, - 49, 19, 240, 48, 19, 240, 47, 19, 240, 46, 19, 240, 45, 19, 240, 44, 19, - 240, 43, 19, 240, 42, 19, 240, 41, 19, 240, 40, 19, 240, 39, 19, 240, 38, - 19, 240, 37, 19, 240, 36, 19, 240, 35, 19, 240, 34, 19, 240, 33, 19, 240, - 32, 19, 240, 31, 19, 240, 30, 19, 240, 29, 19, 240, 28, 19, 240, 27, 19, - 240, 26, 19, 240, 25, 19, 240, 24, 19, 240, 23, 19, 240, 22, 19, 240, 21, - 19, 240, 20, 19, 240, 19, 19, 240, 18, 19, 240, 17, 19, 240, 16, 19, 240, - 15, 19, 240, 14, 19, 240, 13, 19, 240, 12, 19, 240, 11, 19, 240, 10, 19, - 240, 9, 19, 240, 8, 19, 240, 7, 19, 240, 6, 19, 240, 5, 19, 240, 4, 19, - 240, 3, 19, 240, 2, 19, 240, 1, 19, 240, 0, 19, 239, 255, 19, 239, 254, - 19, 239, 253, 19, 239, 252, 19, 239, 251, 19, 239, 250, 19, 239, 249, 19, - 239, 248, 19, 239, 247, 19, 239, 246, 19, 239, 245, 19, 239, 244, 19, - 239, 243, 19, 239, 242, 19, 239, 241, 19, 239, 240, 19, 239, 239, 19, - 239, 238, 19, 239, 237, 19, 239, 236, 19, 239, 235, 19, 239, 234, 19, - 239, 233, 19, 239, 232, 19, 239, 231, 19, 239, 230, 19, 239, 229, 19, - 239, 228, 19, 239, 227, 19, 239, 226, 19, 239, 225, 19, 239, 224, 19, - 239, 223, 19, 239, 222, 19, 239, 221, 19, 239, 220, 19, 239, 219, 19, - 239, 218, 19, 239, 217, 19, 239, 216, 19, 239, 215, 19, 239, 214, 19, - 239, 213, 19, 239, 212, 19, 239, 211, 19, 239, 210, 19, 239, 209, 19, - 239, 208, 19, 239, 207, 19, 239, 206, 19, 239, 205, 19, 239, 204, 19, - 239, 203, 19, 239, 202, 19, 239, 201, 19, 239, 200, 19, 239, 199, 19, - 239, 198, 19, 239, 197, 19, 239, 196, 19, 239, 195, 19, 239, 194, 19, - 239, 193, 19, 239, 192, 19, 239, 191, 19, 239, 190, 19, 239, 189, 19, - 239, 188, 19, 239, 187, 19, 239, 186, 19, 239, 185, 19, 239, 184, 19, - 239, 183, 19, 239, 182, 19, 239, 181, 19, 239, 180, 19, 239, 179, 19, - 239, 178, 19, 239, 177, 19, 239, 176, 19, 239, 175, 19, 239, 174, 19, - 239, 173, 19, 239, 172, 19, 239, 171, 19, 239, 170, 19, 239, 169, 19, - 239, 168, 19, 239, 167, 19, 239, 166, 19, 239, 165, 19, 239, 164, 19, - 239, 163, 19, 239, 162, 19, 239, 161, 19, 239, 160, 19, 239, 159, 19, - 239, 158, 19, 239, 157, 19, 239, 156, 19, 239, 155, 19, 239, 154, 19, - 239, 153, 19, 239, 152, 19, 239, 151, 19, 239, 150, 19, 239, 149, 19, - 239, 148, 19, 239, 147, 19, 239, 146, 19, 239, 145, 19, 239, 144, 19, - 239, 143, 19, 239, 142, 19, 239, 141, 19, 239, 140, 19, 239, 139, 19, - 239, 138, 19, 239, 137, 19, 239, 136, 19, 239, 135, 19, 239, 134, 19, - 239, 133, 19, 239, 132, 19, 239, 131, 19, 239, 130, 19, 239, 129, 19, - 239, 128, 19, 239, 127, 19, 239, 126, 19, 239, 125, 19, 239, 124, 19, - 239, 123, 19, 239, 122, 19, 239, 121, 19, 239, 120, 19, 239, 119, 19, - 239, 118, 19, 239, 117, 19, 239, 116, 19, 239, 115, 19, 239, 114, 19, - 239, 113, 19, 239, 112, 19, 239, 111, 19, 239, 110, 19, 239, 109, 19, - 239, 108, 19, 239, 107, 19, 239, 106, 19, 239, 105, 19, 239, 104, 19, - 239, 103, 19, 239, 102, 19, 239, 101, 19, 239, 100, 19, 239, 99, 19, 239, - 98, 19, 239, 97, 19, 239, 96, 19, 239, 95, 19, 239, 94, 19, 239, 93, 19, - 239, 92, 19, 239, 91, 19, 239, 90, 19, 239, 89, 19, 239, 88, 19, 239, 87, - 19, 239, 86, 19, 239, 85, 19, 239, 84, 19, 239, 83, 19, 239, 82, 19, 239, - 81, 19, 239, 80, 19, 239, 79, 19, 239, 78, 19, 239, 77, 19, 239, 76, 19, - 239, 75, 19, 239, 74, 19, 239, 73, 19, 239, 72, 19, 239, 71, 19, 239, 70, - 19, 239, 69, 19, 239, 68, 19, 239, 67, 19, 239, 66, 19, 239, 65, 19, 239, - 64, 41, 2, 27, 246, 238, 41, 2, 27, 246, 237, 41, 2, 27, 246, 236, 41, 2, - 27, 246, 235, 41, 2, 27, 246, 234, 41, 2, 27, 246, 233, 41, 2, 27, 246, - 232, 41, 2, 27, 246, 231, 41, 2, 27, 246, 230, 41, 2, 27, 246, 229, 41, - 2, 27, 246, 228, 41, 2, 27, 246, 227, 41, 2, 27, 246, 226, 41, 2, 27, + 191, 126, 14, 7, 191, 125, 14, 7, 252, 207, 14, 7, 252, 206, 14, 7, 252, + 205, 14, 7, 252, 204, 14, 7, 252, 203, 14, 7, 252, 202, 14, 7, 252, 201, + 14, 7, 252, 200, 14, 7, 252, 199, 14, 7, 252, 198, 14, 7, 252, 197, 14, + 7, 252, 196, 14, 7, 252, 195, 14, 7, 252, 194, 14, 7, 252, 193, 14, 7, + 252, 192, 14, 7, 252, 191, 14, 7, 252, 190, 14, 7, 252, 189, 14, 7, 252, + 188, 14, 7, 252, 187, 14, 7, 252, 186, 14, 7, 252, 185, 14, 7, 252, 184, + 14, 7, 252, 183, 14, 7, 252, 182, 14, 7, 252, 181, 14, 7, 252, 180, 14, + 7, 252, 179, 14, 7, 252, 178, 14, 7, 252, 177, 14, 7, 252, 176, 14, 7, + 252, 175, 14, 7, 252, 174, 14, 7, 195, 241, 14, 7, 81, 222, 198, 14, 7, + 228, 243, 222, 198, 14, 7, 223, 122, 250, 185, 198, 54, 201, 98, 14, 7, + 223, 122, 250, 185, 248, 79, 201, 98, 14, 7, 223, 122, 250, 185, 198, 54, + 234, 96, 14, 7, 223, 122, 250, 185, 248, 79, 234, 96, 14, 7, 211, 2, 216, + 86, 14, 7, 248, 251, 205, 44, 14, 7, 234, 97, 205, 44, 14, 7, 223, 122, + 250, 185, 216, 86, 14, 7, 223, 122, 250, 185, 198, 53, 14, 7, 223, 122, + 250, 185, 248, 78, 14, 7, 248, 251, 234, 100, 14, 7, 234, 97, 234, 100, + 14, 7, 248, 251, 193, 166, 234, 100, 14, 7, 234, 97, 193, 166, 234, 100, + 14, 7, 216, 29, 228, 191, 14, 7, 232, 82, 248, 134, 14, 7, 132, 248, 134, + 14, 7, 218, 253, 56, 14, 7, 132, 218, 253, 56, 14, 7, 199, 200, 218, 253, + 56, 14, 7, 193, 78, 218, 253, 56, 14, 7, 52, 237, 251, 250, 185, 198, 54, + 201, 98, 14, 7, 52, 237, 251, 250, 185, 248, 79, 201, 98, 14, 7, 52, 237, + 251, 250, 185, 201, 98, 14, 7, 52, 237, 251, 250, 185, 198, 54, 234, 96, + 14, 7, 52, 237, 251, 250, 185, 198, 53, 14, 7, 52, 237, 251, 250, 185, + 248, 79, 201, 99, 23, 198, 54, 234, 96, 14, 7, 52, 237, 251, 250, 185, + 201, 99, 23, 198, 53, 14, 7, 52, 237, 251, 250, 185, 248, 79, 234, 96, + 14, 7, 52, 237, 251, 250, 185, 198, 54, 201, 99, 23, 248, 79, 234, 96, + 14, 7, 52, 237, 251, 250, 185, 248, 78, 14, 7, 52, 237, 251, 250, 185, + 201, 99, 23, 248, 78, 14, 7, 52, 237, 251, 250, 185, 234, 96, 14, 7, 52, + 237, 251, 250, 185, 198, 54, 23, 234, 96, 14, 7, 52, 237, 251, 250, 185, + 248, 79, 23, 234, 96, 14, 7, 52, 237, 250, 29, 7, 255, 201, 29, 7, 255, + 200, 29, 7, 255, 199, 29, 7, 255, 198, 29, 7, 255, 197, 29, 7, 255, 195, + 29, 7, 255, 192, 29, 7, 255, 191, 29, 7, 255, 190, 29, 7, 255, 189, 29, + 7, 255, 188, 29, 7, 255, 187, 29, 7, 255, 186, 29, 7, 255, 185, 29, 7, + 255, 184, 29, 7, 255, 182, 29, 7, 255, 181, 29, 7, 255, 180, 29, 7, 255, + 178, 29, 7, 255, 177, 29, 7, 255, 176, 29, 7, 255, 175, 29, 7, 255, 174, + 29, 7, 255, 173, 29, 7, 255, 172, 29, 7, 255, 171, 29, 7, 255, 170, 29, + 7, 255, 169, 29, 7, 255, 168, 29, 7, 255, 167, 29, 7, 255, 165, 29, 7, + 255, 164, 29, 7, 255, 163, 29, 7, 255, 162, 29, 7, 255, 160, 29, 7, 255, + 159, 29, 7, 255, 158, 29, 7, 255, 157, 29, 7, 255, 156, 29, 7, 255, 155, + 29, 7, 255, 154, 29, 7, 255, 153, 29, 7, 255, 152, 29, 7, 255, 150, 29, + 7, 255, 149, 29, 7, 255, 148, 29, 7, 255, 146, 29, 7, 255, 144, 29, 7, + 255, 143, 29, 7, 255, 142, 29, 7, 255, 141, 29, 7, 255, 140, 29, 7, 255, + 139, 29, 7, 255, 138, 29, 7, 255, 137, 29, 7, 255, 136, 29, 7, 255, 135, + 29, 7, 255, 134, 29, 7, 255, 133, 29, 7, 255, 132, 29, 7, 255, 131, 29, + 7, 255, 130, 29, 7, 255, 129, 29, 7, 255, 128, 29, 7, 255, 127, 29, 7, + 255, 126, 29, 7, 255, 125, 29, 7, 255, 124, 29, 7, 255, 123, 29, 7, 255, + 122, 29, 7, 255, 121, 29, 7, 255, 120, 29, 7, 255, 119, 29, 7, 255, 118, + 29, 7, 255, 117, 29, 7, 255, 116, 29, 7, 255, 115, 29, 7, 255, 114, 29, + 7, 255, 113, 29, 7, 255, 112, 29, 7, 255, 111, 29, 7, 255, 110, 29, 7, + 255, 109, 29, 7, 255, 108, 29, 7, 255, 107, 29, 7, 255, 106, 29, 7, 255, + 105, 29, 7, 255, 104, 29, 7, 255, 103, 29, 7, 255, 102, 29, 7, 255, 101, + 29, 7, 255, 100, 29, 7, 255, 99, 29, 7, 255, 98, 29, 7, 255, 97, 29, 7, + 255, 96, 29, 7, 255, 95, 29, 7, 255, 94, 29, 7, 255, 93, 29, 7, 255, 92, + 29, 7, 255, 91, 29, 7, 255, 90, 29, 7, 255, 89, 29, 7, 255, 88, 29, 7, + 255, 87, 29, 7, 255, 86, 29, 7, 255, 85, 29, 7, 255, 84, 29, 7, 255, 83, + 29, 7, 255, 82, 29, 7, 255, 81, 29, 7, 255, 80, 29, 7, 255, 78, 29, 7, + 255, 77, 29, 7, 255, 76, 29, 7, 255, 75, 29, 7, 255, 74, 29, 7, 255, 73, + 29, 7, 255, 72, 29, 7, 255, 71, 29, 7, 255, 70, 29, 7, 255, 69, 29, 7, + 255, 68, 29, 7, 255, 67, 29, 7, 255, 66, 29, 7, 255, 65, 29, 7, 255, 64, + 29, 7, 255, 63, 29, 7, 255, 62, 29, 7, 255, 61, 29, 7, 255, 60, 29, 7, + 255, 59, 29, 7, 255, 58, 29, 7, 255, 57, 29, 7, 255, 56, 29, 7, 255, 55, + 29, 7, 255, 54, 29, 7, 255, 53, 29, 7, 255, 52, 29, 7, 255, 51, 29, 7, + 255, 50, 29, 7, 255, 49, 29, 7, 255, 48, 29, 7, 255, 47, 29, 7, 255, 46, + 29, 7, 255, 45, 29, 7, 255, 43, 29, 7, 255, 42, 29, 7, 255, 41, 29, 7, + 255, 40, 29, 7, 255, 39, 29, 7, 255, 38, 29, 7, 255, 37, 29, 7, 255, 36, + 29, 7, 255, 35, 29, 7, 255, 34, 29, 7, 255, 33, 29, 7, 255, 32, 29, 7, + 255, 30, 29, 7, 255, 29, 29, 7, 255, 28, 29, 7, 255, 27, 29, 7, 255, 26, + 29, 7, 255, 25, 29, 7, 255, 24, 29, 7, 255, 23, 29, 7, 255, 22, 29, 7, + 255, 21, 29, 7, 255, 20, 29, 7, 255, 19, 29, 7, 255, 18, 29, 7, 255, 17, + 29, 7, 255, 16, 29, 7, 255, 15, 29, 7, 255, 14, 29, 7, 255, 13, 29, 7, + 255, 12, 29, 7, 255, 11, 29, 7, 255, 10, 29, 7, 255, 9, 29, 7, 255, 8, + 29, 7, 255, 7, 29, 7, 255, 6, 29, 7, 255, 5, 29, 7, 255, 4, 29, 7, 255, + 3, 29, 7, 255, 2, 29, 7, 255, 1, 29, 7, 255, 0, 29, 7, 254, 255, 29, 7, + 254, 254, 29, 7, 254, 253, 29, 7, 254, 252, 29, 7, 254, 251, 29, 7, 254, + 250, 29, 7, 254, 249, 29, 7, 254, 248, 29, 7, 254, 247, 29, 7, 254, 246, + 29, 7, 254, 245, 29, 7, 254, 244, 29, 7, 254, 243, 29, 7, 254, 242, 29, + 7, 254, 241, 29, 7, 254, 240, 29, 7, 254, 239, 29, 7, 254, 238, 29, 7, + 254, 237, 29, 7, 254, 236, 29, 7, 254, 235, 29, 7, 254, 234, 29, 7, 254, + 233, 29, 7, 254, 232, 29, 7, 254, 231, 29, 7, 254, 230, 29, 7, 254, 229, + 29, 7, 254, 228, 29, 7, 254, 227, 29, 7, 254, 226, 29, 7, 254, 225, 29, + 7, 254, 224, 29, 7, 254, 223, 29, 7, 254, 222, 29, 7, 254, 221, 29, 7, + 254, 220, 29, 7, 254, 219, 29, 7, 254, 218, 29, 7, 254, 216, 29, 7, 254, + 215, 29, 7, 254, 214, 29, 7, 254, 213, 29, 7, 254, 212, 29, 7, 254, 211, + 29, 7, 254, 210, 29, 7, 254, 209, 29, 7, 254, 208, 29, 7, 254, 207, 29, + 7, 254, 206, 29, 7, 254, 205, 29, 7, 254, 204, 29, 7, 254, 203, 29, 7, + 254, 202, 29, 7, 254, 201, 29, 7, 254, 200, 29, 7, 254, 199, 29, 7, 254, + 198, 29, 7, 254, 197, 29, 7, 254, 196, 29, 7, 254, 195, 29, 7, 254, 194, + 29, 7, 254, 193, 29, 7, 254, 192, 29, 7, 254, 191, 29, 7, 254, 190, 29, + 7, 254, 189, 29, 7, 254, 188, 29, 7, 254, 187, 29, 7, 254, 186, 29, 7, + 254, 185, 29, 7, 254, 184, 29, 7, 254, 183, 29, 7, 254, 182, 29, 7, 254, + 181, 29, 7, 254, 180, 29, 7, 254, 179, 29, 7, 254, 178, 29, 7, 254, 177, + 29, 7, 254, 176, 29, 7, 254, 175, 29, 7, 254, 174, 29, 7, 254, 173, 29, + 7, 254, 172, 29, 7, 254, 171, 29, 7, 254, 170, 29, 7, 254, 169, 29, 7, + 254, 168, 29, 7, 254, 167, 29, 7, 254, 166, 29, 7, 254, 165, 29, 7, 254, + 164, 29, 7, 254, 163, 29, 7, 254, 162, 29, 7, 254, 161, 29, 7, 254, 160, + 29, 7, 254, 159, 29, 7, 254, 158, 29, 7, 254, 157, 29, 7, 254, 156, 29, + 7, 254, 155, 29, 7, 254, 154, 29, 7, 254, 153, 29, 7, 254, 152, 29, 7, + 254, 151, 29, 7, 254, 150, 29, 7, 254, 149, 29, 7, 254, 148, 29, 7, 254, + 147, 29, 7, 254, 146, 29, 7, 254, 145, 29, 7, 254, 144, 29, 7, 254, 143, + 29, 7, 254, 142, 29, 7, 254, 141, 29, 7, 254, 140, 29, 7, 254, 139, 29, + 7, 254, 138, 29, 7, 254, 137, 29, 7, 254, 136, 29, 7, 254, 135, 29, 7, + 254, 134, 29, 7, 254, 133, 29, 7, 254, 132, 29, 7, 254, 131, 29, 7, 254, + 130, 29, 7, 254, 129, 29, 7, 254, 128, 29, 7, 254, 127, 29, 7, 254, 126, + 29, 7, 254, 125, 29, 7, 254, 124, 29, 7, 254, 123, 29, 7, 254, 122, 29, + 7, 254, 121, 29, 7, 254, 120, 29, 7, 254, 119, 29, 7, 254, 118, 29, 7, + 254, 117, 29, 7, 254, 116, 29, 7, 254, 115, 29, 7, 254, 114, 29, 7, 254, + 113, 29, 7, 254, 112, 29, 7, 254, 111, 29, 7, 254, 110, 29, 7, 254, 109, + 29, 7, 254, 108, 29, 7, 254, 107, 29, 7, 254, 106, 29, 7, 254, 104, 29, + 7, 254, 103, 29, 7, 254, 102, 29, 7, 254, 101, 29, 7, 254, 100, 29, 7, + 254, 99, 29, 7, 254, 98, 29, 7, 254, 97, 29, 7, 254, 96, 29, 7, 254, 95, + 29, 7, 254, 94, 29, 7, 254, 91, 29, 7, 254, 90, 29, 7, 254, 89, 29, 7, + 254, 88, 29, 7, 254, 84, 29, 7, 254, 83, 29, 7, 254, 82, 29, 7, 254, 81, + 29, 7, 254, 80, 29, 7, 254, 79, 29, 7, 254, 78, 29, 7, 254, 77, 29, 7, + 254, 76, 29, 7, 254, 75, 29, 7, 254, 74, 29, 7, 254, 73, 29, 7, 254, 72, + 29, 7, 254, 71, 29, 7, 254, 70, 29, 7, 254, 69, 29, 7, 254, 68, 29, 7, + 254, 67, 29, 7, 254, 66, 29, 7, 254, 64, 29, 7, 254, 63, 29, 7, 254, 62, + 29, 7, 254, 61, 29, 7, 254, 60, 29, 7, 254, 59, 29, 7, 254, 58, 29, 7, + 254, 57, 29, 7, 254, 56, 29, 7, 254, 55, 29, 7, 254, 54, 29, 7, 254, 53, + 29, 7, 254, 52, 29, 7, 254, 51, 29, 7, 254, 50, 29, 7, 254, 49, 29, 7, + 254, 48, 29, 7, 254, 47, 29, 7, 254, 46, 29, 7, 254, 45, 29, 7, 254, 44, + 29, 7, 254, 43, 29, 7, 254, 42, 29, 7, 254, 41, 29, 7, 254, 40, 29, 7, + 254, 39, 29, 7, 254, 38, 29, 7, 254, 37, 29, 7, 254, 36, 29, 7, 254, 35, + 29, 7, 254, 34, 29, 7, 254, 33, 29, 7, 254, 32, 29, 7, 254, 31, 29, 7, + 254, 30, 29, 7, 254, 29, 29, 7, 254, 28, 29, 7, 254, 27, 29, 7, 254, 26, + 29, 7, 254, 25, 29, 7, 254, 24, 29, 7, 254, 23, 29, 7, 254, 22, 29, 7, + 254, 21, 29, 7, 254, 20, 29, 7, 254, 19, 29, 7, 254, 18, 29, 7, 254, 17, + 29, 7, 254, 16, 29, 7, 254, 15, 29, 7, 254, 14, 29, 7, 254, 13, 29, 7, + 254, 12, 29, 7, 254, 11, 29, 7, 254, 10, 29, 7, 254, 9, 29, 7, 254, 8, + 29, 7, 254, 7, 29, 7, 254, 6, 29, 7, 254, 5, 29, 7, 254, 4, 29, 7, 254, + 3, 207, 188, 211, 59, 207, 2, 29, 7, 254, 2, 29, 7, 254, 1, 29, 7, 254, + 0, 29, 7, 253, 255, 29, 7, 253, 254, 29, 7, 253, 253, 29, 7, 253, 252, + 29, 7, 253, 251, 29, 7, 253, 250, 29, 7, 253, 249, 29, 7, 253, 248, 29, + 7, 253, 247, 171, 29, 7, 253, 246, 29, 7, 253, 245, 29, 7, 253, 244, 29, + 7, 253, 243, 29, 7, 253, 242, 29, 7, 253, 241, 29, 7, 253, 240, 29, 7, + 253, 238, 29, 7, 253, 236, 29, 7, 253, 234, 29, 7, 253, 232, 29, 7, 253, + 230, 29, 7, 253, 228, 29, 7, 253, 226, 29, 7, 253, 224, 29, 7, 253, 222, + 29, 7, 253, 220, 248, 251, 219, 30, 77, 29, 7, 253, 218, 234, 97, 219, + 30, 77, 29, 7, 253, 217, 29, 7, 253, 215, 29, 7, 253, 213, 29, 7, 253, + 211, 29, 7, 253, 209, 29, 7, 253, 207, 29, 7, 253, 205, 29, 7, 253, 203, + 29, 7, 253, 201, 29, 7, 253, 200, 29, 7, 253, 199, 29, 7, 253, 198, 29, + 7, 253, 197, 29, 7, 253, 196, 29, 7, 253, 195, 29, 7, 253, 194, 29, 7, + 253, 193, 29, 7, 253, 192, 29, 7, 253, 191, 29, 7, 253, 190, 29, 7, 253, + 189, 29, 7, 253, 188, 29, 7, 253, 187, 29, 7, 253, 186, 29, 7, 253, 185, + 29, 7, 253, 184, 29, 7, 253, 183, 29, 7, 253, 182, 29, 7, 253, 181, 29, + 7, 253, 180, 29, 7, 253, 179, 29, 7, 253, 178, 29, 7, 253, 177, 29, 7, + 253, 176, 29, 7, 253, 175, 29, 7, 253, 174, 29, 7, 253, 173, 29, 7, 253, + 172, 29, 7, 253, 171, 29, 7, 253, 170, 29, 7, 253, 169, 29, 7, 253, 168, + 29, 7, 253, 167, 29, 7, 253, 166, 29, 7, 253, 165, 29, 7, 253, 164, 29, + 7, 253, 163, 29, 7, 253, 162, 29, 7, 253, 161, 29, 7, 253, 160, 29, 7, + 253, 159, 29, 7, 253, 158, 29, 7, 253, 157, 29, 7, 253, 156, 29, 7, 253, + 155, 29, 7, 253, 154, 29, 7, 253, 153, 29, 7, 253, 152, 29, 7, 253, 151, + 29, 7, 253, 150, 29, 7, 253, 149, 29, 7, 253, 148, 29, 7, 253, 147, 29, + 7, 253, 146, 29, 7, 253, 145, 29, 7, 253, 144, 29, 7, 253, 143, 29, 7, + 253, 142, 29, 7, 253, 141, 29, 7, 253, 140, 29, 7, 253, 139, 29, 7, 253, + 138, 29, 7, 253, 137, 29, 7, 253, 136, 29, 7, 253, 135, 29, 7, 253, 134, + 29, 7, 253, 133, 29, 7, 253, 132, 29, 7, 253, 131, 29, 7, 253, 130, 29, + 7, 253, 129, 29, 7, 253, 128, 29, 7, 253, 127, 29, 7, 253, 126, 29, 7, + 253, 125, 29, 7, 253, 124, 29, 7, 253, 123, 29, 7, 253, 122, 29, 7, 253, + 121, 29, 7, 253, 120, 29, 7, 253, 119, 29, 7, 253, 118, 29, 7, 253, 117, + 29, 7, 253, 116, 29, 7, 253, 115, 29, 7, 253, 114, 29, 7, 253, 113, 29, + 7, 253, 112, 29, 7, 253, 111, 29, 7, 253, 110, 29, 7, 253, 109, 29, 7, + 253, 108, 29, 7, 253, 107, 29, 7, 253, 106, 29, 7, 253, 105, 29, 7, 253, + 104, 29, 7, 253, 103, 29, 7, 253, 102, 29, 7, 253, 101, 29, 7, 253, 100, + 29, 7, 253, 99, 29, 7, 253, 98, 29, 7, 253, 97, 29, 7, 253, 96, 29, 7, + 253, 95, 29, 7, 253, 94, 29, 7, 253, 93, 29, 7, 253, 92, 29, 7, 253, 91, + 26, 1, 209, 220, 214, 3, 216, 144, 26, 1, 209, 220, 231, 175, 232, 168, + 26, 1, 209, 220, 209, 42, 216, 145, 209, 129, 26, 1, 209, 220, 209, 42, + 216, 145, 209, 130, 26, 1, 209, 220, 214, 253, 216, 144, 26, 1, 209, 220, + 203, 1, 26, 1, 209, 220, 198, 124, 216, 144, 26, 1, 209, 220, 212, 49, + 216, 144, 26, 1, 209, 220, 203, 69, 210, 223, 213, 143, 26, 1, 209, 220, + 209, 42, 210, 223, 213, 144, 209, 129, 26, 1, 209, 220, 209, 42, 210, + 223, 213, 144, 209, 130, 26, 1, 209, 220, 217, 133, 26, 1, 209, 220, 197, + 95, 217, 134, 26, 1, 209, 220, 214, 64, 26, 1, 209, 220, 217, 130, 26, 1, + 209, 220, 217, 79, 26, 1, 209, 220, 215, 88, 26, 1, 209, 220, 203, 250, + 26, 1, 209, 220, 212, 189, 26, 1, 209, 220, 221, 236, 26, 1, 209, 220, + 213, 110, 26, 1, 209, 220, 200, 160, 26, 1, 209, 220, 214, 2, 26, 1, 209, + 220, 220, 17, 26, 1, 209, 220, 219, 179, 220, 190, 26, 1, 209, 220, 212, + 199, 216, 152, 26, 1, 209, 220, 217, 137, 26, 1, 209, 220, 210, 100, 26, + 1, 209, 220, 231, 74, 26, 1, 209, 220, 210, 172, 26, 1, 209, 220, 215, + 234, 214, 37, 26, 1, 209, 220, 212, 30, 216, 155, 26, 1, 209, 220, 126, + 191, 195, 214, 246, 26, 1, 209, 220, 231, 75, 26, 1, 209, 220, 212, 199, + 212, 200, 26, 1, 209, 220, 202, 140, 26, 1, 209, 220, 216, 137, 26, 1, + 209, 220, 216, 158, 26, 1, 209, 220, 215, 209, 26, 1, 209, 220, 222, 107, + 26, 1, 209, 220, 210, 223, 219, 227, 26, 1, 209, 220, 214, 165, 219, 227, + 26, 1, 209, 220, 209, 242, 26, 1, 209, 220, 217, 131, 26, 1, 209, 220, + 213, 187, 26, 1, 209, 220, 208, 146, 26, 1, 209, 220, 197, 87, 26, 1, + 209, 220, 218, 223, 26, 1, 209, 220, 202, 18, 26, 1, 209, 220, 199, 58, + 26, 1, 209, 220, 217, 128, 26, 1, 209, 220, 221, 243, 26, 1, 209, 220, + 214, 161, 26, 1, 209, 220, 220, 205, 26, 1, 209, 220, 215, 210, 26, 1, + 209, 220, 202, 253, 26, 1, 209, 220, 219, 22, 26, 1, 209, 220, 232, 241, + 26, 1, 209, 220, 206, 138, 26, 1, 209, 220, 221, 12, 26, 1, 209, 220, + 202, 14, 26, 1, 209, 220, 217, 74, 209, 175, 26, 1, 209, 220, 203, 62, + 26, 1, 209, 220, 212, 198, 26, 1, 209, 220, 203, 43, 212, 210, 191, 203, + 26, 1, 209, 220, 212, 71, 215, 230, 26, 1, 209, 220, 210, 218, 26, 1, + 209, 220, 213, 112, 26, 1, 209, 220, 196, 85, 26, 1, 209, 220, 214, 40, + 26, 1, 209, 220, 217, 127, 26, 1, 209, 220, 213, 155, 26, 1, 209, 220, + 217, 8, 26, 1, 209, 220, 212, 86, 26, 1, 209, 220, 199, 62, 26, 1, 209, + 220, 202, 9, 26, 1, 209, 220, 210, 219, 26, 1, 209, 220, 212, 214, 26, 1, + 209, 220, 217, 135, 26, 1, 209, 220, 212, 83, 26, 1, 209, 220, 222, 68, + 26, 1, 209, 220, 212, 217, 26, 1, 209, 220, 195, 148, 26, 1, 209, 220, + 218, 227, 26, 1, 209, 220, 214, 104, 26, 1, 209, 220, 214, 219, 26, 1, + 209, 220, 217, 7, 26, 1, 209, 219, 212, 212, 26, 1, 209, 219, 197, 95, + 217, 132, 26, 1, 209, 219, 202, 205, 26, 1, 209, 219, 203, 254, 197, 94, + 26, 1, 209, 219, 219, 25, 212, 195, 26, 1, 209, 219, 217, 14, 217, 136, + 26, 1, 209, 219, 221, 152, 26, 1, 209, 219, 192, 43, 26, 1, 209, 219, + 217, 9, 26, 1, 209, 219, 222, 92, 26, 1, 209, 219, 210, 46, 26, 1, 209, + 219, 192, 126, 219, 227, 26, 1, 209, 219, 220, 38, 212, 210, 212, 97, 26, + 1, 209, 219, 212, 192, 203, 88, 26, 1, 209, 219, 214, 132, 213, 158, 26, + 1, 209, 219, 231, 72, 26, 1, 209, 219, 209, 119, 26, 1, 209, 219, 197, + 95, 212, 208, 26, 1, 209, 219, 203, 93, 213, 153, 26, 1, 209, 219, 203, + 89, 26, 1, 209, 219, 216, 145, 199, 61, 26, 1, 209, 219, 216, 252, 217, + 10, 26, 1, 209, 219, 212, 84, 212, 195, 26, 1, 209, 219, 221, 232, 26, 1, + 209, 219, 231, 73, 26, 1, 209, 219, 221, 228, 26, 1, 209, 219, 220, 122, + 26, 1, 209, 219, 210, 103, 26, 1, 209, 219, 195, 77, 26, 1, 209, 219, + 214, 4, 215, 86, 26, 1, 209, 219, 214, 39, 216, 248, 26, 1, 209, 219, + 192, 254, 26, 1, 209, 219, 205, 176, 26, 1, 209, 219, 199, 240, 26, 1, + 209, 219, 216, 157, 26, 1, 209, 219, 214, 23, 26, 1, 209, 219, 214, 24, + 220, 14, 26, 1, 209, 219, 216, 147, 26, 1, 209, 219, 200, 214, 26, 1, + 209, 219, 217, 0, 26, 1, 209, 219, 215, 214, 26, 1, 209, 219, 212, 101, + 26, 1, 209, 219, 208, 150, 26, 1, 209, 219, 216, 156, 214, 41, 26, 1, + 209, 219, 233, 30, 26, 1, 209, 219, 216, 243, 26, 1, 209, 219, 233, 54, + 26, 1, 209, 219, 221, 240, 26, 1, 209, 219, 217, 162, 213, 147, 26, 1, + 209, 219, 217, 162, 213, 123, 26, 1, 209, 219, 219, 178, 26, 1, 209, 219, + 214, 47, 26, 1, 209, 219, 212, 219, 26, 1, 209, 219, 174, 26, 1, 209, + 219, 221, 135, 26, 1, 209, 219, 213, 248, 26, 1, 209, 218, 214, 3, 217, + 134, 26, 1, 209, 218, 212, 48, 26, 1, 209, 218, 191, 203, 26, 1, 209, + 218, 193, 160, 26, 1, 209, 218, 214, 40, 26, 1, 209, 218, 214, 153, 26, + 1, 209, 218, 214, 10, 26, 1, 209, 218, 231, 82, 26, 1, 209, 218, 217, 4, + 26, 1, 209, 218, 231, 182, 26, 1, 209, 218, 212, 73, 216, 23, 216, 159, + 26, 1, 209, 218, 212, 186, 216, 251, 26, 1, 209, 218, 217, 1, 26, 1, 209, + 218, 209, 125, 26, 1, 209, 218, 214, 138, 26, 1, 209, 218, 217, 12, 247, + 158, 26, 1, 209, 218, 221, 230, 26, 1, 209, 218, 231, 83, 26, 1, 209, + 218, 221, 237, 26, 1, 209, 218, 191, 226, 215, 119, 26, 1, 209, 218, 212, + 42, 26, 1, 209, 218, 216, 245, 26, 1, 209, 218, 212, 218, 26, 1, 209, + 218, 216, 251, 26, 1, 209, 218, 192, 44, 26, 1, 209, 218, 221, 20, 26, 1, + 209, 218, 222, 129, 26, 1, 209, 218, 203, 249, 26, 1, 209, 218, 214, 147, + 26, 1, 209, 218, 199, 238, 26, 1, 209, 218, 213, 127, 26, 1, 209, 218, + 198, 124, 191, 207, 26, 1, 209, 218, 200, 248, 26, 1, 209, 218, 214, 30, + 212, 97, 26, 1, 209, 218, 195, 76, 26, 1, 209, 218, 214, 222, 26, 1, 209, + 218, 217, 162, 221, 239, 26, 1, 209, 218, 212, 200, 26, 1, 209, 218, 214, + 25, 26, 1, 209, 218, 220, 18, 26, 1, 209, 218, 216, 253, 26, 1, 209, 218, + 216, 136, 26, 1, 209, 218, 212, 194, 26, 1, 209, 218, 199, 57, 26, 1, + 209, 218, 214, 27, 26, 1, 209, 218, 232, 86, 26, 1, 209, 218, 214, 152, + 26, 1, 209, 218, 212, 220, 26, 1, 209, 218, 212, 216, 26, 1, 209, 218, + 247, 242, 26, 1, 209, 218, 195, 78, 26, 1, 209, 218, 217, 2, 26, 1, 209, + 218, 206, 69, 26, 1, 209, 218, 213, 157, 26, 1, 209, 218, 220, 37, 26, 1, + 209, 218, 198, 121, 26, 1, 209, 218, 212, 202, 213, 248, 26, 1, 209, 218, + 213, 149, 26, 1, 209, 218, 221, 243, 26, 1, 209, 218, 214, 32, 26, 1, + 209, 218, 217, 127, 26, 1, 209, 218, 216, 246, 26, 1, 209, 218, 218, 227, + 26, 1, 209, 218, 220, 190, 26, 1, 209, 218, 213, 155, 26, 1, 209, 218, + 213, 248, 26, 1, 209, 218, 192, 244, 26, 1, 209, 218, 214, 28, 26, 1, + 209, 218, 212, 205, 26, 1, 209, 218, 212, 196, 26, 1, 209, 218, 220, 207, + 213, 112, 26, 1, 209, 218, 212, 203, 26, 1, 209, 218, 214, 160, 26, 1, + 209, 218, 217, 162, 212, 208, 26, 1, 209, 218, 192, 140, 26, 1, 209, 218, + 214, 159, 26, 1, 209, 218, 203, 0, 26, 1, 209, 218, 203, 252, 26, 1, 209, + 218, 216, 254, 26, 1, 209, 218, 217, 134, 26, 1, 209, 218, 217, 8, 26, 1, + 209, 218, 221, 231, 26, 1, 209, 218, 216, 255, 26, 1, 209, 218, 221, 235, + 26, 1, 209, 218, 217, 12, 209, 181, 26, 1, 209, 218, 191, 186, 26, 1, + 209, 218, 213, 145, 26, 1, 209, 218, 216, 82, 26, 1, 209, 218, 215, 151, + 26, 1, 209, 218, 203, 65, 26, 1, 209, 218, 221, 254, 219, 252, 26, 1, + 209, 218, 221, 254, 233, 67, 26, 1, 209, 218, 214, 62, 26, 1, 209, 218, + 214, 219, 26, 1, 209, 218, 219, 96, 26, 1, 209, 218, 209, 141, 26, 1, + 209, 218, 210, 36, 26, 1, 209, 218, 199, 73, 26, 1, 158, 216, 244, 26, 1, + 158, 193, 158, 26, 1, 158, 213, 143, 26, 1, 158, 216, 144, 26, 1, 158, + 213, 141, 26, 1, 158, 219, 141, 26, 1, 158, 213, 146, 26, 1, 158, 212, + 215, 26, 1, 158, 214, 46, 26, 1, 158, 212, 97, 26, 1, 158, 192, 255, 26, + 1, 158, 214, 0, 26, 1, 158, 203, 112, 26, 1, 158, 214, 11, 26, 1, 158, + 221, 238, 26, 1, 158, 199, 59, 26, 1, 158, 203, 91, 26, 1, 158, 213, 154, + 26, 1, 158, 200, 214, 26, 1, 158, 221, 243, 26, 1, 158, 192, 128, 26, 1, + 158, 220, 208, 26, 1, 158, 205, 131, 26, 1, 158, 216, 149, 26, 1, 158, + 214, 151, 26, 1, 158, 217, 97, 26, 1, 158, 216, 155, 26, 1, 158, 203, + 251, 26, 1, 158, 192, 70, 26, 1, 158, 213, 148, 26, 1, 158, 221, 234, + 216, 247, 26, 1, 158, 214, 7, 26, 1, 158, 197, 94, 26, 1, 158, 231, 92, + 26, 1, 158, 213, 253, 26, 1, 158, 233, 31, 26, 1, 158, 214, 155, 26, 1, + 158, 216, 128, 26, 1, 158, 219, 172, 26, 1, 158, 214, 137, 26, 1, 158, + 215, 229, 26, 1, 158, 216, 132, 26, 1, 158, 208, 129, 26, 1, 158, 216, + 130, 26, 1, 158, 216, 146, 26, 1, 158, 218, 210, 26, 1, 158, 212, 207, + 26, 1, 158, 217, 11, 26, 1, 158, 220, 179, 26, 1, 158, 212, 86, 26, 1, + 158, 199, 62, 26, 1, 158, 202, 9, 26, 1, 158, 191, 186, 26, 1, 158, 221, + 235, 26, 1, 158, 207, 164, 26, 1, 158, 199, 120, 26, 1, 158, 214, 8, 26, + 1, 158, 216, 151, 26, 1, 158, 212, 206, 26, 1, 158, 221, 233, 26, 1, 158, + 209, 131, 26, 1, 158, 209, 235, 26, 1, 158, 212, 59, 26, 1, 158, 219, + 178, 26, 1, 158, 214, 47, 26, 1, 158, 216, 148, 26, 1, 158, 214, 20, 26, + 1, 158, 191, 200, 26, 1, 158, 210, 139, 26, 1, 158, 191, 199, 26, 1, 158, + 214, 160, 26, 1, 158, 212, 195, 26, 1, 158, 200, 250, 26, 1, 158, 220, + 212, 26, 1, 158, 214, 36, 26, 1, 158, 214, 5, 26, 1, 158, 197, 69, 26, 1, + 158, 216, 159, 26, 1, 158, 220, 201, 26, 1, 158, 212, 204, 26, 1, 158, + 199, 60, 26, 1, 158, 217, 129, 26, 1, 158, 214, 45, 26, 1, 158, 219, 171, + 26, 1, 158, 214, 26, 26, 1, 158, 212, 209, 26, 1, 158, 213, 127, 26, 1, + 158, 231, 76, 26, 1, 158, 220, 234, 26, 1, 158, 207, 57, 211, 121, 26, 1, + 158, 199, 226, 26, 1, 158, 198, 50, 26, 1, 158, 212, 83, 26, 1, 158, 206, + 196, 26, 1, 158, 219, 229, 26, 1, 158, 216, 212, 26, 1, 158, 218, 170, + 26, 1, 158, 200, 160, 26, 1, 158, 215, 157, 26, 1, 158, 203, 77, 26, 1, + 158, 203, 87, 26, 1, 158, 220, 151, 26, 1, 158, 212, 180, 26, 1, 158, + 203, 6, 26, 1, 158, 212, 197, 26, 1, 158, 210, 51, 26, 1, 158, 213, 221, + 26, 1, 158, 203, 42, 26, 1, 158, 208, 145, 26, 1, 158, 215, 86, 26, 1, + 158, 219, 2, 26, 1, 158, 207, 57, 215, 146, 26, 1, 158, 198, 193, 26, 1, + 158, 212, 183, 26, 1, 158, 217, 12, 175, 26, 1, 158, 205, 129, 26, 1, + 158, 233, 110, 26, 1, 114, 214, 159, 26, 1, 114, 198, 57, 26, 1, 114, + 217, 1, 26, 1, 114, 220, 18, 26, 1, 114, 195, 10, 26, 1, 114, 219, 8, 26, + 1, 114, 210, 222, 26, 1, 114, 202, 22, 26, 1, 114, 207, 136, 26, 1, 114, + 212, 211, 26, 1, 114, 214, 130, 26, 1, 114, 208, 163, 26, 1, 114, 199, + 197, 26, 1, 114, 214, 13, 26, 1, 114, 221, 16, 26, 1, 114, 192, 247, 26, + 1, 114, 205, 51, 26, 1, 114, 214, 37, 26, 1, 114, 210, 219, 26, 1, 114, + 198, 59, 26, 1, 114, 220, 206, 26, 1, 114, 219, 24, 26, 1, 114, 212, 214, + 26, 1, 114, 213, 245, 26, 1, 114, 217, 135, 26, 1, 114, 214, 6, 26, 1, + 114, 213, 244, 26, 1, 114, 212, 213, 26, 1, 114, 206, 193, 26, 1, 114, + 213, 145, 26, 1, 114, 210, 48, 26, 1, 114, 205, 198, 26, 1, 114, 214, 21, + 26, 1, 114, 216, 138, 26, 1, 114, 231, 70, 26, 1, 114, 214, 9, 26, 1, + 114, 213, 156, 26, 1, 114, 217, 73, 26, 1, 114, 219, 4, 26, 1, 114, 214, + 42, 26, 1, 114, 214, 143, 26, 1, 114, 199, 225, 212, 195, 26, 1, 114, + 203, 253, 26, 1, 114, 208, 156, 26, 1, 114, 214, 163, 202, 31, 26, 1, + 114, 214, 29, 212, 97, 26, 1, 114, 192, 29, 26, 1, 114, 231, 71, 26, 1, + 114, 197, 88, 26, 1, 114, 192, 47, 26, 1, 114, 209, 75, 26, 1, 114, 197, + 75, 26, 1, 114, 221, 241, 26, 1, 114, 200, 249, 26, 1, 114, 199, 61, 26, + 1, 114, 195, 79, 26, 1, 114, 193, 100, 26, 1, 114, 220, 125, 26, 1, 114, + 208, 167, 26, 1, 114, 199, 239, 26, 1, 114, 231, 91, 26, 1, 114, 214, 52, + 26, 1, 114, 203, 90, 26, 1, 114, 216, 133, 26, 1, 114, 217, 5, 26, 1, + 114, 212, 46, 26, 1, 114, 213, 108, 26, 1, 114, 231, 178, 26, 1, 114, + 197, 76, 26, 1, 114, 220, 217, 26, 1, 114, 192, 104, 26, 1, 114, 212, 84, + 242, 239, 26, 1, 114, 192, 18, 26, 1, 114, 216, 150, 26, 1, 114, 214, + 148, 26, 1, 114, 209, 176, 26, 1, 114, 191, 206, 26, 1, 114, 219, 173, + 26, 1, 114, 232, 86, 26, 1, 114, 231, 177, 26, 1, 114, 213, 255, 26, 1, + 114, 221, 243, 26, 1, 114, 217, 138, 26, 1, 114, 214, 12, 26, 1, 114, + 231, 77, 26, 1, 114, 233, 111, 26, 1, 114, 212, 184, 26, 1, 114, 209, + 236, 26, 1, 114, 192, 45, 26, 1, 114, 214, 38, 26, 1, 114, 212, 84, 248, + 211, 26, 1, 114, 212, 26, 26, 1, 114, 209, 37, 26, 1, 114, 216, 82, 26, + 1, 114, 232, 84, 26, 1, 114, 214, 246, 26, 1, 114, 215, 151, 26, 1, 114, + 231, 76, 26, 1, 114, 232, 89, 68, 26, 1, 114, 215, 87, 26, 1, 114, 208, + 162, 26, 1, 114, 214, 1, 26, 1, 114, 220, 190, 26, 1, 114, 209, 173, 26, + 1, 114, 212, 198, 26, 1, 114, 192, 46, 26, 1, 114, 214, 22, 26, 1, 114, + 210, 223, 210, 21, 26, 1, 114, 232, 89, 247, 140, 26, 1, 114, 232, 169, + 26, 1, 114, 213, 150, 26, 1, 114, 65, 26, 1, 114, 198, 50, 26, 1, 114, + 74, 26, 1, 114, 68, 26, 1, 114, 220, 16, 26, 1, 114, 210, 223, 209, 84, + 26, 1, 114, 199, 245, 26, 1, 114, 199, 180, 26, 1, 114, 214, 163, 215, + 73, 228, 174, 26, 1, 114, 203, 65, 26, 1, 114, 192, 42, 26, 1, 114, 213, + 238, 26, 1, 114, 191, 211, 26, 1, 114, 191, 244, 200, 136, 26, 1, 114, + 191, 244, 238, 244, 26, 1, 114, 191, 194, 26, 1, 114, 191, 202, 26, 1, + 114, 221, 229, 26, 1, 114, 209, 234, 26, 1, 114, 213, 151, 234, 51, 26, + 1, 114, 208, 158, 26, 1, 114, 192, 253, 26, 1, 114, 233, 54, 26, 1, 114, + 195, 148, 26, 1, 114, 218, 227, 26, 1, 114, 216, 102, 26, 1, 114, 207, + 21, 26, 1, 114, 207, 165, 26, 1, 114, 213, 237, 26, 1, 114, 214, 70, 26, + 1, 114, 203, 57, 26, 1, 114, 203, 42, 26, 1, 114, 232, 89, 207, 60, 26, + 1, 114, 181, 26, 1, 114, 209, 187, 26, 1, 114, 219, 2, 26, 1, 114, 221, + 69, 26, 1, 114, 216, 188, 26, 1, 114, 174, 26, 1, 114, 217, 70, 26, 1, + 114, 199, 63, 26, 1, 114, 221, 168, 26, 1, 114, 215, 233, 26, 1, 114, + 199, 95, 26, 1, 114, 233, 78, 26, 1, 114, 231, 64, 26, 1, 209, 217, 155, + 26, 1, 209, 217, 66, 26, 1, 209, 217, 220, 234, 26, 1, 209, 217, 234, + 190, 26, 1, 209, 217, 207, 86, 26, 1, 209, 217, 199, 226, 26, 1, 209, + 217, 212, 83, 26, 1, 209, 217, 173, 26, 1, 209, 217, 206, 196, 26, 1, + 209, 217, 206, 243, 26, 1, 209, 217, 216, 212, 26, 1, 209, 217, 199, 245, + 26, 1, 209, 217, 214, 162, 26, 1, 209, 217, 213, 157, 26, 1, 209, 217, + 218, 170, 26, 1, 209, 217, 200, 160, 26, 1, 209, 217, 203, 77, 26, 1, + 209, 217, 202, 223, 26, 1, 209, 217, 203, 249, 26, 1, 209, 217, 220, 151, + 26, 1, 209, 217, 221, 243, 26, 1, 209, 217, 212, 148, 26, 1, 209, 217, + 212, 180, 26, 1, 209, 217, 213, 128, 26, 1, 209, 217, 191, 243, 26, 1, + 209, 217, 203, 6, 26, 1, 209, 217, 170, 26, 1, 209, 217, 212, 217, 26, 1, + 209, 217, 209, 234, 26, 1, 209, 217, 212, 197, 26, 1, 209, 217, 192, 253, + 26, 1, 209, 217, 210, 51, 26, 1, 209, 217, 206, 69, 26, 1, 209, 217, 213, + 221, 26, 1, 209, 217, 207, 21, 26, 1, 209, 217, 221, 253, 26, 1, 209, + 217, 213, 254, 26, 1, 209, 217, 214, 49, 26, 1, 209, 217, 203, 57, 26, 1, + 209, 217, 208, 163, 26, 1, 209, 217, 232, 169, 26, 1, 209, 217, 193, 190, + 26, 1, 209, 217, 219, 148, 26, 1, 209, 217, 219, 2, 26, 1, 209, 217, 221, + 69, 26, 1, 209, 217, 217, 3, 26, 1, 209, 217, 207, 56, 26, 1, 209, 217, + 174, 26, 1, 209, 217, 216, 14, 26, 1, 209, 217, 217, 11, 26, 1, 209, 217, + 199, 73, 26, 1, 209, 217, 221, 23, 26, 1, 209, 217, 205, 151, 26, 1, 209, + 217, 193, 248, 215, 161, 1, 190, 190, 215, 161, 1, 214, 18, 215, 161, 1, + 192, 12, 215, 161, 1, 216, 48, 215, 161, 1, 249, 155, 215, 161, 1, 238, + 34, 215, 161, 1, 65, 215, 161, 1, 209, 213, 215, 161, 1, 221, 211, 215, + 161, 1, 230, 24, 215, 161, 1, 238, 9, 215, 161, 1, 243, 50, 215, 161, 1, + 222, 17, 215, 161, 1, 211, 122, 215, 161, 1, 217, 135, 215, 161, 1, 213, + 181, 215, 161, 1, 168, 215, 161, 1, 211, 89, 215, 161, 1, 74, 215, 161, + 1, 206, 163, 215, 161, 1, 203, 82, 215, 161, 1, 199, 32, 215, 161, 1, + 234, 219, 215, 161, 1, 193, 190, 215, 161, 1, 71, 215, 161, 1, 221, 69, + 215, 161, 1, 220, 26, 215, 161, 1, 173, 215, 161, 1, 230, 82, 215, 161, + 1, 207, 2, 215, 161, 1, 199, 110, 215, 161, 17, 191, 77, 215, 161, 17, + 107, 215, 161, 17, 109, 215, 161, 17, 138, 215, 161, 17, 134, 215, 161, + 17, 150, 215, 161, 17, 169, 215, 161, 17, 175, 215, 161, 17, 171, 215, + 161, 17, 178, 215, 161, 237, 240, 215, 161, 55, 237, 240, 199, 186, 1, + 210, 240, 199, 186, 1, 211, 168, 199, 186, 1, 211, 60, 199, 186, 1, 210, + 249, 199, 186, 1, 250, 125, 199, 186, 1, 252, 65, 199, 186, 1, 251, 39, + 199, 186, 1, 250, 135, 199, 186, 1, 193, 227, 199, 186, 1, 195, 155, 199, + 186, 1, 194, 255, 199, 186, 1, 193, 236, 199, 186, 1, 233, 184, 199, 186, + 1, 234, 199, 199, 186, 1, 234, 48, 199, 186, 1, 233, 223, 199, 186, 1, + 223, 43, 199, 186, 1, 228, 30, 199, 186, 1, 223, 81, 199, 186, 1, 223, + 47, 199, 186, 1, 196, 18, 199, 186, 1, 196, 160, 199, 186, 1, 196, 64, + 199, 186, 1, 196, 22, 199, 186, 1, 250, 136, 199, 186, 1, 250, 140, 199, + 186, 1, 250, 138, 199, 186, 1, 250, 137, 199, 186, 1, 196, 129, 199, 186, + 1, 196, 138, 199, 186, 1, 196, 135, 199, 186, 1, 196, 130, 199, 186, 1, + 53, 214, 72, 199, 186, 1, 180, 196, 145, 199, 186, 1, 203, 41, 196, 143, + 199, 186, 1, 203, 41, 250, 137, 199, 186, 1, 196, 150, 199, 186, 1, 196, + 143, 199, 186, 1, 196, 146, 199, 186, 1, 196, 145, 199, 186, 1, 196, 131, + 199, 186, 1, 196, 134, 199, 186, 1, 196, 133, 199, 186, 1, 196, 132, 199, + 186, 1, 215, 65, 199, 186, 1, 216, 240, 199, 186, 1, 215, 167, 199, 186, + 1, 215, 74, 199, 186, 1, 155, 199, 186, 1, 221, 217, 199, 186, 1, 231, + 242, 199, 186, 1, 214, 70, 199, 186, 1, 188, 199, 186, 1, 170, 199, 186, + 1, 193, 190, 199, 186, 1, 168, 199, 186, 1, 212, 103, 199, 186, 1, 209, + 230, 199, 186, 1, 249, 155, 199, 186, 1, 174, 199, 186, 1, 181, 199, 186, + 1, 140, 199, 186, 1, 173, 199, 186, 1, 228, 166, 199, 186, 1, 190, 190, + 199, 186, 1, 238, 34, 199, 186, 1, 165, 199, 186, 1, 213, 226, 199, 186, + 1, 203, 166, 199, 186, 1, 247, 162, 199, 186, 1, 197, 168, 199, 186, 1, + 231, 93, 199, 186, 1, 228, 163, 199, 186, 1, 199, 49, 199, 186, 1, 192, + 220, 199, 186, 1, 233, 111, 199, 186, 1, 237, 70, 199, 186, 1, 247, 3, + 199, 186, 1, 191, 123, 199, 186, 17, 191, 77, 199, 186, 17, 107, 199, + 186, 17, 109, 199, 186, 17, 138, 199, 186, 17, 134, 199, 186, 17, 150, + 199, 186, 17, 169, 199, 186, 17, 175, 199, 186, 17, 171, 199, 186, 17, + 178, 249, 69, 195, 185, 1, 234, 86, 249, 69, 195, 185, 1, 155, 249, 69, + 195, 185, 1, 205, 69, 249, 69, 195, 185, 1, 233, 111, 249, 69, 195, 185, + 1, 217, 6, 249, 69, 195, 185, 1, 192, 30, 249, 69, 195, 185, 1, 231, 227, + 249, 69, 195, 185, 1, 237, 51, 249, 69, 195, 185, 1, 221, 22, 249, 69, + 195, 185, 1, 222, 203, 249, 69, 195, 185, 1, 228, 126, 249, 69, 195, 185, + 1, 193, 190, 249, 69, 195, 185, 1, 191, 7, 249, 69, 195, 185, 1, 231, + 171, 249, 69, 195, 185, 1, 236, 176, 249, 69, 195, 185, 1, 247, 44, 249, + 69, 195, 185, 1, 196, 23, 249, 69, 195, 185, 1, 159, 249, 69, 195, 185, + 1, 249, 155, 249, 69, 195, 185, 1, 193, 249, 249, 69, 195, 185, 1, 192, + 74, 249, 69, 195, 185, 1, 168, 249, 69, 195, 185, 1, 193, 177, 249, 69, + 195, 185, 1, 65, 249, 69, 195, 185, 1, 74, 249, 69, 195, 185, 1, 211, 89, + 249, 69, 195, 185, 1, 66, 249, 69, 195, 185, 1, 234, 190, 249, 69, 195, + 185, 1, 71, 249, 69, 195, 185, 1, 68, 249, 69, 195, 185, 33, 137, 198, + 79, 249, 69, 195, 185, 33, 130, 198, 79, 249, 69, 195, 185, 33, 216, 89, + 198, 79, 249, 69, 195, 185, 33, 218, 240, 198, 79, 249, 69, 195, 185, 33, + 229, 135, 198, 79, 249, 69, 195, 185, 232, 82, 201, 64, 145, 90, 18, 222, + 14, 145, 90, 18, 222, 10, 145, 90, 18, 221, 157, 145, 90, 18, 221, 120, + 145, 90, 18, 222, 43, 145, 90, 18, 222, 40, 145, 90, 18, 220, 218, 145, + 90, 18, 220, 187, 145, 90, 18, 222, 16, 145, 90, 18, 221, 227, 145, 90, + 18, 222, 103, 145, 90, 18, 222, 100, 145, 90, 18, 221, 42, 145, 90, 18, + 221, 39, 145, 90, 18, 222, 36, 145, 90, 18, 222, 33, 145, 90, 18, 220, + 220, 145, 90, 18, 220, 219, 145, 90, 18, 221, 62, 145, 90, 18, 221, 27, + 145, 90, 18, 221, 159, 145, 90, 18, 221, 158, 145, 90, 18, 222, 119, 145, + 90, 18, 222, 39, 145, 90, 18, 220, 177, 145, 90, 18, 220, 168, 145, 90, + 18, 222, 128, 145, 90, 18, 222, 120, 145, 90, 120, 195, 160, 145, 90, + 120, 212, 187, 145, 90, 120, 220, 2, 145, 90, 120, 230, 4, 145, 90, 120, + 213, 84, 145, 90, 120, 207, 127, 145, 90, 120, 213, 111, 145, 90, 120, + 208, 71, 145, 90, 120, 192, 91, 145, 90, 120, 229, 110, 145, 90, 120, + 217, 27, 145, 90, 120, 243, 133, 145, 90, 120, 214, 167, 145, 90, 120, + 229, 46, 145, 90, 120, 209, 93, 145, 90, 120, 212, 193, 145, 90, 120, + 214, 207, 145, 90, 120, 250, 165, 145, 90, 120, 192, 216, 145, 90, 120, + 247, 78, 145, 90, 87, 243, 19, 197, 85, 145, 90, 87, 243, 19, 202, 47, + 145, 90, 87, 243, 19, 221, 245, 145, 90, 87, 243, 19, 221, 200, 145, 90, + 87, 243, 19, 200, 247, 145, 90, 87, 243, 19, 229, 4, 145, 90, 87, 243, + 19, 199, 165, 145, 90, 3, 195, 5, 198, 238, 145, 90, 3, 195, 5, 197, 156, + 247, 35, 145, 90, 3, 243, 19, 243, 122, 145, 90, 3, 195, 5, 199, 10, 145, + 90, 3, 195, 5, 233, 51, 145, 90, 3, 192, 171, 212, 181, 145, 90, 3, 192, + 171, 207, 4, 145, 90, 3, 192, 171, 198, 32, 145, 90, 3, 192, 171, 233, + 92, 145, 90, 3, 195, 5, 205, 45, 145, 90, 3, 216, 211, 200, 251, 145, 90, + 3, 195, 5, 212, 233, 145, 90, 3, 228, 33, 192, 111, 145, 90, 3, 192, 215, + 145, 90, 3, 243, 19, 197, 143, 206, 145, 145, 90, 17, 191, 77, 145, 90, + 17, 107, 145, 90, 17, 109, 145, 90, 17, 138, 145, 90, 17, 134, 145, 90, + 17, 150, 145, 90, 17, 169, 145, 90, 17, 175, 145, 90, 17, 171, 145, 90, + 17, 178, 145, 90, 31, 199, 90, 145, 90, 31, 228, 140, 145, 90, 31, 199, + 96, 198, 228, 145, 90, 31, 216, 49, 145, 90, 31, 228, 143, 216, 49, 145, + 90, 31, 199, 96, 248, 171, 145, 90, 31, 197, 227, 145, 90, 3, 195, 5, + 218, 222, 145, 90, 3, 192, 168, 145, 90, 3, 229, 105, 145, 90, 3, 198, + 255, 229, 105, 145, 90, 3, 190, 236, 199, 43, 145, 90, 3, 229, 30, 145, + 90, 3, 212, 247, 145, 90, 3, 192, 206, 145, 90, 3, 212, 185, 145, 90, 3, + 250, 148, 145, 90, 3, 197, 7, 247, 34, 145, 90, 3, 216, 211, 197, 159, + 145, 90, 3, 199, 166, 145, 90, 3, 218, 255, 145, 90, 3, 215, 105, 145, + 90, 3, 243, 19, 230, 78, 218, 198, 212, 191, 212, 190, 145, 90, 3, 243, + 19, 238, 196, 197, 150, 145, 90, 3, 243, 19, 197, 5, 145, 90, 3, 243, 19, + 197, 6, 243, 38, 145, 90, 3, 243, 19, 208, 161, 237, 208, 145, 90, 3, + 243, 19, 212, 240, 198, 41, 145, 90, 242, 246, 3, 197, 154, 145, 90, 242, + 246, 3, 192, 76, 145, 90, 242, 246, 3, 219, 92, 145, 90, 242, 246, 3, + 220, 0, 145, 90, 242, 246, 3, 192, 167, 145, 90, 242, 246, 3, 221, 43, + 145, 90, 242, 246, 3, 230, 0, 145, 90, 242, 246, 3, 215, 149, 145, 90, + 242, 246, 3, 198, 239, 145, 90, 242, 246, 3, 197, 165, 145, 90, 242, 246, + 3, 209, 227, 145, 90, 242, 246, 3, 221, 215, 145, 90, 242, 246, 3, 230, + 66, 145, 90, 242, 246, 3, 195, 182, 145, 90, 242, 246, 3, 233, 88, 145, + 90, 242, 246, 3, 192, 118, 145, 90, 242, 246, 3, 197, 137, 145, 90, 242, + 246, 3, 220, 172, 145, 90, 242, 246, 3, 193, 237, 216, 220, 6, 1, 218, + 170, 216, 220, 6, 1, 206, 9, 216, 220, 6, 1, 196, 12, 216, 220, 6, 1, + 193, 224, 216, 220, 6, 1, 250, 178, 216, 220, 6, 1, 191, 166, 216, 220, + 6, 1, 221, 24, 216, 220, 6, 1, 210, 238, 216, 220, 6, 1, 200, 43, 216, + 220, 6, 1, 232, 53, 216, 220, 6, 1, 233, 177, 216, 220, 6, 1, 68, 216, + 220, 6, 1, 222, 154, 216, 220, 6, 1, 65, 216, 220, 6, 1, 223, 37, 216, + 220, 6, 1, 71, 216, 220, 6, 1, 250, 122, 216, 220, 6, 1, 247, 195, 216, + 220, 6, 1, 66, 216, 220, 6, 1, 191, 225, 216, 220, 6, 1, 172, 216, 220, + 6, 1, 208, 106, 216, 220, 6, 1, 228, 171, 216, 220, 6, 1, 212, 105, 216, + 220, 6, 1, 192, 235, 216, 220, 6, 1, 238, 129, 216, 220, 6, 1, 211, 153, + 216, 220, 6, 1, 215, 63, 216, 220, 6, 1, 146, 216, 220, 6, 1, 74, 216, + 220, 6, 1, 251, 238, 216, 220, 6, 1, 192, 159, 216, 220, 2, 1, 218, 170, + 216, 220, 2, 1, 206, 9, 216, 220, 2, 1, 196, 12, 216, 220, 2, 1, 193, + 224, 216, 220, 2, 1, 250, 178, 216, 220, 2, 1, 191, 166, 216, 220, 2, 1, + 221, 24, 216, 220, 2, 1, 210, 238, 216, 220, 2, 1, 200, 43, 216, 220, 2, + 1, 232, 53, 216, 220, 2, 1, 233, 177, 216, 220, 2, 1, 68, 216, 220, 2, 1, + 222, 154, 216, 220, 2, 1, 65, 216, 220, 2, 1, 223, 37, 216, 220, 2, 1, + 71, 216, 220, 2, 1, 250, 122, 216, 220, 2, 1, 247, 195, 216, 220, 2, 1, + 66, 216, 220, 2, 1, 191, 225, 216, 220, 2, 1, 172, 216, 220, 2, 1, 208, + 106, 216, 220, 2, 1, 228, 171, 216, 220, 2, 1, 212, 105, 216, 220, 2, 1, + 192, 235, 216, 220, 2, 1, 238, 129, 216, 220, 2, 1, 211, 153, 216, 220, + 2, 1, 215, 63, 216, 220, 2, 1, 146, 216, 220, 2, 1, 74, 216, 220, 2, 1, + 251, 238, 216, 220, 2, 1, 192, 159, 216, 220, 17, 191, 77, 216, 220, 17, + 107, 216, 220, 17, 109, 216, 220, 17, 138, 216, 220, 17, 134, 216, 220, + 17, 150, 216, 220, 17, 169, 216, 220, 17, 175, 216, 220, 17, 171, 216, + 220, 17, 178, 216, 220, 31, 199, 95, 216, 220, 31, 234, 129, 216, 220, + 31, 197, 37, 216, 220, 31, 198, 251, 216, 220, 31, 232, 124, 216, 220, + 31, 233, 21, 216, 220, 31, 202, 131, 216, 220, 31, 203, 245, 216, 220, + 31, 234, 163, 216, 220, 31, 213, 173, 216, 220, 17, 91, 251, 159, 20, + 216, 220, 17, 105, 251, 159, 20, 216, 220, 17, 115, 251, 159, 20, 216, + 220, 242, 76, 216, 220, 232, 82, 201, 64, 216, 220, 16, 251, 223, 216, + 220, 233, 218, 211, 138, 121, 1, 168, 121, 1, 249, 155, 121, 1, 11, 168, + 121, 1, 209, 112, 121, 1, 174, 121, 1, 216, 105, 121, 1, 251, 16, 174, + 121, 1, 233, 111, 121, 1, 195, 188, 121, 1, 195, 71, 121, 1, 190, 190, + 121, 1, 238, 34, 121, 1, 11, 197, 132, 121, 1, 11, 190, 190, 121, 1, 197, + 132, 121, 1, 237, 193, 121, 1, 181, 121, 1, 213, 226, 121, 1, 11, 213, + 81, 121, 1, 251, 16, 181, 121, 1, 213, 81, 121, 1, 213, 67, 121, 1, 173, + 121, 1, 218, 184, 121, 1, 219, 161, 121, 1, 219, 150, 121, 1, 198, 112, + 121, 1, 236, 185, 121, 1, 198, 104, 121, 1, 236, 184, 121, 1, 155, 121, + 1, 231, 242, 121, 1, 11, 155, 121, 1, 208, 98, 121, 1, 208, 74, 121, 1, + 214, 70, 121, 1, 214, 19, 121, 1, 251, 16, 214, 70, 121, 1, 140, 121, 1, + 192, 220, 121, 1, 231, 93, 121, 1, 231, 68, 121, 1, 197, 142, 121, 1, + 235, 20, 121, 1, 212, 103, 121, 1, 212, 85, 121, 1, 197, 157, 121, 1, + 235, 31, 121, 1, 11, 197, 157, 121, 1, 11, 235, 31, 121, 1, 207, 83, 197, + 157, 121, 1, 203, 166, 121, 1, 201, 176, 121, 1, 191, 71, 121, 1, 190, + 253, 121, 1, 197, 168, 121, 1, 235, 37, 121, 1, 11, 197, 168, 121, 1, + 188, 121, 1, 191, 123, 121, 1, 190, 254, 121, 1, 190, 224, 121, 1, 190, + 204, 121, 1, 251, 16, 190, 224, 121, 1, 190, 196, 121, 1, 190, 203, 121, + 1, 193, 190, 121, 1, 251, 247, 121, 1, 229, 179, 121, 1, 248, 34, 121, 1, + 200, 125, 121, 1, 235, 21, 121, 1, 199, 145, 121, 1, 197, 161, 121, 1, + 206, 72, 121, 3, 120, 52, 164, 121, 1, 214, 214, 121, 3, 250, 201, 121, + 3, 207, 83, 195, 18, 121, 3, 207, 83, 250, 201, 121, 18, 3, 65, 121, 18, + 3, 252, 208, 121, 18, 3, 251, 243, 121, 18, 3, 251, 134, 121, 18, 3, 251, + 124, 121, 18, 3, 74, 121, 18, 3, 211, 89, 121, 18, 3, 193, 48, 121, 18, + 3, 193, 224, 121, 18, 3, 71, 121, 18, 3, 234, 105, 121, 18, 3, 234, 90, + 121, 18, 3, 211, 149, 121, 18, 3, 68, 121, 18, 3, 228, 37, 121, 18, 3, + 228, 36, 121, 18, 3, 228, 35, 121, 18, 3, 223, 90, 121, 18, 3, 223, 228, + 121, 18, 3, 223, 201, 121, 18, 3, 223, 51, 121, 18, 3, 223, 138, 121, 18, + 3, 66, 121, 18, 3, 196, 168, 121, 18, 3, 196, 167, 121, 18, 3, 196, 166, + 121, 18, 3, 196, 30, 121, 18, 3, 196, 148, 121, 18, 3, 196, 97, 121, 18, + 3, 192, 159, 121, 18, 3, 192, 33, 121, 18, 3, 252, 27, 121, 18, 3, 252, + 23, 121, 18, 3, 234, 28, 121, 18, 3, 206, 114, 234, 28, 121, 18, 3, 234, + 36, 121, 18, 3, 206, 114, 234, 36, 121, 18, 3, 251, 238, 121, 18, 3, 234, + 168, 121, 18, 3, 250, 165, 121, 18, 3, 211, 21, 121, 18, 3, 215, 63, 121, + 18, 3, 214, 72, 121, 18, 3, 196, 81, 121, 18, 3, 191, 205, 121, 18, 3, + 211, 143, 121, 18, 3, 211, 150, 121, 18, 3, 193, 239, 121, 18, 3, 223, + 206, 121, 18, 3, 234, 219, 121, 18, 3, 223, 88, 121, 18, 3, 196, 139, + 121, 163, 179, 121, 163, 198, 54, 179, 121, 163, 58, 121, 163, 60, 121, + 1, 198, 77, 121, 1, 198, 76, 121, 1, 198, 75, 121, 1, 198, 74, 121, 1, + 198, 73, 121, 1, 198, 72, 121, 1, 198, 71, 121, 1, 207, 83, 198, 78, 121, + 1, 207, 83, 198, 77, 121, 1, 207, 83, 198, 75, 121, 1, 207, 83, 198, 74, + 121, 1, 207, 83, 198, 73, 121, 1, 207, 83, 198, 71, 19, 223, 53, 77, 46, + 223, 53, 77, 39, 243, 82, 228, 253, 77, 39, 243, 82, 223, 53, 77, 41, 2, + 27, 233, 5, 195, 57, 251, 159, 207, 109, 87, 247, 162, 195, 57, 251, 159, + 207, 109, 87, 213, 225, 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, 19, 241, + 160, 19, 241, 159, 19, 241, 158, 19, 241, 157, 19, 241, 156, 19, 241, + 155, 19, 241, 154, 19, 241, 153, 19, 241, 152, 19, 241, 151, 19, 241, + 150, 19, 241, 149, 19, 241, 148, 19, 241, 147, 19, 241, 146, 19, 241, + 145, 19, 241, 144, 19, 241, 143, 19, 241, 142, 19, 241, 141, 19, 241, + 140, 19, 241, 139, 19, 241, 138, 19, 241, 137, 19, 241, 136, 19, 241, + 135, 19, 241, 134, 19, 241, 133, 19, 241, 132, 19, 241, 131, 19, 241, + 130, 19, 241, 129, 19, 241, 128, 19, 241, 127, 19, 241, 126, 19, 241, + 125, 19, 241, 124, 19, 241, 123, 19, 241, 122, 19, 241, 121, 19, 241, + 120, 19, 241, 119, 19, 241, 118, 19, 241, 117, 19, 241, 116, 19, 241, + 115, 19, 241, 114, 19, 241, 113, 19, 241, 112, 19, 241, 111, 19, 241, + 110, 19, 241, 109, 19, 241, 108, 19, 241, 107, 19, 241, 106, 19, 241, + 105, 19, 241, 104, 19, 241, 103, 19, 241, 102, 19, 241, 101, 19, 241, + 100, 19, 241, 99, 19, 241, 98, 19, 241, 97, 19, 241, 96, 19, 241, 95, 19, + 241, 94, 19, 241, 93, 19, 241, 92, 19, 241, 91, 19, 241, 90, 19, 241, 89, + 19, 241, 88, 19, 241, 87, 19, 241, 86, 19, 241, 85, 19, 241, 84, 19, 241, + 83, 19, 241, 82, 19, 241, 81, 19, 241, 80, 19, 241, 79, 19, 241, 78, 19, + 241, 77, 19, 241, 76, 19, 241, 75, 19, 241, 74, 19, 241, 73, 19, 241, 72, + 19, 241, 71, 19, 241, 70, 19, 241, 69, 19, 241, 68, 19, 241, 67, 19, 241, + 66, 19, 241, 65, 19, 241, 64, 19, 241, 63, 19, 241, 62, 19, 241, 61, 19, + 241, 60, 19, 241, 59, 19, 241, 58, 19, 241, 57, 19, 241, 56, 19, 241, 55, + 19, 241, 54, 19, 241, 53, 19, 241, 52, 19, 241, 51, 19, 241, 50, 19, 241, + 49, 19, 241, 48, 19, 241, 47, 19, 241, 46, 19, 241, 45, 19, 241, 44, 19, + 241, 43, 19, 241, 42, 19, 241, 41, 19, 241, 40, 19, 241, 39, 19, 241, 38, + 19, 241, 37, 19, 241, 36, 19, 241, 35, 19, 241, 34, 19, 241, 33, 19, 241, + 32, 19, 241, 31, 19, 241, 30, 19, 241, 29, 19, 241, 28, 19, 241, 27, 19, + 241, 26, 19, 241, 25, 19, 241, 24, 19, 241, 23, 19, 241, 22, 19, 241, 21, + 19, 241, 20, 19, 241, 19, 19, 241, 18, 19, 241, 17, 19, 241, 16, 19, 241, + 15, 19, 241, 14, 19, 241, 13, 19, 241, 12, 19, 241, 11, 19, 241, 10, 19, + 241, 9, 19, 241, 8, 19, 241, 7, 19, 241, 6, 19, 241, 5, 19, 241, 4, 19, + 241, 3, 19, 241, 2, 19, 241, 1, 19, 241, 0, 19, 240, 255, 19, 240, 254, + 19, 240, 253, 19, 240, 252, 19, 240, 251, 19, 240, 250, 19, 240, 249, 19, + 240, 248, 19, 240, 247, 19, 240, 246, 19, 240, 245, 19, 240, 244, 19, + 240, 243, 19, 240, 242, 19, 240, 241, 19, 240, 240, 19, 240, 239, 19, + 240, 238, 19, 240, 237, 19, 240, 236, 19, 240, 235, 19, 240, 234, 19, + 240, 233, 19, 240, 232, 19, 240, 231, 19, 240, 230, 19, 240, 229, 19, + 240, 228, 19, 240, 227, 19, 240, 226, 19, 240, 225, 19, 240, 224, 19, + 240, 223, 19, 240, 222, 19, 240, 221, 19, 240, 220, 19, 240, 219, 19, + 240, 218, 19, 240, 217, 19, 240, 216, 19, 240, 215, 19, 240, 214, 19, + 240, 213, 19, 240, 212, 19, 240, 211, 19, 240, 210, 19, 240, 209, 19, + 240, 208, 19, 240, 207, 19, 240, 206, 19, 240, 205, 19, 240, 204, 19, + 240, 203, 19, 240, 202, 19, 240, 201, 19, 240, 200, 19, 240, 199, 19, + 240, 198, 19, 240, 197, 19, 240, 196, 19, 240, 195, 19, 240, 194, 19, + 240, 193, 19, 240, 192, 19, 240, 191, 19, 240, 190, 19, 240, 189, 19, + 240, 188, 19, 240, 187, 19, 240, 186, 19, 240, 185, 19, 240, 184, 19, + 240, 183, 19, 240, 182, 19, 240, 181, 19, 240, 180, 19, 240, 179, 19, + 240, 178, 19, 240, 177, 19, 240, 176, 19, 240, 175, 19, 240, 174, 19, + 240, 173, 19, 240, 172, 19, 240, 171, 19, 240, 170, 19, 240, 169, 19, + 240, 168, 19, 240, 167, 19, 240, 166, 19, 240, 165, 19, 240, 164, 19, + 240, 163, 19, 240, 162, 19, 240, 161, 19, 240, 160, 19, 240, 159, 19, + 240, 158, 19, 240, 157, 19, 240, 156, 19, 240, 155, 19, 240, 154, 19, + 240, 153, 19, 240, 152, 19, 240, 151, 19, 240, 150, 19, 240, 149, 19, + 240, 148, 19, 240, 147, 19, 240, 146, 19, 240, 145, 19, 240, 144, 19, + 240, 143, 19, 240, 142, 19, 240, 141, 19, 240, 140, 19, 240, 139, 19, + 240, 138, 19, 240, 137, 19, 240, 136, 19, 240, 135, 19, 240, 134, 19, + 240, 133, 19, 240, 132, 19, 240, 131, 19, 240, 130, 19, 240, 129, 19, + 240, 128, 19, 240, 127, 19, 240, 126, 19, 240, 125, 19, 240, 124, 19, + 240, 123, 19, 240, 122, 19, 240, 121, 19, 240, 120, 19, 240, 119, 19, + 240, 118, 19, 240, 117, 19, 240, 116, 19, 240, 115, 19, 240, 114, 19, + 240, 113, 19, 240, 112, 19, 240, 111, 19, 240, 110, 19, 240, 109, 19, + 240, 108, 19, 240, 107, 19, 240, 106, 19, 240, 105, 19, 240, 104, 19, + 240, 103, 19, 240, 102, 19, 240, 101, 19, 240, 100, 19, 240, 99, 19, 240, + 98, 19, 240, 97, 19, 240, 96, 19, 240, 95, 19, 240, 94, 19, 240, 93, 19, + 240, 92, 19, 240, 91, 19, 240, 90, 19, 240, 89, 19, 240, 88, 19, 240, 87, + 19, 240, 86, 19, 240, 85, 19, 240, 84, 19, 240, 83, 19, 240, 82, 19, 240, + 81, 19, 240, 80, 19, 240, 79, 19, 240, 78, 19, 240, 77, 19, 240, 76, 19, + 240, 75, 19, 240, 74, 19, 240, 73, 19, 240, 72, 19, 240, 71, 19, 240, 70, + 19, 240, 69, 19, 240, 68, 19, 240, 67, 19, 240, 66, 19, 240, 65, 19, 240, + 64, 19, 240, 63, 19, 240, 62, 19, 240, 61, 19, 240, 60, 19, 240, 59, 19, + 240, 58, 19, 240, 57, 19, 240, 56, 19, 240, 55, 19, 240, 54, 19, 240, 53, + 19, 240, 52, 19, 240, 51, 19, 240, 50, 19, 240, 49, 19, 240, 48, 19, 240, + 47, 19, 240, 46, 19, 240, 45, 19, 240, 44, 19, 240, 43, 19, 240, 42, 19, + 240, 41, 19, 240, 40, 19, 240, 39, 19, 240, 38, 19, 240, 37, 19, 240, 36, + 19, 240, 35, 19, 240, 34, 19, 240, 33, 19, 240, 32, 19, 240, 31, 19, 240, + 30, 19, 240, 29, 19, 240, 28, 19, 240, 27, 19, 240, 26, 19, 240, 25, 19, + 240, 24, 19, 240, 23, 19, 240, 22, 19, 240, 21, 19, 240, 20, 19, 240, 19, + 19, 240, 18, 19, 240, 17, 19, 240, 16, 19, 240, 15, 19, 240, 14, 19, 240, + 13, 19, 240, 12, 19, 240, 11, 19, 240, 10, 19, 240, 9, 19, 240, 8, 19, + 240, 7, 19, 240, 6, 19, 240, 5, 19, 240, 4, 19, 240, 3, 19, 240, 2, 19, + 240, 1, 19, 240, 0, 19, 239, 255, 19, 239, 254, 19, 239, 253, 19, 239, + 252, 19, 239, 251, 19, 239, 250, 19, 239, 249, 19, 239, 248, 19, 239, + 247, 19, 239, 246, 19, 239, 245, 19, 239, 244, 19, 239, 243, 19, 239, + 242, 19, 239, 241, 19, 239, 240, 19, 239, 239, 19, 239, 238, 19, 239, + 237, 19, 239, 236, 19, 239, 235, 19, 239, 234, 19, 239, 233, 19, 239, + 232, 19, 239, 231, 19, 239, 230, 19, 239, 229, 19, 239, 228, 19, 239, + 227, 19, 239, 226, 19, 239, 225, 19, 239, 224, 19, 239, 223, 19, 239, + 222, 19, 239, 221, 19, 239, 220, 19, 239, 219, 19, 239, 218, 19, 239, + 217, 19, 239, 216, 19, 239, 215, 19, 239, 214, 19, 239, 213, 19, 239, + 212, 19, 239, 211, 19, 239, 210, 19, 239, 209, 19, 239, 208, 19, 239, + 207, 19, 239, 206, 19, 239, 205, 19, 239, 204, 19, 239, 203, 19, 239, + 202, 19, 239, 201, 19, 239, 200, 19, 239, 199, 19, 239, 198, 19, 239, + 197, 19, 239, 196, 19, 239, 195, 19, 239, 194, 19, 239, 193, 19, 239, + 192, 19, 239, 191, 19, 239, 190, 19, 239, 189, 19, 239, 188, 19, 239, + 187, 19, 239, 186, 19, 239, 185, 19, 239, 184, 19, 239, 183, 19, 239, + 182, 19, 239, 181, 19, 239, 180, 19, 239, 179, 19, 239, 178, 19, 239, + 177, 19, 239, 176, 19, 239, 175, 19, 239, 174, 19, 239, 173, 19, 239, + 172, 19, 239, 171, 19, 239, 170, 19, 239, 169, 19, 239, 168, 19, 239, + 167, 19, 239, 166, 19, 239, 165, 19, 239, 164, 19, 239, 163, 19, 239, + 162, 19, 239, 161, 19, 239, 160, 19, 239, 159, 19, 239, 158, 19, 239, + 157, 19, 239, 156, 19, 239, 155, 19, 239, 154, 19, 239, 153, 19, 239, + 152, 19, 239, 151, 19, 239, 150, 19, 239, 149, 19, 239, 148, 19, 239, + 147, 19, 239, 146, 19, 239, 145, 19, 239, 144, 19, 239, 143, 19, 239, + 142, 19, 239, 141, 19, 239, 140, 19, 239, 139, 19, 239, 138, 19, 239, + 137, 19, 239, 136, 19, 239, 135, 19, 239, 134, 19, 239, 133, 19, 239, + 132, 19, 239, 131, 19, 239, 130, 19, 239, 129, 19, 239, 128, 19, 239, + 127, 19, 239, 126, 19, 239, 125, 19, 239, 124, 19, 239, 123, 19, 239, + 122, 19, 239, 121, 19, 239, 120, 19, 239, 119, 19, 239, 118, 19, 239, + 117, 19, 239, 116, 19, 239, 115, 19, 239, 114, 19, 239, 113, 19, 239, + 112, 19, 239, 111, 19, 239, 110, 19, 239, 109, 19, 239, 108, 19, 239, + 107, 19, 239, 106, 19, 239, 105, 19, 239, 104, 19, 239, 103, 19, 239, + 102, 19, 239, 101, 19, 239, 100, 19, 239, 99, 19, 239, 98, 19, 239, 97, + 19, 239, 96, 19, 239, 95, 19, 239, 94, 19, 239, 93, 19, 239, 92, 19, 239, + 91, 19, 239, 90, 19, 239, 89, 19, 239, 88, 19, 239, 87, 19, 239, 86, 19, + 239, 85, 19, 239, 84, 19, 239, 83, 19, 239, 82, 19, 239, 81, 19, 239, 80, + 19, 239, 79, 19, 239, 78, 19, 239, 77, 19, 239, 76, 19, 239, 75, 19, 239, + 74, 19, 239, 73, 19, 239, 72, 19, 239, 71, 19, 239, 70, 19, 239, 69, 19, + 239, 68, 19, 239, 67, 19, 239, 66, 41, 2, 27, 246, 240, 41, 2, 27, 246, + 239, 41, 2, 27, 246, 238, 41, 2, 27, 246, 237, 41, 2, 27, 246, 236, 41, + 2, 27, 246, 235, 41, 2, 27, 246, 234, 41, 2, 27, 246, 233, 41, 2, 27, + 246, 232, 41, 2, 27, 246, 231, 41, 2, 27, 246, 230, 41, 2, 27, 246, 229, + 41, 2, 27, 246, 228, 41, 2, 27, 246, 227, 41, 2, 27, 246, 226, 41, 2, 27, 246, 225, 41, 2, 27, 246, 224, 41, 2, 27, 246, 223, 41, 2, 27, 246, 222, 41, 2, 27, 246, 221, 41, 2, 27, 246, 220, 41, 2, 27, 246, 219, 41, 2, 27, 246, 218, 41, 2, 27, 246, 217, 41, 2, 27, 246, 216, 41, 2, 27, 246, 215, @@ -17734,2952 +17739,2953 @@ static const unsigned char phrasebook[] = { 39, 41, 2, 27, 245, 38, 41, 2, 27, 245, 37, 41, 2, 27, 245, 36, 41, 2, 27, 245, 35, 41, 2, 27, 245, 34, 41, 2, 27, 245, 33, 41, 2, 27, 245, 32, 41, 2, 27, 245, 31, 41, 2, 27, 245, 30, 41, 2, 27, 245, 29, 41, 2, 27, - 245, 28, 41, 2, 27, 245, 27, 41, 2, 27, 245, 26, 41, 2, 27, 245, 25, 72, - 1, 216, 36, 198, 77, 72, 1, 216, 36, 198, 76, 72, 1, 216, 36, 198, 75, - 72, 1, 216, 36, 198, 74, 72, 1, 216, 36, 198, 72, 72, 1, 216, 36, 198, - 71, 72, 1, 216, 36, 214, 211, 198, 78, 72, 1, 216, 36, 214, 211, 198, 77, - 72, 1, 216, 36, 214, 211, 198, 76, 72, 1, 216, 36, 214, 211, 198, 75, 72, - 1, 216, 36, 214, 211, 198, 74, 72, 1, 216, 36, 214, 211, 198, 72, 72, 1, - 216, 36, 214, 211, 198, 71, 72, 1, 251, 14, 71, 229, 120, 1, 251, 14, - 192, 80, 61, 1, 255, 206, 61, 1, 255, 205, 61, 1, 255, 204, 61, 1, 255, - 200, 61, 1, 228, 73, 61, 1, 228, 72, 61, 1, 228, 71, 61, 1, 228, 70, 61, - 1, 196, 231, 61, 1, 196, 230, 61, 1, 196, 229, 61, 1, 196, 228, 61, 1, - 196, 227, 61, 1, 235, 13, 61, 1, 235, 12, 61, 1, 235, 11, 61, 1, 235, 10, - 61, 1, 235, 9, 61, 1, 212, 14, 61, 1, 212, 13, 61, 1, 212, 12, 61, 1, - 222, 141, 61, 1, 222, 138, 61, 1, 222, 137, 61, 1, 222, 136, 61, 1, 222, - 135, 61, 1, 222, 134, 61, 1, 222, 133, 61, 1, 222, 132, 61, 1, 222, 131, - 61, 1, 222, 140, 61, 1, 222, 139, 61, 1, 222, 130, 61, 1, 221, 165, 61, - 1, 221, 164, 61, 1, 221, 163, 61, 1, 221, 162, 61, 1, 221, 161, 61, 1, - 221, 160, 61, 1, 221, 159, 61, 1, 221, 158, 61, 1, 220, 231, 61, 1, 220, - 230, 61, 1, 220, 229, 61, 1, 220, 228, 61, 1, 220, 227, 61, 1, 220, 226, - 61, 1, 220, 225, 61, 1, 222, 21, 61, 1, 222, 20, 61, 1, 222, 19, 61, 1, - 222, 18, 61, 1, 222, 17, 61, 1, 222, 16, 61, 1, 221, 66, 61, 1, 221, 65, - 61, 1, 221, 64, 61, 1, 221, 63, 61, 1, 205, 206, 61, 1, 205, 205, 61, 1, - 205, 204, 61, 1, 205, 203, 61, 1, 205, 202, 61, 1, 205, 201, 61, 1, 205, - 200, 61, 1, 205, 199, 61, 1, 202, 221, 61, 1, 202, 220, 61, 1, 202, 219, - 61, 1, 202, 218, 61, 1, 202, 217, 61, 1, 202, 216, 61, 1, 201, 3, 61, 1, - 201, 2, 61, 1, 201, 1, 61, 1, 201, 0, 61, 1, 200, 255, 61, 1, 200, 254, - 61, 1, 200, 253, 61, 1, 200, 252, 61, 1, 205, 67, 61, 1, 205, 66, 61, 1, - 205, 65, 61, 1, 205, 64, 61, 1, 205, 63, 61, 1, 202, 45, 61, 1, 202, 44, - 61, 1, 202, 43, 61, 1, 202, 42, 61, 1, 202, 41, 61, 1, 202, 40, 61, 1, - 202, 39, 61, 1, 199, 251, 61, 1, 199, 250, 61, 1, 199, 249, 61, 1, 199, - 248, 61, 1, 198, 192, 61, 1, 198, 191, 61, 1, 198, 190, 61, 1, 198, 189, - 61, 1, 198, 188, 61, 1, 198, 187, 61, 1, 198, 186, 61, 1, 197, 93, 61, 1, - 197, 92, 61, 1, 197, 91, 61, 1, 197, 90, 61, 1, 197, 89, 61, 1, 199, 144, - 61, 1, 199, 143, 61, 1, 199, 142, 61, 1, 199, 141, 61, 1, 199, 140, 61, - 1, 199, 139, 61, 1, 199, 138, 61, 1, 199, 137, 61, 1, 199, 136, 61, 1, - 198, 98, 61, 1, 198, 97, 61, 1, 198, 96, 61, 1, 198, 95, 61, 1, 198, 94, - 61, 1, 198, 93, 61, 1, 198, 92, 61, 1, 215, 6, 61, 1, 215, 5, 61, 1, 215, - 4, 61, 1, 215, 3, 61, 1, 215, 2, 61, 1, 215, 1, 61, 1, 215, 0, 61, 1, - 214, 255, 61, 1, 214, 254, 61, 1, 213, 218, 61, 1, 213, 217, 61, 1, 213, - 216, 61, 1, 213, 215, 61, 1, 213, 214, 61, 1, 213, 213, 61, 1, 213, 212, - 61, 1, 213, 211, 61, 1, 212, 177, 61, 1, 212, 176, 61, 1, 212, 175, 61, - 1, 214, 120, 61, 1, 214, 119, 61, 1, 214, 118, 61, 1, 214, 117, 61, 1, - 214, 116, 61, 1, 214, 115, 61, 1, 214, 114, 61, 1, 213, 42, 61, 1, 213, - 41, 61, 1, 213, 40, 61, 1, 213, 39, 61, 1, 213, 38, 61, 1, 230, 104, 61, - 1, 230, 101, 61, 1, 230, 100, 61, 1, 230, 99, 61, 1, 230, 98, 61, 1, 230, - 97, 61, 1, 230, 96, 61, 1, 230, 95, 61, 1, 230, 94, 61, 1, 230, 103, 61, - 1, 230, 102, 61, 1, 229, 157, 61, 1, 229, 156, 61, 1, 229, 155, 61, 1, - 229, 154, 61, 1, 229, 153, 61, 1, 229, 152, 61, 1, 229, 151, 61, 1, 228, - 158, 61, 1, 228, 157, 61, 1, 228, 156, 61, 1, 229, 244, 61, 1, 229, 243, - 61, 1, 229, 242, 61, 1, 229, 241, 61, 1, 229, 240, 61, 1, 229, 239, 61, - 1, 229, 238, 61, 1, 229, 22, 61, 1, 229, 21, 61, 1, 229, 20, 61, 1, 229, - 19, 61, 1, 229, 18, 61, 1, 229, 17, 61, 1, 229, 16, 61, 1, 229, 15, 61, - 1, 217, 159, 61, 1, 217, 158, 61, 1, 217, 157, 61, 1, 217, 156, 61, 1, - 217, 155, 61, 1, 217, 154, 61, 1, 217, 153, 61, 1, 216, 99, 61, 1, 216, - 98, 61, 1, 216, 97, 61, 1, 216, 96, 61, 1, 216, 95, 61, 1, 216, 94, 61, - 1, 216, 93, 61, 1, 215, 154, 61, 1, 215, 153, 61, 1, 215, 152, 61, 1, - 215, 151, 61, 1, 216, 231, 61, 1, 216, 230, 61, 1, 216, 229, 61, 1, 216, - 11, 61, 1, 216, 10, 61, 1, 216, 9, 61, 1, 216, 8, 61, 1, 216, 7, 61, 1, - 216, 6, 61, 1, 192, 148, 61, 1, 192, 147, 61, 1, 192, 146, 61, 1, 192, - 145, 61, 1, 192, 144, 61, 1, 192, 141, 61, 1, 191, 224, 61, 1, 191, 223, - 61, 1, 191, 222, 61, 1, 191, 221, 61, 1, 192, 11, 61, 1, 192, 10, 61, 1, - 192, 9, 61, 1, 192, 8, 61, 1, 192, 7, 61, 1, 192, 6, 61, 1, 207, 185, 61, - 1, 207, 184, 61, 1, 207, 183, 61, 1, 207, 182, 61, 1, 207, 0, 61, 1, 206, - 255, 61, 1, 206, 254, 61, 1, 206, 253, 61, 1, 206, 252, 61, 1, 206, 251, - 61, 1, 206, 250, 61, 1, 206, 67, 61, 1, 206, 66, 61, 1, 206, 65, 61, 1, - 206, 64, 61, 1, 206, 63, 61, 1, 206, 62, 61, 1, 207, 112, 61, 1, 207, - 111, 61, 1, 207, 110, 61, 1, 207, 109, 61, 1, 206, 161, 61, 1, 206, 160, - 61, 1, 206, 159, 61, 1, 206, 158, 61, 1, 206, 157, 61, 1, 206, 156, 61, - 1, 193, 189, 61, 1, 193, 188, 61, 1, 193, 187, 61, 1, 193, 186, 61, 1, - 193, 185, 61, 1, 193, 85, 61, 1, 193, 84, 61, 1, 193, 83, 61, 1, 193, 82, - 61, 1, 193, 81, 61, 1, 193, 124, 61, 1, 193, 123, 61, 1, 193, 122, 61, 1, - 193, 121, 61, 1, 193, 47, 61, 1, 193, 46, 61, 1, 193, 45, 61, 1, 193, 44, - 61, 1, 193, 43, 61, 1, 193, 42, 61, 1, 193, 41, 61, 1, 215, 58, 61, 1, - 215, 57, 229, 120, 1, 251, 14, 193, 0, 72, 1, 251, 14, 192, 33, 72, 1, - 251, 14, 192, 80, 72, 1, 251, 14, 193, 0, 229, 120, 1, 2, 221, 67, 229, - 120, 1, 2, 193, 86, 229, 120, 1, 2, 193, 125, 229, 120, 1, 2, 193, 48, - 72, 1, 2, 221, 67, 72, 1, 2, 193, 86, 72, 1, 2, 193, 125, 72, 1, 2, 193, - 48, 72, 1, 2, 215, 61, 46, 245, 24, 46, 245, 23, 46, 245, 22, 46, 245, - 21, 46, 245, 20, 46, 245, 19, 46, 245, 18, 46, 245, 17, 46, 245, 16, 46, - 245, 15, 46, 245, 14, 46, 245, 13, 46, 245, 12, 46, 245, 11, 46, 245, 10, - 46, 245, 9, 46, 245, 8, 46, 245, 7, 46, 245, 6, 46, 245, 5, 46, 245, 4, - 46, 245, 3, 46, 245, 2, 46, 245, 1, 46, 245, 0, 46, 244, 255, 46, 244, - 254, 46, 244, 253, 46, 244, 252, 46, 244, 251, 46, 244, 250, 46, 244, - 249, 46, 244, 248, 46, 244, 247, 46, 244, 246, 46, 244, 245, 46, 244, - 244, 46, 244, 243, 46, 244, 242, 46, 244, 241, 46, 244, 240, 46, 244, - 239, 46, 244, 238, 46, 244, 237, 46, 244, 236, 46, 244, 235, 46, 244, - 234, 46, 244, 233, 46, 244, 232, 46, 244, 231, 46, 244, 230, 46, 244, - 229, 46, 244, 228, 46, 244, 227, 46, 244, 226, 46, 244, 225, 46, 244, - 224, 46, 244, 223, 46, 244, 222, 46, 244, 221, 46, 244, 220, 46, 244, - 219, 46, 244, 218, 46, 244, 217, 46, 244, 216, 46, 244, 215, 46, 244, - 214, 46, 244, 213, 46, 244, 212, 46, 244, 211, 46, 244, 210, 46, 244, - 209, 46, 244, 208, 46, 244, 207, 46, 244, 206, 46, 244, 205, 46, 244, - 204, 46, 244, 203, 46, 244, 202, 46, 244, 201, 46, 244, 200, 46, 244, - 199, 46, 244, 198, 46, 244, 197, 46, 244, 196, 46, 244, 195, 46, 244, - 194, 46, 244, 193, 46, 244, 192, 46, 244, 191, 46, 244, 190, 46, 244, - 189, 46, 244, 188, 46, 244, 187, 46, 244, 186, 46, 244, 185, 46, 244, - 184, 46, 244, 183, 46, 244, 182, 46, 244, 181, 46, 244, 180, 46, 244, - 179, 46, 244, 178, 46, 244, 177, 46, 244, 176, 46, 244, 175, 46, 244, - 174, 46, 244, 173, 46, 244, 172, 46, 244, 171, 46, 244, 170, 46, 244, - 169, 46, 244, 168, 46, 244, 167, 46, 244, 166, 46, 244, 165, 46, 244, - 164, 46, 244, 163, 46, 244, 162, 46, 244, 161, 46, 244, 160, 46, 244, - 159, 46, 244, 158, 46, 244, 157, 46, 244, 156, 46, 244, 155, 46, 244, - 154, 46, 244, 153, 46, 244, 152, 46, 244, 151, 46, 244, 150, 46, 244, - 149, 46, 244, 148, 46, 244, 147, 46, 244, 146, 46, 244, 145, 46, 244, - 144, 46, 244, 143, 46, 244, 142, 46, 244, 141, 46, 244, 140, 46, 244, - 139, 46, 244, 138, 46, 244, 137, 46, 244, 136, 46, 244, 135, 46, 244, - 134, 46, 244, 133, 46, 244, 132, 46, 244, 131, 46, 244, 130, 46, 244, - 129, 46, 244, 128, 46, 244, 127, 46, 244, 126, 46, 244, 125, 46, 244, - 124, 46, 244, 123, 46, 244, 122, 46, 244, 121, 46, 244, 120, 46, 244, - 119, 46, 244, 118, 46, 244, 117, 46, 244, 116, 46, 244, 115, 46, 244, - 114, 46, 244, 113, 46, 244, 112, 46, 244, 111, 46, 244, 110, 46, 244, - 109, 46, 244, 108, 46, 244, 107, 46, 244, 106, 46, 244, 105, 46, 244, - 104, 46, 244, 103, 46, 244, 102, 46, 244, 101, 46, 244, 100, 46, 244, 99, - 46, 244, 98, 46, 244, 97, 46, 244, 96, 46, 244, 95, 46, 244, 94, 46, 244, - 93, 46, 244, 92, 46, 244, 91, 46, 244, 90, 46, 244, 89, 46, 244, 88, 46, - 244, 87, 46, 244, 86, 46, 244, 85, 46, 244, 84, 46, 244, 83, 46, 244, 82, - 46, 244, 81, 46, 244, 80, 46, 244, 79, 46, 244, 78, 46, 244, 77, 46, 244, - 76, 46, 244, 75, 46, 244, 74, 46, 244, 73, 46, 244, 72, 46, 244, 71, 46, - 244, 70, 46, 244, 69, 46, 244, 68, 46, 244, 67, 46, 244, 66, 46, 244, 65, - 46, 244, 64, 46, 244, 63, 46, 244, 62, 46, 244, 61, 46, 244, 60, 46, 244, - 59, 46, 244, 58, 46, 244, 57, 46, 244, 56, 46, 244, 55, 46, 244, 54, 46, - 244, 53, 46, 244, 52, 46, 244, 51, 46, 244, 50, 46, 244, 49, 46, 244, 48, - 46, 244, 47, 46, 244, 46, 46, 244, 45, 46, 244, 44, 46, 244, 43, 46, 244, - 42, 46, 244, 41, 46, 244, 40, 46, 244, 39, 46, 244, 38, 46, 244, 37, 46, - 244, 36, 46, 244, 35, 46, 244, 34, 46, 244, 33, 46, 244, 32, 46, 244, 31, - 46, 244, 30, 46, 244, 29, 46, 244, 28, 46, 244, 27, 46, 244, 26, 46, 244, - 25, 46, 244, 24, 46, 244, 23, 46, 244, 22, 46, 244, 21, 46, 244, 20, 46, - 244, 19, 46, 244, 18, 46, 244, 17, 46, 244, 16, 46, 244, 15, 46, 244, 14, - 46, 244, 13, 46, 244, 12, 46, 244, 11, 46, 244, 10, 46, 244, 9, 46, 244, - 8, 46, 244, 7, 46, 244, 6, 46, 244, 5, 46, 244, 4, 46, 244, 3, 46, 244, - 2, 46, 244, 1, 46, 244, 0, 46, 243, 255, 46, 243, 254, 46, 243, 253, 46, - 243, 252, 46, 243, 251, 46, 243, 250, 46, 243, 249, 46, 243, 248, 46, - 243, 247, 46, 243, 246, 46, 243, 245, 46, 243, 244, 46, 243, 243, 46, - 243, 242, 46, 243, 241, 46, 243, 240, 46, 243, 239, 46, 243, 238, 46, - 243, 237, 46, 243, 236, 46, 243, 235, 46, 243, 234, 46, 243, 233, 46, - 243, 232, 46, 243, 231, 46, 243, 230, 46, 243, 229, 46, 243, 228, 46, - 243, 227, 46, 243, 226, 46, 243, 225, 46, 243, 224, 46, 243, 223, 46, - 243, 222, 46, 243, 221, 46, 243, 220, 46, 243, 219, 46, 243, 218, 46, - 243, 217, 46, 243, 216, 46, 243, 215, 46, 243, 214, 46, 243, 213, 46, - 243, 212, 46, 243, 211, 46, 243, 210, 46, 243, 209, 46, 243, 208, 46, - 243, 207, 46, 243, 206, 46, 243, 205, 46, 243, 204, 46, 243, 203, 46, - 243, 202, 46, 243, 201, 46, 243, 200, 46, 243, 199, 46, 243, 198, 46, - 243, 197, 46, 243, 196, 46, 243, 195, 46, 243, 194, 46, 243, 193, 46, - 243, 192, 46, 243, 191, 46, 243, 190, 46, 243, 189, 46, 243, 188, 46, - 243, 187, 46, 243, 186, 46, 243, 185, 46, 243, 184, 46, 243, 183, 46, - 243, 182, 46, 243, 181, 46, 243, 180, 46, 243, 179, 46, 243, 178, 46, - 243, 177, 46, 243, 176, 46, 243, 175, 46, 243, 174, 46, 243, 173, 46, - 243, 172, 46, 243, 171, 46, 243, 170, 46, 243, 169, 46, 243, 168, 46, - 243, 167, 46, 243, 166, 46, 243, 165, 46, 243, 164, 46, 243, 163, 46, - 243, 162, 46, 243, 161, 46, 243, 160, 46, 243, 159, 46, 243, 158, 46, - 243, 157, 46, 243, 156, 46, 243, 155, 46, 243, 154, 46, 243, 153, 46, - 243, 152, 46, 243, 151, 46, 243, 150, 46, 243, 149, 46, 243, 148, 46, - 243, 147, 46, 243, 146, 46, 243, 145, 46, 243, 144, 46, 243, 143, 46, - 243, 142, 46, 243, 141, 124, 1, 230, 116, 124, 1, 192, 235, 124, 1, 210, - 236, 124, 1, 200, 43, 124, 1, 233, 175, 124, 1, 222, 152, 124, 1, 172, - 124, 1, 250, 120, 124, 1, 238, 127, 124, 1, 196, 12, 124, 1, 232, 51, - 124, 1, 146, 124, 1, 210, 237, 215, 61, 124, 1, 238, 128, 206, 8, 124, 1, - 233, 176, 215, 61, 124, 1, 222, 153, 218, 168, 124, 1, 207, 222, 206, 8, - 124, 1, 199, 51, 124, 1, 202, 82, 237, 69, 124, 1, 237, 69, 124, 1, 221, - 102, 124, 1, 202, 82, 223, 35, 124, 1, 229, 112, 124, 1, 219, 160, 124, - 1, 207, 7, 124, 1, 218, 168, 124, 1, 215, 61, 124, 1, 223, 35, 124, 1, - 206, 8, 124, 1, 218, 169, 215, 61, 124, 1, 215, 62, 218, 168, 124, 1, - 223, 36, 218, 168, 124, 1, 206, 9, 223, 35, 124, 1, 218, 169, 4, 236, - 140, 124, 1, 215, 62, 4, 236, 140, 124, 1, 223, 36, 4, 236, 140, 124, 1, - 223, 36, 4, 185, 223, 118, 23, 58, 124, 1, 206, 9, 4, 236, 140, 124, 1, - 206, 9, 4, 75, 60, 124, 1, 218, 169, 206, 8, 124, 1, 215, 62, 206, 8, - 124, 1, 223, 36, 206, 8, 124, 1, 206, 9, 206, 8, 124, 1, 218, 169, 215, - 62, 206, 8, 124, 1, 215, 62, 218, 169, 206, 8, 124, 1, 223, 36, 218, 169, - 206, 8, 124, 1, 206, 9, 223, 36, 206, 8, 124, 1, 223, 36, 206, 9, 4, 236, - 140, 124, 1, 223, 36, 215, 61, 124, 1, 223, 36, 215, 62, 206, 8, 124, 1, - 206, 9, 200, 43, 124, 1, 206, 9, 200, 44, 146, 124, 1, 206, 9, 210, 236, - 124, 1, 206, 9, 210, 237, 146, 124, 1, 200, 44, 206, 8, 124, 1, 200, 44, - 207, 222, 206, 8, 124, 1, 193, 224, 124, 1, 193, 97, 124, 1, 193, 225, - 146, 124, 1, 206, 9, 215, 61, 124, 1, 206, 9, 218, 168, 124, 1, 222, 153, - 207, 222, 206, 8, 124, 1, 232, 52, 207, 222, 206, 8, 124, 1, 206, 9, 222, - 152, 124, 1, 206, 9, 222, 153, 146, 124, 1, 65, 124, 1, 202, 82, 210, - 250, 124, 1, 211, 182, 124, 1, 74, 124, 1, 251, 66, 124, 1, 68, 124, 1, - 71, 124, 1, 223, 226, 124, 1, 203, 40, 68, 124, 1, 196, 139, 124, 1, 234, - 188, 124, 1, 202, 82, 234, 173, 124, 1, 206, 135, 68, 124, 1, 202, 82, - 234, 188, 124, 1, 179, 68, 124, 1, 192, 80, 124, 1, 66, 124, 1, 233, 242, - 124, 1, 192, 182, 124, 1, 126, 215, 61, 124, 1, 179, 66, 124, 1, 206, - 135, 66, 124, 1, 196, 141, 124, 1, 202, 82, 66, 124, 1, 211, 84, 124, 1, - 210, 250, 124, 1, 211, 19, 124, 1, 193, 190, 124, 1, 193, 48, 124, 1, - 193, 86, 124, 1, 193, 112, 124, 1, 193, 14, 124, 1, 214, 214, 66, 124, 1, - 214, 214, 74, 124, 1, 214, 214, 68, 124, 1, 214, 214, 65, 124, 1, 210, 0, - 251, 132, 124, 1, 210, 0, 251, 149, 124, 1, 202, 82, 234, 103, 124, 1, - 202, 82, 251, 132, 124, 1, 202, 82, 211, 104, 124, 1, 117, 218, 168, 124, - 252, 4, 45, 228, 241, 205, 58, 124, 252, 4, 216, 87, 228, 241, 205, 58, - 124, 252, 4, 50, 228, 241, 205, 58, 124, 252, 4, 130, 81, 205, 58, 124, - 252, 4, 216, 87, 81, 205, 58, 124, 252, 4, 137, 81, 205, 58, 124, 252, 4, - 250, 170, 205, 58, 124, 252, 4, 250, 170, 219, 215, 205, 58, 124, 252, 4, - 250, 170, 199, 188, 124, 252, 4, 250, 170, 199, 215, 124, 252, 4, 250, - 170, 235, 15, 102, 124, 252, 4, 250, 170, 228, 74, 102, 124, 252, 4, 250, - 170, 199, 189, 102, 124, 252, 4, 137, 252, 46, 124, 252, 4, 137, 198, - 172, 252, 46, 124, 252, 4, 137, 230, 210, 124, 252, 4, 137, 179, 230, - 210, 124, 252, 4, 137, 236, 140, 124, 252, 4, 137, 243, 10, 124, 252, 4, - 137, 219, 112, 124, 252, 4, 137, 193, 138, 124, 252, 4, 137, 195, 135, - 124, 252, 4, 130, 252, 46, 124, 252, 4, 130, 198, 172, 252, 46, 124, 252, - 4, 130, 230, 210, 124, 252, 4, 130, 179, 230, 210, 124, 252, 4, 130, 236, - 140, 124, 252, 4, 130, 243, 10, 124, 252, 4, 130, 219, 112, 124, 252, 4, - 130, 193, 138, 124, 252, 4, 130, 195, 135, 124, 252, 4, 130, 57, 124, 3, - 187, 4, 238, 217, 124, 199, 9, 1, 205, 34, 124, 55, 77, 124, 208, 152, - 243, 78, 232, 80, 201, 63, 203, 27, 232, 145, 1, 211, 2, 203, 27, 232, - 145, 239, 28, 211, 2, 203, 27, 232, 145, 144, 201, 78, 203, 27, 232, 145, - 133, 201, 78, 97, 33, 87, 230, 240, 213, 159, 206, 9, 220, 251, 211, 105, - 219, 224, 97, 33, 87, 213, 159, 206, 9, 220, 251, 211, 105, 219, 224, 97, - 33, 87, 197, 162, 211, 105, 219, 224, 97, 33, 87, 230, 240, 213, 159, - 211, 105, 219, 224, 97, 33, 87, 213, 159, 211, 105, 219, 224, 97, 33, 87, - 201, 179, 211, 105, 219, 224, 97, 33, 87, 217, 94, 209, 3, 211, 105, 219, - 224, 97, 33, 87, 209, 3, 211, 105, 219, 224, 97, 33, 87, 193, 231, 211, - 105, 219, 224, 97, 33, 87, 217, 94, 209, 3, 206, 9, 221, 181, 211, 105, - 219, 224, 97, 33, 87, 209, 3, 206, 9, 221, 181, 211, 105, 219, 224, 97, - 33, 87, 193, 231, 206, 9, 221, 181, 211, 105, 219, 224, 97, 33, 87, 230, - 240, 213, 159, 206, 9, 220, 251, 211, 105, 183, 97, 33, 87, 213, 159, - 206, 9, 220, 251, 211, 105, 183, 97, 33, 87, 197, 162, 211, 105, 183, 97, - 33, 87, 230, 240, 213, 159, 211, 105, 183, 97, 33, 87, 213, 159, 211, - 105, 183, 97, 33, 87, 201, 179, 211, 105, 183, 97, 33, 87, 217, 94, 209, - 3, 211, 105, 183, 97, 33, 87, 209, 3, 211, 105, 183, 97, 33, 87, 193, - 231, 211, 105, 183, 97, 33, 87, 217, 94, 209, 3, 206, 9, 221, 181, 211, - 105, 183, 97, 33, 87, 209, 3, 206, 9, 221, 181, 211, 105, 183, 97, 33, - 87, 193, 231, 206, 9, 221, 181, 211, 105, 183, 97, 33, 87, 197, 162, 206, - 9, 220, 250, 97, 33, 87, 217, 94, 209, 3, 206, 9, 220, 250, 97, 33, 87, - 201, 49, 217, 94, 209, 2, 97, 33, 87, 209, 3, 206, 9, 220, 250, 97, 33, - 87, 209, 3, 201, 48, 97, 33, 87, 193, 231, 206, 9, 220, 250, 97, 33, 87, - 217, 94, 209, 3, 201, 48, 97, 33, 87, 230, 240, 193, 230, 97, 33, 87, - 191, 83, 97, 33, 87, 211, 104, 97, 33, 87, 207, 124, 97, 33, 87, 198, - 157, 97, 33, 87, 248, 83, 97, 33, 87, 196, 156, 97, 33, 87, 209, 65, 97, - 33, 87, 219, 21, 97, 33, 87, 220, 200, 97, 33, 87, 222, 115, 97, 33, 87, - 191, 74, 97, 33, 87, 202, 105, 97, 33, 87, 207, 117, 97, 33, 87, 220, - 253, 211, 105, 219, 224, 97, 33, 198, 80, 207, 137, 87, 215, 162, 97, 33, - 198, 80, 207, 137, 87, 200, 153, 97, 33, 198, 80, 207, 137, 87, 197, 246, - 97, 33, 87, 191, 120, 97, 33, 87, 237, 105, 191, 120, 97, 33, 87, 211, - 25, 97, 33, 87, 209, 67, 97, 33, 87, 209, 68, 4, 81, 106, 97, 33, 87, - 243, 134, 97, 33, 87, 243, 135, 209, 45, 97, 33, 87, 211, 174, 97, 33, - 87, 202, 10, 212, 249, 97, 33, 87, 198, 89, 97, 33, 87, 235, 48, 97, 33, - 250, 169, 81, 211, 109, 97, 33, 87, 238, 163, 211, 109, 97, 33, 87, 220, - 252, 97, 33, 110, 198, 80, 207, 137, 223, 144, 97, 208, 203, 52, 219, - 167, 97, 208, 203, 52, 219, 166, 97, 208, 203, 52, 236, 233, 232, 195, - 97, 208, 203, 52, 220, 252, 97, 208, 203, 52, 206, 144, 97, 161, 221, 0, - 97, 161, 221, 1, 198, 156, 97, 161, 210, 122, 97, 161, 235, 56, 196, 13, - 243, 113, 97, 161, 221, 90, 97, 161, 191, 105, 97, 161, 201, 61, 97, 161, - 201, 62, 206, 9, 211, 163, 97, 161, 210, 10, 97, 161, 210, 11, 214, 96, - 97, 161, 201, 62, 4, 202, 10, 212, 249, 97, 161, 243, 112, 97, 161, 210, - 186, 97, 161, 191, 103, 97, 161, 230, 248, 248, 82, 97, 161, 230, 248, - 198, 156, 97, 161, 230, 248, 215, 160, 97, 161, 230, 248, 200, 152, 97, - 161, 230, 248, 197, 245, 97, 161, 194, 253, 208, 183, 97, 161, 194, 253, - 215, 163, 97, 161, 194, 253, 200, 154, 97, 161, 194, 253, 197, 247, 97, - 161, 194, 253, 221, 85, 208, 183, 97, 161, 194, 253, 221, 85, 215, 163, - 97, 161, 194, 253, 221, 85, 200, 154, 97, 161, 194, 253, 221, 85, 197, - 247, 97, 161, 55, 191, 103, 97, 161, 207, 18, 243, 112, 97, 161, 237, 91, - 97, 161, 221, 207, 97, 161, 243, 134, 97, 161, 209, 67, 97, 161, 202, - 113, 215, 163, 97, 161, 202, 113, 200, 154, 97, 161, 202, 113, 197, 247, - 97, 161, 202, 113, 198, 157, 97, 161, 237, 105, 221, 90, 97, 161, 202, - 113, 221, 85, 200, 154, 97, 161, 202, 113, 221, 89, 97, 161, 202, 113, - 221, 85, 198, 157, 97, 161, 202, 113, 235, 53, 208, 183, 97, 161, 202, - 113, 235, 53, 200, 154, 97, 161, 202, 113, 235, 53, 214, 96, 97, 161, - 202, 113, 235, 53, 221, 84, 97, 161, 202, 72, 97, 161, 202, 73, 206, 9, - 191, 101, 97, 161, 202, 73, 191, 110, 97, 161, 202, 73, 206, 9, 220, 250, - 97, 161, 220, 252, 97, 161, 206, 144, 97, 161, 232, 228, 97, 161, 221, - 59, 97, 161, 191, 8, 97, 161, 201, 90, 97, 161, 201, 91, 206, 9, 191, - 101, 97, 161, 201, 91, 206, 9, 220, 250, 97, 161, 201, 91, 206, 9, 191, - 102, 228, 74, 220, 250, 97, 161, 201, 91, 206, 9, 220, 251, 228, 74, 191, - 101, 97, 161, 201, 91, 191, 111, 97, 161, 201, 91, 191, 112, 206, 9, 191, - 101, 97, 161, 201, 91, 206, 9, 206, 143, 97, 161, 201, 91, 206, 9, 235, - 47, 191, 100, 97, 161, 201, 91, 206, 9, 191, 102, 228, 74, 209, 66, 97, - 161, 209, 47, 97, 161, 201, 91, 214, 96, 97, 161, 201, 40, 208, 183, 97, - 161, 201, 40, 215, 161, 97, 161, 201, 40, 220, 249, 97, 161, 201, 40, - 209, 43, 97, 161, 201, 40, 209, 5, 97, 161, 201, 40, 214, 96, 97, 161, - 201, 40, 221, 87, 97, 161, 201, 40, 221, 89, 97, 161, 201, 40, 198, 158, - 208, 130, 97, 161, 201, 40, 235, 52, 97, 161, 201, 40, 235, 51, 97, 161, - 201, 40, 235, 49, 97, 161, 201, 40, 235, 53, 221, 84, 97, 161, 201, 40, - 235, 50, 221, 84, 97, 161, 201, 40, 230, 195, 4, 202, 170, 191, 103, 97, - 161, 201, 40, 230, 191, 4, 202, 170, 191, 103, 97, 161, 201, 40, 230, - 194, 97, 161, 201, 40, 230, 190, 97, 161, 201, 40, 230, 191, 4, 55, 191, - 103, 97, 161, 201, 40, 230, 192, 97, 161, 201, 40, 230, 193, 209, 5, 97, - 161, 216, 221, 97, 161, 216, 222, 209, 4, 97, 161, 216, 222, 221, 83, 97, - 161, 216, 222, 221, 86, 97, 161, 216, 222, 221, 88, 97, 161, 201, 40, - 197, 174, 97, 161, 201, 40, 197, 173, 97, 161, 201, 40, 197, 172, 97, - 161, 211, 31, 97, 161, 211, 32, 200, 154, 97, 161, 211, 32, 197, 247, 97, - 161, 211, 32, 220, 255, 200, 154, 97, 161, 211, 32, 221, 85, 200, 154, - 97, 161, 211, 32, 221, 85, 214, 96, 97, 161, 201, 40, 220, 254, 97, 161, - 201, 40, 220, 255, 209, 5, 97, 161, 201, 40, 220, 255, 230, 195, 4, 202, - 170, 191, 103, 97, 161, 201, 40, 220, 255, 230, 191, 4, 202, 170, 191, - 103, 97, 161, 201, 40, 220, 255, 230, 194, 97, 161, 201, 40, 220, 255, - 230, 190, 97, 161, 201, 40, 220, 255, 230, 191, 4, 55, 191, 103, 97, 161, - 201, 40, 220, 255, 230, 192, 97, 161, 201, 40, 220, 255, 230, 193, 209, - 5, 97, 161, 201, 40, 220, 255, 197, 175, 97, 161, 220, 214, 97, 161, 211, - 173, 97, 161, 235, 84, 97, 161, 214, 103, 97, 161, 210, 79, 73, 37, 16, - 208, 169, 73, 37, 16, 237, 217, 73, 37, 16, 210, 4, 73, 37, 16, 210, 246, - 234, 144, 73, 37, 16, 210, 246, 236, 238, 73, 37, 16, 195, 172, 234, 144, - 73, 37, 16, 195, 172, 236, 238, 73, 37, 16, 222, 44, 73, 37, 16, 200, 60, - 73, 37, 16, 210, 120, 73, 37, 16, 191, 231, 73, 37, 16, 191, 232, 236, - 238, 73, 37, 16, 221, 3, 73, 37, 16, 251, 61, 234, 144, 73, 37, 16, 233, - 210, 234, 144, 73, 37, 16, 199, 108, 73, 37, 16, 221, 247, 73, 37, 16, - 251, 50, 73, 37, 16, 251, 51, 236, 238, 73, 37, 16, 200, 67, 73, 37, 16, - 198, 244, 73, 37, 16, 211, 116, 251, 12, 73, 37, 16, 230, 238, 251, 12, - 73, 37, 16, 208, 168, 73, 37, 16, 246, 248, 73, 37, 16, 195, 161, 73, 37, - 16, 223, 58, 251, 12, 73, 37, 16, 221, 249, 251, 12, 73, 37, 16, 221, - 248, 251, 12, 73, 37, 16, 205, 105, 73, 37, 16, 210, 110, 73, 37, 16, - 201, 88, 251, 54, 73, 37, 16, 210, 245, 251, 12, 73, 37, 16, 195, 171, - 251, 12, 73, 37, 16, 251, 55, 251, 12, 73, 37, 16, 251, 48, 73, 37, 16, - 221, 92, 73, 37, 16, 207, 14, 73, 37, 16, 209, 183, 251, 12, 73, 37, 16, - 198, 142, 73, 37, 16, 251, 128, 73, 37, 16, 205, 37, 73, 37, 16, 200, 71, - 251, 12, 73, 37, 16, 200, 71, 216, 166, 201, 86, 73, 37, 16, 210, 240, - 251, 12, 73, 37, 16, 199, 27, 73, 37, 16, 219, 202, 73, 37, 16, 235, 38, - 73, 37, 16, 197, 243, 73, 37, 16, 199, 76, 73, 37, 16, 221, 6, 73, 37, - 16, 251, 61, 233, 210, 214, 98, 73, 37, 16, 232, 88, 251, 12, 73, 37, 16, - 223, 175, 73, 37, 16, 197, 210, 251, 12, 73, 37, 16, 222, 47, 197, 209, - 73, 37, 16, 210, 36, 73, 37, 16, 208, 173, 73, 37, 16, 221, 42, 73, 37, - 16, 243, 60, 251, 12, 73, 37, 16, 207, 135, 73, 37, 16, 210, 124, 251, - 12, 73, 37, 16, 210, 121, 251, 12, 73, 37, 16, 228, 24, 73, 37, 16, 214, - 225, 73, 37, 16, 209, 238, 73, 37, 16, 221, 43, 251, 167, 73, 37, 16, - 197, 210, 251, 167, 73, 37, 16, 201, 55, 73, 37, 16, 230, 189, 73, 37, - 16, 223, 58, 214, 98, 73, 37, 16, 211, 116, 214, 98, 73, 37, 16, 210, - 246, 214, 98, 73, 37, 16, 209, 237, 73, 37, 16, 221, 26, 73, 37, 16, 209, - 236, 73, 37, 16, 221, 5, 73, 37, 16, 210, 37, 214, 98, 73, 37, 16, 221, - 248, 214, 99, 251, 93, 73, 37, 16, 221, 249, 214, 99, 251, 93, 73, 37, - 16, 191, 229, 73, 37, 16, 251, 51, 214, 98, 73, 37, 16, 251, 52, 200, 68, - 214, 98, 73, 37, 16, 191, 230, 73, 37, 16, 221, 4, 73, 37, 16, 234, 139, - 73, 37, 16, 246, 249, 73, 37, 16, 216, 57, 223, 57, 73, 37, 16, 195, 172, - 214, 98, 73, 37, 16, 209, 183, 214, 98, 73, 37, 16, 208, 174, 214, 98, - 73, 37, 16, 211, 112, 73, 37, 16, 251, 80, 73, 37, 16, 218, 179, 73, 37, - 16, 210, 121, 214, 98, 73, 37, 16, 210, 124, 214, 98, 73, 37, 16, 233, - 249, 210, 123, 73, 37, 16, 220, 147, 73, 37, 16, 251, 81, 73, 37, 16, - 197, 210, 214, 98, 73, 37, 16, 234, 142, 73, 37, 16, 200, 71, 214, 98, - 73, 37, 16, 200, 61, 73, 37, 16, 243, 60, 214, 98, 73, 37, 16, 234, 53, - 73, 37, 16, 205, 38, 214, 98, 73, 37, 16, 192, 199, 221, 92, 73, 37, 16, - 197, 207, 73, 37, 16, 208, 175, 73, 37, 16, 197, 211, 73, 37, 16, 197, - 208, 73, 37, 16, 208, 172, 73, 37, 16, 197, 206, 73, 37, 16, 208, 171, - 73, 37, 16, 230, 237, 73, 37, 16, 251, 4, 73, 37, 16, 233, 249, 251, 4, - 73, 37, 16, 210, 240, 214, 98, 73, 37, 16, 199, 26, 234, 6, 73, 37, 16, - 199, 26, 233, 209, 73, 37, 16, 199, 28, 251, 56, 73, 37, 16, 199, 20, - 222, 103, 251, 47, 73, 37, 16, 222, 46, 73, 37, 16, 234, 90, 73, 37, 16, - 192, 38, 222, 43, 73, 37, 16, 192, 38, 251, 93, 73, 37, 16, 201, 87, 73, - 37, 16, 221, 93, 251, 93, 73, 37, 16, 236, 239, 251, 12, 73, 37, 16, 221, - 7, 251, 12, 73, 37, 16, 221, 7, 251, 167, 73, 37, 16, 221, 7, 214, 98, - 73, 37, 16, 251, 55, 214, 98, 73, 37, 16, 251, 57, 73, 37, 16, 236, 238, - 73, 37, 16, 197, 223, 73, 37, 16, 199, 66, 73, 37, 16, 221, 30, 73, 37, - 16, 219, 207, 234, 83, 243, 50, 73, 37, 16, 219, 207, 235, 39, 243, 51, - 73, 37, 16, 219, 207, 197, 226, 243, 51, 73, 37, 16, 219, 207, 199, 78, - 243, 51, 73, 37, 16, 219, 207, 223, 170, 243, 50, 73, 37, 16, 230, 238, - 214, 99, 251, 93, 73, 37, 16, 230, 238, 210, 111, 251, 0, 73, 37, 16, - 230, 238, 210, 111, 237, 73, 73, 37, 16, 237, 7, 73, 37, 16, 237, 8, 210, - 111, 251, 1, 222, 43, 73, 37, 16, 237, 8, 210, 111, 251, 1, 251, 93, 73, - 37, 16, 237, 8, 210, 111, 237, 73, 73, 37, 16, 197, 232, 73, 37, 16, 251, - 5, 73, 37, 16, 223, 177, 73, 37, 16, 237, 30, 73, 37, 16, 251, 247, 209, - 51, 251, 6, 73, 37, 16, 251, 247, 251, 3, 73, 37, 16, 251, 247, 251, 6, - 73, 37, 16, 251, 247, 216, 160, 73, 37, 16, 251, 247, 216, 171, 73, 37, - 16, 251, 247, 230, 239, 73, 37, 16, 251, 247, 230, 236, 73, 37, 16, 251, - 247, 209, 51, 230, 239, 73, 37, 16, 217, 45, 208, 181, 228, 22, 73, 37, - 16, 217, 45, 251, 169, 208, 181, 228, 22, 73, 37, 16, 217, 45, 237, 72, - 228, 22, 73, 37, 16, 217, 45, 251, 169, 237, 72, 228, 22, 73, 37, 16, - 217, 45, 197, 218, 228, 22, 73, 37, 16, 217, 45, 197, 233, 73, 37, 16, - 217, 45, 199, 71, 228, 22, 73, 37, 16, 217, 45, 199, 71, 219, 211, 228, - 22, 73, 37, 16, 217, 45, 219, 211, 228, 22, 73, 37, 16, 217, 45, 209, - 105, 228, 22, 73, 37, 16, 223, 66, 199, 101, 228, 23, 73, 37, 16, 251, - 52, 199, 101, 228, 23, 73, 37, 16, 233, 79, 199, 68, 73, 37, 16, 233, 79, - 215, 222, 73, 37, 16, 233, 79, 237, 13, 73, 37, 16, 217, 45, 195, 165, - 228, 22, 73, 37, 16, 217, 45, 208, 180, 228, 22, 73, 37, 16, 217, 45, - 209, 105, 199, 71, 228, 22, 73, 37, 16, 230, 233, 215, 62, 251, 56, 73, - 37, 16, 230, 233, 215, 62, 236, 237, 73, 37, 16, 234, 101, 222, 103, 232, - 88, 195, 3, 73, 37, 16, 223, 176, 73, 37, 16, 223, 174, 73, 37, 16, 232, - 88, 251, 13, 237, 71, 228, 21, 73, 37, 16, 232, 88, 237, 28, 168, 73, 37, - 16, 232, 88, 237, 28, 214, 225, 73, 37, 16, 232, 88, 214, 219, 228, 22, - 73, 37, 16, 232, 88, 237, 28, 237, 44, 73, 37, 16, 232, 88, 202, 106, - 237, 27, 237, 44, 73, 37, 16, 232, 88, 237, 28, 222, 22, 73, 37, 16, 232, - 88, 237, 28, 191, 7, 73, 37, 16, 232, 88, 237, 28, 213, 220, 222, 43, 73, - 37, 16, 232, 88, 237, 28, 213, 220, 251, 93, 73, 37, 16, 232, 88, 217, - 98, 243, 52, 237, 13, 73, 37, 16, 232, 88, 217, 98, 243, 52, 215, 222, - 73, 37, 16, 233, 24, 202, 106, 243, 52, 195, 164, 73, 37, 16, 232, 88, - 202, 106, 243, 52, 200, 72, 73, 37, 16, 232, 88, 214, 101, 73, 37, 16, - 243, 53, 190, 230, 73, 37, 16, 243, 53, 221, 91, 73, 37, 16, 243, 53, - 201, 238, 73, 37, 16, 232, 88, 228, 74, 192, 37, 199, 72, 73, 37, 16, - 232, 88, 234, 102, 251, 82, 73, 37, 16, 192, 37, 197, 219, 73, 37, 16, - 237, 21, 197, 219, 73, 37, 16, 237, 21, 199, 72, 73, 37, 16, 237, 21, - 251, 58, 235, 39, 236, 166, 73, 37, 16, 237, 21, 215, 220, 199, 77, 236, - 166, 73, 37, 16, 237, 21, 237, 4, 233, 222, 236, 166, 73, 37, 16, 237, - 21, 197, 230, 211, 122, 236, 166, 73, 37, 16, 192, 37, 251, 58, 235, 39, - 236, 166, 73, 37, 16, 192, 37, 215, 220, 199, 77, 236, 166, 73, 37, 16, - 192, 37, 237, 4, 233, 222, 236, 166, 73, 37, 16, 192, 37, 197, 230, 211, - 122, 236, 166, 73, 37, 16, 231, 147, 237, 20, 73, 37, 16, 231, 147, 192, - 36, 73, 37, 16, 237, 29, 251, 58, 216, 58, 73, 37, 16, 237, 29, 251, 58, - 216, 202, 73, 37, 16, 237, 29, 236, 238, 73, 37, 16, 237, 29, 199, 18, - 73, 37, 16, 202, 181, 199, 18, 73, 37, 16, 202, 181, 199, 19, 236, 221, - 73, 37, 16, 202, 181, 199, 19, 197, 220, 73, 37, 16, 202, 181, 199, 19, - 199, 64, 73, 37, 16, 202, 181, 250, 228, 73, 37, 16, 202, 181, 250, 229, - 236, 221, 73, 37, 16, 202, 181, 250, 229, 197, 220, 73, 37, 16, 202, 181, - 250, 229, 199, 64, 73, 37, 16, 237, 5, 231, 128, 73, 37, 16, 237, 12, - 211, 19, 73, 37, 16, 201, 73, 73, 37, 16, 250, 253, 168, 73, 37, 16, 250, - 253, 195, 3, 73, 37, 16, 250, 253, 231, 240, 73, 37, 16, 250, 253, 237, - 44, 73, 37, 16, 250, 253, 222, 22, 73, 37, 16, 250, 253, 191, 7, 73, 37, - 16, 250, 253, 213, 219, 73, 37, 16, 221, 248, 214, 99, 216, 170, 73, 37, - 16, 221, 249, 214, 99, 216, 170, 73, 37, 16, 221, 248, 214, 99, 222, 43, - 73, 37, 16, 221, 249, 214, 99, 222, 43, 73, 37, 16, 221, 93, 222, 43, 73, - 37, 16, 230, 238, 214, 99, 222, 43, 37, 16, 202, 170, 249, 83, 37, 16, - 55, 249, 83, 37, 16, 53, 249, 83, 37, 16, 207, 19, 53, 249, 83, 37, 16, - 237, 214, 249, 83, 37, 16, 203, 40, 249, 83, 37, 16, 45, 207, 49, 56, 37, - 16, 50, 207, 49, 56, 37, 16, 207, 49, 236, 138, 37, 16, 238, 4, 205, 41, - 37, 16, 238, 33, 247, 108, 37, 16, 205, 41, 37, 16, 242, 92, 37, 16, 207, - 47, 233, 11, 37, 16, 207, 47, 233, 10, 37, 16, 207, 47, 233, 9, 37, 16, - 233, 34, 37, 16, 233, 35, 60, 37, 16, 248, 39, 77, 37, 16, 247, 150, 37, - 16, 248, 55, 37, 16, 248, 53, 37, 16, 211, 99, 201, 111, 37, 16, 197, 12, - 201, 111, 37, 16, 198, 220, 201, 111, 37, 16, 232, 127, 201, 111, 37, 16, - 232, 224, 201, 111, 37, 16, 202, 135, 201, 111, 37, 16, 202, 133, 232, - 105, 37, 16, 232, 125, 232, 105, 37, 16, 232, 52, 242, 235, 37, 16, 232, - 52, 242, 236, 211, 23, 251, 158, 37, 16, 232, 52, 242, 236, 211, 23, 249, - 66, 37, 16, 247, 194, 242, 235, 37, 16, 233, 176, 242, 235, 37, 16, 233, - 176, 242, 236, 211, 23, 251, 158, 37, 16, 233, 176, 242, 236, 211, 23, - 249, 66, 37, 16, 235, 95, 242, 234, 37, 16, 235, 95, 242, 233, 37, 16, - 215, 129, 216, 228, 207, 30, 37, 16, 55, 203, 126, 37, 16, 55, 232, 206, - 37, 16, 232, 207, 196, 77, 37, 16, 232, 207, 235, 123, 37, 16, 214, 206, - 196, 77, 37, 16, 214, 206, 235, 123, 37, 16, 203, 127, 196, 77, 37, 16, - 203, 127, 235, 123, 37, 16, 208, 23, 163, 203, 126, 37, 16, 208, 23, 163, - 232, 206, 37, 16, 242, 71, 198, 146, 37, 16, 238, 155, 198, 146, 37, 16, - 211, 23, 251, 158, 37, 16, 211, 23, 249, 66, 37, 16, 208, 3, 251, 158, - 37, 16, 208, 3, 249, 66, 37, 16, 215, 132, 207, 30, 37, 16, 193, 87, 207, - 30, 37, 16, 132, 207, 30, 37, 16, 208, 23, 207, 30, 37, 16, 234, 160, - 207, 30, 37, 16, 202, 129, 207, 30, 37, 16, 198, 246, 207, 30, 37, 16, - 202, 119, 207, 30, 37, 16, 91, 228, 141, 197, 30, 207, 30, 37, 16, 192, - 236, 213, 2, 37, 16, 108, 213, 2, 37, 16, 243, 11, 192, 236, 213, 2, 37, - 16, 51, 213, 3, 193, 89, 37, 16, 51, 213, 3, 248, 139, 37, 16, 197, 242, - 213, 3, 133, 193, 89, 37, 16, 197, 242, 213, 3, 133, 248, 139, 37, 16, - 197, 242, 213, 3, 45, 193, 89, 37, 16, 197, 242, 213, 3, 45, 248, 139, - 37, 16, 197, 242, 213, 3, 50, 193, 89, 37, 16, 197, 242, 213, 3, 50, 248, - 139, 37, 16, 197, 242, 213, 3, 144, 193, 89, 37, 16, 197, 242, 213, 3, - 144, 248, 139, 37, 16, 197, 242, 213, 3, 133, 50, 193, 89, 37, 16, 197, - 242, 213, 3, 133, 50, 248, 139, 37, 16, 215, 206, 213, 3, 193, 89, 37, - 16, 215, 206, 213, 3, 248, 139, 37, 16, 197, 239, 213, 3, 144, 193, 89, - 37, 16, 197, 239, 213, 3, 144, 248, 139, 37, 16, 210, 114, 213, 2, 37, - 16, 195, 17, 213, 2, 37, 16, 213, 3, 248, 139, 37, 16, 212, 139, 213, 2, - 37, 16, 242, 203, 213, 3, 193, 89, 37, 16, 242, 203, 213, 3, 248, 139, - 37, 16, 248, 36, 37, 16, 193, 87, 213, 6, 37, 16, 132, 213, 6, 37, 16, - 208, 23, 213, 6, 37, 16, 234, 160, 213, 6, 37, 16, 202, 129, 213, 6, 37, - 16, 198, 246, 213, 6, 37, 16, 202, 119, 213, 6, 37, 16, 91, 228, 141, - 197, 30, 213, 6, 37, 16, 33, 201, 80, 37, 16, 33, 201, 197, 201, 80, 37, + 245, 28, 41, 2, 27, 245, 27, 72, 1, 216, 38, 198, 77, 72, 1, 216, 38, + 198, 76, 72, 1, 216, 38, 198, 75, 72, 1, 216, 38, 198, 74, 72, 1, 216, + 38, 198, 72, 72, 1, 216, 38, 198, 71, 72, 1, 216, 38, 214, 213, 198, 78, + 72, 1, 216, 38, 214, 213, 198, 77, 72, 1, 216, 38, 214, 213, 198, 76, 72, + 1, 216, 38, 214, 213, 198, 75, 72, 1, 216, 38, 214, 213, 198, 74, 72, 1, + 216, 38, 214, 213, 198, 72, 72, 1, 216, 38, 214, 213, 198, 71, 72, 1, + 251, 16, 71, 229, 122, 1, 251, 16, 192, 80, 61, 1, 255, 208, 61, 1, 255, + 207, 61, 1, 255, 206, 61, 1, 255, 202, 61, 1, 228, 75, 61, 1, 228, 74, + 61, 1, 228, 73, 61, 1, 228, 72, 61, 1, 196, 231, 61, 1, 196, 230, 61, 1, + 196, 229, 61, 1, 196, 228, 61, 1, 196, 227, 61, 1, 235, 15, 61, 1, 235, + 14, 61, 1, 235, 13, 61, 1, 235, 12, 61, 1, 235, 11, 61, 1, 212, 16, 61, + 1, 212, 15, 61, 1, 212, 14, 61, 1, 222, 143, 61, 1, 222, 140, 61, 1, 222, + 139, 61, 1, 222, 138, 61, 1, 222, 137, 61, 1, 222, 136, 61, 1, 222, 135, + 61, 1, 222, 134, 61, 1, 222, 133, 61, 1, 222, 142, 61, 1, 222, 141, 61, + 1, 222, 132, 61, 1, 221, 167, 61, 1, 221, 166, 61, 1, 221, 165, 61, 1, + 221, 164, 61, 1, 221, 163, 61, 1, 221, 162, 61, 1, 221, 161, 61, 1, 221, + 160, 61, 1, 220, 233, 61, 1, 220, 232, 61, 1, 220, 231, 61, 1, 220, 230, + 61, 1, 220, 229, 61, 1, 220, 228, 61, 1, 220, 227, 61, 1, 222, 23, 61, 1, + 222, 22, 61, 1, 222, 21, 61, 1, 222, 20, 61, 1, 222, 19, 61, 1, 222, 18, + 61, 1, 221, 68, 61, 1, 221, 67, 61, 1, 221, 66, 61, 1, 221, 65, 61, 1, + 205, 207, 61, 1, 205, 206, 61, 1, 205, 205, 61, 1, 205, 204, 61, 1, 205, + 203, 61, 1, 205, 202, 61, 1, 205, 201, 61, 1, 205, 200, 61, 1, 202, 222, + 61, 1, 202, 221, 61, 1, 202, 220, 61, 1, 202, 219, 61, 1, 202, 218, 61, + 1, 202, 217, 61, 1, 201, 4, 61, 1, 201, 3, 61, 1, 201, 2, 61, 1, 201, 1, + 61, 1, 201, 0, 61, 1, 200, 255, 61, 1, 200, 254, 61, 1, 200, 253, 61, 1, + 205, 68, 61, 1, 205, 67, 61, 1, 205, 66, 61, 1, 205, 65, 61, 1, 205, 64, + 61, 1, 202, 46, 61, 1, 202, 45, 61, 1, 202, 44, 61, 1, 202, 43, 61, 1, + 202, 42, 61, 1, 202, 41, 61, 1, 202, 40, 61, 1, 199, 251, 61, 1, 199, + 250, 61, 1, 199, 249, 61, 1, 199, 248, 61, 1, 198, 192, 61, 1, 198, 191, + 61, 1, 198, 190, 61, 1, 198, 189, 61, 1, 198, 188, 61, 1, 198, 187, 61, + 1, 198, 186, 61, 1, 197, 93, 61, 1, 197, 92, 61, 1, 197, 91, 61, 1, 197, + 90, 61, 1, 197, 89, 61, 1, 199, 144, 61, 1, 199, 143, 61, 1, 199, 142, + 61, 1, 199, 141, 61, 1, 199, 140, 61, 1, 199, 139, 61, 1, 199, 138, 61, + 1, 199, 137, 61, 1, 199, 136, 61, 1, 198, 98, 61, 1, 198, 97, 61, 1, 198, + 96, 61, 1, 198, 95, 61, 1, 198, 94, 61, 1, 198, 93, 61, 1, 198, 92, 61, + 1, 215, 8, 61, 1, 215, 7, 61, 1, 215, 6, 61, 1, 215, 5, 61, 1, 215, 4, + 61, 1, 215, 3, 61, 1, 215, 2, 61, 1, 215, 1, 61, 1, 215, 0, 61, 1, 213, + 220, 61, 1, 213, 219, 61, 1, 213, 218, 61, 1, 213, 217, 61, 1, 213, 216, + 61, 1, 213, 215, 61, 1, 213, 214, 61, 1, 213, 213, 61, 1, 212, 179, 61, + 1, 212, 178, 61, 1, 212, 177, 61, 1, 214, 122, 61, 1, 214, 121, 61, 1, + 214, 120, 61, 1, 214, 119, 61, 1, 214, 118, 61, 1, 214, 117, 61, 1, 214, + 116, 61, 1, 213, 44, 61, 1, 213, 43, 61, 1, 213, 42, 61, 1, 213, 41, 61, + 1, 213, 40, 61, 1, 230, 106, 61, 1, 230, 103, 61, 1, 230, 102, 61, 1, + 230, 101, 61, 1, 230, 100, 61, 1, 230, 99, 61, 1, 230, 98, 61, 1, 230, + 97, 61, 1, 230, 96, 61, 1, 230, 105, 61, 1, 230, 104, 61, 1, 229, 159, + 61, 1, 229, 158, 61, 1, 229, 157, 61, 1, 229, 156, 61, 1, 229, 155, 61, + 1, 229, 154, 61, 1, 229, 153, 61, 1, 228, 160, 61, 1, 228, 159, 61, 1, + 228, 158, 61, 1, 229, 246, 61, 1, 229, 245, 61, 1, 229, 244, 61, 1, 229, + 243, 61, 1, 229, 242, 61, 1, 229, 241, 61, 1, 229, 240, 61, 1, 229, 24, + 61, 1, 229, 23, 61, 1, 229, 22, 61, 1, 229, 21, 61, 1, 229, 20, 61, 1, + 229, 19, 61, 1, 229, 18, 61, 1, 229, 17, 61, 1, 217, 161, 61, 1, 217, + 160, 61, 1, 217, 159, 61, 1, 217, 158, 61, 1, 217, 157, 61, 1, 217, 156, + 61, 1, 217, 155, 61, 1, 216, 101, 61, 1, 216, 100, 61, 1, 216, 99, 61, 1, + 216, 98, 61, 1, 216, 97, 61, 1, 216, 96, 61, 1, 216, 95, 61, 1, 215, 156, + 61, 1, 215, 155, 61, 1, 215, 154, 61, 1, 215, 153, 61, 1, 216, 233, 61, + 1, 216, 232, 61, 1, 216, 231, 61, 1, 216, 13, 61, 1, 216, 12, 61, 1, 216, + 11, 61, 1, 216, 10, 61, 1, 216, 9, 61, 1, 216, 8, 61, 1, 192, 148, 61, 1, + 192, 147, 61, 1, 192, 146, 61, 1, 192, 145, 61, 1, 192, 144, 61, 1, 192, + 141, 61, 1, 191, 224, 61, 1, 191, 223, 61, 1, 191, 222, 61, 1, 191, 221, + 61, 1, 192, 11, 61, 1, 192, 10, 61, 1, 192, 9, 61, 1, 192, 8, 61, 1, 192, + 7, 61, 1, 192, 6, 61, 1, 207, 187, 61, 1, 207, 186, 61, 1, 207, 185, 61, + 1, 207, 184, 61, 1, 207, 1, 61, 1, 207, 0, 61, 1, 206, 255, 61, 1, 206, + 254, 61, 1, 206, 253, 61, 1, 206, 252, 61, 1, 206, 251, 61, 1, 206, 68, + 61, 1, 206, 67, 61, 1, 206, 66, 61, 1, 206, 65, 61, 1, 206, 64, 61, 1, + 206, 63, 61, 1, 207, 114, 61, 1, 207, 113, 61, 1, 207, 112, 61, 1, 207, + 111, 61, 1, 206, 162, 61, 1, 206, 161, 61, 1, 206, 160, 61, 1, 206, 159, + 61, 1, 206, 158, 61, 1, 206, 157, 61, 1, 193, 189, 61, 1, 193, 188, 61, + 1, 193, 187, 61, 1, 193, 186, 61, 1, 193, 185, 61, 1, 193, 85, 61, 1, + 193, 84, 61, 1, 193, 83, 61, 1, 193, 82, 61, 1, 193, 81, 61, 1, 193, 124, + 61, 1, 193, 123, 61, 1, 193, 122, 61, 1, 193, 121, 61, 1, 193, 47, 61, 1, + 193, 46, 61, 1, 193, 45, 61, 1, 193, 44, 61, 1, 193, 43, 61, 1, 193, 42, + 61, 1, 193, 41, 61, 1, 215, 60, 61, 1, 215, 59, 229, 122, 1, 251, 16, + 193, 0, 72, 1, 251, 16, 192, 33, 72, 1, 251, 16, 192, 80, 72, 1, 251, 16, + 193, 0, 229, 122, 1, 2, 221, 69, 229, 122, 1, 2, 193, 86, 229, 122, 1, 2, + 193, 125, 229, 122, 1, 2, 193, 48, 72, 1, 2, 221, 69, 72, 1, 2, 193, 86, + 72, 1, 2, 193, 125, 72, 1, 2, 193, 48, 72, 1, 2, 215, 63, 46, 245, 26, + 46, 245, 25, 46, 245, 24, 46, 245, 23, 46, 245, 22, 46, 245, 21, 46, 245, + 20, 46, 245, 19, 46, 245, 18, 46, 245, 17, 46, 245, 16, 46, 245, 15, 46, + 245, 14, 46, 245, 13, 46, 245, 12, 46, 245, 11, 46, 245, 10, 46, 245, 9, + 46, 245, 8, 46, 245, 7, 46, 245, 6, 46, 245, 5, 46, 245, 4, 46, 245, 3, + 46, 245, 2, 46, 245, 1, 46, 245, 0, 46, 244, 255, 46, 244, 254, 46, 244, + 253, 46, 244, 252, 46, 244, 251, 46, 244, 250, 46, 244, 249, 46, 244, + 248, 46, 244, 247, 46, 244, 246, 46, 244, 245, 46, 244, 244, 46, 244, + 243, 46, 244, 242, 46, 244, 241, 46, 244, 240, 46, 244, 239, 46, 244, + 238, 46, 244, 237, 46, 244, 236, 46, 244, 235, 46, 244, 234, 46, 244, + 233, 46, 244, 232, 46, 244, 231, 46, 244, 230, 46, 244, 229, 46, 244, + 228, 46, 244, 227, 46, 244, 226, 46, 244, 225, 46, 244, 224, 46, 244, + 223, 46, 244, 222, 46, 244, 221, 46, 244, 220, 46, 244, 219, 46, 244, + 218, 46, 244, 217, 46, 244, 216, 46, 244, 215, 46, 244, 214, 46, 244, + 213, 46, 244, 212, 46, 244, 211, 46, 244, 210, 46, 244, 209, 46, 244, + 208, 46, 244, 207, 46, 244, 206, 46, 244, 205, 46, 244, 204, 46, 244, + 203, 46, 244, 202, 46, 244, 201, 46, 244, 200, 46, 244, 199, 46, 244, + 198, 46, 244, 197, 46, 244, 196, 46, 244, 195, 46, 244, 194, 46, 244, + 193, 46, 244, 192, 46, 244, 191, 46, 244, 190, 46, 244, 189, 46, 244, + 188, 46, 244, 187, 46, 244, 186, 46, 244, 185, 46, 244, 184, 46, 244, + 183, 46, 244, 182, 46, 244, 181, 46, 244, 180, 46, 244, 179, 46, 244, + 178, 46, 244, 177, 46, 244, 176, 46, 244, 175, 46, 244, 174, 46, 244, + 173, 46, 244, 172, 46, 244, 171, 46, 244, 170, 46, 244, 169, 46, 244, + 168, 46, 244, 167, 46, 244, 166, 46, 244, 165, 46, 244, 164, 46, 244, + 163, 46, 244, 162, 46, 244, 161, 46, 244, 160, 46, 244, 159, 46, 244, + 158, 46, 244, 157, 46, 244, 156, 46, 244, 155, 46, 244, 154, 46, 244, + 153, 46, 244, 152, 46, 244, 151, 46, 244, 150, 46, 244, 149, 46, 244, + 148, 46, 244, 147, 46, 244, 146, 46, 244, 145, 46, 244, 144, 46, 244, + 143, 46, 244, 142, 46, 244, 141, 46, 244, 140, 46, 244, 139, 46, 244, + 138, 46, 244, 137, 46, 244, 136, 46, 244, 135, 46, 244, 134, 46, 244, + 133, 46, 244, 132, 46, 244, 131, 46, 244, 130, 46, 244, 129, 46, 244, + 128, 46, 244, 127, 46, 244, 126, 46, 244, 125, 46, 244, 124, 46, 244, + 123, 46, 244, 122, 46, 244, 121, 46, 244, 120, 46, 244, 119, 46, 244, + 118, 46, 244, 117, 46, 244, 116, 46, 244, 115, 46, 244, 114, 46, 244, + 113, 46, 244, 112, 46, 244, 111, 46, 244, 110, 46, 244, 109, 46, 244, + 108, 46, 244, 107, 46, 244, 106, 46, 244, 105, 46, 244, 104, 46, 244, + 103, 46, 244, 102, 46, 244, 101, 46, 244, 100, 46, 244, 99, 46, 244, 98, + 46, 244, 97, 46, 244, 96, 46, 244, 95, 46, 244, 94, 46, 244, 93, 46, 244, + 92, 46, 244, 91, 46, 244, 90, 46, 244, 89, 46, 244, 88, 46, 244, 87, 46, + 244, 86, 46, 244, 85, 46, 244, 84, 46, 244, 83, 46, 244, 82, 46, 244, 81, + 46, 244, 80, 46, 244, 79, 46, 244, 78, 46, 244, 77, 46, 244, 76, 46, 244, + 75, 46, 244, 74, 46, 244, 73, 46, 244, 72, 46, 244, 71, 46, 244, 70, 46, + 244, 69, 46, 244, 68, 46, 244, 67, 46, 244, 66, 46, 244, 65, 46, 244, 64, + 46, 244, 63, 46, 244, 62, 46, 244, 61, 46, 244, 60, 46, 244, 59, 46, 244, + 58, 46, 244, 57, 46, 244, 56, 46, 244, 55, 46, 244, 54, 46, 244, 53, 46, + 244, 52, 46, 244, 51, 46, 244, 50, 46, 244, 49, 46, 244, 48, 46, 244, 47, + 46, 244, 46, 46, 244, 45, 46, 244, 44, 46, 244, 43, 46, 244, 42, 46, 244, + 41, 46, 244, 40, 46, 244, 39, 46, 244, 38, 46, 244, 37, 46, 244, 36, 46, + 244, 35, 46, 244, 34, 46, 244, 33, 46, 244, 32, 46, 244, 31, 46, 244, 30, + 46, 244, 29, 46, 244, 28, 46, 244, 27, 46, 244, 26, 46, 244, 25, 46, 244, + 24, 46, 244, 23, 46, 244, 22, 46, 244, 21, 46, 244, 20, 46, 244, 19, 46, + 244, 18, 46, 244, 17, 46, 244, 16, 46, 244, 15, 46, 244, 14, 46, 244, 13, + 46, 244, 12, 46, 244, 11, 46, 244, 10, 46, 244, 9, 46, 244, 8, 46, 244, + 7, 46, 244, 6, 46, 244, 5, 46, 244, 4, 46, 244, 3, 46, 244, 2, 46, 244, + 1, 46, 244, 0, 46, 243, 255, 46, 243, 254, 46, 243, 253, 46, 243, 252, + 46, 243, 251, 46, 243, 250, 46, 243, 249, 46, 243, 248, 46, 243, 247, 46, + 243, 246, 46, 243, 245, 46, 243, 244, 46, 243, 243, 46, 243, 242, 46, + 243, 241, 46, 243, 240, 46, 243, 239, 46, 243, 238, 46, 243, 237, 46, + 243, 236, 46, 243, 235, 46, 243, 234, 46, 243, 233, 46, 243, 232, 46, + 243, 231, 46, 243, 230, 46, 243, 229, 46, 243, 228, 46, 243, 227, 46, + 243, 226, 46, 243, 225, 46, 243, 224, 46, 243, 223, 46, 243, 222, 46, + 243, 221, 46, 243, 220, 46, 243, 219, 46, 243, 218, 46, 243, 217, 46, + 243, 216, 46, 243, 215, 46, 243, 214, 46, 243, 213, 46, 243, 212, 46, + 243, 211, 46, 243, 210, 46, 243, 209, 46, 243, 208, 46, 243, 207, 46, + 243, 206, 46, 243, 205, 46, 243, 204, 46, 243, 203, 46, 243, 202, 46, + 243, 201, 46, 243, 200, 46, 243, 199, 46, 243, 198, 46, 243, 197, 46, + 243, 196, 46, 243, 195, 46, 243, 194, 46, 243, 193, 46, 243, 192, 46, + 243, 191, 46, 243, 190, 46, 243, 189, 46, 243, 188, 46, 243, 187, 46, + 243, 186, 46, 243, 185, 46, 243, 184, 46, 243, 183, 46, 243, 182, 46, + 243, 181, 46, 243, 180, 46, 243, 179, 46, 243, 178, 46, 243, 177, 46, + 243, 176, 46, 243, 175, 46, 243, 174, 46, 243, 173, 46, 243, 172, 46, + 243, 171, 46, 243, 170, 46, 243, 169, 46, 243, 168, 46, 243, 167, 46, + 243, 166, 46, 243, 165, 46, 243, 164, 46, 243, 163, 46, 243, 162, 46, + 243, 161, 46, 243, 160, 46, 243, 159, 46, 243, 158, 46, 243, 157, 46, + 243, 156, 46, 243, 155, 46, 243, 154, 46, 243, 153, 46, 243, 152, 46, + 243, 151, 46, 243, 150, 46, 243, 149, 46, 243, 148, 46, 243, 147, 46, + 243, 146, 46, 243, 145, 46, 243, 144, 46, 243, 143, 124, 1, 230, 118, + 124, 1, 192, 235, 124, 1, 210, 238, 124, 1, 200, 43, 124, 1, 233, 177, + 124, 1, 222, 154, 124, 1, 172, 124, 1, 250, 122, 124, 1, 238, 129, 124, + 1, 196, 12, 124, 1, 232, 53, 124, 1, 146, 124, 1, 210, 239, 215, 63, 124, + 1, 238, 130, 206, 9, 124, 1, 233, 178, 215, 63, 124, 1, 222, 155, 218, + 170, 124, 1, 207, 224, 206, 9, 124, 1, 199, 51, 124, 1, 202, 83, 237, 71, + 124, 1, 237, 71, 124, 1, 221, 104, 124, 1, 202, 83, 223, 37, 124, 1, 229, + 114, 124, 1, 219, 162, 124, 1, 207, 8, 124, 1, 218, 170, 124, 1, 215, 63, + 124, 1, 223, 37, 124, 1, 206, 9, 124, 1, 218, 171, 215, 63, 124, 1, 215, + 64, 218, 170, 124, 1, 223, 38, 218, 170, 124, 1, 206, 10, 223, 37, 124, + 1, 218, 171, 4, 236, 142, 124, 1, 215, 64, 4, 236, 142, 124, 1, 223, 38, + 4, 236, 142, 124, 1, 223, 38, 4, 185, 223, 120, 23, 58, 124, 1, 206, 10, + 4, 236, 142, 124, 1, 206, 10, 4, 75, 60, 124, 1, 218, 171, 206, 9, 124, + 1, 215, 64, 206, 9, 124, 1, 223, 38, 206, 9, 124, 1, 206, 10, 206, 9, + 124, 1, 218, 171, 215, 64, 206, 9, 124, 1, 215, 64, 218, 171, 206, 9, + 124, 1, 223, 38, 218, 171, 206, 9, 124, 1, 206, 10, 223, 38, 206, 9, 124, + 1, 223, 38, 206, 10, 4, 236, 142, 124, 1, 223, 38, 215, 63, 124, 1, 223, + 38, 215, 64, 206, 9, 124, 1, 206, 10, 200, 43, 124, 1, 206, 10, 200, 44, + 146, 124, 1, 206, 10, 210, 238, 124, 1, 206, 10, 210, 239, 146, 124, 1, + 200, 44, 206, 9, 124, 1, 200, 44, 207, 224, 206, 9, 124, 1, 193, 224, + 124, 1, 193, 97, 124, 1, 193, 225, 146, 124, 1, 206, 10, 215, 63, 124, 1, + 206, 10, 218, 170, 124, 1, 222, 155, 207, 224, 206, 9, 124, 1, 232, 54, + 207, 224, 206, 9, 124, 1, 206, 10, 222, 154, 124, 1, 206, 10, 222, 155, + 146, 124, 1, 65, 124, 1, 202, 83, 210, 252, 124, 1, 211, 184, 124, 1, 74, + 124, 1, 251, 68, 124, 1, 68, 124, 1, 71, 124, 1, 223, 228, 124, 1, 203, + 41, 68, 124, 1, 196, 139, 124, 1, 234, 190, 124, 1, 202, 83, 234, 175, + 124, 1, 206, 136, 68, 124, 1, 202, 83, 234, 190, 124, 1, 180, 68, 124, 1, + 192, 80, 124, 1, 66, 124, 1, 233, 244, 124, 1, 192, 182, 124, 1, 126, + 215, 63, 124, 1, 180, 66, 124, 1, 206, 136, 66, 124, 1, 196, 141, 124, 1, + 202, 83, 66, 124, 1, 211, 86, 124, 1, 210, 252, 124, 1, 211, 21, 124, 1, + 193, 190, 124, 1, 193, 48, 124, 1, 193, 86, 124, 1, 193, 112, 124, 1, + 193, 14, 124, 1, 214, 216, 66, 124, 1, 214, 216, 74, 124, 1, 214, 216, + 68, 124, 1, 214, 216, 65, 124, 1, 210, 2, 251, 134, 124, 1, 210, 2, 251, + 151, 124, 1, 202, 83, 234, 105, 124, 1, 202, 83, 251, 134, 124, 1, 202, + 83, 211, 106, 124, 1, 117, 218, 170, 124, 252, 6, 45, 228, 243, 205, 59, + 124, 252, 6, 216, 89, 228, 243, 205, 59, 124, 252, 6, 50, 228, 243, 205, + 59, 124, 252, 6, 130, 81, 205, 59, 124, 252, 6, 216, 89, 81, 205, 59, + 124, 252, 6, 137, 81, 205, 59, 124, 252, 6, 250, 172, 205, 59, 124, 252, + 6, 250, 172, 219, 217, 205, 59, 124, 252, 6, 250, 172, 199, 188, 124, + 252, 6, 250, 172, 199, 215, 124, 252, 6, 250, 172, 235, 17, 102, 124, + 252, 6, 250, 172, 228, 76, 102, 124, 252, 6, 250, 172, 199, 189, 102, + 124, 252, 6, 137, 252, 48, 124, 252, 6, 137, 198, 172, 252, 48, 124, 252, + 6, 137, 230, 212, 124, 252, 6, 137, 180, 230, 212, 124, 252, 6, 137, 236, + 142, 124, 252, 6, 137, 243, 12, 124, 252, 6, 137, 219, 114, 124, 252, 6, + 137, 193, 138, 124, 252, 6, 137, 195, 135, 124, 252, 6, 130, 252, 48, + 124, 252, 6, 130, 198, 172, 252, 48, 124, 252, 6, 130, 230, 212, 124, + 252, 6, 130, 180, 230, 212, 124, 252, 6, 130, 236, 142, 124, 252, 6, 130, + 243, 12, 124, 252, 6, 130, 219, 114, 124, 252, 6, 130, 193, 138, 124, + 252, 6, 130, 195, 135, 124, 252, 6, 130, 57, 124, 3, 187, 4, 238, 219, + 124, 199, 9, 1, 205, 35, 124, 55, 77, 124, 208, 154, 243, 80, 232, 82, + 201, 64, 203, 28, 232, 147, 1, 211, 4, 203, 28, 232, 147, 239, 30, 211, + 4, 203, 28, 232, 147, 144, 201, 79, 203, 28, 232, 147, 133, 201, 79, 97, + 33, 87, 230, 242, 213, 161, 206, 10, 220, 253, 211, 107, 219, 226, 97, + 33, 87, 213, 161, 206, 10, 220, 253, 211, 107, 219, 226, 97, 33, 87, 197, + 162, 211, 107, 219, 226, 97, 33, 87, 230, 242, 213, 161, 211, 107, 219, + 226, 97, 33, 87, 213, 161, 211, 107, 219, 226, 97, 33, 87, 201, 180, 211, + 107, 219, 226, 97, 33, 87, 217, 96, 209, 5, 211, 107, 219, 226, 97, 33, + 87, 209, 5, 211, 107, 219, 226, 97, 33, 87, 193, 231, 211, 107, 219, 226, + 97, 33, 87, 217, 96, 209, 5, 206, 10, 221, 183, 211, 107, 219, 226, 97, + 33, 87, 209, 5, 206, 10, 221, 183, 211, 107, 219, 226, 97, 33, 87, 193, + 231, 206, 10, 221, 183, 211, 107, 219, 226, 97, 33, 87, 230, 242, 213, + 161, 206, 10, 220, 253, 211, 107, 179, 97, 33, 87, 213, 161, 206, 10, + 220, 253, 211, 107, 179, 97, 33, 87, 197, 162, 211, 107, 179, 97, 33, 87, + 230, 242, 213, 161, 211, 107, 179, 97, 33, 87, 213, 161, 211, 107, 179, + 97, 33, 87, 201, 180, 211, 107, 179, 97, 33, 87, 217, 96, 209, 5, 211, + 107, 179, 97, 33, 87, 209, 5, 211, 107, 179, 97, 33, 87, 193, 231, 211, + 107, 179, 97, 33, 87, 217, 96, 209, 5, 206, 10, 221, 183, 211, 107, 179, + 97, 33, 87, 209, 5, 206, 10, 221, 183, 211, 107, 179, 97, 33, 87, 193, + 231, 206, 10, 221, 183, 211, 107, 179, 97, 33, 87, 197, 162, 206, 10, + 220, 252, 97, 33, 87, 217, 96, 209, 5, 206, 10, 220, 252, 97, 33, 87, + 201, 50, 217, 96, 209, 4, 97, 33, 87, 209, 5, 206, 10, 220, 252, 97, 33, + 87, 209, 5, 201, 49, 97, 33, 87, 193, 231, 206, 10, 220, 252, 97, 33, 87, + 217, 96, 209, 5, 201, 49, 97, 33, 87, 230, 242, 193, 230, 97, 33, 87, + 191, 83, 97, 33, 87, 211, 106, 97, 33, 87, 207, 126, 97, 33, 87, 198, + 157, 97, 33, 87, 248, 85, 97, 33, 87, 196, 156, 97, 33, 87, 209, 67, 97, + 33, 87, 219, 23, 97, 33, 87, 220, 202, 97, 33, 87, 222, 117, 97, 33, 87, + 191, 74, 97, 33, 87, 202, 106, 97, 33, 87, 207, 119, 97, 33, 87, 220, + 255, 211, 107, 219, 226, 97, 33, 198, 80, 207, 139, 87, 215, 164, 97, 33, + 198, 80, 207, 139, 87, 200, 153, 97, 33, 198, 80, 207, 139, 87, 197, 246, + 97, 33, 87, 191, 120, 97, 33, 87, 237, 107, 191, 120, 97, 33, 87, 211, + 27, 97, 33, 87, 209, 69, 97, 33, 87, 209, 70, 4, 81, 106, 97, 33, 87, + 243, 136, 97, 33, 87, 243, 137, 209, 47, 97, 33, 87, 211, 176, 97, 33, + 87, 202, 11, 212, 251, 97, 33, 87, 198, 89, 97, 33, 87, 235, 50, 97, 33, + 250, 171, 81, 211, 111, 97, 33, 87, 238, 165, 211, 111, 97, 33, 87, 220, + 254, 97, 33, 110, 198, 80, 207, 139, 223, 146, 97, 208, 205, 52, 219, + 169, 97, 208, 205, 52, 219, 168, 97, 208, 205, 52, 236, 235, 232, 197, + 97, 208, 205, 52, 220, 254, 97, 208, 205, 52, 206, 145, 97, 161, 221, 2, + 97, 161, 221, 3, 198, 156, 97, 161, 210, 124, 97, 161, 235, 58, 196, 13, + 243, 115, 97, 161, 221, 92, 97, 161, 191, 105, 97, 161, 201, 62, 97, 161, + 201, 63, 206, 10, 211, 165, 97, 161, 210, 12, 97, 161, 210, 13, 214, 98, + 97, 161, 201, 63, 4, 202, 11, 212, 251, 97, 161, 243, 114, 97, 161, 210, + 188, 97, 161, 191, 103, 97, 161, 230, 250, 248, 84, 97, 161, 230, 250, + 198, 156, 97, 161, 230, 250, 215, 162, 97, 161, 230, 250, 200, 152, 97, + 161, 230, 250, 197, 245, 97, 161, 194, 253, 208, 185, 97, 161, 194, 253, + 215, 165, 97, 161, 194, 253, 200, 154, 97, 161, 194, 253, 197, 247, 97, + 161, 194, 253, 221, 87, 208, 185, 97, 161, 194, 253, 221, 87, 215, 165, + 97, 161, 194, 253, 221, 87, 200, 154, 97, 161, 194, 253, 221, 87, 197, + 247, 97, 161, 55, 191, 103, 97, 161, 207, 19, 243, 114, 97, 161, 237, 93, + 97, 161, 221, 209, 97, 161, 243, 136, 97, 161, 209, 69, 97, 161, 202, + 114, 215, 165, 97, 161, 202, 114, 200, 154, 97, 161, 202, 114, 197, 247, + 97, 161, 202, 114, 198, 157, 97, 161, 237, 107, 221, 92, 97, 161, 202, + 114, 221, 87, 200, 154, 97, 161, 202, 114, 221, 91, 97, 161, 202, 114, + 221, 87, 198, 157, 97, 161, 202, 114, 235, 55, 208, 185, 97, 161, 202, + 114, 235, 55, 200, 154, 97, 161, 202, 114, 235, 55, 214, 98, 97, 161, + 202, 114, 235, 55, 221, 86, 97, 161, 202, 73, 97, 161, 202, 74, 206, 10, + 191, 101, 97, 161, 202, 74, 191, 110, 97, 161, 202, 74, 206, 10, 220, + 252, 97, 161, 220, 254, 97, 161, 206, 145, 97, 161, 232, 230, 97, 161, + 221, 61, 97, 161, 191, 8, 97, 161, 201, 91, 97, 161, 201, 92, 206, 10, + 191, 101, 97, 161, 201, 92, 206, 10, 220, 252, 97, 161, 201, 92, 206, 10, + 191, 102, 228, 76, 220, 252, 97, 161, 201, 92, 206, 10, 220, 253, 228, + 76, 191, 101, 97, 161, 201, 92, 191, 111, 97, 161, 201, 92, 191, 112, + 206, 10, 191, 101, 97, 161, 201, 92, 206, 10, 206, 144, 97, 161, 201, 92, + 206, 10, 235, 49, 191, 100, 97, 161, 201, 92, 206, 10, 191, 102, 228, 76, + 209, 68, 97, 161, 209, 49, 97, 161, 201, 92, 214, 98, 97, 161, 201, 41, + 208, 185, 97, 161, 201, 41, 215, 163, 97, 161, 201, 41, 220, 251, 97, + 161, 201, 41, 209, 45, 97, 161, 201, 41, 209, 7, 97, 161, 201, 41, 214, + 98, 97, 161, 201, 41, 221, 89, 97, 161, 201, 41, 221, 91, 97, 161, 201, + 41, 198, 158, 208, 132, 97, 161, 201, 41, 235, 54, 97, 161, 201, 41, 235, + 53, 97, 161, 201, 41, 235, 51, 97, 161, 201, 41, 235, 55, 221, 86, 97, + 161, 201, 41, 235, 52, 221, 86, 97, 161, 201, 41, 230, 197, 4, 202, 171, + 191, 103, 97, 161, 201, 41, 230, 193, 4, 202, 171, 191, 103, 97, 161, + 201, 41, 230, 196, 97, 161, 201, 41, 230, 192, 97, 161, 201, 41, 230, + 193, 4, 55, 191, 103, 97, 161, 201, 41, 230, 194, 97, 161, 201, 41, 230, + 195, 209, 7, 97, 161, 216, 223, 97, 161, 216, 224, 209, 6, 97, 161, 216, + 224, 221, 85, 97, 161, 216, 224, 221, 88, 97, 161, 216, 224, 221, 90, 97, + 161, 201, 41, 197, 174, 97, 161, 201, 41, 197, 173, 97, 161, 201, 41, + 197, 172, 97, 161, 211, 33, 97, 161, 211, 34, 200, 154, 97, 161, 211, 34, + 197, 247, 97, 161, 211, 34, 221, 1, 200, 154, 97, 161, 211, 34, 221, 87, + 200, 154, 97, 161, 211, 34, 221, 87, 214, 98, 97, 161, 201, 41, 221, 0, + 97, 161, 201, 41, 221, 1, 209, 7, 97, 161, 201, 41, 221, 1, 230, 197, 4, + 202, 171, 191, 103, 97, 161, 201, 41, 221, 1, 230, 193, 4, 202, 171, 191, + 103, 97, 161, 201, 41, 221, 1, 230, 196, 97, 161, 201, 41, 221, 1, 230, + 192, 97, 161, 201, 41, 221, 1, 230, 193, 4, 55, 191, 103, 97, 161, 201, + 41, 221, 1, 230, 194, 97, 161, 201, 41, 221, 1, 230, 195, 209, 7, 97, + 161, 201, 41, 221, 1, 197, 175, 97, 161, 220, 216, 97, 161, 211, 175, 97, + 161, 235, 86, 97, 161, 214, 105, 97, 161, 210, 81, 73, 37, 16, 208, 171, + 73, 37, 16, 237, 219, 73, 37, 16, 210, 6, 73, 37, 16, 210, 248, 234, 146, + 73, 37, 16, 210, 248, 236, 240, 73, 37, 16, 195, 172, 234, 146, 73, 37, + 16, 195, 172, 236, 240, 73, 37, 16, 222, 46, 73, 37, 16, 200, 60, 73, 37, + 16, 210, 122, 73, 37, 16, 191, 231, 73, 37, 16, 191, 232, 236, 240, 73, + 37, 16, 221, 5, 73, 37, 16, 251, 63, 234, 146, 73, 37, 16, 233, 212, 234, + 146, 73, 37, 16, 199, 108, 73, 37, 16, 221, 249, 73, 37, 16, 251, 52, 73, + 37, 16, 251, 53, 236, 240, 73, 37, 16, 200, 67, 73, 37, 16, 198, 244, 73, + 37, 16, 211, 118, 251, 14, 73, 37, 16, 230, 240, 251, 14, 73, 37, 16, + 208, 170, 73, 37, 16, 246, 250, 73, 37, 16, 195, 161, 73, 37, 16, 223, + 60, 251, 14, 73, 37, 16, 221, 251, 251, 14, 73, 37, 16, 221, 250, 251, + 14, 73, 37, 16, 205, 106, 73, 37, 16, 210, 112, 73, 37, 16, 201, 89, 251, + 56, 73, 37, 16, 210, 247, 251, 14, 73, 37, 16, 195, 171, 251, 14, 73, 37, + 16, 251, 57, 251, 14, 73, 37, 16, 251, 50, 73, 37, 16, 221, 94, 73, 37, + 16, 207, 15, 73, 37, 16, 209, 185, 251, 14, 73, 37, 16, 198, 142, 73, 37, + 16, 251, 130, 73, 37, 16, 205, 38, 73, 37, 16, 200, 71, 251, 14, 73, 37, + 16, 200, 71, 216, 168, 201, 87, 73, 37, 16, 210, 242, 251, 14, 73, 37, + 16, 199, 27, 73, 37, 16, 219, 204, 73, 37, 16, 235, 40, 73, 37, 16, 197, + 243, 73, 37, 16, 199, 76, 73, 37, 16, 221, 8, 73, 37, 16, 251, 63, 233, + 212, 214, 100, 73, 37, 16, 232, 90, 251, 14, 73, 37, 16, 223, 177, 73, + 37, 16, 197, 210, 251, 14, 73, 37, 16, 222, 49, 197, 209, 73, 37, 16, + 210, 38, 73, 37, 16, 208, 175, 73, 37, 16, 221, 44, 73, 37, 16, 243, 62, + 251, 14, 73, 37, 16, 207, 137, 73, 37, 16, 210, 126, 251, 14, 73, 37, 16, + 210, 123, 251, 14, 73, 37, 16, 228, 26, 73, 37, 16, 214, 227, 73, 37, 16, + 209, 240, 73, 37, 16, 221, 45, 251, 169, 73, 37, 16, 197, 210, 251, 169, + 73, 37, 16, 201, 56, 73, 37, 16, 230, 191, 73, 37, 16, 223, 60, 214, 100, + 73, 37, 16, 211, 118, 214, 100, 73, 37, 16, 210, 248, 214, 100, 73, 37, + 16, 209, 239, 73, 37, 16, 221, 28, 73, 37, 16, 209, 238, 73, 37, 16, 221, + 7, 73, 37, 16, 210, 39, 214, 100, 73, 37, 16, 221, 250, 214, 101, 251, + 95, 73, 37, 16, 221, 251, 214, 101, 251, 95, 73, 37, 16, 191, 229, 73, + 37, 16, 251, 53, 214, 100, 73, 37, 16, 251, 54, 200, 68, 214, 100, 73, + 37, 16, 191, 230, 73, 37, 16, 221, 6, 73, 37, 16, 234, 141, 73, 37, 16, + 246, 251, 73, 37, 16, 216, 59, 223, 59, 73, 37, 16, 195, 172, 214, 100, + 73, 37, 16, 209, 185, 214, 100, 73, 37, 16, 208, 176, 214, 100, 73, 37, + 16, 211, 114, 73, 37, 16, 251, 82, 73, 37, 16, 218, 181, 73, 37, 16, 210, + 123, 214, 100, 73, 37, 16, 210, 126, 214, 100, 73, 37, 16, 233, 251, 210, + 125, 73, 37, 16, 220, 149, 73, 37, 16, 251, 83, 73, 37, 16, 197, 210, + 214, 100, 73, 37, 16, 234, 144, 73, 37, 16, 200, 71, 214, 100, 73, 37, + 16, 200, 61, 73, 37, 16, 243, 62, 214, 100, 73, 37, 16, 234, 55, 73, 37, + 16, 205, 39, 214, 100, 73, 37, 16, 192, 199, 221, 94, 73, 37, 16, 197, + 207, 73, 37, 16, 208, 177, 73, 37, 16, 197, 211, 73, 37, 16, 197, 208, + 73, 37, 16, 208, 174, 73, 37, 16, 197, 206, 73, 37, 16, 208, 173, 73, 37, + 16, 230, 239, 73, 37, 16, 251, 6, 73, 37, 16, 233, 251, 251, 6, 73, 37, + 16, 210, 242, 214, 100, 73, 37, 16, 199, 26, 234, 8, 73, 37, 16, 199, 26, + 233, 211, 73, 37, 16, 199, 28, 251, 58, 73, 37, 16, 199, 20, 222, 105, + 251, 49, 73, 37, 16, 222, 48, 73, 37, 16, 234, 92, 73, 37, 16, 192, 38, + 222, 45, 73, 37, 16, 192, 38, 251, 95, 73, 37, 16, 201, 88, 73, 37, 16, + 221, 95, 251, 95, 73, 37, 16, 236, 241, 251, 14, 73, 37, 16, 221, 9, 251, + 14, 73, 37, 16, 221, 9, 251, 169, 73, 37, 16, 221, 9, 214, 100, 73, 37, + 16, 251, 57, 214, 100, 73, 37, 16, 251, 59, 73, 37, 16, 236, 240, 73, 37, + 16, 197, 223, 73, 37, 16, 199, 66, 73, 37, 16, 221, 32, 73, 37, 16, 219, + 209, 234, 85, 243, 52, 73, 37, 16, 219, 209, 235, 41, 243, 53, 73, 37, + 16, 219, 209, 197, 226, 243, 53, 73, 37, 16, 219, 209, 199, 78, 243, 53, + 73, 37, 16, 219, 209, 223, 172, 243, 52, 73, 37, 16, 230, 240, 214, 101, + 251, 95, 73, 37, 16, 230, 240, 210, 113, 251, 2, 73, 37, 16, 230, 240, + 210, 113, 237, 75, 73, 37, 16, 237, 9, 73, 37, 16, 237, 10, 210, 113, + 251, 3, 222, 45, 73, 37, 16, 237, 10, 210, 113, 251, 3, 251, 95, 73, 37, + 16, 237, 10, 210, 113, 237, 75, 73, 37, 16, 197, 232, 73, 37, 16, 251, 7, + 73, 37, 16, 223, 179, 73, 37, 16, 237, 32, 73, 37, 16, 251, 249, 209, 53, + 251, 8, 73, 37, 16, 251, 249, 251, 5, 73, 37, 16, 251, 249, 251, 8, 73, + 37, 16, 251, 249, 216, 162, 73, 37, 16, 251, 249, 216, 173, 73, 37, 16, + 251, 249, 230, 241, 73, 37, 16, 251, 249, 230, 238, 73, 37, 16, 251, 249, + 209, 53, 230, 241, 73, 37, 16, 217, 47, 208, 183, 228, 24, 73, 37, 16, + 217, 47, 251, 171, 208, 183, 228, 24, 73, 37, 16, 217, 47, 237, 74, 228, + 24, 73, 37, 16, 217, 47, 251, 171, 237, 74, 228, 24, 73, 37, 16, 217, 47, + 197, 218, 228, 24, 73, 37, 16, 217, 47, 197, 233, 73, 37, 16, 217, 47, + 199, 71, 228, 24, 73, 37, 16, 217, 47, 199, 71, 219, 213, 228, 24, 73, + 37, 16, 217, 47, 219, 213, 228, 24, 73, 37, 16, 217, 47, 209, 107, 228, + 24, 73, 37, 16, 223, 68, 199, 101, 228, 25, 73, 37, 16, 251, 54, 199, + 101, 228, 25, 73, 37, 16, 233, 81, 199, 68, 73, 37, 16, 233, 81, 215, + 224, 73, 37, 16, 233, 81, 237, 15, 73, 37, 16, 217, 47, 195, 165, 228, + 24, 73, 37, 16, 217, 47, 208, 182, 228, 24, 73, 37, 16, 217, 47, 209, + 107, 199, 71, 228, 24, 73, 37, 16, 230, 235, 215, 64, 251, 58, 73, 37, + 16, 230, 235, 215, 64, 236, 239, 73, 37, 16, 234, 103, 222, 105, 232, 90, + 195, 3, 73, 37, 16, 223, 178, 73, 37, 16, 223, 176, 73, 37, 16, 232, 90, + 251, 15, 237, 73, 228, 23, 73, 37, 16, 232, 90, 237, 30, 168, 73, 37, 16, + 232, 90, 237, 30, 214, 227, 73, 37, 16, 232, 90, 214, 221, 228, 24, 73, + 37, 16, 232, 90, 237, 30, 237, 46, 73, 37, 16, 232, 90, 202, 107, 237, + 29, 237, 46, 73, 37, 16, 232, 90, 237, 30, 222, 24, 73, 37, 16, 232, 90, + 237, 30, 191, 7, 73, 37, 16, 232, 90, 237, 30, 213, 222, 222, 45, 73, 37, + 16, 232, 90, 237, 30, 213, 222, 251, 95, 73, 37, 16, 232, 90, 217, 100, + 243, 54, 237, 15, 73, 37, 16, 232, 90, 217, 100, 243, 54, 215, 224, 73, + 37, 16, 233, 26, 202, 107, 243, 54, 195, 164, 73, 37, 16, 232, 90, 202, + 107, 243, 54, 200, 72, 73, 37, 16, 232, 90, 214, 103, 73, 37, 16, 243, + 55, 190, 230, 73, 37, 16, 243, 55, 221, 93, 73, 37, 16, 243, 55, 201, + 239, 73, 37, 16, 232, 90, 228, 76, 192, 37, 199, 72, 73, 37, 16, 232, 90, + 234, 104, 251, 84, 73, 37, 16, 192, 37, 197, 219, 73, 37, 16, 237, 23, + 197, 219, 73, 37, 16, 237, 23, 199, 72, 73, 37, 16, 237, 23, 251, 60, + 235, 41, 236, 168, 73, 37, 16, 237, 23, 215, 222, 199, 77, 236, 168, 73, + 37, 16, 237, 23, 237, 6, 233, 224, 236, 168, 73, 37, 16, 237, 23, 197, + 230, 211, 124, 236, 168, 73, 37, 16, 192, 37, 251, 60, 235, 41, 236, 168, + 73, 37, 16, 192, 37, 215, 222, 199, 77, 236, 168, 73, 37, 16, 192, 37, + 237, 6, 233, 224, 236, 168, 73, 37, 16, 192, 37, 197, 230, 211, 124, 236, + 168, 73, 37, 16, 231, 149, 237, 22, 73, 37, 16, 231, 149, 192, 36, 73, + 37, 16, 237, 31, 251, 60, 216, 60, 73, 37, 16, 237, 31, 251, 60, 216, + 204, 73, 37, 16, 237, 31, 236, 240, 73, 37, 16, 237, 31, 199, 18, 73, 37, + 16, 202, 182, 199, 18, 73, 37, 16, 202, 182, 199, 19, 236, 223, 73, 37, + 16, 202, 182, 199, 19, 197, 220, 73, 37, 16, 202, 182, 199, 19, 199, 64, + 73, 37, 16, 202, 182, 250, 230, 73, 37, 16, 202, 182, 250, 231, 236, 223, + 73, 37, 16, 202, 182, 250, 231, 197, 220, 73, 37, 16, 202, 182, 250, 231, + 199, 64, 73, 37, 16, 237, 7, 231, 130, 73, 37, 16, 237, 14, 211, 21, 73, + 37, 16, 201, 74, 73, 37, 16, 250, 255, 168, 73, 37, 16, 250, 255, 195, 3, + 73, 37, 16, 250, 255, 231, 242, 73, 37, 16, 250, 255, 237, 46, 73, 37, + 16, 250, 255, 222, 24, 73, 37, 16, 250, 255, 191, 7, 73, 37, 16, 250, + 255, 213, 221, 73, 37, 16, 221, 250, 214, 101, 216, 172, 73, 37, 16, 221, + 251, 214, 101, 216, 172, 73, 37, 16, 221, 250, 214, 101, 222, 45, 73, 37, + 16, 221, 251, 214, 101, 222, 45, 73, 37, 16, 221, 95, 222, 45, 73, 37, + 16, 230, 240, 214, 101, 222, 45, 37, 16, 202, 171, 249, 85, 37, 16, 55, + 249, 85, 37, 16, 53, 249, 85, 37, 16, 207, 20, 53, 249, 85, 37, 16, 237, + 216, 249, 85, 37, 16, 203, 41, 249, 85, 37, 16, 45, 207, 50, 56, 37, 16, + 50, 207, 50, 56, 37, 16, 207, 50, 236, 140, 37, 16, 238, 6, 205, 42, 37, + 16, 238, 35, 247, 110, 37, 16, 205, 42, 37, 16, 242, 94, 37, 16, 207, 48, + 233, 13, 37, 16, 207, 48, 233, 12, 37, 16, 207, 48, 233, 11, 37, 16, 233, + 36, 37, 16, 233, 37, 60, 37, 16, 248, 41, 77, 37, 16, 247, 152, 37, 16, + 248, 57, 37, 16, 248, 55, 37, 16, 211, 101, 201, 112, 37, 16, 197, 12, + 201, 112, 37, 16, 198, 220, 201, 112, 37, 16, 232, 129, 201, 112, 37, 16, + 232, 226, 201, 112, 37, 16, 202, 136, 201, 112, 37, 16, 202, 134, 232, + 107, 37, 16, 232, 127, 232, 107, 37, 16, 232, 54, 242, 237, 37, 16, 232, + 54, 242, 238, 211, 25, 251, 160, 37, 16, 232, 54, 242, 238, 211, 25, 249, + 68, 37, 16, 247, 196, 242, 237, 37, 16, 233, 178, 242, 237, 37, 16, 233, + 178, 242, 238, 211, 25, 251, 160, 37, 16, 233, 178, 242, 238, 211, 25, + 249, 68, 37, 16, 235, 97, 242, 236, 37, 16, 235, 97, 242, 235, 37, 16, + 215, 131, 216, 230, 207, 31, 37, 16, 55, 203, 127, 37, 16, 55, 232, 208, + 37, 16, 232, 209, 196, 77, 37, 16, 232, 209, 235, 125, 37, 16, 214, 208, + 196, 77, 37, 16, 214, 208, 235, 125, 37, 16, 203, 128, 196, 77, 37, 16, + 203, 128, 235, 125, 37, 16, 208, 25, 163, 203, 127, 37, 16, 208, 25, 163, + 232, 208, 37, 16, 242, 73, 198, 146, 37, 16, 238, 157, 198, 146, 37, 16, + 211, 25, 251, 160, 37, 16, 211, 25, 249, 68, 37, 16, 208, 5, 251, 160, + 37, 16, 208, 5, 249, 68, 37, 16, 215, 134, 207, 31, 37, 16, 193, 87, 207, + 31, 37, 16, 132, 207, 31, 37, 16, 208, 25, 207, 31, 37, 16, 234, 162, + 207, 31, 37, 16, 202, 130, 207, 31, 37, 16, 198, 246, 207, 31, 37, 16, + 202, 120, 207, 31, 37, 16, 91, 228, 143, 197, 30, 207, 31, 37, 16, 192, + 236, 213, 4, 37, 16, 108, 213, 4, 37, 16, 243, 13, 192, 236, 213, 4, 37, + 16, 51, 213, 5, 193, 89, 37, 16, 51, 213, 5, 248, 141, 37, 16, 197, 242, + 213, 5, 133, 193, 89, 37, 16, 197, 242, 213, 5, 133, 248, 141, 37, 16, + 197, 242, 213, 5, 45, 193, 89, 37, 16, 197, 242, 213, 5, 45, 248, 141, + 37, 16, 197, 242, 213, 5, 50, 193, 89, 37, 16, 197, 242, 213, 5, 50, 248, + 141, 37, 16, 197, 242, 213, 5, 144, 193, 89, 37, 16, 197, 242, 213, 5, + 144, 248, 141, 37, 16, 197, 242, 213, 5, 133, 50, 193, 89, 37, 16, 197, + 242, 213, 5, 133, 50, 248, 141, 37, 16, 215, 208, 213, 5, 193, 89, 37, + 16, 215, 208, 213, 5, 248, 141, 37, 16, 197, 239, 213, 5, 144, 193, 89, + 37, 16, 197, 239, 213, 5, 144, 248, 141, 37, 16, 210, 116, 213, 4, 37, + 16, 195, 17, 213, 4, 37, 16, 213, 5, 248, 141, 37, 16, 212, 141, 213, 4, + 37, 16, 242, 205, 213, 5, 193, 89, 37, 16, 242, 205, 213, 5, 248, 141, + 37, 16, 248, 38, 37, 16, 193, 87, 213, 8, 37, 16, 132, 213, 8, 37, 16, + 208, 25, 213, 8, 37, 16, 234, 162, 213, 8, 37, 16, 202, 130, 213, 8, 37, + 16, 198, 246, 213, 8, 37, 16, 202, 120, 213, 8, 37, 16, 91, 228, 143, + 197, 30, 213, 8, 37, 16, 33, 201, 81, 37, 16, 33, 201, 198, 201, 81, 37, 16, 33, 197, 253, 37, 16, 33, 197, 252, 37, 16, 33, 197, 251, 37, 16, - 232, 250, 197, 253, 37, 16, 232, 250, 197, 252, 37, 16, 232, 250, 197, - 251, 37, 16, 33, 250, 160, 236, 140, 37, 16, 33, 232, 216, 37, 16, 33, - 232, 215, 37, 16, 33, 232, 214, 37, 16, 33, 232, 213, 37, 16, 33, 232, - 212, 37, 16, 248, 249, 249, 14, 37, 16, 234, 95, 249, 14, 37, 16, 248, - 249, 198, 178, 37, 16, 234, 95, 198, 178, 37, 16, 248, 249, 202, 71, 37, - 16, 234, 95, 202, 71, 37, 16, 248, 249, 209, 192, 37, 16, 234, 95, 209, - 192, 37, 16, 33, 252, 60, 37, 16, 33, 201, 115, 37, 16, 33, 199, 83, 37, - 16, 33, 201, 116, 37, 16, 33, 217, 60, 37, 16, 33, 217, 59, 37, 16, 33, - 252, 59, 37, 16, 33, 218, 243, 37, 16, 250, 241, 196, 77, 37, 16, 250, - 241, 235, 123, 37, 16, 33, 236, 158, 37, 16, 33, 206, 184, 37, 16, 33, - 232, 195, 37, 16, 33, 202, 67, 37, 16, 33, 248, 227, 37, 16, 33, 55, 198, - 61, 37, 16, 33, 197, 225, 198, 61, 37, 16, 206, 190, 37, 16, 200, 241, - 37, 16, 191, 166, 37, 16, 209, 184, 37, 16, 216, 151, 37, 16, 232, 140, - 37, 16, 238, 229, 37, 16, 237, 132, 37, 16, 230, 228, 213, 7, 202, 97, - 37, 16, 230, 228, 213, 7, 213, 44, 202, 97, 37, 16, 198, 27, 37, 16, 197, - 58, 37, 16, 223, 93, 197, 58, 37, 16, 197, 59, 202, 97, 37, 16, 197, 59, - 196, 77, 37, 16, 211, 43, 201, 27, 37, 16, 211, 43, 201, 24, 37, 16, 211, - 43, 201, 23, 37, 16, 211, 43, 201, 22, 37, 16, 211, 43, 201, 21, 37, 16, - 211, 43, 201, 20, 37, 16, 211, 43, 201, 19, 37, 16, 211, 43, 201, 18, 37, - 16, 211, 43, 201, 17, 37, 16, 211, 43, 201, 26, 37, 16, 211, 43, 201, 25, - 37, 16, 230, 0, 37, 16, 214, 113, 37, 16, 234, 95, 79, 201, 69, 37, 16, - 237, 125, 202, 97, 37, 16, 33, 144, 248, 69, 37, 16, 33, 133, 248, 69, - 37, 16, 33, 230, 14, 37, 16, 33, 202, 57, 209, 111, 37, 16, 210, 54, 77, - 37, 16, 210, 54, 133, 77, 37, 16, 132, 210, 54, 77, 37, 16, 231, 13, 196, - 77, 37, 16, 231, 13, 235, 123, 37, 16, 4, 232, 249, 37, 16, 237, 241, 37, - 16, 237, 242, 251, 174, 37, 16, 217, 23, 37, 16, 219, 10, 37, 16, 248, - 33, 37, 16, 204, 29, 193, 89, 37, 16, 204, 29, 248, 139, 37, 16, 216, 39, - 37, 16, 216, 40, 248, 139, 37, 16, 204, 23, 193, 89, 37, 16, 204, 23, - 248, 139, 37, 16, 232, 70, 193, 89, 37, 16, 232, 70, 248, 139, 37, 16, - 219, 11, 210, 9, 207, 30, 37, 16, 219, 11, 223, 167, 207, 30, 37, 16, - 248, 34, 207, 30, 37, 16, 204, 29, 207, 30, 37, 16, 216, 40, 207, 30, 37, - 16, 204, 23, 207, 30, 37, 16, 199, 97, 210, 7, 238, 186, 208, 192, 210, - 8, 37, 16, 199, 97, 210, 7, 238, 186, 208, 192, 223, 166, 37, 16, 199, - 97, 210, 7, 238, 186, 208, 192, 210, 9, 236, 248, 37, 16, 199, 97, 223, - 165, 238, 186, 208, 192, 210, 8, 37, 16, 199, 97, 223, 165, 238, 186, - 208, 192, 223, 166, 37, 16, 199, 97, 223, 165, 238, 186, 208, 192, 223, - 167, 236, 248, 37, 16, 199, 97, 223, 165, 238, 186, 208, 192, 223, 167, - 236, 247, 37, 16, 199, 97, 223, 165, 238, 186, 208, 192, 223, 167, 236, - 246, 37, 16, 238, 220, 37, 16, 230, 199, 247, 194, 242, 235, 37, 16, 230, - 199, 233, 176, 242, 235, 37, 16, 51, 250, 120, 37, 16, 195, 39, 37, 16, - 209, 69, 37, 16, 242, 224, 37, 16, 205, 95, 37, 16, 242, 229, 37, 16, - 198, 47, 37, 16, 209, 28, 37, 16, 209, 29, 232, 198, 37, 16, 205, 96, - 232, 198, 37, 16, 198, 48, 207, 27, 37, 16, 209, 246, 200, 231, 37, 16, - 221, 148, 247, 194, 242, 235, 37, 16, 221, 148, 234, 95, 79, 209, 175, - 37, 16, 221, 148, 53, 213, 6, 37, 16, 221, 148, 207, 99, 77, 37, 16, 221, - 148, 193, 87, 213, 6, 37, 16, 221, 148, 132, 213, 6, 37, 16, 221, 148, - 208, 23, 213, 7, 201, 81, 235, 123, 37, 16, 221, 148, 208, 23, 213, 7, - 201, 81, 196, 77, 37, 16, 221, 148, 234, 160, 213, 7, 201, 81, 235, 123, - 37, 16, 221, 148, 234, 160, 213, 7, 201, 81, 196, 77, 37, 16, 221, 148, - 232, 207, 56, 37, 16, 202, 11, 37, 16, 221, 31, 35, 195, 23, 213, 10, - 200, 123, 35, 195, 23, 213, 10, 200, 112, 35, 195, 23, 213, 10, 200, 102, - 35, 195, 23, 213, 10, 200, 95, 35, 195, 23, 213, 10, 200, 87, 35, 195, - 23, 213, 10, 200, 81, 35, 195, 23, 213, 10, 200, 80, 35, 195, 23, 213, - 10, 200, 79, 35, 195, 23, 213, 10, 200, 78, 35, 195, 23, 213, 10, 200, - 122, 35, 195, 23, 213, 10, 200, 121, 35, 195, 23, 213, 10, 200, 120, 35, - 195, 23, 213, 10, 200, 119, 35, 195, 23, 213, 10, 200, 118, 35, 195, 23, - 213, 10, 200, 117, 35, 195, 23, 213, 10, 200, 116, 35, 195, 23, 213, 10, - 200, 115, 35, 195, 23, 213, 10, 200, 114, 35, 195, 23, 213, 10, 200, 113, - 35, 195, 23, 213, 10, 200, 111, 35, 195, 23, 213, 10, 200, 110, 35, 195, - 23, 213, 10, 200, 109, 35, 195, 23, 213, 10, 200, 108, 35, 195, 23, 213, - 10, 200, 107, 35, 195, 23, 213, 10, 200, 86, 35, 195, 23, 213, 10, 200, - 85, 35, 195, 23, 213, 10, 200, 84, 35, 195, 23, 213, 10, 200, 83, 35, - 195, 23, 213, 10, 200, 82, 35, 223, 116, 213, 10, 200, 123, 35, 223, 116, - 213, 10, 200, 112, 35, 223, 116, 213, 10, 200, 95, 35, 223, 116, 213, 10, - 200, 87, 35, 223, 116, 213, 10, 200, 80, 35, 223, 116, 213, 10, 200, 79, - 35, 223, 116, 213, 10, 200, 121, 35, 223, 116, 213, 10, 200, 120, 35, - 223, 116, 213, 10, 200, 119, 35, 223, 116, 213, 10, 200, 118, 35, 223, - 116, 213, 10, 200, 115, 35, 223, 116, 213, 10, 200, 114, 35, 223, 116, - 213, 10, 200, 113, 35, 223, 116, 213, 10, 200, 108, 35, 223, 116, 213, - 10, 200, 107, 35, 223, 116, 213, 10, 200, 106, 35, 223, 116, 213, 10, - 200, 105, 35, 223, 116, 213, 10, 200, 104, 35, 223, 116, 213, 10, 200, - 103, 35, 223, 116, 213, 10, 200, 101, 35, 223, 116, 213, 10, 200, 100, - 35, 223, 116, 213, 10, 200, 99, 35, 223, 116, 213, 10, 200, 98, 35, 223, - 116, 213, 10, 200, 97, 35, 223, 116, 213, 10, 200, 96, 35, 223, 116, 213, - 10, 200, 94, 35, 223, 116, 213, 10, 200, 93, 35, 223, 116, 213, 10, 200, - 92, 35, 223, 116, 213, 10, 200, 91, 35, 223, 116, 213, 10, 200, 90, 35, - 223, 116, 213, 10, 200, 89, 35, 223, 116, 213, 10, 200, 88, 35, 223, 116, - 213, 10, 200, 86, 35, 223, 116, 213, 10, 200, 85, 35, 223, 116, 213, 10, - 200, 84, 35, 223, 116, 213, 10, 200, 83, 35, 223, 116, 213, 10, 200, 82, - 33, 35, 37, 197, 221, 33, 35, 37, 199, 65, 33, 35, 37, 210, 22, 35, 37, - 219, 206, 222, 93, 212, 134, 191, 77, 222, 93, 212, 134, 107, 222, 93, - 212, 134, 109, 222, 93, 212, 134, 138, 222, 93, 212, 134, 134, 222, 93, - 212, 134, 149, 222, 93, 212, 134, 169, 222, 93, 212, 134, 175, 222, 93, - 212, 134, 171, 222, 93, 212, 134, 178, 222, 93, 212, 134, 199, 95, 222, - 93, 212, 134, 234, 127, 222, 93, 212, 134, 197, 37, 222, 93, 212, 134, - 198, 251, 222, 93, 212, 134, 232, 122, 222, 93, 212, 134, 233, 19, 222, - 93, 212, 134, 202, 130, 222, 93, 212, 134, 203, 244, 222, 93, 212, 134, - 234, 161, 222, 93, 212, 134, 213, 171, 217, 20, 212, 134, 191, 77, 217, - 20, 212, 134, 107, 217, 20, 212, 134, 109, 217, 20, 212, 134, 138, 217, - 20, 212, 134, 134, 217, 20, 212, 134, 149, 217, 20, 212, 134, 169, 217, - 20, 212, 134, 175, 217, 20, 212, 134, 171, 217, 20, 212, 134, 178, 217, - 20, 212, 134, 199, 95, 217, 20, 212, 134, 234, 127, 217, 20, 212, 134, - 197, 37, 217, 20, 212, 134, 198, 251, 217, 20, 212, 134, 232, 122, 217, - 20, 212, 134, 233, 19, 217, 20, 212, 134, 202, 130, 217, 20, 212, 134, - 203, 244, 217, 20, 212, 134, 234, 161, 217, 20, 212, 134, 213, 171, 215, - 221, 40, 234, 207, 237, 6, 40, 229, 218, 234, 207, 237, 6, 40, 228, 145, - 234, 207, 237, 6, 40, 234, 206, 229, 219, 237, 6, 40, 234, 206, 228, 144, - 237, 6, 40, 234, 207, 199, 67, 40, 247, 21, 199, 67, 40, 232, 80, 243, - 10, 199, 67, 40, 216, 30, 199, 67, 40, 249, 78, 199, 67, 40, 222, 10, - 202, 70, 199, 67, 40, 239, 23, 199, 67, 40, 250, 212, 199, 67, 40, 211, - 62, 199, 67, 40, 248, 45, 211, 14, 199, 67, 40, 237, 127, 211, 57, 236, - 213, 199, 67, 40, 236, 210, 199, 67, 40, 191, 237, 199, 67, 40, 223, 153, - 199, 67, 40, 210, 32, 199, 67, 40, 207, 108, 199, 67, 40, 239, 35, 199, - 67, 40, 229, 6, 249, 146, 199, 67, 40, 193, 171, 199, 67, 40, 232, 169, - 199, 67, 40, 252, 28, 199, 67, 40, 207, 62, 199, 67, 40, 207, 34, 199, - 67, 40, 234, 205, 199, 67, 40, 222, 185, 199, 67, 40, 239, 30, 199, 67, - 40, 234, 93, 199, 67, 40, 235, 59, 199, 67, 40, 246, 244, 199, 67, 40, - 237, 137, 199, 67, 40, 28, 207, 33, 199, 67, 40, 210, 211, 199, 67, 40, - 219, 210, 199, 67, 40, 242, 217, 199, 67, 40, 221, 136, 199, 67, 40, 231, - 189, 199, 67, 40, 201, 39, 199, 67, 40, 208, 140, 199, 67, 40, 232, 79, - 199, 67, 40, 207, 35, 199, 67, 40, 219, 251, 211, 57, 216, 2, 199, 67, - 40, 207, 31, 199, 67, 40, 230, 252, 119, 216, 206, 199, 67, 40, 234, 96, - 199, 67, 40, 201, 56, 199, 67, 40, 230, 202, 199, 67, 40, 234, 86, 199, - 67, 40, 210, 83, 199, 67, 40, 206, 177, 199, 67, 40, 232, 196, 199, 67, - 40, 195, 163, 211, 57, 193, 147, 199, 67, 40, 239, 40, 199, 67, 40, 216, - 227, 199, 67, 40, 233, 250, 199, 67, 40, 196, 88, 199, 67, 40, 236, 249, - 199, 67, 40, 242, 219, 215, 179, 199, 67, 40, 230, 171, 199, 67, 40, 231, - 190, 223, 162, 199, 67, 40, 217, 32, 199, 67, 40, 252, 54, 199, 67, 40, - 234, 112, 199, 67, 40, 235, 127, 199, 67, 40, 193, 145, 199, 67, 40, 202, - 165, 199, 67, 40, 223, 126, 199, 67, 40, 237, 93, 199, 67, 40, 237, 219, - 199, 67, 40, 236, 245, 199, 67, 40, 233, 213, 199, 67, 40, 203, 240, 199, - 67, 40, 201, 60, 199, 67, 40, 230, 16, 199, 67, 40, 242, 66, 199, 67, 40, - 242, 214, 199, 67, 40, 233, 88, 199, 67, 40, 251, 248, 199, 67, 40, 242, - 65, 199, 67, 40, 211, 105, 199, 34, 195, 138, 199, 67, 40, 237, 15, 199, - 67, 40, 220, 113, 199, 67, 40, 232, 131, 238, 244, 206, 145, 196, 91, 17, - 107, 238, 244, 206, 145, 196, 91, 17, 109, 238, 244, 206, 145, 196, 91, - 17, 138, 238, 244, 206, 145, 196, 91, 17, 134, 238, 244, 206, 145, 196, - 91, 17, 149, 238, 244, 206, 145, 196, 91, 17, 169, 238, 244, 206, 145, - 196, 91, 17, 175, 238, 244, 206, 145, 196, 91, 17, 171, 238, 244, 206, - 145, 196, 91, 17, 178, 238, 244, 206, 145, 199, 91, 17, 107, 238, 244, - 206, 145, 199, 91, 17, 109, 238, 244, 206, 145, 199, 91, 17, 138, 238, - 244, 206, 145, 199, 91, 17, 134, 238, 244, 206, 145, 199, 91, 17, 149, - 238, 244, 206, 145, 199, 91, 17, 169, 238, 244, 206, 145, 199, 91, 17, - 175, 238, 244, 206, 145, 199, 91, 17, 171, 238, 244, 206, 145, 199, 91, - 17, 178, 154, 199, 198, 87, 107, 154, 199, 198, 87, 109, 154, 199, 198, - 87, 138, 154, 199, 198, 87, 134, 154, 199, 198, 87, 149, 199, 198, 87, - 107, 199, 198, 87, 149, 13, 28, 6, 65, 13, 28, 6, 250, 120, 13, 28, 6, - 247, 193, 13, 28, 6, 238, 127, 13, 28, 6, 71, 13, 28, 6, 233, 175, 13, - 28, 6, 232, 51, 13, 28, 6, 230, 116, 13, 28, 6, 68, 13, 28, 6, 223, 35, - 13, 28, 6, 222, 152, 13, 28, 6, 172, 13, 28, 6, 218, 168, 13, 28, 6, 215, - 61, 13, 28, 6, 74, 13, 28, 6, 210, 236, 13, 28, 6, 208, 104, 13, 28, 6, - 146, 13, 28, 6, 206, 8, 13, 28, 6, 200, 43, 13, 28, 6, 66, 13, 28, 6, - 196, 12, 13, 28, 6, 193, 224, 13, 28, 6, 192, 235, 13, 28, 6, 192, 159, - 13, 28, 6, 191, 166, 13, 28, 2, 65, 13, 28, 2, 250, 120, 13, 28, 2, 247, - 193, 13, 28, 2, 238, 127, 13, 28, 2, 71, 13, 28, 2, 233, 175, 13, 28, 2, - 232, 51, 13, 28, 2, 230, 116, 13, 28, 2, 68, 13, 28, 2, 223, 35, 13, 28, - 2, 222, 152, 13, 28, 2, 172, 13, 28, 2, 218, 168, 13, 28, 2, 215, 61, 13, - 28, 2, 74, 13, 28, 2, 210, 236, 13, 28, 2, 208, 104, 13, 28, 2, 146, 13, - 28, 2, 206, 8, 13, 28, 2, 200, 43, 13, 28, 2, 66, 13, 28, 2, 196, 12, 13, - 28, 2, 193, 224, 13, 28, 2, 192, 235, 13, 28, 2, 192, 159, 13, 28, 2, - 191, 166, 13, 43, 6, 65, 13, 43, 6, 250, 120, 13, 43, 6, 247, 193, 13, - 43, 6, 238, 127, 13, 43, 6, 71, 13, 43, 6, 233, 175, 13, 43, 6, 232, 51, - 13, 43, 6, 230, 116, 13, 43, 6, 68, 13, 43, 6, 223, 35, 13, 43, 6, 222, - 152, 13, 43, 6, 172, 13, 43, 6, 218, 168, 13, 43, 6, 215, 61, 13, 43, 6, - 74, 13, 43, 6, 210, 236, 13, 43, 6, 208, 104, 13, 43, 6, 146, 13, 43, 6, - 206, 8, 13, 43, 6, 200, 43, 13, 43, 6, 66, 13, 43, 6, 196, 12, 13, 43, 6, - 193, 224, 13, 43, 6, 192, 235, 13, 43, 6, 192, 159, 13, 43, 6, 191, 166, - 13, 43, 2, 65, 13, 43, 2, 250, 120, 13, 43, 2, 247, 193, 13, 43, 2, 238, - 127, 13, 43, 2, 71, 13, 43, 2, 233, 175, 13, 43, 2, 232, 51, 13, 43, 2, - 68, 13, 43, 2, 223, 35, 13, 43, 2, 222, 152, 13, 43, 2, 172, 13, 43, 2, - 218, 168, 13, 43, 2, 215, 61, 13, 43, 2, 74, 13, 43, 2, 210, 236, 13, 43, - 2, 208, 104, 13, 43, 2, 146, 13, 43, 2, 206, 8, 13, 43, 2, 200, 43, 13, - 43, 2, 66, 13, 43, 2, 196, 12, 13, 43, 2, 193, 224, 13, 43, 2, 192, 235, - 13, 43, 2, 192, 159, 13, 43, 2, 191, 166, 13, 28, 43, 6, 65, 13, 28, 43, - 6, 250, 120, 13, 28, 43, 6, 247, 193, 13, 28, 43, 6, 238, 127, 13, 28, - 43, 6, 71, 13, 28, 43, 6, 233, 175, 13, 28, 43, 6, 232, 51, 13, 28, 43, - 6, 230, 116, 13, 28, 43, 6, 68, 13, 28, 43, 6, 223, 35, 13, 28, 43, 6, - 222, 152, 13, 28, 43, 6, 172, 13, 28, 43, 6, 218, 168, 13, 28, 43, 6, - 215, 61, 13, 28, 43, 6, 74, 13, 28, 43, 6, 210, 236, 13, 28, 43, 6, 208, - 104, 13, 28, 43, 6, 146, 13, 28, 43, 6, 206, 8, 13, 28, 43, 6, 200, 43, - 13, 28, 43, 6, 66, 13, 28, 43, 6, 196, 12, 13, 28, 43, 6, 193, 224, 13, - 28, 43, 6, 192, 235, 13, 28, 43, 6, 192, 159, 13, 28, 43, 6, 191, 166, - 13, 28, 43, 2, 65, 13, 28, 43, 2, 250, 120, 13, 28, 43, 2, 247, 193, 13, - 28, 43, 2, 238, 127, 13, 28, 43, 2, 71, 13, 28, 43, 2, 233, 175, 13, 28, - 43, 2, 232, 51, 13, 28, 43, 2, 230, 116, 13, 28, 43, 2, 68, 13, 28, 43, - 2, 223, 35, 13, 28, 43, 2, 222, 152, 13, 28, 43, 2, 172, 13, 28, 43, 2, - 218, 168, 13, 28, 43, 2, 215, 61, 13, 28, 43, 2, 74, 13, 28, 43, 2, 210, - 236, 13, 28, 43, 2, 208, 104, 13, 28, 43, 2, 146, 13, 28, 43, 2, 206, 8, - 13, 28, 43, 2, 200, 43, 13, 28, 43, 2, 66, 13, 28, 43, 2, 196, 12, 13, - 28, 43, 2, 193, 224, 13, 28, 43, 2, 192, 235, 13, 28, 43, 2, 192, 159, - 13, 28, 43, 2, 191, 166, 13, 27, 6, 65, 13, 27, 6, 247, 193, 13, 27, 6, - 238, 127, 13, 27, 6, 232, 51, 13, 27, 6, 223, 35, 13, 27, 6, 222, 152, - 13, 27, 6, 215, 61, 13, 27, 6, 74, 13, 27, 6, 210, 236, 13, 27, 6, 208, - 104, 13, 27, 6, 206, 8, 13, 27, 6, 200, 43, 13, 27, 6, 66, 13, 27, 6, + 232, 252, 197, 253, 37, 16, 232, 252, 197, 252, 37, 16, 232, 252, 197, + 251, 37, 16, 33, 250, 162, 236, 142, 37, 16, 33, 232, 218, 37, 16, 33, + 232, 217, 37, 16, 33, 232, 216, 37, 16, 33, 232, 215, 37, 16, 33, 232, + 214, 37, 16, 248, 251, 249, 16, 37, 16, 234, 97, 249, 16, 37, 16, 248, + 251, 198, 178, 37, 16, 234, 97, 198, 178, 37, 16, 248, 251, 202, 72, 37, + 16, 234, 97, 202, 72, 37, 16, 248, 251, 209, 194, 37, 16, 234, 97, 209, + 194, 37, 16, 33, 252, 62, 37, 16, 33, 201, 116, 37, 16, 33, 199, 83, 37, + 16, 33, 201, 117, 37, 16, 33, 217, 62, 37, 16, 33, 217, 61, 37, 16, 33, + 252, 61, 37, 16, 33, 218, 245, 37, 16, 250, 243, 196, 77, 37, 16, 250, + 243, 235, 125, 37, 16, 33, 236, 160, 37, 16, 33, 206, 185, 37, 16, 33, + 232, 197, 37, 16, 33, 202, 68, 37, 16, 33, 248, 229, 37, 16, 33, 55, 198, + 61, 37, 16, 33, 197, 225, 198, 61, 37, 16, 206, 191, 37, 16, 200, 242, + 37, 16, 191, 166, 37, 16, 209, 186, 37, 16, 216, 153, 37, 16, 232, 142, + 37, 16, 238, 231, 37, 16, 237, 134, 37, 16, 230, 230, 213, 9, 202, 98, + 37, 16, 230, 230, 213, 9, 213, 46, 202, 98, 37, 16, 198, 27, 37, 16, 197, + 58, 37, 16, 223, 95, 197, 58, 37, 16, 197, 59, 202, 98, 37, 16, 197, 59, + 196, 77, 37, 16, 211, 45, 201, 28, 37, 16, 211, 45, 201, 25, 37, 16, 211, + 45, 201, 24, 37, 16, 211, 45, 201, 23, 37, 16, 211, 45, 201, 22, 37, 16, + 211, 45, 201, 21, 37, 16, 211, 45, 201, 20, 37, 16, 211, 45, 201, 19, 37, + 16, 211, 45, 201, 18, 37, 16, 211, 45, 201, 27, 37, 16, 211, 45, 201, 26, + 37, 16, 230, 2, 37, 16, 214, 115, 37, 16, 234, 97, 79, 201, 70, 37, 16, + 237, 127, 202, 98, 37, 16, 33, 144, 248, 71, 37, 16, 33, 133, 248, 71, + 37, 16, 33, 230, 16, 37, 16, 33, 202, 58, 209, 113, 37, 16, 210, 56, 77, + 37, 16, 210, 56, 133, 77, 37, 16, 132, 210, 56, 77, 37, 16, 231, 15, 196, + 77, 37, 16, 231, 15, 235, 125, 37, 16, 4, 232, 251, 37, 16, 237, 243, 37, + 16, 237, 244, 251, 176, 37, 16, 217, 25, 37, 16, 219, 12, 37, 16, 248, + 35, 37, 16, 204, 30, 193, 89, 37, 16, 204, 30, 248, 141, 37, 16, 216, 41, + 37, 16, 216, 42, 248, 141, 37, 16, 204, 24, 193, 89, 37, 16, 204, 24, + 248, 141, 37, 16, 232, 72, 193, 89, 37, 16, 232, 72, 248, 141, 37, 16, + 219, 13, 210, 11, 207, 31, 37, 16, 219, 13, 223, 169, 207, 31, 37, 16, + 248, 36, 207, 31, 37, 16, 204, 30, 207, 31, 37, 16, 216, 42, 207, 31, 37, + 16, 204, 24, 207, 31, 37, 16, 199, 97, 210, 9, 238, 188, 208, 194, 210, + 10, 37, 16, 199, 97, 210, 9, 238, 188, 208, 194, 223, 168, 37, 16, 199, + 97, 210, 9, 238, 188, 208, 194, 210, 11, 236, 250, 37, 16, 199, 97, 223, + 167, 238, 188, 208, 194, 210, 10, 37, 16, 199, 97, 223, 167, 238, 188, + 208, 194, 223, 168, 37, 16, 199, 97, 223, 167, 238, 188, 208, 194, 223, + 169, 236, 250, 37, 16, 199, 97, 223, 167, 238, 188, 208, 194, 223, 169, + 236, 249, 37, 16, 199, 97, 223, 167, 238, 188, 208, 194, 223, 169, 236, + 248, 37, 16, 238, 222, 37, 16, 230, 201, 247, 196, 242, 237, 37, 16, 230, + 201, 233, 178, 242, 237, 37, 16, 51, 250, 122, 37, 16, 195, 39, 37, 16, + 209, 71, 37, 16, 242, 226, 37, 16, 205, 96, 37, 16, 242, 231, 37, 16, + 198, 47, 37, 16, 209, 30, 37, 16, 209, 31, 232, 200, 37, 16, 205, 97, + 232, 200, 37, 16, 198, 48, 207, 28, 37, 16, 209, 248, 200, 232, 37, 16, + 221, 150, 247, 196, 242, 237, 37, 16, 221, 150, 234, 97, 79, 209, 177, + 37, 16, 221, 150, 53, 213, 8, 37, 16, 221, 150, 207, 101, 77, 37, 16, + 221, 150, 193, 87, 213, 8, 37, 16, 221, 150, 132, 213, 8, 37, 16, 221, + 150, 208, 25, 213, 9, 201, 82, 235, 125, 37, 16, 221, 150, 208, 25, 213, + 9, 201, 82, 196, 77, 37, 16, 221, 150, 234, 162, 213, 9, 201, 82, 235, + 125, 37, 16, 221, 150, 234, 162, 213, 9, 201, 82, 196, 77, 37, 16, 221, + 150, 232, 209, 56, 37, 16, 202, 12, 37, 16, 221, 33, 35, 195, 23, 213, + 12, 200, 123, 35, 195, 23, 213, 12, 200, 112, 35, 195, 23, 213, 12, 200, + 102, 35, 195, 23, 213, 12, 200, 95, 35, 195, 23, 213, 12, 200, 87, 35, + 195, 23, 213, 12, 200, 81, 35, 195, 23, 213, 12, 200, 80, 35, 195, 23, + 213, 12, 200, 79, 35, 195, 23, 213, 12, 200, 78, 35, 195, 23, 213, 12, + 200, 122, 35, 195, 23, 213, 12, 200, 121, 35, 195, 23, 213, 12, 200, 120, + 35, 195, 23, 213, 12, 200, 119, 35, 195, 23, 213, 12, 200, 118, 35, 195, + 23, 213, 12, 200, 117, 35, 195, 23, 213, 12, 200, 116, 35, 195, 23, 213, + 12, 200, 115, 35, 195, 23, 213, 12, 200, 114, 35, 195, 23, 213, 12, 200, + 113, 35, 195, 23, 213, 12, 200, 111, 35, 195, 23, 213, 12, 200, 110, 35, + 195, 23, 213, 12, 200, 109, 35, 195, 23, 213, 12, 200, 108, 35, 195, 23, + 213, 12, 200, 107, 35, 195, 23, 213, 12, 200, 86, 35, 195, 23, 213, 12, + 200, 85, 35, 195, 23, 213, 12, 200, 84, 35, 195, 23, 213, 12, 200, 83, + 35, 195, 23, 213, 12, 200, 82, 35, 223, 118, 213, 12, 200, 123, 35, 223, + 118, 213, 12, 200, 112, 35, 223, 118, 213, 12, 200, 95, 35, 223, 118, + 213, 12, 200, 87, 35, 223, 118, 213, 12, 200, 80, 35, 223, 118, 213, 12, + 200, 79, 35, 223, 118, 213, 12, 200, 121, 35, 223, 118, 213, 12, 200, + 120, 35, 223, 118, 213, 12, 200, 119, 35, 223, 118, 213, 12, 200, 118, + 35, 223, 118, 213, 12, 200, 115, 35, 223, 118, 213, 12, 200, 114, 35, + 223, 118, 213, 12, 200, 113, 35, 223, 118, 213, 12, 200, 108, 35, 223, + 118, 213, 12, 200, 107, 35, 223, 118, 213, 12, 200, 106, 35, 223, 118, + 213, 12, 200, 105, 35, 223, 118, 213, 12, 200, 104, 35, 223, 118, 213, + 12, 200, 103, 35, 223, 118, 213, 12, 200, 101, 35, 223, 118, 213, 12, + 200, 100, 35, 223, 118, 213, 12, 200, 99, 35, 223, 118, 213, 12, 200, 98, + 35, 223, 118, 213, 12, 200, 97, 35, 223, 118, 213, 12, 200, 96, 35, 223, + 118, 213, 12, 200, 94, 35, 223, 118, 213, 12, 200, 93, 35, 223, 118, 213, + 12, 200, 92, 35, 223, 118, 213, 12, 200, 91, 35, 223, 118, 213, 12, 200, + 90, 35, 223, 118, 213, 12, 200, 89, 35, 223, 118, 213, 12, 200, 88, 35, + 223, 118, 213, 12, 200, 86, 35, 223, 118, 213, 12, 200, 85, 35, 223, 118, + 213, 12, 200, 84, 35, 223, 118, 213, 12, 200, 83, 35, 223, 118, 213, 12, + 200, 82, 33, 35, 37, 197, 221, 33, 35, 37, 199, 65, 33, 35, 37, 210, 24, + 35, 37, 219, 208, 222, 95, 212, 136, 191, 77, 222, 95, 212, 136, 107, + 222, 95, 212, 136, 109, 222, 95, 212, 136, 138, 222, 95, 212, 136, 134, + 222, 95, 212, 136, 150, 222, 95, 212, 136, 169, 222, 95, 212, 136, 175, + 222, 95, 212, 136, 171, 222, 95, 212, 136, 178, 222, 95, 212, 136, 199, + 95, 222, 95, 212, 136, 234, 129, 222, 95, 212, 136, 197, 37, 222, 95, + 212, 136, 198, 251, 222, 95, 212, 136, 232, 124, 222, 95, 212, 136, 233, + 21, 222, 95, 212, 136, 202, 131, 222, 95, 212, 136, 203, 245, 222, 95, + 212, 136, 234, 163, 222, 95, 212, 136, 213, 173, 217, 22, 212, 136, 191, + 77, 217, 22, 212, 136, 107, 217, 22, 212, 136, 109, 217, 22, 212, 136, + 138, 217, 22, 212, 136, 134, 217, 22, 212, 136, 150, 217, 22, 212, 136, + 169, 217, 22, 212, 136, 175, 217, 22, 212, 136, 171, 217, 22, 212, 136, + 178, 217, 22, 212, 136, 199, 95, 217, 22, 212, 136, 234, 129, 217, 22, + 212, 136, 197, 37, 217, 22, 212, 136, 198, 251, 217, 22, 212, 136, 232, + 124, 217, 22, 212, 136, 233, 21, 217, 22, 212, 136, 202, 131, 217, 22, + 212, 136, 203, 245, 217, 22, 212, 136, 234, 163, 217, 22, 212, 136, 213, + 173, 215, 223, 40, 234, 209, 237, 8, 40, 229, 220, 234, 209, 237, 8, 40, + 228, 147, 234, 209, 237, 8, 40, 234, 208, 229, 221, 237, 8, 40, 234, 208, + 228, 146, 237, 8, 40, 234, 209, 199, 67, 40, 247, 23, 199, 67, 40, 232, + 82, 243, 12, 199, 67, 40, 216, 32, 199, 67, 40, 249, 80, 199, 67, 40, + 222, 12, 202, 71, 199, 67, 40, 239, 25, 199, 67, 40, 250, 214, 199, 67, + 40, 211, 64, 199, 67, 40, 248, 47, 211, 16, 199, 67, 40, 237, 129, 211, + 59, 236, 215, 199, 67, 40, 236, 212, 199, 67, 40, 191, 237, 199, 67, 40, + 223, 155, 199, 67, 40, 210, 34, 199, 67, 40, 207, 110, 199, 67, 40, 239, + 37, 199, 67, 40, 229, 8, 249, 148, 199, 67, 40, 193, 171, 199, 67, 40, + 232, 171, 199, 67, 40, 252, 30, 199, 67, 40, 207, 63, 199, 67, 40, 207, + 35, 199, 67, 40, 234, 207, 199, 67, 40, 222, 187, 199, 67, 40, 239, 32, + 199, 67, 40, 234, 95, 199, 67, 40, 235, 61, 199, 67, 40, 246, 246, 199, + 67, 40, 237, 139, 199, 67, 40, 28, 207, 34, 199, 67, 40, 210, 213, 199, + 67, 40, 219, 212, 199, 67, 40, 242, 219, 199, 67, 40, 221, 138, 199, 67, + 40, 231, 191, 199, 67, 40, 201, 40, 199, 67, 40, 208, 142, 199, 67, 40, + 232, 81, 199, 67, 40, 207, 36, 199, 67, 40, 219, 253, 211, 59, 216, 4, + 199, 67, 40, 207, 32, 199, 67, 40, 230, 254, 119, 216, 208, 199, 67, 40, + 234, 98, 199, 67, 40, 201, 57, 199, 67, 40, 230, 204, 199, 67, 40, 234, + 88, 199, 67, 40, 210, 85, 199, 67, 40, 206, 178, 199, 67, 40, 232, 198, + 199, 67, 40, 195, 163, 211, 59, 193, 147, 199, 67, 40, 239, 42, 199, 67, + 40, 216, 229, 199, 67, 40, 233, 252, 199, 67, 40, 196, 88, 199, 67, 40, + 236, 251, 199, 67, 40, 242, 221, 215, 181, 199, 67, 40, 230, 173, 199, + 67, 40, 231, 192, 223, 164, 199, 67, 40, 217, 34, 199, 67, 40, 252, 56, + 199, 67, 40, 234, 114, 199, 67, 40, 235, 129, 199, 67, 40, 193, 145, 199, + 67, 40, 202, 166, 199, 67, 40, 223, 128, 199, 67, 40, 237, 95, 199, 67, + 40, 237, 221, 199, 67, 40, 236, 247, 199, 67, 40, 233, 215, 199, 67, 40, + 203, 241, 199, 67, 40, 201, 61, 199, 67, 40, 230, 18, 199, 67, 40, 242, + 68, 199, 67, 40, 242, 216, 199, 67, 40, 233, 90, 199, 67, 40, 251, 250, + 199, 67, 40, 242, 67, 199, 67, 40, 211, 107, 199, 34, 195, 138, 199, 67, + 40, 237, 17, 199, 67, 40, 220, 115, 199, 67, 40, 232, 133, 238, 246, 206, + 146, 196, 91, 17, 107, 238, 246, 206, 146, 196, 91, 17, 109, 238, 246, + 206, 146, 196, 91, 17, 138, 238, 246, 206, 146, 196, 91, 17, 134, 238, + 246, 206, 146, 196, 91, 17, 150, 238, 246, 206, 146, 196, 91, 17, 169, + 238, 246, 206, 146, 196, 91, 17, 175, 238, 246, 206, 146, 196, 91, 17, + 171, 238, 246, 206, 146, 196, 91, 17, 178, 238, 246, 206, 146, 199, 91, + 17, 107, 238, 246, 206, 146, 199, 91, 17, 109, 238, 246, 206, 146, 199, + 91, 17, 138, 238, 246, 206, 146, 199, 91, 17, 134, 238, 246, 206, 146, + 199, 91, 17, 150, 238, 246, 206, 146, 199, 91, 17, 169, 238, 246, 206, + 146, 199, 91, 17, 175, 238, 246, 206, 146, 199, 91, 17, 171, 238, 246, + 206, 146, 199, 91, 17, 178, 148, 199, 198, 87, 107, 148, 199, 198, 87, + 109, 148, 199, 198, 87, 138, 148, 199, 198, 87, 134, 148, 199, 198, 87, + 150, 199, 198, 87, 107, 199, 198, 87, 150, 13, 28, 6, 65, 13, 28, 6, 250, + 122, 13, 28, 6, 247, 195, 13, 28, 6, 238, 129, 13, 28, 6, 71, 13, 28, 6, + 233, 177, 13, 28, 6, 232, 53, 13, 28, 6, 230, 118, 13, 28, 6, 68, 13, 28, + 6, 223, 37, 13, 28, 6, 222, 154, 13, 28, 6, 172, 13, 28, 6, 218, 170, 13, + 28, 6, 215, 63, 13, 28, 6, 74, 13, 28, 6, 210, 238, 13, 28, 6, 208, 106, + 13, 28, 6, 146, 13, 28, 6, 206, 9, 13, 28, 6, 200, 43, 13, 28, 6, 66, 13, + 28, 6, 196, 12, 13, 28, 6, 193, 224, 13, 28, 6, 192, 235, 13, 28, 6, 192, + 159, 13, 28, 6, 191, 166, 13, 28, 2, 65, 13, 28, 2, 250, 122, 13, 28, 2, + 247, 195, 13, 28, 2, 238, 129, 13, 28, 2, 71, 13, 28, 2, 233, 177, 13, + 28, 2, 232, 53, 13, 28, 2, 230, 118, 13, 28, 2, 68, 13, 28, 2, 223, 37, + 13, 28, 2, 222, 154, 13, 28, 2, 172, 13, 28, 2, 218, 170, 13, 28, 2, 215, + 63, 13, 28, 2, 74, 13, 28, 2, 210, 238, 13, 28, 2, 208, 106, 13, 28, 2, + 146, 13, 28, 2, 206, 9, 13, 28, 2, 200, 43, 13, 28, 2, 66, 13, 28, 2, + 196, 12, 13, 28, 2, 193, 224, 13, 28, 2, 192, 235, 13, 28, 2, 192, 159, + 13, 28, 2, 191, 166, 13, 43, 6, 65, 13, 43, 6, 250, 122, 13, 43, 6, 247, + 195, 13, 43, 6, 238, 129, 13, 43, 6, 71, 13, 43, 6, 233, 177, 13, 43, 6, + 232, 53, 13, 43, 6, 230, 118, 13, 43, 6, 68, 13, 43, 6, 223, 37, 13, 43, + 6, 222, 154, 13, 43, 6, 172, 13, 43, 6, 218, 170, 13, 43, 6, 215, 63, 13, + 43, 6, 74, 13, 43, 6, 210, 238, 13, 43, 6, 208, 106, 13, 43, 6, 146, 13, + 43, 6, 206, 9, 13, 43, 6, 200, 43, 13, 43, 6, 66, 13, 43, 6, 196, 12, 13, + 43, 6, 193, 224, 13, 43, 6, 192, 235, 13, 43, 6, 192, 159, 13, 43, 6, + 191, 166, 13, 43, 2, 65, 13, 43, 2, 250, 122, 13, 43, 2, 247, 195, 13, + 43, 2, 238, 129, 13, 43, 2, 71, 13, 43, 2, 233, 177, 13, 43, 2, 232, 53, + 13, 43, 2, 68, 13, 43, 2, 223, 37, 13, 43, 2, 222, 154, 13, 43, 2, 172, + 13, 43, 2, 218, 170, 13, 43, 2, 215, 63, 13, 43, 2, 74, 13, 43, 2, 210, + 238, 13, 43, 2, 208, 106, 13, 43, 2, 146, 13, 43, 2, 206, 9, 13, 43, 2, + 200, 43, 13, 43, 2, 66, 13, 43, 2, 196, 12, 13, 43, 2, 193, 224, 13, 43, + 2, 192, 235, 13, 43, 2, 192, 159, 13, 43, 2, 191, 166, 13, 28, 43, 6, 65, + 13, 28, 43, 6, 250, 122, 13, 28, 43, 6, 247, 195, 13, 28, 43, 6, 238, + 129, 13, 28, 43, 6, 71, 13, 28, 43, 6, 233, 177, 13, 28, 43, 6, 232, 53, + 13, 28, 43, 6, 230, 118, 13, 28, 43, 6, 68, 13, 28, 43, 6, 223, 37, 13, + 28, 43, 6, 222, 154, 13, 28, 43, 6, 172, 13, 28, 43, 6, 218, 170, 13, 28, + 43, 6, 215, 63, 13, 28, 43, 6, 74, 13, 28, 43, 6, 210, 238, 13, 28, 43, + 6, 208, 106, 13, 28, 43, 6, 146, 13, 28, 43, 6, 206, 9, 13, 28, 43, 6, + 200, 43, 13, 28, 43, 6, 66, 13, 28, 43, 6, 196, 12, 13, 28, 43, 6, 193, + 224, 13, 28, 43, 6, 192, 235, 13, 28, 43, 6, 192, 159, 13, 28, 43, 6, + 191, 166, 13, 28, 43, 2, 65, 13, 28, 43, 2, 250, 122, 13, 28, 43, 2, 247, + 195, 13, 28, 43, 2, 238, 129, 13, 28, 43, 2, 71, 13, 28, 43, 2, 233, 177, + 13, 28, 43, 2, 232, 53, 13, 28, 43, 2, 230, 118, 13, 28, 43, 2, 68, 13, + 28, 43, 2, 223, 37, 13, 28, 43, 2, 222, 154, 13, 28, 43, 2, 172, 13, 28, + 43, 2, 218, 170, 13, 28, 43, 2, 215, 63, 13, 28, 43, 2, 74, 13, 28, 43, + 2, 210, 238, 13, 28, 43, 2, 208, 106, 13, 28, 43, 2, 146, 13, 28, 43, 2, + 206, 9, 13, 28, 43, 2, 200, 43, 13, 28, 43, 2, 66, 13, 28, 43, 2, 196, + 12, 13, 28, 43, 2, 193, 224, 13, 28, 43, 2, 192, 235, 13, 28, 43, 2, 192, + 159, 13, 28, 43, 2, 191, 166, 13, 27, 6, 65, 13, 27, 6, 247, 195, 13, 27, + 6, 238, 129, 13, 27, 6, 232, 53, 13, 27, 6, 223, 37, 13, 27, 6, 222, 154, + 13, 27, 6, 215, 63, 13, 27, 6, 74, 13, 27, 6, 210, 238, 13, 27, 6, 208, + 106, 13, 27, 6, 206, 9, 13, 27, 6, 200, 43, 13, 27, 6, 66, 13, 27, 6, 196, 12, 13, 27, 6, 193, 224, 13, 27, 6, 192, 235, 13, 27, 6, 192, 159, - 13, 27, 6, 191, 166, 13, 27, 2, 65, 13, 27, 2, 250, 120, 13, 27, 2, 247, - 193, 13, 27, 2, 238, 127, 13, 27, 2, 233, 175, 13, 27, 2, 230, 116, 13, - 27, 2, 68, 13, 27, 2, 223, 35, 13, 27, 2, 222, 152, 13, 27, 2, 172, 13, - 27, 2, 218, 168, 13, 27, 2, 215, 61, 13, 27, 2, 210, 236, 13, 27, 2, 208, - 104, 13, 27, 2, 146, 13, 27, 2, 206, 8, 13, 27, 2, 200, 43, 13, 27, 2, + 13, 27, 6, 191, 166, 13, 27, 2, 65, 13, 27, 2, 250, 122, 13, 27, 2, 247, + 195, 13, 27, 2, 238, 129, 13, 27, 2, 233, 177, 13, 27, 2, 230, 118, 13, + 27, 2, 68, 13, 27, 2, 223, 37, 13, 27, 2, 222, 154, 13, 27, 2, 172, 13, + 27, 2, 218, 170, 13, 27, 2, 215, 63, 13, 27, 2, 210, 238, 13, 27, 2, 208, + 106, 13, 27, 2, 146, 13, 27, 2, 206, 9, 13, 27, 2, 200, 43, 13, 27, 2, 66, 13, 27, 2, 196, 12, 13, 27, 2, 193, 224, 13, 27, 2, 192, 235, 13, 27, 2, 192, 159, 13, 27, 2, 191, 166, 13, 28, 27, 6, 65, 13, 28, 27, 6, 250, - 120, 13, 28, 27, 6, 247, 193, 13, 28, 27, 6, 238, 127, 13, 28, 27, 6, 71, - 13, 28, 27, 6, 233, 175, 13, 28, 27, 6, 232, 51, 13, 28, 27, 6, 230, 116, - 13, 28, 27, 6, 68, 13, 28, 27, 6, 223, 35, 13, 28, 27, 6, 222, 152, 13, - 28, 27, 6, 172, 13, 28, 27, 6, 218, 168, 13, 28, 27, 6, 215, 61, 13, 28, - 27, 6, 74, 13, 28, 27, 6, 210, 236, 13, 28, 27, 6, 208, 104, 13, 28, 27, - 6, 146, 13, 28, 27, 6, 206, 8, 13, 28, 27, 6, 200, 43, 13, 28, 27, 6, 66, + 122, 13, 28, 27, 6, 247, 195, 13, 28, 27, 6, 238, 129, 13, 28, 27, 6, 71, + 13, 28, 27, 6, 233, 177, 13, 28, 27, 6, 232, 53, 13, 28, 27, 6, 230, 118, + 13, 28, 27, 6, 68, 13, 28, 27, 6, 223, 37, 13, 28, 27, 6, 222, 154, 13, + 28, 27, 6, 172, 13, 28, 27, 6, 218, 170, 13, 28, 27, 6, 215, 63, 13, 28, + 27, 6, 74, 13, 28, 27, 6, 210, 238, 13, 28, 27, 6, 208, 106, 13, 28, 27, + 6, 146, 13, 28, 27, 6, 206, 9, 13, 28, 27, 6, 200, 43, 13, 28, 27, 6, 66, 13, 28, 27, 6, 196, 12, 13, 28, 27, 6, 193, 224, 13, 28, 27, 6, 192, 235, 13, 28, 27, 6, 192, 159, 13, 28, 27, 6, 191, 166, 13, 28, 27, 2, 65, 13, - 28, 27, 2, 250, 120, 13, 28, 27, 2, 247, 193, 13, 28, 27, 2, 238, 127, - 13, 28, 27, 2, 71, 13, 28, 27, 2, 233, 175, 13, 28, 27, 2, 232, 51, 13, - 28, 27, 2, 230, 116, 13, 28, 27, 2, 68, 13, 28, 27, 2, 223, 35, 13, 28, - 27, 2, 222, 152, 13, 28, 27, 2, 172, 13, 28, 27, 2, 218, 168, 13, 28, 27, - 2, 215, 61, 13, 28, 27, 2, 74, 13, 28, 27, 2, 210, 236, 13, 28, 27, 2, - 208, 104, 13, 28, 27, 2, 146, 13, 28, 27, 2, 206, 8, 13, 28, 27, 2, 200, + 28, 27, 2, 250, 122, 13, 28, 27, 2, 247, 195, 13, 28, 27, 2, 238, 129, + 13, 28, 27, 2, 71, 13, 28, 27, 2, 233, 177, 13, 28, 27, 2, 232, 53, 13, + 28, 27, 2, 230, 118, 13, 28, 27, 2, 68, 13, 28, 27, 2, 223, 37, 13, 28, + 27, 2, 222, 154, 13, 28, 27, 2, 172, 13, 28, 27, 2, 218, 170, 13, 28, 27, + 2, 215, 63, 13, 28, 27, 2, 74, 13, 28, 27, 2, 210, 238, 13, 28, 27, 2, + 208, 106, 13, 28, 27, 2, 146, 13, 28, 27, 2, 206, 9, 13, 28, 27, 2, 200, 43, 13, 28, 27, 2, 66, 13, 28, 27, 2, 196, 12, 13, 28, 27, 2, 193, 224, 13, 28, 27, 2, 192, 235, 13, 28, 27, 2, 192, 159, 13, 28, 27, 2, 191, - 166, 13, 232, 115, 6, 65, 13, 232, 115, 6, 250, 120, 13, 232, 115, 6, - 238, 127, 13, 232, 115, 6, 71, 13, 232, 115, 6, 233, 175, 13, 232, 115, - 6, 232, 51, 13, 232, 115, 6, 223, 35, 13, 232, 115, 6, 222, 152, 13, 232, - 115, 6, 172, 13, 232, 115, 6, 218, 168, 13, 232, 115, 6, 215, 61, 13, - 232, 115, 6, 74, 13, 232, 115, 6, 210, 236, 13, 232, 115, 6, 208, 104, - 13, 232, 115, 6, 206, 8, 13, 232, 115, 6, 200, 43, 13, 232, 115, 6, 66, - 13, 232, 115, 6, 196, 12, 13, 232, 115, 6, 193, 224, 13, 232, 115, 6, - 192, 235, 13, 232, 115, 6, 192, 159, 13, 232, 115, 2, 65, 13, 232, 115, - 2, 250, 120, 13, 232, 115, 2, 247, 193, 13, 232, 115, 2, 238, 127, 13, - 232, 115, 2, 71, 13, 232, 115, 2, 233, 175, 13, 232, 115, 2, 232, 51, 13, - 232, 115, 2, 230, 116, 13, 232, 115, 2, 68, 13, 232, 115, 2, 223, 35, 13, - 232, 115, 2, 222, 152, 13, 232, 115, 2, 172, 13, 232, 115, 2, 218, 168, - 13, 232, 115, 2, 215, 61, 13, 232, 115, 2, 74, 13, 232, 115, 2, 210, 236, - 13, 232, 115, 2, 208, 104, 13, 232, 115, 2, 146, 13, 232, 115, 2, 206, 8, - 13, 232, 115, 2, 200, 43, 13, 232, 115, 2, 66, 13, 232, 115, 2, 196, 12, - 13, 232, 115, 2, 193, 224, 13, 232, 115, 2, 192, 235, 13, 232, 115, 2, - 192, 159, 13, 232, 115, 2, 191, 166, 13, 235, 129, 6, 65, 13, 235, 129, - 6, 250, 120, 13, 235, 129, 6, 238, 127, 13, 235, 129, 6, 71, 13, 235, - 129, 6, 233, 175, 13, 235, 129, 6, 232, 51, 13, 235, 129, 6, 68, 13, 235, - 129, 6, 223, 35, 13, 235, 129, 6, 222, 152, 13, 235, 129, 6, 172, 13, - 235, 129, 6, 218, 168, 13, 235, 129, 6, 74, 13, 235, 129, 6, 206, 8, 13, - 235, 129, 6, 200, 43, 13, 235, 129, 6, 66, 13, 235, 129, 6, 196, 12, 13, - 235, 129, 6, 193, 224, 13, 235, 129, 6, 192, 235, 13, 235, 129, 6, 192, - 159, 13, 235, 129, 2, 65, 13, 235, 129, 2, 250, 120, 13, 235, 129, 2, - 247, 193, 13, 235, 129, 2, 238, 127, 13, 235, 129, 2, 71, 13, 235, 129, - 2, 233, 175, 13, 235, 129, 2, 232, 51, 13, 235, 129, 2, 230, 116, 13, - 235, 129, 2, 68, 13, 235, 129, 2, 223, 35, 13, 235, 129, 2, 222, 152, 13, - 235, 129, 2, 172, 13, 235, 129, 2, 218, 168, 13, 235, 129, 2, 215, 61, - 13, 235, 129, 2, 74, 13, 235, 129, 2, 210, 236, 13, 235, 129, 2, 208, - 104, 13, 235, 129, 2, 146, 13, 235, 129, 2, 206, 8, 13, 235, 129, 2, 200, - 43, 13, 235, 129, 2, 66, 13, 235, 129, 2, 196, 12, 13, 235, 129, 2, 193, - 224, 13, 235, 129, 2, 192, 235, 13, 235, 129, 2, 192, 159, 13, 235, 129, - 2, 191, 166, 13, 28, 232, 115, 6, 65, 13, 28, 232, 115, 6, 250, 120, 13, - 28, 232, 115, 6, 247, 193, 13, 28, 232, 115, 6, 238, 127, 13, 28, 232, - 115, 6, 71, 13, 28, 232, 115, 6, 233, 175, 13, 28, 232, 115, 6, 232, 51, - 13, 28, 232, 115, 6, 230, 116, 13, 28, 232, 115, 6, 68, 13, 28, 232, 115, - 6, 223, 35, 13, 28, 232, 115, 6, 222, 152, 13, 28, 232, 115, 6, 172, 13, - 28, 232, 115, 6, 218, 168, 13, 28, 232, 115, 6, 215, 61, 13, 28, 232, - 115, 6, 74, 13, 28, 232, 115, 6, 210, 236, 13, 28, 232, 115, 6, 208, 104, - 13, 28, 232, 115, 6, 146, 13, 28, 232, 115, 6, 206, 8, 13, 28, 232, 115, - 6, 200, 43, 13, 28, 232, 115, 6, 66, 13, 28, 232, 115, 6, 196, 12, 13, - 28, 232, 115, 6, 193, 224, 13, 28, 232, 115, 6, 192, 235, 13, 28, 232, - 115, 6, 192, 159, 13, 28, 232, 115, 6, 191, 166, 13, 28, 232, 115, 2, 65, - 13, 28, 232, 115, 2, 250, 120, 13, 28, 232, 115, 2, 247, 193, 13, 28, - 232, 115, 2, 238, 127, 13, 28, 232, 115, 2, 71, 13, 28, 232, 115, 2, 233, - 175, 13, 28, 232, 115, 2, 232, 51, 13, 28, 232, 115, 2, 230, 116, 13, 28, - 232, 115, 2, 68, 13, 28, 232, 115, 2, 223, 35, 13, 28, 232, 115, 2, 222, - 152, 13, 28, 232, 115, 2, 172, 13, 28, 232, 115, 2, 218, 168, 13, 28, - 232, 115, 2, 215, 61, 13, 28, 232, 115, 2, 74, 13, 28, 232, 115, 2, 210, - 236, 13, 28, 232, 115, 2, 208, 104, 13, 28, 232, 115, 2, 146, 13, 28, - 232, 115, 2, 206, 8, 13, 28, 232, 115, 2, 200, 43, 13, 28, 232, 115, 2, - 66, 13, 28, 232, 115, 2, 196, 12, 13, 28, 232, 115, 2, 193, 224, 13, 28, - 232, 115, 2, 192, 235, 13, 28, 232, 115, 2, 192, 159, 13, 28, 232, 115, - 2, 191, 166, 13, 49, 6, 65, 13, 49, 6, 250, 120, 13, 49, 6, 247, 193, 13, - 49, 6, 238, 127, 13, 49, 6, 71, 13, 49, 6, 233, 175, 13, 49, 6, 232, 51, - 13, 49, 6, 230, 116, 13, 49, 6, 68, 13, 49, 6, 223, 35, 13, 49, 6, 222, - 152, 13, 49, 6, 172, 13, 49, 6, 218, 168, 13, 49, 6, 215, 61, 13, 49, 6, - 74, 13, 49, 6, 210, 236, 13, 49, 6, 208, 104, 13, 49, 6, 146, 13, 49, 6, - 206, 8, 13, 49, 6, 200, 43, 13, 49, 6, 66, 13, 49, 6, 196, 12, 13, 49, 6, + 166, 13, 232, 117, 6, 65, 13, 232, 117, 6, 250, 122, 13, 232, 117, 6, + 238, 129, 13, 232, 117, 6, 71, 13, 232, 117, 6, 233, 177, 13, 232, 117, + 6, 232, 53, 13, 232, 117, 6, 223, 37, 13, 232, 117, 6, 222, 154, 13, 232, + 117, 6, 172, 13, 232, 117, 6, 218, 170, 13, 232, 117, 6, 215, 63, 13, + 232, 117, 6, 74, 13, 232, 117, 6, 210, 238, 13, 232, 117, 6, 208, 106, + 13, 232, 117, 6, 206, 9, 13, 232, 117, 6, 200, 43, 13, 232, 117, 6, 66, + 13, 232, 117, 6, 196, 12, 13, 232, 117, 6, 193, 224, 13, 232, 117, 6, + 192, 235, 13, 232, 117, 6, 192, 159, 13, 232, 117, 2, 65, 13, 232, 117, + 2, 250, 122, 13, 232, 117, 2, 247, 195, 13, 232, 117, 2, 238, 129, 13, + 232, 117, 2, 71, 13, 232, 117, 2, 233, 177, 13, 232, 117, 2, 232, 53, 13, + 232, 117, 2, 230, 118, 13, 232, 117, 2, 68, 13, 232, 117, 2, 223, 37, 13, + 232, 117, 2, 222, 154, 13, 232, 117, 2, 172, 13, 232, 117, 2, 218, 170, + 13, 232, 117, 2, 215, 63, 13, 232, 117, 2, 74, 13, 232, 117, 2, 210, 238, + 13, 232, 117, 2, 208, 106, 13, 232, 117, 2, 146, 13, 232, 117, 2, 206, 9, + 13, 232, 117, 2, 200, 43, 13, 232, 117, 2, 66, 13, 232, 117, 2, 196, 12, + 13, 232, 117, 2, 193, 224, 13, 232, 117, 2, 192, 235, 13, 232, 117, 2, + 192, 159, 13, 232, 117, 2, 191, 166, 13, 235, 131, 6, 65, 13, 235, 131, + 6, 250, 122, 13, 235, 131, 6, 238, 129, 13, 235, 131, 6, 71, 13, 235, + 131, 6, 233, 177, 13, 235, 131, 6, 232, 53, 13, 235, 131, 6, 68, 13, 235, + 131, 6, 223, 37, 13, 235, 131, 6, 222, 154, 13, 235, 131, 6, 172, 13, + 235, 131, 6, 218, 170, 13, 235, 131, 6, 74, 13, 235, 131, 6, 206, 9, 13, + 235, 131, 6, 200, 43, 13, 235, 131, 6, 66, 13, 235, 131, 6, 196, 12, 13, + 235, 131, 6, 193, 224, 13, 235, 131, 6, 192, 235, 13, 235, 131, 6, 192, + 159, 13, 235, 131, 2, 65, 13, 235, 131, 2, 250, 122, 13, 235, 131, 2, + 247, 195, 13, 235, 131, 2, 238, 129, 13, 235, 131, 2, 71, 13, 235, 131, + 2, 233, 177, 13, 235, 131, 2, 232, 53, 13, 235, 131, 2, 230, 118, 13, + 235, 131, 2, 68, 13, 235, 131, 2, 223, 37, 13, 235, 131, 2, 222, 154, 13, + 235, 131, 2, 172, 13, 235, 131, 2, 218, 170, 13, 235, 131, 2, 215, 63, + 13, 235, 131, 2, 74, 13, 235, 131, 2, 210, 238, 13, 235, 131, 2, 208, + 106, 13, 235, 131, 2, 146, 13, 235, 131, 2, 206, 9, 13, 235, 131, 2, 200, + 43, 13, 235, 131, 2, 66, 13, 235, 131, 2, 196, 12, 13, 235, 131, 2, 193, + 224, 13, 235, 131, 2, 192, 235, 13, 235, 131, 2, 192, 159, 13, 235, 131, + 2, 191, 166, 13, 28, 232, 117, 6, 65, 13, 28, 232, 117, 6, 250, 122, 13, + 28, 232, 117, 6, 247, 195, 13, 28, 232, 117, 6, 238, 129, 13, 28, 232, + 117, 6, 71, 13, 28, 232, 117, 6, 233, 177, 13, 28, 232, 117, 6, 232, 53, + 13, 28, 232, 117, 6, 230, 118, 13, 28, 232, 117, 6, 68, 13, 28, 232, 117, + 6, 223, 37, 13, 28, 232, 117, 6, 222, 154, 13, 28, 232, 117, 6, 172, 13, + 28, 232, 117, 6, 218, 170, 13, 28, 232, 117, 6, 215, 63, 13, 28, 232, + 117, 6, 74, 13, 28, 232, 117, 6, 210, 238, 13, 28, 232, 117, 6, 208, 106, + 13, 28, 232, 117, 6, 146, 13, 28, 232, 117, 6, 206, 9, 13, 28, 232, 117, + 6, 200, 43, 13, 28, 232, 117, 6, 66, 13, 28, 232, 117, 6, 196, 12, 13, + 28, 232, 117, 6, 193, 224, 13, 28, 232, 117, 6, 192, 235, 13, 28, 232, + 117, 6, 192, 159, 13, 28, 232, 117, 6, 191, 166, 13, 28, 232, 117, 2, 65, + 13, 28, 232, 117, 2, 250, 122, 13, 28, 232, 117, 2, 247, 195, 13, 28, + 232, 117, 2, 238, 129, 13, 28, 232, 117, 2, 71, 13, 28, 232, 117, 2, 233, + 177, 13, 28, 232, 117, 2, 232, 53, 13, 28, 232, 117, 2, 230, 118, 13, 28, + 232, 117, 2, 68, 13, 28, 232, 117, 2, 223, 37, 13, 28, 232, 117, 2, 222, + 154, 13, 28, 232, 117, 2, 172, 13, 28, 232, 117, 2, 218, 170, 13, 28, + 232, 117, 2, 215, 63, 13, 28, 232, 117, 2, 74, 13, 28, 232, 117, 2, 210, + 238, 13, 28, 232, 117, 2, 208, 106, 13, 28, 232, 117, 2, 146, 13, 28, + 232, 117, 2, 206, 9, 13, 28, 232, 117, 2, 200, 43, 13, 28, 232, 117, 2, + 66, 13, 28, 232, 117, 2, 196, 12, 13, 28, 232, 117, 2, 193, 224, 13, 28, + 232, 117, 2, 192, 235, 13, 28, 232, 117, 2, 192, 159, 13, 28, 232, 117, + 2, 191, 166, 13, 49, 6, 65, 13, 49, 6, 250, 122, 13, 49, 6, 247, 195, 13, + 49, 6, 238, 129, 13, 49, 6, 71, 13, 49, 6, 233, 177, 13, 49, 6, 232, 53, + 13, 49, 6, 230, 118, 13, 49, 6, 68, 13, 49, 6, 223, 37, 13, 49, 6, 222, + 154, 13, 49, 6, 172, 13, 49, 6, 218, 170, 13, 49, 6, 215, 63, 13, 49, 6, + 74, 13, 49, 6, 210, 238, 13, 49, 6, 208, 106, 13, 49, 6, 146, 13, 49, 6, + 206, 9, 13, 49, 6, 200, 43, 13, 49, 6, 66, 13, 49, 6, 196, 12, 13, 49, 6, 193, 224, 13, 49, 6, 192, 235, 13, 49, 6, 192, 159, 13, 49, 6, 191, 166, - 13, 49, 2, 65, 13, 49, 2, 250, 120, 13, 49, 2, 247, 193, 13, 49, 2, 238, - 127, 13, 49, 2, 71, 13, 49, 2, 233, 175, 13, 49, 2, 232, 51, 13, 49, 2, - 230, 116, 13, 49, 2, 68, 13, 49, 2, 223, 35, 13, 49, 2, 222, 152, 13, 49, - 2, 172, 13, 49, 2, 218, 168, 13, 49, 2, 215, 61, 13, 49, 2, 74, 13, 49, - 2, 210, 236, 13, 49, 2, 208, 104, 13, 49, 2, 146, 13, 49, 2, 206, 8, 13, + 13, 49, 2, 65, 13, 49, 2, 250, 122, 13, 49, 2, 247, 195, 13, 49, 2, 238, + 129, 13, 49, 2, 71, 13, 49, 2, 233, 177, 13, 49, 2, 232, 53, 13, 49, 2, + 230, 118, 13, 49, 2, 68, 13, 49, 2, 223, 37, 13, 49, 2, 222, 154, 13, 49, + 2, 172, 13, 49, 2, 218, 170, 13, 49, 2, 215, 63, 13, 49, 2, 74, 13, 49, + 2, 210, 238, 13, 49, 2, 208, 106, 13, 49, 2, 146, 13, 49, 2, 206, 9, 13, 49, 2, 200, 43, 13, 49, 2, 66, 13, 49, 2, 196, 12, 13, 49, 2, 193, 224, 13, 49, 2, 192, 235, 13, 49, 2, 192, 159, 13, 49, 2, 191, 166, 13, 49, - 28, 6, 65, 13, 49, 28, 6, 250, 120, 13, 49, 28, 6, 247, 193, 13, 49, 28, - 6, 238, 127, 13, 49, 28, 6, 71, 13, 49, 28, 6, 233, 175, 13, 49, 28, 6, - 232, 51, 13, 49, 28, 6, 230, 116, 13, 49, 28, 6, 68, 13, 49, 28, 6, 223, - 35, 13, 49, 28, 6, 222, 152, 13, 49, 28, 6, 172, 13, 49, 28, 6, 218, 168, - 13, 49, 28, 6, 215, 61, 13, 49, 28, 6, 74, 13, 49, 28, 6, 210, 236, 13, - 49, 28, 6, 208, 104, 13, 49, 28, 6, 146, 13, 49, 28, 6, 206, 8, 13, 49, + 28, 6, 65, 13, 49, 28, 6, 250, 122, 13, 49, 28, 6, 247, 195, 13, 49, 28, + 6, 238, 129, 13, 49, 28, 6, 71, 13, 49, 28, 6, 233, 177, 13, 49, 28, 6, + 232, 53, 13, 49, 28, 6, 230, 118, 13, 49, 28, 6, 68, 13, 49, 28, 6, 223, + 37, 13, 49, 28, 6, 222, 154, 13, 49, 28, 6, 172, 13, 49, 28, 6, 218, 170, + 13, 49, 28, 6, 215, 63, 13, 49, 28, 6, 74, 13, 49, 28, 6, 210, 238, 13, + 49, 28, 6, 208, 106, 13, 49, 28, 6, 146, 13, 49, 28, 6, 206, 9, 13, 49, 28, 6, 200, 43, 13, 49, 28, 6, 66, 13, 49, 28, 6, 196, 12, 13, 49, 28, 6, 193, 224, 13, 49, 28, 6, 192, 235, 13, 49, 28, 6, 192, 159, 13, 49, 28, - 6, 191, 166, 13, 49, 28, 2, 65, 13, 49, 28, 2, 250, 120, 13, 49, 28, 2, - 247, 193, 13, 49, 28, 2, 238, 127, 13, 49, 28, 2, 71, 13, 49, 28, 2, 233, - 175, 13, 49, 28, 2, 232, 51, 13, 49, 28, 2, 230, 116, 13, 49, 28, 2, 68, - 13, 49, 28, 2, 223, 35, 13, 49, 28, 2, 222, 152, 13, 49, 28, 2, 172, 13, - 49, 28, 2, 218, 168, 13, 49, 28, 2, 215, 61, 13, 49, 28, 2, 74, 13, 49, - 28, 2, 210, 236, 13, 49, 28, 2, 208, 104, 13, 49, 28, 2, 146, 13, 49, 28, - 2, 206, 8, 13, 49, 28, 2, 200, 43, 13, 49, 28, 2, 66, 13, 49, 28, 2, 196, + 6, 191, 166, 13, 49, 28, 2, 65, 13, 49, 28, 2, 250, 122, 13, 49, 28, 2, + 247, 195, 13, 49, 28, 2, 238, 129, 13, 49, 28, 2, 71, 13, 49, 28, 2, 233, + 177, 13, 49, 28, 2, 232, 53, 13, 49, 28, 2, 230, 118, 13, 49, 28, 2, 68, + 13, 49, 28, 2, 223, 37, 13, 49, 28, 2, 222, 154, 13, 49, 28, 2, 172, 13, + 49, 28, 2, 218, 170, 13, 49, 28, 2, 215, 63, 13, 49, 28, 2, 74, 13, 49, + 28, 2, 210, 238, 13, 49, 28, 2, 208, 106, 13, 49, 28, 2, 146, 13, 49, 28, + 2, 206, 9, 13, 49, 28, 2, 200, 43, 13, 49, 28, 2, 66, 13, 49, 28, 2, 196, 12, 13, 49, 28, 2, 193, 224, 13, 49, 28, 2, 192, 235, 13, 49, 28, 2, 192, - 159, 13, 49, 28, 2, 191, 166, 13, 49, 43, 6, 65, 13, 49, 43, 6, 250, 120, - 13, 49, 43, 6, 247, 193, 13, 49, 43, 6, 238, 127, 13, 49, 43, 6, 71, 13, - 49, 43, 6, 233, 175, 13, 49, 43, 6, 232, 51, 13, 49, 43, 6, 230, 116, 13, - 49, 43, 6, 68, 13, 49, 43, 6, 223, 35, 13, 49, 43, 6, 222, 152, 13, 49, - 43, 6, 172, 13, 49, 43, 6, 218, 168, 13, 49, 43, 6, 215, 61, 13, 49, 43, - 6, 74, 13, 49, 43, 6, 210, 236, 13, 49, 43, 6, 208, 104, 13, 49, 43, 6, - 146, 13, 49, 43, 6, 206, 8, 13, 49, 43, 6, 200, 43, 13, 49, 43, 6, 66, + 159, 13, 49, 28, 2, 191, 166, 13, 49, 43, 6, 65, 13, 49, 43, 6, 250, 122, + 13, 49, 43, 6, 247, 195, 13, 49, 43, 6, 238, 129, 13, 49, 43, 6, 71, 13, + 49, 43, 6, 233, 177, 13, 49, 43, 6, 232, 53, 13, 49, 43, 6, 230, 118, 13, + 49, 43, 6, 68, 13, 49, 43, 6, 223, 37, 13, 49, 43, 6, 222, 154, 13, 49, + 43, 6, 172, 13, 49, 43, 6, 218, 170, 13, 49, 43, 6, 215, 63, 13, 49, 43, + 6, 74, 13, 49, 43, 6, 210, 238, 13, 49, 43, 6, 208, 106, 13, 49, 43, 6, + 146, 13, 49, 43, 6, 206, 9, 13, 49, 43, 6, 200, 43, 13, 49, 43, 6, 66, 13, 49, 43, 6, 196, 12, 13, 49, 43, 6, 193, 224, 13, 49, 43, 6, 192, 235, 13, 49, 43, 6, 192, 159, 13, 49, 43, 6, 191, 166, 13, 49, 43, 2, 65, 13, - 49, 43, 2, 250, 120, 13, 49, 43, 2, 247, 193, 13, 49, 43, 2, 238, 127, - 13, 49, 43, 2, 71, 13, 49, 43, 2, 233, 175, 13, 49, 43, 2, 232, 51, 13, - 49, 43, 2, 230, 116, 13, 49, 43, 2, 68, 13, 49, 43, 2, 223, 35, 13, 49, - 43, 2, 222, 152, 13, 49, 43, 2, 172, 13, 49, 43, 2, 218, 168, 13, 49, 43, - 2, 215, 61, 13, 49, 43, 2, 74, 13, 49, 43, 2, 210, 236, 13, 49, 43, 2, - 208, 104, 13, 49, 43, 2, 146, 13, 49, 43, 2, 206, 8, 13, 49, 43, 2, 200, + 49, 43, 2, 250, 122, 13, 49, 43, 2, 247, 195, 13, 49, 43, 2, 238, 129, + 13, 49, 43, 2, 71, 13, 49, 43, 2, 233, 177, 13, 49, 43, 2, 232, 53, 13, + 49, 43, 2, 230, 118, 13, 49, 43, 2, 68, 13, 49, 43, 2, 223, 37, 13, 49, + 43, 2, 222, 154, 13, 49, 43, 2, 172, 13, 49, 43, 2, 218, 170, 13, 49, 43, + 2, 215, 63, 13, 49, 43, 2, 74, 13, 49, 43, 2, 210, 238, 13, 49, 43, 2, + 208, 106, 13, 49, 43, 2, 146, 13, 49, 43, 2, 206, 9, 13, 49, 43, 2, 200, 43, 13, 49, 43, 2, 66, 13, 49, 43, 2, 196, 12, 13, 49, 43, 2, 193, 224, 13, 49, 43, 2, 192, 235, 13, 49, 43, 2, 192, 159, 13, 49, 43, 2, 191, - 166, 13, 49, 28, 43, 6, 65, 13, 49, 28, 43, 6, 250, 120, 13, 49, 28, 43, - 6, 247, 193, 13, 49, 28, 43, 6, 238, 127, 13, 49, 28, 43, 6, 71, 13, 49, - 28, 43, 6, 233, 175, 13, 49, 28, 43, 6, 232, 51, 13, 49, 28, 43, 6, 230, - 116, 13, 49, 28, 43, 6, 68, 13, 49, 28, 43, 6, 223, 35, 13, 49, 28, 43, - 6, 222, 152, 13, 49, 28, 43, 6, 172, 13, 49, 28, 43, 6, 218, 168, 13, 49, - 28, 43, 6, 215, 61, 13, 49, 28, 43, 6, 74, 13, 49, 28, 43, 6, 210, 236, - 13, 49, 28, 43, 6, 208, 104, 13, 49, 28, 43, 6, 146, 13, 49, 28, 43, 6, - 206, 8, 13, 49, 28, 43, 6, 200, 43, 13, 49, 28, 43, 6, 66, 13, 49, 28, + 166, 13, 49, 28, 43, 6, 65, 13, 49, 28, 43, 6, 250, 122, 13, 49, 28, 43, + 6, 247, 195, 13, 49, 28, 43, 6, 238, 129, 13, 49, 28, 43, 6, 71, 13, 49, + 28, 43, 6, 233, 177, 13, 49, 28, 43, 6, 232, 53, 13, 49, 28, 43, 6, 230, + 118, 13, 49, 28, 43, 6, 68, 13, 49, 28, 43, 6, 223, 37, 13, 49, 28, 43, + 6, 222, 154, 13, 49, 28, 43, 6, 172, 13, 49, 28, 43, 6, 218, 170, 13, 49, + 28, 43, 6, 215, 63, 13, 49, 28, 43, 6, 74, 13, 49, 28, 43, 6, 210, 238, + 13, 49, 28, 43, 6, 208, 106, 13, 49, 28, 43, 6, 146, 13, 49, 28, 43, 6, + 206, 9, 13, 49, 28, 43, 6, 200, 43, 13, 49, 28, 43, 6, 66, 13, 49, 28, 43, 6, 196, 12, 13, 49, 28, 43, 6, 193, 224, 13, 49, 28, 43, 6, 192, 235, 13, 49, 28, 43, 6, 192, 159, 13, 49, 28, 43, 6, 191, 166, 13, 49, 28, 43, - 2, 65, 13, 49, 28, 43, 2, 250, 120, 13, 49, 28, 43, 2, 247, 193, 13, 49, - 28, 43, 2, 238, 127, 13, 49, 28, 43, 2, 71, 13, 49, 28, 43, 2, 233, 175, - 13, 49, 28, 43, 2, 232, 51, 13, 49, 28, 43, 2, 230, 116, 13, 49, 28, 43, - 2, 68, 13, 49, 28, 43, 2, 223, 35, 13, 49, 28, 43, 2, 222, 152, 13, 49, - 28, 43, 2, 172, 13, 49, 28, 43, 2, 218, 168, 13, 49, 28, 43, 2, 215, 61, - 13, 49, 28, 43, 2, 74, 13, 49, 28, 43, 2, 210, 236, 13, 49, 28, 43, 2, - 208, 104, 13, 49, 28, 43, 2, 146, 13, 49, 28, 43, 2, 206, 8, 13, 49, 28, + 2, 65, 13, 49, 28, 43, 2, 250, 122, 13, 49, 28, 43, 2, 247, 195, 13, 49, + 28, 43, 2, 238, 129, 13, 49, 28, 43, 2, 71, 13, 49, 28, 43, 2, 233, 177, + 13, 49, 28, 43, 2, 232, 53, 13, 49, 28, 43, 2, 230, 118, 13, 49, 28, 43, + 2, 68, 13, 49, 28, 43, 2, 223, 37, 13, 49, 28, 43, 2, 222, 154, 13, 49, + 28, 43, 2, 172, 13, 49, 28, 43, 2, 218, 170, 13, 49, 28, 43, 2, 215, 63, + 13, 49, 28, 43, 2, 74, 13, 49, 28, 43, 2, 210, 238, 13, 49, 28, 43, 2, + 208, 106, 13, 49, 28, 43, 2, 146, 13, 49, 28, 43, 2, 206, 9, 13, 49, 28, 43, 2, 200, 43, 13, 49, 28, 43, 2, 66, 13, 49, 28, 43, 2, 196, 12, 13, 49, 28, 43, 2, 193, 224, 13, 49, 28, 43, 2, 192, 235, 13, 49, 28, 43, 2, - 192, 159, 13, 49, 28, 43, 2, 191, 166, 13, 215, 217, 6, 65, 13, 215, 217, - 6, 250, 120, 13, 215, 217, 6, 247, 193, 13, 215, 217, 6, 238, 127, 13, - 215, 217, 6, 71, 13, 215, 217, 6, 233, 175, 13, 215, 217, 6, 232, 51, 13, - 215, 217, 6, 230, 116, 13, 215, 217, 6, 68, 13, 215, 217, 6, 223, 35, 13, - 215, 217, 6, 222, 152, 13, 215, 217, 6, 172, 13, 215, 217, 6, 218, 168, - 13, 215, 217, 6, 215, 61, 13, 215, 217, 6, 74, 13, 215, 217, 6, 210, 236, - 13, 215, 217, 6, 208, 104, 13, 215, 217, 6, 146, 13, 215, 217, 6, 206, 8, - 13, 215, 217, 6, 200, 43, 13, 215, 217, 6, 66, 13, 215, 217, 6, 196, 12, - 13, 215, 217, 6, 193, 224, 13, 215, 217, 6, 192, 235, 13, 215, 217, 6, - 192, 159, 13, 215, 217, 6, 191, 166, 13, 215, 217, 2, 65, 13, 215, 217, - 2, 250, 120, 13, 215, 217, 2, 247, 193, 13, 215, 217, 2, 238, 127, 13, - 215, 217, 2, 71, 13, 215, 217, 2, 233, 175, 13, 215, 217, 2, 232, 51, 13, - 215, 217, 2, 230, 116, 13, 215, 217, 2, 68, 13, 215, 217, 2, 223, 35, 13, - 215, 217, 2, 222, 152, 13, 215, 217, 2, 172, 13, 215, 217, 2, 218, 168, - 13, 215, 217, 2, 215, 61, 13, 215, 217, 2, 74, 13, 215, 217, 2, 210, 236, - 13, 215, 217, 2, 208, 104, 13, 215, 217, 2, 146, 13, 215, 217, 2, 206, 8, - 13, 215, 217, 2, 200, 43, 13, 215, 217, 2, 66, 13, 215, 217, 2, 196, 12, - 13, 215, 217, 2, 193, 224, 13, 215, 217, 2, 192, 235, 13, 215, 217, 2, - 192, 159, 13, 215, 217, 2, 191, 166, 13, 43, 2, 236, 139, 68, 13, 43, 2, - 236, 139, 223, 35, 13, 28, 6, 251, 160, 13, 28, 6, 248, 212, 13, 28, 6, - 231, 211, 13, 28, 6, 237, 106, 13, 28, 6, 234, 47, 13, 28, 6, 191, 76, - 13, 28, 6, 233, 253, 13, 28, 6, 199, 15, 13, 28, 6, 223, 83, 13, 28, 6, - 222, 72, 13, 28, 6, 220, 31, 13, 28, 6, 215, 155, 13, 28, 6, 212, 178, - 13, 28, 6, 192, 207, 13, 28, 6, 211, 107, 13, 28, 6, 209, 185, 13, 28, 6, - 207, 3, 13, 28, 6, 199, 16, 113, 13, 28, 6, 202, 196, 13, 28, 6, 199, - 166, 13, 28, 6, 196, 70, 13, 28, 6, 209, 211, 13, 28, 6, 243, 95, 13, 28, - 6, 208, 176, 13, 28, 6, 211, 110, 13, 28, 214, 245, 13, 28, 2, 251, 160, - 13, 28, 2, 248, 212, 13, 28, 2, 231, 211, 13, 28, 2, 237, 106, 13, 28, 2, - 234, 47, 13, 28, 2, 191, 76, 13, 28, 2, 233, 253, 13, 28, 2, 199, 15, 13, - 28, 2, 223, 83, 13, 28, 2, 222, 72, 13, 28, 2, 220, 31, 13, 28, 2, 215, - 155, 13, 28, 2, 212, 178, 13, 28, 2, 192, 207, 13, 28, 2, 211, 107, 13, - 28, 2, 209, 185, 13, 28, 2, 207, 3, 13, 28, 2, 53, 202, 196, 13, 28, 2, - 202, 196, 13, 28, 2, 199, 166, 13, 28, 2, 196, 70, 13, 28, 2, 209, 211, - 13, 28, 2, 243, 95, 13, 28, 2, 208, 176, 13, 28, 2, 211, 110, 13, 28, - 210, 105, 237, 16, 13, 28, 234, 48, 113, 13, 28, 199, 16, 113, 13, 28, - 222, 73, 113, 13, 28, 209, 212, 113, 13, 28, 207, 4, 113, 13, 28, 209, - 186, 113, 13, 43, 6, 251, 160, 13, 43, 6, 248, 212, 13, 43, 6, 231, 211, - 13, 43, 6, 237, 106, 13, 43, 6, 234, 47, 13, 43, 6, 191, 76, 13, 43, 6, - 233, 253, 13, 43, 6, 199, 15, 13, 43, 6, 223, 83, 13, 43, 6, 222, 72, 13, - 43, 6, 220, 31, 13, 43, 6, 215, 155, 13, 43, 6, 212, 178, 13, 43, 6, 192, - 207, 13, 43, 6, 211, 107, 13, 43, 6, 209, 185, 13, 43, 6, 207, 3, 13, 43, - 6, 199, 16, 113, 13, 43, 6, 202, 196, 13, 43, 6, 199, 166, 13, 43, 6, - 196, 70, 13, 43, 6, 209, 211, 13, 43, 6, 243, 95, 13, 43, 6, 208, 176, - 13, 43, 6, 211, 110, 13, 43, 214, 245, 13, 43, 2, 251, 160, 13, 43, 2, - 248, 212, 13, 43, 2, 231, 211, 13, 43, 2, 237, 106, 13, 43, 2, 234, 47, - 13, 43, 2, 191, 76, 13, 43, 2, 233, 253, 13, 43, 2, 199, 15, 13, 43, 2, - 223, 83, 13, 43, 2, 222, 72, 13, 43, 2, 220, 31, 13, 43, 2, 215, 155, 13, - 43, 2, 212, 178, 13, 43, 2, 192, 207, 13, 43, 2, 211, 107, 13, 43, 2, - 209, 185, 13, 43, 2, 207, 3, 13, 43, 2, 53, 202, 196, 13, 43, 2, 202, - 196, 13, 43, 2, 199, 166, 13, 43, 2, 196, 70, 13, 43, 2, 209, 211, 13, - 43, 2, 243, 95, 13, 43, 2, 208, 176, 13, 43, 2, 211, 110, 13, 43, 210, - 105, 237, 16, 13, 43, 234, 48, 113, 13, 43, 199, 16, 113, 13, 43, 222, - 73, 113, 13, 43, 209, 212, 113, 13, 43, 207, 4, 113, 13, 43, 209, 186, - 113, 13, 28, 43, 6, 251, 160, 13, 28, 43, 6, 248, 212, 13, 28, 43, 6, - 231, 211, 13, 28, 43, 6, 237, 106, 13, 28, 43, 6, 234, 47, 13, 28, 43, 6, - 191, 76, 13, 28, 43, 6, 233, 253, 13, 28, 43, 6, 199, 15, 13, 28, 43, 6, - 223, 83, 13, 28, 43, 6, 222, 72, 13, 28, 43, 6, 220, 31, 13, 28, 43, 6, - 215, 155, 13, 28, 43, 6, 212, 178, 13, 28, 43, 6, 192, 207, 13, 28, 43, - 6, 211, 107, 13, 28, 43, 6, 209, 185, 13, 28, 43, 6, 207, 3, 13, 28, 43, - 6, 199, 16, 113, 13, 28, 43, 6, 202, 196, 13, 28, 43, 6, 199, 166, 13, - 28, 43, 6, 196, 70, 13, 28, 43, 6, 209, 211, 13, 28, 43, 6, 243, 95, 13, - 28, 43, 6, 208, 176, 13, 28, 43, 6, 211, 110, 13, 28, 43, 214, 245, 13, - 28, 43, 2, 251, 160, 13, 28, 43, 2, 248, 212, 13, 28, 43, 2, 231, 211, - 13, 28, 43, 2, 237, 106, 13, 28, 43, 2, 234, 47, 13, 28, 43, 2, 191, 76, - 13, 28, 43, 2, 233, 253, 13, 28, 43, 2, 199, 15, 13, 28, 43, 2, 223, 83, - 13, 28, 43, 2, 222, 72, 13, 28, 43, 2, 220, 31, 13, 28, 43, 2, 215, 155, - 13, 28, 43, 2, 212, 178, 13, 28, 43, 2, 192, 207, 13, 28, 43, 2, 211, - 107, 13, 28, 43, 2, 209, 185, 13, 28, 43, 2, 207, 3, 13, 28, 43, 2, 53, - 202, 196, 13, 28, 43, 2, 202, 196, 13, 28, 43, 2, 199, 166, 13, 28, 43, - 2, 196, 70, 13, 28, 43, 2, 209, 211, 13, 28, 43, 2, 243, 95, 13, 28, 43, - 2, 208, 176, 13, 28, 43, 2, 211, 110, 13, 28, 43, 210, 105, 237, 16, 13, - 28, 43, 234, 48, 113, 13, 28, 43, 199, 16, 113, 13, 28, 43, 222, 73, 113, - 13, 28, 43, 209, 212, 113, 13, 28, 43, 207, 4, 113, 13, 28, 43, 209, 186, - 113, 13, 49, 28, 6, 251, 160, 13, 49, 28, 6, 248, 212, 13, 49, 28, 6, - 231, 211, 13, 49, 28, 6, 237, 106, 13, 49, 28, 6, 234, 47, 13, 49, 28, 6, - 191, 76, 13, 49, 28, 6, 233, 253, 13, 49, 28, 6, 199, 15, 13, 49, 28, 6, - 223, 83, 13, 49, 28, 6, 222, 72, 13, 49, 28, 6, 220, 31, 13, 49, 28, 6, - 215, 155, 13, 49, 28, 6, 212, 178, 13, 49, 28, 6, 192, 207, 13, 49, 28, - 6, 211, 107, 13, 49, 28, 6, 209, 185, 13, 49, 28, 6, 207, 3, 13, 49, 28, - 6, 199, 16, 113, 13, 49, 28, 6, 202, 196, 13, 49, 28, 6, 199, 166, 13, - 49, 28, 6, 196, 70, 13, 49, 28, 6, 209, 211, 13, 49, 28, 6, 243, 95, 13, - 49, 28, 6, 208, 176, 13, 49, 28, 6, 211, 110, 13, 49, 28, 214, 245, 13, - 49, 28, 2, 251, 160, 13, 49, 28, 2, 248, 212, 13, 49, 28, 2, 231, 211, - 13, 49, 28, 2, 237, 106, 13, 49, 28, 2, 234, 47, 13, 49, 28, 2, 191, 76, - 13, 49, 28, 2, 233, 253, 13, 49, 28, 2, 199, 15, 13, 49, 28, 2, 223, 83, - 13, 49, 28, 2, 222, 72, 13, 49, 28, 2, 220, 31, 13, 49, 28, 2, 215, 155, - 13, 49, 28, 2, 212, 178, 13, 49, 28, 2, 192, 207, 13, 49, 28, 2, 211, - 107, 13, 49, 28, 2, 209, 185, 13, 49, 28, 2, 207, 3, 13, 49, 28, 2, 53, - 202, 196, 13, 49, 28, 2, 202, 196, 13, 49, 28, 2, 199, 166, 13, 49, 28, - 2, 196, 70, 13, 49, 28, 2, 209, 211, 13, 49, 28, 2, 243, 95, 13, 49, 28, - 2, 208, 176, 13, 49, 28, 2, 211, 110, 13, 49, 28, 210, 105, 237, 16, 13, - 49, 28, 234, 48, 113, 13, 49, 28, 199, 16, 113, 13, 49, 28, 222, 73, 113, - 13, 49, 28, 209, 212, 113, 13, 49, 28, 207, 4, 113, 13, 49, 28, 209, 186, - 113, 13, 49, 28, 43, 6, 251, 160, 13, 49, 28, 43, 6, 248, 212, 13, 49, - 28, 43, 6, 231, 211, 13, 49, 28, 43, 6, 237, 106, 13, 49, 28, 43, 6, 234, - 47, 13, 49, 28, 43, 6, 191, 76, 13, 49, 28, 43, 6, 233, 253, 13, 49, 28, - 43, 6, 199, 15, 13, 49, 28, 43, 6, 223, 83, 13, 49, 28, 43, 6, 222, 72, - 13, 49, 28, 43, 6, 220, 31, 13, 49, 28, 43, 6, 215, 155, 13, 49, 28, 43, - 6, 212, 178, 13, 49, 28, 43, 6, 192, 207, 13, 49, 28, 43, 6, 211, 107, - 13, 49, 28, 43, 6, 209, 185, 13, 49, 28, 43, 6, 207, 3, 13, 49, 28, 43, - 6, 199, 16, 113, 13, 49, 28, 43, 6, 202, 196, 13, 49, 28, 43, 6, 199, - 166, 13, 49, 28, 43, 6, 196, 70, 13, 49, 28, 43, 6, 209, 211, 13, 49, 28, - 43, 6, 243, 95, 13, 49, 28, 43, 6, 208, 176, 13, 49, 28, 43, 6, 211, 110, - 13, 49, 28, 43, 214, 245, 13, 49, 28, 43, 2, 251, 160, 13, 49, 28, 43, 2, - 248, 212, 13, 49, 28, 43, 2, 231, 211, 13, 49, 28, 43, 2, 237, 106, 13, - 49, 28, 43, 2, 234, 47, 13, 49, 28, 43, 2, 191, 76, 13, 49, 28, 43, 2, - 233, 253, 13, 49, 28, 43, 2, 199, 15, 13, 49, 28, 43, 2, 223, 83, 13, 49, - 28, 43, 2, 222, 72, 13, 49, 28, 43, 2, 220, 31, 13, 49, 28, 43, 2, 215, - 155, 13, 49, 28, 43, 2, 212, 178, 13, 49, 28, 43, 2, 192, 207, 13, 49, - 28, 43, 2, 211, 107, 13, 49, 28, 43, 2, 209, 185, 13, 49, 28, 43, 2, 207, - 3, 13, 49, 28, 43, 2, 53, 202, 196, 13, 49, 28, 43, 2, 202, 196, 13, 49, + 192, 159, 13, 49, 28, 43, 2, 191, 166, 13, 215, 219, 6, 65, 13, 215, 219, + 6, 250, 122, 13, 215, 219, 6, 247, 195, 13, 215, 219, 6, 238, 129, 13, + 215, 219, 6, 71, 13, 215, 219, 6, 233, 177, 13, 215, 219, 6, 232, 53, 13, + 215, 219, 6, 230, 118, 13, 215, 219, 6, 68, 13, 215, 219, 6, 223, 37, 13, + 215, 219, 6, 222, 154, 13, 215, 219, 6, 172, 13, 215, 219, 6, 218, 170, + 13, 215, 219, 6, 215, 63, 13, 215, 219, 6, 74, 13, 215, 219, 6, 210, 238, + 13, 215, 219, 6, 208, 106, 13, 215, 219, 6, 146, 13, 215, 219, 6, 206, 9, + 13, 215, 219, 6, 200, 43, 13, 215, 219, 6, 66, 13, 215, 219, 6, 196, 12, + 13, 215, 219, 6, 193, 224, 13, 215, 219, 6, 192, 235, 13, 215, 219, 6, + 192, 159, 13, 215, 219, 6, 191, 166, 13, 215, 219, 2, 65, 13, 215, 219, + 2, 250, 122, 13, 215, 219, 2, 247, 195, 13, 215, 219, 2, 238, 129, 13, + 215, 219, 2, 71, 13, 215, 219, 2, 233, 177, 13, 215, 219, 2, 232, 53, 13, + 215, 219, 2, 230, 118, 13, 215, 219, 2, 68, 13, 215, 219, 2, 223, 37, 13, + 215, 219, 2, 222, 154, 13, 215, 219, 2, 172, 13, 215, 219, 2, 218, 170, + 13, 215, 219, 2, 215, 63, 13, 215, 219, 2, 74, 13, 215, 219, 2, 210, 238, + 13, 215, 219, 2, 208, 106, 13, 215, 219, 2, 146, 13, 215, 219, 2, 206, 9, + 13, 215, 219, 2, 200, 43, 13, 215, 219, 2, 66, 13, 215, 219, 2, 196, 12, + 13, 215, 219, 2, 193, 224, 13, 215, 219, 2, 192, 235, 13, 215, 219, 2, + 192, 159, 13, 215, 219, 2, 191, 166, 13, 43, 2, 236, 141, 68, 13, 43, 2, + 236, 141, 223, 37, 13, 28, 6, 251, 162, 13, 28, 6, 248, 214, 13, 28, 6, + 231, 213, 13, 28, 6, 237, 108, 13, 28, 6, 234, 49, 13, 28, 6, 191, 76, + 13, 28, 6, 233, 255, 13, 28, 6, 199, 15, 13, 28, 6, 223, 85, 13, 28, 6, + 222, 74, 13, 28, 6, 220, 33, 13, 28, 6, 215, 157, 13, 28, 6, 212, 180, + 13, 28, 6, 192, 207, 13, 28, 6, 211, 109, 13, 28, 6, 209, 187, 13, 28, 6, + 207, 4, 13, 28, 6, 199, 16, 113, 13, 28, 6, 202, 197, 13, 28, 6, 199, + 166, 13, 28, 6, 196, 70, 13, 28, 6, 209, 213, 13, 28, 6, 243, 97, 13, 28, + 6, 208, 178, 13, 28, 6, 211, 112, 13, 28, 214, 247, 13, 28, 2, 251, 162, + 13, 28, 2, 248, 214, 13, 28, 2, 231, 213, 13, 28, 2, 237, 108, 13, 28, 2, + 234, 49, 13, 28, 2, 191, 76, 13, 28, 2, 233, 255, 13, 28, 2, 199, 15, 13, + 28, 2, 223, 85, 13, 28, 2, 222, 74, 13, 28, 2, 220, 33, 13, 28, 2, 215, + 157, 13, 28, 2, 212, 180, 13, 28, 2, 192, 207, 13, 28, 2, 211, 109, 13, + 28, 2, 209, 187, 13, 28, 2, 207, 4, 13, 28, 2, 53, 202, 197, 13, 28, 2, + 202, 197, 13, 28, 2, 199, 166, 13, 28, 2, 196, 70, 13, 28, 2, 209, 213, + 13, 28, 2, 243, 97, 13, 28, 2, 208, 178, 13, 28, 2, 211, 112, 13, 28, + 210, 107, 237, 18, 13, 28, 234, 50, 113, 13, 28, 199, 16, 113, 13, 28, + 222, 75, 113, 13, 28, 209, 214, 113, 13, 28, 207, 5, 113, 13, 28, 209, + 188, 113, 13, 43, 6, 251, 162, 13, 43, 6, 248, 214, 13, 43, 6, 231, 213, + 13, 43, 6, 237, 108, 13, 43, 6, 234, 49, 13, 43, 6, 191, 76, 13, 43, 6, + 233, 255, 13, 43, 6, 199, 15, 13, 43, 6, 223, 85, 13, 43, 6, 222, 74, 13, + 43, 6, 220, 33, 13, 43, 6, 215, 157, 13, 43, 6, 212, 180, 13, 43, 6, 192, + 207, 13, 43, 6, 211, 109, 13, 43, 6, 209, 187, 13, 43, 6, 207, 4, 13, 43, + 6, 199, 16, 113, 13, 43, 6, 202, 197, 13, 43, 6, 199, 166, 13, 43, 6, + 196, 70, 13, 43, 6, 209, 213, 13, 43, 6, 243, 97, 13, 43, 6, 208, 178, + 13, 43, 6, 211, 112, 13, 43, 214, 247, 13, 43, 2, 251, 162, 13, 43, 2, + 248, 214, 13, 43, 2, 231, 213, 13, 43, 2, 237, 108, 13, 43, 2, 234, 49, + 13, 43, 2, 191, 76, 13, 43, 2, 233, 255, 13, 43, 2, 199, 15, 13, 43, 2, + 223, 85, 13, 43, 2, 222, 74, 13, 43, 2, 220, 33, 13, 43, 2, 215, 157, 13, + 43, 2, 212, 180, 13, 43, 2, 192, 207, 13, 43, 2, 211, 109, 13, 43, 2, + 209, 187, 13, 43, 2, 207, 4, 13, 43, 2, 53, 202, 197, 13, 43, 2, 202, + 197, 13, 43, 2, 199, 166, 13, 43, 2, 196, 70, 13, 43, 2, 209, 213, 13, + 43, 2, 243, 97, 13, 43, 2, 208, 178, 13, 43, 2, 211, 112, 13, 43, 210, + 107, 237, 18, 13, 43, 234, 50, 113, 13, 43, 199, 16, 113, 13, 43, 222, + 75, 113, 13, 43, 209, 214, 113, 13, 43, 207, 5, 113, 13, 43, 209, 188, + 113, 13, 28, 43, 6, 251, 162, 13, 28, 43, 6, 248, 214, 13, 28, 43, 6, + 231, 213, 13, 28, 43, 6, 237, 108, 13, 28, 43, 6, 234, 49, 13, 28, 43, 6, + 191, 76, 13, 28, 43, 6, 233, 255, 13, 28, 43, 6, 199, 15, 13, 28, 43, 6, + 223, 85, 13, 28, 43, 6, 222, 74, 13, 28, 43, 6, 220, 33, 13, 28, 43, 6, + 215, 157, 13, 28, 43, 6, 212, 180, 13, 28, 43, 6, 192, 207, 13, 28, 43, + 6, 211, 109, 13, 28, 43, 6, 209, 187, 13, 28, 43, 6, 207, 4, 13, 28, 43, + 6, 199, 16, 113, 13, 28, 43, 6, 202, 197, 13, 28, 43, 6, 199, 166, 13, + 28, 43, 6, 196, 70, 13, 28, 43, 6, 209, 213, 13, 28, 43, 6, 243, 97, 13, + 28, 43, 6, 208, 178, 13, 28, 43, 6, 211, 112, 13, 28, 43, 214, 247, 13, + 28, 43, 2, 251, 162, 13, 28, 43, 2, 248, 214, 13, 28, 43, 2, 231, 213, + 13, 28, 43, 2, 237, 108, 13, 28, 43, 2, 234, 49, 13, 28, 43, 2, 191, 76, + 13, 28, 43, 2, 233, 255, 13, 28, 43, 2, 199, 15, 13, 28, 43, 2, 223, 85, + 13, 28, 43, 2, 222, 74, 13, 28, 43, 2, 220, 33, 13, 28, 43, 2, 215, 157, + 13, 28, 43, 2, 212, 180, 13, 28, 43, 2, 192, 207, 13, 28, 43, 2, 211, + 109, 13, 28, 43, 2, 209, 187, 13, 28, 43, 2, 207, 4, 13, 28, 43, 2, 53, + 202, 197, 13, 28, 43, 2, 202, 197, 13, 28, 43, 2, 199, 166, 13, 28, 43, + 2, 196, 70, 13, 28, 43, 2, 209, 213, 13, 28, 43, 2, 243, 97, 13, 28, 43, + 2, 208, 178, 13, 28, 43, 2, 211, 112, 13, 28, 43, 210, 107, 237, 18, 13, + 28, 43, 234, 50, 113, 13, 28, 43, 199, 16, 113, 13, 28, 43, 222, 75, 113, + 13, 28, 43, 209, 214, 113, 13, 28, 43, 207, 5, 113, 13, 28, 43, 209, 188, + 113, 13, 49, 28, 6, 251, 162, 13, 49, 28, 6, 248, 214, 13, 49, 28, 6, + 231, 213, 13, 49, 28, 6, 237, 108, 13, 49, 28, 6, 234, 49, 13, 49, 28, 6, + 191, 76, 13, 49, 28, 6, 233, 255, 13, 49, 28, 6, 199, 15, 13, 49, 28, 6, + 223, 85, 13, 49, 28, 6, 222, 74, 13, 49, 28, 6, 220, 33, 13, 49, 28, 6, + 215, 157, 13, 49, 28, 6, 212, 180, 13, 49, 28, 6, 192, 207, 13, 49, 28, + 6, 211, 109, 13, 49, 28, 6, 209, 187, 13, 49, 28, 6, 207, 4, 13, 49, 28, + 6, 199, 16, 113, 13, 49, 28, 6, 202, 197, 13, 49, 28, 6, 199, 166, 13, + 49, 28, 6, 196, 70, 13, 49, 28, 6, 209, 213, 13, 49, 28, 6, 243, 97, 13, + 49, 28, 6, 208, 178, 13, 49, 28, 6, 211, 112, 13, 49, 28, 214, 247, 13, + 49, 28, 2, 251, 162, 13, 49, 28, 2, 248, 214, 13, 49, 28, 2, 231, 213, + 13, 49, 28, 2, 237, 108, 13, 49, 28, 2, 234, 49, 13, 49, 28, 2, 191, 76, + 13, 49, 28, 2, 233, 255, 13, 49, 28, 2, 199, 15, 13, 49, 28, 2, 223, 85, + 13, 49, 28, 2, 222, 74, 13, 49, 28, 2, 220, 33, 13, 49, 28, 2, 215, 157, + 13, 49, 28, 2, 212, 180, 13, 49, 28, 2, 192, 207, 13, 49, 28, 2, 211, + 109, 13, 49, 28, 2, 209, 187, 13, 49, 28, 2, 207, 4, 13, 49, 28, 2, 53, + 202, 197, 13, 49, 28, 2, 202, 197, 13, 49, 28, 2, 199, 166, 13, 49, 28, + 2, 196, 70, 13, 49, 28, 2, 209, 213, 13, 49, 28, 2, 243, 97, 13, 49, 28, + 2, 208, 178, 13, 49, 28, 2, 211, 112, 13, 49, 28, 210, 107, 237, 18, 13, + 49, 28, 234, 50, 113, 13, 49, 28, 199, 16, 113, 13, 49, 28, 222, 75, 113, + 13, 49, 28, 209, 214, 113, 13, 49, 28, 207, 5, 113, 13, 49, 28, 209, 188, + 113, 13, 49, 28, 43, 6, 251, 162, 13, 49, 28, 43, 6, 248, 214, 13, 49, + 28, 43, 6, 231, 213, 13, 49, 28, 43, 6, 237, 108, 13, 49, 28, 43, 6, 234, + 49, 13, 49, 28, 43, 6, 191, 76, 13, 49, 28, 43, 6, 233, 255, 13, 49, 28, + 43, 6, 199, 15, 13, 49, 28, 43, 6, 223, 85, 13, 49, 28, 43, 6, 222, 74, + 13, 49, 28, 43, 6, 220, 33, 13, 49, 28, 43, 6, 215, 157, 13, 49, 28, 43, + 6, 212, 180, 13, 49, 28, 43, 6, 192, 207, 13, 49, 28, 43, 6, 211, 109, + 13, 49, 28, 43, 6, 209, 187, 13, 49, 28, 43, 6, 207, 4, 13, 49, 28, 43, + 6, 199, 16, 113, 13, 49, 28, 43, 6, 202, 197, 13, 49, 28, 43, 6, 199, + 166, 13, 49, 28, 43, 6, 196, 70, 13, 49, 28, 43, 6, 209, 213, 13, 49, 28, + 43, 6, 243, 97, 13, 49, 28, 43, 6, 208, 178, 13, 49, 28, 43, 6, 211, 112, + 13, 49, 28, 43, 214, 247, 13, 49, 28, 43, 2, 251, 162, 13, 49, 28, 43, 2, + 248, 214, 13, 49, 28, 43, 2, 231, 213, 13, 49, 28, 43, 2, 237, 108, 13, + 49, 28, 43, 2, 234, 49, 13, 49, 28, 43, 2, 191, 76, 13, 49, 28, 43, 2, + 233, 255, 13, 49, 28, 43, 2, 199, 15, 13, 49, 28, 43, 2, 223, 85, 13, 49, + 28, 43, 2, 222, 74, 13, 49, 28, 43, 2, 220, 33, 13, 49, 28, 43, 2, 215, + 157, 13, 49, 28, 43, 2, 212, 180, 13, 49, 28, 43, 2, 192, 207, 13, 49, + 28, 43, 2, 211, 109, 13, 49, 28, 43, 2, 209, 187, 13, 49, 28, 43, 2, 207, + 4, 13, 49, 28, 43, 2, 53, 202, 197, 13, 49, 28, 43, 2, 202, 197, 13, 49, 28, 43, 2, 199, 166, 13, 49, 28, 43, 2, 196, 70, 13, 49, 28, 43, 2, 209, - 211, 13, 49, 28, 43, 2, 243, 95, 13, 49, 28, 43, 2, 208, 176, 13, 49, 28, - 43, 2, 211, 110, 13, 49, 28, 43, 210, 105, 237, 16, 13, 49, 28, 43, 234, - 48, 113, 13, 49, 28, 43, 199, 16, 113, 13, 49, 28, 43, 222, 73, 113, 13, - 49, 28, 43, 209, 212, 113, 13, 49, 28, 43, 207, 4, 113, 13, 49, 28, 43, - 209, 186, 113, 13, 28, 6, 237, 10, 13, 28, 2, 237, 10, 13, 28, 17, 191, + 213, 13, 49, 28, 43, 2, 243, 97, 13, 49, 28, 43, 2, 208, 178, 13, 49, 28, + 43, 2, 211, 112, 13, 49, 28, 43, 210, 107, 237, 18, 13, 49, 28, 43, 234, + 50, 113, 13, 49, 28, 43, 199, 16, 113, 13, 49, 28, 43, 222, 75, 113, 13, + 49, 28, 43, 209, 214, 113, 13, 49, 28, 43, 207, 5, 113, 13, 49, 28, 43, + 209, 188, 113, 13, 28, 6, 237, 12, 13, 28, 2, 237, 12, 13, 28, 17, 191, 77, 13, 28, 17, 107, 13, 28, 17, 109, 13, 28, 17, 138, 13, 28, 17, 134, - 13, 28, 17, 149, 13, 28, 17, 169, 13, 28, 17, 175, 13, 28, 17, 171, 13, - 28, 17, 178, 13, 235, 129, 17, 191, 77, 13, 235, 129, 17, 107, 13, 235, - 129, 17, 109, 13, 235, 129, 17, 138, 13, 235, 129, 17, 134, 13, 235, 129, - 17, 149, 13, 235, 129, 17, 169, 13, 235, 129, 17, 175, 13, 235, 129, 17, - 171, 13, 235, 129, 17, 178, 13, 49, 17, 191, 77, 13, 49, 17, 107, 13, 49, - 17, 109, 13, 49, 17, 138, 13, 49, 17, 134, 13, 49, 17, 149, 13, 49, 17, + 13, 28, 17, 150, 13, 28, 17, 169, 13, 28, 17, 175, 13, 28, 17, 171, 13, + 28, 17, 178, 13, 235, 131, 17, 191, 77, 13, 235, 131, 17, 107, 13, 235, + 131, 17, 109, 13, 235, 131, 17, 138, 13, 235, 131, 17, 134, 13, 235, 131, + 17, 150, 13, 235, 131, 17, 169, 13, 235, 131, 17, 175, 13, 235, 131, 17, + 171, 13, 235, 131, 17, 178, 13, 49, 17, 191, 77, 13, 49, 17, 107, 13, 49, + 17, 109, 13, 49, 17, 138, 13, 49, 17, 134, 13, 49, 17, 150, 13, 49, 17, 169, 13, 49, 17, 175, 13, 49, 17, 171, 13, 49, 17, 178, 13, 49, 28, 17, 191, 77, 13, 49, 28, 17, 107, 13, 49, 28, 17, 109, 13, 49, 28, 17, 138, - 13, 49, 28, 17, 134, 13, 49, 28, 17, 149, 13, 49, 28, 17, 169, 13, 49, - 28, 17, 175, 13, 49, 28, 17, 171, 13, 49, 28, 17, 178, 13, 215, 217, 17, - 191, 77, 13, 215, 217, 17, 107, 13, 215, 217, 17, 109, 13, 215, 217, 17, - 138, 13, 215, 217, 17, 134, 13, 215, 217, 17, 149, 13, 215, 217, 17, 169, - 13, 215, 217, 17, 175, 13, 215, 217, 17, 171, 13, 215, 217, 17, 178, 24, - 151, 223, 148, 24, 230, 50, 223, 148, 24, 230, 46, 223, 148, 24, 230, 35, - 223, 148, 24, 230, 39, 223, 148, 24, 230, 52, 223, 148, 24, 151, 141, - 248, 223, 24, 230, 50, 141, 248, 223, 24, 151, 176, 196, 105, 141, 248, - 223, 24, 151, 141, 207, 147, 221, 70, 24, 151, 141, 238, 177, 24, 151, - 141, 229, 124, 24, 151, 141, 229, 125, 218, 241, 24, 230, 50, 141, 229, - 126, 24, 151, 141, 216, 84, 24, 230, 50, 141, 216, 84, 24, 151, 141, 82, - 248, 223, 24, 151, 141, 82, 207, 147, 221, 69, 24, 151, 141, 82, 229, - 124, 24, 151, 141, 133, 82, 229, 124, 24, 151, 141, 229, 125, 82, 196, - 77, 24, 151, 141, 82, 239, 46, 24, 151, 141, 82, 239, 47, 141, 248, 223, - 24, 151, 141, 82, 239, 47, 82, 248, 223, 24, 151, 141, 82, 239, 47, 238, - 177, 24, 151, 141, 82, 239, 47, 229, 124, 24, 151, 141, 82, 238, 213, 24, - 230, 50, 141, 82, 238, 213, 24, 151, 82, 248, 224, 139, 223, 148, 24, - 151, 141, 248, 224, 139, 216, 84, 24, 151, 141, 82, 198, 212, 24, 230, - 50, 141, 82, 198, 212, 24, 151, 141, 82, 201, 53, 176, 248, 223, 24, 151, - 141, 82, 248, 224, 176, 201, 52, 24, 151, 141, 82, 176, 248, 223, 24, - 151, 141, 82, 229, 125, 201, 199, 176, 202, 207, 24, 151, 141, 133, 82, - 229, 125, 176, 202, 207, 24, 151, 141, 133, 82, 229, 125, 176, 239, 46, - 24, 151, 141, 229, 125, 82, 133, 176, 202, 207, 24, 151, 141, 82, 133, - 201, 199, 176, 232, 132, 24, 151, 141, 82, 176, 238, 177, 24, 151, 141, - 82, 176, 243, 9, 24, 151, 141, 82, 176, 228, 249, 24, 151, 141, 82, 176, - 229, 124, 24, 151, 176, 248, 210, 141, 82, 201, 52, 24, 151, 141, 82, - 239, 47, 176, 202, 207, 24, 151, 141, 82, 239, 47, 176, 202, 208, 239, - 46, 24, 151, 141, 82, 239, 47, 176, 202, 208, 248, 223, 24, 151, 82, 176, - 228, 250, 141, 196, 77, 24, 151, 141, 176, 228, 250, 82, 196, 77, 24, - 151, 141, 82, 239, 47, 229, 125, 176, 202, 207, 24, 151, 141, 82, 238, - 214, 176, 202, 207, 24, 151, 141, 82, 239, 47, 176, 232, 132, 24, 151, - 141, 82, 239, 47, 238, 178, 176, 232, 132, 24, 151, 82, 176, 238, 178, - 141, 196, 77, 24, 151, 141, 176, 238, 178, 82, 196, 77, 24, 151, 82, 176, - 47, 141, 196, 77, 24, 151, 82, 176, 47, 141, 229, 124, 24, 151, 141, 176, - 251, 114, 211, 15, 82, 196, 77, 24, 151, 141, 176, 251, 114, 223, 163, - 82, 196, 77, 24, 151, 141, 176, 47, 82, 196, 77, 24, 151, 141, 82, 176, - 239, 47, 229, 124, 24, 151, 141, 82, 176, 251, 114, 211, 14, 24, 151, - 141, 82, 176, 251, 113, 24, 151, 82, 176, 251, 114, 211, 15, 141, 196, - 77, 24, 151, 82, 176, 251, 114, 211, 15, 141, 238, 213, 24, 151, 82, 176, - 251, 114, 141, 196, 77, 24, 151, 141, 176, 228, 250, 82, 229, 124, 24, - 230, 41, 232, 128, 232, 247, 24, 230, 41, 232, 128, 232, 248, 248, 223, - 24, 230, 41, 232, 128, 232, 248, 229, 124, 24, 230, 41, 232, 128, 232, - 248, 239, 46, 24, 230, 41, 232, 128, 232, 248, 239, 47, 201, 209, 24, - 230, 48, 232, 128, 232, 248, 239, 46, 24, 151, 232, 128, 232, 248, 239, - 47, 248, 223, 24, 230, 39, 232, 128, 232, 248, 239, 46, 24, 230, 41, 232, - 226, 232, 248, 201, 198, 24, 230, 41, 229, 213, 232, 226, 232, 248, 201, - 198, 24, 230, 41, 232, 226, 232, 248, 201, 199, 232, 128, 248, 223, 24, - 230, 41, 229, 213, 232, 226, 232, 248, 201, 199, 232, 128, 248, 223, 24, - 230, 41, 232, 226, 232, 248, 201, 199, 248, 223, 24, 230, 41, 229, 213, - 232, 226, 232, 248, 201, 199, 248, 223, 24, 230, 41, 232, 226, 232, 248, - 201, 199, 176, 232, 132, 24, 230, 46, 232, 226, 232, 248, 201, 198, 24, - 230, 46, 232, 226, 232, 248, 201, 199, 211, 76, 24, 230, 39, 232, 226, - 232, 248, 201, 199, 211, 76, 24, 230, 35, 232, 226, 232, 248, 201, 198, - 24, 230, 41, 232, 226, 232, 248, 201, 199, 229, 124, 24, 230, 41, 232, - 226, 232, 248, 201, 199, 229, 125, 176, 202, 207, 24, 230, 41, 232, 226, - 232, 248, 201, 199, 229, 125, 213, 44, 198, 212, 24, 230, 40, 24, 230, - 41, 248, 210, 210, 183, 233, 95, 24, 230, 41, 229, 212, 24, 230, 41, 176, - 202, 207, 24, 230, 41, 229, 213, 176, 202, 207, 24, 230, 41, 176, 248, - 223, 24, 230, 41, 176, 232, 132, 24, 230, 41, 201, 210, 141, 176, 202, - 207, 24, 230, 41, 201, 210, 247, 21, 24, 230, 41, 201, 210, 247, 22, 176, - 202, 207, 24, 230, 41, 201, 210, 247, 22, 176, 202, 208, 248, 223, 24, - 230, 41, 201, 210, 219, 82, 24, 230, 47, 24, 230, 48, 176, 202, 207, 24, - 230, 48, 213, 44, 198, 212, 24, 230, 48, 176, 232, 132, 24, 230, 37, 238, - 173, 24, 230, 36, 24, 230, 46, 211, 76, 24, 230, 45, 24, 230, 46, 211, - 77, 176, 202, 207, 24, 230, 46, 176, 202, 207, 24, 230, 46, 211, 77, 213, - 44, 198, 212, 24, 230, 46, 213, 44, 198, 212, 24, 230, 46, 211, 77, 176, - 232, 132, 24, 230, 46, 176, 232, 132, 24, 230, 44, 211, 76, 24, 230, 43, - 24, 230, 49, 24, 230, 34, 24, 230, 35, 176, 202, 207, 24, 230, 35, 213, - 44, 198, 212, 24, 230, 35, 176, 232, 132, 24, 230, 39, 211, 76, 24, 230, - 39, 211, 77, 176, 232, 132, 24, 230, 38, 24, 230, 39, 202, 70, 24, 230, - 39, 211, 77, 176, 202, 207, 24, 230, 39, 176, 202, 207, 24, 230, 39, 211, - 77, 213, 44, 198, 212, 24, 230, 39, 213, 44, 198, 212, 24, 230, 39, 176, - 202, 208, 198, 35, 223, 148, 24, 230, 39, 176, 248, 210, 82, 206, 188, - 24, 230, 51, 24, 151, 141, 82, 206, 188, 24, 230, 50, 141, 82, 206, 188, - 24, 230, 39, 141, 82, 206, 188, 24, 230, 52, 141, 82, 206, 188, 24, 230, - 39, 219, 82, 24, 151, 141, 82, 206, 189, 248, 223, 24, 151, 141, 82, 206, - 189, 239, 46, 24, 230, 39, 141, 82, 206, 189, 239, 46, 24, 151, 219, 83, - 235, 123, 24, 151, 219, 83, 144, 206, 183, 201, 52, 24, 151, 219, 83, - 144, 206, 183, 238, 162, 24, 151, 219, 83, 144, 211, 26, 243, 9, 24, 151, - 219, 83, 196, 77, 24, 151, 176, 196, 105, 219, 83, 196, 77, 24, 230, 50, - 219, 83, 196, 77, 24, 230, 35, 219, 83, 196, 77, 24, 230, 52, 219, 83, - 196, 77, 24, 151, 219, 83, 207, 147, 221, 70, 24, 151, 219, 83, 248, 223, - 24, 151, 219, 83, 198, 36, 198, 212, 24, 151, 219, 83, 198, 212, 24, 230, - 39, 219, 83, 198, 212, 24, 151, 219, 83, 141, 198, 212, 24, 230, 39, 219, - 83, 141, 198, 212, 24, 230, 52, 219, 83, 141, 176, 141, 176, 211, 14, 24, - 230, 52, 219, 83, 141, 176, 141, 198, 212, 24, 151, 219, 83, 223, 148, - 24, 230, 50, 219, 83, 223, 148, 24, 230, 39, 219, 83, 223, 148, 24, 230, - 52, 219, 83, 223, 148, 24, 151, 141, 82, 219, 82, 24, 230, 50, 141, 82, - 219, 82, 24, 230, 39, 141, 82, 219, 82, 24, 230, 39, 206, 188, 24, 230, - 52, 141, 82, 219, 82, 24, 151, 141, 82, 238, 218, 219, 82, 24, 230, 50, - 141, 82, 238, 218, 219, 82, 24, 151, 206, 189, 235, 123, 24, 230, 39, - 206, 189, 144, 141, 176, 228, 251, 216, 84, 24, 230, 52, 206, 189, 144, - 82, 176, 141, 238, 217, 24, 151, 206, 189, 196, 77, 24, 151, 206, 189, - 207, 147, 221, 70, 24, 151, 206, 189, 219, 82, 24, 230, 50, 206, 189, - 219, 82, 24, 230, 35, 206, 189, 219, 82, 24, 230, 52, 206, 189, 219, 82, - 24, 151, 206, 189, 216, 84, 24, 151, 206, 189, 82, 239, 46, 24, 151, 206, - 189, 82, 207, 147, 221, 69, 24, 151, 206, 189, 223, 148, 24, 151, 206, - 189, 198, 212, 24, 230, 37, 206, 189, 198, 212, 24, 151, 141, 206, 189, - 219, 82, 24, 230, 50, 141, 206, 189, 219, 82, 24, 230, 44, 141, 206, 189, - 219, 83, 211, 104, 24, 230, 37, 141, 206, 189, 219, 83, 211, 14, 24, 230, - 37, 141, 206, 189, 219, 83, 223, 162, 24, 230, 37, 141, 206, 189, 219, - 83, 196, 104, 24, 230, 46, 141, 206, 189, 219, 82, 24, 230, 39, 141, 206, - 189, 219, 82, 24, 230, 52, 141, 206, 189, 219, 83, 211, 14, 24, 230, 52, - 141, 206, 189, 219, 82, 24, 151, 82, 235, 123, 24, 230, 39, 216, 84, 24, - 151, 82, 196, 77, 24, 230, 50, 82, 196, 77, 24, 151, 82, 207, 147, 221, - 70, 24, 151, 82, 133, 176, 202, 207, 24, 230, 37, 82, 198, 212, 24, 151, - 82, 176, 219, 82, 24, 151, 82, 219, 82, 24, 151, 82, 206, 189, 219, 82, - 24, 230, 50, 82, 206, 189, 219, 82, 24, 230, 44, 82, 206, 189, 219, 83, - 211, 104, 24, 230, 46, 82, 206, 189, 219, 82, 24, 230, 39, 82, 206, 189, - 219, 82, 24, 230, 52, 82, 206, 189, 219, 83, 211, 14, 24, 230, 52, 82, - 206, 189, 219, 83, 223, 162, 24, 230, 52, 82, 206, 189, 219, 82, 24, 230, - 50, 82, 206, 189, 219, 83, 248, 223, 24, 230, 48, 82, 206, 189, 219, 83, - 239, 46, 24, 230, 48, 82, 206, 189, 219, 83, 239, 47, 202, 207, 24, 230, - 37, 82, 206, 189, 219, 83, 239, 47, 211, 14, 24, 230, 37, 82, 206, 189, - 219, 83, 239, 47, 223, 162, 24, 230, 37, 82, 206, 189, 219, 83, 239, 46, - 24, 230, 39, 141, 229, 124, 24, 151, 141, 176, 202, 207, 24, 230, 39, - 141, 176, 202, 207, 24, 151, 141, 176, 202, 208, 176, 237, 38, 24, 151, - 141, 176, 202, 208, 176, 239, 46, 24, 151, 141, 176, 202, 208, 176, 248, - 223, 24, 151, 141, 176, 202, 208, 141, 248, 223, 24, 151, 141, 176, 202, - 208, 248, 80, 248, 223, 24, 151, 141, 176, 202, 208, 141, 229, 126, 24, - 151, 141, 176, 232, 133, 141, 201, 52, 24, 151, 141, 176, 232, 133, 141, - 248, 223, 24, 151, 141, 176, 102, 24, 151, 141, 176, 238, 173, 24, 151, - 141, 176, 238, 165, 176, 223, 117, 24, 230, 48, 141, 176, 238, 165, 176, - 223, 117, 24, 151, 141, 176, 238, 165, 176, 196, 104, 24, 151, 141, 176, - 243, 10, 24, 230, 46, 141, 198, 212, 24, 230, 46, 141, 176, 211, 76, 24, - 230, 39, 141, 176, 211, 76, 24, 230, 39, 141, 176, 220, 12, 24, 230, 39, - 141, 198, 212, 24, 230, 39, 141, 176, 202, 70, 24, 230, 52, 141, 176, - 211, 14, 24, 230, 52, 141, 176, 223, 162, 24, 230, 52, 141, 198, 212, 24, - 151, 198, 212, 24, 151, 176, 229, 212, 24, 151, 176, 202, 208, 237, 38, - 24, 151, 176, 202, 208, 239, 46, 24, 151, 176, 202, 208, 248, 223, 24, - 151, 176, 232, 132, 24, 151, 176, 248, 210, 141, 216, 84, 24, 151, 176, - 248, 210, 82, 206, 188, 24, 151, 176, 248, 210, 206, 189, 219, 82, 24, - 151, 176, 196, 105, 105, 232, 247, 24, 151, 176, 139, 105, 232, 247, 24, - 151, 176, 196, 105, 115, 232, 247, 24, 151, 176, 196, 105, 232, 128, 232, - 247, 24, 151, 176, 139, 232, 128, 207, 147, 221, 69, 24, 230, 42, 24, - 151, 229, 212, 24, 198, 37, 202, 169, 24, 198, 37, 215, 128, 24, 198, 37, - 248, 209, 24, 230, 215, 202, 169, 24, 230, 215, 215, 128, 24, 230, 215, - 248, 209, 24, 201, 33, 202, 169, 24, 201, 33, 215, 128, 24, 201, 33, 248, - 209, 24, 248, 18, 202, 169, 24, 248, 18, 215, 128, 24, 248, 18, 248, 209, - 24, 206, 60, 202, 169, 24, 206, 60, 215, 128, 24, 206, 60, 248, 209, 24, - 200, 171, 200, 76, 24, 200, 171, 248, 209, 24, 201, 186, 220, 13, 202, - 169, 24, 201, 186, 2, 202, 169, 24, 201, 186, 220, 13, 215, 128, 24, 201, - 186, 2, 215, 128, 24, 201, 186, 204, 6, 24, 232, 197, 220, 13, 202, 169, - 24, 232, 197, 2, 202, 169, 24, 232, 197, 220, 13, 215, 128, 24, 232, 197, - 2, 215, 128, 24, 232, 197, 204, 6, 24, 201, 186, 232, 197, 251, 154, 24, - 215, 172, 133, 144, 220, 12, 24, 215, 172, 133, 144, 202, 70, 24, 215, - 172, 133, 204, 6, 24, 215, 172, 144, 204, 6, 24, 215, 172, 133, 144, 251, - 155, 220, 12, 24, 215, 172, 133, 144, 251, 155, 202, 70, 24, 215, 172, - 202, 208, 119, 202, 208, 205, 84, 24, 215, 171, 232, 253, 239, 35, 24, - 215, 173, 232, 253, 239, 35, 24, 215, 171, 202, 170, 201, 53, 202, 70, - 24, 215, 171, 202, 170, 201, 53, 216, 212, 24, 215, 171, 202, 170, 201, - 53, 220, 12, 24, 215, 171, 202, 170, 201, 53, 220, 10, 24, 215, 171, 202, - 170, 193, 4, 232, 200, 24, 215, 171, 55, 201, 52, 24, 215, 171, 55, 193, - 4, 232, 200, 24, 215, 171, 55, 251, 154, 24, 215, 171, 55, 251, 155, 193, - 4, 232, 200, 24, 215, 171, 238, 217, 24, 215, 171, 197, 225, 201, 53, - 215, 175, 24, 215, 171, 197, 225, 193, 4, 232, 200, 24, 215, 171, 197, - 225, 251, 154, 24, 215, 171, 197, 225, 251, 155, 193, 4, 232, 200, 24, - 215, 171, 248, 228, 202, 70, 24, 215, 171, 248, 228, 216, 212, 24, 215, - 171, 248, 228, 220, 12, 24, 215, 171, 239, 2, 202, 70, 24, 215, 171, 239, - 2, 216, 212, 24, 215, 171, 239, 2, 220, 12, 24, 215, 171, 239, 2, 206, - 120, 24, 215, 171, 243, 126, 202, 70, 24, 215, 171, 243, 126, 216, 212, - 24, 215, 171, 243, 126, 220, 12, 24, 215, 171, 111, 202, 70, 24, 215, - 171, 111, 216, 212, 24, 215, 171, 111, 220, 12, 24, 215, 171, 191, 21, - 202, 70, 24, 215, 171, 191, 21, 216, 212, 24, 215, 171, 191, 21, 220, 12, - 24, 215, 171, 210, 57, 202, 70, 24, 215, 171, 210, 57, 216, 212, 24, 215, - 171, 210, 57, 220, 12, 24, 198, 3, 206, 118, 202, 169, 24, 198, 3, 206, - 118, 235, 133, 24, 198, 3, 206, 118, 251, 154, 24, 198, 3, 206, 119, 202, - 169, 24, 198, 3, 206, 119, 235, 133, 24, 198, 3, 206, 119, 251, 154, 24, - 198, 3, 203, 144, 24, 198, 3, 250, 251, 201, 218, 202, 169, 24, 198, 3, - 250, 251, 201, 218, 235, 133, 24, 198, 3, 250, 251, 201, 218, 197, 224, - 24, 215, 174, 250, 139, 202, 70, 24, 215, 174, 250, 139, 216, 212, 24, - 215, 174, 250, 139, 220, 12, 24, 215, 174, 250, 139, 220, 10, 24, 215, - 174, 198, 31, 202, 70, 24, 215, 174, 198, 31, 216, 212, 24, 215, 174, - 198, 31, 220, 12, 24, 215, 174, 198, 31, 220, 10, 24, 215, 174, 248, 210, - 250, 139, 202, 70, 24, 215, 174, 248, 210, 250, 139, 216, 212, 24, 215, - 174, 248, 210, 250, 139, 220, 12, 24, 215, 174, 248, 210, 250, 139, 220, - 10, 24, 215, 174, 248, 210, 198, 31, 202, 70, 24, 215, 174, 248, 210, - 198, 31, 216, 212, 24, 215, 174, 248, 210, 198, 31, 220, 12, 24, 215, - 174, 248, 210, 198, 31, 220, 10, 24, 215, 173, 202, 170, 201, 53, 202, - 70, 24, 215, 173, 202, 170, 201, 53, 216, 212, 24, 215, 173, 202, 170, - 201, 53, 220, 12, 24, 215, 173, 202, 170, 201, 53, 220, 10, 24, 215, 173, - 202, 170, 193, 4, 232, 200, 24, 215, 173, 55, 201, 52, 24, 215, 173, 55, - 193, 4, 232, 200, 24, 215, 173, 55, 251, 154, 24, 215, 173, 55, 251, 155, - 193, 4, 232, 200, 24, 215, 173, 238, 217, 24, 215, 173, 197, 225, 201, - 53, 215, 175, 24, 215, 173, 197, 225, 193, 4, 232, 200, 24, 215, 173, - 197, 225, 251, 155, 215, 175, 24, 215, 173, 197, 225, 251, 155, 193, 4, - 232, 200, 24, 215, 173, 248, 227, 24, 215, 173, 239, 2, 202, 70, 24, 215, - 173, 239, 2, 216, 212, 24, 215, 173, 239, 2, 220, 12, 24, 215, 173, 243, - 125, 24, 215, 173, 111, 202, 70, 24, 215, 173, 111, 216, 212, 24, 215, - 173, 111, 220, 12, 24, 215, 173, 191, 21, 202, 70, 24, 215, 173, 191, 21, - 216, 212, 24, 215, 173, 191, 21, 220, 12, 24, 215, 173, 210, 57, 202, 70, - 24, 215, 173, 210, 57, 216, 212, 24, 215, 173, 210, 57, 220, 12, 24, 198, - 4, 206, 119, 202, 169, 24, 198, 4, 206, 119, 235, 133, 24, 198, 4, 206, - 119, 251, 154, 24, 198, 4, 206, 118, 202, 169, 24, 198, 4, 206, 118, 235, - 133, 24, 198, 4, 206, 118, 251, 154, 24, 198, 4, 203, 144, 24, 215, 171, - 238, 165, 208, 23, 202, 70, 24, 215, 171, 238, 165, 208, 23, 216, 212, - 24, 215, 171, 238, 165, 208, 23, 220, 12, 24, 215, 171, 238, 165, 208, - 23, 220, 10, 24, 215, 171, 238, 165, 230, 67, 202, 70, 24, 215, 171, 238, - 165, 230, 67, 216, 212, 24, 215, 171, 238, 165, 230, 67, 220, 12, 24, - 215, 171, 238, 165, 230, 67, 220, 10, 24, 215, 171, 238, 165, 198, 218, - 243, 11, 202, 70, 24, 215, 171, 238, 165, 198, 218, 243, 11, 216, 212, - 24, 215, 171, 228, 143, 202, 70, 24, 215, 171, 228, 143, 216, 212, 24, - 215, 171, 228, 143, 220, 12, 24, 215, 171, 219, 5, 202, 70, 24, 215, 171, - 219, 5, 216, 212, 24, 215, 171, 219, 5, 220, 12, 24, 215, 171, 219, 5, 2, - 235, 133, 24, 215, 171, 193, 139, 238, 165, 55, 202, 70, 24, 215, 171, - 193, 139, 238, 165, 55, 216, 212, 24, 215, 171, 193, 139, 238, 165, 55, - 220, 12, 24, 215, 171, 193, 139, 238, 165, 197, 225, 202, 70, 24, 215, - 171, 193, 139, 238, 165, 197, 225, 216, 212, 24, 215, 171, 193, 139, 238, - 165, 197, 225, 220, 12, 24, 215, 171, 238, 165, 199, 25, 201, 52, 24, - 215, 171, 238, 163, 238, 218, 202, 70, 24, 215, 171, 238, 163, 238, 218, - 216, 212, 24, 206, 118, 202, 169, 24, 206, 118, 235, 133, 24, 206, 118, - 251, 156, 24, 215, 171, 203, 144, 24, 215, 171, 238, 165, 229, 116, 232, - 97, 193, 167, 24, 215, 171, 228, 143, 229, 116, 232, 97, 193, 167, 24, - 215, 171, 219, 5, 229, 116, 232, 97, 193, 167, 24, 215, 171, 193, 139, - 229, 116, 232, 97, 193, 167, 24, 206, 118, 202, 170, 229, 116, 232, 97, - 193, 167, 24, 206, 118, 55, 229, 116, 232, 97, 193, 167, 24, 206, 118, - 251, 155, 229, 116, 232, 97, 193, 167, 24, 215, 171, 238, 165, 229, 116, - 243, 104, 24, 215, 171, 228, 143, 229, 116, 243, 104, 24, 215, 171, 219, - 5, 229, 116, 243, 104, 24, 215, 171, 193, 139, 229, 116, 243, 104, 24, - 206, 118, 202, 170, 229, 116, 243, 104, 24, 206, 118, 55, 229, 116, 243, - 104, 24, 206, 118, 251, 155, 229, 116, 243, 104, 24, 215, 171, 193, 139, - 237, 39, 210, 86, 202, 70, 24, 215, 171, 193, 139, 237, 39, 210, 86, 216, - 212, 24, 215, 171, 193, 139, 237, 39, 210, 86, 220, 12, 24, 215, 173, - 238, 165, 229, 116, 247, 31, 202, 70, 24, 215, 173, 238, 165, 229, 116, - 247, 31, 220, 12, 24, 215, 173, 228, 143, 229, 116, 247, 31, 2, 235, 133, - 24, 215, 173, 228, 143, 229, 116, 247, 31, 220, 13, 235, 133, 24, 215, - 173, 228, 143, 229, 116, 247, 31, 2, 197, 224, 24, 215, 173, 228, 143, - 229, 116, 247, 31, 220, 13, 197, 224, 24, 215, 173, 219, 5, 229, 116, - 247, 31, 2, 202, 169, 24, 215, 173, 219, 5, 229, 116, 247, 31, 220, 13, - 202, 169, 24, 215, 173, 219, 5, 229, 116, 247, 31, 2, 235, 133, 24, 215, - 173, 219, 5, 229, 116, 247, 31, 220, 13, 235, 133, 24, 215, 173, 193, - 139, 229, 116, 247, 31, 202, 70, 24, 215, 173, 193, 139, 229, 116, 247, - 31, 220, 12, 24, 206, 119, 202, 170, 229, 116, 247, 30, 24, 206, 119, 55, - 229, 116, 247, 30, 24, 206, 119, 251, 155, 229, 116, 247, 30, 24, 215, - 173, 238, 165, 229, 116, 232, 194, 202, 70, 24, 215, 173, 238, 165, 229, - 116, 232, 194, 220, 12, 24, 215, 173, 228, 143, 229, 116, 232, 194, 2, - 235, 133, 24, 215, 173, 228, 143, 229, 116, 232, 194, 220, 13, 235, 133, - 24, 215, 173, 228, 143, 229, 116, 232, 194, 197, 225, 2, 197, 224, 24, - 215, 173, 228, 143, 229, 116, 232, 194, 197, 225, 220, 13, 197, 224, 24, - 215, 173, 219, 5, 229, 116, 232, 194, 2, 202, 169, 24, 215, 173, 219, 5, - 229, 116, 232, 194, 220, 13, 202, 169, 24, 215, 173, 219, 5, 229, 116, - 232, 194, 2, 235, 133, 24, 215, 173, 219, 5, 229, 116, 232, 194, 220, 13, - 235, 133, 24, 215, 173, 193, 139, 229, 116, 232, 194, 202, 70, 24, 215, - 173, 193, 139, 229, 116, 232, 194, 220, 12, 24, 206, 119, 202, 170, 229, - 116, 232, 193, 24, 206, 119, 55, 229, 116, 232, 193, 24, 206, 119, 251, - 155, 229, 116, 232, 193, 24, 215, 173, 238, 165, 202, 70, 24, 215, 173, - 238, 165, 216, 212, 24, 215, 173, 238, 165, 220, 12, 24, 215, 173, 238, - 165, 220, 10, 24, 215, 173, 238, 165, 242, 78, 24, 215, 173, 228, 143, - 202, 70, 24, 215, 173, 219, 5, 202, 70, 24, 215, 173, 193, 139, 202, 58, - 24, 215, 173, 193, 139, 202, 70, 24, 215, 173, 193, 139, 220, 12, 24, - 206, 119, 202, 169, 24, 206, 119, 235, 133, 24, 206, 119, 251, 154, 24, - 215, 173, 203, 145, 210, 118, 24, 215, 171, 250, 251, 243, 11, 2, 202, - 169, 24, 215, 171, 250, 251, 243, 11, 216, 213, 202, 169, 24, 215, 171, - 250, 251, 243, 11, 2, 235, 133, 24, 215, 171, 250, 251, 243, 11, 216, - 213, 235, 133, 24, 215, 173, 250, 251, 243, 11, 229, 116, 193, 168, 2, - 202, 169, 24, 215, 173, 250, 251, 243, 11, 229, 116, 193, 168, 216, 213, - 202, 169, 24, 215, 173, 250, 251, 243, 11, 229, 116, 193, 168, 220, 13, - 202, 169, 24, 215, 173, 250, 251, 243, 11, 229, 116, 193, 168, 2, 235, - 133, 24, 215, 173, 250, 251, 243, 11, 229, 116, 193, 168, 216, 213, 235, - 133, 24, 215, 173, 250, 251, 243, 11, 229, 116, 193, 168, 220, 13, 235, - 133, 24, 215, 171, 193, 4, 243, 11, 232, 97, 202, 169, 24, 215, 171, 193, - 4, 243, 11, 232, 97, 235, 133, 24, 215, 173, 193, 4, 243, 11, 229, 116, - 193, 168, 202, 169, 24, 215, 173, 193, 4, 243, 11, 229, 116, 193, 168, - 235, 133, 24, 215, 171, 232, 253, 243, 8, 202, 169, 24, 215, 171, 232, - 253, 243, 8, 235, 133, 24, 215, 173, 232, 253, 243, 8, 229, 116, 193, - 168, 202, 169, 24, 215, 173, 232, 253, 243, 8, 229, 116, 193, 168, 235, - 133, 24, 235, 40, 250, 236, 202, 70, 24, 235, 40, 250, 236, 220, 12, 24, - 235, 40, 233, 73, 24, 235, 40, 202, 75, 24, 235, 40, 199, 88, 24, 235, - 40, 207, 63, 24, 235, 40, 202, 176, 24, 235, 40, 202, 177, 251, 154, 24, - 235, 40, 233, 225, 211, 27, 198, 146, 24, 235, 40, 230, 226, 24, 229, - 235, 24, 229, 236, 206, 193, 24, 229, 236, 215, 171, 201, 52, 24, 229, - 236, 215, 171, 198, 149, 24, 229, 236, 215, 173, 201, 52, 24, 229, 236, - 215, 171, 238, 164, 24, 229, 236, 215, 173, 238, 164, 24, 229, 236, 215, - 176, 243, 10, 24, 233, 104, 236, 233, 209, 25, 213, 14, 232, 133, 198, - 147, 24, 233, 104, 236, 233, 209, 25, 213, 14, 133, 211, 57, 235, 123, - 24, 233, 104, 236, 233, 209, 25, 213, 14, 133, 211, 57, 144, 198, 147, - 24, 233, 191, 201, 53, 196, 77, 24, 233, 191, 201, 53, 214, 81, 24, 233, - 191, 201, 53, 235, 123, 24, 235, 107, 233, 191, 214, 82, 235, 123, 24, - 235, 107, 233, 191, 144, 214, 81, 24, 235, 107, 233, 191, 133, 214, 81, - 24, 235, 107, 233, 191, 214, 82, 196, 77, 24, 232, 151, 214, 81, 24, 232, - 151, 239, 35, 24, 232, 151, 193, 7, 24, 233, 186, 211, 76, 24, 233, 186, - 201, 185, 24, 233, 186, 242, 218, 24, 233, 194, 248, 130, 202, 169, 24, - 233, 194, 248, 130, 215, 128, 24, 233, 186, 132, 211, 76, 24, 233, 186, - 193, 78, 211, 76, 24, 233, 186, 132, 242, 218, 24, 233, 186, 193, 76, - 215, 175, 24, 233, 194, 193, 58, 24, 233, 187, 196, 77, 24, 233, 187, - 235, 123, 24, 233, 187, 232, 180, 24, 233, 189, 201, 52, 24, 233, 189, - 201, 53, 235, 133, 24, 233, 189, 201, 53, 251, 154, 24, 233, 190, 201, - 52, 24, 233, 190, 201, 53, 235, 133, 24, 233, 190, 201, 53, 251, 154, 24, - 233, 189, 238, 162, 24, 233, 190, 238, 162, 24, 233, 189, 243, 5, 24, - 243, 121, 208, 155, 24, 243, 121, 214, 81, 24, 243, 121, 200, 218, 24, - 199, 89, 243, 121, 229, 135, 24, 199, 89, 243, 121, 216, 84, 24, 199, 89, - 243, 121, 218, 241, 24, 234, 209, 24, 213, 14, 214, 81, 24, 213, 14, 239, - 35, 24, 213, 14, 193, 5, 24, 213, 14, 193, 73, 24, 251, 226, 248, 116, - 211, 14, 24, 251, 226, 200, 217, 223, 162, 24, 251, 226, 248, 118, 2, - 206, 117, 24, 251, 226, 200, 219, 2, 206, 117, 24, 248, 39, 223, 134, 24, - 248, 39, 233, 214, 24, 215, 180, 242, 219, 214, 81, 24, 215, 180, 242, - 219, 232, 132, 24, 215, 180, 242, 219, 239, 35, 24, 215, 180, 202, 65, - 24, 215, 180, 202, 66, 193, 7, 24, 215, 180, 202, 66, 211, 76, 24, 215, - 180, 232, 93, 24, 215, 180, 232, 94, 193, 7, 24, 215, 180, 232, 94, 211, - 76, 24, 215, 180, 211, 77, 243, 10, 24, 215, 180, 211, 77, 232, 132, 24, - 215, 180, 211, 77, 193, 7, 24, 215, 180, 211, 77, 211, 7, 24, 215, 180, - 211, 77, 211, 8, 193, 7, 24, 215, 180, 211, 77, 211, 8, 192, 88, 24, 215, - 180, 211, 77, 207, 92, 24, 215, 180, 211, 77, 207, 93, 193, 7, 24, 215, - 180, 211, 77, 207, 93, 192, 88, 24, 215, 180, 221, 122, 24, 215, 180, - 221, 123, 232, 132, 24, 215, 180, 221, 123, 193, 7, 24, 215, 180, 199, - 88, 24, 215, 180, 199, 89, 232, 132, 24, 215, 180, 199, 89, 200, 218, 24, - 219, 97, 208, 219, 198, 87, 24, 219, 99, 110, 139, 196, 74, 24, 219, 99, - 116, 139, 218, 236, 24, 215, 180, 239, 0, 24, 215, 180, 193, 6, 202, 169, - 24, 215, 180, 193, 6, 235, 133, 24, 198, 62, 201, 74, 211, 15, 233, 75, - 24, 198, 62, 219, 142, 219, 96, 24, 198, 62, 198, 136, 248, 210, 219, 96, - 24, 198, 62, 198, 136, 198, 35, 223, 118, 215, 179, 24, 198, 62, 223, - 118, 215, 180, 207, 63, 24, 198, 62, 215, 170, 251, 251, 243, 122, 24, - 198, 62, 247, 22, 201, 74, 211, 14, 24, 198, 62, 247, 22, 223, 118, 215, - 179, 24, 199, 117, 24, 199, 118, 215, 175, 24, 199, 118, 211, 105, 198, - 61, 24, 199, 118, 211, 105, 198, 62, 215, 175, 24, 199, 118, 211, 105, - 219, 96, 24, 199, 118, 211, 105, 219, 97, 215, 175, 24, 199, 118, 248, - 146, 219, 96, 24, 215, 171, 223, 14, 24, 215, 173, 223, 14, 24, 214, 112, - 24, 230, 78, 24, 233, 217, 24, 203, 22, 229, 123, 201, 219, 24, 203, 22, - 229, 123, 209, 23, 24, 193, 165, 203, 22, 229, 123, 215, 178, 24, 232, - 192, 203, 22, 229, 123, 215, 178, 24, 203, 22, 198, 148, 232, 98, 193, - 172, 24, 198, 43, 201, 53, 201, 37, 24, 198, 43, 238, 163, 248, 227, 24, - 198, 44, 197, 16, 24, 116, 248, 105, 198, 148, 232, 98, 229, 123, 222, - 195, 24, 219, 124, 242, 79, 24, 219, 124, 219, 197, 24, 219, 124, 219, - 196, 24, 219, 124, 219, 195, 24, 219, 124, 219, 194, 24, 219, 124, 219, - 193, 24, 219, 124, 219, 192, 24, 219, 124, 219, 191, 24, 232, 252, 24, - 219, 37, 201, 247, 24, 219, 38, 201, 247, 24, 219, 40, 229, 208, 24, 219, - 40, 193, 74, 24, 219, 40, 237, 92, 24, 219, 40, 229, 236, 214, 112, 24, - 219, 40, 198, 45, 24, 219, 40, 219, 123, 237, 9, 24, 242, 74, 24, 232, - 80, 201, 63, 24, 204, 25, 24, 242, 83, 24, 210, 113, 24, 233, 6, 215, - 244, 24, 233, 6, 215, 243, 24, 233, 6, 215, 242, 24, 233, 6, 215, 241, - 24, 233, 6, 215, 240, 24, 206, 121, 215, 244, 24, 206, 121, 215, 243, 24, - 206, 121, 215, 242, 24, 206, 121, 215, 241, 24, 206, 121, 215, 240, 24, - 206, 121, 215, 239, 24, 206, 121, 215, 238, 24, 206, 121, 215, 237, 24, - 206, 121, 215, 251, 24, 206, 121, 215, 250, 24, 206, 121, 215, 249, 24, - 206, 121, 215, 248, 24, 206, 121, 215, 247, 24, 206, 121, 215, 246, 24, - 206, 121, 215, 245, 8, 2, 1, 233, 37, 237, 3, 4, 197, 228, 8, 2, 1, 207, - 18, 27, 232, 51, 8, 1, 2, 6, 153, 232, 51, 8, 2, 1, 207, 18, 222, 152, 8, - 1, 2, 6, 220, 143, 4, 248, 231, 8, 2, 1, 219, 163, 4, 207, 24, 102, 8, 2, - 1, 153, 192, 160, 4, 248, 231, 8, 2, 1, 207, 18, 234, 88, 8, 2, 1, 153, - 207, 222, 4, 179, 219, 213, 23, 207, 24, 102, 8, 2, 1, 200, 44, 4, 228, - 251, 23, 207, 24, 102, 8, 1, 207, 24, 242, 232, 4, 207, 24, 102, 8, 2, 1, - 234, 13, 4, 55, 164, 8, 2, 1, 234, 13, 4, 55, 249, 88, 23, 238, 175, 8, - 2, 1, 153, 200, 44, 4, 238, 175, 8, 1, 223, 93, 231, 11, 201, 64, 4, 238, - 175, 8, 1, 201, 36, 247, 194, 4, 238, 175, 8, 1, 2, 6, 153, 222, 152, 8, - 2, 1, 220, 143, 4, 232, 233, 8, 2, 1, 237, 70, 237, 3, 4, 210, 192, 102, - 8, 2, 1, 220, 143, 4, 248, 232, 23, 210, 192, 102, 8, 2, 1, 234, 89, 4, - 210, 192, 102, 8, 2, 1, 153, 207, 222, 4, 210, 192, 102, 8, 2, 1, 207, - 222, 4, 232, 234, 23, 210, 192, 102, 8, 2, 1, 199, 79, 237, 3, 4, 210, - 192, 102, 8, 2, 1, 233, 179, 4, 210, 192, 102, 8, 2, 1, 237, 70, 237, 3, - 4, 207, 24, 102, 8, 2, 1, 228, 74, 4, 201, 28, 23, 207, 24, 102, 8, 2, 1, - 187, 4, 207, 24, 102, 8, 2, 1, 199, 79, 237, 3, 4, 207, 24, 102, 8, 2, 1, - 247, 194, 4, 207, 24, 102, 8, 2, 1, 206, 9, 4, 238, 175, 8, 2, 1, 238, - 128, 4, 216, 86, 45, 102, 8, 2, 1, 220, 143, 4, 216, 86, 45, 102, 8, 2, - 1, 215, 62, 4, 216, 86, 45, 102, 8, 2, 1, 207, 222, 4, 216, 86, 45, 102, - 8, 2, 1, 206, 9, 4, 216, 86, 45, 102, 8, 2, 1, 200, 44, 4, 216, 86, 45, - 102, 33, 135, 1, 250, 122, 33, 135, 1, 247, 252, 33, 135, 1, 195, 151, - 33, 135, 1, 231, 18, 33, 135, 1, 236, 169, 33, 135, 1, 192, 49, 33, 135, - 1, 191, 55, 33, 135, 1, 191, 82, 33, 135, 1, 223, 39, 33, 135, 1, 89, - 223, 39, 33, 135, 1, 68, 33, 135, 1, 236, 190, 33, 135, 1, 222, 94, 33, - 135, 1, 219, 75, 33, 135, 1, 215, 66, 33, 135, 1, 214, 210, 33, 135, 1, - 211, 89, 33, 135, 1, 209, 55, 33, 135, 1, 206, 179, 33, 135, 1, 202, 77, - 33, 135, 1, 197, 44, 33, 135, 1, 196, 124, 33, 135, 1, 232, 101, 33, 135, - 1, 229, 188, 33, 135, 1, 203, 8, 33, 135, 1, 197, 146, 33, 135, 1, 243, - 54, 33, 135, 1, 203, 165, 33, 135, 1, 192, 58, 33, 135, 1, 192, 60, 33, - 135, 1, 192, 93, 33, 135, 1, 191, 225, 33, 135, 1, 2, 191, 190, 33, 135, - 1, 192, 12, 33, 135, 1, 223, 82, 2, 191, 190, 33, 135, 1, 248, 175, 191, - 190, 33, 135, 1, 223, 82, 248, 175, 191, 190, 33, 135, 1, 232, 228, 52, - 1, 38, 2, 65, 52, 1, 38, 2, 249, 17, 52, 1, 38, 2, 195, 153, 52, 1, 38, - 2, 231, 77, 52, 1, 38, 2, 237, 146, 52, 1, 38, 2, 223, 226, 52, 1, 38, 2, - 191, 62, 52, 1, 38, 2, 191, 87, 52, 1, 38, 2, 68, 52, 1, 38, 2, 155, 52, - 1, 38, 2, 234, 140, 52, 1, 38, 2, 234, 114, 52, 1, 38, 2, 74, 52, 1, 38, - 2, 210, 63, 52, 1, 38, 2, 234, 34, 52, 1, 38, 2, 234, 22, 52, 1, 38, 2, - 199, 145, 52, 1, 38, 2, 66, 52, 1, 38, 2, 234, 181, 52, 1, 38, 2, 140, - 52, 1, 38, 2, 197, 161, 52, 1, 38, 2, 243, 127, 52, 1, 38, 2, 203, 165, - 52, 1, 38, 2, 192, 58, 52, 1, 38, 2, 71, 52, 1, 38, 2, 191, 225, 52, 1, - 38, 2, 235, 17, 52, 1, 38, 2, 205, 86, 52, 1, 38, 2, 247, 203, 68, 52, 1, - 38, 2, 223, 10, 52, 1, 38, 2, 249, 82, 74, 52, 1, 38, 2, 201, 53, 66, 52, - 1, 38, 2, 210, 179, 38, 200, 230, 2, 1, 65, 38, 200, 230, 2, 1, 249, 17, - 38, 200, 230, 2, 1, 195, 153, 38, 200, 230, 2, 1, 231, 77, 38, 200, 230, - 2, 1, 237, 146, 38, 200, 230, 2, 1, 223, 226, 38, 200, 230, 2, 1, 191, - 62, 38, 200, 230, 2, 1, 191, 87, 38, 200, 230, 2, 1, 68, 38, 200, 230, 2, - 1, 155, 38, 200, 230, 2, 1, 234, 140, 38, 200, 230, 2, 1, 74, 38, 200, - 230, 2, 1, 210, 63, 38, 200, 230, 2, 1, 234, 22, 38, 200, 230, 2, 1, 66, - 38, 200, 230, 2, 1, 234, 181, 38, 200, 230, 2, 1, 140, 38, 200, 230, 2, - 1, 197, 161, 38, 200, 230, 2, 1, 243, 127, 38, 200, 230, 2, 1, 203, 165, - 38, 200, 230, 2, 1, 230, 17, 56, 38, 200, 230, 2, 1, 192, 58, 38, 200, - 230, 2, 1, 231, 78, 4, 196, 69, 38, 200, 230, 2, 1, 247, 203, 68, 38, - 200, 230, 2, 1, 235, 32, 38, 200, 230, 2, 1, 235, 28, 52, 1, 38, 2, 234, - 23, 4, 237, 87, 52, 1, 38, 2, 192, 59, 4, 249, 147, 192, 62, 52, 1, 38, - 2, 201, 53, 126, 4, 106, 33, 38, 2, 1, 247, 203, 68, 212, 80, 208, 162, - 90, 1, 174, 212, 80, 208, 162, 90, 1, 197, 168, 212, 80, 208, 162, 90, 1, - 212, 199, 212, 80, 208, 162, 90, 1, 190, 190, 212, 80, 208, 162, 90, 1, - 140, 212, 80, 208, 162, 90, 1, 180, 212, 80, 208, 162, 90, 1, 192, 220, - 212, 80, 208, 162, 90, 1, 213, 111, 212, 80, 208, 162, 90, 1, 247, 160, - 212, 80, 208, 162, 90, 1, 173, 212, 80, 208, 162, 90, 1, 188, 212, 80, - 208, 162, 90, 1, 191, 123, 212, 80, 208, 162, 90, 1, 214, 166, 212, 80, - 208, 162, 90, 1, 212, 186, 212, 80, 208, 162, 90, 1, 155, 212, 80, 208, - 162, 90, 1, 238, 32, 212, 80, 208, 162, 90, 1, 212, 101, 212, 80, 208, - 162, 90, 1, 212, 244, 212, 80, 208, 162, 90, 1, 195, 188, 212, 80, 208, - 162, 90, 1, 212, 180, 212, 80, 208, 162, 90, 1, 197, 8, 212, 80, 208, - 162, 90, 1, 233, 109, 212, 80, 208, 162, 90, 1, 165, 212, 80, 208, 162, - 90, 1, 208, 96, 212, 80, 208, 162, 90, 1, 170, 212, 80, 208, 162, 90, 1, - 212, 246, 212, 80, 208, 162, 90, 1, 168, 212, 80, 208, 162, 90, 1, 192, - 175, 212, 80, 208, 162, 90, 1, 212, 248, 212, 80, 208, 162, 90, 1, 236, - 186, 212, 80, 208, 162, 90, 1, 212, 247, 212, 80, 208, 162, 90, 1, 230, - 81, 212, 80, 208, 162, 90, 1, 216, 19, 212, 80, 208, 162, 90, 1, 209, - 110, 212, 80, 208, 162, 90, 1, 231, 240, 212, 80, 208, 162, 90, 1, 206, - 109, 212, 80, 208, 162, 90, 1, 65, 212, 80, 208, 162, 90, 1, 252, 206, - 212, 80, 208, 162, 90, 1, 68, 212, 80, 208, 162, 90, 1, 66, 212, 80, 208, - 162, 90, 1, 74, 212, 80, 208, 162, 90, 1, 211, 87, 212, 80, 208, 162, 90, - 1, 71, 212, 80, 208, 162, 90, 1, 234, 188, 212, 80, 208, 162, 90, 1, 193, - 224, 212, 80, 208, 162, 90, 198, 70, 212, 80, 208, 162, 90, 198, 66, 212, - 80, 208, 162, 90, 198, 67, 212, 80, 208, 162, 90, 198, 64, 212, 80, 208, - 162, 90, 198, 65, 212, 80, 208, 162, 90, 198, 68, 212, 80, 208, 162, 90, - 198, 69, 212, 80, 208, 162, 90, 3, 40, 209, 250, 212, 80, 208, 162, 90, - 3, 40, 199, 3, 212, 80, 208, 162, 90, 3, 40, 219, 39, 212, 80, 208, 162, - 90, 3, 40, 251, 101, 212, 80, 208, 162, 90, 3, 40, 223, 94, 212, 80, 208, - 162, 90, 3, 192, 183, 192, 182, 212, 80, 208, 162, 90, 5, 219, 190, 212, - 80, 208, 162, 90, 17, 191, 77, 212, 80, 208, 162, 90, 17, 107, 212, 80, - 208, 162, 90, 17, 109, 212, 80, 208, 162, 90, 17, 138, 212, 80, 208, 162, - 90, 17, 134, 212, 80, 208, 162, 90, 17, 149, 212, 80, 208, 162, 90, 17, - 169, 212, 80, 208, 162, 90, 17, 175, 212, 80, 208, 162, 90, 17, 171, 212, - 80, 208, 162, 90, 17, 178, 212, 80, 208, 162, 90, 219, 28, 212, 96, 212, - 80, 208, 162, 90, 47, 247, 160, 198, 38, 1, 168, 198, 38, 1, 249, 153, - 198, 38, 1, 190, 190, 198, 38, 1, 238, 32, 198, 38, 1, 155, 198, 38, 1, - 231, 240, 198, 38, 1, 174, 198, 38, 1, 180, 198, 38, 1, 214, 68, 198, 38, - 1, 188, 198, 38, 1, 247, 1, 198, 38, 1, 170, 198, 38, 1, 193, 190, 198, - 38, 1, 223, 32, 198, 38, 1, 140, 198, 38, 1, 165, 198, 38, 1, 173, 198, - 38, 1, 68, 198, 38, 1, 248, 38, 68, 198, 38, 1, 223, 49, 198, 38, 1, 248, - 38, 223, 49, 198, 38, 1, 66, 198, 38, 1, 71, 198, 38, 1, 248, 38, 71, - 198, 38, 1, 234, 65, 198, 38, 1, 248, 38, 234, 65, 198, 38, 1, 74, 198, - 38, 1, 252, 25, 198, 38, 1, 248, 38, 252, 25, 198, 38, 1, 65, 198, 38, 3, - 206, 180, 198, 79, 193, 163, 1, 252, 206, 193, 163, 1, 65, 193, 163, 1, - 249, 153, 193, 163, 1, 247, 160, 193, 163, 1, 238, 32, 193, 163, 1, 231, - 240, 193, 163, 1, 170, 193, 163, 1, 209, 228, 193, 163, 1, 173, 193, 163, - 1, 180, 193, 163, 1, 168, 193, 163, 1, 190, 190, 193, 163, 1, 199, 49, - 193, 163, 1, 233, 109, 193, 163, 1, 188, 193, 163, 1, 203, 165, 193, 163, - 1, 223, 32, 193, 163, 1, 191, 123, 193, 163, 1, 193, 190, 193, 163, 1, - 195, 188, 193, 163, 1, 155, 193, 163, 1, 74, 193, 163, 1, 250, 163, 193, - 163, 1, 165, 193, 163, 1, 174, 193, 163, 1, 221, 215, 193, 163, 1, 140, - 193, 163, 1, 71, 193, 163, 1, 68, 193, 163, 1, 214, 68, 193, 163, 1, 66, - 193, 163, 1, 219, 66, 193, 163, 1, 197, 168, 193, 163, 1, 198, 26, 193, - 163, 1, 211, 94, 193, 163, 1, 252, 165, 193, 163, 1, 251, 122, 193, 163, - 1, 223, 136, 193, 163, 1, 211, 104, 193, 163, 1, 234, 103, 193, 163, 1, - 252, 166, 193, 163, 1, 212, 101, 193, 163, 1, 196, 147, 193, 163, 1, 192, - 24, 193, 163, 163, 197, 67, 193, 163, 163, 197, 66, 193, 163, 163, 221, - 54, 193, 163, 163, 221, 53, 193, 163, 17, 191, 77, 193, 163, 17, 107, - 193, 163, 17, 109, 193, 163, 17, 138, 193, 163, 17, 134, 193, 163, 17, - 149, 193, 163, 17, 169, 193, 163, 17, 175, 193, 163, 17, 171, 193, 163, - 17, 178, 193, 163, 213, 232, 56, 214, 243, 215, 120, 1, 74, 214, 243, - 215, 120, 1, 211, 78, 214, 243, 215, 120, 1, 211, 120, 214, 243, 215, - 120, 1, 210, 242, 214, 243, 215, 120, 1, 211, 94, 214, 243, 215, 120, 1, - 65, 214, 243, 215, 120, 1, 251, 218, 214, 243, 215, 120, 1, 252, 155, - 214, 243, 215, 120, 1, 251, 69, 214, 243, 215, 120, 1, 251, 245, 214, - 243, 215, 120, 1, 68, 214, 243, 215, 120, 1, 223, 68, 214, 243, 215, 120, - 1, 228, 18, 214, 243, 215, 120, 1, 223, 53, 214, 243, 215, 120, 1, 223, - 200, 214, 243, 215, 120, 1, 66, 214, 243, 215, 120, 1, 196, 160, 214, - 243, 215, 120, 1, 196, 158, 214, 243, 215, 120, 1, 196, 128, 214, 243, - 215, 120, 1, 196, 62, 214, 243, 215, 120, 1, 71, 214, 243, 215, 120, 1, - 234, 85, 214, 243, 215, 120, 1, 234, 180, 214, 243, 215, 120, 1, 234, - 114, 214, 243, 215, 120, 1, 234, 103, 214, 243, 215, 120, 1, 233, 245, - 214, 243, 215, 120, 1, 234, 122, 214, 243, 215, 120, 3, 211, 127, 214, - 243, 215, 120, 3, 215, 138, 214, 243, 215, 120, 3, 198, 28, 214, 243, - 215, 120, 3, 223, 193, 214, 243, 215, 120, 3, 200, 161, 214, 243, 215, - 120, 17, 191, 77, 214, 243, 215, 120, 17, 107, 214, 243, 215, 120, 17, - 109, 214, 243, 215, 120, 17, 138, 214, 243, 215, 120, 17, 134, 214, 243, - 215, 120, 17, 149, 214, 243, 215, 120, 17, 169, 214, 243, 215, 120, 17, - 175, 214, 243, 215, 120, 17, 171, 214, 243, 215, 120, 17, 178, 36, 5, - 229, 166, 36, 5, 229, 160, 36, 5, 229, 162, 36, 5, 229, 165, 36, 5, 229, - 163, 36, 5, 229, 164, 36, 5, 229, 161, 36, 5, 230, 147, 229, 170, 36, 5, - 229, 167, 36, 5, 229, 168, 36, 5, 229, 169, 36, 5, 230, 147, 215, 76, 36, - 5, 230, 147, 215, 77, 36, 5, 230, 147, 207, 236, 36, 5, 230, 147, 207, - 237, 36, 5, 230, 147, 207, 238, 36, 5, 230, 147, 247, 207, 36, 5, 230, - 147, 247, 208, 36, 5, 230, 147, 220, 172, 36, 5, 230, 147, 220, 173, 36, - 5, 230, 147, 220, 174, 36, 5, 230, 147, 230, 131, 36, 5, 230, 147, 230, - 132, 36, 5, 230, 147, 230, 133, 36, 5, 230, 147, 232, 58, 36, 5, 230, - 147, 232, 59, 36, 5, 230, 147, 208, 118, 36, 5, 230, 147, 208, 119, 85, - 84, 5, 218, 167, 221, 166, 85, 84, 5, 218, 163, 155, 85, 84, 5, 218, 161, - 220, 232, 85, 84, 5, 218, 37, 222, 13, 85, 84, 5, 218, 7, 222, 22, 85, - 84, 5, 218, 26, 221, 41, 85, 84, 5, 218, 54, 221, 67, 85, 84, 5, 217, - 179, 220, 219, 85, 84, 5, 218, 158, 193, 86, 85, 84, 5, 218, 156, 193, - 190, 85, 84, 5, 218, 154, 193, 0, 85, 84, 5, 217, 232, 193, 114, 85, 84, - 5, 217, 240, 193, 125, 85, 84, 5, 217, 244, 193, 29, 85, 84, 5, 218, 57, - 193, 48, 85, 84, 5, 217, 164, 192, 252, 85, 84, 5, 217, 215, 193, 112, - 85, 84, 5, 218, 41, 192, 240, 85, 84, 5, 218, 53, 192, 242, 85, 84, 5, - 217, 219, 192, 241, 85, 84, 5, 218, 152, 216, 44, 85, 84, 5, 218, 150, - 217, 90, 85, 84, 5, 218, 148, 215, 122, 85, 84, 5, 218, 43, 216, 186, 85, - 84, 5, 218, 8, 215, 231, 85, 84, 5, 217, 204, 215, 148, 85, 84, 5, 217, - 169, 215, 142, 85, 84, 5, 218, 146, 248, 188, 85, 84, 5, 218, 143, 249, - 153, 85, 84, 5, 218, 141, 248, 10, 85, 84, 5, 217, 208, 249, 1, 85, 84, - 5, 218, 5, 249, 17, 85, 84, 5, 217, 255, 248, 97, 85, 84, 5, 217, 220, - 248, 111, 85, 84, 5, 218, 131, 68, 85, 84, 5, 218, 129, 65, 85, 84, 5, - 218, 127, 66, 85, 84, 5, 217, 195, 234, 188, 85, 84, 5, 218, 2, 71, 85, - 84, 5, 217, 193, 211, 87, 85, 84, 5, 217, 211, 74, 85, 84, 5, 217, 221, - 234, 166, 85, 84, 5, 217, 227, 223, 162, 85, 84, 5, 217, 223, 223, 162, - 85, 84, 5, 217, 163, 251, 132, 85, 84, 5, 217, 180, 234, 103, 85, 84, 5, - 218, 116, 202, 222, 85, 84, 5, 218, 114, 188, 85, 84, 5, 218, 112, 201, - 4, 85, 84, 5, 217, 196, 205, 50, 85, 84, 5, 217, 242, 205, 68, 85, 84, 5, - 217, 222, 202, 16, 85, 84, 5, 218, 23, 202, 46, 85, 84, 5, 217, 162, 202, - 215, 85, 84, 5, 218, 102, 219, 146, 85, 84, 5, 218, 100, 173, 85, 84, 5, - 218, 98, 218, 225, 85, 84, 5, 218, 18, 219, 228, 85, 84, 5, 218, 29, 219, - 238, 85, 84, 5, 218, 48, 219, 8, 85, 84, 5, 217, 205, 219, 43, 85, 84, 5, - 217, 248, 179, 219, 238, 85, 84, 5, 218, 124, 237, 44, 85, 84, 5, 218, - 121, 238, 32, 85, 84, 5, 218, 118, 235, 89, 85, 84, 5, 218, 13, 237, 131, - 85, 84, 5, 217, 178, 236, 146, 85, 84, 5, 217, 177, 236, 174, 85, 84, 5, - 218, 110, 198, 193, 85, 84, 5, 218, 107, 190, 190, 85, 84, 5, 218, 105, - 197, 94, 85, 84, 5, 218, 11, 199, 121, 85, 84, 5, 218, 47, 199, 145, 85, - 84, 5, 217, 254, 198, 59, 85, 84, 5, 218, 33, 159, 85, 84, 5, 218, 96, - 222, 244, 85, 84, 5, 218, 93, 223, 32, 85, 84, 5, 218, 91, 222, 182, 85, - 84, 5, 217, 201, 223, 8, 85, 84, 5, 217, 245, 223, 10, 85, 84, 5, 217, - 198, 222, 191, 85, 84, 5, 218, 39, 222, 201, 85, 84, 5, 217, 183, 179, - 222, 201, 85, 84, 5, 218, 89, 192, 33, 85, 84, 5, 218, 86, 170, 85, 84, - 5, 218, 84, 191, 225, 85, 84, 5, 217, 249, 192, 77, 85, 84, 5, 218, 22, - 192, 80, 85, 84, 5, 217, 217, 191, 246, 85, 84, 5, 217, 237, 192, 12, 85, - 84, 5, 218, 80, 233, 23, 85, 84, 5, 218, 78, 233, 109, 85, 84, 5, 218, - 76, 232, 86, 85, 84, 5, 218, 24, 233, 52, 85, 84, 5, 218, 27, 233, 59, - 85, 84, 5, 217, 225, 232, 162, 85, 84, 5, 218, 14, 232, 175, 85, 84, 5, - 217, 161, 232, 85, 85, 84, 5, 218, 1, 233, 80, 85, 84, 5, 218, 74, 213, - 179, 85, 84, 5, 218, 72, 214, 226, 85, 84, 5, 218, 70, 212, 130, 85, 84, - 5, 217, 241, 214, 102, 85, 84, 5, 217, 189, 213, 31, 85, 84, 5, 217, 182, - 229, 158, 85, 84, 5, 218, 65, 140, 85, 84, 5, 217, 172, 228, 159, 85, 84, - 5, 218, 68, 229, 215, 85, 84, 5, 218, 6, 229, 245, 85, 84, 5, 218, 63, - 228, 252, 85, 84, 5, 217, 218, 229, 23, 85, 84, 5, 218, 19, 229, 214, 85, - 84, 5, 217, 230, 228, 245, 85, 84, 5, 218, 49, 229, 128, 85, 84, 5, 217, - 228, 230, 56, 85, 84, 5, 218, 15, 228, 142, 85, 84, 5, 218, 50, 229, 198, - 85, 84, 5, 217, 165, 228, 255, 85, 84, 5, 218, 56, 228, 155, 85, 84, 5, - 218, 12, 214, 33, 85, 84, 5, 218, 61, 214, 47, 85, 84, 5, 218, 20, 214, - 30, 85, 84, 5, 217, 243, 214, 41, 85, 84, 5, 217, 212, 214, 42, 85, 84, - 5, 217, 202, 214, 31, 85, 84, 5, 217, 238, 214, 32, 85, 84, 5, 217, 199, - 214, 46, 85, 84, 5, 217, 231, 214, 29, 85, 84, 5, 218, 16, 179, 214, 42, - 85, 84, 5, 217, 252, 179, 214, 31, 85, 84, 5, 217, 175, 179, 214, 32, 85, - 84, 5, 217, 203, 231, 53, 85, 84, 5, 217, 247, 231, 240, 85, 84, 5, 217, - 190, 230, 179, 85, 84, 5, 217, 168, 231, 157, 85, 84, 5, 217, 192, 230, - 165, 85, 84, 5, 217, 191, 230, 175, 85, 84, 5, 217, 174, 214, 52, 85, 84, - 5, 218, 45, 213, 245, 85, 84, 5, 217, 181, 213, 234, 85, 84, 5, 218, 34, - 209, 185, 85, 84, 5, 218, 3, 168, 85, 84, 5, 218, 52, 208, 165, 85, 84, - 5, 218, 21, 210, 49, 85, 84, 5, 218, 51, 210, 63, 85, 84, 5, 218, 0, 209, - 37, 85, 84, 5, 218, 36, 209, 73, 85, 84, 5, 217, 213, 216, 252, 85, 84, - 5, 218, 40, 217, 11, 85, 84, 5, 217, 236, 216, 246, 85, 84, 5, 218, 55, - 217, 3, 85, 84, 5, 217, 170, 217, 3, 85, 84, 5, 218, 30, 217, 4, 85, 84, - 5, 217, 186, 216, 247, 85, 84, 5, 217, 184, 216, 248, 85, 84, 5, 217, - 171, 216, 240, 85, 84, 5, 217, 197, 179, 217, 4, 85, 84, 5, 217, 253, - 179, 216, 247, 85, 84, 5, 217, 216, 179, 216, 248, 85, 84, 5, 217, 226, - 221, 13, 85, 84, 5, 218, 10, 221, 21, 85, 84, 5, 218, 28, 221, 9, 85, 84, - 5, 218, 59, 221, 16, 85, 84, 5, 217, 250, 221, 17, 85, 84, 5, 217, 246, - 221, 11, 85, 84, 5, 217, 200, 221, 12, 85, 84, 5, 217, 234, 231, 174, 85, - 84, 5, 218, 46, 231, 182, 85, 84, 5, 217, 210, 231, 169, 85, 84, 5, 218, - 9, 231, 178, 85, 84, 5, 217, 251, 231, 179, 85, 84, 5, 218, 31, 231, 170, - 85, 84, 5, 218, 32, 231, 172, 85, 84, 5, 217, 187, 165, 85, 84, 5, 217, - 235, 214, 147, 85, 84, 5, 217, 229, 214, 162, 85, 84, 5, 217, 233, 214, - 129, 85, 84, 5, 217, 167, 214, 153, 85, 84, 5, 217, 239, 214, 154, 85, - 84, 5, 218, 35, 214, 134, 85, 84, 5, 218, 38, 214, 138, 85, 84, 5, 217, - 206, 213, 157, 85, 84, 5, 217, 166, 213, 127, 85, 84, 5, 217, 209, 213, - 148, 85, 84, 5, 217, 224, 213, 131, 85, 84, 5, 217, 176, 195, 69, 85, 84, - 5, 217, 173, 195, 188, 85, 84, 5, 217, 207, 193, 249, 85, 84, 5, 217, - 185, 195, 148, 85, 84, 5, 218, 17, 195, 153, 85, 84, 5, 217, 214, 195, 8, - 85, 84, 5, 218, 25, 195, 24, 85, 84, 5, 217, 194, 212, 74, 85, 84, 5, - 218, 44, 212, 94, 85, 84, 5, 217, 188, 212, 56, 85, 84, 5, 218, 4, 212, - 86, 85, 84, 5, 218, 42, 212, 63, 85, 84, 17, 107, 85, 84, 17, 109, 85, - 84, 17, 138, 85, 84, 17, 134, 85, 84, 17, 149, 85, 84, 17, 169, 85, 84, - 17, 175, 85, 84, 17, 171, 85, 84, 17, 178, 85, 84, 33, 31, 199, 119, 85, - 84, 33, 31, 199, 90, 85, 84, 33, 31, 228, 138, 85, 84, 33, 31, 198, 228, - 85, 84, 33, 31, 199, 96, 198, 228, 85, 84, 33, 31, 228, 141, 198, 228, - 85, 84, 33, 31, 216, 47, 252, 33, 6, 1, 251, 180, 252, 33, 6, 1, 238, 29, - 252, 33, 6, 1, 220, 123, 252, 33, 6, 1, 216, 60, 252, 33, 6, 1, 249, 153, - 252, 33, 6, 1, 202, 164, 252, 33, 6, 1, 210, 63, 252, 33, 6, 1, 248, 196, - 252, 33, 6, 1, 165, 252, 33, 6, 1, 71, 252, 33, 6, 1, 233, 109, 252, 33, - 6, 1, 68, 252, 33, 6, 1, 74, 252, 33, 6, 1, 237, 68, 252, 33, 6, 1, 192, - 34, 252, 33, 6, 1, 193, 133, 252, 33, 6, 1, 212, 130, 252, 33, 6, 1, 222, - 106, 252, 33, 6, 1, 170, 252, 33, 6, 1, 66, 252, 33, 6, 1, 222, 235, 252, - 33, 6, 1, 243, 95, 252, 33, 6, 1, 140, 252, 33, 6, 1, 208, 94, 252, 33, - 6, 1, 231, 240, 252, 33, 6, 1, 212, 101, 252, 33, 6, 1, 197, 94, 252, 33, - 6, 1, 213, 224, 252, 33, 6, 1, 195, 188, 252, 33, 6, 1, 221, 215, 252, - 33, 6, 1, 231, 179, 252, 33, 6, 1, 191, 108, 252, 33, 6, 1, 221, 12, 252, - 33, 6, 1, 203, 165, 252, 33, 2, 1, 251, 180, 252, 33, 2, 1, 238, 29, 252, - 33, 2, 1, 220, 123, 252, 33, 2, 1, 216, 60, 252, 33, 2, 1, 249, 153, 252, - 33, 2, 1, 202, 164, 252, 33, 2, 1, 210, 63, 252, 33, 2, 1, 248, 196, 252, - 33, 2, 1, 165, 252, 33, 2, 1, 71, 252, 33, 2, 1, 233, 109, 252, 33, 2, 1, - 68, 252, 33, 2, 1, 74, 252, 33, 2, 1, 237, 68, 252, 33, 2, 1, 192, 34, - 252, 33, 2, 1, 193, 133, 252, 33, 2, 1, 212, 130, 252, 33, 2, 1, 222, - 106, 252, 33, 2, 1, 170, 252, 33, 2, 1, 66, 252, 33, 2, 1, 222, 235, 252, - 33, 2, 1, 243, 95, 252, 33, 2, 1, 140, 252, 33, 2, 1, 208, 94, 252, 33, - 2, 1, 231, 240, 252, 33, 2, 1, 212, 101, 252, 33, 2, 1, 197, 94, 252, 33, - 2, 1, 213, 224, 252, 33, 2, 1, 195, 188, 252, 33, 2, 1, 221, 215, 252, - 33, 2, 1, 231, 179, 252, 33, 2, 1, 191, 108, 252, 33, 2, 1, 221, 12, 252, - 33, 2, 1, 203, 165, 252, 33, 251, 181, 219, 190, 252, 33, 18, 219, 190, - 252, 33, 231, 153, 77, 252, 33, 230, 57, 252, 33, 120, 215, 252, 252, 33, - 231, 154, 120, 215, 252, 252, 33, 212, 141, 252, 33, 214, 213, 77, 252, - 33, 17, 191, 77, 252, 33, 17, 107, 252, 33, 17, 109, 252, 33, 17, 138, - 252, 33, 17, 134, 252, 33, 17, 149, 252, 33, 17, 169, 252, 33, 17, 175, - 252, 33, 17, 171, 252, 33, 17, 178, 252, 33, 89, 233, 216, 77, 252, 33, - 89, 208, 13, 77, 223, 146, 143, 31, 107, 223, 146, 143, 31, 109, 223, - 146, 143, 31, 138, 223, 146, 143, 31, 134, 223, 146, 143, 31, 149, 223, - 146, 143, 31, 169, 223, 146, 143, 31, 175, 223, 146, 143, 31, 171, 223, - 146, 143, 31, 178, 223, 146, 143, 31, 199, 95, 223, 146, 143, 31, 197, - 32, 223, 146, 143, 31, 198, 249, 223, 146, 143, 31, 232, 135, 223, 146, - 143, 31, 233, 15, 223, 146, 143, 31, 202, 120, 223, 146, 143, 31, 203, - 241, 223, 146, 143, 31, 234, 153, 223, 146, 143, 31, 213, 169, 223, 146, - 143, 31, 91, 228, 140, 223, 146, 143, 31, 105, 228, 140, 223, 146, 143, - 31, 115, 228, 140, 223, 146, 143, 31, 232, 128, 228, 140, 223, 146, 143, - 31, 232, 226, 228, 140, 223, 146, 143, 31, 202, 136, 228, 140, 223, 146, - 143, 31, 203, 247, 228, 140, 223, 146, 143, 31, 234, 164, 228, 140, 223, - 146, 143, 31, 213, 175, 228, 140, 223, 146, 143, 31, 91, 189, 223, 146, - 143, 31, 105, 189, 223, 146, 143, 31, 115, 189, 223, 146, 143, 31, 232, - 128, 189, 223, 146, 143, 31, 232, 226, 189, 223, 146, 143, 31, 202, 136, - 189, 223, 146, 143, 31, 203, 247, 189, 223, 146, 143, 31, 234, 164, 189, - 223, 146, 143, 31, 213, 175, 189, 223, 146, 143, 31, 199, 96, 189, 223, - 146, 143, 31, 197, 33, 189, 223, 146, 143, 31, 198, 250, 189, 223, 146, - 143, 31, 232, 136, 189, 223, 146, 143, 31, 233, 16, 189, 223, 146, 143, - 31, 202, 121, 189, 223, 146, 143, 31, 203, 242, 189, 223, 146, 143, 31, - 234, 154, 189, 223, 146, 143, 31, 213, 170, 189, 223, 146, 143, 31, 220, - 41, 223, 146, 143, 31, 220, 40, 223, 146, 143, 220, 42, 77, 223, 146, - 143, 31, 222, 60, 223, 146, 143, 31, 222, 59, 223, 146, 143, 31, 208, - 227, 107, 223, 146, 143, 31, 208, 227, 109, 223, 146, 143, 31, 208, 227, - 138, 223, 146, 143, 31, 208, 227, 134, 223, 146, 143, 31, 208, 227, 149, - 223, 146, 143, 31, 208, 227, 169, 223, 146, 143, 31, 208, 227, 175, 223, - 146, 143, 31, 208, 227, 171, 223, 146, 143, 31, 208, 227, 178, 223, 146, - 143, 209, 106, 223, 146, 143, 232, 118, 91, 208, 22, 223, 146, 143, 232, - 118, 91, 230, 70, 223, 146, 143, 232, 118, 115, 208, 20, 223, 146, 143, - 206, 36, 77, 223, 146, 143, 31, 251, 157, 107, 223, 146, 143, 31, 251, - 157, 109, 223, 146, 143, 31, 251, 157, 199, 96, 189, 223, 146, 143, 251, - 157, 220, 42, 77, 211, 21, 143, 31, 107, 211, 21, 143, 31, 109, 211, 21, - 143, 31, 138, 211, 21, 143, 31, 134, 211, 21, 143, 31, 149, 211, 21, 143, - 31, 169, 211, 21, 143, 31, 175, 211, 21, 143, 31, 171, 211, 21, 143, 31, - 178, 211, 21, 143, 31, 199, 95, 211, 21, 143, 31, 197, 32, 211, 21, 143, - 31, 198, 249, 211, 21, 143, 31, 232, 135, 211, 21, 143, 31, 233, 15, 211, - 21, 143, 31, 202, 120, 211, 21, 143, 31, 203, 241, 211, 21, 143, 31, 234, - 153, 211, 21, 143, 31, 213, 169, 211, 21, 143, 31, 91, 228, 140, 211, 21, - 143, 31, 105, 228, 140, 211, 21, 143, 31, 115, 228, 140, 211, 21, 143, - 31, 232, 128, 228, 140, 211, 21, 143, 31, 232, 226, 228, 140, 211, 21, - 143, 31, 202, 136, 228, 140, 211, 21, 143, 31, 203, 247, 228, 140, 211, - 21, 143, 31, 234, 164, 228, 140, 211, 21, 143, 31, 213, 175, 228, 140, - 211, 21, 143, 31, 91, 189, 211, 21, 143, 31, 105, 189, 211, 21, 143, 31, - 115, 189, 211, 21, 143, 31, 232, 128, 189, 211, 21, 143, 31, 232, 226, - 189, 211, 21, 143, 31, 202, 136, 189, 211, 21, 143, 31, 203, 247, 189, - 211, 21, 143, 31, 234, 164, 189, 211, 21, 143, 31, 213, 175, 189, 211, - 21, 143, 31, 199, 96, 189, 211, 21, 143, 31, 197, 33, 189, 211, 21, 143, - 31, 198, 250, 189, 211, 21, 143, 31, 232, 136, 189, 211, 21, 143, 31, - 233, 16, 189, 211, 21, 143, 31, 202, 121, 189, 211, 21, 143, 31, 203, - 242, 189, 211, 21, 143, 31, 234, 154, 189, 211, 21, 143, 31, 213, 170, - 189, 211, 21, 143, 217, 49, 211, 21, 143, 251, 157, 31, 109, 211, 21, - 143, 251, 157, 31, 138, 211, 21, 143, 251, 157, 31, 134, 211, 21, 143, - 251, 157, 31, 149, 211, 21, 143, 251, 157, 31, 169, 211, 21, 143, 251, - 157, 31, 175, 211, 21, 143, 251, 157, 31, 171, 211, 21, 143, 251, 157, - 31, 178, 211, 21, 143, 251, 157, 31, 199, 95, 211, 21, 143, 251, 157, 31, - 232, 128, 228, 140, 211, 21, 143, 251, 157, 31, 202, 136, 228, 140, 211, - 21, 143, 251, 157, 31, 105, 189, 211, 21, 143, 251, 157, 31, 199, 96, - 189, 211, 21, 143, 232, 118, 91, 230, 70, 211, 21, 143, 232, 118, 91, - 202, 124, 9, 13, 251, 192, 9, 13, 248, 245, 9, 13, 223, 6, 9, 13, 238, 3, - 9, 13, 193, 133, 9, 13, 191, 113, 9, 13, 230, 81, 9, 13, 199, 219, 9, 13, - 192, 75, 9, 13, 222, 106, 9, 13, 220, 35, 9, 13, 216, 208, 9, 13, 213, - 24, 9, 13, 205, 46, 9, 13, 251, 230, 9, 13, 233, 46, 9, 13, 205, 192, 9, - 13, 208, 89, 9, 13, 207, 71, 9, 13, 203, 109, 9, 13, 199, 114, 9, 13, - 199, 29, 9, 13, 221, 210, 9, 13, 199, 41, 9, 13, 238, 26, 9, 13, 191, - 116, 9, 13, 231, 86, 9, 13, 236, 139, 248, 245, 9, 13, 236, 139, 213, 24, - 9, 13, 236, 139, 233, 46, 9, 13, 236, 139, 208, 89, 9, 13, 89, 248, 245, - 9, 13, 89, 223, 6, 9, 13, 89, 229, 210, 9, 13, 89, 230, 81, 9, 13, 89, - 192, 75, 9, 13, 89, 222, 106, 9, 13, 89, 220, 35, 9, 13, 89, 216, 208, 9, - 13, 89, 213, 24, 9, 13, 89, 205, 46, 9, 13, 89, 251, 230, 9, 13, 89, 233, - 46, 9, 13, 89, 205, 192, 9, 13, 89, 208, 89, 9, 13, 89, 203, 109, 9, 13, - 89, 199, 114, 9, 13, 89, 199, 29, 9, 13, 89, 221, 210, 9, 13, 89, 238, - 26, 9, 13, 89, 231, 86, 9, 13, 199, 214, 223, 6, 9, 13, 199, 214, 230, - 81, 9, 13, 199, 214, 192, 75, 9, 13, 199, 214, 220, 35, 9, 13, 199, 214, - 213, 24, 9, 13, 199, 214, 205, 46, 9, 13, 199, 214, 251, 230, 9, 13, 199, - 214, 205, 192, 9, 13, 199, 214, 208, 89, 9, 13, 199, 214, 203, 109, 9, - 13, 199, 214, 221, 210, 9, 13, 199, 214, 238, 26, 9, 13, 199, 214, 231, - 86, 9, 13, 199, 214, 236, 139, 213, 24, 9, 13, 199, 214, 236, 139, 208, - 89, 9, 13, 201, 36, 248, 245, 9, 13, 201, 36, 223, 6, 9, 13, 201, 36, - 229, 210, 9, 13, 201, 36, 230, 81, 9, 13, 201, 36, 199, 219, 9, 13, 201, - 36, 192, 75, 9, 13, 201, 36, 222, 106, 9, 13, 201, 36, 216, 208, 9, 13, - 201, 36, 213, 24, 9, 13, 201, 36, 205, 46, 9, 13, 201, 36, 251, 230, 9, - 13, 201, 36, 233, 46, 9, 13, 201, 36, 205, 192, 9, 13, 201, 36, 208, 89, - 9, 13, 201, 36, 203, 109, 9, 13, 201, 36, 199, 114, 9, 13, 201, 36, 199, - 29, 9, 13, 201, 36, 221, 210, 9, 13, 201, 36, 238, 26, 9, 13, 201, 36, - 191, 116, 9, 13, 201, 36, 231, 86, 9, 13, 201, 36, 236, 139, 248, 245, 9, - 13, 201, 36, 236, 139, 233, 46, 9, 13, 219, 3, 251, 192, 9, 13, 219, 3, - 248, 245, 9, 13, 219, 3, 223, 6, 9, 13, 219, 3, 238, 3, 9, 13, 219, 3, - 229, 210, 9, 13, 219, 3, 193, 133, 9, 13, 219, 3, 191, 113, 9, 13, 219, - 3, 230, 81, 9, 13, 219, 3, 199, 219, 9, 13, 219, 3, 192, 75, 9, 13, 219, - 3, 220, 35, 9, 13, 219, 3, 216, 208, 9, 13, 219, 3, 213, 24, 9, 13, 219, - 3, 205, 46, 9, 13, 219, 3, 251, 230, 9, 13, 219, 3, 233, 46, 9, 13, 219, - 3, 205, 192, 9, 13, 219, 3, 208, 89, 9, 13, 219, 3, 207, 71, 9, 13, 219, - 3, 203, 109, 9, 13, 219, 3, 199, 114, 9, 13, 219, 3, 199, 29, 9, 13, 219, - 3, 221, 210, 9, 13, 219, 3, 199, 41, 9, 13, 219, 3, 238, 26, 9, 13, 219, - 3, 191, 116, 9, 13, 219, 3, 231, 86, 9, 13, 235, 129, 248, 245, 9, 13, - 235, 129, 223, 6, 9, 13, 235, 129, 238, 3, 9, 13, 235, 129, 193, 133, 9, - 13, 235, 129, 191, 113, 9, 13, 235, 129, 230, 81, 9, 13, 235, 129, 199, - 219, 9, 13, 235, 129, 192, 75, 9, 13, 235, 129, 220, 35, 9, 13, 235, 129, - 216, 208, 9, 13, 235, 129, 213, 24, 9, 13, 235, 129, 205, 46, 9, 13, 235, - 129, 251, 230, 9, 13, 235, 129, 233, 46, 9, 13, 235, 129, 205, 192, 9, - 13, 235, 129, 208, 89, 9, 13, 235, 129, 207, 71, 9, 13, 235, 129, 203, - 109, 9, 13, 235, 129, 199, 114, 9, 13, 235, 129, 199, 29, 9, 13, 235, - 129, 221, 210, 9, 13, 235, 129, 199, 41, 9, 13, 235, 129, 238, 26, 9, 13, - 235, 129, 191, 116, 9, 13, 235, 129, 231, 86, 9, 13, 211, 67, 92, 4, 182, - 4, 199, 168, 9, 13, 211, 67, 182, 4, 238, 3, 217, 114, 123, 234, 204, - 193, 66, 217, 114, 123, 202, 2, 193, 66, 217, 114, 123, 193, 105, 193, - 66, 217, 114, 123, 186, 193, 66, 217, 114, 123, 207, 87, 235, 111, 217, - 114, 123, 230, 201, 235, 111, 217, 114, 123, 63, 235, 111, 217, 114, 123, - 91, 79, 243, 140, 217, 114, 123, 105, 79, 243, 140, 217, 114, 123, 115, - 79, 243, 140, 217, 114, 123, 232, 128, 79, 243, 140, 217, 114, 123, 232, - 226, 79, 243, 140, 217, 114, 123, 202, 136, 79, 243, 140, 217, 114, 123, - 203, 247, 79, 243, 140, 217, 114, 123, 234, 164, 79, 243, 140, 217, 114, - 123, 213, 175, 79, 243, 140, 217, 114, 123, 91, 79, 249, 102, 217, 114, - 123, 105, 79, 249, 102, 217, 114, 123, 115, 79, 249, 102, 217, 114, 123, - 232, 128, 79, 249, 102, 217, 114, 123, 232, 226, 79, 249, 102, 217, 114, - 123, 202, 136, 79, 249, 102, 217, 114, 123, 203, 247, 79, 249, 102, 217, - 114, 123, 234, 164, 79, 249, 102, 217, 114, 123, 213, 175, 79, 249, 102, - 217, 114, 123, 91, 79, 243, 7, 217, 114, 123, 105, 79, 243, 7, 217, 114, - 123, 115, 79, 243, 7, 217, 114, 123, 232, 128, 79, 243, 7, 217, 114, 123, - 232, 226, 79, 243, 7, 217, 114, 123, 202, 136, 79, 243, 7, 217, 114, 123, - 203, 247, 79, 243, 7, 217, 114, 123, 234, 164, 79, 243, 7, 217, 114, 123, - 213, 175, 79, 243, 7, 217, 114, 123, 209, 85, 217, 114, 123, 211, 53, - 217, 114, 123, 249, 103, 217, 114, 123, 243, 49, 217, 114, 123, 201, 196, - 217, 114, 123, 200, 200, 217, 114, 123, 250, 149, 217, 114, 123, 193, 56, - 217, 114, 123, 222, 194, 217, 114, 123, 249, 146, 236, 151, 123, 228, - 241, 249, 146, 236, 151, 123, 228, 239, 236, 151, 123, 228, 238, 236, - 151, 123, 228, 237, 236, 151, 123, 228, 236, 236, 151, 123, 228, 235, - 236, 151, 123, 228, 234, 236, 151, 123, 228, 233, 236, 151, 123, 228, - 232, 236, 151, 123, 228, 231, 236, 151, 123, 228, 230, 236, 151, 123, - 228, 229, 236, 151, 123, 228, 228, 236, 151, 123, 228, 227, 236, 151, - 123, 228, 226, 236, 151, 123, 228, 225, 236, 151, 123, 228, 224, 236, - 151, 123, 228, 223, 236, 151, 123, 228, 222, 236, 151, 123, 228, 221, - 236, 151, 123, 228, 220, 236, 151, 123, 228, 219, 236, 151, 123, 228, - 218, 236, 151, 123, 228, 217, 236, 151, 123, 228, 216, 236, 151, 123, - 228, 215, 236, 151, 123, 228, 214, 236, 151, 123, 228, 213, 236, 151, - 123, 228, 212, 236, 151, 123, 228, 211, 236, 151, 123, 228, 210, 236, - 151, 123, 228, 209, 236, 151, 123, 228, 208, 236, 151, 123, 228, 207, - 236, 151, 123, 228, 206, 236, 151, 123, 228, 205, 236, 151, 123, 228, - 204, 236, 151, 123, 228, 203, 236, 151, 123, 228, 202, 236, 151, 123, - 228, 201, 236, 151, 123, 228, 200, 236, 151, 123, 228, 199, 236, 151, - 123, 228, 198, 236, 151, 123, 228, 197, 236, 151, 123, 228, 196, 236, - 151, 123, 228, 195, 236, 151, 123, 228, 194, 236, 151, 123, 228, 193, - 236, 151, 123, 228, 192, 236, 151, 123, 228, 191, 236, 151, 123, 81, 249, - 146, 236, 151, 123, 195, 134, 236, 151, 123, 195, 133, 236, 151, 123, - 195, 132, 236, 151, 123, 195, 131, 236, 151, 123, 195, 130, 236, 151, - 123, 195, 129, 236, 151, 123, 195, 128, 236, 151, 123, 195, 127, 236, - 151, 123, 195, 126, 236, 151, 123, 195, 125, 236, 151, 123, 195, 124, - 236, 151, 123, 195, 123, 236, 151, 123, 195, 122, 236, 151, 123, 195, - 121, 236, 151, 123, 195, 120, 236, 151, 123, 195, 119, 236, 151, 123, - 195, 118, 236, 151, 123, 195, 117, 236, 151, 123, 195, 116, 236, 151, - 123, 195, 115, 236, 151, 123, 195, 114, 236, 151, 123, 195, 113, 236, - 151, 123, 195, 112, 236, 151, 123, 195, 111, 236, 151, 123, 195, 110, - 236, 151, 123, 195, 109, 236, 151, 123, 195, 108, 236, 151, 123, 195, - 107, 236, 151, 123, 195, 106, 236, 151, 123, 195, 105, 236, 151, 123, - 195, 104, 236, 151, 123, 195, 103, 236, 151, 123, 195, 102, 236, 151, - 123, 195, 101, 236, 151, 123, 195, 100, 236, 151, 123, 195, 99, 236, 151, - 123, 195, 98, 236, 151, 123, 195, 97, 236, 151, 123, 195, 96, 236, 151, - 123, 195, 95, 236, 151, 123, 195, 94, 236, 151, 123, 195, 93, 236, 151, - 123, 195, 92, 236, 151, 123, 195, 91, 236, 151, 123, 195, 90, 236, 151, - 123, 195, 89, 236, 151, 123, 195, 88, 236, 151, 123, 195, 87, 236, 151, - 123, 195, 86, 209, 95, 247, 101, 249, 146, 209, 95, 247, 101, 252, 53, - 79, 201, 244, 209, 95, 247, 101, 105, 79, 201, 244, 209, 95, 247, 101, - 115, 79, 201, 244, 209, 95, 247, 101, 232, 128, 79, 201, 244, 209, 95, - 247, 101, 232, 226, 79, 201, 244, 209, 95, 247, 101, 202, 136, 79, 201, - 244, 209, 95, 247, 101, 203, 247, 79, 201, 244, 209, 95, 247, 101, 234, - 164, 79, 201, 244, 209, 95, 247, 101, 213, 175, 79, 201, 244, 209, 95, - 247, 101, 199, 96, 79, 201, 244, 209, 95, 247, 101, 223, 30, 79, 201, - 244, 209, 95, 247, 101, 221, 77, 79, 201, 244, 209, 95, 247, 101, 208, - 15, 79, 201, 244, 209, 95, 247, 101, 221, 139, 79, 201, 244, 209, 95, - 247, 101, 252, 53, 79, 229, 221, 209, 95, 247, 101, 105, 79, 229, 221, - 209, 95, 247, 101, 115, 79, 229, 221, 209, 95, 247, 101, 232, 128, 79, - 229, 221, 209, 95, 247, 101, 232, 226, 79, 229, 221, 209, 95, 247, 101, - 202, 136, 79, 229, 221, 209, 95, 247, 101, 203, 247, 79, 229, 221, 209, - 95, 247, 101, 234, 164, 79, 229, 221, 209, 95, 247, 101, 213, 175, 79, - 229, 221, 209, 95, 247, 101, 199, 96, 79, 229, 221, 209, 95, 247, 101, - 223, 30, 79, 229, 221, 209, 95, 247, 101, 221, 77, 79, 229, 221, 209, 95, - 247, 101, 208, 15, 79, 229, 221, 209, 95, 247, 101, 221, 139, 79, 229, - 221, 209, 95, 247, 101, 207, 87, 222, 194, 209, 95, 247, 101, 252, 53, - 79, 237, 31, 209, 95, 247, 101, 105, 79, 237, 31, 209, 95, 247, 101, 115, - 79, 237, 31, 209, 95, 247, 101, 232, 128, 79, 237, 31, 209, 95, 247, 101, - 232, 226, 79, 237, 31, 209, 95, 247, 101, 202, 136, 79, 237, 31, 209, 95, - 247, 101, 203, 247, 79, 237, 31, 209, 95, 247, 101, 234, 164, 79, 237, - 31, 209, 95, 247, 101, 213, 175, 79, 237, 31, 209, 95, 247, 101, 199, 96, - 79, 237, 31, 209, 95, 247, 101, 223, 30, 79, 237, 31, 209, 95, 247, 101, - 221, 77, 79, 237, 31, 209, 95, 247, 101, 208, 15, 79, 237, 31, 209, 95, - 247, 101, 221, 139, 79, 237, 31, 209, 95, 247, 101, 62, 222, 194, 209, - 95, 247, 101, 252, 53, 79, 242, 204, 209, 95, 247, 101, 105, 79, 242, - 204, 209, 95, 247, 101, 115, 79, 242, 204, 209, 95, 247, 101, 232, 128, - 79, 242, 204, 209, 95, 247, 101, 232, 226, 79, 242, 204, 209, 95, 247, - 101, 202, 136, 79, 242, 204, 209, 95, 247, 101, 203, 247, 79, 242, 204, - 209, 95, 247, 101, 234, 164, 79, 242, 204, 209, 95, 247, 101, 213, 175, - 79, 242, 204, 209, 95, 247, 101, 199, 96, 79, 242, 204, 209, 95, 247, - 101, 223, 30, 79, 242, 204, 209, 95, 247, 101, 221, 77, 79, 242, 204, - 209, 95, 247, 101, 208, 15, 79, 242, 204, 209, 95, 247, 101, 221, 139, - 79, 242, 204, 209, 95, 247, 101, 63, 222, 194, 209, 95, 247, 101, 232, - 160, 209, 95, 247, 101, 197, 200, 209, 95, 247, 101, 197, 189, 209, 95, - 247, 101, 197, 186, 209, 95, 247, 101, 197, 185, 209, 95, 247, 101, 197, - 184, 209, 95, 247, 101, 197, 183, 209, 95, 247, 101, 197, 182, 209, 95, - 247, 101, 197, 181, 209, 95, 247, 101, 197, 180, 209, 95, 247, 101, 197, - 199, 209, 95, 247, 101, 197, 198, 209, 95, 247, 101, 197, 197, 209, 95, - 247, 101, 197, 196, 209, 95, 247, 101, 197, 195, 209, 95, 247, 101, 197, - 194, 209, 95, 247, 101, 197, 193, 209, 95, 247, 101, 197, 192, 209, 95, - 247, 101, 197, 191, 209, 95, 247, 101, 197, 190, 209, 95, 247, 101, 197, - 188, 209, 95, 247, 101, 197, 187, 17, 191, 78, 232, 80, 201, 63, 17, 191, - 78, 242, 74, 17, 91, 242, 74, 17, 105, 242, 74, 17, 115, 242, 74, 17, - 232, 128, 242, 74, 17, 232, 226, 242, 74, 17, 202, 136, 242, 74, 17, 203, - 247, 242, 74, 17, 234, 164, 242, 74, 17, 213, 175, 242, 74, 236, 241, 47, - 49, 17, 191, 77, 236, 241, 214, 106, 47, 49, 17, 191, 77, 47, 191, 78, 4, - 202, 97, 47, 251, 85, 57, 47, 236, 155, 3, 4, 211, 4, 249, 141, 127, 8, - 6, 1, 65, 127, 8, 6, 1, 250, 120, 127, 8, 6, 1, 247, 193, 127, 8, 6, 1, - 238, 127, 127, 8, 6, 1, 71, 127, 8, 6, 1, 233, 175, 127, 8, 6, 1, 232, - 51, 127, 8, 6, 1, 230, 116, 127, 8, 6, 1, 68, 127, 8, 6, 1, 223, 35, 127, - 8, 6, 1, 222, 152, 127, 8, 6, 1, 172, 127, 8, 6, 1, 218, 168, 127, 8, 6, - 1, 215, 61, 127, 8, 6, 1, 74, 127, 8, 6, 1, 210, 236, 127, 8, 6, 1, 208, - 104, 127, 8, 6, 1, 146, 127, 8, 6, 1, 206, 8, 127, 8, 6, 1, 200, 43, 127, + 13, 49, 28, 17, 134, 13, 49, 28, 17, 150, 13, 49, 28, 17, 169, 13, 49, + 28, 17, 175, 13, 49, 28, 17, 171, 13, 49, 28, 17, 178, 13, 215, 219, 17, + 191, 77, 13, 215, 219, 17, 107, 13, 215, 219, 17, 109, 13, 215, 219, 17, + 138, 13, 215, 219, 17, 134, 13, 215, 219, 17, 150, 13, 215, 219, 17, 169, + 13, 215, 219, 17, 175, 13, 215, 219, 17, 171, 13, 215, 219, 17, 178, 24, + 152, 223, 150, 24, 230, 52, 223, 150, 24, 230, 48, 223, 150, 24, 230, 37, + 223, 150, 24, 230, 41, 223, 150, 24, 230, 54, 223, 150, 24, 152, 141, + 248, 225, 24, 230, 52, 141, 248, 225, 24, 152, 176, 196, 105, 141, 248, + 225, 24, 152, 141, 207, 149, 221, 72, 24, 152, 141, 238, 179, 24, 152, + 141, 229, 126, 24, 152, 141, 229, 127, 218, 243, 24, 230, 52, 141, 229, + 128, 24, 152, 141, 216, 86, 24, 230, 52, 141, 216, 86, 24, 152, 141, 82, + 248, 225, 24, 152, 141, 82, 207, 149, 221, 71, 24, 152, 141, 82, 229, + 126, 24, 152, 141, 133, 82, 229, 126, 24, 152, 141, 229, 127, 82, 196, + 77, 24, 152, 141, 82, 239, 48, 24, 152, 141, 82, 239, 49, 141, 248, 225, + 24, 152, 141, 82, 239, 49, 82, 248, 225, 24, 152, 141, 82, 239, 49, 238, + 179, 24, 152, 141, 82, 239, 49, 229, 126, 24, 152, 141, 82, 238, 215, 24, + 230, 52, 141, 82, 238, 215, 24, 152, 82, 248, 226, 139, 223, 150, 24, + 152, 141, 248, 226, 139, 216, 86, 24, 152, 141, 82, 198, 212, 24, 230, + 52, 141, 82, 198, 212, 24, 152, 141, 82, 201, 54, 176, 248, 225, 24, 152, + 141, 82, 248, 226, 176, 201, 53, 24, 152, 141, 82, 176, 248, 225, 24, + 152, 141, 82, 229, 127, 201, 200, 176, 202, 208, 24, 152, 141, 133, 82, + 229, 127, 176, 202, 208, 24, 152, 141, 133, 82, 229, 127, 176, 239, 48, + 24, 152, 141, 229, 127, 82, 133, 176, 202, 208, 24, 152, 141, 82, 133, + 201, 200, 176, 232, 134, 24, 152, 141, 82, 176, 238, 179, 24, 152, 141, + 82, 176, 243, 11, 24, 152, 141, 82, 176, 228, 251, 24, 152, 141, 82, 176, + 229, 126, 24, 152, 176, 248, 212, 141, 82, 201, 53, 24, 152, 141, 82, + 239, 49, 176, 202, 208, 24, 152, 141, 82, 239, 49, 176, 202, 209, 239, + 48, 24, 152, 141, 82, 239, 49, 176, 202, 209, 248, 225, 24, 152, 82, 176, + 228, 252, 141, 196, 77, 24, 152, 141, 176, 228, 252, 82, 196, 77, 24, + 152, 141, 82, 239, 49, 229, 127, 176, 202, 208, 24, 152, 141, 82, 238, + 216, 176, 202, 208, 24, 152, 141, 82, 239, 49, 176, 232, 134, 24, 152, + 141, 82, 239, 49, 238, 180, 176, 232, 134, 24, 152, 82, 176, 238, 180, + 141, 196, 77, 24, 152, 141, 176, 238, 180, 82, 196, 77, 24, 152, 82, 176, + 47, 141, 196, 77, 24, 152, 82, 176, 47, 141, 229, 126, 24, 152, 141, 176, + 251, 116, 211, 17, 82, 196, 77, 24, 152, 141, 176, 251, 116, 223, 165, + 82, 196, 77, 24, 152, 141, 176, 47, 82, 196, 77, 24, 152, 141, 82, 176, + 239, 49, 229, 126, 24, 152, 141, 82, 176, 251, 116, 211, 16, 24, 152, + 141, 82, 176, 251, 115, 24, 152, 82, 176, 251, 116, 211, 17, 141, 196, + 77, 24, 152, 82, 176, 251, 116, 211, 17, 141, 238, 215, 24, 152, 82, 176, + 251, 116, 141, 196, 77, 24, 152, 141, 176, 228, 252, 82, 229, 126, 24, + 230, 43, 232, 130, 232, 249, 24, 230, 43, 232, 130, 232, 250, 248, 225, + 24, 230, 43, 232, 130, 232, 250, 229, 126, 24, 230, 43, 232, 130, 232, + 250, 239, 48, 24, 230, 43, 232, 130, 232, 250, 239, 49, 201, 210, 24, + 230, 50, 232, 130, 232, 250, 239, 48, 24, 152, 232, 130, 232, 250, 239, + 49, 248, 225, 24, 230, 41, 232, 130, 232, 250, 239, 48, 24, 230, 43, 232, + 228, 232, 250, 201, 199, 24, 230, 43, 229, 215, 232, 228, 232, 250, 201, + 199, 24, 230, 43, 232, 228, 232, 250, 201, 200, 232, 130, 248, 225, 24, + 230, 43, 229, 215, 232, 228, 232, 250, 201, 200, 232, 130, 248, 225, 24, + 230, 43, 232, 228, 232, 250, 201, 200, 248, 225, 24, 230, 43, 229, 215, + 232, 228, 232, 250, 201, 200, 248, 225, 24, 230, 43, 232, 228, 232, 250, + 201, 200, 176, 232, 134, 24, 230, 48, 232, 228, 232, 250, 201, 199, 24, + 230, 48, 232, 228, 232, 250, 201, 200, 211, 78, 24, 230, 41, 232, 228, + 232, 250, 201, 200, 211, 78, 24, 230, 37, 232, 228, 232, 250, 201, 199, + 24, 230, 43, 232, 228, 232, 250, 201, 200, 229, 126, 24, 230, 43, 232, + 228, 232, 250, 201, 200, 229, 127, 176, 202, 208, 24, 230, 43, 232, 228, + 232, 250, 201, 200, 229, 127, 213, 46, 198, 212, 24, 230, 42, 24, 230, + 43, 248, 212, 210, 185, 233, 97, 24, 230, 43, 229, 214, 24, 230, 43, 176, + 202, 208, 24, 230, 43, 229, 215, 176, 202, 208, 24, 230, 43, 176, 248, + 225, 24, 230, 43, 176, 232, 134, 24, 230, 43, 201, 211, 141, 176, 202, + 208, 24, 230, 43, 201, 211, 247, 23, 24, 230, 43, 201, 211, 247, 24, 176, + 202, 208, 24, 230, 43, 201, 211, 247, 24, 176, 202, 209, 248, 225, 24, + 230, 43, 201, 211, 219, 84, 24, 230, 49, 24, 230, 50, 176, 202, 208, 24, + 230, 50, 213, 46, 198, 212, 24, 230, 50, 176, 232, 134, 24, 230, 39, 238, + 175, 24, 230, 38, 24, 230, 48, 211, 78, 24, 230, 47, 24, 230, 48, 211, + 79, 176, 202, 208, 24, 230, 48, 176, 202, 208, 24, 230, 48, 211, 79, 213, + 46, 198, 212, 24, 230, 48, 213, 46, 198, 212, 24, 230, 48, 211, 79, 176, + 232, 134, 24, 230, 48, 176, 232, 134, 24, 230, 46, 211, 78, 24, 230, 45, + 24, 230, 51, 24, 230, 36, 24, 230, 37, 176, 202, 208, 24, 230, 37, 213, + 46, 198, 212, 24, 230, 37, 176, 232, 134, 24, 230, 41, 211, 78, 24, 230, + 41, 211, 79, 176, 232, 134, 24, 230, 40, 24, 230, 41, 202, 71, 24, 230, + 41, 211, 79, 176, 202, 208, 24, 230, 41, 176, 202, 208, 24, 230, 41, 211, + 79, 213, 46, 198, 212, 24, 230, 41, 213, 46, 198, 212, 24, 230, 41, 176, + 202, 209, 198, 35, 223, 150, 24, 230, 41, 176, 248, 212, 82, 206, 189, + 24, 230, 53, 24, 152, 141, 82, 206, 189, 24, 230, 52, 141, 82, 206, 189, + 24, 230, 41, 141, 82, 206, 189, 24, 230, 54, 141, 82, 206, 189, 24, 230, + 41, 219, 84, 24, 152, 141, 82, 206, 190, 248, 225, 24, 152, 141, 82, 206, + 190, 239, 48, 24, 230, 41, 141, 82, 206, 190, 239, 48, 24, 152, 219, 85, + 235, 125, 24, 152, 219, 85, 144, 206, 184, 201, 53, 24, 152, 219, 85, + 144, 206, 184, 238, 164, 24, 152, 219, 85, 144, 211, 28, 243, 11, 24, + 152, 219, 85, 196, 77, 24, 152, 176, 196, 105, 219, 85, 196, 77, 24, 230, + 52, 219, 85, 196, 77, 24, 230, 37, 219, 85, 196, 77, 24, 230, 54, 219, + 85, 196, 77, 24, 152, 219, 85, 207, 149, 221, 72, 24, 152, 219, 85, 248, + 225, 24, 152, 219, 85, 198, 36, 198, 212, 24, 152, 219, 85, 198, 212, 24, + 230, 41, 219, 85, 198, 212, 24, 152, 219, 85, 141, 198, 212, 24, 230, 41, + 219, 85, 141, 198, 212, 24, 230, 54, 219, 85, 141, 176, 141, 176, 211, + 16, 24, 230, 54, 219, 85, 141, 176, 141, 198, 212, 24, 152, 219, 85, 223, + 150, 24, 230, 52, 219, 85, 223, 150, 24, 230, 41, 219, 85, 223, 150, 24, + 230, 54, 219, 85, 223, 150, 24, 152, 141, 82, 219, 84, 24, 230, 52, 141, + 82, 219, 84, 24, 230, 41, 141, 82, 219, 84, 24, 230, 41, 206, 189, 24, + 230, 54, 141, 82, 219, 84, 24, 152, 141, 82, 238, 220, 219, 84, 24, 230, + 52, 141, 82, 238, 220, 219, 84, 24, 152, 206, 190, 235, 125, 24, 230, 41, + 206, 190, 144, 141, 176, 228, 253, 216, 86, 24, 230, 54, 206, 190, 144, + 82, 176, 141, 238, 219, 24, 152, 206, 190, 196, 77, 24, 152, 206, 190, + 207, 149, 221, 72, 24, 152, 206, 190, 219, 84, 24, 230, 52, 206, 190, + 219, 84, 24, 230, 37, 206, 190, 219, 84, 24, 230, 54, 206, 190, 219, 84, + 24, 152, 206, 190, 216, 86, 24, 152, 206, 190, 82, 239, 48, 24, 152, 206, + 190, 82, 207, 149, 221, 71, 24, 152, 206, 190, 223, 150, 24, 152, 206, + 190, 198, 212, 24, 230, 39, 206, 190, 198, 212, 24, 152, 141, 206, 190, + 219, 84, 24, 230, 52, 141, 206, 190, 219, 84, 24, 230, 46, 141, 206, 190, + 219, 85, 211, 106, 24, 230, 39, 141, 206, 190, 219, 85, 211, 16, 24, 230, + 39, 141, 206, 190, 219, 85, 223, 164, 24, 230, 39, 141, 206, 190, 219, + 85, 196, 104, 24, 230, 48, 141, 206, 190, 219, 84, 24, 230, 41, 141, 206, + 190, 219, 84, 24, 230, 54, 141, 206, 190, 219, 85, 211, 16, 24, 230, 54, + 141, 206, 190, 219, 84, 24, 152, 82, 235, 125, 24, 230, 41, 216, 86, 24, + 152, 82, 196, 77, 24, 230, 52, 82, 196, 77, 24, 152, 82, 207, 149, 221, + 72, 24, 152, 82, 133, 176, 202, 208, 24, 230, 39, 82, 198, 212, 24, 152, + 82, 176, 219, 84, 24, 152, 82, 219, 84, 24, 152, 82, 206, 190, 219, 84, + 24, 230, 52, 82, 206, 190, 219, 84, 24, 230, 46, 82, 206, 190, 219, 85, + 211, 106, 24, 230, 48, 82, 206, 190, 219, 84, 24, 230, 41, 82, 206, 190, + 219, 84, 24, 230, 54, 82, 206, 190, 219, 85, 211, 16, 24, 230, 54, 82, + 206, 190, 219, 85, 223, 164, 24, 230, 54, 82, 206, 190, 219, 84, 24, 230, + 52, 82, 206, 190, 219, 85, 248, 225, 24, 230, 50, 82, 206, 190, 219, 85, + 239, 48, 24, 230, 50, 82, 206, 190, 219, 85, 239, 49, 202, 208, 24, 230, + 39, 82, 206, 190, 219, 85, 239, 49, 211, 16, 24, 230, 39, 82, 206, 190, + 219, 85, 239, 49, 223, 164, 24, 230, 39, 82, 206, 190, 219, 85, 239, 48, + 24, 230, 41, 141, 229, 126, 24, 152, 141, 176, 202, 208, 24, 230, 41, + 141, 176, 202, 208, 24, 152, 141, 176, 202, 209, 176, 237, 40, 24, 152, + 141, 176, 202, 209, 176, 239, 48, 24, 152, 141, 176, 202, 209, 176, 248, + 225, 24, 152, 141, 176, 202, 209, 141, 248, 225, 24, 152, 141, 176, 202, + 209, 248, 82, 248, 225, 24, 152, 141, 176, 202, 209, 141, 229, 128, 24, + 152, 141, 176, 232, 135, 141, 201, 53, 24, 152, 141, 176, 232, 135, 141, + 248, 225, 24, 152, 141, 176, 102, 24, 152, 141, 176, 238, 175, 24, 152, + 141, 176, 238, 167, 176, 223, 119, 24, 230, 50, 141, 176, 238, 167, 176, + 223, 119, 24, 152, 141, 176, 238, 167, 176, 196, 104, 24, 152, 141, 176, + 243, 12, 24, 230, 48, 141, 198, 212, 24, 230, 48, 141, 176, 211, 78, 24, + 230, 41, 141, 176, 211, 78, 24, 230, 41, 141, 176, 220, 14, 24, 230, 41, + 141, 198, 212, 24, 230, 41, 141, 176, 202, 71, 24, 230, 54, 141, 176, + 211, 16, 24, 230, 54, 141, 176, 223, 164, 24, 230, 54, 141, 198, 212, 24, + 152, 198, 212, 24, 152, 176, 229, 214, 24, 152, 176, 202, 209, 237, 40, + 24, 152, 176, 202, 209, 239, 48, 24, 152, 176, 202, 209, 248, 225, 24, + 152, 176, 232, 134, 24, 152, 176, 248, 212, 141, 216, 86, 24, 152, 176, + 248, 212, 82, 206, 189, 24, 152, 176, 248, 212, 206, 190, 219, 84, 24, + 152, 176, 196, 105, 105, 232, 249, 24, 152, 176, 139, 105, 232, 249, 24, + 152, 176, 196, 105, 115, 232, 249, 24, 152, 176, 196, 105, 232, 130, 232, + 249, 24, 152, 176, 139, 232, 130, 207, 149, 221, 71, 24, 230, 44, 24, + 152, 229, 214, 24, 198, 37, 202, 170, 24, 198, 37, 215, 130, 24, 198, 37, + 248, 211, 24, 230, 217, 202, 170, 24, 230, 217, 215, 130, 24, 230, 217, + 248, 211, 24, 201, 34, 202, 170, 24, 201, 34, 215, 130, 24, 201, 34, 248, + 211, 24, 248, 20, 202, 170, 24, 248, 20, 215, 130, 24, 248, 20, 248, 211, + 24, 206, 61, 202, 170, 24, 206, 61, 215, 130, 24, 206, 61, 248, 211, 24, + 200, 171, 200, 76, 24, 200, 171, 248, 211, 24, 201, 187, 220, 15, 202, + 170, 24, 201, 187, 2, 202, 170, 24, 201, 187, 220, 15, 215, 130, 24, 201, + 187, 2, 215, 130, 24, 201, 187, 204, 7, 24, 232, 199, 220, 15, 202, 170, + 24, 232, 199, 2, 202, 170, 24, 232, 199, 220, 15, 215, 130, 24, 232, 199, + 2, 215, 130, 24, 232, 199, 204, 7, 24, 201, 187, 232, 199, 251, 156, 24, + 215, 174, 133, 144, 220, 14, 24, 215, 174, 133, 144, 202, 71, 24, 215, + 174, 133, 204, 7, 24, 215, 174, 144, 204, 7, 24, 215, 174, 133, 144, 251, + 157, 220, 14, 24, 215, 174, 133, 144, 251, 157, 202, 71, 24, 215, 174, + 202, 209, 119, 202, 209, 205, 85, 24, 215, 173, 232, 255, 239, 37, 24, + 215, 175, 232, 255, 239, 37, 24, 215, 173, 202, 171, 201, 54, 202, 71, + 24, 215, 173, 202, 171, 201, 54, 216, 214, 24, 215, 173, 202, 171, 201, + 54, 220, 14, 24, 215, 173, 202, 171, 201, 54, 220, 12, 24, 215, 173, 202, + 171, 193, 4, 232, 202, 24, 215, 173, 55, 201, 53, 24, 215, 173, 55, 193, + 4, 232, 202, 24, 215, 173, 55, 251, 156, 24, 215, 173, 55, 251, 157, 193, + 4, 232, 202, 24, 215, 173, 238, 219, 24, 215, 173, 197, 225, 201, 54, + 215, 177, 24, 215, 173, 197, 225, 193, 4, 232, 202, 24, 215, 173, 197, + 225, 251, 156, 24, 215, 173, 197, 225, 251, 157, 193, 4, 232, 202, 24, + 215, 173, 248, 230, 202, 71, 24, 215, 173, 248, 230, 216, 214, 24, 215, + 173, 248, 230, 220, 14, 24, 215, 173, 239, 4, 202, 71, 24, 215, 173, 239, + 4, 216, 214, 24, 215, 173, 239, 4, 220, 14, 24, 215, 173, 239, 4, 206, + 121, 24, 215, 173, 243, 128, 202, 71, 24, 215, 173, 243, 128, 216, 214, + 24, 215, 173, 243, 128, 220, 14, 24, 215, 173, 111, 202, 71, 24, 215, + 173, 111, 216, 214, 24, 215, 173, 111, 220, 14, 24, 215, 173, 191, 21, + 202, 71, 24, 215, 173, 191, 21, 216, 214, 24, 215, 173, 191, 21, 220, 14, + 24, 215, 173, 210, 59, 202, 71, 24, 215, 173, 210, 59, 216, 214, 24, 215, + 173, 210, 59, 220, 14, 24, 198, 3, 206, 119, 202, 170, 24, 198, 3, 206, + 119, 235, 135, 24, 198, 3, 206, 119, 251, 156, 24, 198, 3, 206, 120, 202, + 170, 24, 198, 3, 206, 120, 235, 135, 24, 198, 3, 206, 120, 251, 156, 24, + 198, 3, 203, 145, 24, 198, 3, 250, 253, 201, 219, 202, 170, 24, 198, 3, + 250, 253, 201, 219, 235, 135, 24, 198, 3, 250, 253, 201, 219, 197, 224, + 24, 215, 176, 250, 141, 202, 71, 24, 215, 176, 250, 141, 216, 214, 24, + 215, 176, 250, 141, 220, 14, 24, 215, 176, 250, 141, 220, 12, 24, 215, + 176, 198, 31, 202, 71, 24, 215, 176, 198, 31, 216, 214, 24, 215, 176, + 198, 31, 220, 14, 24, 215, 176, 198, 31, 220, 12, 24, 215, 176, 248, 212, + 250, 141, 202, 71, 24, 215, 176, 248, 212, 250, 141, 216, 214, 24, 215, + 176, 248, 212, 250, 141, 220, 14, 24, 215, 176, 248, 212, 250, 141, 220, + 12, 24, 215, 176, 248, 212, 198, 31, 202, 71, 24, 215, 176, 248, 212, + 198, 31, 216, 214, 24, 215, 176, 248, 212, 198, 31, 220, 14, 24, 215, + 176, 248, 212, 198, 31, 220, 12, 24, 215, 175, 202, 171, 201, 54, 202, + 71, 24, 215, 175, 202, 171, 201, 54, 216, 214, 24, 215, 175, 202, 171, + 201, 54, 220, 14, 24, 215, 175, 202, 171, 201, 54, 220, 12, 24, 215, 175, + 202, 171, 193, 4, 232, 202, 24, 215, 175, 55, 201, 53, 24, 215, 175, 55, + 193, 4, 232, 202, 24, 215, 175, 55, 251, 156, 24, 215, 175, 55, 251, 157, + 193, 4, 232, 202, 24, 215, 175, 238, 219, 24, 215, 175, 197, 225, 201, + 54, 215, 177, 24, 215, 175, 197, 225, 193, 4, 232, 202, 24, 215, 175, + 197, 225, 251, 157, 215, 177, 24, 215, 175, 197, 225, 251, 157, 193, 4, + 232, 202, 24, 215, 175, 248, 229, 24, 215, 175, 239, 4, 202, 71, 24, 215, + 175, 239, 4, 216, 214, 24, 215, 175, 239, 4, 220, 14, 24, 215, 175, 243, + 127, 24, 215, 175, 111, 202, 71, 24, 215, 175, 111, 216, 214, 24, 215, + 175, 111, 220, 14, 24, 215, 175, 191, 21, 202, 71, 24, 215, 175, 191, 21, + 216, 214, 24, 215, 175, 191, 21, 220, 14, 24, 215, 175, 210, 59, 202, 71, + 24, 215, 175, 210, 59, 216, 214, 24, 215, 175, 210, 59, 220, 14, 24, 198, + 4, 206, 120, 202, 170, 24, 198, 4, 206, 120, 235, 135, 24, 198, 4, 206, + 120, 251, 156, 24, 198, 4, 206, 119, 202, 170, 24, 198, 4, 206, 119, 235, + 135, 24, 198, 4, 206, 119, 251, 156, 24, 198, 4, 203, 145, 24, 215, 173, + 238, 167, 208, 25, 202, 71, 24, 215, 173, 238, 167, 208, 25, 216, 214, + 24, 215, 173, 238, 167, 208, 25, 220, 14, 24, 215, 173, 238, 167, 208, + 25, 220, 12, 24, 215, 173, 238, 167, 230, 69, 202, 71, 24, 215, 173, 238, + 167, 230, 69, 216, 214, 24, 215, 173, 238, 167, 230, 69, 220, 14, 24, + 215, 173, 238, 167, 230, 69, 220, 12, 24, 215, 173, 238, 167, 198, 218, + 243, 13, 202, 71, 24, 215, 173, 238, 167, 198, 218, 243, 13, 216, 214, + 24, 215, 173, 228, 145, 202, 71, 24, 215, 173, 228, 145, 216, 214, 24, + 215, 173, 228, 145, 220, 14, 24, 215, 173, 219, 7, 202, 71, 24, 215, 173, + 219, 7, 216, 214, 24, 215, 173, 219, 7, 220, 14, 24, 215, 173, 219, 7, 2, + 235, 135, 24, 215, 173, 193, 139, 238, 167, 55, 202, 71, 24, 215, 173, + 193, 139, 238, 167, 55, 216, 214, 24, 215, 173, 193, 139, 238, 167, 55, + 220, 14, 24, 215, 173, 193, 139, 238, 167, 197, 225, 202, 71, 24, 215, + 173, 193, 139, 238, 167, 197, 225, 216, 214, 24, 215, 173, 193, 139, 238, + 167, 197, 225, 220, 14, 24, 215, 173, 238, 167, 199, 25, 201, 53, 24, + 215, 173, 238, 165, 238, 220, 202, 71, 24, 215, 173, 238, 165, 238, 220, + 216, 214, 24, 206, 119, 202, 170, 24, 206, 119, 235, 135, 24, 206, 119, + 251, 158, 24, 215, 173, 203, 145, 24, 215, 173, 238, 167, 229, 118, 232, + 99, 193, 167, 24, 215, 173, 228, 145, 229, 118, 232, 99, 193, 167, 24, + 215, 173, 219, 7, 229, 118, 232, 99, 193, 167, 24, 215, 173, 193, 139, + 229, 118, 232, 99, 193, 167, 24, 206, 119, 202, 171, 229, 118, 232, 99, + 193, 167, 24, 206, 119, 55, 229, 118, 232, 99, 193, 167, 24, 206, 119, + 251, 157, 229, 118, 232, 99, 193, 167, 24, 215, 173, 238, 167, 229, 118, + 243, 106, 24, 215, 173, 228, 145, 229, 118, 243, 106, 24, 215, 173, 219, + 7, 229, 118, 243, 106, 24, 215, 173, 193, 139, 229, 118, 243, 106, 24, + 206, 119, 202, 171, 229, 118, 243, 106, 24, 206, 119, 55, 229, 118, 243, + 106, 24, 206, 119, 251, 157, 229, 118, 243, 106, 24, 215, 173, 193, 139, + 237, 41, 210, 88, 202, 71, 24, 215, 173, 193, 139, 237, 41, 210, 88, 216, + 214, 24, 215, 173, 193, 139, 237, 41, 210, 88, 220, 14, 24, 215, 175, + 238, 167, 229, 118, 247, 33, 202, 71, 24, 215, 175, 238, 167, 229, 118, + 247, 33, 220, 14, 24, 215, 175, 228, 145, 229, 118, 247, 33, 2, 235, 135, + 24, 215, 175, 228, 145, 229, 118, 247, 33, 220, 15, 235, 135, 24, 215, + 175, 228, 145, 229, 118, 247, 33, 2, 197, 224, 24, 215, 175, 228, 145, + 229, 118, 247, 33, 220, 15, 197, 224, 24, 215, 175, 219, 7, 229, 118, + 247, 33, 2, 202, 170, 24, 215, 175, 219, 7, 229, 118, 247, 33, 220, 15, + 202, 170, 24, 215, 175, 219, 7, 229, 118, 247, 33, 2, 235, 135, 24, 215, + 175, 219, 7, 229, 118, 247, 33, 220, 15, 235, 135, 24, 215, 175, 193, + 139, 229, 118, 247, 33, 202, 71, 24, 215, 175, 193, 139, 229, 118, 247, + 33, 220, 14, 24, 206, 120, 202, 171, 229, 118, 247, 32, 24, 206, 120, 55, + 229, 118, 247, 32, 24, 206, 120, 251, 157, 229, 118, 247, 32, 24, 215, + 175, 238, 167, 229, 118, 232, 196, 202, 71, 24, 215, 175, 238, 167, 229, + 118, 232, 196, 220, 14, 24, 215, 175, 228, 145, 229, 118, 232, 196, 2, + 235, 135, 24, 215, 175, 228, 145, 229, 118, 232, 196, 220, 15, 235, 135, + 24, 215, 175, 228, 145, 229, 118, 232, 196, 197, 225, 2, 197, 224, 24, + 215, 175, 228, 145, 229, 118, 232, 196, 197, 225, 220, 15, 197, 224, 24, + 215, 175, 219, 7, 229, 118, 232, 196, 2, 202, 170, 24, 215, 175, 219, 7, + 229, 118, 232, 196, 220, 15, 202, 170, 24, 215, 175, 219, 7, 229, 118, + 232, 196, 2, 235, 135, 24, 215, 175, 219, 7, 229, 118, 232, 196, 220, 15, + 235, 135, 24, 215, 175, 193, 139, 229, 118, 232, 196, 202, 71, 24, 215, + 175, 193, 139, 229, 118, 232, 196, 220, 14, 24, 206, 120, 202, 171, 229, + 118, 232, 195, 24, 206, 120, 55, 229, 118, 232, 195, 24, 206, 120, 251, + 157, 229, 118, 232, 195, 24, 215, 175, 238, 167, 202, 71, 24, 215, 175, + 238, 167, 216, 214, 24, 215, 175, 238, 167, 220, 14, 24, 215, 175, 238, + 167, 220, 12, 24, 215, 175, 238, 167, 242, 80, 24, 215, 175, 228, 145, + 202, 71, 24, 215, 175, 219, 7, 202, 71, 24, 215, 175, 193, 139, 202, 59, + 24, 215, 175, 193, 139, 202, 71, 24, 215, 175, 193, 139, 220, 14, 24, + 206, 120, 202, 170, 24, 206, 120, 235, 135, 24, 206, 120, 251, 156, 24, + 215, 175, 203, 146, 210, 120, 24, 215, 173, 250, 253, 243, 13, 2, 202, + 170, 24, 215, 173, 250, 253, 243, 13, 216, 215, 202, 170, 24, 215, 173, + 250, 253, 243, 13, 2, 235, 135, 24, 215, 173, 250, 253, 243, 13, 216, + 215, 235, 135, 24, 215, 175, 250, 253, 243, 13, 229, 118, 193, 168, 2, + 202, 170, 24, 215, 175, 250, 253, 243, 13, 229, 118, 193, 168, 216, 215, + 202, 170, 24, 215, 175, 250, 253, 243, 13, 229, 118, 193, 168, 220, 15, + 202, 170, 24, 215, 175, 250, 253, 243, 13, 229, 118, 193, 168, 2, 235, + 135, 24, 215, 175, 250, 253, 243, 13, 229, 118, 193, 168, 216, 215, 235, + 135, 24, 215, 175, 250, 253, 243, 13, 229, 118, 193, 168, 220, 15, 235, + 135, 24, 215, 173, 193, 4, 243, 13, 232, 99, 202, 170, 24, 215, 173, 193, + 4, 243, 13, 232, 99, 235, 135, 24, 215, 175, 193, 4, 243, 13, 229, 118, + 193, 168, 202, 170, 24, 215, 175, 193, 4, 243, 13, 229, 118, 193, 168, + 235, 135, 24, 215, 173, 232, 255, 243, 10, 202, 170, 24, 215, 173, 232, + 255, 243, 10, 235, 135, 24, 215, 175, 232, 255, 243, 10, 229, 118, 193, + 168, 202, 170, 24, 215, 175, 232, 255, 243, 10, 229, 118, 193, 168, 235, + 135, 24, 235, 42, 250, 238, 202, 71, 24, 235, 42, 250, 238, 220, 14, 24, + 235, 42, 233, 75, 24, 235, 42, 202, 76, 24, 235, 42, 199, 88, 24, 235, + 42, 207, 64, 24, 235, 42, 202, 177, 24, 235, 42, 202, 178, 251, 156, 24, + 235, 42, 233, 227, 211, 29, 198, 146, 24, 235, 42, 230, 228, 24, 229, + 237, 24, 229, 238, 206, 194, 24, 229, 238, 215, 173, 201, 53, 24, 229, + 238, 215, 173, 198, 149, 24, 229, 238, 215, 175, 201, 53, 24, 229, 238, + 215, 173, 238, 166, 24, 229, 238, 215, 175, 238, 166, 24, 229, 238, 215, + 178, 243, 12, 24, 233, 106, 236, 235, 209, 27, 213, 16, 232, 135, 198, + 147, 24, 233, 106, 236, 235, 209, 27, 213, 16, 133, 211, 59, 235, 125, + 24, 233, 106, 236, 235, 209, 27, 213, 16, 133, 211, 59, 144, 198, 147, + 24, 233, 193, 201, 54, 196, 77, 24, 233, 193, 201, 54, 214, 83, 24, 233, + 193, 201, 54, 235, 125, 24, 235, 109, 233, 193, 214, 84, 235, 125, 24, + 235, 109, 233, 193, 144, 214, 83, 24, 235, 109, 233, 193, 133, 214, 83, + 24, 235, 109, 233, 193, 214, 84, 196, 77, 24, 232, 153, 214, 83, 24, 232, + 153, 239, 37, 24, 232, 153, 193, 7, 24, 233, 188, 211, 78, 24, 233, 188, + 201, 186, 24, 233, 188, 242, 220, 24, 233, 196, 248, 132, 202, 170, 24, + 233, 196, 248, 132, 215, 130, 24, 233, 188, 132, 211, 78, 24, 233, 188, + 193, 78, 211, 78, 24, 233, 188, 132, 242, 220, 24, 233, 188, 193, 76, + 215, 177, 24, 233, 196, 193, 58, 24, 233, 189, 196, 77, 24, 233, 189, + 235, 125, 24, 233, 189, 232, 182, 24, 233, 191, 201, 53, 24, 233, 191, + 201, 54, 235, 135, 24, 233, 191, 201, 54, 251, 156, 24, 233, 192, 201, + 53, 24, 233, 192, 201, 54, 235, 135, 24, 233, 192, 201, 54, 251, 156, 24, + 233, 191, 238, 164, 24, 233, 192, 238, 164, 24, 233, 191, 243, 7, 24, + 243, 123, 208, 157, 24, 243, 123, 214, 83, 24, 243, 123, 200, 218, 24, + 199, 89, 243, 123, 229, 137, 24, 199, 89, 243, 123, 216, 86, 24, 199, 89, + 243, 123, 218, 243, 24, 234, 211, 24, 213, 16, 214, 83, 24, 213, 16, 239, + 37, 24, 213, 16, 193, 5, 24, 213, 16, 193, 73, 24, 251, 228, 248, 118, + 211, 16, 24, 251, 228, 200, 217, 223, 164, 24, 251, 228, 248, 120, 2, + 206, 118, 24, 251, 228, 200, 219, 2, 206, 118, 24, 248, 41, 223, 136, 24, + 248, 41, 233, 216, 24, 215, 182, 242, 221, 214, 83, 24, 215, 182, 242, + 221, 232, 134, 24, 215, 182, 242, 221, 239, 37, 24, 215, 182, 202, 66, + 24, 215, 182, 202, 67, 193, 7, 24, 215, 182, 202, 67, 211, 78, 24, 215, + 182, 232, 95, 24, 215, 182, 232, 96, 193, 7, 24, 215, 182, 232, 96, 211, + 78, 24, 215, 182, 211, 79, 243, 12, 24, 215, 182, 211, 79, 232, 134, 24, + 215, 182, 211, 79, 193, 7, 24, 215, 182, 211, 79, 211, 9, 24, 215, 182, + 211, 79, 211, 10, 193, 7, 24, 215, 182, 211, 79, 211, 10, 192, 88, 24, + 215, 182, 211, 79, 207, 94, 24, 215, 182, 211, 79, 207, 95, 193, 7, 24, + 215, 182, 211, 79, 207, 95, 192, 88, 24, 215, 182, 221, 124, 24, 215, + 182, 221, 125, 232, 134, 24, 215, 182, 221, 125, 193, 7, 24, 215, 182, + 199, 88, 24, 215, 182, 199, 89, 232, 134, 24, 215, 182, 199, 89, 200, + 218, 24, 219, 99, 208, 221, 198, 87, 24, 219, 101, 110, 139, 196, 74, 24, + 219, 101, 116, 139, 218, 238, 24, 215, 182, 239, 2, 24, 215, 182, 193, 6, + 202, 170, 24, 215, 182, 193, 6, 235, 135, 24, 198, 62, 201, 75, 211, 17, + 233, 77, 24, 198, 62, 219, 144, 219, 98, 24, 198, 62, 198, 136, 248, 212, + 219, 98, 24, 198, 62, 198, 136, 198, 35, 223, 120, 215, 181, 24, 198, 62, + 223, 120, 215, 182, 207, 64, 24, 198, 62, 215, 172, 251, 253, 243, 124, + 24, 198, 62, 247, 24, 201, 75, 211, 16, 24, 198, 62, 247, 24, 223, 120, + 215, 181, 24, 199, 117, 24, 199, 118, 215, 177, 24, 199, 118, 211, 107, + 198, 61, 24, 199, 118, 211, 107, 198, 62, 215, 177, 24, 199, 118, 211, + 107, 219, 98, 24, 199, 118, 211, 107, 219, 99, 215, 177, 24, 199, 118, + 248, 148, 219, 98, 24, 215, 173, 223, 16, 24, 215, 175, 223, 16, 24, 214, + 114, 24, 230, 80, 24, 233, 219, 24, 203, 23, 229, 125, 201, 220, 24, 203, + 23, 229, 125, 209, 25, 24, 193, 165, 203, 23, 229, 125, 215, 180, 24, + 232, 194, 203, 23, 229, 125, 215, 180, 24, 203, 23, 198, 148, 232, 100, + 193, 172, 24, 198, 43, 201, 54, 201, 38, 24, 198, 43, 238, 165, 248, 229, + 24, 198, 44, 197, 16, 24, 116, 248, 107, 198, 148, 232, 100, 229, 125, + 222, 197, 24, 219, 126, 242, 81, 24, 219, 126, 219, 199, 24, 219, 126, + 219, 198, 24, 219, 126, 219, 197, 24, 219, 126, 219, 196, 24, 219, 126, + 219, 195, 24, 219, 126, 219, 194, 24, 219, 126, 219, 193, 24, 232, 254, + 24, 219, 39, 201, 248, 24, 219, 40, 201, 248, 24, 219, 42, 229, 210, 24, + 219, 42, 193, 74, 24, 219, 42, 237, 94, 24, 219, 42, 229, 238, 214, 114, + 24, 219, 42, 198, 45, 24, 219, 42, 219, 125, 237, 11, 24, 242, 76, 24, + 232, 82, 201, 64, 24, 204, 26, 24, 242, 85, 24, 210, 115, 24, 233, 8, + 215, 246, 24, 233, 8, 215, 245, 24, 233, 8, 215, 244, 24, 233, 8, 215, + 243, 24, 233, 8, 215, 242, 24, 206, 122, 215, 246, 24, 206, 122, 215, + 245, 24, 206, 122, 215, 244, 24, 206, 122, 215, 243, 24, 206, 122, 215, + 242, 24, 206, 122, 215, 241, 24, 206, 122, 215, 240, 24, 206, 122, 215, + 239, 24, 206, 122, 215, 253, 24, 206, 122, 215, 252, 24, 206, 122, 215, + 251, 24, 206, 122, 215, 250, 24, 206, 122, 215, 249, 24, 206, 122, 215, + 248, 24, 206, 122, 215, 247, 8, 2, 1, 233, 39, 237, 5, 4, 197, 228, 8, 2, + 1, 207, 19, 27, 232, 53, 8, 1, 2, 6, 154, 232, 53, 8, 2, 1, 207, 19, 222, + 154, 8, 1, 2, 6, 220, 145, 4, 248, 233, 8, 2, 1, 219, 165, 4, 207, 25, + 102, 8, 2, 1, 154, 192, 160, 4, 248, 233, 8, 2, 1, 207, 19, 234, 90, 8, + 2, 1, 154, 207, 224, 4, 180, 219, 215, 23, 207, 25, 102, 8, 2, 1, 200, + 44, 4, 228, 253, 23, 207, 25, 102, 8, 1, 207, 25, 242, 234, 4, 207, 25, + 102, 8, 2, 1, 234, 15, 4, 55, 164, 8, 2, 1, 234, 15, 4, 55, 249, 90, 23, + 238, 177, 8, 2, 1, 154, 200, 44, 4, 238, 177, 8, 1, 223, 95, 231, 13, + 201, 65, 4, 238, 177, 8, 1, 201, 37, 247, 196, 4, 238, 177, 8, 1, 2, 6, + 154, 222, 154, 8, 2, 1, 220, 145, 4, 232, 235, 8, 2, 1, 237, 72, 237, 5, + 4, 210, 194, 102, 8, 2, 1, 220, 145, 4, 248, 234, 23, 210, 194, 102, 8, + 2, 1, 234, 91, 4, 210, 194, 102, 8, 2, 1, 154, 207, 224, 4, 210, 194, + 102, 8, 2, 1, 207, 224, 4, 232, 236, 23, 210, 194, 102, 8, 2, 1, 199, 79, + 237, 5, 4, 210, 194, 102, 8, 2, 1, 233, 181, 4, 210, 194, 102, 8, 2, 1, + 237, 72, 237, 5, 4, 207, 25, 102, 8, 2, 1, 228, 76, 4, 201, 29, 23, 207, + 25, 102, 8, 2, 1, 187, 4, 207, 25, 102, 8, 2, 1, 199, 79, 237, 5, 4, 207, + 25, 102, 8, 2, 1, 247, 196, 4, 207, 25, 102, 8, 2, 1, 206, 10, 4, 238, + 177, 8, 2, 1, 238, 130, 4, 216, 88, 45, 102, 8, 2, 1, 220, 145, 4, 216, + 88, 45, 102, 8, 2, 1, 215, 64, 4, 216, 88, 45, 102, 8, 2, 1, 207, 224, 4, + 216, 88, 45, 102, 8, 2, 1, 206, 10, 4, 216, 88, 45, 102, 8, 2, 1, 200, + 44, 4, 216, 88, 45, 102, 33, 135, 1, 250, 124, 33, 135, 1, 247, 254, 33, + 135, 1, 195, 151, 33, 135, 1, 231, 20, 33, 135, 1, 236, 171, 33, 135, 1, + 192, 49, 33, 135, 1, 191, 55, 33, 135, 1, 191, 82, 33, 135, 1, 223, 41, + 33, 135, 1, 89, 223, 41, 33, 135, 1, 68, 33, 135, 1, 236, 192, 33, 135, + 1, 222, 96, 33, 135, 1, 219, 77, 33, 135, 1, 215, 68, 33, 135, 1, 214, + 212, 33, 135, 1, 211, 91, 33, 135, 1, 209, 57, 33, 135, 1, 206, 180, 33, + 135, 1, 202, 78, 33, 135, 1, 197, 44, 33, 135, 1, 196, 124, 33, 135, 1, + 232, 103, 33, 135, 1, 229, 190, 33, 135, 1, 203, 9, 33, 135, 1, 197, 146, + 33, 135, 1, 243, 56, 33, 135, 1, 203, 166, 33, 135, 1, 192, 58, 33, 135, + 1, 192, 60, 33, 135, 1, 192, 93, 33, 135, 1, 191, 225, 33, 135, 1, 2, + 191, 190, 33, 135, 1, 192, 12, 33, 135, 1, 223, 84, 2, 191, 190, 33, 135, + 1, 248, 177, 191, 190, 33, 135, 1, 223, 84, 248, 177, 191, 190, 33, 135, + 1, 232, 230, 52, 1, 38, 2, 65, 52, 1, 38, 2, 249, 19, 52, 1, 38, 2, 195, + 153, 52, 1, 38, 2, 231, 79, 52, 1, 38, 2, 237, 148, 52, 1, 38, 2, 223, + 228, 52, 1, 38, 2, 191, 62, 52, 1, 38, 2, 191, 87, 52, 1, 38, 2, 68, 52, + 1, 38, 2, 155, 52, 1, 38, 2, 234, 142, 52, 1, 38, 2, 234, 116, 52, 1, 38, + 2, 74, 52, 1, 38, 2, 210, 65, 52, 1, 38, 2, 234, 36, 52, 1, 38, 2, 234, + 24, 52, 1, 38, 2, 199, 145, 52, 1, 38, 2, 66, 52, 1, 38, 2, 234, 183, 52, + 1, 38, 2, 140, 52, 1, 38, 2, 197, 161, 52, 1, 38, 2, 243, 129, 52, 1, 38, + 2, 203, 166, 52, 1, 38, 2, 192, 58, 52, 1, 38, 2, 71, 52, 1, 38, 2, 191, + 225, 52, 1, 38, 2, 235, 19, 52, 1, 38, 2, 205, 87, 52, 1, 38, 2, 247, + 205, 68, 52, 1, 38, 2, 223, 12, 52, 1, 38, 2, 249, 84, 74, 52, 1, 38, 2, + 201, 54, 66, 52, 1, 38, 2, 210, 181, 38, 200, 231, 2, 1, 65, 38, 200, + 231, 2, 1, 249, 19, 38, 200, 231, 2, 1, 195, 153, 38, 200, 231, 2, 1, + 231, 79, 38, 200, 231, 2, 1, 237, 148, 38, 200, 231, 2, 1, 223, 228, 38, + 200, 231, 2, 1, 191, 62, 38, 200, 231, 2, 1, 191, 87, 38, 200, 231, 2, 1, + 68, 38, 200, 231, 2, 1, 155, 38, 200, 231, 2, 1, 234, 142, 38, 200, 231, + 2, 1, 74, 38, 200, 231, 2, 1, 210, 65, 38, 200, 231, 2, 1, 234, 24, 38, + 200, 231, 2, 1, 66, 38, 200, 231, 2, 1, 234, 183, 38, 200, 231, 2, 1, + 140, 38, 200, 231, 2, 1, 197, 161, 38, 200, 231, 2, 1, 243, 129, 38, 200, + 231, 2, 1, 203, 166, 38, 200, 231, 2, 1, 230, 19, 56, 38, 200, 231, 2, 1, + 192, 58, 38, 200, 231, 2, 1, 231, 80, 4, 196, 69, 38, 200, 231, 2, 1, + 247, 205, 68, 38, 200, 231, 2, 1, 235, 34, 38, 200, 231, 2, 1, 235, 30, + 52, 1, 38, 2, 234, 25, 4, 237, 89, 52, 1, 38, 2, 192, 59, 4, 249, 149, + 192, 62, 52, 1, 38, 2, 201, 54, 126, 4, 106, 33, 38, 2, 1, 247, 205, 68, + 212, 82, 208, 164, 90, 1, 174, 212, 82, 208, 164, 90, 1, 197, 168, 212, + 82, 208, 164, 90, 1, 212, 201, 212, 82, 208, 164, 90, 1, 190, 190, 212, + 82, 208, 164, 90, 1, 140, 212, 82, 208, 164, 90, 1, 181, 212, 82, 208, + 164, 90, 1, 192, 220, 212, 82, 208, 164, 90, 1, 213, 113, 212, 82, 208, + 164, 90, 1, 247, 162, 212, 82, 208, 164, 90, 1, 173, 212, 82, 208, 164, + 90, 1, 188, 212, 82, 208, 164, 90, 1, 191, 123, 212, 82, 208, 164, 90, 1, + 214, 168, 212, 82, 208, 164, 90, 1, 212, 188, 212, 82, 208, 164, 90, 1, + 155, 212, 82, 208, 164, 90, 1, 238, 34, 212, 82, 208, 164, 90, 1, 212, + 103, 212, 82, 208, 164, 90, 1, 212, 246, 212, 82, 208, 164, 90, 1, 195, + 188, 212, 82, 208, 164, 90, 1, 212, 182, 212, 82, 208, 164, 90, 1, 197, + 8, 212, 82, 208, 164, 90, 1, 233, 111, 212, 82, 208, 164, 90, 1, 165, + 212, 82, 208, 164, 90, 1, 208, 98, 212, 82, 208, 164, 90, 1, 170, 212, + 82, 208, 164, 90, 1, 212, 248, 212, 82, 208, 164, 90, 1, 168, 212, 82, + 208, 164, 90, 1, 192, 175, 212, 82, 208, 164, 90, 1, 212, 250, 212, 82, + 208, 164, 90, 1, 236, 188, 212, 82, 208, 164, 90, 1, 212, 249, 212, 82, + 208, 164, 90, 1, 230, 83, 212, 82, 208, 164, 90, 1, 216, 21, 212, 82, + 208, 164, 90, 1, 209, 112, 212, 82, 208, 164, 90, 1, 231, 242, 212, 82, + 208, 164, 90, 1, 206, 110, 212, 82, 208, 164, 90, 1, 65, 212, 82, 208, + 164, 90, 1, 252, 208, 212, 82, 208, 164, 90, 1, 68, 212, 82, 208, 164, + 90, 1, 66, 212, 82, 208, 164, 90, 1, 74, 212, 82, 208, 164, 90, 1, 211, + 89, 212, 82, 208, 164, 90, 1, 71, 212, 82, 208, 164, 90, 1, 234, 190, + 212, 82, 208, 164, 90, 1, 193, 224, 212, 82, 208, 164, 90, 198, 70, 212, + 82, 208, 164, 90, 198, 66, 212, 82, 208, 164, 90, 198, 67, 212, 82, 208, + 164, 90, 198, 64, 212, 82, 208, 164, 90, 198, 65, 212, 82, 208, 164, 90, + 198, 68, 212, 82, 208, 164, 90, 198, 69, 212, 82, 208, 164, 90, 3, 40, + 209, 252, 212, 82, 208, 164, 90, 3, 40, 199, 3, 212, 82, 208, 164, 90, 3, + 40, 219, 41, 212, 82, 208, 164, 90, 3, 40, 251, 103, 212, 82, 208, 164, + 90, 3, 40, 223, 96, 212, 82, 208, 164, 90, 3, 192, 183, 192, 182, 212, + 82, 208, 164, 90, 5, 219, 192, 212, 82, 208, 164, 90, 17, 191, 77, 212, + 82, 208, 164, 90, 17, 107, 212, 82, 208, 164, 90, 17, 109, 212, 82, 208, + 164, 90, 17, 138, 212, 82, 208, 164, 90, 17, 134, 212, 82, 208, 164, 90, + 17, 150, 212, 82, 208, 164, 90, 17, 169, 212, 82, 208, 164, 90, 17, 175, + 212, 82, 208, 164, 90, 17, 171, 212, 82, 208, 164, 90, 17, 178, 212, 82, + 208, 164, 90, 219, 30, 212, 98, 212, 82, 208, 164, 90, 47, 247, 162, 198, + 38, 1, 168, 198, 38, 1, 249, 155, 198, 38, 1, 190, 190, 198, 38, 1, 238, + 34, 198, 38, 1, 155, 198, 38, 1, 231, 242, 198, 38, 1, 174, 198, 38, 1, + 181, 198, 38, 1, 214, 70, 198, 38, 1, 188, 198, 38, 1, 247, 3, 198, 38, + 1, 170, 198, 38, 1, 193, 190, 198, 38, 1, 223, 34, 198, 38, 1, 140, 198, + 38, 1, 165, 198, 38, 1, 173, 198, 38, 1, 68, 198, 38, 1, 248, 40, 68, + 198, 38, 1, 223, 51, 198, 38, 1, 248, 40, 223, 51, 198, 38, 1, 66, 198, + 38, 1, 71, 198, 38, 1, 248, 40, 71, 198, 38, 1, 234, 67, 198, 38, 1, 248, + 40, 234, 67, 198, 38, 1, 74, 198, 38, 1, 252, 27, 198, 38, 1, 248, 40, + 252, 27, 198, 38, 1, 65, 198, 38, 3, 206, 181, 198, 79, 193, 163, 1, 252, + 208, 193, 163, 1, 65, 193, 163, 1, 249, 155, 193, 163, 1, 247, 162, 193, + 163, 1, 238, 34, 193, 163, 1, 231, 242, 193, 163, 1, 170, 193, 163, 1, + 209, 230, 193, 163, 1, 173, 193, 163, 1, 181, 193, 163, 1, 168, 193, 163, + 1, 190, 190, 193, 163, 1, 199, 49, 193, 163, 1, 233, 111, 193, 163, 1, + 188, 193, 163, 1, 203, 166, 193, 163, 1, 223, 34, 193, 163, 1, 191, 123, + 193, 163, 1, 193, 190, 193, 163, 1, 195, 188, 193, 163, 1, 155, 193, 163, + 1, 74, 193, 163, 1, 250, 165, 193, 163, 1, 165, 193, 163, 1, 174, 193, + 163, 1, 221, 217, 193, 163, 1, 140, 193, 163, 1, 71, 193, 163, 1, 68, + 193, 163, 1, 214, 70, 193, 163, 1, 66, 193, 163, 1, 219, 68, 193, 163, 1, + 197, 168, 193, 163, 1, 198, 26, 193, 163, 1, 211, 96, 193, 163, 1, 252, + 167, 193, 163, 1, 251, 124, 193, 163, 1, 223, 138, 193, 163, 1, 211, 106, + 193, 163, 1, 234, 105, 193, 163, 1, 252, 168, 193, 163, 1, 212, 103, 193, + 163, 1, 196, 147, 193, 163, 1, 192, 24, 193, 163, 163, 197, 67, 193, 163, + 163, 197, 66, 193, 163, 163, 221, 56, 193, 163, 163, 221, 55, 193, 163, + 17, 191, 77, 193, 163, 17, 107, 193, 163, 17, 109, 193, 163, 17, 138, + 193, 163, 17, 134, 193, 163, 17, 150, 193, 163, 17, 169, 193, 163, 17, + 175, 193, 163, 17, 171, 193, 163, 17, 178, 193, 163, 213, 234, 56, 214, + 245, 215, 122, 1, 74, 214, 245, 215, 122, 1, 211, 80, 214, 245, 215, 122, + 1, 211, 122, 214, 245, 215, 122, 1, 210, 244, 214, 245, 215, 122, 1, 211, + 96, 214, 245, 215, 122, 1, 65, 214, 245, 215, 122, 1, 251, 220, 214, 245, + 215, 122, 1, 252, 157, 214, 245, 215, 122, 1, 251, 71, 214, 245, 215, + 122, 1, 251, 247, 214, 245, 215, 122, 1, 68, 214, 245, 215, 122, 1, 223, + 70, 214, 245, 215, 122, 1, 228, 20, 214, 245, 215, 122, 1, 223, 55, 214, + 245, 215, 122, 1, 223, 202, 214, 245, 215, 122, 1, 66, 214, 245, 215, + 122, 1, 196, 160, 214, 245, 215, 122, 1, 196, 158, 214, 245, 215, 122, 1, + 196, 128, 214, 245, 215, 122, 1, 196, 62, 214, 245, 215, 122, 1, 71, 214, + 245, 215, 122, 1, 234, 87, 214, 245, 215, 122, 1, 234, 182, 214, 245, + 215, 122, 1, 234, 116, 214, 245, 215, 122, 1, 234, 105, 214, 245, 215, + 122, 1, 233, 247, 214, 245, 215, 122, 1, 234, 124, 214, 245, 215, 122, 3, + 211, 129, 214, 245, 215, 122, 3, 215, 140, 214, 245, 215, 122, 3, 198, + 28, 214, 245, 215, 122, 3, 223, 195, 214, 245, 215, 122, 3, 200, 161, + 214, 245, 215, 122, 17, 191, 77, 214, 245, 215, 122, 17, 107, 214, 245, + 215, 122, 17, 109, 214, 245, 215, 122, 17, 138, 214, 245, 215, 122, 17, + 134, 214, 245, 215, 122, 17, 150, 214, 245, 215, 122, 17, 169, 214, 245, + 215, 122, 17, 175, 214, 245, 215, 122, 17, 171, 214, 245, 215, 122, 17, + 178, 36, 5, 229, 168, 36, 5, 229, 162, 36, 5, 229, 164, 36, 5, 229, 167, + 36, 5, 229, 165, 36, 5, 229, 166, 36, 5, 229, 163, 36, 5, 230, 149, 229, + 172, 36, 5, 229, 169, 36, 5, 229, 170, 36, 5, 229, 171, 36, 5, 230, 149, + 215, 78, 36, 5, 230, 149, 215, 79, 36, 5, 230, 149, 207, 238, 36, 5, 230, + 149, 207, 239, 36, 5, 230, 149, 207, 240, 36, 5, 230, 149, 247, 209, 36, + 5, 230, 149, 247, 210, 36, 5, 230, 149, 220, 174, 36, 5, 230, 149, 220, + 175, 36, 5, 230, 149, 220, 176, 36, 5, 230, 149, 230, 133, 36, 5, 230, + 149, 230, 134, 36, 5, 230, 149, 230, 135, 36, 5, 230, 149, 232, 60, 36, + 5, 230, 149, 232, 61, 36, 5, 230, 149, 208, 120, 36, 5, 230, 149, 208, + 121, 85, 84, 5, 218, 169, 221, 168, 85, 84, 5, 218, 165, 155, 85, 84, 5, + 218, 163, 220, 234, 85, 84, 5, 218, 39, 222, 15, 85, 84, 5, 218, 9, 222, + 24, 85, 84, 5, 218, 28, 221, 43, 85, 84, 5, 218, 56, 221, 69, 85, 84, 5, + 217, 181, 220, 221, 85, 84, 5, 218, 160, 193, 86, 85, 84, 5, 218, 158, + 193, 190, 85, 84, 5, 218, 156, 193, 0, 85, 84, 5, 217, 234, 193, 114, 85, + 84, 5, 217, 242, 193, 125, 85, 84, 5, 217, 246, 193, 29, 85, 84, 5, 218, + 59, 193, 48, 85, 84, 5, 217, 166, 192, 252, 85, 84, 5, 217, 217, 193, + 112, 85, 84, 5, 218, 43, 192, 240, 85, 84, 5, 218, 55, 192, 242, 85, 84, + 5, 217, 221, 192, 241, 85, 84, 5, 218, 154, 216, 46, 85, 84, 5, 218, 152, + 217, 92, 85, 84, 5, 218, 150, 215, 124, 85, 84, 5, 218, 45, 216, 188, 85, + 84, 5, 218, 10, 215, 233, 85, 84, 5, 217, 206, 215, 150, 85, 84, 5, 217, + 171, 215, 144, 85, 84, 5, 218, 148, 248, 190, 85, 84, 5, 218, 145, 249, + 155, 85, 84, 5, 218, 143, 248, 12, 85, 84, 5, 217, 210, 249, 3, 85, 84, + 5, 218, 7, 249, 19, 85, 84, 5, 218, 1, 248, 99, 85, 84, 5, 217, 222, 248, + 113, 85, 84, 5, 218, 133, 68, 85, 84, 5, 218, 131, 65, 85, 84, 5, 218, + 129, 66, 85, 84, 5, 217, 197, 234, 190, 85, 84, 5, 218, 4, 71, 85, 84, 5, + 217, 195, 211, 89, 85, 84, 5, 217, 213, 74, 85, 84, 5, 217, 223, 234, + 168, 85, 84, 5, 217, 229, 223, 164, 85, 84, 5, 217, 225, 223, 164, 85, + 84, 5, 217, 165, 251, 134, 85, 84, 5, 217, 182, 234, 105, 85, 84, 5, 218, + 118, 202, 223, 85, 84, 5, 218, 116, 188, 85, 84, 5, 218, 114, 201, 5, 85, + 84, 5, 217, 198, 205, 51, 85, 84, 5, 217, 244, 205, 69, 85, 84, 5, 217, + 224, 202, 17, 85, 84, 5, 218, 25, 202, 47, 85, 84, 5, 217, 164, 202, 216, + 85, 84, 5, 218, 104, 219, 148, 85, 84, 5, 218, 102, 173, 85, 84, 5, 218, + 100, 218, 227, 85, 84, 5, 218, 20, 219, 230, 85, 84, 5, 218, 31, 219, + 240, 85, 84, 5, 218, 50, 219, 10, 85, 84, 5, 217, 207, 219, 45, 85, 84, + 5, 217, 250, 180, 219, 240, 85, 84, 5, 218, 126, 237, 46, 85, 84, 5, 218, + 123, 238, 34, 85, 84, 5, 218, 120, 235, 91, 85, 84, 5, 218, 15, 237, 133, + 85, 84, 5, 217, 180, 236, 148, 85, 84, 5, 217, 179, 236, 176, 85, 84, 5, + 218, 112, 198, 193, 85, 84, 5, 218, 109, 190, 190, 85, 84, 5, 218, 107, + 197, 94, 85, 84, 5, 218, 13, 199, 121, 85, 84, 5, 218, 49, 199, 145, 85, + 84, 5, 218, 0, 198, 59, 85, 84, 5, 218, 35, 159, 85, 84, 5, 218, 98, 222, + 246, 85, 84, 5, 218, 95, 223, 34, 85, 84, 5, 218, 93, 222, 184, 85, 84, + 5, 217, 203, 223, 10, 85, 84, 5, 217, 247, 223, 12, 85, 84, 5, 217, 200, + 222, 193, 85, 84, 5, 218, 41, 222, 203, 85, 84, 5, 217, 185, 180, 222, + 203, 85, 84, 5, 218, 91, 192, 33, 85, 84, 5, 218, 88, 170, 85, 84, 5, + 218, 86, 191, 225, 85, 84, 5, 217, 251, 192, 77, 85, 84, 5, 218, 24, 192, + 80, 85, 84, 5, 217, 219, 191, 246, 85, 84, 5, 217, 239, 192, 12, 85, 84, + 5, 218, 82, 233, 25, 85, 84, 5, 218, 80, 233, 111, 85, 84, 5, 218, 78, + 232, 88, 85, 84, 5, 218, 26, 233, 54, 85, 84, 5, 218, 29, 233, 61, 85, + 84, 5, 217, 227, 232, 164, 85, 84, 5, 218, 16, 232, 177, 85, 84, 5, 217, + 163, 232, 87, 85, 84, 5, 218, 3, 233, 82, 85, 84, 5, 218, 76, 213, 181, + 85, 84, 5, 218, 74, 214, 228, 85, 84, 5, 218, 72, 212, 132, 85, 84, 5, + 217, 243, 214, 104, 85, 84, 5, 217, 191, 213, 33, 85, 84, 5, 217, 184, + 229, 160, 85, 84, 5, 218, 67, 140, 85, 84, 5, 217, 174, 228, 161, 85, 84, + 5, 218, 70, 229, 217, 85, 84, 5, 218, 8, 229, 247, 85, 84, 5, 218, 65, + 228, 254, 85, 84, 5, 217, 220, 229, 25, 85, 84, 5, 218, 21, 229, 216, 85, + 84, 5, 217, 232, 228, 247, 85, 84, 5, 218, 51, 229, 130, 85, 84, 5, 217, + 230, 230, 58, 85, 84, 5, 218, 17, 228, 144, 85, 84, 5, 218, 52, 229, 200, + 85, 84, 5, 217, 167, 229, 1, 85, 84, 5, 218, 58, 228, 157, 85, 84, 5, + 218, 14, 214, 35, 85, 84, 5, 218, 63, 214, 49, 85, 84, 5, 218, 22, 214, + 32, 85, 84, 5, 217, 245, 214, 43, 85, 84, 5, 217, 214, 214, 44, 85, 84, + 5, 217, 204, 214, 33, 85, 84, 5, 217, 240, 214, 34, 85, 84, 5, 217, 201, + 214, 48, 85, 84, 5, 217, 233, 214, 31, 85, 84, 5, 218, 18, 180, 214, 44, + 85, 84, 5, 217, 254, 180, 214, 33, 85, 84, 5, 217, 177, 180, 214, 34, 85, + 84, 5, 217, 205, 231, 55, 85, 84, 5, 217, 249, 231, 242, 85, 84, 5, 217, + 192, 230, 181, 85, 84, 5, 217, 170, 231, 159, 85, 84, 5, 217, 194, 230, + 167, 85, 84, 5, 217, 193, 230, 177, 85, 84, 5, 217, 176, 214, 54, 85, 84, + 5, 218, 47, 213, 247, 85, 84, 5, 217, 183, 213, 236, 85, 84, 5, 218, 36, + 209, 187, 85, 84, 5, 218, 5, 168, 85, 84, 5, 218, 54, 208, 167, 85, 84, + 5, 218, 23, 210, 51, 85, 84, 5, 218, 53, 210, 65, 85, 84, 5, 218, 2, 209, + 39, 85, 84, 5, 218, 38, 209, 75, 85, 84, 5, 217, 215, 216, 254, 85, 84, + 5, 218, 42, 217, 13, 85, 84, 5, 217, 238, 216, 248, 85, 84, 5, 218, 57, + 217, 5, 85, 84, 5, 217, 172, 217, 5, 85, 84, 5, 218, 32, 217, 6, 85, 84, + 5, 217, 188, 216, 249, 85, 84, 5, 217, 186, 216, 250, 85, 84, 5, 217, + 173, 216, 242, 85, 84, 5, 217, 199, 180, 217, 6, 85, 84, 5, 217, 255, + 180, 216, 249, 85, 84, 5, 217, 218, 180, 216, 250, 85, 84, 5, 217, 228, + 221, 15, 85, 84, 5, 218, 12, 221, 23, 85, 84, 5, 218, 30, 221, 11, 85, + 84, 5, 218, 61, 221, 18, 85, 84, 5, 217, 252, 221, 19, 85, 84, 5, 217, + 248, 221, 13, 85, 84, 5, 217, 202, 221, 14, 85, 84, 5, 217, 236, 231, + 176, 85, 84, 5, 218, 48, 231, 184, 85, 84, 5, 217, 212, 231, 171, 85, 84, + 5, 218, 11, 231, 180, 85, 84, 5, 217, 253, 231, 181, 85, 84, 5, 218, 33, + 231, 172, 85, 84, 5, 218, 34, 231, 174, 85, 84, 5, 217, 189, 165, 85, 84, + 5, 217, 237, 214, 149, 85, 84, 5, 217, 231, 214, 164, 85, 84, 5, 217, + 235, 214, 131, 85, 84, 5, 217, 169, 214, 155, 85, 84, 5, 217, 241, 214, + 156, 85, 84, 5, 218, 37, 214, 136, 85, 84, 5, 218, 40, 214, 140, 85, 84, + 5, 217, 208, 213, 159, 85, 84, 5, 217, 168, 213, 129, 85, 84, 5, 217, + 211, 213, 150, 85, 84, 5, 217, 226, 213, 133, 85, 84, 5, 217, 178, 195, + 69, 85, 84, 5, 217, 175, 195, 188, 85, 84, 5, 217, 209, 193, 249, 85, 84, + 5, 217, 187, 195, 148, 85, 84, 5, 218, 19, 195, 153, 85, 84, 5, 217, 216, + 195, 8, 85, 84, 5, 218, 27, 195, 24, 85, 84, 5, 217, 196, 212, 76, 85, + 84, 5, 218, 46, 212, 96, 85, 84, 5, 217, 190, 212, 58, 85, 84, 5, 218, 6, + 212, 88, 85, 84, 5, 218, 44, 212, 65, 85, 84, 17, 107, 85, 84, 17, 109, + 85, 84, 17, 138, 85, 84, 17, 134, 85, 84, 17, 150, 85, 84, 17, 169, 85, + 84, 17, 175, 85, 84, 17, 171, 85, 84, 17, 178, 85, 84, 33, 31, 199, 119, + 85, 84, 33, 31, 199, 90, 85, 84, 33, 31, 228, 140, 85, 84, 33, 31, 198, + 228, 85, 84, 33, 31, 199, 96, 198, 228, 85, 84, 33, 31, 228, 143, 198, + 228, 85, 84, 33, 31, 216, 49, 252, 35, 6, 1, 251, 182, 252, 35, 6, 1, + 238, 31, 252, 35, 6, 1, 220, 125, 252, 35, 6, 1, 216, 62, 252, 35, 6, 1, + 249, 155, 252, 35, 6, 1, 202, 165, 252, 35, 6, 1, 210, 65, 252, 35, 6, 1, + 248, 198, 252, 35, 6, 1, 165, 252, 35, 6, 1, 71, 252, 35, 6, 1, 233, 111, + 252, 35, 6, 1, 68, 252, 35, 6, 1, 74, 252, 35, 6, 1, 237, 70, 252, 35, 6, + 1, 192, 34, 252, 35, 6, 1, 193, 133, 252, 35, 6, 1, 212, 132, 252, 35, 6, + 1, 222, 108, 252, 35, 6, 1, 170, 252, 35, 6, 1, 66, 252, 35, 6, 1, 222, + 237, 252, 35, 6, 1, 243, 97, 252, 35, 6, 1, 140, 252, 35, 6, 1, 208, 96, + 252, 35, 6, 1, 231, 242, 252, 35, 6, 1, 212, 103, 252, 35, 6, 1, 197, 94, + 252, 35, 6, 1, 213, 226, 252, 35, 6, 1, 195, 188, 252, 35, 6, 1, 221, + 217, 252, 35, 6, 1, 231, 181, 252, 35, 6, 1, 191, 108, 252, 35, 6, 1, + 221, 14, 252, 35, 6, 1, 203, 166, 252, 35, 2, 1, 251, 182, 252, 35, 2, 1, + 238, 31, 252, 35, 2, 1, 220, 125, 252, 35, 2, 1, 216, 62, 252, 35, 2, 1, + 249, 155, 252, 35, 2, 1, 202, 165, 252, 35, 2, 1, 210, 65, 252, 35, 2, 1, + 248, 198, 252, 35, 2, 1, 165, 252, 35, 2, 1, 71, 252, 35, 2, 1, 233, 111, + 252, 35, 2, 1, 68, 252, 35, 2, 1, 74, 252, 35, 2, 1, 237, 70, 252, 35, 2, + 1, 192, 34, 252, 35, 2, 1, 193, 133, 252, 35, 2, 1, 212, 132, 252, 35, 2, + 1, 222, 108, 252, 35, 2, 1, 170, 252, 35, 2, 1, 66, 252, 35, 2, 1, 222, + 237, 252, 35, 2, 1, 243, 97, 252, 35, 2, 1, 140, 252, 35, 2, 1, 208, 96, + 252, 35, 2, 1, 231, 242, 252, 35, 2, 1, 212, 103, 252, 35, 2, 1, 197, 94, + 252, 35, 2, 1, 213, 226, 252, 35, 2, 1, 195, 188, 252, 35, 2, 1, 221, + 217, 252, 35, 2, 1, 231, 181, 252, 35, 2, 1, 191, 108, 252, 35, 2, 1, + 221, 14, 252, 35, 2, 1, 203, 166, 252, 35, 251, 183, 219, 192, 252, 35, + 18, 219, 192, 252, 35, 231, 155, 77, 252, 35, 230, 59, 252, 35, 120, 215, + 254, 252, 35, 231, 156, 120, 215, 254, 252, 35, 212, 143, 252, 35, 214, + 215, 77, 252, 35, 17, 191, 77, 252, 35, 17, 107, 252, 35, 17, 109, 252, + 35, 17, 138, 252, 35, 17, 134, 252, 35, 17, 150, 252, 35, 17, 169, 252, + 35, 17, 175, 252, 35, 17, 171, 252, 35, 17, 178, 252, 35, 89, 233, 218, + 77, 252, 35, 89, 208, 15, 77, 223, 148, 143, 31, 107, 223, 148, 143, 31, + 109, 223, 148, 143, 31, 138, 223, 148, 143, 31, 134, 223, 148, 143, 31, + 150, 223, 148, 143, 31, 169, 223, 148, 143, 31, 175, 223, 148, 143, 31, + 171, 223, 148, 143, 31, 178, 223, 148, 143, 31, 199, 95, 223, 148, 143, + 31, 197, 32, 223, 148, 143, 31, 198, 249, 223, 148, 143, 31, 232, 137, + 223, 148, 143, 31, 233, 17, 223, 148, 143, 31, 202, 121, 223, 148, 143, + 31, 203, 242, 223, 148, 143, 31, 234, 155, 223, 148, 143, 31, 213, 171, + 223, 148, 143, 31, 91, 228, 142, 223, 148, 143, 31, 105, 228, 142, 223, + 148, 143, 31, 115, 228, 142, 223, 148, 143, 31, 232, 130, 228, 142, 223, + 148, 143, 31, 232, 228, 228, 142, 223, 148, 143, 31, 202, 137, 228, 142, + 223, 148, 143, 31, 203, 248, 228, 142, 223, 148, 143, 31, 234, 166, 228, + 142, 223, 148, 143, 31, 213, 177, 228, 142, 223, 148, 143, 31, 91, 189, + 223, 148, 143, 31, 105, 189, 223, 148, 143, 31, 115, 189, 223, 148, 143, + 31, 232, 130, 189, 223, 148, 143, 31, 232, 228, 189, 223, 148, 143, 31, + 202, 137, 189, 223, 148, 143, 31, 203, 248, 189, 223, 148, 143, 31, 234, + 166, 189, 223, 148, 143, 31, 213, 177, 189, 223, 148, 143, 31, 199, 96, + 189, 223, 148, 143, 31, 197, 33, 189, 223, 148, 143, 31, 198, 250, 189, + 223, 148, 143, 31, 232, 138, 189, 223, 148, 143, 31, 233, 18, 189, 223, + 148, 143, 31, 202, 122, 189, 223, 148, 143, 31, 203, 243, 189, 223, 148, + 143, 31, 234, 156, 189, 223, 148, 143, 31, 213, 172, 189, 223, 148, 143, + 31, 220, 43, 223, 148, 143, 31, 220, 42, 223, 148, 143, 220, 44, 77, 223, + 148, 143, 31, 222, 62, 223, 148, 143, 31, 222, 61, 223, 148, 143, 31, + 208, 229, 107, 223, 148, 143, 31, 208, 229, 109, 223, 148, 143, 31, 208, + 229, 138, 223, 148, 143, 31, 208, 229, 134, 223, 148, 143, 31, 208, 229, + 150, 223, 148, 143, 31, 208, 229, 169, 223, 148, 143, 31, 208, 229, 175, + 223, 148, 143, 31, 208, 229, 171, 223, 148, 143, 31, 208, 229, 178, 223, + 148, 143, 209, 108, 223, 148, 143, 232, 120, 91, 208, 24, 223, 148, 143, + 232, 120, 91, 230, 72, 223, 148, 143, 232, 120, 115, 208, 22, 223, 148, + 143, 206, 37, 77, 223, 148, 143, 31, 251, 159, 107, 223, 148, 143, 31, + 251, 159, 109, 223, 148, 143, 31, 251, 159, 199, 96, 189, 223, 148, 143, + 251, 159, 220, 44, 77, 211, 23, 143, 31, 107, 211, 23, 143, 31, 109, 211, + 23, 143, 31, 138, 211, 23, 143, 31, 134, 211, 23, 143, 31, 150, 211, 23, + 143, 31, 169, 211, 23, 143, 31, 175, 211, 23, 143, 31, 171, 211, 23, 143, + 31, 178, 211, 23, 143, 31, 199, 95, 211, 23, 143, 31, 197, 32, 211, 23, + 143, 31, 198, 249, 211, 23, 143, 31, 232, 137, 211, 23, 143, 31, 233, 17, + 211, 23, 143, 31, 202, 121, 211, 23, 143, 31, 203, 242, 211, 23, 143, 31, + 234, 155, 211, 23, 143, 31, 213, 171, 211, 23, 143, 31, 91, 228, 142, + 211, 23, 143, 31, 105, 228, 142, 211, 23, 143, 31, 115, 228, 142, 211, + 23, 143, 31, 232, 130, 228, 142, 211, 23, 143, 31, 232, 228, 228, 142, + 211, 23, 143, 31, 202, 137, 228, 142, 211, 23, 143, 31, 203, 248, 228, + 142, 211, 23, 143, 31, 234, 166, 228, 142, 211, 23, 143, 31, 213, 177, + 228, 142, 211, 23, 143, 31, 91, 189, 211, 23, 143, 31, 105, 189, 211, 23, + 143, 31, 115, 189, 211, 23, 143, 31, 232, 130, 189, 211, 23, 143, 31, + 232, 228, 189, 211, 23, 143, 31, 202, 137, 189, 211, 23, 143, 31, 203, + 248, 189, 211, 23, 143, 31, 234, 166, 189, 211, 23, 143, 31, 213, 177, + 189, 211, 23, 143, 31, 199, 96, 189, 211, 23, 143, 31, 197, 33, 189, 211, + 23, 143, 31, 198, 250, 189, 211, 23, 143, 31, 232, 138, 189, 211, 23, + 143, 31, 233, 18, 189, 211, 23, 143, 31, 202, 122, 189, 211, 23, 143, 31, + 203, 243, 189, 211, 23, 143, 31, 234, 156, 189, 211, 23, 143, 31, 213, + 172, 189, 211, 23, 143, 217, 51, 211, 23, 143, 251, 159, 31, 109, 211, + 23, 143, 251, 159, 31, 138, 211, 23, 143, 251, 159, 31, 134, 211, 23, + 143, 251, 159, 31, 150, 211, 23, 143, 251, 159, 31, 169, 211, 23, 143, + 251, 159, 31, 175, 211, 23, 143, 251, 159, 31, 171, 211, 23, 143, 251, + 159, 31, 178, 211, 23, 143, 251, 159, 31, 199, 95, 211, 23, 143, 251, + 159, 31, 232, 130, 228, 142, 211, 23, 143, 251, 159, 31, 202, 137, 228, + 142, 211, 23, 143, 251, 159, 31, 105, 189, 211, 23, 143, 251, 159, 31, + 199, 96, 189, 211, 23, 143, 232, 120, 91, 230, 72, 211, 23, 143, 232, + 120, 91, 202, 125, 9, 13, 251, 194, 9, 13, 248, 247, 9, 13, 223, 8, 9, + 13, 238, 5, 9, 13, 193, 133, 9, 13, 191, 113, 9, 13, 230, 83, 9, 13, 199, + 219, 9, 13, 192, 75, 9, 13, 222, 108, 9, 13, 220, 37, 9, 13, 216, 210, 9, + 13, 213, 26, 9, 13, 205, 47, 9, 13, 251, 232, 9, 13, 233, 48, 9, 13, 205, + 193, 9, 13, 208, 91, 9, 13, 207, 72, 9, 13, 203, 110, 9, 13, 199, 114, 9, + 13, 199, 29, 9, 13, 221, 212, 9, 13, 199, 41, 9, 13, 238, 28, 9, 13, 191, + 116, 9, 13, 231, 88, 9, 13, 236, 141, 248, 247, 9, 13, 236, 141, 213, 26, + 9, 13, 236, 141, 233, 48, 9, 13, 236, 141, 208, 91, 9, 13, 89, 248, 247, + 9, 13, 89, 223, 8, 9, 13, 89, 229, 212, 9, 13, 89, 230, 83, 9, 13, 89, + 192, 75, 9, 13, 89, 222, 108, 9, 13, 89, 220, 37, 9, 13, 89, 216, 210, 9, + 13, 89, 213, 26, 9, 13, 89, 205, 47, 9, 13, 89, 251, 232, 9, 13, 89, 233, + 48, 9, 13, 89, 205, 193, 9, 13, 89, 208, 91, 9, 13, 89, 203, 110, 9, 13, + 89, 199, 114, 9, 13, 89, 199, 29, 9, 13, 89, 221, 212, 9, 13, 89, 238, + 28, 9, 13, 89, 231, 88, 9, 13, 199, 214, 223, 8, 9, 13, 199, 214, 230, + 83, 9, 13, 199, 214, 192, 75, 9, 13, 199, 214, 220, 37, 9, 13, 199, 214, + 213, 26, 9, 13, 199, 214, 205, 47, 9, 13, 199, 214, 251, 232, 9, 13, 199, + 214, 205, 193, 9, 13, 199, 214, 208, 91, 9, 13, 199, 214, 203, 110, 9, + 13, 199, 214, 221, 212, 9, 13, 199, 214, 238, 28, 9, 13, 199, 214, 231, + 88, 9, 13, 199, 214, 236, 141, 213, 26, 9, 13, 199, 214, 236, 141, 208, + 91, 9, 13, 201, 37, 248, 247, 9, 13, 201, 37, 223, 8, 9, 13, 201, 37, + 229, 212, 9, 13, 201, 37, 230, 83, 9, 13, 201, 37, 199, 219, 9, 13, 201, + 37, 192, 75, 9, 13, 201, 37, 222, 108, 9, 13, 201, 37, 216, 210, 9, 13, + 201, 37, 213, 26, 9, 13, 201, 37, 205, 47, 9, 13, 201, 37, 251, 232, 9, + 13, 201, 37, 233, 48, 9, 13, 201, 37, 205, 193, 9, 13, 201, 37, 208, 91, + 9, 13, 201, 37, 203, 110, 9, 13, 201, 37, 199, 114, 9, 13, 201, 37, 199, + 29, 9, 13, 201, 37, 221, 212, 9, 13, 201, 37, 238, 28, 9, 13, 201, 37, + 191, 116, 9, 13, 201, 37, 231, 88, 9, 13, 201, 37, 236, 141, 248, 247, 9, + 13, 201, 37, 236, 141, 233, 48, 9, 13, 219, 5, 251, 194, 9, 13, 219, 5, + 248, 247, 9, 13, 219, 5, 223, 8, 9, 13, 219, 5, 238, 5, 9, 13, 219, 5, + 229, 212, 9, 13, 219, 5, 193, 133, 9, 13, 219, 5, 191, 113, 9, 13, 219, + 5, 230, 83, 9, 13, 219, 5, 199, 219, 9, 13, 219, 5, 192, 75, 9, 13, 219, + 5, 220, 37, 9, 13, 219, 5, 216, 210, 9, 13, 219, 5, 213, 26, 9, 13, 219, + 5, 205, 47, 9, 13, 219, 5, 251, 232, 9, 13, 219, 5, 233, 48, 9, 13, 219, + 5, 205, 193, 9, 13, 219, 5, 208, 91, 9, 13, 219, 5, 207, 72, 9, 13, 219, + 5, 203, 110, 9, 13, 219, 5, 199, 114, 9, 13, 219, 5, 199, 29, 9, 13, 219, + 5, 221, 212, 9, 13, 219, 5, 199, 41, 9, 13, 219, 5, 238, 28, 9, 13, 219, + 5, 191, 116, 9, 13, 219, 5, 231, 88, 9, 13, 235, 131, 248, 247, 9, 13, + 235, 131, 223, 8, 9, 13, 235, 131, 238, 5, 9, 13, 235, 131, 193, 133, 9, + 13, 235, 131, 191, 113, 9, 13, 235, 131, 230, 83, 9, 13, 235, 131, 199, + 219, 9, 13, 235, 131, 192, 75, 9, 13, 235, 131, 220, 37, 9, 13, 235, 131, + 216, 210, 9, 13, 235, 131, 213, 26, 9, 13, 235, 131, 205, 47, 9, 13, 235, + 131, 251, 232, 9, 13, 235, 131, 233, 48, 9, 13, 235, 131, 205, 193, 9, + 13, 235, 131, 208, 91, 9, 13, 235, 131, 207, 72, 9, 13, 235, 131, 203, + 110, 9, 13, 235, 131, 199, 114, 9, 13, 235, 131, 199, 29, 9, 13, 235, + 131, 221, 212, 9, 13, 235, 131, 199, 41, 9, 13, 235, 131, 238, 28, 9, 13, + 235, 131, 191, 116, 9, 13, 235, 131, 231, 88, 9, 13, 211, 69, 92, 4, 183, + 4, 199, 168, 9, 13, 211, 69, 183, 4, 238, 5, 217, 116, 123, 234, 206, + 193, 66, 217, 116, 123, 202, 3, 193, 66, 217, 116, 123, 193, 105, 193, + 66, 217, 116, 123, 186, 193, 66, 217, 116, 123, 207, 89, 235, 113, 217, + 116, 123, 230, 203, 235, 113, 217, 116, 123, 63, 235, 113, 217, 116, 123, + 91, 79, 243, 142, 217, 116, 123, 105, 79, 243, 142, 217, 116, 123, 115, + 79, 243, 142, 217, 116, 123, 232, 130, 79, 243, 142, 217, 116, 123, 232, + 228, 79, 243, 142, 217, 116, 123, 202, 137, 79, 243, 142, 217, 116, 123, + 203, 248, 79, 243, 142, 217, 116, 123, 234, 166, 79, 243, 142, 217, 116, + 123, 213, 177, 79, 243, 142, 217, 116, 123, 91, 79, 249, 104, 217, 116, + 123, 105, 79, 249, 104, 217, 116, 123, 115, 79, 249, 104, 217, 116, 123, + 232, 130, 79, 249, 104, 217, 116, 123, 232, 228, 79, 249, 104, 217, 116, + 123, 202, 137, 79, 249, 104, 217, 116, 123, 203, 248, 79, 249, 104, 217, + 116, 123, 234, 166, 79, 249, 104, 217, 116, 123, 213, 177, 79, 249, 104, + 217, 116, 123, 91, 79, 243, 9, 217, 116, 123, 105, 79, 243, 9, 217, 116, + 123, 115, 79, 243, 9, 217, 116, 123, 232, 130, 79, 243, 9, 217, 116, 123, + 232, 228, 79, 243, 9, 217, 116, 123, 202, 137, 79, 243, 9, 217, 116, 123, + 203, 248, 79, 243, 9, 217, 116, 123, 234, 166, 79, 243, 9, 217, 116, 123, + 213, 177, 79, 243, 9, 217, 116, 123, 209, 87, 217, 116, 123, 211, 55, + 217, 116, 123, 249, 105, 217, 116, 123, 243, 51, 217, 116, 123, 201, 197, + 217, 116, 123, 200, 200, 217, 116, 123, 250, 151, 217, 116, 123, 193, 56, + 217, 116, 123, 222, 196, 217, 116, 123, 249, 148, 236, 153, 123, 228, + 243, 249, 148, 236, 153, 123, 228, 241, 236, 153, 123, 228, 240, 236, + 153, 123, 228, 239, 236, 153, 123, 228, 238, 236, 153, 123, 228, 237, + 236, 153, 123, 228, 236, 236, 153, 123, 228, 235, 236, 153, 123, 228, + 234, 236, 153, 123, 228, 233, 236, 153, 123, 228, 232, 236, 153, 123, + 228, 231, 236, 153, 123, 228, 230, 236, 153, 123, 228, 229, 236, 153, + 123, 228, 228, 236, 153, 123, 228, 227, 236, 153, 123, 228, 226, 236, + 153, 123, 228, 225, 236, 153, 123, 228, 224, 236, 153, 123, 228, 223, + 236, 153, 123, 228, 222, 236, 153, 123, 228, 221, 236, 153, 123, 228, + 220, 236, 153, 123, 228, 219, 236, 153, 123, 228, 218, 236, 153, 123, + 228, 217, 236, 153, 123, 228, 216, 236, 153, 123, 228, 215, 236, 153, + 123, 228, 214, 236, 153, 123, 228, 213, 236, 153, 123, 228, 212, 236, + 153, 123, 228, 211, 236, 153, 123, 228, 210, 236, 153, 123, 228, 209, + 236, 153, 123, 228, 208, 236, 153, 123, 228, 207, 236, 153, 123, 228, + 206, 236, 153, 123, 228, 205, 236, 153, 123, 228, 204, 236, 153, 123, + 228, 203, 236, 153, 123, 228, 202, 236, 153, 123, 228, 201, 236, 153, + 123, 228, 200, 236, 153, 123, 228, 199, 236, 153, 123, 228, 198, 236, + 153, 123, 228, 197, 236, 153, 123, 228, 196, 236, 153, 123, 228, 195, + 236, 153, 123, 228, 194, 236, 153, 123, 228, 193, 236, 153, 123, 81, 249, + 148, 236, 153, 123, 195, 134, 236, 153, 123, 195, 133, 236, 153, 123, + 195, 132, 236, 153, 123, 195, 131, 236, 153, 123, 195, 130, 236, 153, + 123, 195, 129, 236, 153, 123, 195, 128, 236, 153, 123, 195, 127, 236, + 153, 123, 195, 126, 236, 153, 123, 195, 125, 236, 153, 123, 195, 124, + 236, 153, 123, 195, 123, 236, 153, 123, 195, 122, 236, 153, 123, 195, + 121, 236, 153, 123, 195, 120, 236, 153, 123, 195, 119, 236, 153, 123, + 195, 118, 236, 153, 123, 195, 117, 236, 153, 123, 195, 116, 236, 153, + 123, 195, 115, 236, 153, 123, 195, 114, 236, 153, 123, 195, 113, 236, + 153, 123, 195, 112, 236, 153, 123, 195, 111, 236, 153, 123, 195, 110, + 236, 153, 123, 195, 109, 236, 153, 123, 195, 108, 236, 153, 123, 195, + 107, 236, 153, 123, 195, 106, 236, 153, 123, 195, 105, 236, 153, 123, + 195, 104, 236, 153, 123, 195, 103, 236, 153, 123, 195, 102, 236, 153, + 123, 195, 101, 236, 153, 123, 195, 100, 236, 153, 123, 195, 99, 236, 153, + 123, 195, 98, 236, 153, 123, 195, 97, 236, 153, 123, 195, 96, 236, 153, + 123, 195, 95, 236, 153, 123, 195, 94, 236, 153, 123, 195, 93, 236, 153, + 123, 195, 92, 236, 153, 123, 195, 91, 236, 153, 123, 195, 90, 236, 153, + 123, 195, 89, 236, 153, 123, 195, 88, 236, 153, 123, 195, 87, 236, 153, + 123, 195, 86, 209, 97, 247, 103, 249, 148, 209, 97, 247, 103, 252, 55, + 79, 201, 245, 209, 97, 247, 103, 105, 79, 201, 245, 209, 97, 247, 103, + 115, 79, 201, 245, 209, 97, 247, 103, 232, 130, 79, 201, 245, 209, 97, + 247, 103, 232, 228, 79, 201, 245, 209, 97, 247, 103, 202, 137, 79, 201, + 245, 209, 97, 247, 103, 203, 248, 79, 201, 245, 209, 97, 247, 103, 234, + 166, 79, 201, 245, 209, 97, 247, 103, 213, 177, 79, 201, 245, 209, 97, + 247, 103, 199, 96, 79, 201, 245, 209, 97, 247, 103, 223, 32, 79, 201, + 245, 209, 97, 247, 103, 221, 79, 79, 201, 245, 209, 97, 247, 103, 208, + 17, 79, 201, 245, 209, 97, 247, 103, 221, 141, 79, 201, 245, 209, 97, + 247, 103, 252, 55, 79, 229, 223, 209, 97, 247, 103, 105, 79, 229, 223, + 209, 97, 247, 103, 115, 79, 229, 223, 209, 97, 247, 103, 232, 130, 79, + 229, 223, 209, 97, 247, 103, 232, 228, 79, 229, 223, 209, 97, 247, 103, + 202, 137, 79, 229, 223, 209, 97, 247, 103, 203, 248, 79, 229, 223, 209, + 97, 247, 103, 234, 166, 79, 229, 223, 209, 97, 247, 103, 213, 177, 79, + 229, 223, 209, 97, 247, 103, 199, 96, 79, 229, 223, 209, 97, 247, 103, + 223, 32, 79, 229, 223, 209, 97, 247, 103, 221, 79, 79, 229, 223, 209, 97, + 247, 103, 208, 17, 79, 229, 223, 209, 97, 247, 103, 221, 141, 79, 229, + 223, 209, 97, 247, 103, 207, 89, 222, 196, 209, 97, 247, 103, 252, 55, + 79, 237, 33, 209, 97, 247, 103, 105, 79, 237, 33, 209, 97, 247, 103, 115, + 79, 237, 33, 209, 97, 247, 103, 232, 130, 79, 237, 33, 209, 97, 247, 103, + 232, 228, 79, 237, 33, 209, 97, 247, 103, 202, 137, 79, 237, 33, 209, 97, + 247, 103, 203, 248, 79, 237, 33, 209, 97, 247, 103, 234, 166, 79, 237, + 33, 209, 97, 247, 103, 213, 177, 79, 237, 33, 209, 97, 247, 103, 199, 96, + 79, 237, 33, 209, 97, 247, 103, 223, 32, 79, 237, 33, 209, 97, 247, 103, + 221, 79, 79, 237, 33, 209, 97, 247, 103, 208, 17, 79, 237, 33, 209, 97, + 247, 103, 221, 141, 79, 237, 33, 209, 97, 247, 103, 62, 222, 196, 209, + 97, 247, 103, 252, 55, 79, 242, 206, 209, 97, 247, 103, 105, 79, 242, + 206, 209, 97, 247, 103, 115, 79, 242, 206, 209, 97, 247, 103, 232, 130, + 79, 242, 206, 209, 97, 247, 103, 232, 228, 79, 242, 206, 209, 97, 247, + 103, 202, 137, 79, 242, 206, 209, 97, 247, 103, 203, 248, 79, 242, 206, + 209, 97, 247, 103, 234, 166, 79, 242, 206, 209, 97, 247, 103, 213, 177, + 79, 242, 206, 209, 97, 247, 103, 199, 96, 79, 242, 206, 209, 97, 247, + 103, 223, 32, 79, 242, 206, 209, 97, 247, 103, 221, 79, 79, 242, 206, + 209, 97, 247, 103, 208, 17, 79, 242, 206, 209, 97, 247, 103, 221, 141, + 79, 242, 206, 209, 97, 247, 103, 63, 222, 196, 209, 97, 247, 103, 232, + 162, 209, 97, 247, 103, 197, 200, 209, 97, 247, 103, 197, 189, 209, 97, + 247, 103, 197, 186, 209, 97, 247, 103, 197, 185, 209, 97, 247, 103, 197, + 184, 209, 97, 247, 103, 197, 183, 209, 97, 247, 103, 197, 182, 209, 97, + 247, 103, 197, 181, 209, 97, 247, 103, 197, 180, 209, 97, 247, 103, 197, + 199, 209, 97, 247, 103, 197, 198, 209, 97, 247, 103, 197, 197, 209, 97, + 247, 103, 197, 196, 209, 97, 247, 103, 197, 195, 209, 97, 247, 103, 197, + 194, 209, 97, 247, 103, 197, 193, 209, 97, 247, 103, 197, 192, 209, 97, + 247, 103, 197, 191, 209, 97, 247, 103, 197, 190, 209, 97, 247, 103, 197, + 188, 209, 97, 247, 103, 197, 187, 17, 191, 78, 232, 82, 201, 64, 17, 191, + 78, 242, 76, 17, 91, 242, 76, 17, 105, 242, 76, 17, 115, 242, 76, 17, + 232, 130, 242, 76, 17, 232, 228, 242, 76, 17, 202, 137, 242, 76, 17, 203, + 248, 242, 76, 17, 234, 166, 242, 76, 17, 213, 177, 242, 76, 236, 243, 47, + 49, 17, 191, 77, 236, 243, 214, 108, 47, 49, 17, 191, 77, 47, 191, 78, 4, + 202, 98, 47, 251, 87, 57, 47, 236, 157, 3, 4, 211, 6, 249, 143, 127, 8, + 6, 1, 65, 127, 8, 6, 1, 250, 122, 127, 8, 6, 1, 247, 195, 127, 8, 6, 1, + 238, 129, 127, 8, 6, 1, 71, 127, 8, 6, 1, 233, 177, 127, 8, 6, 1, 232, + 53, 127, 8, 6, 1, 230, 118, 127, 8, 6, 1, 68, 127, 8, 6, 1, 223, 37, 127, + 8, 6, 1, 222, 154, 127, 8, 6, 1, 172, 127, 8, 6, 1, 218, 170, 127, 8, 6, + 1, 215, 63, 127, 8, 6, 1, 74, 127, 8, 6, 1, 210, 238, 127, 8, 6, 1, 208, + 106, 127, 8, 6, 1, 146, 127, 8, 6, 1, 206, 9, 127, 8, 6, 1, 200, 43, 127, 8, 6, 1, 66, 127, 8, 6, 1, 196, 12, 127, 8, 6, 1, 193, 224, 127, 8, 6, 1, 192, 235, 127, 8, 6, 1, 192, 159, 127, 8, 6, 1, 191, 166, 198, 42, 203, - 103, 248, 52, 8, 6, 1, 206, 8, 47, 43, 8, 6, 1, 247, 193, 47, 43, 8, 6, - 1, 146, 47, 247, 43, 47, 192, 237, 239, 7, 113, 112, 8, 6, 1, 65, 112, 8, - 6, 1, 250, 120, 112, 8, 6, 1, 247, 193, 112, 8, 6, 1, 238, 127, 112, 8, - 6, 1, 71, 112, 8, 6, 1, 233, 175, 112, 8, 6, 1, 232, 51, 112, 8, 6, 1, - 230, 116, 112, 8, 6, 1, 68, 112, 8, 6, 1, 223, 35, 112, 8, 6, 1, 222, - 152, 112, 8, 6, 1, 172, 112, 8, 6, 1, 218, 168, 112, 8, 6, 1, 215, 61, - 112, 8, 6, 1, 74, 112, 8, 6, 1, 210, 236, 112, 8, 6, 1, 208, 104, 112, 8, - 6, 1, 146, 112, 8, 6, 1, 206, 8, 112, 8, 6, 1, 200, 43, 112, 8, 6, 1, 66, + 104, 248, 54, 8, 6, 1, 206, 9, 47, 43, 8, 6, 1, 247, 195, 47, 43, 8, 6, + 1, 146, 47, 247, 45, 47, 192, 237, 239, 9, 113, 112, 8, 6, 1, 65, 112, 8, + 6, 1, 250, 122, 112, 8, 6, 1, 247, 195, 112, 8, 6, 1, 238, 129, 112, 8, + 6, 1, 71, 112, 8, 6, 1, 233, 177, 112, 8, 6, 1, 232, 53, 112, 8, 6, 1, + 230, 118, 112, 8, 6, 1, 68, 112, 8, 6, 1, 223, 37, 112, 8, 6, 1, 222, + 154, 112, 8, 6, 1, 172, 112, 8, 6, 1, 218, 170, 112, 8, 6, 1, 215, 63, + 112, 8, 6, 1, 74, 112, 8, 6, 1, 210, 238, 112, 8, 6, 1, 208, 106, 112, 8, + 6, 1, 146, 112, 8, 6, 1, 206, 9, 112, 8, 6, 1, 200, 43, 112, 8, 6, 1, 66, 112, 8, 6, 1, 196, 12, 112, 8, 6, 1, 193, 224, 112, 8, 6, 1, 192, 235, - 112, 8, 6, 1, 192, 159, 112, 8, 6, 1, 191, 166, 112, 228, 126, 112, 215, - 87, 112, 205, 70, 112, 201, 178, 112, 208, 248, 112, 193, 126, 214, 106, - 47, 8, 6, 1, 65, 214, 106, 47, 8, 6, 1, 250, 120, 214, 106, 47, 8, 6, 1, - 247, 193, 214, 106, 47, 8, 6, 1, 238, 127, 214, 106, 47, 8, 6, 1, 71, - 214, 106, 47, 8, 6, 1, 233, 175, 214, 106, 47, 8, 6, 1, 232, 51, 214, - 106, 47, 8, 6, 1, 230, 116, 214, 106, 47, 8, 6, 1, 68, 214, 106, 47, 8, - 6, 1, 223, 35, 214, 106, 47, 8, 6, 1, 222, 152, 214, 106, 47, 8, 6, 1, - 172, 214, 106, 47, 8, 6, 1, 218, 168, 214, 106, 47, 8, 6, 1, 215, 61, - 214, 106, 47, 8, 6, 1, 74, 214, 106, 47, 8, 6, 1, 210, 236, 214, 106, 47, - 8, 6, 1, 208, 104, 214, 106, 47, 8, 6, 1, 146, 214, 106, 47, 8, 6, 1, - 206, 8, 214, 106, 47, 8, 6, 1, 200, 43, 214, 106, 47, 8, 6, 1, 66, 214, - 106, 47, 8, 6, 1, 196, 12, 214, 106, 47, 8, 6, 1, 193, 224, 214, 106, 47, - 8, 6, 1, 192, 235, 214, 106, 47, 8, 6, 1, 192, 159, 214, 106, 47, 8, 6, - 1, 191, 166, 207, 147, 216, 239, 56, 207, 147, 216, 235, 56, 207, 147, - 215, 164, 56, 47, 247, 66, 47, 247, 194, 4, 211, 4, 249, 141, 47, 228, - 145, 233, 12, 214, 106, 112, 8, 6, 1, 65, 214, 106, 112, 8, 6, 1, 250, - 120, 214, 106, 112, 8, 6, 1, 247, 193, 214, 106, 112, 8, 6, 1, 238, 127, - 214, 106, 112, 8, 6, 1, 71, 214, 106, 112, 8, 6, 1, 233, 175, 214, 106, - 112, 8, 6, 1, 232, 51, 214, 106, 112, 8, 6, 1, 230, 116, 214, 106, 112, - 8, 6, 1, 68, 214, 106, 112, 8, 6, 1, 223, 35, 214, 106, 112, 8, 6, 1, - 222, 152, 214, 106, 112, 8, 6, 1, 172, 214, 106, 112, 8, 6, 1, 218, 168, - 214, 106, 112, 8, 6, 1, 215, 61, 214, 106, 112, 8, 6, 1, 74, 214, 106, - 112, 8, 6, 1, 210, 236, 214, 106, 112, 8, 6, 1, 208, 104, 214, 106, 112, - 8, 6, 1, 146, 214, 106, 112, 8, 6, 1, 206, 8, 214, 106, 112, 8, 6, 1, - 200, 43, 214, 106, 112, 8, 6, 1, 66, 214, 106, 112, 8, 6, 1, 196, 12, - 214, 106, 112, 8, 6, 1, 193, 224, 214, 106, 112, 8, 6, 1, 192, 235, 214, - 106, 112, 8, 6, 1, 192, 159, 214, 106, 112, 8, 6, 1, 191, 166, 238, 214, - 214, 106, 112, 8, 6, 1, 210, 236, 214, 106, 112, 228, 28, 214, 106, 112, - 168, 214, 106, 112, 188, 214, 106, 112, 252, 155, 214, 106, 112, 193, - 126, 51, 236, 194, 112, 242, 247, 112, 239, 14, 112, 232, 108, 112, 228, - 19, 112, 214, 79, 112, 214, 70, 112, 211, 125, 112, 202, 9, 112, 133, 4, - 233, 216, 77, 112, 194, 252, 112, 115, 238, 127, 112, 205, 57, 205, 76, - 112, 105, 222, 152, 112, 232, 128, 222, 152, 112, 234, 164, 222, 152, - 112, 232, 226, 209, 62, 107, 112, 203, 247, 209, 62, 107, 112, 197, 21, - 209, 62, 109, 112, 202, 121, 210, 236, 112, 91, 228, 141, 197, 33, 210, - 236, 112, 8, 2, 1, 238, 127, 112, 229, 248, 112, 229, 247, 112, 229, 150, - 112, 218, 252, 112, 202, 241, 112, 196, 140, 112, 195, 21, 217, 36, 193, - 21, 113, 207, 79, 223, 145, 16, 1, 65, 207, 79, 223, 145, 16, 1, 250, - 120, 207, 79, 223, 145, 16, 1, 247, 193, 207, 79, 223, 145, 16, 1, 238, - 127, 207, 79, 223, 145, 16, 1, 71, 207, 79, 223, 145, 16, 1, 233, 175, - 207, 79, 223, 145, 16, 1, 232, 51, 207, 79, 223, 145, 16, 1, 230, 116, - 207, 79, 223, 145, 16, 1, 68, 207, 79, 223, 145, 16, 1, 223, 35, 207, 79, - 223, 145, 16, 1, 222, 152, 207, 79, 223, 145, 16, 1, 172, 207, 79, 223, - 145, 16, 1, 218, 168, 207, 79, 223, 145, 16, 1, 215, 61, 207, 79, 223, - 145, 16, 1, 74, 207, 79, 223, 145, 16, 1, 210, 236, 207, 79, 223, 145, - 16, 1, 208, 104, 207, 79, 223, 145, 16, 1, 146, 207, 79, 223, 145, 16, 1, - 206, 8, 207, 79, 223, 145, 16, 1, 200, 43, 207, 79, 223, 145, 16, 1, 66, - 207, 79, 223, 145, 16, 1, 196, 12, 207, 79, 223, 145, 16, 1, 193, 224, - 207, 79, 223, 145, 16, 1, 192, 235, 207, 79, 223, 145, 16, 1, 192, 159, - 207, 79, 223, 145, 16, 1, 191, 166, 51, 229, 120, 229, 9, 112, 72, 221, - 49, 112, 72, 188, 112, 12, 196, 95, 225, 217, 112, 12, 196, 95, 225, 221, - 112, 12, 196, 95, 225, 229, 112, 72, 237, 146, 112, 12, 196, 95, 225, - 236, 112, 12, 196, 95, 225, 223, 112, 12, 196, 95, 225, 195, 112, 12, - 196, 95, 225, 222, 112, 12, 196, 95, 225, 235, 112, 12, 196, 95, 225, - 209, 112, 12, 196, 95, 225, 202, 112, 12, 196, 95, 225, 211, 112, 12, - 196, 95, 225, 232, 112, 12, 196, 95, 225, 218, 112, 12, 196, 95, 225, - 234, 112, 12, 196, 95, 225, 210, 112, 12, 196, 95, 225, 233, 112, 12, - 196, 95, 225, 196, 112, 12, 196, 95, 225, 201, 112, 12, 196, 95, 225, - 194, 112, 12, 196, 95, 225, 224, 112, 12, 196, 95, 225, 226, 112, 12, - 196, 95, 225, 204, 112, 12, 196, 95, 225, 215, 112, 12, 196, 95, 225, - 213, 112, 12, 196, 95, 225, 239, 112, 12, 196, 95, 225, 238, 112, 12, - 196, 95, 225, 192, 112, 12, 196, 95, 225, 219, 112, 12, 196, 95, 225, - 237, 112, 12, 196, 95, 225, 228, 112, 12, 196, 95, 225, 214, 112, 12, - 196, 95, 225, 193, 112, 12, 196, 95, 225, 216, 112, 12, 196, 95, 225, - 198, 112, 12, 196, 95, 225, 197, 112, 12, 196, 95, 225, 227, 112, 12, - 196, 95, 225, 205, 112, 12, 196, 95, 225, 207, 112, 12, 196, 95, 225, - 208, 112, 12, 196, 95, 225, 200, 112, 12, 196, 95, 225, 231, 112, 12, - 196, 95, 225, 225, 112, 12, 196, 95, 225, 191, 198, 42, 203, 103, 248, - 52, 12, 196, 95, 225, 206, 198, 42, 203, 103, 248, 52, 12, 196, 95, 225, - 238, 198, 42, 203, 103, 248, 52, 12, 196, 95, 225, 236, 198, 42, 203, - 103, 248, 52, 12, 196, 95, 225, 220, 198, 42, 203, 103, 248, 52, 12, 196, - 95, 225, 203, 198, 42, 203, 103, 248, 52, 12, 196, 95, 225, 216, 198, 42, - 203, 103, 248, 52, 12, 196, 95, 225, 199, 198, 42, 203, 103, 248, 52, 12, - 196, 95, 225, 230, 198, 42, 203, 103, 248, 52, 12, 196, 95, 225, 212, 47, - 228, 14, 252, 27, 47, 228, 14, 252, 58, 206, 113, 16, 40, 232, 86, 206, - 113, 16, 40, 218, 225, 206, 113, 16, 40, 203, 23, 206, 113, 16, 40, 192, - 207, 206, 113, 16, 40, 203, 2, 206, 113, 16, 40, 247, 148, 238, 139, 232, - 173, 242, 219, 196, 117, 213, 191, 4, 201, 99, 200, 193, 139, 215, 183, - 200, 192, 242, 251, 250, 183, 235, 61, 200, 191, 139, 247, 253, 207, 148, - 248, 29, 250, 183, 213, 190, 193, 144, 193, 138, 195, 14, 216, 52, 193, - 128, 234, 208, 231, 12, 233, 232, 234, 208, 231, 12, 251, 140, 234, 208, - 231, 12, 250, 202, 231, 12, 4, 216, 177, 214, 80, 215, 206, 113, 193, - 130, 238, 228, 215, 206, 113, 232, 238, 208, 23, 215, 206, 113, 193, 130, - 231, 49, 215, 206, 113, 232, 80, 215, 206, 113, 193, 159, 231, 49, 215, - 206, 113, 220, 6, 208, 23, 215, 206, 113, 193, 159, 238, 228, 215, 206, - 113, 238, 228, 215, 205, 214, 80, 215, 206, 4, 233, 103, 232, 238, 208, - 23, 215, 206, 4, 233, 103, 220, 6, 208, 23, 215, 206, 4, 233, 103, 232, - 80, 215, 206, 4, 233, 103, 200, 199, 4, 233, 103, 231, 8, 201, 102, 203, - 45, 201, 102, 199, 21, 62, 235, 97, 63, 200, 198, 63, 200, 199, 4, 2, - 242, 210, 63, 200, 199, 248, 242, 242, 210, 63, 200, 199, 248, 242, 242, - 211, 4, 207, 149, 242, 211, 4, 207, 149, 242, 211, 4, 202, 52, 242, 211, - 4, 219, 129, 242, 211, 4, 198, 46, 232, 174, 193, 67, 248, 116, 233, 103, - 228, 181, 236, 162, 199, 227, 247, 228, 243, 103, 205, 48, 233, 226, 197, - 254, 237, 139, 197, 254, 210, 183, 197, 254, 247, 153, 228, 181, 210, 15, - 197, 78, 243, 107, 248, 119, 206, 126, 229, 149, 200, 196, 248, 119, 234, - 212, 79, 217, 103, 234, 212, 79, 206, 245, 229, 193, 232, 128, 219, 234, - 242, 209, 217, 69, 219, 233, 233, 84, 219, 233, 219, 234, 232, 181, 223, - 163, 193, 66, 215, 98, 198, 83, 250, 162, 230, 218, 216, 196, 193, 142, - 199, 187, 219, 201, 249, 98, 209, 133, 207, 87, 251, 46, 230, 201, 251, - 46, 210, 55, 210, 59, 243, 108, 201, 42, 230, 63, 202, 89, 79, 209, 112, - 216, 225, 211, 105, 248, 98, 209, 9, 219, 212, 206, 246, 238, 234, 206, - 246, 249, 111, 239, 17, 206, 245, 238, 167, 23, 206, 245, 201, 83, 248, - 66, 201, 243, 248, 43, 232, 106, 232, 102, 206, 152, 200, 142, 209, 12, - 237, 235, 211, 153, 200, 165, 232, 103, 203, 13, 232, 237, 247, 147, 4, - 200, 134, 237, 80, 202, 32, 228, 27, 238, 232, 203, 121, 228, 26, 228, - 27, 238, 232, 235, 126, 239, 16, 243, 66, 164, 247, 118, 219, 24, 238, - 158, 228, 254, 209, 14, 203, 29, 248, 222, 248, 62, 209, 15, 79, 232, - 161, 239, 15, 232, 150, 23, 221, 78, 199, 133, 193, 51, 230, 31, 205, - 176, 248, 79, 23, 238, 181, 193, 63, 231, 16, 242, 94, 231, 16, 197, 204, - 235, 104, 248, 253, 215, 140, 242, 226, 248, 253, 215, 139, 249, 149, - 248, 78, 232, 150, 23, 221, 79, 4, 209, 97, 248, 79, 4, 209, 30, 239, 3, - 209, 32, 206, 247, 193, 11, 208, 222, 248, 157, 247, 146, 223, 29, 243, - 56, 197, 254, 233, 67, 243, 55, 232, 240, 232, 241, 201, 241, 249, 109, - 210, 102, 209, 31, 239, 54, 249, 111, 199, 191, 197, 254, 238, 214, 232, - 211, 209, 134, 237, 136, 223, 19, 236, 154, 247, 90, 201, 41, 193, 67, - 243, 82, 215, 206, 195, 54, 247, 8, 205, 90, 205, 120, 230, 225, 247, - 111, 229, 224, 4, 198, 136, 211, 105, 199, 34, 219, 224, 248, 72, 79, - 232, 185, 216, 54, 216, 219, 207, 58, 206, 247, 37, 221, 221, 4, 223, 28, - 201, 11, 216, 89, 219, 168, 202, 86, 239, 22, 221, 72, 249, 13, 250, 213, - 37, 213, 1, 249, 13, 237, 86, 37, 213, 1, 233, 0, 232, 112, 252, 31, 198, - 180, 247, 91, 228, 183, 233, 33, 193, 93, 206, 139, 242, 97, 232, 232, - 209, 53, 23, 232, 236, 216, 89, 215, 169, 247, 132, 243, 14, 229, 231, - 250, 224, 210, 188, 198, 54, 230, 9, 243, 0, 199, 87, 198, 181, 242, 242, - 248, 107, 210, 6, 250, 222, 195, 65, 231, 214, 236, 234, 229, 117, 202, - 79, 217, 148, 248, 170, 231, 215, 237, 24, 248, 65, 232, 187, 209, 95, - 247, 99, 37, 213, 6, 215, 129, 37, 213, 1, 205, 104, 230, 162, 37, 221, - 220, 197, 179, 195, 42, 37, 205, 82, 206, 42, 203, 60, 4, 205, 123, 199, - 92, 207, 170, 23, 249, 111, 202, 109, 23, 202, 109, 248, 91, 249, 68, 23, - 228, 247, 243, 109, 232, 217, 202, 51, 206, 43, 200, 170, 201, 202, 216, - 219, 197, 205, 228, 184, 207, 171, 251, 141, 232, 158, 206, 56, 232, 158, - 200, 137, 193, 110, 219, 134, 230, 249, 207, 172, 215, 191, 207, 172, - 247, 102, 238, 225, 249, 65, 23, 249, 111, 195, 13, 233, 22, 229, 12, - 201, 75, 23, 249, 111, 228, 27, 229, 12, 201, 75, 23, 208, 157, 199, 234, - 199, 92, 210, 207, 23, 249, 111, 202, 53, 247, 107, 215, 184, 247, 130, - 249, 16, 4, 196, 117, 247, 255, 239, 36, 228, 173, 247, 253, 242, 250, - 237, 90, 228, 173, 247, 254, 242, 240, 247, 254, 237, 82, 237, 83, 223, - 60, 214, 208, 210, 109, 201, 113, 228, 173, 247, 254, 228, 173, 4, 231, - 198, 211, 144, 247, 254, 223, 19, 209, 20, 211, 143, 233, 231, 209, 20, - 211, 143, 228, 182, 249, 92, 250, 151, 199, 102, 217, 148, 228, 178, 218, - 242, 228, 178, 239, 20, 201, 57, 205, 89, 237, 94, 201, 57, 233, 92, 223, - 40, 220, 18, 223, 19, 247, 80, 233, 231, 247, 80, 63, 210, 28, 62, 210, - 28, 193, 136, 63, 232, 217, 193, 136, 62, 232, 217, 206, 125, 62, 206, - 125, 220, 117, 249, 132, 207, 170, 23, 202, 244, 248, 70, 23, 57, 251, - 136, 234, 109, 52, 232, 227, 196, 253, 234, 109, 52, 232, 227, 196, 250, - 234, 109, 52, 232, 227, 196, 248, 234, 109, 52, 232, 227, 196, 246, 234, - 109, 52, 232, 227, 196, 244, 207, 130, 215, 181, 210, 247, 193, 144, 248, - 3, 238, 239, 198, 173, 219, 185, 207, 174, 247, 78, 235, 111, 238, 223, - 193, 96, 202, 60, 202, 58, 228, 183, 207, 142, 230, 255, 203, 107, 215, - 225, 206, 129, 243, 93, 236, 162, 209, 147, 248, 109, 234, 131, 211, 156, - 201, 218, 203, 102, 248, 2, 251, 89, 228, 253, 220, 108, 248, 251, 232, - 236, 197, 204, 232, 236, 248, 117, 197, 55, 230, 7, 243, 94, 249, 149, - 243, 94, 232, 96, 249, 149, 243, 94, 248, 160, 210, 30, 221, 61, 209, 36, - 235, 101, 247, 134, 249, 137, 247, 134, 236, 153, 215, 182, 233, 103, - 238, 240, 233, 103, 198, 174, 233, 103, 207, 175, 233, 103, 247, 79, 233, - 103, 235, 112, 233, 103, 201, 200, 193, 96, 228, 184, 233, 103, 215, 226, - 233, 103, 236, 163, 233, 103, 209, 148, 233, 103, 232, 100, 233, 103, - 230, 59, 233, 103, 193, 38, 233, 103, 249, 10, 233, 103, 210, 162, 233, - 103, 209, 148, 213, 13, 210, 76, 208, 208, 243, 77, 233, 185, 233, 193, - 234, 211, 213, 13, 215, 179, 198, 61, 63, 133, 209, 58, 249, 144, 223, - 148, 63, 144, 209, 58, 249, 144, 223, 148, 63, 45, 209, 58, 249, 144, - 223, 148, 63, 50, 209, 58, 249, 144, 223, 148, 232, 230, 230, 54, 56, - 193, 136, 230, 54, 56, 211, 126, 230, 54, 56, 198, 211, 133, 56, 198, - 211, 144, 56, 242, 241, 230, 29, 56, 211, 77, 230, 29, 56, 238, 208, 193, - 34, 230, 9, 233, 188, 214, 111, 200, 41, 223, 9, 235, 106, 221, 142, 248, - 173, 193, 34, 242, 212, 208, 137, 230, 33, 209, 10, 217, 78, 203, 52, - 250, 178, 203, 52, 229, 134, 203, 52, 193, 34, 205, 139, 193, 34, 248, - 90, 232, 156, 247, 220, 223, 163, 202, 187, 247, 219, 223, 163, 202, 187, - 248, 60, 231, 28, 217, 90, 193, 35, 233, 81, 217, 91, 23, 193, 36, 229, - 6, 230, 28, 105, 216, 187, 229, 6, 230, 28, 105, 193, 33, 229, 6, 230, - 28, 209, 50, 211, 142, 193, 36, 4, 247, 239, 234, 209, 248, 30, 4, 195, - 144, 209, 251, 4, 248, 121, 230, 78, 217, 91, 4, 230, 176, 209, 186, 217, - 73, 217, 91, 4, 197, 63, 211, 118, 217, 90, 211, 118, 193, 35, 249, 148, - 239, 37, 193, 19, 208, 213, 223, 19, 211, 137, 223, 19, 230, 254, 231, - 61, 249, 149, 251, 120, 233, 198, 251, 182, 251, 183, 215, 215, 223, 168, - 202, 103, 223, 137, 237, 79, 209, 250, 230, 170, 237, 240, 219, 95, 214, - 235, 209, 48, 233, 104, 217, 33, 230, 77, 249, 86, 209, 52, 200, 62, 209, - 140, 221, 123, 77, 218, 242, 219, 175, 206, 188, 231, 155, 201, 65, 221, - 122, 248, 71, 238, 243, 4, 229, 223, 193, 117, 249, 6, 229, 223, 248, 22, - 229, 223, 105, 229, 221, 201, 239, 229, 223, 230, 186, 229, 223, 229, - 224, 4, 57, 248, 115, 229, 223, 230, 201, 229, 223, 192, 73, 229, 223, - 208, 138, 229, 223, 229, 224, 4, 206, 247, 207, 12, 229, 221, 229, 224, - 237, 136, 237, 33, 203, 135, 4, 42, 75, 223, 117, 234, 135, 156, 247, - 251, 251, 119, 113, 248, 99, 202, 92, 113, 242, 85, 113, 201, 212, 200, - 144, 113, 235, 97, 237, 216, 113, 209, 141, 79, 209, 37, 232, 199, 248, - 185, 236, 195, 113, 201, 230, 249, 109, 198, 231, 249, 109, 63, 232, 186, - 228, 141, 209, 56, 113, 215, 230, 249, 130, 238, 170, 233, 218, 88, 236, - 155, 56, 238, 230, 247, 100, 249, 91, 4, 192, 71, 56, 249, 91, 4, 236, - 155, 56, 249, 91, 4, 233, 234, 56, 249, 91, 4, 209, 8, 56, 215, 230, 4, - 193, 60, 243, 137, 4, 196, 66, 197, 250, 23, 192, 71, 56, 205, 60, 209, - 249, 239, 59, 248, 28, 216, 41, 232, 191, 236, 220, 211, 60, 236, 226, - 235, 55, 233, 7, 232, 171, 211, 77, 233, 7, 232, 171, 210, 205, 4, 238, - 175, 210, 205, 233, 96, 196, 77, 247, 140, 199, 130, 247, 140, 247, 101, - 223, 148, 243, 137, 4, 196, 66, 197, 249, 243, 137, 4, 235, 119, 197, - 249, 249, 88, 243, 136, 242, 225, 208, 133, 206, 115, 208, 133, 210, 134, - 201, 53, 206, 50, 197, 238, 206, 50, 248, 95, 199, 232, 219, 229, 213, 4, - 213, 5, 4, 237, 135, 238, 242, 242, 219, 248, 96, 211, 77, 248, 96, 230, - 201, 248, 96, 248, 115, 248, 96, 211, 55, 248, 96, 248, 93, 214, 228, - 249, 134, 205, 73, 216, 188, 199, 107, 207, 101, 210, 203, 233, 64, 217, - 148, 205, 119, 251, 86, 208, 158, 252, 39, 218, 244, 243, 119, 216, 201, - 211, 13, 198, 2, 223, 159, 198, 2, 210, 212, 235, 8, 113, 223, 156, 234, - 67, 234, 68, 4, 235, 119, 64, 58, 242, 219, 217, 109, 4, 218, 235, 232, - 217, 242, 219, 217, 109, 4, 207, 147, 232, 217, 211, 77, 217, 109, 4, - 207, 147, 232, 217, 211, 77, 217, 109, 4, 218, 235, 232, 217, 209, 17, - 209, 18, 228, 187, 214, 75, 216, 4, 209, 194, 216, 4, 209, 195, 4, 96, - 64, 250, 183, 219, 224, 195, 68, 216, 3, 216, 4, 209, 195, 211, 145, 213, - 44, 216, 4, 209, 193, 251, 87, 4, 249, 76, 247, 132, 247, 133, 4, 232, - 208, 195, 65, 247, 132, 199, 104, 207, 165, 195, 64, 233, 0, 208, 193, - 209, 27, 201, 77, 208, 236, 249, 15, 197, 17, 96, 250, 231, 242, 221, 96, - 23, 118, 211, 77, 243, 11, 250, 231, 242, 221, 96, 23, 118, 211, 77, 243, - 11, 250, 232, 4, 47, 91, 210, 255, 242, 221, 235, 119, 23, 196, 66, 211, - 77, 243, 11, 250, 231, 251, 85, 235, 119, 23, 196, 66, 211, 77, 243, 11, - 250, 231, 130, 248, 26, 113, 137, 248, 26, 113, 201, 235, 4, 247, 125, - 106, 201, 234, 201, 235, 4, 91, 202, 5, 193, 138, 201, 235, 4, 115, 202, - 5, 193, 137, 249, 58, 234, 135, 209, 87, 219, 219, 217, 121, 231, 16, - 206, 203, 217, 121, 231, 16, 219, 35, 4, 223, 129, 210, 34, 242, 219, - 219, 35, 4, 221, 222, 221, 222, 219, 34, 211, 77, 219, 34, 248, 235, 248, - 236, 4, 247, 125, 106, 248, 94, 219, 103, 113, 207, 166, 247, 213, 249, - 147, 4, 118, 64, 58, 234, 95, 4, 118, 64, 58, 211, 105, 4, 233, 216, 87, - 4, 45, 50, 64, 58, 202, 15, 4, 96, 64, 58, 198, 54, 4, 196, 66, 64, 58, - 213, 44, 91, 196, 105, 234, 162, 113, 221, 219, 199, 95, 223, 123, 16, - 40, 8, 6, 219, 174, 223, 123, 16, 40, 8, 2, 219, 174, 223, 123, 16, 40, - 212, 135, 223, 123, 16, 40, 200, 76, 223, 123, 16, 40, 8, 219, 174, 232, - 243, 234, 135, 198, 49, 193, 9, 230, 61, 212, 118, 23, 248, 101, 229, 13, - 209, 118, 216, 88, 199, 105, 238, 197, 249, 111, 202, 136, 209, 60, 201, - 103, 4, 82, 236, 140, 223, 19, 16, 40, 248, 248, 197, 236, 234, 111, 62, - 51, 247, 213, 63, 51, 247, 213, 220, 13, 207, 87, 243, 10, 220, 13, 248, - 115, 243, 10, 220, 13, 211, 55, 237, 32, 220, 13, 248, 115, 237, 32, 2, - 211, 55, 237, 32, 2, 248, 115, 237, 32, 196, 76, 207, 87, 197, 241, 235, - 122, 207, 87, 197, 241, 196, 76, 2, 207, 87, 197, 241, 235, 122, 2, 207, - 87, 197, 241, 110, 50, 203, 151, 63, 243, 10, 116, 50, 203, 151, 63, 243, - 10, 47, 238, 218, 209, 41, 238, 218, 209, 42, 4, 230, 67, 60, 238, 218, - 209, 41, 213, 8, 45, 204, 28, 4, 115, 236, 138, 213, 8, 50, 204, 28, 4, - 115, 236, 138, 16, 40, 217, 50, 246, 242, 63, 8, 238, 217, 88, 8, 238, - 217, 247, 26, 238, 217, 211, 114, 113, 235, 125, 79, 210, 60, 222, 125, - 215, 197, 200, 70, 216, 183, 4, 213, 175, 248, 46, 248, 67, 79, 228, 90, - 242, 223, 233, 104, 91, 211, 162, 242, 223, 233, 104, 105, 211, 162, 242, - 223, 233, 104, 115, 211, 162, 242, 223, 233, 104, 232, 128, 211, 162, - 242, 223, 233, 104, 232, 226, 211, 162, 242, 223, 233, 104, 202, 136, - 211, 162, 242, 223, 233, 104, 203, 247, 211, 162, 242, 223, 233, 104, - 234, 164, 211, 162, 242, 223, 233, 104, 213, 175, 211, 162, 242, 223, - 233, 104, 199, 96, 211, 162, 242, 223, 233, 104, 234, 128, 211, 162, 242, - 223, 233, 104, 197, 38, 211, 162, 242, 223, 233, 104, 211, 97, 242, 223, - 233, 104, 197, 11, 242, 223, 233, 104, 198, 217, 242, 223, 233, 104, 232, - 124, 242, 223, 233, 104, 232, 223, 242, 223, 233, 104, 202, 132, 242, - 223, 233, 104, 203, 246, 242, 223, 233, 104, 234, 163, 242, 223, 233, - 104, 213, 173, 242, 223, 233, 104, 199, 94, 242, 223, 233, 104, 234, 126, - 242, 223, 233, 104, 197, 36, 50, 201, 234, 50, 201, 235, 4, 91, 202, 5, - 193, 138, 50, 201, 235, 4, 115, 202, 5, 193, 137, 247, 246, 247, 247, 4, - 202, 5, 193, 137, 206, 186, 248, 235, 248, 96, 247, 123, 217, 75, 242, - 222, 62, 202, 104, 23, 238, 215, 213, 44, 209, 124, 229, 5, 217, 91, 223, - 163, 247, 222, 200, 212, 219, 165, 202, 90, 211, 57, 201, 191, 237, 221, - 200, 194, 201, 221, 201, 222, 193, 118, 222, 183, 217, 91, 237, 239, 45, - 230, 54, 199, 107, 207, 101, 199, 107, 207, 102, 4, 210, 204, 50, 230, - 54, 199, 107, 207, 101, 63, 198, 34, 199, 106, 62, 198, 34, 199, 106, - 199, 107, 211, 105, 198, 54, 79, 216, 0, 242, 245, 216, 4, 209, 194, 249, - 147, 79, 234, 67, 201, 109, 234, 67, 234, 68, 4, 219, 129, 232, 178, 234, - 67, 210, 35, 139, 201, 109, 234, 67, 219, 102, 210, 133, 62, 208, 133, - 110, 45, 210, 33, 110, 45, 249, 105, 210, 34, 110, 45, 232, 130, 210, 34, - 110, 45, 210, 197, 110, 45, 238, 233, 45, 193, 3, 230, 53, 153, 211, 126, - 230, 54, 56, 207, 147, 230, 54, 4, 232, 248, 201, 211, 207, 18, 207, 147, - 230, 54, 4, 232, 248, 201, 211, 207, 18, 198, 211, 133, 56, 207, 18, 198, - 211, 144, 56, 207, 18, 195, 67, 230, 53, 207, 18, 230, 54, 4, 82, 232, - 253, 233, 204, 207, 147, 230, 54, 4, 210, 107, 248, 210, 82, 23, 206, - 189, 232, 247, 63, 144, 209, 58, 45, 230, 54, 223, 148, 202, 206, 63, 45, - 209, 58, 223, 148, 202, 206, 63, 50, 209, 58, 223, 148, 202, 206, 62, 45, - 209, 58, 223, 148, 202, 206, 62, 50, 209, 58, 223, 148, 62, 45, 209, 58, - 249, 144, 223, 148, 62, 50, 209, 58, 249, 144, 223, 148, 202, 206, 63, - 133, 209, 58, 223, 148, 202, 206, 63, 144, 209, 58, 223, 148, 202, 206, - 62, 133, 209, 58, 223, 148, 202, 206, 62, 144, 209, 58, 223, 148, 62, - 133, 209, 58, 249, 144, 223, 148, 62, 144, 209, 58, 249, 144, 223, 148, - 62, 229, 223, 237, 78, 239, 59, 221, 221, 23, 215, 181, 115, 214, 84, - 239, 58, 208, 209, 209, 71, 247, 142, 62, 230, 17, 203, 103, 232, 191, - 236, 220, 63, 230, 17, 203, 103, 232, 191, 236, 220, 202, 32, 203, 103, - 232, 191, 236, 220, 199, 182, 247, 84, 193, 55, 221, 220, 91, 247, 214, - 215, 181, 105, 247, 214, 215, 181, 115, 247, 214, 215, 181, 198, 24, 39, - 209, 249, 239, 59, 230, 17, 236, 220, 205, 76, 208, 210, 228, 20, 233, - 64, 228, 20, 211, 60, 236, 227, 228, 20, 236, 168, 4, 199, 53, 236, 168, - 4, 199, 54, 23, 209, 177, 236, 168, 4, 209, 177, 232, 114, 4, 209, 177, - 232, 114, 4, 198, 150, 232, 114, 4, 251, 133, 192, 235, 62, 232, 171, - 232, 171, 211, 77, 232, 171, 247, 101, 141, 236, 204, 247, 101, 233, 7, - 248, 62, 233, 7, 247, 155, 234, 105, 213, 6, 234, 105, 213, 7, 210, 204, - 234, 105, 213, 7, 210, 210, 213, 6, 213, 7, 210, 204, 213, 7, 210, 210, - 234, 105, 236, 167, 234, 105, 210, 204, 234, 105, 210, 202, 236, 167, - 210, 204, 210, 202, 193, 148, 201, 218, 213, 7, 210, 210, 201, 218, 247, - 141, 210, 210, 237, 78, 193, 65, 216, 38, 217, 22, 211, 2, 242, 221, 50, - 23, 45, 204, 28, 250, 231, 247, 125, 192, 235, 223, 154, 232, 163, 202, - 116, 113, 237, 134, 232, 163, 202, 116, 113, 239, 60, 39, 221, 222, 206, - 140, 214, 75, 210, 205, 4, 47, 199, 53, 201, 67, 243, 136, 238, 15, 221, - 78, 219, 96, 201, 233, 229, 236, 223, 163, 202, 187, 115, 207, 120, 58, - 115, 207, 120, 60, 115, 207, 120, 219, 224, 115, 207, 120, 183, 45, 201, - 230, 248, 8, 50, 201, 230, 248, 8, 105, 201, 230, 248, 7, 115, 201, 230, - 248, 7, 45, 198, 231, 248, 8, 50, 198, 231, 248, 8, 45, 251, 119, 248, 8, - 50, 251, 119, 248, 8, 215, 210, 248, 8, 219, 130, 215, 210, 248, 8, 219, - 130, 215, 209, 249, 107, 111, 4, 249, 106, 249, 107, 27, 192, 235, 249, - 107, 111, 4, 27, 192, 235, 249, 107, 28, 27, 192, 235, 249, 107, 111, 4, - 28, 27, 192, 235, 156, 243, 126, 77, 249, 107, 111, 4, 28, 243, 125, 193, - 18, 217, 71, 215, 186, 232, 81, 198, 85, 198, 30, 201, 92, 79, 219, 144, - 202, 188, 79, 223, 20, 215, 167, 230, 196, 233, 103, 230, 196, 233, 104, - 4, 202, 64, 233, 185, 233, 104, 4, 199, 126, 79, 222, 185, 202, 64, 233, - 104, 4, 211, 77, 215, 179, 202, 64, 233, 104, 4, 211, 77, 215, 180, 23, - 202, 64, 233, 185, 202, 64, 233, 104, 4, 211, 77, 215, 180, 23, 242, 87, - 200, 143, 202, 64, 233, 104, 4, 211, 77, 215, 180, 23, 198, 171, 233, - 185, 202, 64, 233, 104, 4, 230, 66, 202, 64, 233, 104, 4, 228, 186, 193, - 57, 233, 103, 202, 64, 233, 104, 4, 202, 64, 233, 185, 233, 104, 205, - 109, 237, 114, 232, 161, 207, 61, 233, 103, 202, 64, 233, 104, 4, 229, - 222, 233, 185, 202, 64, 233, 104, 4, 200, 194, 202, 63, 233, 103, 214, - 82, 233, 103, 233, 206, 233, 103, 196, 111, 233, 103, 233, 104, 4, 242, - 87, 200, 143, 210, 26, 233, 103, 239, 51, 233, 103, 239, 52, 233, 103, - 221, 121, 233, 103, 233, 104, 198, 214, 42, 221, 122, 221, 121, 233, 104, - 4, 202, 64, 233, 185, 221, 121, 233, 104, 4, 242, 219, 233, 185, 233, - 104, 4, 201, 12, 198, 61, 233, 104, 4, 201, 12, 198, 62, 23, 193, 57, - 233, 193, 233, 104, 4, 201, 12, 198, 62, 23, 198, 171, 233, 185, 236, - 228, 233, 103, 193, 16, 233, 103, 251, 111, 233, 103, 209, 6, 233, 103, - 238, 199, 233, 103, 209, 253, 233, 103, 233, 104, 4, 219, 7, 79, 197, - 217, 236, 228, 247, 218, 207, 61, 233, 103, 232, 92, 233, 104, 4, 211, - 77, 215, 179, 251, 109, 233, 103, 233, 57, 233, 103, 193, 119, 233, 103, - 202, 91, 233, 103, 198, 130, 233, 103, 230, 197, 233, 103, 218, 245, 238, - 199, 233, 103, 233, 104, 4, 211, 77, 215, 179, 228, 130, 233, 103, 233, - 104, 4, 211, 77, 215, 180, 23, 242, 87, 200, 143, 233, 104, 205, 78, 223, - 163, 233, 58, 250, 190, 233, 103, 232, 183, 233, 103, 202, 92, 233, 103, - 236, 195, 233, 103, 233, 104, 193, 51, 215, 179, 233, 104, 4, 216, 216, - 217, 35, 230, 196, 247, 79, 233, 104, 4, 202, 64, 233, 185, 247, 79, 233, - 104, 4, 199, 126, 79, 222, 185, 202, 64, 247, 79, 233, 104, 4, 211, 77, - 215, 179, 202, 64, 247, 79, 233, 104, 4, 229, 222, 233, 185, 247, 79, - 233, 104, 4, 193, 1, 202, 65, 221, 121, 247, 79, 233, 104, 4, 242, 219, - 233, 185, 209, 6, 247, 79, 233, 103, 238, 199, 247, 79, 233, 103, 193, - 119, 247, 79, 233, 103, 202, 84, 232, 92, 233, 103, 202, 84, 202, 64, - 233, 103, 196, 72, 233, 103, 233, 104, 4, 206, 138, 233, 185, 233, 104, - 4, 213, 44, 230, 244, 231, 132, 233, 104, 4, 211, 126, 231, 132, 209, - 251, 248, 68, 237, 129, 205, 49, 215, 225, 229, 226, 215, 225, 201, 236, - 215, 225, 230, 20, 209, 251, 207, 145, 91, 230, 53, 209, 251, 207, 145, - 248, 80, 230, 29, 223, 163, 247, 28, 209, 251, 232, 91, 209, 251, 4, 209, - 6, 233, 103, 209, 251, 4, 232, 172, 230, 28, 186, 193, 105, 209, 58, 219, - 233, 202, 2, 193, 105, 209, 58, 219, 233, 186, 234, 204, 209, 58, 219, - 233, 202, 2, 234, 204, 209, 58, 219, 233, 153, 186, 193, 105, 209, 58, - 219, 233, 153, 202, 2, 193, 105, 209, 58, 219, 233, 153, 186, 234, 204, - 209, 58, 219, 233, 153, 202, 2, 234, 204, 209, 58, 219, 233, 186, 193, - 105, 209, 58, 195, 48, 219, 233, 202, 2, 193, 105, 209, 58, 195, 48, 219, - 233, 186, 234, 204, 209, 58, 195, 48, 219, 233, 202, 2, 234, 204, 209, - 58, 195, 48, 219, 233, 88, 186, 193, 105, 209, 58, 195, 48, 219, 233, 88, - 202, 2, 193, 105, 209, 58, 195, 48, 219, 233, 88, 186, 234, 204, 209, 58, - 195, 48, 219, 233, 88, 202, 2, 234, 204, 209, 58, 195, 48, 219, 233, 186, - 193, 105, 209, 58, 248, 4, 202, 2, 193, 105, 209, 58, 248, 4, 186, 234, - 204, 209, 58, 248, 4, 202, 2, 234, 204, 209, 58, 248, 4, 88, 186, 193, - 105, 209, 58, 248, 4, 88, 202, 2, 193, 105, 209, 58, 248, 4, 88, 186, - 234, 204, 209, 58, 248, 4, 88, 202, 2, 234, 204, 209, 58, 248, 4, 229, 4, - 208, 6, 51, 211, 42, 229, 4, 208, 6, 51, 211, 43, 223, 163, 62, 201, 190, - 202, 25, 208, 6, 51, 211, 42, 202, 25, 208, 6, 51, 211, 43, 223, 163, 62, - 201, 190, 118, 206, 146, 196, 66, 206, 146, 96, 206, 146, 235, 119, 206, - 146, 27, 34, 234, 0, 211, 42, 88, 27, 34, 234, 0, 211, 42, 34, 211, 77, - 234, 0, 211, 42, 88, 34, 211, 77, 234, 0, 211, 42, 88, 251, 138, 211, 42, - 200, 146, 251, 138, 211, 42, 49, 88, 55, 153, 242, 75, 207, 252, 87, 211, - 42, 49, 88, 55, 242, 75, 207, 252, 87, 211, 42, 49, 88, 130, 55, 242, 75, - 207, 252, 87, 211, 42, 88, 223, 103, 211, 42, 49, 223, 103, 211, 42, 88, - 49, 223, 103, 211, 42, 195, 83, 88, 202, 23, 195, 83, 88, 207, 19, 202, - 23, 243, 124, 248, 107, 207, 19, 243, 124, 248, 107, 206, 146, 229, 205, - 201, 85, 219, 32, 207, 152, 247, 102, 229, 131, 198, 16, 229, 131, 198, - 17, 4, 247, 249, 213, 13, 198, 16, 216, 158, 156, 207, 153, 201, 93, 198, - 14, 198, 15, 247, 102, 247, 223, 211, 101, 247, 223, 197, 212, 247, 224, - 201, 63, 216, 42, 251, 142, 232, 244, 234, 87, 209, 50, 247, 102, 211, - 101, 209, 50, 247, 102, 199, 155, 211, 101, 199, 155, 250, 150, 211, 101, - 250, 150, 207, 94, 195, 145, 237, 110, 197, 203, 250, 225, 218, 254, 198, - 23, 215, 218, 215, 185, 207, 151, 200, 164, 207, 151, 215, 185, 247, 154, - 252, 11, 198, 13, 203, 65, 206, 112, 201, 228, 228, 241, 198, 20, 219, - 132, 81, 198, 20, 219, 132, 239, 37, 56, 209, 50, 247, 86, 207, 12, 219, - 132, 197, 238, 232, 218, 211, 105, 209, 19, 236, 144, 213, 44, 234, 73, - 56, 202, 62, 113, 213, 44, 202, 62, 113, 208, 132, 219, 84, 223, 163, - 223, 50, 209, 108, 113, 236, 175, 213, 12, 219, 84, 113, 209, 13, 193, - 144, 113, 213, 28, 193, 144, 113, 248, 184, 213, 44, 248, 183, 248, 182, - 215, 185, 248, 182, 210, 51, 213, 44, 210, 50, 243, 85, 238, 209, 216, - 182, 113, 193, 32, 113, 207, 28, 249, 149, 113, 198, 86, 193, 144, 242, - 216, 203, 20, 249, 61, 249, 59, 210, 91, 239, 21, 238, 156, 249, 126, - 242, 246, 45, 218, 215, 197, 242, 4, 206, 113, 239, 0, 208, 196, 56, 47, - 223, 137, 202, 3, 248, 59, 113, 231, 27, 113, 238, 248, 23, 220, 25, 202, - 92, 252, 57, 203, 43, 249, 125, 248, 234, 248, 235, 249, 2, 209, 108, 79, - 193, 15, 211, 159, 56, 203, 43, 197, 213, 201, 8, 210, 201, 229, 127, - 199, 98, 228, 129, 234, 130, 193, 54, 209, 96, 202, 87, 193, 93, 206, - 189, 247, 233, 230, 62, 23, 193, 9, 203, 78, 211, 132, 235, 94, 215, 189, - 207, 152, 198, 25, 215, 192, 248, 106, 196, 76, 216, 54, 251, 223, 196, - 76, 251, 223, 196, 76, 2, 251, 223, 2, 251, 223, 213, 17, 251, 223, 251, - 224, 237, 93, 251, 224, 250, 238, 205, 118, 211, 101, 232, 244, 234, 87, - 237, 22, 219, 32, 210, 95, 203, 65, 205, 83, 215, 192, 205, 83, 247, 113, - 202, 94, 232, 178, 205, 113, 202, 111, 250, 152, 206, 243, 209, 178, 197, - 203, 206, 139, 202, 112, 160, 16, 40, 208, 2, 160, 16, 40, 251, 225, 160, - 16, 40, 232, 243, 160, 16, 40, 234, 207, 160, 16, 40, 193, 143, 160, 16, - 40, 251, 35, 160, 16, 40, 251, 36, 207, 81, 160, 16, 40, 251, 36, 207, - 80, 160, 16, 40, 251, 36, 195, 31, 160, 16, 40, 251, 36, 195, 30, 160, + 112, 8, 6, 1, 192, 159, 112, 8, 6, 1, 191, 166, 112, 228, 128, 112, 215, + 89, 112, 205, 71, 112, 201, 179, 112, 208, 250, 112, 193, 126, 214, 108, + 47, 8, 6, 1, 65, 214, 108, 47, 8, 6, 1, 250, 122, 214, 108, 47, 8, 6, 1, + 247, 195, 214, 108, 47, 8, 6, 1, 238, 129, 214, 108, 47, 8, 6, 1, 71, + 214, 108, 47, 8, 6, 1, 233, 177, 214, 108, 47, 8, 6, 1, 232, 53, 214, + 108, 47, 8, 6, 1, 230, 118, 214, 108, 47, 8, 6, 1, 68, 214, 108, 47, 8, + 6, 1, 223, 37, 214, 108, 47, 8, 6, 1, 222, 154, 214, 108, 47, 8, 6, 1, + 172, 214, 108, 47, 8, 6, 1, 218, 170, 214, 108, 47, 8, 6, 1, 215, 63, + 214, 108, 47, 8, 6, 1, 74, 214, 108, 47, 8, 6, 1, 210, 238, 214, 108, 47, + 8, 6, 1, 208, 106, 214, 108, 47, 8, 6, 1, 146, 214, 108, 47, 8, 6, 1, + 206, 9, 214, 108, 47, 8, 6, 1, 200, 43, 214, 108, 47, 8, 6, 1, 66, 214, + 108, 47, 8, 6, 1, 196, 12, 214, 108, 47, 8, 6, 1, 193, 224, 214, 108, 47, + 8, 6, 1, 192, 235, 214, 108, 47, 8, 6, 1, 192, 159, 214, 108, 47, 8, 6, + 1, 191, 166, 207, 149, 216, 241, 56, 207, 149, 216, 237, 56, 207, 149, + 215, 166, 56, 47, 247, 68, 47, 247, 196, 4, 211, 6, 249, 143, 47, 228, + 147, 233, 14, 214, 108, 112, 8, 6, 1, 65, 214, 108, 112, 8, 6, 1, 250, + 122, 214, 108, 112, 8, 6, 1, 247, 195, 214, 108, 112, 8, 6, 1, 238, 129, + 214, 108, 112, 8, 6, 1, 71, 214, 108, 112, 8, 6, 1, 233, 177, 214, 108, + 112, 8, 6, 1, 232, 53, 214, 108, 112, 8, 6, 1, 230, 118, 214, 108, 112, + 8, 6, 1, 68, 214, 108, 112, 8, 6, 1, 223, 37, 214, 108, 112, 8, 6, 1, + 222, 154, 214, 108, 112, 8, 6, 1, 172, 214, 108, 112, 8, 6, 1, 218, 170, + 214, 108, 112, 8, 6, 1, 215, 63, 214, 108, 112, 8, 6, 1, 74, 214, 108, + 112, 8, 6, 1, 210, 238, 214, 108, 112, 8, 6, 1, 208, 106, 214, 108, 112, + 8, 6, 1, 146, 214, 108, 112, 8, 6, 1, 206, 9, 214, 108, 112, 8, 6, 1, + 200, 43, 214, 108, 112, 8, 6, 1, 66, 214, 108, 112, 8, 6, 1, 196, 12, + 214, 108, 112, 8, 6, 1, 193, 224, 214, 108, 112, 8, 6, 1, 192, 235, 214, + 108, 112, 8, 6, 1, 192, 159, 214, 108, 112, 8, 6, 1, 191, 166, 238, 216, + 214, 108, 112, 8, 6, 1, 210, 238, 214, 108, 112, 228, 30, 214, 108, 112, + 168, 214, 108, 112, 188, 214, 108, 112, 252, 157, 214, 108, 112, 193, + 126, 51, 236, 196, 112, 242, 249, 112, 239, 16, 112, 232, 110, 112, 228, + 21, 112, 214, 81, 112, 214, 72, 112, 211, 127, 112, 202, 10, 112, 133, 4, + 233, 218, 77, 112, 194, 252, 112, 115, 238, 129, 112, 205, 58, 205, 77, + 112, 105, 222, 154, 112, 232, 130, 222, 154, 112, 234, 166, 222, 154, + 112, 232, 228, 209, 64, 107, 112, 203, 248, 209, 64, 107, 112, 197, 21, + 209, 64, 109, 112, 202, 122, 210, 238, 112, 91, 228, 143, 197, 33, 210, + 238, 112, 8, 2, 1, 238, 129, 112, 229, 250, 112, 229, 249, 112, 229, 152, + 112, 218, 254, 112, 202, 242, 112, 196, 140, 112, 195, 21, 217, 38, 193, + 21, 113, 207, 80, 223, 147, 16, 1, 65, 207, 80, 223, 147, 16, 1, 250, + 122, 207, 80, 223, 147, 16, 1, 247, 195, 207, 80, 223, 147, 16, 1, 238, + 129, 207, 80, 223, 147, 16, 1, 71, 207, 80, 223, 147, 16, 1, 233, 177, + 207, 80, 223, 147, 16, 1, 232, 53, 207, 80, 223, 147, 16, 1, 230, 118, + 207, 80, 223, 147, 16, 1, 68, 207, 80, 223, 147, 16, 1, 223, 37, 207, 80, + 223, 147, 16, 1, 222, 154, 207, 80, 223, 147, 16, 1, 172, 207, 80, 223, + 147, 16, 1, 218, 170, 207, 80, 223, 147, 16, 1, 215, 63, 207, 80, 223, + 147, 16, 1, 74, 207, 80, 223, 147, 16, 1, 210, 238, 207, 80, 223, 147, + 16, 1, 208, 106, 207, 80, 223, 147, 16, 1, 146, 207, 80, 223, 147, 16, 1, + 206, 9, 207, 80, 223, 147, 16, 1, 200, 43, 207, 80, 223, 147, 16, 1, 66, + 207, 80, 223, 147, 16, 1, 196, 12, 207, 80, 223, 147, 16, 1, 193, 224, + 207, 80, 223, 147, 16, 1, 192, 235, 207, 80, 223, 147, 16, 1, 192, 159, + 207, 80, 223, 147, 16, 1, 191, 166, 51, 229, 122, 229, 11, 112, 72, 221, + 51, 112, 72, 188, 112, 12, 196, 95, 225, 219, 112, 12, 196, 95, 225, 223, + 112, 12, 196, 95, 225, 231, 112, 72, 237, 148, 112, 12, 196, 95, 225, + 238, 112, 12, 196, 95, 225, 225, 112, 12, 196, 95, 225, 197, 112, 12, + 196, 95, 225, 224, 112, 12, 196, 95, 225, 237, 112, 12, 196, 95, 225, + 211, 112, 12, 196, 95, 225, 204, 112, 12, 196, 95, 225, 213, 112, 12, + 196, 95, 225, 234, 112, 12, 196, 95, 225, 220, 112, 12, 196, 95, 225, + 236, 112, 12, 196, 95, 225, 212, 112, 12, 196, 95, 225, 235, 112, 12, + 196, 95, 225, 198, 112, 12, 196, 95, 225, 203, 112, 12, 196, 95, 225, + 196, 112, 12, 196, 95, 225, 226, 112, 12, 196, 95, 225, 228, 112, 12, + 196, 95, 225, 206, 112, 12, 196, 95, 225, 217, 112, 12, 196, 95, 225, + 215, 112, 12, 196, 95, 225, 241, 112, 12, 196, 95, 225, 240, 112, 12, + 196, 95, 225, 194, 112, 12, 196, 95, 225, 221, 112, 12, 196, 95, 225, + 239, 112, 12, 196, 95, 225, 230, 112, 12, 196, 95, 225, 216, 112, 12, + 196, 95, 225, 195, 112, 12, 196, 95, 225, 218, 112, 12, 196, 95, 225, + 200, 112, 12, 196, 95, 225, 199, 112, 12, 196, 95, 225, 229, 112, 12, + 196, 95, 225, 207, 112, 12, 196, 95, 225, 209, 112, 12, 196, 95, 225, + 210, 112, 12, 196, 95, 225, 202, 112, 12, 196, 95, 225, 233, 112, 12, + 196, 95, 225, 227, 112, 12, 196, 95, 225, 193, 198, 42, 203, 104, 248, + 54, 12, 196, 95, 225, 208, 198, 42, 203, 104, 248, 54, 12, 196, 95, 225, + 240, 198, 42, 203, 104, 248, 54, 12, 196, 95, 225, 238, 198, 42, 203, + 104, 248, 54, 12, 196, 95, 225, 222, 198, 42, 203, 104, 248, 54, 12, 196, + 95, 225, 205, 198, 42, 203, 104, 248, 54, 12, 196, 95, 225, 218, 198, 42, + 203, 104, 248, 54, 12, 196, 95, 225, 201, 198, 42, 203, 104, 248, 54, 12, + 196, 95, 225, 232, 198, 42, 203, 104, 248, 54, 12, 196, 95, 225, 214, 47, + 228, 16, 252, 29, 47, 228, 16, 252, 60, 206, 114, 16, 40, 232, 88, 206, + 114, 16, 40, 218, 227, 206, 114, 16, 40, 203, 24, 206, 114, 16, 40, 192, + 207, 206, 114, 16, 40, 203, 3, 206, 114, 16, 40, 247, 150, 238, 141, 232, + 175, 242, 221, 196, 117, 213, 193, 4, 201, 100, 200, 193, 139, 215, 185, + 200, 192, 242, 253, 250, 185, 235, 63, 200, 191, 139, 247, 255, 207, 150, + 248, 31, 250, 185, 213, 192, 193, 144, 193, 138, 195, 14, 216, 54, 193, + 128, 234, 210, 231, 14, 233, 234, 234, 210, 231, 14, 251, 142, 234, 210, + 231, 14, 250, 204, 231, 14, 4, 216, 179, 214, 82, 215, 208, 113, 193, + 130, 238, 230, 215, 208, 113, 232, 240, 208, 25, 215, 208, 113, 193, 130, + 231, 51, 215, 208, 113, 232, 82, 215, 208, 113, 193, 159, 231, 51, 215, + 208, 113, 220, 8, 208, 25, 215, 208, 113, 193, 159, 238, 230, 215, 208, + 113, 238, 230, 215, 207, 214, 82, 215, 208, 4, 233, 105, 232, 240, 208, + 25, 215, 208, 4, 233, 105, 220, 8, 208, 25, 215, 208, 4, 233, 105, 232, + 82, 215, 208, 4, 233, 105, 200, 199, 4, 233, 105, 231, 10, 201, 103, 203, + 46, 201, 103, 199, 21, 62, 235, 99, 63, 200, 198, 63, 200, 199, 4, 2, + 242, 212, 63, 200, 199, 248, 244, 242, 212, 63, 200, 199, 248, 244, 242, + 213, 4, 207, 151, 242, 213, 4, 207, 151, 242, 213, 4, 202, 53, 242, 213, + 4, 219, 131, 242, 213, 4, 198, 46, 232, 176, 193, 67, 248, 118, 233, 105, + 228, 183, 236, 164, 199, 227, 247, 230, 243, 105, 205, 49, 233, 228, 197, + 254, 237, 141, 197, 254, 210, 185, 197, 254, 247, 155, 228, 183, 210, 17, + 197, 78, 243, 109, 248, 121, 206, 127, 229, 151, 200, 196, 248, 121, 234, + 214, 79, 217, 105, 234, 214, 79, 206, 246, 229, 195, 232, 130, 219, 236, + 242, 211, 217, 71, 219, 235, 233, 86, 219, 235, 219, 236, 232, 183, 223, + 165, 193, 66, 215, 100, 198, 83, 250, 164, 230, 220, 216, 198, 193, 142, + 199, 187, 219, 203, 249, 100, 209, 135, 207, 89, 251, 48, 230, 203, 251, + 48, 210, 57, 210, 61, 243, 110, 201, 43, 230, 65, 202, 90, 79, 209, 114, + 216, 227, 211, 107, 248, 100, 209, 11, 219, 214, 206, 247, 238, 236, 206, + 247, 249, 113, 239, 19, 206, 246, 238, 169, 23, 206, 246, 201, 84, 248, + 68, 201, 244, 248, 45, 232, 108, 232, 104, 206, 153, 200, 142, 209, 14, + 237, 237, 211, 155, 200, 165, 232, 105, 203, 14, 232, 239, 247, 149, 4, + 200, 134, 237, 82, 202, 33, 228, 29, 238, 234, 203, 122, 228, 28, 228, + 29, 238, 234, 235, 128, 239, 18, 243, 68, 164, 247, 120, 219, 26, 238, + 160, 229, 0, 209, 16, 203, 30, 248, 224, 248, 64, 209, 17, 79, 232, 163, + 239, 17, 232, 152, 23, 221, 80, 199, 133, 193, 51, 230, 33, 205, 177, + 248, 81, 23, 238, 183, 193, 63, 231, 18, 242, 96, 231, 18, 197, 204, 235, + 106, 248, 255, 215, 142, 242, 228, 248, 255, 215, 141, 249, 151, 248, 80, + 232, 152, 23, 221, 81, 4, 209, 99, 248, 81, 4, 209, 32, 239, 5, 209, 34, + 206, 248, 193, 11, 208, 224, 248, 159, 247, 148, 223, 31, 243, 58, 197, + 254, 233, 69, 243, 57, 232, 242, 232, 243, 201, 242, 249, 111, 210, 104, + 209, 33, 239, 56, 249, 113, 199, 191, 197, 254, 238, 216, 232, 213, 209, + 136, 237, 138, 223, 21, 236, 156, 247, 92, 201, 42, 193, 67, 243, 84, + 215, 208, 195, 54, 247, 10, 205, 91, 205, 121, 230, 227, 247, 113, 229, + 226, 4, 198, 136, 211, 107, 199, 34, 219, 226, 248, 74, 79, 232, 187, + 216, 56, 216, 221, 207, 59, 206, 248, 37, 221, 223, 4, 223, 30, 201, 12, + 216, 91, 219, 170, 202, 87, 239, 24, 221, 74, 249, 15, 250, 215, 37, 213, + 3, 249, 15, 237, 88, 37, 213, 3, 233, 2, 232, 114, 252, 33, 198, 180, + 247, 93, 228, 185, 233, 35, 193, 93, 206, 140, 242, 99, 232, 234, 209, + 55, 23, 232, 238, 216, 91, 215, 171, 247, 134, 243, 16, 229, 233, 250, + 226, 210, 190, 198, 54, 230, 11, 243, 2, 199, 87, 198, 181, 242, 244, + 248, 109, 210, 8, 250, 224, 195, 65, 231, 216, 236, 236, 229, 119, 202, + 80, 217, 150, 248, 172, 231, 217, 237, 26, 248, 67, 232, 189, 209, 97, + 247, 101, 37, 213, 8, 215, 131, 37, 213, 3, 205, 105, 230, 164, 37, 221, + 222, 197, 179, 195, 42, 37, 205, 83, 206, 43, 203, 61, 4, 205, 124, 199, + 92, 207, 172, 23, 249, 113, 202, 110, 23, 202, 110, 248, 93, 249, 70, 23, + 228, 249, 243, 111, 232, 219, 202, 52, 206, 44, 200, 170, 201, 203, 216, + 221, 197, 205, 228, 186, 207, 173, 251, 143, 232, 160, 206, 57, 232, 160, + 200, 137, 193, 110, 219, 136, 230, 251, 207, 174, 215, 193, 207, 174, + 247, 104, 238, 227, 249, 67, 23, 249, 113, 195, 13, 233, 24, 229, 14, + 201, 76, 23, 249, 113, 228, 29, 229, 14, 201, 76, 23, 208, 159, 199, 234, + 199, 92, 210, 209, 23, 249, 113, 202, 54, 247, 109, 215, 186, 247, 132, + 249, 18, 4, 196, 117, 248, 1, 239, 38, 228, 175, 247, 255, 242, 252, 237, + 92, 228, 175, 248, 0, 242, 242, 248, 0, 237, 84, 237, 85, 223, 62, 214, + 210, 210, 111, 201, 114, 228, 175, 248, 0, 228, 175, 4, 231, 200, 211, + 146, 248, 0, 223, 21, 209, 22, 211, 145, 233, 233, 209, 22, 211, 145, + 228, 184, 249, 94, 250, 153, 199, 102, 217, 150, 228, 180, 218, 244, 228, + 180, 239, 22, 201, 58, 205, 90, 237, 96, 201, 58, 233, 94, 223, 42, 220, + 20, 223, 21, 247, 82, 233, 233, 247, 82, 63, 210, 30, 62, 210, 30, 193, + 136, 63, 232, 219, 193, 136, 62, 232, 219, 206, 126, 62, 206, 126, 220, + 119, 249, 134, 207, 172, 23, 202, 245, 248, 72, 23, 57, 251, 138, 234, + 111, 52, 232, 229, 196, 253, 234, 111, 52, 232, 229, 196, 250, 234, 111, + 52, 232, 229, 196, 248, 234, 111, 52, 232, 229, 196, 246, 234, 111, 52, + 232, 229, 196, 244, 207, 132, 215, 183, 210, 249, 193, 144, 248, 5, 238, + 241, 198, 173, 219, 187, 207, 176, 247, 80, 235, 113, 238, 225, 193, 96, + 202, 61, 202, 59, 228, 185, 207, 144, 231, 1, 203, 108, 215, 227, 206, + 130, 243, 95, 236, 164, 209, 149, 248, 111, 234, 133, 211, 158, 201, 219, + 203, 103, 248, 4, 251, 91, 228, 255, 220, 110, 248, 253, 232, 238, 197, + 204, 232, 238, 248, 119, 197, 55, 230, 9, 243, 96, 249, 151, 243, 96, + 232, 98, 249, 151, 243, 96, 248, 162, 210, 32, 221, 63, 209, 38, 235, + 103, 247, 136, 249, 139, 247, 136, 236, 155, 215, 184, 233, 105, 238, + 242, 233, 105, 198, 174, 233, 105, 207, 177, 233, 105, 247, 81, 233, 105, + 235, 114, 233, 105, 201, 201, 193, 96, 228, 186, 233, 105, 215, 228, 233, + 105, 236, 165, 233, 105, 209, 150, 233, 105, 232, 102, 233, 105, 230, 61, + 233, 105, 193, 38, 233, 105, 249, 12, 233, 105, 210, 164, 233, 105, 209, + 150, 213, 15, 210, 78, 208, 210, 243, 79, 233, 187, 233, 195, 234, 213, + 213, 15, 215, 181, 198, 61, 63, 133, 209, 60, 249, 146, 223, 150, 63, + 144, 209, 60, 249, 146, 223, 150, 63, 45, 209, 60, 249, 146, 223, 150, + 63, 50, 209, 60, 249, 146, 223, 150, 232, 232, 230, 56, 56, 193, 136, + 230, 56, 56, 211, 128, 230, 56, 56, 198, 211, 133, 56, 198, 211, 144, 56, + 242, 243, 230, 31, 56, 211, 79, 230, 31, 56, 238, 210, 193, 34, 230, 11, + 233, 190, 214, 113, 200, 41, 223, 11, 235, 108, 221, 144, 248, 175, 193, + 34, 242, 214, 208, 139, 230, 35, 209, 12, 217, 80, 203, 53, 250, 180, + 203, 53, 229, 136, 203, 53, 193, 34, 205, 140, 193, 34, 248, 92, 232, + 158, 247, 222, 223, 165, 202, 188, 247, 221, 223, 165, 202, 188, 248, 62, + 231, 30, 217, 92, 193, 35, 233, 83, 217, 93, 23, 193, 36, 229, 8, 230, + 30, 105, 216, 189, 229, 8, 230, 30, 105, 193, 33, 229, 8, 230, 30, 209, + 52, 211, 144, 193, 36, 4, 247, 241, 234, 211, 248, 32, 4, 195, 144, 209, + 253, 4, 248, 123, 230, 80, 217, 93, 4, 230, 178, 209, 188, 217, 75, 217, + 93, 4, 197, 63, 211, 120, 217, 92, 211, 120, 193, 35, 249, 150, 239, 39, + 193, 19, 208, 215, 223, 21, 211, 139, 223, 21, 231, 0, 231, 63, 249, 151, + 251, 122, 233, 200, 251, 184, 251, 185, 215, 217, 223, 170, 202, 104, + 223, 139, 237, 81, 209, 252, 230, 172, 237, 242, 219, 97, 214, 237, 209, + 50, 233, 106, 217, 35, 230, 79, 249, 88, 209, 54, 200, 62, 209, 142, 221, + 125, 77, 218, 244, 219, 177, 206, 189, 231, 157, 201, 66, 221, 124, 248, + 73, 238, 245, 4, 229, 225, 193, 117, 249, 8, 229, 225, 248, 24, 229, 225, + 105, 229, 223, 201, 240, 229, 225, 230, 188, 229, 225, 229, 226, 4, 57, + 248, 117, 229, 225, 230, 203, 229, 225, 192, 73, 229, 225, 208, 140, 229, + 225, 229, 226, 4, 206, 248, 207, 13, 229, 223, 229, 226, 237, 138, 237, + 35, 203, 136, 4, 42, 75, 223, 119, 234, 137, 156, 247, 253, 251, 121, + 113, 248, 101, 202, 93, 113, 242, 87, 113, 201, 213, 200, 144, 113, 235, + 99, 237, 218, 113, 209, 143, 79, 209, 39, 232, 201, 248, 187, 236, 197, + 113, 201, 231, 249, 111, 198, 231, 249, 111, 63, 232, 188, 228, 143, 209, + 58, 113, 215, 232, 249, 132, 238, 172, 233, 220, 88, 236, 157, 56, 238, + 232, 247, 102, 249, 93, 4, 192, 71, 56, 249, 93, 4, 236, 157, 56, 249, + 93, 4, 233, 236, 56, 249, 93, 4, 209, 10, 56, 215, 232, 4, 193, 60, 243, + 139, 4, 196, 66, 197, 250, 23, 192, 71, 56, 205, 61, 209, 251, 239, 61, + 248, 30, 216, 43, 232, 193, 236, 222, 211, 62, 236, 228, 235, 57, 233, 9, + 232, 173, 211, 79, 233, 9, 232, 173, 210, 207, 4, 238, 177, 210, 207, + 233, 98, 196, 77, 247, 142, 199, 130, 247, 142, 247, 103, 223, 150, 243, + 139, 4, 196, 66, 197, 249, 243, 139, 4, 235, 121, 197, 249, 249, 90, 243, + 138, 242, 227, 208, 135, 206, 116, 208, 135, 210, 136, 201, 54, 206, 51, + 197, 238, 206, 51, 248, 97, 199, 232, 219, 231, 213, 6, 213, 7, 4, 237, + 137, 238, 244, 242, 221, 248, 98, 211, 79, 248, 98, 230, 203, 248, 98, + 248, 117, 248, 98, 211, 57, 248, 98, 248, 95, 214, 230, 249, 136, 205, + 74, 216, 190, 199, 107, 207, 103, 210, 205, 233, 66, 217, 150, 205, 120, + 251, 88, 208, 160, 252, 41, 218, 246, 243, 121, 216, 203, 211, 15, 198, + 2, 223, 161, 198, 2, 210, 214, 235, 10, 113, 223, 158, 234, 69, 234, 70, + 4, 235, 121, 64, 58, 242, 221, 217, 111, 4, 218, 237, 232, 219, 242, 221, + 217, 111, 4, 207, 149, 232, 219, 211, 79, 217, 111, 4, 207, 149, 232, + 219, 211, 79, 217, 111, 4, 218, 237, 232, 219, 209, 19, 209, 20, 228, + 189, 214, 77, 216, 6, 209, 196, 216, 6, 209, 197, 4, 96, 64, 250, 185, + 219, 226, 195, 68, 216, 5, 216, 6, 209, 197, 211, 147, 213, 46, 216, 6, + 209, 195, 251, 89, 4, 249, 78, 247, 134, 247, 135, 4, 232, 210, 195, 65, + 247, 134, 199, 104, 207, 167, 195, 64, 233, 2, 208, 195, 209, 29, 201, + 78, 208, 238, 249, 17, 197, 17, 96, 250, 233, 242, 223, 96, 23, 118, 211, + 79, 243, 13, 250, 233, 242, 223, 96, 23, 118, 211, 79, 243, 13, 250, 234, + 4, 47, 91, 211, 1, 242, 223, 235, 121, 23, 196, 66, 211, 79, 243, 13, + 250, 233, 251, 87, 235, 121, 23, 196, 66, 211, 79, 243, 13, 250, 233, + 130, 248, 28, 113, 137, 248, 28, 113, 201, 236, 4, 247, 127, 106, 201, + 235, 201, 236, 4, 91, 202, 6, 193, 138, 201, 236, 4, 115, 202, 6, 193, + 137, 249, 60, 234, 137, 209, 89, 219, 221, 217, 123, 231, 18, 206, 204, + 217, 123, 231, 18, 219, 37, 4, 223, 131, 210, 36, 242, 221, 219, 37, 4, + 221, 224, 221, 224, 219, 36, 211, 79, 219, 36, 248, 237, 248, 238, 4, + 247, 127, 106, 248, 96, 219, 105, 113, 207, 168, 247, 215, 249, 149, 4, + 118, 64, 58, 234, 97, 4, 118, 64, 58, 211, 107, 4, 233, 218, 87, 4, 45, + 50, 64, 58, 202, 16, 4, 96, 64, 58, 198, 54, 4, 196, 66, 64, 58, 213, 46, + 91, 196, 105, 234, 164, 113, 221, 221, 199, 95, 223, 125, 16, 40, 8, 6, + 219, 176, 223, 125, 16, 40, 8, 2, 219, 176, 223, 125, 16, 40, 212, 137, + 223, 125, 16, 40, 200, 76, 223, 125, 16, 40, 8, 219, 176, 232, 245, 234, + 137, 198, 49, 193, 9, 230, 63, 212, 120, 23, 248, 103, 229, 15, 209, 120, + 216, 90, 199, 105, 238, 199, 249, 113, 202, 137, 209, 62, 201, 104, 4, + 82, 236, 142, 223, 21, 16, 40, 248, 250, 197, 236, 234, 113, 62, 51, 247, + 215, 63, 51, 247, 215, 220, 15, 207, 89, 243, 12, 220, 15, 248, 117, 243, + 12, 220, 15, 211, 57, 237, 34, 220, 15, 248, 117, 237, 34, 2, 211, 57, + 237, 34, 2, 248, 117, 237, 34, 196, 76, 207, 89, 197, 241, 235, 124, 207, + 89, 197, 241, 196, 76, 2, 207, 89, 197, 241, 235, 124, 2, 207, 89, 197, + 241, 110, 50, 203, 152, 63, 243, 12, 116, 50, 203, 152, 63, 243, 12, 47, + 238, 220, 209, 43, 238, 220, 209, 44, 4, 230, 69, 60, 238, 220, 209, 43, + 213, 10, 45, 204, 29, 4, 115, 236, 140, 213, 10, 50, 204, 29, 4, 115, + 236, 140, 16, 40, 217, 52, 246, 244, 63, 8, 238, 219, 88, 8, 238, 219, + 247, 28, 238, 219, 211, 116, 113, 235, 127, 79, 210, 62, 222, 127, 215, + 199, 200, 70, 216, 185, 4, 213, 177, 248, 48, 248, 69, 79, 228, 92, 242, + 225, 233, 106, 91, 211, 164, 242, 225, 233, 106, 105, 211, 164, 242, 225, + 233, 106, 115, 211, 164, 242, 225, 233, 106, 232, 130, 211, 164, 242, + 225, 233, 106, 232, 228, 211, 164, 242, 225, 233, 106, 202, 137, 211, + 164, 242, 225, 233, 106, 203, 248, 211, 164, 242, 225, 233, 106, 234, + 166, 211, 164, 242, 225, 233, 106, 213, 177, 211, 164, 242, 225, 233, + 106, 199, 96, 211, 164, 242, 225, 233, 106, 234, 130, 211, 164, 242, 225, + 233, 106, 197, 38, 211, 164, 242, 225, 233, 106, 211, 99, 242, 225, 233, + 106, 197, 11, 242, 225, 233, 106, 198, 217, 242, 225, 233, 106, 232, 126, + 242, 225, 233, 106, 232, 225, 242, 225, 233, 106, 202, 133, 242, 225, + 233, 106, 203, 247, 242, 225, 233, 106, 234, 165, 242, 225, 233, 106, + 213, 175, 242, 225, 233, 106, 199, 94, 242, 225, 233, 106, 234, 128, 242, + 225, 233, 106, 197, 36, 50, 201, 235, 50, 201, 236, 4, 91, 202, 6, 193, + 138, 50, 201, 236, 4, 115, 202, 6, 193, 137, 247, 248, 247, 249, 4, 202, + 6, 193, 137, 206, 187, 248, 237, 248, 98, 247, 125, 217, 77, 242, 224, + 62, 202, 105, 23, 238, 217, 213, 46, 209, 126, 229, 7, 217, 93, 223, 165, + 247, 224, 200, 212, 219, 167, 202, 91, 211, 59, 201, 192, 237, 223, 200, + 194, 201, 222, 201, 223, 193, 118, 222, 185, 217, 93, 237, 241, 45, 230, + 56, 199, 107, 207, 103, 199, 107, 207, 104, 4, 210, 206, 50, 230, 56, + 199, 107, 207, 103, 63, 198, 34, 199, 106, 62, 198, 34, 199, 106, 199, + 107, 211, 107, 198, 54, 79, 216, 2, 242, 247, 216, 6, 209, 196, 249, 149, + 79, 234, 69, 201, 110, 234, 69, 234, 70, 4, 219, 131, 232, 180, 234, 69, + 210, 37, 139, 201, 110, 234, 69, 219, 104, 210, 135, 62, 208, 135, 110, + 45, 210, 35, 110, 45, 249, 107, 210, 36, 110, 45, 232, 132, 210, 36, 110, + 45, 210, 199, 110, 45, 238, 235, 45, 193, 3, 230, 55, 154, 211, 128, 230, + 56, 56, 207, 149, 230, 56, 4, 232, 250, 201, 212, 207, 19, 207, 149, 230, + 56, 4, 232, 250, 201, 212, 207, 19, 198, 211, 133, 56, 207, 19, 198, 211, + 144, 56, 207, 19, 195, 67, 230, 55, 207, 19, 230, 56, 4, 82, 232, 255, + 233, 206, 207, 149, 230, 56, 4, 210, 109, 248, 212, 82, 23, 206, 190, + 232, 249, 63, 144, 209, 60, 45, 230, 56, 223, 150, 202, 207, 63, 45, 209, + 60, 223, 150, 202, 207, 63, 50, 209, 60, 223, 150, 202, 207, 62, 45, 209, + 60, 223, 150, 202, 207, 62, 50, 209, 60, 223, 150, 62, 45, 209, 60, 249, + 146, 223, 150, 62, 50, 209, 60, 249, 146, 223, 150, 202, 207, 63, 133, + 209, 60, 223, 150, 202, 207, 63, 144, 209, 60, 223, 150, 202, 207, 62, + 133, 209, 60, 223, 150, 202, 207, 62, 144, 209, 60, 223, 150, 62, 133, + 209, 60, 249, 146, 223, 150, 62, 144, 209, 60, 249, 146, 223, 150, 62, + 229, 225, 237, 80, 239, 61, 221, 223, 23, 215, 183, 115, 214, 86, 239, + 60, 208, 211, 209, 73, 247, 144, 62, 230, 19, 203, 104, 232, 193, 236, + 222, 63, 230, 19, 203, 104, 232, 193, 236, 222, 202, 33, 203, 104, 232, + 193, 236, 222, 199, 182, 247, 86, 193, 55, 221, 222, 91, 247, 216, 215, + 183, 105, 247, 216, 215, 183, 115, 247, 216, 215, 183, 198, 24, 39, 209, + 251, 239, 61, 230, 19, 236, 222, 205, 77, 208, 212, 228, 22, 233, 66, + 228, 22, 211, 62, 236, 229, 228, 22, 236, 170, 4, 199, 53, 236, 170, 4, + 199, 54, 23, 209, 179, 236, 170, 4, 209, 179, 232, 116, 4, 209, 179, 232, + 116, 4, 198, 150, 232, 116, 4, 251, 135, 192, 235, 62, 232, 173, 232, + 173, 211, 79, 232, 173, 247, 103, 141, 236, 206, 247, 103, 233, 9, 248, + 64, 233, 9, 247, 157, 234, 107, 213, 8, 234, 107, 213, 9, 210, 206, 234, + 107, 213, 9, 210, 212, 213, 8, 213, 9, 210, 206, 213, 9, 210, 212, 234, + 107, 236, 169, 234, 107, 210, 206, 234, 107, 210, 204, 236, 169, 210, + 206, 210, 204, 193, 148, 201, 219, 213, 9, 210, 212, 201, 219, 247, 143, + 210, 212, 237, 80, 193, 65, 216, 40, 217, 24, 211, 4, 242, 223, 50, 23, + 45, 204, 29, 250, 233, 247, 127, 192, 235, 223, 156, 232, 165, 202, 117, + 113, 237, 136, 232, 165, 202, 117, 113, 239, 62, 39, 221, 224, 206, 141, + 214, 77, 210, 207, 4, 47, 199, 53, 201, 68, 243, 138, 238, 17, 221, 80, + 219, 98, 201, 234, 229, 238, 223, 165, 202, 188, 115, 207, 122, 58, 115, + 207, 122, 60, 115, 207, 122, 219, 226, 115, 207, 122, 179, 45, 201, 231, + 248, 10, 50, 201, 231, 248, 10, 105, 201, 231, 248, 9, 115, 201, 231, + 248, 9, 45, 198, 231, 248, 10, 50, 198, 231, 248, 10, 45, 251, 121, 248, + 10, 50, 251, 121, 248, 10, 215, 212, 248, 10, 219, 132, 215, 212, 248, + 10, 219, 132, 215, 211, 249, 109, 111, 4, 249, 108, 249, 109, 27, 192, + 235, 249, 109, 111, 4, 27, 192, 235, 249, 109, 28, 27, 192, 235, 249, + 109, 111, 4, 28, 27, 192, 235, 156, 243, 128, 77, 249, 109, 111, 4, 28, + 243, 127, 193, 18, 217, 73, 215, 188, 232, 83, 198, 85, 198, 30, 201, 93, + 79, 219, 146, 202, 189, 79, 223, 22, 215, 169, 230, 198, 233, 105, 230, + 198, 233, 106, 4, 202, 65, 233, 187, 233, 106, 4, 199, 126, 79, 222, 187, + 202, 65, 233, 106, 4, 211, 79, 215, 181, 202, 65, 233, 106, 4, 211, 79, + 215, 182, 23, 202, 65, 233, 187, 202, 65, 233, 106, 4, 211, 79, 215, 182, + 23, 242, 89, 200, 143, 202, 65, 233, 106, 4, 211, 79, 215, 182, 23, 198, + 171, 233, 187, 202, 65, 233, 106, 4, 230, 68, 202, 65, 233, 106, 4, 228, + 188, 193, 57, 233, 105, 202, 65, 233, 106, 4, 202, 65, 233, 187, 233, + 106, 205, 110, 237, 116, 232, 163, 207, 62, 233, 105, 202, 65, 233, 106, + 4, 229, 224, 233, 187, 202, 65, 233, 106, 4, 200, 194, 202, 64, 233, 105, + 214, 84, 233, 105, 233, 208, 233, 105, 196, 111, 233, 105, 233, 106, 4, + 242, 89, 200, 143, 210, 28, 233, 105, 239, 53, 233, 105, 239, 54, 233, + 105, 221, 123, 233, 105, 233, 106, 198, 214, 42, 221, 124, 221, 123, 233, + 106, 4, 202, 65, 233, 187, 221, 123, 233, 106, 4, 242, 221, 233, 187, + 233, 106, 4, 201, 13, 198, 61, 233, 106, 4, 201, 13, 198, 62, 23, 193, + 57, 233, 195, 233, 106, 4, 201, 13, 198, 62, 23, 198, 171, 233, 187, 236, + 230, 233, 105, 193, 16, 233, 105, 251, 113, 233, 105, 209, 8, 233, 105, + 238, 201, 233, 105, 209, 255, 233, 105, 233, 106, 4, 219, 9, 79, 197, + 217, 236, 230, 247, 220, 207, 62, 233, 105, 232, 94, 233, 106, 4, 211, + 79, 215, 181, 251, 111, 233, 105, 233, 59, 233, 105, 193, 119, 233, 105, + 202, 92, 233, 105, 198, 130, 233, 105, 230, 199, 233, 105, 218, 247, 238, + 201, 233, 105, 233, 106, 4, 211, 79, 215, 181, 228, 132, 233, 105, 233, + 106, 4, 211, 79, 215, 182, 23, 242, 89, 200, 143, 233, 106, 205, 79, 223, + 165, 233, 60, 250, 192, 233, 105, 232, 185, 233, 105, 202, 93, 233, 105, + 236, 197, 233, 105, 233, 106, 193, 51, 215, 181, 233, 106, 4, 216, 218, + 217, 37, 230, 198, 247, 81, 233, 106, 4, 202, 65, 233, 187, 247, 81, 233, + 106, 4, 199, 126, 79, 222, 187, 202, 65, 247, 81, 233, 106, 4, 211, 79, + 215, 181, 202, 65, 247, 81, 233, 106, 4, 229, 224, 233, 187, 247, 81, + 233, 106, 4, 193, 1, 202, 66, 221, 123, 247, 81, 233, 106, 4, 242, 221, + 233, 187, 209, 8, 247, 81, 233, 105, 238, 201, 247, 81, 233, 105, 193, + 119, 247, 81, 233, 105, 202, 85, 232, 94, 233, 105, 202, 85, 202, 65, + 233, 105, 196, 72, 233, 105, 233, 106, 4, 206, 139, 233, 187, 233, 106, + 4, 213, 46, 230, 246, 231, 134, 233, 106, 4, 211, 128, 231, 134, 209, + 253, 248, 70, 237, 131, 205, 50, 215, 227, 229, 228, 215, 227, 201, 237, + 215, 227, 230, 22, 209, 253, 207, 147, 91, 230, 55, 209, 253, 207, 147, + 248, 82, 230, 31, 223, 165, 247, 30, 209, 253, 232, 93, 209, 253, 4, 209, + 8, 233, 105, 209, 253, 4, 232, 174, 230, 30, 186, 193, 105, 209, 60, 219, + 235, 202, 3, 193, 105, 209, 60, 219, 235, 186, 234, 206, 209, 60, 219, + 235, 202, 3, 234, 206, 209, 60, 219, 235, 154, 186, 193, 105, 209, 60, + 219, 235, 154, 202, 3, 193, 105, 209, 60, 219, 235, 154, 186, 234, 206, + 209, 60, 219, 235, 154, 202, 3, 234, 206, 209, 60, 219, 235, 186, 193, + 105, 209, 60, 195, 48, 219, 235, 202, 3, 193, 105, 209, 60, 195, 48, 219, + 235, 186, 234, 206, 209, 60, 195, 48, 219, 235, 202, 3, 234, 206, 209, + 60, 195, 48, 219, 235, 88, 186, 193, 105, 209, 60, 195, 48, 219, 235, 88, + 202, 3, 193, 105, 209, 60, 195, 48, 219, 235, 88, 186, 234, 206, 209, 60, + 195, 48, 219, 235, 88, 202, 3, 234, 206, 209, 60, 195, 48, 219, 235, 186, + 193, 105, 209, 60, 248, 6, 202, 3, 193, 105, 209, 60, 248, 6, 186, 234, + 206, 209, 60, 248, 6, 202, 3, 234, 206, 209, 60, 248, 6, 88, 186, 193, + 105, 209, 60, 248, 6, 88, 202, 3, 193, 105, 209, 60, 248, 6, 88, 186, + 234, 206, 209, 60, 248, 6, 88, 202, 3, 234, 206, 209, 60, 248, 6, 229, 6, + 208, 8, 51, 211, 44, 229, 6, 208, 8, 51, 211, 45, 223, 165, 62, 201, 191, + 202, 26, 208, 8, 51, 211, 44, 202, 26, 208, 8, 51, 211, 45, 223, 165, 62, + 201, 191, 118, 206, 147, 196, 66, 206, 147, 96, 206, 147, 235, 121, 206, + 147, 27, 34, 234, 2, 211, 44, 88, 27, 34, 234, 2, 211, 44, 34, 211, 79, + 234, 2, 211, 44, 88, 34, 211, 79, 234, 2, 211, 44, 88, 251, 140, 211, 44, + 200, 146, 251, 140, 211, 44, 49, 88, 55, 154, 242, 77, 207, 254, 87, 211, + 44, 49, 88, 55, 242, 77, 207, 254, 87, 211, 44, 49, 88, 130, 55, 242, 77, + 207, 254, 87, 211, 44, 88, 223, 105, 211, 44, 49, 223, 105, 211, 44, 88, + 49, 223, 105, 211, 44, 195, 83, 88, 202, 24, 195, 83, 88, 207, 20, 202, + 24, 243, 126, 248, 109, 207, 20, 243, 126, 248, 109, 206, 147, 229, 207, + 201, 86, 219, 34, 207, 154, 247, 104, 229, 133, 198, 16, 229, 133, 198, + 17, 4, 247, 251, 213, 15, 198, 16, 216, 160, 156, 207, 155, 201, 94, 198, + 14, 198, 15, 247, 104, 247, 225, 211, 103, 247, 225, 197, 212, 247, 226, + 201, 64, 216, 44, 251, 144, 232, 246, 234, 89, 209, 52, 247, 104, 211, + 103, 209, 52, 247, 104, 199, 155, 211, 103, 199, 155, 250, 152, 211, 103, + 250, 152, 207, 96, 195, 145, 237, 112, 197, 203, 250, 227, 219, 0, 198, + 23, 215, 220, 215, 187, 207, 153, 200, 164, 207, 153, 215, 187, 247, 156, + 252, 13, 198, 13, 203, 66, 206, 113, 201, 229, 228, 243, 198, 20, 219, + 134, 81, 198, 20, 219, 134, 239, 39, 56, 209, 52, 247, 88, 207, 13, 219, + 134, 197, 238, 232, 220, 211, 107, 209, 21, 236, 146, 213, 46, 234, 75, + 56, 202, 63, 113, 213, 46, 202, 63, 113, 208, 134, 219, 86, 223, 165, + 223, 52, 209, 110, 113, 236, 177, 213, 14, 219, 86, 113, 209, 15, 193, + 144, 113, 213, 30, 193, 144, 113, 248, 186, 213, 46, 248, 185, 248, 184, + 215, 187, 248, 184, 210, 53, 213, 46, 210, 52, 243, 87, 238, 211, 216, + 184, 113, 193, 32, 113, 207, 29, 249, 151, 113, 198, 86, 193, 144, 242, + 218, 203, 21, 249, 63, 249, 61, 210, 93, 239, 23, 238, 158, 249, 128, + 242, 248, 45, 218, 217, 197, 242, 4, 206, 114, 239, 2, 208, 198, 56, 47, + 223, 139, 202, 4, 248, 61, 113, 231, 29, 113, 238, 250, 23, 220, 27, 202, + 93, 252, 59, 203, 44, 249, 127, 248, 236, 248, 237, 249, 4, 209, 110, 79, + 193, 15, 211, 161, 56, 203, 44, 197, 213, 201, 9, 210, 203, 229, 129, + 199, 98, 228, 131, 234, 132, 193, 54, 209, 98, 202, 88, 193, 93, 206, + 190, 247, 235, 230, 64, 23, 193, 9, 203, 79, 211, 134, 235, 96, 215, 191, + 207, 154, 198, 25, 215, 194, 248, 108, 196, 76, 216, 56, 251, 225, 196, + 76, 251, 225, 196, 76, 2, 251, 225, 2, 251, 225, 213, 19, 251, 225, 251, + 226, 237, 95, 251, 226, 250, 240, 205, 119, 211, 103, 232, 246, 234, 89, + 237, 24, 219, 34, 210, 97, 203, 66, 205, 84, 215, 194, 205, 84, 247, 115, + 202, 95, 232, 180, 205, 114, 202, 112, 250, 154, 206, 244, 209, 180, 197, + 203, 206, 140, 202, 113, 160, 16, 40, 208, 4, 160, 16, 40, 251, 227, 160, + 16, 40, 232, 245, 160, 16, 40, 234, 209, 160, 16, 40, 193, 143, 160, 16, + 40, 251, 37, 160, 16, 40, 251, 38, 207, 82, 160, 16, 40, 251, 38, 207, + 81, 160, 16, 40, 251, 38, 195, 31, 160, 16, 40, 251, 38, 195, 30, 160, 16, 40, 195, 45, 160, 16, 40, 195, 44, 160, 16, 40, 195, 43, 160, 16, 40, - 200, 205, 160, 16, 40, 209, 203, 200, 205, 160, 16, 40, 62, 200, 205, - 160, 16, 40, 216, 181, 200, 236, 160, 16, 40, 216, 181, 200, 235, 160, - 16, 40, 216, 181, 200, 234, 160, 16, 40, 243, 13, 160, 16, 40, 205, 158, - 160, 16, 40, 213, 161, 160, 16, 40, 195, 28, 160, 16, 40, 195, 27, 160, - 16, 40, 206, 148, 205, 158, 160, 16, 40, 206, 148, 205, 157, 160, 16, 40, - 230, 250, 160, 16, 40, 202, 184, 160, 16, 40, 223, 74, 211, 49, 160, 16, - 40, 223, 74, 211, 48, 160, 16, 40, 238, 222, 79, 223, 73, 160, 16, 40, - 207, 77, 79, 223, 73, 160, 16, 40, 239, 12, 211, 49, 160, 16, 40, 223, - 72, 211, 49, 160, 16, 40, 200, 237, 79, 239, 11, 160, 16, 40, 238, 222, - 79, 239, 11, 160, 16, 40, 238, 222, 79, 239, 10, 160, 16, 40, 239, 12, - 251, 79, 160, 16, 40, 205, 159, 79, 239, 12, 251, 79, 160, 16, 40, 200, - 237, 79, 205, 159, 79, 239, 11, 160, 16, 40, 195, 139, 160, 16, 40, 198, - 143, 211, 49, 160, 16, 40, 219, 237, 211, 49, 160, 16, 40, 251, 78, 211, - 49, 160, 16, 40, 200, 237, 79, 251, 77, 160, 16, 40, 205, 159, 79, 251, - 77, 160, 16, 40, 200, 237, 79, 205, 159, 79, 251, 77, 160, 16, 40, 195, - 46, 79, 251, 77, 160, 16, 40, 207, 77, 79, 251, 77, 160, 16, 40, 207, 77, - 79, 251, 76, 160, 16, 40, 207, 76, 160, 16, 40, 207, 75, 160, 16, 40, - 207, 74, 160, 16, 40, 207, 73, 160, 16, 40, 251, 177, 160, 16, 40, 251, - 176, 160, 16, 40, 217, 61, 160, 16, 40, 205, 168, 160, 16, 40, 250, 230, - 160, 16, 40, 207, 105, 160, 16, 40, 207, 104, 160, 16, 40, 250, 154, 160, - 16, 40, 248, 150, 211, 49, 160, 16, 40, 199, 177, 160, 16, 40, 199, 176, - 160, 16, 40, 208, 8, 219, 121, 160, 16, 40, 248, 87, 160, 16, 40, 248, - 86, 160, 16, 40, 248, 85, 160, 16, 40, 251, 151, 160, 16, 40, 211, 131, - 160, 16, 40, 201, 214, 160, 16, 40, 198, 141, 160, 16, 40, 230, 158, 160, - 16, 40, 193, 131, 160, 16, 40, 209, 1, 160, 16, 40, 247, 137, 160, 16, - 40, 197, 50, 160, 16, 40, 247, 104, 215, 198, 160, 16, 40, 205, 93, 79, - 222, 187, 160, 16, 40, 247, 151, 160, 16, 40, 197, 235, 160, 16, 40, 201, - 100, 197, 235, 160, 16, 40, 219, 31, 160, 16, 40, 202, 37, 160, 16, 40, - 196, 54, 160, 16, 40, 228, 184, 235, 71, 160, 16, 40, 250, 204, 160, 16, - 40, 209, 15, 250, 204, 160, 16, 40, 248, 31, 160, 16, 40, 209, 0, 248, - 31, 160, 16, 40, 251, 148, 160, 16, 40, 201, 46, 200, 186, 201, 45, 160, - 16, 40, 201, 46, 200, 186, 201, 44, 160, 16, 40, 200, 233, 160, 16, 40, - 208, 229, 160, 16, 40, 236, 215, 160, 16, 40, 236, 217, 160, 16, 40, 236, - 216, 160, 16, 40, 208, 141, 160, 16, 40, 208, 129, 160, 16, 40, 238, 207, - 160, 16, 40, 238, 206, 160, 16, 40, 238, 205, 160, 16, 40, 238, 204, 160, - 16, 40, 238, 203, 160, 16, 40, 251, 191, 160, 16, 40, 249, 62, 79, 217, - 42, 160, 16, 40, 249, 62, 79, 195, 174, 160, 16, 40, 207, 26, 160, 16, - 40, 228, 176, 160, 16, 40, 213, 190, 160, 16, 40, 237, 203, 160, 16, 40, - 215, 213, 160, 16, 40, 132, 235, 109, 160, 16, 40, 132, 211, 17, 218, - 250, 79, 232, 137, 211, 164, 218, 207, 234, 194, 230, 1, 217, 101, 230, - 246, 208, 24, 211, 52, 62, 219, 219, 223, 56, 50, 197, 241, 62, 196, 76, - 223, 56, 50, 197, 241, 62, 206, 203, 223, 56, 50, 197, 241, 62, 235, 122, - 223, 56, 50, 197, 241, 62, 202, 84, 2, 243, 10, 216, 213, 28, 63, 243, - 10, 28, 63, 243, 10, 88, 63, 243, 10, 195, 83, 88, 63, 243, 10, 233, 197, - 88, 63, 243, 10, 63, 243, 11, 239, 33, 62, 2, 243, 10, 206, 115, 199, - 178, 62, 198, 138, 201, 190, 62, 202, 84, 2, 201, 190, 156, 63, 201, 190, - 216, 213, 63, 201, 190, 28, 63, 201, 190, 88, 63, 201, 190, 195, 83, 88, - 63, 201, 190, 233, 197, 88, 63, 201, 190, 63, 51, 239, 33, 62, 195, 83, - 2, 201, 190, 63, 51, 239, 33, 62, 216, 213, 201, 190, 51, 199, 178, 62, - 198, 138, 237, 32, 62, 195, 83, 2, 237, 32, 62, 216, 213, 2, 237, 32, 63, - 237, 33, 239, 33, 62, 195, 83, 2, 237, 32, 63, 237, 33, 239, 33, 62, 216, - 213, 237, 32, 237, 33, 199, 178, 62, 198, 138, 218, 232, 62, 195, 83, 2, - 218, 232, 62, 216, 213, 2, 218, 232, 63, 218, 233, 239, 33, 62, 2, 218, - 232, 199, 4, 35, 238, 217, 156, 35, 238, 217, 216, 213, 35, 238, 217, 28, - 35, 238, 217, 195, 83, 28, 35, 238, 217, 195, 83, 88, 35, 238, 217, 233, - 197, 88, 35, 238, 217, 199, 4, 205, 154, 156, 205, 154, 216, 213, 205, - 154, 28, 205, 154, 88, 205, 154, 195, 83, 88, 205, 154, 233, 197, 88, - 205, 154, 156, 232, 226, 201, 206, 250, 193, 216, 213, 232, 226, 201, - 206, 250, 193, 28, 232, 226, 201, 206, 250, 193, 88, 232, 226, 201, 206, - 250, 193, 195, 83, 88, 232, 226, 201, 206, 250, 193, 233, 197, 88, 232, - 226, 201, 206, 250, 193, 156, 202, 136, 201, 206, 250, 193, 216, 213, - 202, 136, 201, 206, 250, 193, 28, 202, 136, 201, 206, 250, 193, 88, 202, - 136, 201, 206, 250, 193, 195, 83, 88, 202, 136, 201, 206, 250, 193, 233, - 197, 88, 202, 136, 201, 206, 250, 193, 156, 234, 164, 201, 206, 250, 193, - 216, 213, 234, 164, 201, 206, 250, 193, 28, 234, 164, 201, 206, 250, 193, - 88, 234, 164, 201, 206, 250, 193, 195, 83, 88, 234, 164, 201, 206, 250, - 193, 156, 115, 209, 60, 62, 201, 102, 216, 213, 115, 209, 60, 62, 201, - 102, 115, 209, 60, 62, 201, 102, 216, 213, 115, 209, 60, 209, 130, 201, - 102, 156, 232, 128, 209, 60, 62, 201, 102, 216, 213, 232, 128, 209, 60, - 62, 201, 102, 232, 128, 209, 60, 62, 201, 102, 216, 213, 232, 128, 209, - 60, 209, 130, 201, 102, 207, 19, 156, 232, 128, 209, 60, 209, 130, 201, - 102, 156, 232, 226, 209, 60, 62, 201, 102, 88, 232, 226, 209, 60, 62, - 201, 102, 216, 213, 202, 136, 209, 60, 62, 201, 102, 88, 202, 136, 209, - 60, 62, 201, 102, 202, 136, 209, 60, 209, 130, 201, 102, 216, 213, 234, - 164, 209, 60, 62, 201, 102, 88, 234, 164, 209, 60, 62, 201, 102, 195, 83, - 88, 234, 164, 209, 60, 62, 201, 102, 88, 234, 164, 209, 60, 209, 130, - 201, 102, 156, 197, 38, 209, 60, 62, 201, 102, 88, 197, 38, 209, 60, 62, - 201, 102, 88, 197, 38, 209, 60, 209, 130, 201, 102, 47, 197, 241, 214, - 106, 47, 197, 241, 47, 201, 190, 214, 106, 47, 201, 190, 213, 175, 209, - 60, 63, 201, 102, 220, 13, 211, 55, 243, 10, 220, 13, 192, 73, 243, 10, - 220, 13, 230, 201, 243, 10, 220, 13, 208, 138, 243, 10, 220, 13, 248, 19, - 243, 10, 220, 13, 207, 87, 201, 190, 220, 13, 248, 115, 201, 190, 220, - 13, 211, 55, 201, 190, 220, 13, 192, 73, 201, 190, 220, 13, 230, 201, - 201, 190, 220, 13, 208, 138, 201, 190, 220, 13, 248, 19, 201, 190, 88, - 234, 43, 56, 118, 64, 4, 2, 197, 242, 250, 235, 196, 66, 64, 4, 2, 197, - 242, 250, 235, 96, 64, 4, 2, 197, 242, 250, 235, 235, 119, 64, 4, 2, 197, - 242, 250, 235, 118, 64, 4, 216, 213, 197, 242, 250, 235, 196, 66, 64, 4, - 216, 213, 197, 242, 250, 235, 96, 64, 4, 216, 213, 197, 242, 250, 235, - 235, 119, 64, 4, 216, 213, 197, 242, 250, 235, 118, 64, 4, 220, 13, 197, - 242, 250, 235, 196, 66, 64, 4, 220, 13, 197, 242, 250, 235, 96, 64, 4, - 220, 13, 197, 242, 250, 235, 235, 119, 64, 4, 220, 13, 197, 242, 250, - 235, 118, 64, 4, 2, 234, 37, 250, 235, 196, 66, 64, 4, 2, 234, 37, 250, - 235, 96, 64, 4, 2, 234, 37, 250, 235, 235, 119, 64, 4, 2, 234, 37, 250, - 235, 118, 64, 4, 234, 37, 250, 235, 196, 66, 64, 4, 234, 37, 250, 235, - 96, 64, 4, 234, 37, 250, 235, 235, 119, 64, 4, 234, 37, 250, 235, 88, - 118, 64, 4, 234, 37, 250, 235, 88, 196, 66, 64, 4, 234, 37, 250, 235, 88, - 96, 64, 4, 234, 37, 250, 235, 88, 235, 119, 64, 4, 234, 37, 250, 235, 88, - 118, 64, 4, 220, 13, 234, 37, 250, 235, 88, 196, 66, 64, 4, 220, 13, 234, - 37, 250, 235, 88, 96, 64, 4, 220, 13, 234, 37, 250, 235, 88, 235, 119, - 64, 4, 220, 13, 234, 37, 250, 235, 118, 197, 240, 64, 4, 214, 215, 203, - 149, 196, 66, 197, 240, 64, 4, 214, 215, 203, 149, 96, 197, 240, 64, 4, - 214, 215, 203, 149, 235, 119, 197, 240, 64, 4, 214, 215, 203, 149, 118, - 197, 240, 64, 4, 216, 213, 203, 149, 196, 66, 197, 240, 64, 4, 216, 213, - 203, 149, 96, 197, 240, 64, 4, 216, 213, 203, 149, 235, 119, 197, 240, - 64, 4, 216, 213, 203, 149, 118, 197, 240, 64, 4, 28, 203, 149, 196, 66, - 197, 240, 64, 4, 28, 203, 149, 96, 197, 240, 64, 4, 28, 203, 149, 235, - 119, 197, 240, 64, 4, 28, 203, 149, 118, 197, 240, 64, 4, 88, 203, 149, - 196, 66, 197, 240, 64, 4, 88, 203, 149, 96, 197, 240, 64, 4, 88, 203, - 149, 235, 119, 197, 240, 64, 4, 88, 203, 149, 118, 197, 240, 64, 4, 195, - 83, 88, 203, 149, 196, 66, 197, 240, 64, 4, 195, 83, 88, 203, 149, 96, - 197, 240, 64, 4, 195, 83, 88, 203, 149, 235, 119, 197, 240, 64, 4, 195, - 83, 88, 203, 149, 118, 232, 251, 57, 196, 66, 232, 251, 57, 96, 232, 251, - 57, 235, 119, 232, 251, 57, 118, 112, 57, 196, 66, 112, 57, 96, 112, 57, - 235, 119, 112, 57, 118, 239, 61, 57, 196, 66, 239, 61, 57, 96, 239, 61, - 57, 235, 119, 239, 61, 57, 118, 88, 239, 61, 57, 196, 66, 88, 239, 61, - 57, 96, 88, 239, 61, 57, 235, 119, 88, 239, 61, 57, 118, 88, 57, 196, 66, - 88, 57, 96, 88, 57, 235, 119, 88, 57, 118, 49, 57, 196, 66, 49, 57, 96, - 49, 57, 235, 119, 49, 57, 186, 193, 105, 49, 57, 186, 234, 204, 49, 57, - 202, 2, 234, 204, 49, 57, 202, 2, 193, 105, 49, 57, 45, 50, 49, 57, 133, - 144, 49, 57, 193, 77, 118, 156, 181, 57, 193, 77, 196, 66, 156, 181, 57, - 193, 77, 96, 156, 181, 57, 193, 77, 235, 119, 156, 181, 57, 193, 77, 186, - 193, 105, 156, 181, 57, 193, 77, 186, 234, 204, 156, 181, 57, 193, 77, - 202, 2, 234, 204, 156, 181, 57, 193, 77, 202, 2, 193, 105, 156, 181, 57, - 193, 77, 118, 181, 57, 193, 77, 196, 66, 181, 57, 193, 77, 96, 181, 57, - 193, 77, 235, 119, 181, 57, 193, 77, 186, 193, 105, 181, 57, 193, 77, - 186, 234, 204, 181, 57, 193, 77, 202, 2, 234, 204, 181, 57, 193, 77, 202, - 2, 193, 105, 181, 57, 193, 77, 118, 216, 213, 181, 57, 193, 77, 196, 66, - 216, 213, 181, 57, 193, 77, 96, 216, 213, 181, 57, 193, 77, 235, 119, - 216, 213, 181, 57, 193, 77, 186, 193, 105, 216, 213, 181, 57, 193, 77, - 186, 234, 204, 216, 213, 181, 57, 193, 77, 202, 2, 234, 204, 216, 213, - 181, 57, 193, 77, 202, 2, 193, 105, 216, 213, 181, 57, 193, 77, 118, 88, - 181, 57, 193, 77, 196, 66, 88, 181, 57, 193, 77, 96, 88, 181, 57, 193, - 77, 235, 119, 88, 181, 57, 193, 77, 186, 193, 105, 88, 181, 57, 193, 77, - 186, 234, 204, 88, 181, 57, 193, 77, 202, 2, 234, 204, 88, 181, 57, 193, - 77, 202, 2, 193, 105, 88, 181, 57, 193, 77, 118, 195, 83, 88, 181, 57, - 193, 77, 196, 66, 195, 83, 88, 181, 57, 193, 77, 96, 195, 83, 88, 181, - 57, 193, 77, 235, 119, 195, 83, 88, 181, 57, 193, 77, 186, 193, 105, 195, - 83, 88, 181, 57, 193, 77, 186, 234, 204, 195, 83, 88, 181, 57, 193, 77, - 202, 2, 234, 204, 195, 83, 88, 181, 57, 193, 77, 202, 2, 193, 105, 195, - 83, 88, 181, 57, 118, 197, 242, 250, 235, 196, 66, 197, 242, 250, 235, - 96, 197, 242, 250, 235, 235, 119, 197, 242, 250, 235, 118, 63, 64, 193, - 53, 197, 242, 250, 235, 196, 66, 63, 64, 193, 53, 197, 242, 250, 235, 96, - 63, 64, 193, 53, 197, 242, 250, 235, 235, 119, 63, 64, 193, 53, 197, 242, - 250, 235, 118, 64, 4, 213, 8, 199, 215, 196, 66, 64, 4, 213, 8, 199, 215, - 96, 64, 4, 213, 8, 199, 215, 235, 119, 64, 4, 213, 8, 199, 215, 88, 64, - 203, 150, 193, 75, 107, 88, 64, 203, 150, 193, 75, 105, 198, 253, 88, 64, - 203, 150, 193, 75, 91, 230, 70, 88, 64, 203, 150, 193, 75, 91, 199, 0, - 118, 248, 74, 63, 57, 96, 248, 77, 203, 152, 63, 57, 118, 198, 54, 203, - 152, 63, 57, 96, 198, 54, 203, 152, 63, 57, 118, 219, 218, 63, 57, 96, - 206, 202, 63, 57, 118, 206, 202, 63, 57, 96, 219, 218, 63, 57, 118, 249, - 145, 203, 151, 63, 57, 96, 249, 145, 203, 151, 63, 57, 118, 232, 95, 203, - 151, 63, 57, 96, 232, 95, 203, 151, 63, 57, 63, 64, 203, 150, 193, 75, - 107, 63, 64, 203, 150, 193, 75, 105, 198, 253, 64, 209, 58, 196, 66, 199, - 25, 186, 193, 104, 64, 209, 58, 96, 199, 25, 238, 161, 202, 2, 193, 104, - 47, 238, 218, 232, 143, 4, 232, 128, 236, 138, 47, 238, 218, 232, 143, 4, - 105, 236, 138, 47, 238, 218, 232, 142, 45, 132, 243, 11, 4, 232, 128, - 236, 138, 45, 132, 243, 11, 4, 115, 236, 138, 45, 132, 243, 11, 4, 105, - 236, 138, 45, 132, 243, 11, 4, 236, 140, 45, 132, 243, 10, 235, 120, 233, - 96, 102, 235, 120, 233, 96, 213, 8, 102, 235, 120, 233, 96, 228, 251, 4, - 236, 140, 235, 120, 233, 96, 213, 8, 228, 251, 4, 236, 140, 209, 136, - 232, 247, 63, 229, 223, 248, 19, 229, 223, 209, 135, 230, 53, 191, 17, - 233, 103, 215, 229, 233, 103, 233, 104, 4, 199, 21, 214, 92, 233, 103, - 199, 2, 233, 103, 233, 104, 4, 229, 234, 206, 150, 233, 103, 228, 150, - 233, 103, 3, 79, 199, 34, 228, 186, 247, 139, 216, 233, 230, 53, 207, - 147, 249, 147, 79, 230, 53, 219, 223, 232, 231, 206, 207, 232, 231, 230, - 27, 230, 54, 4, 141, 23, 82, 232, 248, 238, 213, 228, 74, 218, 242, 191, - 239, 230, 54, 56, 233, 104, 4, 238, 238, 230, 9, 242, 208, 233, 103, 214, - 202, 233, 103, 206, 138, 211, 105, 199, 34, 232, 194, 219, 255, 235, 100, - 233, 103, 218, 178, 233, 103, 233, 104, 210, 182, 202, 56, 233, 103, 233, - 104, 4, 91, 233, 192, 207, 146, 230, 196, 233, 104, 4, 201, 103, 233, - 185, 230, 196, 233, 104, 4, 91, 220, 13, 23, 91, 2, 233, 193, 233, 104, - 4, 232, 253, 238, 241, 242, 219, 219, 96, 204, 2, 233, 104, 4, 200, 77, - 238, 241, 215, 179, 202, 64, 233, 104, 4, 202, 64, 233, 186, 23, 230, 54, - 238, 241, 215, 179, 233, 104, 4, 211, 77, 215, 180, 195, 9, 203, 54, 233, - 104, 4, 233, 208, 229, 235, 208, 226, 193, 35, 248, 40, 210, 181, 133, - 198, 87, 204, 31, 208, 214, 217, 91, 223, 163, 197, 46, 215, 194, 243, - 55, 203, 9, 209, 251, 236, 159, 247, 83, 222, 177, 233, 38, 215, 255, - 210, 21, 193, 8, 193, 144, 209, 44, 230, 32, 236, 201, 217, 35, 193, 69, - 232, 186, 235, 95, 4, 235, 93, 242, 226, 231, 15, 197, 74, 231, 16, 201, - 203, 231, 1, 214, 85, 206, 208, 232, 238, 209, 108, 216, 219, 205, 57, - 209, 108, 216, 219, 199, 1, 209, 108, 216, 219, 248, 61, 231, 10, 217, - 46, 250, 223, 196, 94, 238, 172, 201, 65, 220, 110, 201, 75, 23, 249, - 111, 202, 31, 232, 178, 236, 226, 238, 221, 250, 141, 238, 188, 249, 138, - 209, 12, 247, 87, 249, 124, 248, 43, 230, 201, 205, 165, 203, 142, 210, - 167, 79, 232, 161, 201, 9, 232, 205, 234, 179, 231, 17, 79, 216, 53, 210, - 56, 221, 116, 210, 163, 235, 76, 232, 138, 239, 16, 199, 207, 248, 62, - 243, 62, 248, 67, 4, 201, 203, 238, 182, 4, 201, 43, 242, 93, 248, 23, - 209, 176, 208, 218, 238, 155, 79, 216, 224, 205, 137, 247, 115, 232, 161, - 219, 232, 230, 200, 217, 82, 215, 206, 247, 146, 249, 127, 202, 64, 233, - 104, 4, 202, 64, 233, 186, 23, 115, 229, 221, 192, 87, 233, 103, 202, 64, - 233, 104, 4, 199, 131, 233, 104, 4, 210, 102, 228, 188, 23, 210, 102, - 230, 9, 233, 104, 4, 196, 98, 233, 186, 23, 193, 135, 215, 179, 211, 5, - 233, 103, 232, 107, 233, 103, 213, 168, 236, 224, 233, 103, 233, 104, - 229, 6, 249, 147, 199, 125, 233, 104, 4, 209, 93, 233, 185, 205, 125, - 220, 119, 242, 96, 230, 253, 229, 129, 248, 91, 232, 207, 203, 52, 238, - 235, 219, 100, 233, 103, 205, 81, 197, 62, 196, 96, 233, 103, 234, 214, - 235, 85, 249, 64, 203, 128, 210, 249, 232, 120, 233, 103, 247, 215, 237, - 128, 230, 235, 219, 78, 207, 5, 203, 13, 201, 184, 231, 29, 233, 103, - 191, 85, 233, 103, 229, 216, 205, 110, 200, 42, 238, 224, 222, 82, 219, - 70, 210, 58, 229, 121, 210, 108, 207, 173, 219, 41, 215, 196, 216, 90, - 249, 133, 200, 148, 217, 92, 236, 165, 202, 78, 211, 22, 211, 54, 202, - 102, 232, 209, 210, 239, 249, 4, 248, 149, 205, 61, 230, 163, 236, 162, - 208, 202, 247, 117, 234, 109, 242, 64, 207, 87, 230, 78, 234, 109, 242, - 64, 238, 171, 230, 78, 234, 109, 242, 64, 249, 113, 234, 109, 242, 64, - 63, 230, 78, 248, 98, 219, 212, 232, 159, 198, 56, 200, 184, 200, 179, - 205, 188, 195, 81, 234, 212, 4, 229, 225, 251, 235, 215, 190, 193, 91, - 217, 74, 193, 91, 216, 223, 250, 250, 216, 223, 219, 212, 243, 118, 193, - 116, 238, 180, 205, 159, 203, 146, 248, 208, 248, 62, 231, 197, 211, 93, - 233, 85, 193, 174, 247, 216, 217, 29, 235, 104, 228, 27, 238, 190, 248, - 9, 199, 134, 197, 214, 201, 105, 209, 250, 221, 80, 209, 250, 237, 144, - 209, 250, 233, 104, 4, 215, 224, 252, 29, 243, 86, 211, 118, 252, 29, - 249, 8, 209, 250, 209, 251, 4, 229, 230, 209, 251, 223, 163, 201, 82, - 206, 130, 209, 251, 242, 228, 209, 251, 223, 163, 218, 247, 209, 24, 217, - 124, 233, 87, 195, 177, 216, 174, 234, 125, 231, 148, 191, 5, 248, 50, - 211, 55, 229, 223, 248, 171, 247, 111, 205, 94, 231, 9, 242, 96, 202, 34, - 207, 87, 231, 43, 234, 67, 232, 242, 222, 238, 208, 125, 209, 175, 199, - 75, 197, 84, 209, 235, 236, 222, 236, 176, 55, 229, 204, 242, 69, 252, - 71, 232, 244, 233, 202, 198, 58, 248, 31, 217, 122, 218, 215, 218, 248, - 248, 78, 201, 204, 79, 198, 227, 249, 112, 79, 192, 100, 205, 188, 209, - 139, 199, 124, 249, 9, 248, 20, 249, 69, 206, 141, 79, 210, 135, 249, 88, - 79, 202, 37, 201, 205, 207, 103, 214, 196, 251, 134, 214, 82, 243, 105, - 221, 138, 214, 82, 243, 105, 208, 14, 214, 82, 243, 105, 206, 131, 214, - 82, 243, 105, 248, 152, 214, 82, 243, 105, 221, 76, 214, 82, 243, 105, - 210, 74, 63, 243, 105, 221, 77, 206, 122, 232, 134, 237, 124, 62, 243, - 105, 221, 77, 206, 122, 232, 134, 237, 124, 214, 82, 243, 105, 221, 77, - 206, 122, 232, 134, 237, 124, 63, 243, 105, 221, 139, 206, 122, 213, 170, - 237, 124, 63, 243, 105, 208, 15, 206, 122, 213, 170, 237, 124, 63, 243, - 105, 206, 132, 206, 122, 213, 170, 237, 124, 63, 243, 105, 248, 153, 206, - 122, 213, 170, 237, 124, 63, 243, 105, 221, 77, 206, 122, 213, 170, 237, - 124, 63, 243, 105, 210, 75, 206, 122, 213, 170, 237, 124, 62, 243, 105, - 221, 139, 206, 122, 213, 170, 237, 124, 62, 243, 105, 208, 15, 206, 122, - 213, 170, 237, 124, 62, 243, 105, 206, 132, 206, 122, 213, 170, 237, 124, - 62, 243, 105, 248, 153, 206, 122, 213, 170, 237, 124, 62, 243, 105, 221, - 77, 206, 122, 213, 170, 237, 124, 62, 243, 105, 210, 75, 206, 122, 213, - 170, 237, 124, 214, 82, 243, 105, 221, 139, 206, 122, 213, 170, 237, 124, - 214, 82, 243, 105, 208, 15, 206, 122, 213, 170, 237, 124, 214, 82, 243, - 105, 206, 132, 206, 122, 213, 170, 237, 124, 214, 82, 243, 105, 248, 153, - 206, 122, 213, 170, 237, 124, 214, 82, 243, 105, 221, 77, 206, 122, 213, - 170, 237, 124, 214, 82, 243, 105, 210, 75, 206, 122, 213, 170, 237, 124, - 63, 243, 105, 221, 77, 206, 122, 91, 228, 141, 198, 248, 237, 124, 62, - 243, 105, 221, 77, 206, 122, 91, 228, 141, 198, 248, 237, 124, 214, 82, - 243, 105, 221, 77, 206, 122, 91, 228, 141, 198, 248, 237, 124, 63, 243, - 105, 153, 221, 138, 63, 243, 105, 153, 208, 14, 63, 243, 105, 153, 206, - 131, 63, 243, 105, 153, 248, 152, 63, 243, 105, 153, 221, 76, 63, 243, - 105, 153, 210, 74, 62, 243, 105, 153, 221, 138, 62, 243, 105, 153, 208, - 14, 62, 243, 105, 153, 206, 131, 62, 243, 105, 153, 248, 152, 62, 243, - 105, 153, 221, 76, 62, 243, 105, 153, 210, 74, 214, 82, 243, 105, 153, - 221, 138, 214, 82, 243, 105, 153, 208, 14, 214, 82, 243, 105, 153, 206, - 131, 214, 82, 243, 105, 153, 248, 152, 214, 82, 243, 105, 153, 221, 76, - 214, 82, 243, 105, 153, 210, 74, 63, 243, 105, 221, 77, 206, 122, 105, - 228, 141, 197, 29, 237, 124, 62, 243, 105, 221, 77, 206, 122, 105, 228, - 141, 197, 29, 237, 124, 214, 82, 243, 105, 221, 77, 206, 122, 105, 228, - 141, 197, 29, 237, 124, 63, 243, 105, 221, 139, 206, 122, 105, 228, 141, - 203, 242, 237, 124, 63, 243, 105, 208, 15, 206, 122, 105, 228, 141, 203, - 242, 237, 124, 63, 243, 105, 206, 132, 206, 122, 105, 228, 141, 203, 242, - 237, 124, 63, 243, 105, 248, 153, 206, 122, 105, 228, 141, 203, 242, 237, - 124, 63, 243, 105, 221, 77, 206, 122, 105, 228, 141, 203, 242, 237, 124, - 63, 243, 105, 210, 75, 206, 122, 105, 228, 141, 203, 242, 237, 124, 62, - 243, 105, 221, 139, 206, 122, 105, 228, 141, 203, 242, 237, 124, 62, 243, - 105, 208, 15, 206, 122, 105, 228, 141, 203, 242, 237, 124, 62, 243, 105, - 206, 132, 206, 122, 105, 228, 141, 203, 242, 237, 124, 62, 243, 105, 248, - 153, 206, 122, 105, 228, 141, 203, 242, 237, 124, 62, 243, 105, 221, 77, - 206, 122, 105, 228, 141, 203, 242, 237, 124, 62, 243, 105, 210, 75, 206, - 122, 105, 228, 141, 203, 242, 237, 124, 214, 82, 243, 105, 221, 139, 206, - 122, 105, 228, 141, 203, 242, 237, 124, 214, 82, 243, 105, 208, 15, 206, - 122, 105, 228, 141, 203, 242, 237, 124, 214, 82, 243, 105, 206, 132, 206, - 122, 105, 228, 141, 203, 242, 237, 124, 214, 82, 243, 105, 248, 153, 206, - 122, 105, 228, 141, 203, 242, 237, 124, 214, 82, 243, 105, 221, 77, 206, - 122, 105, 228, 141, 203, 242, 237, 124, 214, 82, 243, 105, 210, 75, 206, - 122, 105, 228, 141, 203, 242, 237, 124, 63, 243, 105, 221, 77, 206, 122, - 115, 228, 141, 233, 20, 237, 124, 62, 243, 105, 221, 77, 206, 122, 115, - 228, 141, 233, 20, 237, 124, 214, 82, 243, 105, 221, 77, 206, 122, 115, - 228, 141, 233, 20, 237, 124, 63, 243, 105, 234, 38, 62, 243, 105, 234, - 38, 214, 82, 243, 105, 234, 38, 63, 243, 105, 234, 39, 206, 122, 213, - 170, 237, 124, 62, 243, 105, 234, 39, 206, 122, 213, 170, 237, 124, 214, - 82, 243, 105, 234, 39, 206, 122, 213, 170, 237, 124, 63, 243, 105, 221, - 74, 63, 243, 105, 221, 73, 63, 243, 105, 221, 75, 62, 243, 105, 221, 74, - 62, 243, 105, 221, 73, 62, 243, 105, 221, 75, 192, 205, 207, 87, 231, - 150, 192, 205, 207, 87, 217, 84, 192, 205, 207, 87, 234, 131, 192, 205, - 207, 87, 228, 183, 192, 205, 207, 87, 243, 138, 192, 205, 207, 87, 247, - 114, 192, 205, 207, 87, 202, 26, 192, 205, 62, 231, 150, 192, 205, 62, - 217, 84, 192, 205, 62, 234, 131, 192, 205, 62, 228, 183, 192, 205, 62, - 243, 138, 192, 205, 62, 247, 114, 192, 205, 62, 202, 26, 249, 110, 203, - 51, 211, 98, 200, 135, 248, 27, 203, 25, 198, 237, 205, 139, 156, 248, - 115, 229, 223, 230, 198, 229, 223, 209, 131, 229, 223, 235, 99, 79, 248, - 120, 252, 35, 249, 96, 201, 76, 192, 234, 238, 201, 191, 253, 221, 119, - 210, 129, 248, 92, 217, 123, 193, 162, 209, 137, 214, 87, 236, 154, 217, - 64, 232, 182, 206, 187, 209, 100, 246, 252, 207, 118, 250, 132, 236, 196, - 220, 25, 249, 94, 216, 54, 229, 200, 252, 56, 179, 235, 94, 242, 88, 247, - 89, 205, 108, 205, 75, 220, 109, 102, 216, 26, 193, 65, 209, 83, 203, - 239, 214, 109, 221, 71, 248, 6, 215, 182, 198, 6, 198, 55, 229, 228, 209, - 109, 206, 147, 216, 27, 249, 111, 228, 16, 247, 100, 130, 249, 58, 230, - 60, 232, 170, 230, 54, 233, 80, 230, 79, 209, 180, 221, 203, 232, 179, - 193, 17, 248, 251, 242, 95, 209, 11, 209, 99, 193, 28, 233, 54, 218, 246, - 239, 4, 234, 105, 214, 89, 214, 90, 4, 234, 178, 228, 92, 223, 2, 193, - 61, 230, 243, 251, 129, 229, 223, 218, 205, 210, 20, 228, 149, 208, 226, - 217, 90, 208, 226, 209, 250, 209, 251, 4, 238, 208, 215, 204, 236, 147, - 248, 113, 248, 236, 210, 15, 211, 115, 232, 205, 199, 196, 232, 165, 199, - 132, 209, 7, 219, 92, 249, 11, 223, 18, 231, 36, 206, 128, 210, 62, 209, - 70, 216, 195, 233, 103, 205, 153, 233, 103, 233, 104, 4, 211, 77, 233, - 186, 23, 230, 54, 139, 215, 179, 233, 104, 4, 210, 47, 233, 193, 233, - 104, 4, 237, 39, 215, 179, 235, 138, 219, 113, 233, 103, 248, 145, 219, - 98, 248, 7, 203, 145, 233, 103, 230, 54, 4, 141, 232, 253, 23, 176, 238, - 213, 96, 230, 53, 118, 230, 53, 210, 183, 144, 230, 53, 210, 183, 133, - 230, 53, 141, 209, 58, 250, 183, 199, 34, 195, 55, 229, 224, 230, 28, - 118, 208, 135, 230, 53, 96, 208, 135, 230, 53, 184, 203, 236, 184, 203, - 206, 184, 203, 235, 184, 203, 191, 184, 203, 220, 184, 203, 205, 184, - 203, 234, 184, 203, 183, 184, 203, 213, 184, 203, 197, 184, 203, 227, - 184, 203, 190, 184, 203, 219, 184, 203, 204, 184, 203, 233, 184, 203, - 179, 184, 203, 209, 184, 203, 194, 184, 203, 223, 184, 203, 186, 184, + 200, 205, 160, 16, 40, 209, 205, 200, 205, 160, 16, 40, 62, 200, 205, + 160, 16, 40, 216, 183, 200, 237, 160, 16, 40, 216, 183, 200, 236, 160, + 16, 40, 216, 183, 200, 235, 160, 16, 40, 243, 15, 160, 16, 40, 205, 159, + 160, 16, 40, 213, 163, 160, 16, 40, 195, 28, 160, 16, 40, 195, 27, 160, + 16, 40, 206, 149, 205, 159, 160, 16, 40, 206, 149, 205, 158, 160, 16, 40, + 230, 252, 160, 16, 40, 202, 185, 160, 16, 40, 223, 76, 211, 51, 160, 16, + 40, 223, 76, 211, 50, 160, 16, 40, 238, 224, 79, 223, 75, 160, 16, 40, + 207, 78, 79, 223, 75, 160, 16, 40, 239, 14, 211, 51, 160, 16, 40, 223, + 74, 211, 51, 160, 16, 40, 200, 238, 79, 239, 13, 160, 16, 40, 238, 224, + 79, 239, 13, 160, 16, 40, 238, 224, 79, 239, 12, 160, 16, 40, 239, 14, + 251, 81, 160, 16, 40, 205, 160, 79, 239, 14, 251, 81, 160, 16, 40, 200, + 238, 79, 205, 160, 79, 239, 13, 160, 16, 40, 195, 139, 160, 16, 40, 198, + 143, 211, 51, 160, 16, 40, 219, 239, 211, 51, 160, 16, 40, 251, 80, 211, + 51, 160, 16, 40, 200, 238, 79, 251, 79, 160, 16, 40, 205, 160, 79, 251, + 79, 160, 16, 40, 200, 238, 79, 205, 160, 79, 251, 79, 160, 16, 40, 195, + 46, 79, 251, 79, 160, 16, 40, 207, 78, 79, 251, 79, 160, 16, 40, 207, 78, + 79, 251, 78, 160, 16, 40, 207, 77, 160, 16, 40, 207, 76, 160, 16, 40, + 207, 75, 160, 16, 40, 207, 74, 160, 16, 40, 251, 179, 160, 16, 40, 251, + 178, 160, 16, 40, 217, 63, 160, 16, 40, 205, 169, 160, 16, 40, 250, 232, + 160, 16, 40, 207, 107, 160, 16, 40, 207, 106, 160, 16, 40, 250, 156, 160, + 16, 40, 248, 152, 211, 51, 160, 16, 40, 199, 177, 160, 16, 40, 199, 176, + 160, 16, 40, 208, 10, 219, 123, 160, 16, 40, 248, 89, 160, 16, 40, 248, + 88, 160, 16, 40, 248, 87, 160, 16, 40, 251, 153, 160, 16, 40, 211, 133, + 160, 16, 40, 201, 215, 160, 16, 40, 198, 141, 160, 16, 40, 230, 160, 160, + 16, 40, 193, 131, 160, 16, 40, 209, 3, 160, 16, 40, 247, 139, 160, 16, + 40, 197, 50, 160, 16, 40, 247, 106, 215, 200, 160, 16, 40, 205, 94, 79, + 222, 189, 160, 16, 40, 247, 153, 160, 16, 40, 197, 235, 160, 16, 40, 201, + 101, 197, 235, 160, 16, 40, 219, 33, 160, 16, 40, 202, 38, 160, 16, 40, + 196, 54, 160, 16, 40, 228, 186, 235, 73, 160, 16, 40, 250, 206, 160, 16, + 40, 209, 17, 250, 206, 160, 16, 40, 248, 33, 160, 16, 40, 209, 2, 248, + 33, 160, 16, 40, 251, 150, 160, 16, 40, 201, 47, 200, 186, 201, 46, 160, + 16, 40, 201, 47, 200, 186, 201, 45, 160, 16, 40, 200, 234, 160, 16, 40, + 208, 231, 160, 16, 40, 236, 217, 160, 16, 40, 236, 219, 160, 16, 40, 236, + 218, 160, 16, 40, 208, 143, 160, 16, 40, 208, 131, 160, 16, 40, 238, 209, + 160, 16, 40, 238, 208, 160, 16, 40, 238, 207, 160, 16, 40, 238, 206, 160, + 16, 40, 238, 205, 160, 16, 40, 251, 193, 160, 16, 40, 249, 64, 79, 217, + 44, 160, 16, 40, 249, 64, 79, 195, 174, 160, 16, 40, 207, 27, 160, 16, + 40, 228, 178, 160, 16, 40, 213, 192, 160, 16, 40, 237, 205, 160, 16, 40, + 215, 215, 160, 16, 40, 132, 235, 111, 160, 16, 40, 132, 211, 19, 218, + 252, 79, 232, 139, 211, 166, 218, 209, 234, 196, 230, 3, 217, 103, 230, + 248, 208, 26, 211, 54, 62, 219, 221, 223, 58, 50, 197, 241, 62, 196, 76, + 223, 58, 50, 197, 241, 62, 206, 204, 223, 58, 50, 197, 241, 62, 235, 124, + 223, 58, 50, 197, 241, 62, 202, 85, 2, 243, 12, 216, 215, 28, 63, 243, + 12, 28, 63, 243, 12, 88, 63, 243, 12, 195, 83, 88, 63, 243, 12, 233, 199, + 88, 63, 243, 12, 63, 243, 13, 239, 35, 62, 2, 243, 12, 206, 116, 199, + 178, 62, 198, 138, 201, 191, 62, 202, 85, 2, 201, 191, 156, 63, 201, 191, + 216, 215, 63, 201, 191, 28, 63, 201, 191, 88, 63, 201, 191, 195, 83, 88, + 63, 201, 191, 233, 199, 88, 63, 201, 191, 63, 51, 239, 35, 62, 195, 83, + 2, 201, 191, 63, 51, 239, 35, 62, 216, 215, 201, 191, 51, 199, 178, 62, + 198, 138, 237, 34, 62, 195, 83, 2, 237, 34, 62, 216, 215, 2, 237, 34, 63, + 237, 35, 239, 35, 62, 195, 83, 2, 237, 34, 63, 237, 35, 239, 35, 62, 216, + 215, 237, 34, 237, 35, 199, 178, 62, 198, 138, 218, 234, 62, 195, 83, 2, + 218, 234, 62, 216, 215, 2, 218, 234, 63, 218, 235, 239, 35, 62, 2, 218, + 234, 199, 4, 35, 238, 219, 156, 35, 238, 219, 216, 215, 35, 238, 219, 28, + 35, 238, 219, 195, 83, 28, 35, 238, 219, 195, 83, 88, 35, 238, 219, 233, + 199, 88, 35, 238, 219, 199, 4, 205, 155, 156, 205, 155, 216, 215, 205, + 155, 28, 205, 155, 88, 205, 155, 195, 83, 88, 205, 155, 233, 199, 88, + 205, 155, 156, 232, 228, 201, 207, 250, 195, 216, 215, 232, 228, 201, + 207, 250, 195, 28, 232, 228, 201, 207, 250, 195, 88, 232, 228, 201, 207, + 250, 195, 195, 83, 88, 232, 228, 201, 207, 250, 195, 233, 199, 88, 232, + 228, 201, 207, 250, 195, 156, 202, 137, 201, 207, 250, 195, 216, 215, + 202, 137, 201, 207, 250, 195, 28, 202, 137, 201, 207, 250, 195, 88, 202, + 137, 201, 207, 250, 195, 195, 83, 88, 202, 137, 201, 207, 250, 195, 233, + 199, 88, 202, 137, 201, 207, 250, 195, 156, 234, 166, 201, 207, 250, 195, + 216, 215, 234, 166, 201, 207, 250, 195, 28, 234, 166, 201, 207, 250, 195, + 88, 234, 166, 201, 207, 250, 195, 195, 83, 88, 234, 166, 201, 207, 250, + 195, 156, 115, 209, 62, 62, 201, 103, 216, 215, 115, 209, 62, 62, 201, + 103, 115, 209, 62, 62, 201, 103, 216, 215, 115, 209, 62, 209, 132, 201, + 103, 156, 232, 130, 209, 62, 62, 201, 103, 216, 215, 232, 130, 209, 62, + 62, 201, 103, 232, 130, 209, 62, 62, 201, 103, 216, 215, 232, 130, 209, + 62, 209, 132, 201, 103, 207, 20, 156, 232, 130, 209, 62, 209, 132, 201, + 103, 156, 232, 228, 209, 62, 62, 201, 103, 88, 232, 228, 209, 62, 62, + 201, 103, 216, 215, 202, 137, 209, 62, 62, 201, 103, 88, 202, 137, 209, + 62, 62, 201, 103, 202, 137, 209, 62, 209, 132, 201, 103, 216, 215, 234, + 166, 209, 62, 62, 201, 103, 88, 234, 166, 209, 62, 62, 201, 103, 195, 83, + 88, 234, 166, 209, 62, 62, 201, 103, 88, 234, 166, 209, 62, 209, 132, + 201, 103, 156, 197, 38, 209, 62, 62, 201, 103, 88, 197, 38, 209, 62, 62, + 201, 103, 88, 197, 38, 209, 62, 209, 132, 201, 103, 47, 197, 241, 214, + 108, 47, 197, 241, 47, 201, 191, 214, 108, 47, 201, 191, 213, 177, 209, + 62, 63, 201, 103, 220, 15, 211, 57, 243, 12, 220, 15, 192, 73, 243, 12, + 220, 15, 230, 203, 243, 12, 220, 15, 208, 140, 243, 12, 220, 15, 248, 21, + 243, 12, 220, 15, 207, 89, 201, 191, 220, 15, 248, 117, 201, 191, 220, + 15, 211, 57, 201, 191, 220, 15, 192, 73, 201, 191, 220, 15, 230, 203, + 201, 191, 220, 15, 208, 140, 201, 191, 220, 15, 248, 21, 201, 191, 88, + 234, 45, 56, 118, 64, 4, 2, 197, 242, 250, 237, 196, 66, 64, 4, 2, 197, + 242, 250, 237, 96, 64, 4, 2, 197, 242, 250, 237, 235, 121, 64, 4, 2, 197, + 242, 250, 237, 118, 64, 4, 216, 215, 197, 242, 250, 237, 196, 66, 64, 4, + 216, 215, 197, 242, 250, 237, 96, 64, 4, 216, 215, 197, 242, 250, 237, + 235, 121, 64, 4, 216, 215, 197, 242, 250, 237, 118, 64, 4, 220, 15, 197, + 242, 250, 237, 196, 66, 64, 4, 220, 15, 197, 242, 250, 237, 96, 64, 4, + 220, 15, 197, 242, 250, 237, 235, 121, 64, 4, 220, 15, 197, 242, 250, + 237, 118, 64, 4, 2, 234, 39, 250, 237, 196, 66, 64, 4, 2, 234, 39, 250, + 237, 96, 64, 4, 2, 234, 39, 250, 237, 235, 121, 64, 4, 2, 234, 39, 250, + 237, 118, 64, 4, 234, 39, 250, 237, 196, 66, 64, 4, 234, 39, 250, 237, + 96, 64, 4, 234, 39, 250, 237, 235, 121, 64, 4, 234, 39, 250, 237, 88, + 118, 64, 4, 234, 39, 250, 237, 88, 196, 66, 64, 4, 234, 39, 250, 237, 88, + 96, 64, 4, 234, 39, 250, 237, 88, 235, 121, 64, 4, 234, 39, 250, 237, 88, + 118, 64, 4, 220, 15, 234, 39, 250, 237, 88, 196, 66, 64, 4, 220, 15, 234, + 39, 250, 237, 88, 96, 64, 4, 220, 15, 234, 39, 250, 237, 88, 235, 121, + 64, 4, 220, 15, 234, 39, 250, 237, 118, 197, 240, 64, 4, 214, 217, 203, + 150, 196, 66, 197, 240, 64, 4, 214, 217, 203, 150, 96, 197, 240, 64, 4, + 214, 217, 203, 150, 235, 121, 197, 240, 64, 4, 214, 217, 203, 150, 118, + 197, 240, 64, 4, 216, 215, 203, 150, 196, 66, 197, 240, 64, 4, 216, 215, + 203, 150, 96, 197, 240, 64, 4, 216, 215, 203, 150, 235, 121, 197, 240, + 64, 4, 216, 215, 203, 150, 118, 197, 240, 64, 4, 28, 203, 150, 196, 66, + 197, 240, 64, 4, 28, 203, 150, 96, 197, 240, 64, 4, 28, 203, 150, 235, + 121, 197, 240, 64, 4, 28, 203, 150, 118, 197, 240, 64, 4, 88, 203, 150, + 196, 66, 197, 240, 64, 4, 88, 203, 150, 96, 197, 240, 64, 4, 88, 203, + 150, 235, 121, 197, 240, 64, 4, 88, 203, 150, 118, 197, 240, 64, 4, 195, + 83, 88, 203, 150, 196, 66, 197, 240, 64, 4, 195, 83, 88, 203, 150, 96, + 197, 240, 64, 4, 195, 83, 88, 203, 150, 235, 121, 197, 240, 64, 4, 195, + 83, 88, 203, 150, 118, 232, 253, 57, 196, 66, 232, 253, 57, 96, 232, 253, + 57, 235, 121, 232, 253, 57, 118, 112, 57, 196, 66, 112, 57, 96, 112, 57, + 235, 121, 112, 57, 118, 239, 63, 57, 196, 66, 239, 63, 57, 96, 239, 63, + 57, 235, 121, 239, 63, 57, 118, 88, 239, 63, 57, 196, 66, 88, 239, 63, + 57, 96, 88, 239, 63, 57, 235, 121, 88, 239, 63, 57, 118, 88, 57, 196, 66, + 88, 57, 96, 88, 57, 235, 121, 88, 57, 118, 49, 57, 196, 66, 49, 57, 96, + 49, 57, 235, 121, 49, 57, 186, 193, 105, 49, 57, 186, 234, 206, 49, 57, + 202, 3, 234, 206, 49, 57, 202, 3, 193, 105, 49, 57, 45, 50, 49, 57, 133, + 144, 49, 57, 193, 77, 118, 156, 182, 57, 193, 77, 196, 66, 156, 182, 57, + 193, 77, 96, 156, 182, 57, 193, 77, 235, 121, 156, 182, 57, 193, 77, 186, + 193, 105, 156, 182, 57, 193, 77, 186, 234, 206, 156, 182, 57, 193, 77, + 202, 3, 234, 206, 156, 182, 57, 193, 77, 202, 3, 193, 105, 156, 182, 57, + 193, 77, 118, 182, 57, 193, 77, 196, 66, 182, 57, 193, 77, 96, 182, 57, + 193, 77, 235, 121, 182, 57, 193, 77, 186, 193, 105, 182, 57, 193, 77, + 186, 234, 206, 182, 57, 193, 77, 202, 3, 234, 206, 182, 57, 193, 77, 202, + 3, 193, 105, 182, 57, 193, 77, 118, 216, 215, 182, 57, 193, 77, 196, 66, + 216, 215, 182, 57, 193, 77, 96, 216, 215, 182, 57, 193, 77, 235, 121, + 216, 215, 182, 57, 193, 77, 186, 193, 105, 216, 215, 182, 57, 193, 77, + 186, 234, 206, 216, 215, 182, 57, 193, 77, 202, 3, 234, 206, 216, 215, + 182, 57, 193, 77, 202, 3, 193, 105, 216, 215, 182, 57, 193, 77, 118, 88, + 182, 57, 193, 77, 196, 66, 88, 182, 57, 193, 77, 96, 88, 182, 57, 193, + 77, 235, 121, 88, 182, 57, 193, 77, 186, 193, 105, 88, 182, 57, 193, 77, + 186, 234, 206, 88, 182, 57, 193, 77, 202, 3, 234, 206, 88, 182, 57, 193, + 77, 202, 3, 193, 105, 88, 182, 57, 193, 77, 118, 195, 83, 88, 182, 57, + 193, 77, 196, 66, 195, 83, 88, 182, 57, 193, 77, 96, 195, 83, 88, 182, + 57, 193, 77, 235, 121, 195, 83, 88, 182, 57, 193, 77, 186, 193, 105, 195, + 83, 88, 182, 57, 193, 77, 186, 234, 206, 195, 83, 88, 182, 57, 193, 77, + 202, 3, 234, 206, 195, 83, 88, 182, 57, 193, 77, 202, 3, 193, 105, 195, + 83, 88, 182, 57, 118, 197, 242, 250, 237, 196, 66, 197, 242, 250, 237, + 96, 197, 242, 250, 237, 235, 121, 197, 242, 250, 237, 118, 63, 64, 193, + 53, 197, 242, 250, 237, 196, 66, 63, 64, 193, 53, 197, 242, 250, 237, 96, + 63, 64, 193, 53, 197, 242, 250, 237, 235, 121, 63, 64, 193, 53, 197, 242, + 250, 237, 118, 64, 4, 213, 10, 199, 215, 196, 66, 64, 4, 213, 10, 199, + 215, 96, 64, 4, 213, 10, 199, 215, 235, 121, 64, 4, 213, 10, 199, 215, + 88, 64, 203, 151, 193, 75, 107, 88, 64, 203, 151, 193, 75, 105, 198, 253, + 88, 64, 203, 151, 193, 75, 91, 230, 72, 88, 64, 203, 151, 193, 75, 91, + 199, 0, 118, 248, 76, 63, 57, 96, 248, 79, 203, 153, 63, 57, 118, 198, + 54, 203, 153, 63, 57, 96, 198, 54, 203, 153, 63, 57, 118, 219, 220, 63, + 57, 96, 206, 203, 63, 57, 118, 206, 203, 63, 57, 96, 219, 220, 63, 57, + 118, 249, 147, 203, 152, 63, 57, 96, 249, 147, 203, 152, 63, 57, 118, + 232, 97, 203, 152, 63, 57, 96, 232, 97, 203, 152, 63, 57, 63, 64, 203, + 151, 193, 75, 107, 63, 64, 203, 151, 193, 75, 105, 198, 253, 64, 209, 60, + 196, 66, 199, 25, 186, 193, 104, 64, 209, 60, 96, 199, 25, 238, 163, 202, + 3, 193, 104, 47, 238, 220, 232, 145, 4, 232, 130, 236, 140, 47, 238, 220, + 232, 145, 4, 105, 236, 140, 47, 238, 220, 232, 144, 45, 132, 243, 13, 4, + 232, 130, 236, 140, 45, 132, 243, 13, 4, 115, 236, 140, 45, 132, 243, 13, + 4, 105, 236, 140, 45, 132, 243, 13, 4, 236, 142, 45, 132, 243, 12, 235, + 122, 233, 98, 102, 235, 122, 233, 98, 213, 10, 102, 235, 122, 233, 98, + 228, 253, 4, 236, 142, 235, 122, 233, 98, 213, 10, 228, 253, 4, 236, 142, + 209, 138, 232, 249, 63, 229, 225, 248, 21, 229, 225, 209, 137, 230, 55, + 191, 17, 233, 105, 215, 231, 233, 105, 233, 106, 4, 199, 21, 214, 94, + 233, 105, 199, 2, 233, 105, 233, 106, 4, 229, 236, 206, 151, 233, 105, + 228, 152, 233, 105, 3, 79, 199, 34, 228, 188, 247, 141, 216, 235, 230, + 55, 207, 149, 249, 149, 79, 230, 55, 219, 225, 232, 233, 206, 208, 232, + 233, 230, 29, 230, 56, 4, 141, 23, 82, 232, 250, 238, 215, 228, 76, 218, + 244, 191, 239, 230, 56, 56, 233, 106, 4, 238, 240, 230, 11, 242, 210, + 233, 105, 214, 204, 233, 105, 206, 139, 211, 107, 199, 34, 232, 196, 220, + 1, 235, 102, 233, 105, 218, 180, 233, 105, 233, 106, 210, 184, 202, 57, + 233, 105, 233, 106, 4, 91, 233, 194, 207, 148, 230, 198, 233, 106, 4, + 201, 104, 233, 187, 230, 198, 233, 106, 4, 91, 220, 15, 23, 91, 2, 233, + 195, 233, 106, 4, 232, 255, 238, 243, 242, 221, 219, 98, 204, 3, 233, + 106, 4, 200, 77, 238, 243, 215, 181, 202, 65, 233, 106, 4, 202, 65, 233, + 188, 23, 230, 56, 238, 243, 215, 181, 233, 106, 4, 211, 79, 215, 182, + 195, 9, 203, 55, 233, 106, 4, 233, 210, 229, 237, 208, 228, 193, 35, 248, + 42, 210, 183, 133, 198, 87, 204, 32, 208, 216, 217, 93, 223, 165, 197, + 46, 215, 196, 243, 57, 203, 10, 209, 253, 236, 161, 247, 85, 222, 179, + 233, 40, 216, 1, 210, 23, 193, 8, 193, 144, 209, 46, 230, 34, 236, 203, + 217, 37, 193, 69, 232, 188, 235, 97, 4, 235, 95, 242, 228, 231, 17, 197, + 74, 231, 18, 201, 204, 231, 3, 214, 87, 206, 209, 232, 240, 209, 110, + 216, 221, 205, 58, 209, 110, 216, 221, 199, 1, 209, 110, 216, 221, 248, + 63, 231, 12, 217, 48, 250, 225, 196, 94, 238, 174, 201, 66, 220, 112, + 201, 76, 23, 249, 113, 202, 32, 232, 180, 236, 228, 238, 223, 250, 143, + 238, 190, 249, 140, 209, 14, 247, 89, 249, 126, 248, 45, 230, 203, 205, + 166, 203, 143, 210, 169, 79, 232, 163, 201, 10, 232, 207, 234, 181, 231, + 19, 79, 216, 55, 210, 58, 221, 118, 210, 165, 235, 78, 232, 140, 239, 18, + 199, 207, 248, 64, 243, 64, 248, 69, 4, 201, 204, 238, 184, 4, 201, 44, + 242, 95, 248, 25, 209, 178, 208, 220, 238, 157, 79, 216, 226, 205, 138, + 247, 117, 232, 163, 219, 234, 230, 202, 217, 84, 215, 208, 247, 148, 249, + 129, 202, 65, 233, 106, 4, 202, 65, 233, 188, 23, 115, 229, 223, 192, 87, + 233, 105, 202, 65, 233, 106, 4, 199, 131, 233, 106, 4, 210, 104, 228, + 190, 23, 210, 104, 230, 11, 233, 106, 4, 196, 98, 233, 188, 23, 193, 135, + 215, 181, 211, 7, 233, 105, 232, 109, 233, 105, 213, 170, 236, 226, 233, + 105, 233, 106, 229, 8, 249, 149, 199, 125, 233, 106, 4, 209, 95, 233, + 187, 205, 126, 220, 121, 242, 98, 230, 255, 229, 131, 248, 93, 232, 209, + 203, 53, 238, 237, 219, 102, 233, 105, 205, 82, 197, 62, 196, 96, 233, + 105, 234, 216, 235, 87, 249, 66, 203, 129, 210, 251, 232, 122, 233, 105, + 247, 217, 237, 130, 230, 237, 219, 80, 207, 6, 203, 14, 201, 185, 231, + 31, 233, 105, 191, 85, 233, 105, 229, 218, 205, 111, 200, 42, 238, 226, + 222, 84, 219, 72, 210, 60, 229, 123, 210, 110, 207, 175, 219, 43, 215, + 198, 216, 92, 249, 135, 200, 148, 217, 94, 236, 167, 202, 79, 211, 24, + 211, 56, 202, 103, 232, 211, 210, 241, 249, 6, 248, 151, 205, 62, 230, + 165, 236, 164, 208, 204, 247, 119, 234, 111, 242, 66, 207, 89, 230, 80, + 234, 111, 242, 66, 238, 173, 230, 80, 234, 111, 242, 66, 249, 115, 234, + 111, 242, 66, 63, 230, 80, 248, 100, 219, 214, 232, 161, 198, 56, 200, + 184, 200, 179, 205, 189, 195, 81, 234, 214, 4, 229, 227, 251, 237, 215, + 192, 193, 91, 217, 76, 193, 91, 216, 225, 250, 252, 216, 225, 219, 214, + 243, 120, 193, 116, 238, 182, 205, 160, 203, 147, 248, 210, 248, 64, 231, + 199, 211, 95, 233, 87, 193, 174, 247, 218, 217, 31, 235, 106, 228, 29, + 238, 192, 248, 11, 199, 134, 197, 214, 201, 106, 209, 252, 221, 82, 209, + 252, 237, 146, 209, 252, 233, 106, 4, 215, 226, 252, 31, 243, 88, 211, + 120, 252, 31, 249, 10, 209, 252, 209, 253, 4, 229, 232, 209, 253, 223, + 165, 201, 83, 206, 131, 209, 253, 242, 230, 209, 253, 223, 165, 218, 249, + 209, 26, 217, 126, 233, 89, 195, 177, 216, 176, 234, 127, 231, 150, 191, + 5, 248, 52, 211, 57, 229, 225, 248, 173, 247, 113, 205, 95, 231, 11, 242, + 98, 202, 35, 207, 89, 231, 45, 234, 69, 232, 244, 222, 240, 208, 127, + 209, 177, 199, 75, 197, 84, 209, 237, 236, 224, 236, 178, 55, 229, 206, + 242, 71, 252, 73, 232, 246, 233, 204, 198, 58, 248, 33, 217, 124, 218, + 217, 218, 250, 248, 80, 201, 205, 79, 198, 227, 249, 114, 79, 192, 100, + 205, 189, 209, 141, 199, 124, 249, 11, 248, 22, 249, 71, 206, 142, 79, + 210, 137, 249, 90, 79, 202, 38, 201, 206, 207, 105, 214, 198, 251, 136, + 214, 84, 243, 107, 221, 140, 214, 84, 243, 107, 208, 16, 214, 84, 243, + 107, 206, 132, 214, 84, 243, 107, 248, 154, 214, 84, 243, 107, 221, 78, + 214, 84, 243, 107, 210, 76, 63, 243, 107, 221, 79, 206, 123, 232, 136, + 237, 126, 62, 243, 107, 221, 79, 206, 123, 232, 136, 237, 126, 214, 84, + 243, 107, 221, 79, 206, 123, 232, 136, 237, 126, 63, 243, 107, 221, 141, + 206, 123, 213, 172, 237, 126, 63, 243, 107, 208, 17, 206, 123, 213, 172, + 237, 126, 63, 243, 107, 206, 133, 206, 123, 213, 172, 237, 126, 63, 243, + 107, 248, 155, 206, 123, 213, 172, 237, 126, 63, 243, 107, 221, 79, 206, + 123, 213, 172, 237, 126, 63, 243, 107, 210, 77, 206, 123, 213, 172, 237, + 126, 62, 243, 107, 221, 141, 206, 123, 213, 172, 237, 126, 62, 243, 107, + 208, 17, 206, 123, 213, 172, 237, 126, 62, 243, 107, 206, 133, 206, 123, + 213, 172, 237, 126, 62, 243, 107, 248, 155, 206, 123, 213, 172, 237, 126, + 62, 243, 107, 221, 79, 206, 123, 213, 172, 237, 126, 62, 243, 107, 210, + 77, 206, 123, 213, 172, 237, 126, 214, 84, 243, 107, 221, 141, 206, 123, + 213, 172, 237, 126, 214, 84, 243, 107, 208, 17, 206, 123, 213, 172, 237, + 126, 214, 84, 243, 107, 206, 133, 206, 123, 213, 172, 237, 126, 214, 84, + 243, 107, 248, 155, 206, 123, 213, 172, 237, 126, 214, 84, 243, 107, 221, + 79, 206, 123, 213, 172, 237, 126, 214, 84, 243, 107, 210, 77, 206, 123, + 213, 172, 237, 126, 63, 243, 107, 221, 79, 206, 123, 91, 228, 143, 198, + 248, 237, 126, 62, 243, 107, 221, 79, 206, 123, 91, 228, 143, 198, 248, + 237, 126, 214, 84, 243, 107, 221, 79, 206, 123, 91, 228, 143, 198, 248, + 237, 126, 63, 243, 107, 154, 221, 140, 63, 243, 107, 154, 208, 16, 63, + 243, 107, 154, 206, 132, 63, 243, 107, 154, 248, 154, 63, 243, 107, 154, + 221, 78, 63, 243, 107, 154, 210, 76, 62, 243, 107, 154, 221, 140, 62, + 243, 107, 154, 208, 16, 62, 243, 107, 154, 206, 132, 62, 243, 107, 154, + 248, 154, 62, 243, 107, 154, 221, 78, 62, 243, 107, 154, 210, 76, 214, + 84, 243, 107, 154, 221, 140, 214, 84, 243, 107, 154, 208, 16, 214, 84, + 243, 107, 154, 206, 132, 214, 84, 243, 107, 154, 248, 154, 214, 84, 243, + 107, 154, 221, 78, 214, 84, 243, 107, 154, 210, 76, 63, 243, 107, 221, + 79, 206, 123, 105, 228, 143, 197, 29, 237, 126, 62, 243, 107, 221, 79, + 206, 123, 105, 228, 143, 197, 29, 237, 126, 214, 84, 243, 107, 221, 79, + 206, 123, 105, 228, 143, 197, 29, 237, 126, 63, 243, 107, 221, 141, 206, + 123, 105, 228, 143, 203, 243, 237, 126, 63, 243, 107, 208, 17, 206, 123, + 105, 228, 143, 203, 243, 237, 126, 63, 243, 107, 206, 133, 206, 123, 105, + 228, 143, 203, 243, 237, 126, 63, 243, 107, 248, 155, 206, 123, 105, 228, + 143, 203, 243, 237, 126, 63, 243, 107, 221, 79, 206, 123, 105, 228, 143, + 203, 243, 237, 126, 63, 243, 107, 210, 77, 206, 123, 105, 228, 143, 203, + 243, 237, 126, 62, 243, 107, 221, 141, 206, 123, 105, 228, 143, 203, 243, + 237, 126, 62, 243, 107, 208, 17, 206, 123, 105, 228, 143, 203, 243, 237, + 126, 62, 243, 107, 206, 133, 206, 123, 105, 228, 143, 203, 243, 237, 126, + 62, 243, 107, 248, 155, 206, 123, 105, 228, 143, 203, 243, 237, 126, 62, + 243, 107, 221, 79, 206, 123, 105, 228, 143, 203, 243, 237, 126, 62, 243, + 107, 210, 77, 206, 123, 105, 228, 143, 203, 243, 237, 126, 214, 84, 243, + 107, 221, 141, 206, 123, 105, 228, 143, 203, 243, 237, 126, 214, 84, 243, + 107, 208, 17, 206, 123, 105, 228, 143, 203, 243, 237, 126, 214, 84, 243, + 107, 206, 133, 206, 123, 105, 228, 143, 203, 243, 237, 126, 214, 84, 243, + 107, 248, 155, 206, 123, 105, 228, 143, 203, 243, 237, 126, 214, 84, 243, + 107, 221, 79, 206, 123, 105, 228, 143, 203, 243, 237, 126, 214, 84, 243, + 107, 210, 77, 206, 123, 105, 228, 143, 203, 243, 237, 126, 63, 243, 107, + 221, 79, 206, 123, 115, 228, 143, 233, 22, 237, 126, 62, 243, 107, 221, + 79, 206, 123, 115, 228, 143, 233, 22, 237, 126, 214, 84, 243, 107, 221, + 79, 206, 123, 115, 228, 143, 233, 22, 237, 126, 63, 243, 107, 234, 40, + 62, 243, 107, 234, 40, 214, 84, 243, 107, 234, 40, 63, 243, 107, 234, 41, + 206, 123, 213, 172, 237, 126, 62, 243, 107, 234, 41, 206, 123, 213, 172, + 237, 126, 214, 84, 243, 107, 234, 41, 206, 123, 213, 172, 237, 126, 63, + 243, 107, 221, 76, 63, 243, 107, 221, 75, 63, 243, 107, 221, 77, 62, 243, + 107, 221, 76, 62, 243, 107, 221, 75, 62, 243, 107, 221, 77, 192, 205, + 207, 89, 231, 152, 192, 205, 207, 89, 217, 86, 192, 205, 207, 89, 234, + 133, 192, 205, 207, 89, 228, 185, 192, 205, 207, 89, 243, 140, 192, 205, + 207, 89, 247, 116, 192, 205, 207, 89, 202, 27, 192, 205, 62, 231, 152, + 192, 205, 62, 217, 86, 192, 205, 62, 234, 133, 192, 205, 62, 228, 185, + 192, 205, 62, 243, 140, 192, 205, 62, 247, 116, 192, 205, 62, 202, 27, + 249, 112, 203, 52, 211, 100, 200, 135, 248, 29, 203, 26, 198, 237, 205, + 140, 156, 248, 117, 229, 225, 230, 200, 229, 225, 209, 133, 229, 225, + 235, 101, 79, 248, 122, 252, 37, 249, 98, 201, 77, 192, 234, 238, 203, + 191, 253, 221, 121, 210, 131, 248, 94, 217, 125, 193, 162, 209, 139, 214, + 89, 236, 156, 217, 66, 232, 184, 206, 188, 209, 102, 246, 254, 207, 120, + 250, 134, 236, 198, 220, 27, 249, 96, 216, 56, 229, 202, 252, 58, 180, + 235, 96, 242, 90, 247, 91, 205, 109, 205, 76, 220, 111, 102, 216, 28, + 193, 65, 209, 85, 203, 240, 214, 111, 221, 73, 248, 8, 215, 184, 198, 6, + 198, 55, 229, 230, 209, 111, 206, 148, 216, 29, 249, 113, 228, 18, 247, + 102, 130, 249, 60, 230, 62, 232, 172, 230, 56, 233, 82, 230, 81, 209, + 182, 221, 205, 232, 181, 193, 17, 248, 253, 242, 97, 209, 13, 209, 101, + 193, 28, 233, 56, 218, 248, 239, 6, 234, 107, 214, 91, 214, 92, 4, 234, + 180, 228, 94, 223, 4, 193, 61, 230, 245, 251, 131, 229, 225, 218, 207, + 210, 22, 228, 151, 208, 228, 217, 92, 208, 228, 209, 252, 209, 253, 4, + 238, 210, 215, 206, 236, 149, 248, 115, 248, 238, 210, 17, 211, 117, 232, + 207, 199, 196, 232, 167, 199, 132, 209, 9, 219, 94, 249, 13, 223, 20, + 231, 38, 206, 129, 210, 64, 209, 72, 216, 197, 233, 105, 205, 154, 233, + 105, 233, 106, 4, 211, 79, 233, 188, 23, 230, 56, 139, 215, 181, 233, + 106, 4, 210, 49, 233, 195, 233, 106, 4, 237, 41, 215, 181, 235, 140, 219, + 115, 233, 105, 248, 147, 219, 100, 248, 9, 203, 146, 233, 105, 230, 56, + 4, 141, 232, 255, 23, 176, 238, 215, 96, 230, 55, 118, 230, 55, 210, 185, + 144, 230, 55, 210, 185, 133, 230, 55, 141, 209, 60, 250, 185, 199, 34, + 195, 55, 229, 226, 230, 30, 118, 208, 137, 230, 55, 96, 208, 137, 230, + 55, 184, 203, 237, 184, 203, 207, 184, 203, 236, 184, 203, 192, 184, 203, + 221, 184, 203, 206, 184, 203, 235, 184, 203, 184, 184, 203, 214, 184, + 203, 198, 184, 203, 228, 184, 203, 191, 184, 203, 220, 184, 203, 205, + 184, 203, 234, 184, 203, 180, 184, 203, 210, 184, 203, 195, 184, 203, + 224, 184, 203, 187, 184, 203, 201, 184, 203, 231, 184, 203, 183, 184, + 203, 213, 184, 203, 197, 184, 203, 227, 184, 203, 190, 184, 203, 219, + 184, 203, 204, 184, 203, 233, 184, 203, 178, 184, 203, 208, 184, 203, + 193, 184, 203, 222, 184, 203, 185, 184, 203, 215, 184, 203, 199, 184, + 203, 229, 184, 203, 181, 184, 203, 211, 184, 203, 225, 184, 203, 188, + 184, 203, 217, 184, 203, 202, 184, 203, 232, 184, 203, 179, 184, 203, + 209, 184, 203, 194, 184, 203, 223, 184, 203, 186, 184, 203, 216, 184, 203, 200, 184, 203, 230, 184, 203, 182, 184, 203, 212, 184, 203, 196, - 184, 203, 226, 184, 203, 189, 184, 203, 218, 184, 203, 203, 184, 203, - 232, 184, 203, 177, 184, 203, 207, 184, 203, 192, 184, 203, 221, 184, - 203, 184, 184, 203, 214, 184, 203, 198, 184, 203, 228, 184, 203, 180, - 184, 203, 210, 184, 203, 224, 184, 203, 187, 184, 203, 216, 184, 203, - 201, 184, 203, 231, 184, 203, 178, 184, 203, 208, 184, 203, 193, 184, - 203, 222, 184, 203, 185, 184, 203, 215, 184, 203, 199, 184, 203, 229, - 184, 203, 181, 184, 203, 211, 184, 203, 195, 184, 203, 225, 184, 203, - 188, 184, 203, 217, 184, 203, 202, 110, 45, 184, 237, 39, 110, 82, 45, - 119, 110, 247, 21, 110, 45, 184, 237, 39, 110, 82, 45, 119, 110, 183, - 110, 45, 184, 237, 39, 116, 82, 45, 119, 110, 247, 21, 110, 45, 184, 237, - 39, 116, 82, 45, 119, 110, 183, 110, 45, 184, 237, 39, 116, 45, 119, 110, - 247, 21, 110, 50, 184, 237, 39, 116, 82, 45, 119, 116, 247, 21, 110, 50, - 184, 237, 39, 116, 82, 45, 119, 116, 183, 110, 50, 184, 237, 39, 110, 82, - 45, 119, 116, 247, 21, 110, 50, 184, 237, 39, 110, 82, 45, 119, 116, 183, - 110, 50, 184, 237, 39, 110, 45, 119, 116, 247, 21, 110, 50, 184, 237, 39, - 110, 82, 45, 119, 116, 82, 183, 110, 50, 184, 237, 39, 110, 247, 22, 119, - 110, 82, 183, 110, 50, 184, 237, 39, 110, 45, 119, 110, 82, 183, 110, 50, - 184, 237, 39, 110, 247, 22, 119, 116, 82, 183, 110, 50, 184, 237, 39, - 110, 45, 119, 116, 82, 183, 110, 50, 184, 237, 39, 110, 247, 22, 119, - 116, 183, 110, 45, 184, 237, 39, 116, 247, 22, 119, 116, 82, 183, 110, - 45, 184, 237, 39, 116, 45, 119, 116, 82, 183, 110, 45, 184, 237, 39, 116, - 247, 22, 119, 110, 82, 183, 110, 45, 184, 237, 39, 116, 45, 119, 110, 82, - 183, 110, 45, 184, 237, 39, 116, 247, 22, 119, 110, 183, 110, 45, 184, - 237, 39, 116, 82, 45, 119, 110, 82, 183, 116, 50, 184, 237, 39, 110, 82, - 45, 119, 110, 247, 21, 116, 50, 184, 237, 39, 110, 82, 45, 119, 110, 183, - 116, 50, 184, 237, 39, 116, 82, 45, 119, 110, 247, 21, 116, 50, 184, 237, - 39, 116, 82, 45, 119, 110, 183, 116, 50, 184, 237, 39, 116, 45, 119, 110, - 247, 21, 116, 45, 184, 237, 39, 116, 82, 45, 119, 116, 247, 21, 116, 45, - 184, 237, 39, 116, 82, 45, 119, 116, 183, 116, 45, 184, 237, 39, 110, 82, - 45, 119, 116, 247, 21, 116, 45, 184, 237, 39, 110, 82, 45, 119, 116, 183, - 116, 45, 184, 237, 39, 110, 45, 119, 116, 247, 21, 116, 45, 184, 237, 39, - 110, 82, 45, 119, 116, 82, 183, 116, 45, 184, 237, 39, 110, 247, 22, 119, - 110, 82, 183, 116, 45, 184, 237, 39, 110, 45, 119, 110, 82, 183, 116, 45, - 184, 237, 39, 110, 247, 22, 119, 116, 82, 183, 116, 45, 184, 237, 39, - 110, 45, 119, 116, 82, 183, 116, 45, 184, 237, 39, 110, 247, 22, 119, - 116, 183, 116, 50, 184, 237, 39, 116, 247, 22, 119, 116, 82, 183, 116, - 50, 184, 237, 39, 116, 45, 119, 116, 82, 183, 116, 50, 184, 237, 39, 116, - 247, 22, 119, 110, 82, 183, 116, 50, 184, 237, 39, 116, 45, 119, 110, 82, - 183, 116, 50, 184, 237, 39, 116, 247, 22, 119, 110, 183, 116, 50, 184, - 237, 39, 116, 82, 45, 119, 110, 82, 183, 116, 23, 50, 23, 110, 197, 238, - 115, 208, 21, 248, 129, 45, 23, 110, 23, 50, 197, 238, 115, 208, 21, 248, - 129, 116, 23, 45, 23, 110, 197, 238, 115, 208, 21, 248, 129, 45, 23, 116, - 23, 50, 197, 238, 115, 208, 21, 248, 129, 45, 197, 238, 91, 208, 23, 248, - 129, 116, 197, 238, 91, 208, 23, 248, 129, 50, 197, 238, 91, 208, 23, - 248, 129, 110, 197, 238, 91, 208, 23, 248, 129, 81, 91, 234, 160, 248, - 127, 81, 91, 234, 160, 248, 126, 81, 91, 234, 160, 248, 125, 81, 91, 234, - 160, 248, 124, 81, 91, 234, 160, 248, 123, 81, 91, 234, 160, 248, 122, - 228, 241, 91, 234, 160, 248, 127, 228, 241, 91, 234, 160, 248, 126, 228, - 241, 91, 234, 160, 248, 125, 228, 241, 91, 234, 160, 248, 124, 228, 241, - 91, 234, 160, 248, 123, 228, 241, 91, 234, 160, 248, 122, 45, 23, 110, - 91, 234, 160, 248, 129, 45, 23, 116, 91, 234, 160, 248, 129, 50, 23, 116, - 91, 234, 160, 248, 129, 50, 23, 110, 91, 234, 160, 248, 129, 116, 23, - 110, 91, 234, 160, 248, 129, 228, 241, 91, 234, 160, 248, 128, 116, 91, - 208, 23, 248, 129, 116, 115, 234, 158, 248, 129, 116, 232, 226, 234, 158, - 248, 129, 116, 115, 208, 21, 248, 129, 116, 203, 247, 234, 158, 248, 129, - 50, 91, 208, 23, 248, 129, 50, 115, 234, 158, 248, 129, 50, 232, 226, - 234, 158, 248, 129, 50, 115, 208, 21, 248, 129, 50, 203, 247, 234, 158, - 248, 129, 45, 132, 216, 213, 203, 153, 50, 132, 216, 213, 203, 153, 116, - 132, 216, 213, 203, 153, 110, 132, 216, 213, 203, 153, 223, 95, 216, 213, - 203, 153, 116, 132, 184, 23, 110, 132, 223, 95, 216, 213, 203, 153, 116, - 132, 223, 95, 216, 213, 203, 154, 23, 110, 132, 248, 129, 45, 132, 223, - 95, 216, 213, 203, 154, 23, 50, 132, 248, 129, 243, 124, 248, 108, 233, - 5, 223, 95, 243, 124, 248, 108, 233, 5, 88, 228, 241, 233, 5, 116, 45, - 119, 110, 50, 233, 5, 116, 50, 119, 110, 45, 233, 5, 116, 23, 110, 197, - 238, 132, 248, 129, 45, 23, 50, 197, 238, 132, 248, 129, 116, 45, 197, - 238, 216, 213, 203, 153, 116, 50, 197, 238, 216, 213, 203, 153, 110, 50, - 197, 238, 216, 213, 203, 153, 110, 45, 197, 238, 216, 213, 203, 153, 111, - 122, 156, 237, 39, 116, 247, 22, 119, 82, 219, 224, 111, 122, 156, 237, - 39, 116, 247, 22, 119, 82, 183, 111, 122, 156, 237, 39, 82, 45, 119, 110, - 247, 21, 111, 122, 156, 237, 39, 82, 50, 119, 110, 247, 21, 111, 122, - 156, 237, 39, 116, 247, 22, 119, 82, 45, 119, 110, 247, 21, 111, 122, - 156, 237, 39, 116, 247, 22, 119, 82, 50, 119, 110, 247, 21, 111, 122, - 156, 237, 39, 82, 45, 119, 110, 247, 22, 119, 82, 183, 111, 122, 156, - 237, 39, 82, 45, 119, 116, 247, 22, 119, 82, 183, 111, 122, 156, 237, 39, - 116, 247, 22, 119, 82, 45, 23, 82, 50, 119, 110, 247, 21, 111, 122, 156, - 237, 39, 116, 247, 22, 119, 82, 50, 23, 82, 45, 119, 110, 247, 21, 111, - 122, 156, 237, 39, 116, 247, 22, 119, 82, 50, 119, 110, 247, 22, 119, 82, - 219, 224, 111, 122, 156, 237, 39, 116, 247, 22, 119, 82, 45, 119, 110, - 247, 22, 119, 82, 183, 111, 122, 156, 237, 39, 82, 45, 119, 116, 247, 22, - 119, 82, 50, 119, 110, 247, 21, 111, 122, 156, 237, 39, 82, 50, 119, 116, - 247, 22, 119, 82, 45, 119, 110, 247, 21, 111, 122, 156, 237, 39, 237, 32, - 111, 122, 156, 228, 241, 4, 81, 106, 250, 234, 209, 59, 223, 95, 243, - 126, 77, 45, 132, 206, 42, 217, 90, 50, 132, 206, 42, 217, 90, 223, 95, - 235, 119, 64, 4, 198, 136, 219, 214, 118, 64, 23, 116, 23, 110, 91, 234, - 160, 248, 129, 96, 64, 23, 116, 23, 110, 91, 234, 160, 248, 129, 235, - 119, 64, 23, 50, 91, 234, 160, 248, 129, 196, 66, 64, 23, 50, 91, 234, - 160, 248, 129, 45, 132, 232, 171, 50, 132, 232, 171, 195, 16, 35, 238, - 217, 50, 211, 77, 112, 236, 140, 214, 106, 237, 39, 238, 217, 214, 106, - 237, 39, 82, 50, 119, 110, 247, 21, 214, 106, 237, 39, 237, 32, 63, 88, - 205, 155, 4, 206, 113, 239, 0, 45, 199, 1, 63, 50, 209, 58, 223, 148, 82, - 199, 1, 63, 50, 209, 58, 223, 148, 50, 199, 1, 63, 50, 209, 58, 223, 148, - 214, 106, 112, 208, 13, 77, 201, 75, 233, 12, 201, 75, 233, 13, 4, 250, - 247, 207, 146, 201, 75, 233, 13, 219, 231, 219, 224, 201, 75, 233, 13, - 219, 231, 183, 201, 75, 233, 13, 4, 235, 106, 63, 196, 76, 243, 100, 205, - 42, 17, 191, 77, 205, 42, 17, 107, 205, 42, 17, 109, 205, 42, 17, 138, - 205, 42, 17, 134, 205, 42, 17, 149, 205, 42, 17, 169, 205, 42, 17, 175, - 205, 42, 17, 171, 205, 42, 17, 178, 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, 12, 15, 226, 150, 12, 15, 226, 149, 12, 15, 226, - 148, 12, 15, 226, 147, 12, 15, 226, 146, 12, 15, 226, 145, 12, 15, 226, - 144, 12, 15, 226, 143, 12, 15, 226, 142, 12, 15, 226, 141, 12, 15, 226, - 140, 12, 15, 226, 139, 12, 15, 226, 138, 12, 15, 226, 137, 12, 15, 226, - 136, 12, 15, 226, 135, 12, 15, 226, 134, 12, 15, 226, 133, 12, 15, 226, - 132, 12, 15, 226, 131, 12, 15, 226, 130, 12, 15, 226, 129, 12, 15, 226, - 128, 12, 15, 226, 127, 12, 15, 226, 126, 12, 15, 226, 125, 12, 15, 226, - 124, 12, 15, 226, 123, 12, 15, 226, 122, 12, 15, 226, 121, 12, 15, 226, - 120, 12, 15, 226, 119, 12, 15, 226, 118, 12, 15, 226, 117, 12, 15, 226, - 116, 12, 15, 226, 115, 12, 15, 226, 114, 12, 15, 226, 113, 12, 15, 226, - 112, 12, 15, 226, 111, 12, 15, 226, 110, 12, 15, 226, 109, 12, 15, 226, - 108, 12, 15, 226, 107, 12, 15, 226, 106, 12, 15, 226, 105, 12, 15, 226, - 104, 12, 15, 226, 103, 12, 15, 226, 102, 12, 15, 226, 101, 12, 15, 226, - 100, 12, 15, 226, 99, 12, 15, 226, 98, 12, 15, 226, 97, 12, 15, 226, 96, - 12, 15, 226, 95, 12, 15, 226, 94, 12, 15, 226, 93, 12, 15, 226, 92, 12, - 15, 226, 91, 12, 15, 226, 90, 12, 15, 226, 89, 12, 15, 226, 88, 12, 15, - 226, 87, 12, 15, 226, 86, 12, 15, 226, 85, 12, 15, 226, 84, 12, 15, 226, - 83, 12, 15, 226, 82, 12, 15, 226, 81, 12, 15, 226, 80, 12, 15, 226, 79, - 12, 15, 226, 78, 12, 15, 226, 77, 12, 15, 226, 76, 12, 15, 226, 75, 12, - 15, 226, 74, 12, 15, 226, 73, 12, 15, 226, 72, 12, 15, 226, 71, 12, 15, - 226, 70, 12, 15, 226, 69, 12, 15, 226, 68, 12, 15, 226, 67, 12, 15, 226, - 66, 12, 15, 226, 65, 12, 15, 226, 64, 12, 15, 226, 63, 12, 15, 226, 62, - 12, 15, 226, 61, 12, 15, 226, 60, 12, 15, 226, 59, 12, 15, 226, 58, 12, - 15, 226, 57, 12, 15, 226, 56, 12, 15, 226, 55, 12, 15, 226, 54, 12, 15, - 226, 53, 12, 15, 226, 52, 12, 15, 226, 51, 12, 15, 226, 50, 12, 15, 226, - 49, 12, 15, 226, 48, 12, 15, 226, 47, 12, 15, 226, 46, 12, 15, 226, 45, - 12, 15, 226, 44, 12, 15, 226, 43, 12, 15, 226, 42, 12, 15, 226, 41, 12, - 15, 226, 40, 12, 15, 226, 39, 12, 15, 226, 38, 12, 15, 226, 37, 12, 15, - 226, 36, 12, 15, 226, 35, 12, 15, 226, 34, 12, 15, 226, 33, 12, 15, 226, - 32, 12, 15, 226, 31, 12, 15, 226, 30, 12, 15, 226, 29, 12, 15, 226, 28, - 12, 15, 226, 27, 12, 15, 226, 26, 12, 15, 226, 25, 12, 15, 226, 24, 12, - 15, 226, 23, 12, 15, 226, 22, 12, 15, 226, 21, 12, 15, 226, 20, 12, 15, - 226, 19, 12, 15, 226, 18, 12, 15, 226, 17, 12, 15, 226, 16, 12, 15, 226, - 15, 12, 15, 226, 14, 12, 15, 226, 13, 12, 15, 226, 12, 12, 15, 226, 11, - 12, 15, 226, 10, 12, 15, 226, 9, 12, 15, 226, 8, 12, 15, 226, 7, 12, 15, - 226, 6, 12, 15, 226, 5, 12, 15, 226, 4, 12, 15, 226, 3, 12, 15, 226, 2, - 12, 15, 226, 1, 12, 15, 226, 0, 12, 15, 225, 255, 12, 15, 225, 254, 12, - 15, 225, 253, 12, 15, 225, 252, 12, 15, 225, 251, 12, 15, 225, 250, 12, - 15, 225, 249, 12, 15, 225, 248, 12, 15, 225, 247, 12, 15, 225, 246, 12, - 15, 225, 245, 12, 15, 225, 244, 12, 15, 225, 243, 12, 15, 225, 242, 12, - 15, 225, 241, 12, 15, 225, 240, 220, 20, 199, 223, 199, 224, 201, 247, - 199, 224, 233, 216, 77, 199, 224, 207, 252, 77, 199, 224, 31, 56, 199, - 224, 236, 155, 56, 199, 224, 210, 13, 56, 199, 224, 251, 137, 199, 224, - 251, 49, 199, 224, 45, 210, 113, 199, 224, 50, 210, 113, 199, 224, 250, - 193, 199, 224, 108, 56, 199, 224, 242, 74, 199, 224, 228, 87, 199, 224, - 232, 80, 201, 63, 199, 224, 202, 23, 199, 224, 17, 191, 77, 199, 224, 17, - 107, 199, 224, 17, 109, 199, 224, 17, 138, 199, 224, 17, 134, 199, 224, - 17, 149, 199, 224, 17, 169, 199, 224, 17, 175, 199, 224, 17, 171, 199, - 224, 17, 178, 199, 224, 242, 83, 199, 224, 204, 25, 199, 224, 219, 180, - 56, 199, 224, 234, 43, 56, 199, 224, 230, 204, 56, 199, 224, 208, 13, 77, - 199, 224, 242, 72, 250, 182, 199, 224, 8, 6, 1, 65, 199, 224, 8, 6, 1, - 250, 120, 199, 224, 8, 6, 1, 247, 193, 199, 224, 8, 6, 1, 238, 127, 199, - 224, 8, 6, 1, 71, 199, 224, 8, 6, 1, 233, 175, 199, 224, 8, 6, 1, 232, - 51, 199, 224, 8, 6, 1, 230, 116, 199, 224, 8, 6, 1, 68, 199, 224, 8, 6, - 1, 223, 35, 199, 224, 8, 6, 1, 222, 152, 199, 224, 8, 6, 1, 172, 199, - 224, 8, 6, 1, 218, 168, 199, 224, 8, 6, 1, 215, 61, 199, 224, 8, 6, 1, - 74, 199, 224, 8, 6, 1, 210, 236, 199, 224, 8, 6, 1, 208, 104, 199, 224, - 8, 6, 1, 146, 199, 224, 8, 6, 1, 206, 8, 199, 224, 8, 6, 1, 200, 43, 199, - 224, 8, 6, 1, 66, 199, 224, 8, 6, 1, 196, 12, 199, 224, 8, 6, 1, 193, - 224, 199, 224, 8, 6, 1, 192, 235, 199, 224, 8, 6, 1, 192, 159, 199, 224, - 8, 6, 1, 191, 166, 199, 224, 45, 51, 248, 53, 199, 224, 207, 19, 202, 23, - 199, 224, 50, 51, 248, 53, 199, 224, 243, 2, 252, 60, 199, 224, 130, 219, - 112, 199, 224, 230, 211, 252, 60, 199, 224, 8, 2, 1, 65, 199, 224, 8, 2, - 1, 250, 120, 199, 224, 8, 2, 1, 247, 193, 199, 224, 8, 2, 1, 238, 127, - 199, 224, 8, 2, 1, 71, 199, 224, 8, 2, 1, 233, 175, 199, 224, 8, 2, 1, - 232, 51, 199, 224, 8, 2, 1, 230, 116, 199, 224, 8, 2, 1, 68, 199, 224, 8, - 2, 1, 223, 35, 199, 224, 8, 2, 1, 222, 152, 199, 224, 8, 2, 1, 172, 199, - 224, 8, 2, 1, 218, 168, 199, 224, 8, 2, 1, 215, 61, 199, 224, 8, 2, 1, - 74, 199, 224, 8, 2, 1, 210, 236, 199, 224, 8, 2, 1, 208, 104, 199, 224, - 8, 2, 1, 146, 199, 224, 8, 2, 1, 206, 8, 199, 224, 8, 2, 1, 200, 43, 199, - 224, 8, 2, 1, 66, 199, 224, 8, 2, 1, 196, 12, 199, 224, 8, 2, 1, 193, - 224, 199, 224, 8, 2, 1, 192, 235, 199, 224, 8, 2, 1, 192, 159, 199, 224, - 8, 2, 1, 191, 166, 199, 224, 45, 238, 171, 248, 53, 199, 224, 81, 219, - 112, 199, 224, 50, 238, 171, 248, 53, 199, 224, 198, 152, 247, 127, 199, - 223, 67, 204, 211, 67, 204, 200, 67, 204, 189, 67, 204, 177, 67, 204, - 166, 67, 204, 155, 67, 204, 144, 67, 204, 133, 67, 204, 122, 67, 204, - 114, 67, 204, 113, 67, 204, 112, 67, 204, 111, 67, 204, 109, 67, 204, - 108, 67, 204, 107, 67, 204, 106, 67, 204, 105, 67, 204, 104, 67, 204, - 103, 67, 204, 102, 67, 204, 101, 67, 204, 100, 67, 204, 98, 67, 204, 97, - 67, 204, 96, 67, 204, 95, 67, 204, 94, 67, 204, 93, 67, 204, 92, 67, 204, - 91, 67, 204, 90, 67, 204, 89, 67, 204, 87, 67, 204, 86, 67, 204, 85, 67, - 204, 84, 67, 204, 83, 67, 204, 82, 67, 204, 81, 67, 204, 80, 67, 204, 79, - 67, 204, 78, 67, 204, 76, 67, 204, 75, 67, 204, 74, 67, 204, 73, 67, 204, - 72, 67, 204, 71, 67, 204, 70, 67, 204, 69, 67, 204, 68, 67, 204, 67, 67, - 204, 65, 67, 204, 64, 67, 204, 63, 67, 204, 62, 67, 204, 61, 67, 204, 60, - 67, 204, 59, 67, 204, 58, 67, 204, 57, 67, 204, 56, 67, 204, 54, 67, 204, - 53, 67, 204, 52, 67, 204, 51, 67, 204, 50, 67, 204, 49, 67, 204, 48, 67, - 204, 47, 67, 204, 46, 67, 204, 45, 67, 204, 43, 67, 204, 42, 67, 204, 41, - 67, 204, 40, 67, 204, 39, 67, 204, 38, 67, 204, 37, 67, 204, 36, 67, 204, - 35, 67, 204, 34, 67, 205, 31, 67, 205, 30, 67, 205, 29, 67, 205, 28, 67, - 205, 27, 67, 205, 26, 67, 205, 25, 67, 205, 24, 67, 205, 23, 67, 205, 22, - 67, 205, 20, 67, 205, 19, 67, 205, 18, 67, 205, 17, 67, 205, 16, 67, 205, - 15, 67, 205, 14, 67, 205, 13, 67, 205, 12, 67, 205, 11, 67, 205, 9, 67, - 205, 8, 67, 205, 7, 67, 205, 6, 67, 205, 5, 67, 205, 4, 67, 205, 3, 67, - 205, 2, 67, 205, 1, 67, 205, 0, 67, 204, 254, 67, 204, 253, 67, 204, 252, - 67, 204, 251, 67, 204, 250, 67, 204, 249, 67, 204, 248, 67, 204, 247, 67, - 204, 246, 67, 204, 245, 67, 204, 243, 67, 204, 242, 67, 204, 241, 67, - 204, 240, 67, 204, 239, 67, 204, 238, 67, 204, 237, 67, 204, 236, 67, - 204, 235, 67, 204, 234, 67, 204, 232, 67, 204, 231, 67, 204, 230, 67, - 204, 229, 67, 204, 228, 67, 204, 227, 67, 204, 226, 67, 204, 225, 67, - 204, 224, 67, 204, 223, 67, 204, 221, 67, 204, 220, 67, 204, 219, 67, - 204, 218, 67, 204, 217, 67, 204, 216, 67, 204, 215, 67, 204, 214, 67, - 204, 213, 67, 204, 212, 67, 204, 210, 67, 204, 209, 67, 204, 208, 67, - 204, 207, 67, 204, 206, 67, 204, 205, 67, 204, 204, 67, 204, 203, 67, - 204, 202, 67, 204, 201, 67, 204, 199, 67, 204, 198, 67, 204, 197, 67, - 204, 196, 67, 204, 195, 67, 204, 194, 67, 204, 193, 67, 204, 192, 67, - 204, 191, 67, 204, 190, 67, 204, 188, 67, 204, 187, 67, 204, 186, 67, - 204, 185, 67, 204, 184, 67, 204, 183, 67, 204, 182, 67, 204, 181, 67, - 204, 180, 67, 204, 179, 67, 204, 176, 67, 204, 175, 67, 204, 174, 67, - 204, 173, 67, 204, 172, 67, 204, 171, 67, 204, 170, 67, 204, 169, 67, - 204, 168, 67, 204, 167, 67, 204, 165, 67, 204, 164, 67, 204, 163, 67, - 204, 162, 67, 204, 161, 67, 204, 160, 67, 204, 159, 67, 204, 158, 67, - 204, 157, 67, 204, 156, 67, 204, 154, 67, 204, 153, 67, 204, 152, 67, - 204, 151, 67, 204, 150, 67, 204, 149, 67, 204, 148, 67, 204, 147, 67, - 204, 146, 67, 204, 145, 67, 204, 143, 67, 204, 142, 67, 204, 141, 67, - 204, 140, 67, 204, 139, 67, 204, 138, 67, 204, 137, 67, 204, 136, 67, - 204, 135, 67, 204, 134, 67, 204, 132, 67, 204, 131, 67, 204, 130, 67, - 204, 129, 67, 204, 128, 67, 204, 127, 67, 204, 126, 67, 204, 125, 67, - 204, 124, 67, 204, 123, 67, 204, 121, 67, 204, 120, 67, 204, 119, 67, - 204, 118, 67, 204, 117, 67, 204, 116, 67, 204, 115, 212, 138, 212, 140, - 201, 98, 79, 229, 232, 202, 27, 201, 98, 79, 199, 53, 201, 6, 234, 95, - 79, 199, 53, 233, 244, 234, 95, 79, 198, 11, 234, 57, 234, 81, 234, 82, - 252, 51, 252, 52, 251, 189, 248, 238, 249, 140, 248, 16, 246, 240, 199, - 230, 228, 241, 199, 230, 228, 165, 199, 236, 219, 113, 233, 50, 214, 80, - 219, 112, 234, 95, 79, 219, 112, 219, 161, 213, 105, 234, 60, 219, 113, - 199, 230, 81, 199, 230, 193, 251, 232, 146, 233, 50, 233, 27, 247, 88, - 207, 22, 238, 236, 203, 77, 211, 14, 219, 33, 107, 202, 46, 203, 77, 223, - 162, 219, 33, 191, 77, 202, 222, 237, 210, 219, 103, 234, 14, 236, 185, - 237, 75, 239, 22, 107, 237, 199, 237, 75, 239, 22, 109, 237, 198, 237, - 75, 239, 22, 138, 237, 197, 237, 75, 239, 22, 134, 237, 196, 214, 106, - 252, 51, 214, 233, 200, 69, 223, 228, 200, 73, 234, 95, 79, 198, 12, 248, - 129, 233, 252, 247, 126, 247, 128, 234, 95, 79, 216, 212, 234, 58, 234, - 114, 200, 226, 200, 245, 234, 14, 234, 15, 223, 137, 204, 11, 134, 233, - 7, 204, 10, 232, 90, 223, 137, 204, 11, 138, 230, 187, 204, 10, 230, 184, - 223, 137, 204, 11, 109, 207, 98, 204, 10, 206, 74, 223, 137, 204, 11, - 107, 196, 91, 204, 10, 196, 45, 201, 250, 237, 116, 237, 118, 210, 208, - 246, 239, 210, 210, 137, 211, 158, 208, 220, 228, 244, 248, 42, 210, 1, - 229, 192, 248, 58, 213, 44, 248, 42, 229, 192, 214, 191, 223, 148, 223, - 150, 214, 73, 219, 112, 214, 104, 201, 98, 79, 205, 36, 251, 8, 201, 175, - 234, 95, 79, 205, 36, 251, 8, 234, 17, 246, 240, 199, 231, 203, 252, 228, - 241, 199, 231, 203, 252, 228, 162, 246, 240, 199, 231, 4, 222, 164, 228, - 241, 199, 231, 4, 222, 164, 228, 163, 219, 113, 199, 231, 203, 252, 81, - 199, 231, 203, 252, 193, 250, 210, 105, 219, 113, 232, 132, 210, 105, - 219, 113, 235, 123, 209, 94, 210, 105, 219, 113, 249, 139, 210, 105, 219, - 113, 196, 77, 209, 88, 207, 19, 219, 113, 233, 50, 207, 19, 223, 148, - 207, 1, 202, 170, 203, 77, 109, 202, 167, 201, 177, 202, 170, 203, 77, - 138, 202, 166, 201, 176, 237, 75, 239, 22, 201, 30, 237, 194, 208, 205, - 196, 44, 107, 208, 205, 196, 42, 208, 164, 208, 205, 196, 44, 109, 208, - 205, 196, 41, 208, 163, 203, 253, 198, 10, 201, 95, 201, 13, 247, 127, - 246, 239, 247, 61, 216, 169, 193, 171, 215, 81, 201, 98, 79, 230, 172, - 251, 8, 201, 98, 79, 208, 182, 251, 8, 201, 249, 234, 95, 79, 230, 172, - 251, 8, 234, 95, 79, 208, 182, 251, 8, 234, 55, 201, 98, 79, 201, 30, - 202, 9, 202, 170, 230, 216, 246, 240, 223, 96, 203, 170, 202, 170, 246, - 240, 223, 96, 205, 85, 239, 22, 204, 7, 223, 96, 238, 196, 201, 31, 199, - 80, 201, 118, 211, 68, 200, 58, 242, 73, 211, 34, 208, 206, 216, 168, - 209, 76, 251, 45, 208, 198, 242, 73, 251, 62, 214, 179, 202, 231, 8, 6, - 1, 231, 91, 8, 2, 1, 231, 91, 247, 4, 9, 2, 137, 34, 131, 4, 99, 249, 80, - 251, 166, 200, 63, 200, 232, 242, 84, 202, 110, 219, 224, 222, 81, 1, - 219, 62, 220, 17, 1, 232, 176, 232, 166, 220, 17, 1, 232, 176, 233, 62, - 220, 17, 1, 206, 162, 220, 17, 1, 219, 43, 86, 87, 248, 141, 203, 50, - 231, 54, 216, 118, 207, 9, 30, 125, 192, 54, 30, 125, 192, 50, 30, 125, - 201, 153, 30, 125, 192, 55, 232, 66, 232, 65, 232, 64, 215, 83, 232, 63, - 200, 197, 1, 251, 14, 68, 190, 232, 190, 233, 190, 235, 218, 229, 206, - 170, 218, 231, 206, 172, 210, 66, 218, 228, 206, 169, 213, 75, 216, 16, - 193, 50, 218, 230, 206, 171, 232, 89, 210, 65, 193, 111, 234, 119, 232, - 76, 216, 92, 211, 105, 196, 46, 113, 216, 92, 237, 216, 113, 118, 197, - 240, 64, 4, 55, 81, 106, 96, 197, 240, 64, 4, 55, 81, 106, 11, 5, 223, - 51, 77, 80, 1, 221, 206, 219, 73, 194, 251, 194, 140, 194, 72, 194, 61, - 194, 50, 194, 39, 194, 28, 194, 17, 194, 6, 194, 250, 194, 239, 194, 228, - 194, 217, 194, 206, 194, 195, 194, 184, 208, 221, 232, 146, 40, 81, 50, - 63, 219, 187, 248, 53, 247, 198, 211, 51, 77, 248, 100, 190, 234, 10, 3, - 212, 148, 199, 84, 10, 3, 212, 148, 139, 212, 148, 247, 231, 139, 247, - 230, 216, 218, 6, 1, 230, 116, 216, 218, 6, 1, 214, 70, 216, 218, 2, 1, - 230, 116, 216, 218, 2, 1, 214, 70, 61, 1, 235, 14, 73, 37, 16, 232, 88, - 202, 106, 243, 52, 195, 164, 194, 173, 194, 162, 194, 151, 194, 139, 194, - 128, 194, 117, 194, 106, 194, 95, 194, 84, 194, 76, 194, 75, 194, 74, - 194, 73, 194, 71, 194, 70, 194, 69, 194, 68, 194, 67, 194, 66, 194, 65, - 194, 64, 194, 63, 194, 62, 194, 60, 194, 59, 194, 58, 194, 57, 194, 56, - 194, 55, 194, 54, 194, 53, 194, 52, 194, 51, 194, 49, 194, 48, 194, 47, - 194, 46, 194, 45, 194, 44, 194, 43, 194, 42, 194, 41, 194, 40, 194, 38, - 194, 37, 194, 36, 194, 35, 194, 34, 194, 33, 194, 32, 194, 31, 194, 30, - 194, 29, 194, 27, 194, 26, 194, 25, 194, 24, 194, 23, 194, 22, 194, 21, - 194, 20, 194, 19, 194, 18, 194, 16, 194, 15, 194, 14, 194, 13, 194, 12, - 194, 11, 194, 10, 194, 9, 194, 8, 194, 7, 194, 5, 194, 4, 194, 3, 194, 2, - 194, 1, 194, 0, 193, 255, 193, 254, 193, 253, 193, 252, 194, 249, 194, - 248, 194, 247, 194, 246, 194, 245, 194, 244, 194, 243, 194, 242, 194, - 241, 194, 240, 194, 238, 194, 237, 194, 236, 194, 235, 194, 234, 194, - 233, 194, 232, 194, 231, 194, 230, 194, 229, 194, 227, 194, 226, 194, - 225, 194, 224, 194, 223, 194, 222, 194, 221, 194, 220, 194, 219, 194, - 218, 194, 216, 194, 215, 194, 214, 194, 213, 194, 212, 194, 211, 194, - 210, 194, 209, 194, 208, 194, 207, 194, 205, 194, 204, 194, 203, 194, - 202, 194, 201, 194, 200, 194, 199, 194, 198, 194, 197, 194, 196, 194, - 194, 194, 193, 194, 192, 194, 191, 194, 190, 194, 189, 194, 188, 194, - 187, 194, 186, 194, 185, 194, 183, 194, 182, 194, 181, 194, 180, 194, - 179, 194, 178, 194, 177, 194, 176, 194, 175, 194, 174, 194, 172, 194, - 171, 194, 170, 194, 169, 194, 168, 194, 167, 194, 166, 194, 165, 194, - 164, 194, 163, 194, 161, 194, 160, 194, 159, 194, 158, 194, 157, 194, - 156, 194, 155, 194, 154, 194, 153, 194, 152, 194, 150, 194, 149, 194, - 148, 194, 147, 194, 146, 194, 145, 194, 144, 194, 143, 194, 142, 194, - 141, 194, 138, 194, 137, 194, 136, 194, 135, 194, 134, 194, 133, 194, - 132, 194, 131, 194, 130, 194, 129, 194, 127, 194, 126, 194, 125, 194, - 124, 194, 123, 194, 122, 194, 121, 194, 120, 194, 119, 194, 118, 194, - 116, 194, 115, 194, 114, 194, 113, 194, 112, 194, 111, 194, 110, 194, - 109, 194, 108, 194, 107, 194, 105, 194, 104, 194, 103, 194, 102, 194, - 101, 194, 100, 194, 99, 194, 98, 194, 97, 194, 96, 194, 94, 194, 93, 194, - 92, 194, 91, 194, 90, 194, 89, 194, 88, 194, 87, 194, 86, 194, 85, 194, - 83, 194, 82, 194, 81, 194, 80, 194, 79, 194, 78, 194, 77, 221, 219, 31, - 56, 221, 219, 250, 193, 221, 219, 17, 191, 77, 221, 219, 17, 107, 221, - 219, 17, 109, 221, 219, 17, 138, 221, 219, 17, 134, 221, 219, 17, 149, - 221, 219, 17, 169, 221, 219, 17, 175, 221, 219, 17, 171, 221, 219, 17, - 178, 8, 6, 1, 42, 4, 217, 147, 23, 230, 210, 8, 2, 1, 42, 4, 217, 147, - 23, 230, 210, 8, 6, 1, 228, 74, 4, 217, 147, 23, 230, 210, 8, 2, 1, 228, - 74, 4, 217, 147, 23, 230, 210, 8, 6, 1, 126, 4, 217, 147, 23, 230, 210, - 8, 2, 1, 126, 4, 217, 147, 23, 230, 210, 8, 6, 1, 235, 15, 4, 81, 219, - 113, 60, 8, 2, 1, 235, 15, 4, 81, 219, 113, 60, 8, 6, 1, 235, 15, 4, 81, - 219, 113, 248, 233, 23, 230, 210, 8, 2, 1, 235, 15, 4, 81, 219, 113, 248, - 233, 23, 230, 210, 8, 6, 1, 235, 15, 4, 81, 219, 113, 248, 233, 23, 252, - 46, 8, 2, 1, 235, 15, 4, 81, 219, 113, 248, 233, 23, 252, 46, 8, 6, 1, - 187, 4, 81, 219, 113, 60, 8, 2, 1, 187, 4, 81, 219, 113, 60, 8, 6, 1, - 187, 4, 81, 219, 113, 248, 233, 23, 230, 210, 8, 2, 1, 187, 4, 81, 219, - 113, 248, 233, 23, 230, 210, 8, 6, 1, 187, 4, 81, 219, 113, 248, 233, 23, - 252, 46, 8, 2, 1, 187, 4, 81, 219, 113, 248, 233, 23, 252, 46, 8, 6, 1, - 206, 9, 4, 81, 219, 113, 60, 8, 2, 1, 206, 9, 4, 81, 219, 113, 60, 8, 6, - 1, 235, 15, 4, 243, 2, 23, 217, 146, 8, 2, 1, 235, 15, 4, 243, 2, 23, - 217, 146, 8, 6, 1, 235, 15, 4, 243, 2, 23, 247, 92, 8, 2, 1, 235, 15, 4, - 243, 2, 23, 247, 92, 8, 2, 1, 228, 74, 4, 75, 93, 23, 252, 46, 8, 2, 1, - 214, 71, 4, 198, 153, 58, 8, 6, 1, 42, 4, 211, 139, 23, 252, 46, 8, 2, 1, - 42, 4, 211, 139, 23, 252, 46, 8, 6, 1, 42, 4, 211, 139, 23, 198, 152, 8, - 2, 1, 42, 4, 211, 139, 23, 198, 152, 8, 6, 1, 235, 15, 4, 211, 139, 23, - 252, 46, 8, 2, 1, 235, 15, 4, 211, 139, 23, 252, 46, 8, 6, 1, 235, 15, 4, - 211, 139, 23, 198, 152, 8, 2, 1, 235, 15, 4, 211, 139, 23, 198, 152, 8, - 6, 1, 235, 15, 4, 75, 93, 23, 252, 46, 8, 2, 1, 235, 15, 4, 75, 93, 23, - 252, 46, 8, 6, 1, 235, 15, 4, 75, 93, 23, 198, 152, 8, 2, 1, 235, 15, 4, - 75, 93, 23, 198, 152, 8, 2, 1, 228, 74, 4, 75, 93, 23, 230, 210, 8, 2, 1, - 228, 74, 4, 75, 93, 23, 198, 152, 8, 6, 1, 228, 74, 4, 211, 139, 23, 252, - 46, 8, 2, 1, 228, 74, 4, 211, 139, 23, 75, 93, 23, 252, 46, 8, 6, 1, 228, - 74, 4, 211, 139, 23, 198, 152, 8, 2, 1, 228, 74, 4, 211, 139, 23, 75, 93, - 23, 198, 152, 8, 6, 1, 223, 36, 4, 198, 152, 8, 2, 1, 223, 36, 4, 75, 93, - 23, 198, 152, 8, 6, 1, 220, 143, 4, 198, 152, 8, 2, 1, 220, 143, 4, 198, - 152, 8, 6, 1, 218, 169, 4, 198, 152, 8, 2, 1, 218, 169, 4, 198, 152, 8, - 6, 1, 207, 222, 4, 198, 152, 8, 2, 1, 207, 222, 4, 198, 152, 8, 6, 1, - 126, 4, 211, 139, 23, 252, 46, 8, 2, 1, 126, 4, 211, 139, 23, 252, 46, 8, - 6, 1, 126, 4, 211, 139, 23, 198, 152, 8, 2, 1, 126, 4, 211, 139, 23, 198, - 152, 8, 6, 1, 126, 4, 217, 147, 23, 252, 46, 8, 2, 1, 126, 4, 217, 147, - 23, 252, 46, 8, 6, 1, 126, 4, 217, 147, 23, 198, 152, 8, 2, 1, 126, 4, - 217, 147, 23, 198, 152, 8, 2, 1, 252, 26, 4, 230, 210, 8, 2, 1, 211, 77, - 187, 4, 230, 210, 8, 2, 1, 211, 77, 187, 4, 252, 46, 8, 2, 1, 153, 196, - 13, 4, 230, 210, 8, 2, 1, 153, 196, 13, 4, 252, 46, 8, 2, 1, 205, 87, 4, - 230, 210, 8, 2, 1, 205, 87, 4, 252, 46, 8, 2, 1, 228, 250, 205, 87, 4, - 230, 210, 8, 2, 1, 228, 250, 205, 87, 4, 252, 46, 9, 204, 7, 99, 4, 230, - 58, 93, 4, 251, 192, 9, 204, 7, 99, 4, 230, 58, 93, 4, 193, 133, 9, 204, - 7, 99, 4, 230, 58, 93, 4, 131, 217, 99, 9, 204, 7, 99, 4, 230, 58, 93, 4, - 211, 151, 9, 204, 7, 99, 4, 230, 58, 93, 4, 66, 9, 204, 7, 99, 4, 230, - 58, 93, 4, 191, 225, 9, 204, 7, 99, 4, 230, 58, 93, 4, 71, 9, 204, 7, 99, - 4, 230, 58, 93, 4, 252, 25, 9, 204, 7, 213, 25, 4, 222, 4, 100, 204, 7, - 40, 1, 208, 96, 100, 204, 7, 40, 1, 221, 193, 100, 204, 7, 40, 1, 231, - 66, 100, 204, 7, 40, 1, 191, 123, 100, 204, 7, 40, 1, 237, 180, 100, 204, - 7, 40, 1, 207, 6, 100, 204, 7, 40, 1, 233, 109, 100, 204, 7, 40, 1, 191, - 175, 248, 225, 204, 7, 40, 1, 206, 109, 248, 225, 204, 7, 40, 1, 207, 6, - 248, 225, 204, 7, 40, 1, 191, 175, 230, 144, 204, 7, 40, 1, 219, 73, 230, - 144, 204, 7, 40, 1, 203, 165, 230, 144, 204, 7, 40, 1, 221, 193, 230, - 144, 204, 7, 40, 1, 231, 66, 230, 144, 204, 7, 40, 1, 191, 123, 230, 144, - 204, 7, 40, 1, 233, 109, 211, 45, 204, 7, 40, 1, 206, 109, 211, 45, 204, - 7, 40, 1, 207, 6, 248, 225, 1, 221, 187, 44, 120, 222, 152, 44, 120, 214, - 70, 44, 120, 247, 193, 44, 120, 212, 103, 44, 120, 197, 135, 44, 120, - 213, 80, 44, 120, 200, 43, 44, 120, 215, 61, 44, 120, 210, 236, 44, 120, - 218, 168, 44, 120, 192, 159, 44, 120, 146, 44, 120, 172, 44, 120, 196, - 12, 44, 120, 219, 63, 44, 120, 219, 74, 44, 120, 206, 110, 44, 120, 213, - 62, 44, 120, 223, 35, 44, 120, 203, 167, 44, 120, 201, 178, 44, 120, 206, - 8, 44, 120, 230, 116, 44, 120, 220, 247, 44, 5, 222, 127, 44, 5, 221, - 166, 44, 5, 221, 145, 44, 5, 220, 232, 44, 5, 220, 187, 44, 5, 222, 22, - 44, 5, 222, 13, 44, 5, 222, 102, 44, 5, 221, 67, 44, 5, 221, 41, 44, 5, - 222, 42, 44, 5, 214, 67, 44, 5, 214, 16, 44, 5, 214, 12, 44, 5, 213, 237, - 44, 5, 213, 228, 44, 5, 214, 55, 44, 5, 214, 53, 44, 5, 214, 64, 44, 5, - 213, 249, 44, 5, 213, 244, 44, 5, 214, 57, 44, 5, 247, 159, 44, 5, 243, - 29, 44, 5, 243, 19, 44, 5, 238, 195, 44, 5, 238, 153, 44, 5, 247, 42, 44, - 5, 247, 34, 44, 5, 247, 148, 44, 5, 242, 99, 44, 5, 239, 18, 44, 5, 247, - 76, 44, 5, 212, 100, 44, 5, 212, 81, 44, 5, 212, 75, 44, 5, 212, 58, 44, - 5, 212, 50, 44, 5, 212, 90, 44, 5, 212, 89, 44, 5, 212, 97, 44, 5, 212, - 65, 44, 5, 212, 62, 44, 5, 212, 93, 44, 5, 197, 131, 44, 5, 197, 111, 44, - 5, 197, 110, 44, 5, 197, 99, 44, 5, 197, 96, 44, 5, 197, 127, 44, 5, 197, - 126, 44, 5, 197, 130, 44, 5, 197, 109, 44, 5, 197, 108, 44, 5, 197, 129, - 44, 5, 213, 78, 44, 5, 213, 64, 44, 5, 213, 63, 44, 5, 213, 47, 44, 5, - 213, 46, 44, 5, 213, 74, 44, 5, 213, 73, 44, 5, 213, 77, 44, 5, 213, 49, - 44, 5, 213, 48, 44, 5, 213, 76, 44, 5, 199, 245, 44, 5, 198, 193, 44, 5, - 198, 170, 44, 5, 197, 94, 44, 5, 197, 49, 44, 5, 199, 145, 44, 5, 199, - 121, 44, 5, 199, 217, 44, 5, 159, 44, 5, 198, 59, 44, 5, 199, 166, 44, 5, - 214, 250, 44, 5, 213, 219, 44, 5, 213, 186, 44, 5, 212, 178, 44, 5, 212, - 115, 44, 5, 214, 121, 44, 5, 214, 110, 44, 5, 214, 236, 44, 5, 213, 43, - 44, 5, 213, 26, 44, 5, 214, 205, 44, 5, 210, 220, 44, 5, 209, 185, 44, 5, - 209, 145, 44, 5, 208, 165, 44, 5, 208, 128, 44, 5, 210, 63, 44, 5, 210, - 49, 44, 5, 210, 198, 44, 5, 209, 73, 44, 5, 209, 37, 44, 5, 210, 80, 44, - 5, 217, 151, 44, 5, 216, 100, 44, 5, 216, 61, 44, 5, 215, 155, 44, 5, - 215, 93, 44, 5, 216, 232, 44, 5, 216, 211, 44, 5, 217, 112, 44, 5, 216, - 12, 44, 5, 215, 211, 44, 5, 217, 25, 44, 5, 192, 140, 44, 5, 192, 33, 44, - 5, 192, 23, 44, 5, 191, 225, 44, 5, 191, 188, 44, 5, 192, 80, 44, 5, 192, - 77, 44, 5, 192, 119, 44, 5, 192, 12, 44, 5, 191, 246, 44, 5, 192, 91, 44, - 5, 207, 178, 44, 5, 207, 1, 44, 5, 206, 195, 44, 5, 206, 68, 44, 5, 206, - 29, 44, 5, 207, 113, 44, 5, 207, 84, 44, 5, 207, 156, 44, 5, 206, 162, - 44, 5, 206, 134, 44, 5, 207, 125, 44, 5, 220, 125, 44, 5, 219, 146, 44, - 5, 219, 128, 44, 5, 218, 225, 44, 5, 218, 194, 44, 5, 219, 238, 44, 5, - 219, 228, 44, 5, 220, 96, 44, 5, 219, 43, 44, 5, 219, 8, 44, 5, 220, 0, - 44, 5, 195, 187, 44, 5, 195, 69, 44, 5, 195, 51, 44, 5, 193, 249, 44, 5, - 193, 241, 44, 5, 195, 153, 44, 5, 195, 148, 44, 5, 195, 183, 44, 5, 195, - 24, 44, 5, 195, 8, 44, 5, 195, 160, 44, 5, 219, 61, 44, 5, 219, 56, 44, - 5, 219, 55, 44, 5, 219, 52, 44, 5, 219, 51, 44, 5, 219, 58, 44, 5, 219, - 57, 44, 5, 219, 60, 44, 5, 219, 54, 44, 5, 219, 53, 44, 5, 219, 59, 44, - 5, 219, 72, 44, 5, 219, 65, 44, 5, 219, 64, 44, 5, 219, 48, 44, 5, 219, - 47, 44, 5, 219, 68, 44, 5, 219, 67, 44, 5, 219, 71, 44, 5, 219, 50, 44, - 5, 219, 49, 44, 5, 219, 69, 44, 5, 206, 108, 44, 5, 206, 97, 44, 5, 206, - 96, 44, 5, 206, 89, 44, 5, 206, 82, 44, 5, 206, 104, 44, 5, 206, 103, 44, - 5, 206, 107, 44, 5, 206, 95, 44, 5, 206, 94, 44, 5, 206, 106, 44, 5, 213, - 60, 44, 5, 213, 55, 44, 5, 213, 54, 44, 5, 213, 51, 44, 5, 213, 50, 44, - 5, 213, 57, 44, 5, 213, 56, 44, 5, 213, 59, 44, 5, 213, 53, 44, 5, 213, - 52, 44, 5, 213, 58, 44, 5, 223, 31, 44, 5, 222, 244, 44, 5, 222, 236, 44, - 5, 222, 182, 44, 5, 222, 162, 44, 5, 223, 10, 44, 5, 223, 8, 44, 5, 223, - 25, 44, 5, 222, 201, 44, 5, 222, 191, 44, 5, 223, 17, 44, 5, 203, 160, - 44, 5, 203, 81, 44, 5, 203, 76, 44, 5, 203, 5, 44, 5, 202, 243, 44, 5, - 203, 113, 44, 5, 203, 111, 44, 5, 203, 148, 44, 5, 203, 56, 44, 5, 203, - 48, 44, 5, 203, 122, 44, 5, 201, 174, 44, 5, 201, 142, 44, 5, 201, 138, - 44, 5, 201, 129, 44, 5, 201, 126, 44, 5, 201, 148, 44, 5, 201, 147, 44, - 5, 201, 173, 44, 5, 201, 134, 44, 5, 201, 133, 44, 5, 201, 150, 44, 5, - 205, 197, 44, 5, 202, 222, 44, 5, 202, 193, 44, 5, 201, 4, 44, 5, 200, - 160, 44, 5, 205, 68, 44, 5, 205, 50, 44, 5, 205, 181, 44, 5, 202, 46, 44, - 5, 202, 16, 44, 5, 205, 114, 44, 5, 230, 91, 44, 5, 229, 158, 44, 5, 229, - 130, 44, 5, 228, 159, 44, 5, 228, 128, 44, 5, 229, 245, 44, 5, 229, 215, - 44, 5, 230, 80, 44, 5, 229, 23, 44, 5, 228, 252, 44, 5, 230, 2, 44, 5, - 220, 246, 44, 5, 220, 245, 44, 5, 220, 240, 44, 5, 220, 239, 44, 5, 220, - 236, 44, 5, 220, 235, 44, 5, 220, 242, 44, 5, 220, 241, 44, 5, 220, 244, - 44, 5, 220, 238, 44, 5, 220, 237, 44, 5, 220, 243, 44, 5, 203, 14, 166, - 120, 3, 192, 105, 166, 120, 3, 207, 144, 166, 120, 3, 207, 50, 101, 1, - 196, 224, 95, 120, 3, 242, 91, 155, 95, 120, 3, 242, 91, 221, 215, 95, - 120, 3, 242, 91, 221, 67, 95, 120, 3, 242, 91, 221, 183, 95, 120, 3, 242, - 91, 213, 249, 95, 120, 3, 242, 91, 247, 160, 95, 120, 3, 242, 91, 247, 1, - 95, 120, 3, 242, 91, 242, 99, 95, 120, 3, 242, 91, 243, 68, 95, 120, 3, - 242, 91, 212, 65, 95, 120, 3, 242, 91, 238, 32, 95, 120, 3, 242, 91, 197, - 120, 95, 120, 3, 242, 91, 236, 174, 95, 120, 3, 242, 91, 197, 115, 95, - 120, 3, 242, 91, 180, 95, 120, 3, 242, 91, 190, 190, 95, 120, 3, 242, 91, - 199, 49, 95, 120, 3, 242, 91, 159, 95, 120, 3, 242, 91, 198, 241, 95, - 120, 3, 242, 91, 213, 43, 95, 120, 3, 242, 91, 249, 153, 95, 120, 3, 242, - 91, 209, 228, 95, 120, 3, 242, 91, 209, 73, 95, 120, 3, 242, 91, 209, - 199, 95, 120, 3, 242, 91, 216, 12, 95, 120, 3, 242, 91, 192, 12, 95, 120, - 3, 242, 91, 206, 162, 95, 120, 3, 242, 91, 219, 43, 95, 120, 3, 242, 91, - 195, 24, 95, 120, 3, 242, 91, 203, 165, 95, 120, 3, 242, 91, 201, 175, - 95, 120, 3, 242, 91, 188, 95, 120, 3, 242, 91, 140, 95, 120, 3, 242, 91, - 173, 95, 18, 3, 242, 91, 208, 96, 95, 223, 149, 18, 3, 242, 91, 208, 33, - 95, 223, 149, 18, 3, 242, 91, 206, 17, 95, 223, 149, 18, 3, 242, 91, 206, - 10, 95, 223, 149, 18, 3, 242, 91, 208, 75, 95, 18, 3, 211, 113, 95, 18, - 3, 252, 167, 229, 120, 1, 248, 181, 214, 68, 229, 120, 1, 248, 181, 214, - 16, 229, 120, 1, 248, 181, 213, 237, 229, 120, 1, 248, 181, 214, 55, 229, - 120, 1, 248, 181, 213, 249, 72, 1, 248, 181, 214, 68, 72, 1, 248, 181, - 214, 16, 72, 1, 248, 181, 213, 237, 72, 1, 248, 181, 214, 55, 72, 1, 248, - 181, 213, 249, 72, 1, 251, 228, 247, 42, 72, 1, 251, 228, 197, 94, 72, 1, - 251, 228, 159, 72, 1, 251, 228, 210, 236, 52, 1, 233, 200, 233, 199, 239, - 26, 163, 164, 52, 1, 233, 199, 233, 200, 239, 26, 163, 164, + 184, 203, 226, 184, 203, 189, 184, 203, 218, 184, 203, 203, 110, 45, 184, + 237, 41, 110, 82, 45, 119, 110, 247, 23, 110, 45, 184, 237, 41, 110, 82, + 45, 119, 110, 179, 110, 45, 184, 237, 41, 116, 82, 45, 119, 110, 247, 23, + 110, 45, 184, 237, 41, 116, 82, 45, 119, 110, 179, 110, 45, 184, 237, 41, + 116, 45, 119, 110, 247, 23, 110, 50, 184, 237, 41, 116, 82, 45, 119, 116, + 247, 23, 110, 50, 184, 237, 41, 116, 82, 45, 119, 116, 179, 110, 50, 184, + 237, 41, 110, 82, 45, 119, 116, 247, 23, 110, 50, 184, 237, 41, 110, 82, + 45, 119, 116, 179, 110, 50, 184, 237, 41, 110, 45, 119, 116, 247, 23, + 110, 50, 184, 237, 41, 110, 82, 45, 119, 116, 82, 179, 110, 50, 184, 237, + 41, 110, 247, 24, 119, 110, 82, 179, 110, 50, 184, 237, 41, 110, 45, 119, + 110, 82, 179, 110, 50, 184, 237, 41, 110, 247, 24, 119, 116, 82, 179, + 110, 50, 184, 237, 41, 110, 45, 119, 116, 82, 179, 110, 50, 184, 237, 41, + 110, 247, 24, 119, 116, 179, 110, 45, 184, 237, 41, 116, 247, 24, 119, + 116, 82, 179, 110, 45, 184, 237, 41, 116, 45, 119, 116, 82, 179, 110, 45, + 184, 237, 41, 116, 247, 24, 119, 110, 82, 179, 110, 45, 184, 237, 41, + 116, 45, 119, 110, 82, 179, 110, 45, 184, 237, 41, 116, 247, 24, 119, + 110, 179, 110, 45, 184, 237, 41, 116, 82, 45, 119, 110, 82, 179, 116, 50, + 184, 237, 41, 110, 82, 45, 119, 110, 247, 23, 116, 50, 184, 237, 41, 110, + 82, 45, 119, 110, 179, 116, 50, 184, 237, 41, 116, 82, 45, 119, 110, 247, + 23, 116, 50, 184, 237, 41, 116, 82, 45, 119, 110, 179, 116, 50, 184, 237, + 41, 116, 45, 119, 110, 247, 23, 116, 45, 184, 237, 41, 116, 82, 45, 119, + 116, 247, 23, 116, 45, 184, 237, 41, 116, 82, 45, 119, 116, 179, 116, 45, + 184, 237, 41, 110, 82, 45, 119, 116, 247, 23, 116, 45, 184, 237, 41, 110, + 82, 45, 119, 116, 179, 116, 45, 184, 237, 41, 110, 45, 119, 116, 247, 23, + 116, 45, 184, 237, 41, 110, 82, 45, 119, 116, 82, 179, 116, 45, 184, 237, + 41, 110, 247, 24, 119, 110, 82, 179, 116, 45, 184, 237, 41, 110, 45, 119, + 110, 82, 179, 116, 45, 184, 237, 41, 110, 247, 24, 119, 116, 82, 179, + 116, 45, 184, 237, 41, 110, 45, 119, 116, 82, 179, 116, 45, 184, 237, 41, + 110, 247, 24, 119, 116, 179, 116, 50, 184, 237, 41, 116, 247, 24, 119, + 116, 82, 179, 116, 50, 184, 237, 41, 116, 45, 119, 116, 82, 179, 116, 50, + 184, 237, 41, 116, 247, 24, 119, 110, 82, 179, 116, 50, 184, 237, 41, + 116, 45, 119, 110, 82, 179, 116, 50, 184, 237, 41, 116, 247, 24, 119, + 110, 179, 116, 50, 184, 237, 41, 116, 82, 45, 119, 110, 82, 179, 116, 23, + 50, 23, 110, 197, 238, 115, 208, 23, 248, 131, 45, 23, 110, 23, 50, 197, + 238, 115, 208, 23, 248, 131, 116, 23, 45, 23, 110, 197, 238, 115, 208, + 23, 248, 131, 45, 23, 116, 23, 50, 197, 238, 115, 208, 23, 248, 131, 45, + 197, 238, 91, 208, 25, 248, 131, 116, 197, 238, 91, 208, 25, 248, 131, + 50, 197, 238, 91, 208, 25, 248, 131, 110, 197, 238, 91, 208, 25, 248, + 131, 81, 91, 234, 162, 248, 129, 81, 91, 234, 162, 248, 128, 81, 91, 234, + 162, 248, 127, 81, 91, 234, 162, 248, 126, 81, 91, 234, 162, 248, 125, + 81, 91, 234, 162, 248, 124, 228, 243, 91, 234, 162, 248, 129, 228, 243, + 91, 234, 162, 248, 128, 228, 243, 91, 234, 162, 248, 127, 228, 243, 91, + 234, 162, 248, 126, 228, 243, 91, 234, 162, 248, 125, 228, 243, 91, 234, + 162, 248, 124, 45, 23, 110, 91, 234, 162, 248, 131, 45, 23, 116, 91, 234, + 162, 248, 131, 50, 23, 116, 91, 234, 162, 248, 131, 50, 23, 110, 91, 234, + 162, 248, 131, 116, 23, 110, 91, 234, 162, 248, 131, 228, 243, 91, 234, + 162, 248, 130, 116, 91, 208, 25, 248, 131, 116, 115, 234, 160, 248, 131, + 116, 232, 228, 234, 160, 248, 131, 116, 115, 208, 23, 248, 131, 116, 203, + 248, 234, 160, 248, 131, 50, 91, 208, 25, 248, 131, 50, 115, 234, 160, + 248, 131, 50, 232, 228, 234, 160, 248, 131, 50, 115, 208, 23, 248, 131, + 50, 203, 248, 234, 160, 248, 131, 45, 132, 216, 215, 203, 154, 50, 132, + 216, 215, 203, 154, 116, 132, 216, 215, 203, 154, 110, 132, 216, 215, + 203, 154, 223, 97, 216, 215, 203, 154, 116, 132, 184, 23, 110, 132, 223, + 97, 216, 215, 203, 154, 116, 132, 223, 97, 216, 215, 203, 155, 23, 110, + 132, 248, 131, 45, 132, 223, 97, 216, 215, 203, 155, 23, 50, 132, 248, + 131, 243, 126, 248, 110, 233, 7, 223, 97, 243, 126, 248, 110, 233, 7, 88, + 228, 243, 233, 7, 116, 45, 119, 110, 50, 233, 7, 116, 50, 119, 110, 45, + 233, 7, 116, 23, 110, 197, 238, 132, 248, 131, 45, 23, 50, 197, 238, 132, + 248, 131, 116, 45, 197, 238, 216, 215, 203, 154, 116, 50, 197, 238, 216, + 215, 203, 154, 110, 50, 197, 238, 216, 215, 203, 154, 110, 45, 197, 238, + 216, 215, 203, 154, 111, 122, 156, 237, 41, 116, 247, 24, 119, 82, 219, + 226, 111, 122, 156, 237, 41, 116, 247, 24, 119, 82, 179, 111, 122, 156, + 237, 41, 82, 45, 119, 110, 247, 23, 111, 122, 156, 237, 41, 82, 50, 119, + 110, 247, 23, 111, 122, 156, 237, 41, 116, 247, 24, 119, 82, 45, 119, + 110, 247, 23, 111, 122, 156, 237, 41, 116, 247, 24, 119, 82, 50, 119, + 110, 247, 23, 111, 122, 156, 237, 41, 82, 45, 119, 110, 247, 24, 119, 82, + 179, 111, 122, 156, 237, 41, 82, 45, 119, 116, 247, 24, 119, 82, 179, + 111, 122, 156, 237, 41, 116, 247, 24, 119, 82, 45, 23, 82, 50, 119, 110, + 247, 23, 111, 122, 156, 237, 41, 116, 247, 24, 119, 82, 50, 23, 82, 45, + 119, 110, 247, 23, 111, 122, 156, 237, 41, 116, 247, 24, 119, 82, 50, + 119, 110, 247, 24, 119, 82, 219, 226, 111, 122, 156, 237, 41, 116, 247, + 24, 119, 82, 45, 119, 110, 247, 24, 119, 82, 179, 111, 122, 156, 237, 41, + 82, 45, 119, 116, 247, 24, 119, 82, 50, 119, 110, 247, 23, 111, 122, 156, + 237, 41, 82, 50, 119, 116, 247, 24, 119, 82, 45, 119, 110, 247, 23, 111, + 122, 156, 237, 41, 237, 34, 111, 122, 156, 228, 243, 4, 81, 106, 250, + 236, 209, 61, 223, 97, 243, 128, 77, 45, 132, 206, 43, 217, 92, 50, 132, + 206, 43, 217, 92, 223, 97, 235, 121, 64, 4, 198, 136, 219, 216, 118, 64, + 23, 116, 23, 110, 91, 234, 162, 248, 131, 96, 64, 23, 116, 23, 110, 91, + 234, 162, 248, 131, 235, 121, 64, 23, 50, 91, 234, 162, 248, 131, 196, + 66, 64, 23, 50, 91, 234, 162, 248, 131, 45, 132, 232, 173, 50, 132, 232, + 173, 195, 16, 35, 238, 219, 50, 211, 79, 112, 236, 142, 214, 108, 237, + 41, 238, 219, 214, 108, 237, 41, 82, 50, 119, 110, 247, 23, 214, 108, + 237, 41, 237, 34, 63, 88, 205, 156, 4, 206, 114, 239, 2, 45, 199, 1, 63, + 50, 209, 60, 223, 150, 82, 199, 1, 63, 50, 209, 60, 223, 150, 50, 199, 1, + 63, 50, 209, 60, 223, 150, 214, 108, 112, 208, 15, 77, 201, 76, 233, 14, + 201, 76, 233, 15, 4, 250, 249, 207, 148, 201, 76, 233, 15, 219, 233, 219, + 226, 201, 76, 233, 15, 219, 233, 179, 201, 76, 233, 15, 4, 235, 108, 63, + 196, 76, 243, 102, 205, 43, 17, 191, 77, 205, 43, 17, 107, 205, 43, 17, + 109, 205, 43, 17, 138, 205, 43, 17, 134, 205, 43, 17, 150, 205, 43, 17, + 169, 205, 43, 17, 175, 205, 43, 17, 171, 205, 43, 17, 178, 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, 12, 15, 226, 150, 12, 15, 226, 149, 12, 15, 226, 148, 12, 15, 226, + 147, 12, 15, 226, 146, 12, 15, 226, 145, 12, 15, 226, 144, 12, 15, 226, + 143, 12, 15, 226, 142, 12, 15, 226, 141, 12, 15, 226, 140, 12, 15, 226, + 139, 12, 15, 226, 138, 12, 15, 226, 137, 12, 15, 226, 136, 12, 15, 226, + 135, 12, 15, 226, 134, 12, 15, 226, 133, 12, 15, 226, 132, 12, 15, 226, + 131, 12, 15, 226, 130, 12, 15, 226, 129, 12, 15, 226, 128, 12, 15, 226, + 127, 12, 15, 226, 126, 12, 15, 226, 125, 12, 15, 226, 124, 12, 15, 226, + 123, 12, 15, 226, 122, 12, 15, 226, 121, 12, 15, 226, 120, 12, 15, 226, + 119, 12, 15, 226, 118, 12, 15, 226, 117, 12, 15, 226, 116, 12, 15, 226, + 115, 12, 15, 226, 114, 12, 15, 226, 113, 12, 15, 226, 112, 12, 15, 226, + 111, 12, 15, 226, 110, 12, 15, 226, 109, 12, 15, 226, 108, 12, 15, 226, + 107, 12, 15, 226, 106, 12, 15, 226, 105, 12, 15, 226, 104, 12, 15, 226, + 103, 12, 15, 226, 102, 12, 15, 226, 101, 12, 15, 226, 100, 12, 15, 226, + 99, 12, 15, 226, 98, 12, 15, 226, 97, 12, 15, 226, 96, 12, 15, 226, 95, + 12, 15, 226, 94, 12, 15, 226, 93, 12, 15, 226, 92, 12, 15, 226, 91, 12, + 15, 226, 90, 12, 15, 226, 89, 12, 15, 226, 88, 12, 15, 226, 87, 12, 15, + 226, 86, 12, 15, 226, 85, 12, 15, 226, 84, 12, 15, 226, 83, 12, 15, 226, + 82, 12, 15, 226, 81, 12, 15, 226, 80, 12, 15, 226, 79, 12, 15, 226, 78, + 12, 15, 226, 77, 12, 15, 226, 76, 12, 15, 226, 75, 12, 15, 226, 74, 12, + 15, 226, 73, 12, 15, 226, 72, 12, 15, 226, 71, 12, 15, 226, 70, 12, 15, + 226, 69, 12, 15, 226, 68, 12, 15, 226, 67, 12, 15, 226, 66, 12, 15, 226, + 65, 12, 15, 226, 64, 12, 15, 226, 63, 12, 15, 226, 62, 12, 15, 226, 61, + 12, 15, 226, 60, 12, 15, 226, 59, 12, 15, 226, 58, 12, 15, 226, 57, 12, + 15, 226, 56, 12, 15, 226, 55, 12, 15, 226, 54, 12, 15, 226, 53, 12, 15, + 226, 52, 12, 15, 226, 51, 12, 15, 226, 50, 12, 15, 226, 49, 12, 15, 226, + 48, 12, 15, 226, 47, 12, 15, 226, 46, 12, 15, 226, 45, 12, 15, 226, 44, + 12, 15, 226, 43, 12, 15, 226, 42, 12, 15, 226, 41, 12, 15, 226, 40, 12, + 15, 226, 39, 12, 15, 226, 38, 12, 15, 226, 37, 12, 15, 226, 36, 12, 15, + 226, 35, 12, 15, 226, 34, 12, 15, 226, 33, 12, 15, 226, 32, 12, 15, 226, + 31, 12, 15, 226, 30, 12, 15, 226, 29, 12, 15, 226, 28, 12, 15, 226, 27, + 12, 15, 226, 26, 12, 15, 226, 25, 12, 15, 226, 24, 12, 15, 226, 23, 12, + 15, 226, 22, 12, 15, 226, 21, 12, 15, 226, 20, 12, 15, 226, 19, 12, 15, + 226, 18, 12, 15, 226, 17, 12, 15, 226, 16, 12, 15, 226, 15, 12, 15, 226, + 14, 12, 15, 226, 13, 12, 15, 226, 12, 12, 15, 226, 11, 12, 15, 226, 10, + 12, 15, 226, 9, 12, 15, 226, 8, 12, 15, 226, 7, 12, 15, 226, 6, 12, 15, + 226, 5, 12, 15, 226, 4, 12, 15, 226, 3, 12, 15, 226, 2, 12, 15, 226, 1, + 12, 15, 226, 0, 12, 15, 225, 255, 12, 15, 225, 254, 12, 15, 225, 253, 12, + 15, 225, 252, 12, 15, 225, 251, 12, 15, 225, 250, 12, 15, 225, 249, 12, + 15, 225, 248, 12, 15, 225, 247, 12, 15, 225, 246, 12, 15, 225, 245, 12, + 15, 225, 244, 12, 15, 225, 243, 12, 15, 225, 242, 220, 22, 199, 223, 199, + 224, 201, 248, 199, 224, 233, 218, 77, 199, 224, 207, 254, 77, 199, 224, + 31, 56, 199, 224, 236, 157, 56, 199, 224, 210, 15, 56, 199, 224, 251, + 139, 199, 224, 251, 51, 199, 224, 45, 210, 115, 199, 224, 50, 210, 115, + 199, 224, 250, 195, 199, 224, 108, 56, 199, 224, 242, 76, 199, 224, 228, + 89, 199, 224, 232, 82, 201, 64, 199, 224, 202, 24, 199, 224, 17, 191, 77, + 199, 224, 17, 107, 199, 224, 17, 109, 199, 224, 17, 138, 199, 224, 17, + 134, 199, 224, 17, 150, 199, 224, 17, 169, 199, 224, 17, 175, 199, 224, + 17, 171, 199, 224, 17, 178, 199, 224, 242, 85, 199, 224, 204, 26, 199, + 224, 219, 182, 56, 199, 224, 234, 45, 56, 199, 224, 230, 206, 56, 199, + 224, 208, 15, 77, 199, 224, 242, 74, 250, 184, 199, 224, 8, 6, 1, 65, + 199, 224, 8, 6, 1, 250, 122, 199, 224, 8, 6, 1, 247, 195, 199, 224, 8, 6, + 1, 238, 129, 199, 224, 8, 6, 1, 71, 199, 224, 8, 6, 1, 233, 177, 199, + 224, 8, 6, 1, 232, 53, 199, 224, 8, 6, 1, 230, 118, 199, 224, 8, 6, 1, + 68, 199, 224, 8, 6, 1, 223, 37, 199, 224, 8, 6, 1, 222, 154, 199, 224, 8, + 6, 1, 172, 199, 224, 8, 6, 1, 218, 170, 199, 224, 8, 6, 1, 215, 63, 199, + 224, 8, 6, 1, 74, 199, 224, 8, 6, 1, 210, 238, 199, 224, 8, 6, 1, 208, + 106, 199, 224, 8, 6, 1, 146, 199, 224, 8, 6, 1, 206, 9, 199, 224, 8, 6, + 1, 200, 43, 199, 224, 8, 6, 1, 66, 199, 224, 8, 6, 1, 196, 12, 199, 224, + 8, 6, 1, 193, 224, 199, 224, 8, 6, 1, 192, 235, 199, 224, 8, 6, 1, 192, + 159, 199, 224, 8, 6, 1, 191, 166, 199, 224, 45, 51, 248, 55, 199, 224, + 207, 20, 202, 24, 199, 224, 50, 51, 248, 55, 199, 224, 243, 4, 252, 62, + 199, 224, 130, 219, 114, 199, 224, 230, 213, 252, 62, 199, 224, 8, 2, 1, + 65, 199, 224, 8, 2, 1, 250, 122, 199, 224, 8, 2, 1, 247, 195, 199, 224, + 8, 2, 1, 238, 129, 199, 224, 8, 2, 1, 71, 199, 224, 8, 2, 1, 233, 177, + 199, 224, 8, 2, 1, 232, 53, 199, 224, 8, 2, 1, 230, 118, 199, 224, 8, 2, + 1, 68, 199, 224, 8, 2, 1, 223, 37, 199, 224, 8, 2, 1, 222, 154, 199, 224, + 8, 2, 1, 172, 199, 224, 8, 2, 1, 218, 170, 199, 224, 8, 2, 1, 215, 63, + 199, 224, 8, 2, 1, 74, 199, 224, 8, 2, 1, 210, 238, 199, 224, 8, 2, 1, + 208, 106, 199, 224, 8, 2, 1, 146, 199, 224, 8, 2, 1, 206, 9, 199, 224, 8, + 2, 1, 200, 43, 199, 224, 8, 2, 1, 66, 199, 224, 8, 2, 1, 196, 12, 199, + 224, 8, 2, 1, 193, 224, 199, 224, 8, 2, 1, 192, 235, 199, 224, 8, 2, 1, + 192, 159, 199, 224, 8, 2, 1, 191, 166, 199, 224, 45, 238, 173, 248, 55, + 199, 224, 81, 219, 114, 199, 224, 50, 238, 173, 248, 55, 199, 224, 198, + 152, 247, 129, 199, 223, 67, 204, 212, 67, 204, 201, 67, 204, 190, 67, + 204, 178, 67, 204, 167, 67, 204, 156, 67, 204, 145, 67, 204, 134, 67, + 204, 123, 67, 204, 115, 67, 204, 114, 67, 204, 113, 67, 204, 112, 67, + 204, 110, 67, 204, 109, 67, 204, 108, 67, 204, 107, 67, 204, 106, 67, + 204, 105, 67, 204, 104, 67, 204, 103, 67, 204, 102, 67, 204, 101, 67, + 204, 99, 67, 204, 98, 67, 204, 97, 67, 204, 96, 67, 204, 95, 67, 204, 94, + 67, 204, 93, 67, 204, 92, 67, 204, 91, 67, 204, 90, 67, 204, 88, 67, 204, + 87, 67, 204, 86, 67, 204, 85, 67, 204, 84, 67, 204, 83, 67, 204, 82, 67, + 204, 81, 67, 204, 80, 67, 204, 79, 67, 204, 77, 67, 204, 76, 67, 204, 75, + 67, 204, 74, 67, 204, 73, 67, 204, 72, 67, 204, 71, 67, 204, 70, 67, 204, + 69, 67, 204, 68, 67, 204, 66, 67, 204, 65, 67, 204, 64, 67, 204, 63, 67, + 204, 62, 67, 204, 61, 67, 204, 60, 67, 204, 59, 67, 204, 58, 67, 204, 57, + 67, 204, 55, 67, 204, 54, 67, 204, 53, 67, 204, 52, 67, 204, 51, 67, 204, + 50, 67, 204, 49, 67, 204, 48, 67, 204, 47, 67, 204, 46, 67, 204, 44, 67, + 204, 43, 67, 204, 42, 67, 204, 41, 67, 204, 40, 67, 204, 39, 67, 204, 38, + 67, 204, 37, 67, 204, 36, 67, 204, 35, 67, 205, 32, 67, 205, 31, 67, 205, + 30, 67, 205, 29, 67, 205, 28, 67, 205, 27, 67, 205, 26, 67, 205, 25, 67, + 205, 24, 67, 205, 23, 67, 205, 21, 67, 205, 20, 67, 205, 19, 67, 205, 18, + 67, 205, 17, 67, 205, 16, 67, 205, 15, 67, 205, 14, 67, 205, 13, 67, 205, + 12, 67, 205, 10, 67, 205, 9, 67, 205, 8, 67, 205, 7, 67, 205, 6, 67, 205, + 5, 67, 205, 4, 67, 205, 3, 67, 205, 2, 67, 205, 1, 67, 204, 255, 67, 204, + 254, 67, 204, 253, 67, 204, 252, 67, 204, 251, 67, 204, 250, 67, 204, + 249, 67, 204, 248, 67, 204, 247, 67, 204, 246, 67, 204, 244, 67, 204, + 243, 67, 204, 242, 67, 204, 241, 67, 204, 240, 67, 204, 239, 67, 204, + 238, 67, 204, 237, 67, 204, 236, 67, 204, 235, 67, 204, 233, 67, 204, + 232, 67, 204, 231, 67, 204, 230, 67, 204, 229, 67, 204, 228, 67, 204, + 227, 67, 204, 226, 67, 204, 225, 67, 204, 224, 67, 204, 222, 67, 204, + 221, 67, 204, 220, 67, 204, 219, 67, 204, 218, 67, 204, 217, 67, 204, + 216, 67, 204, 215, 67, 204, 214, 67, 204, 213, 67, 204, 211, 67, 204, + 210, 67, 204, 209, 67, 204, 208, 67, 204, 207, 67, 204, 206, 67, 204, + 205, 67, 204, 204, 67, 204, 203, 67, 204, 202, 67, 204, 200, 67, 204, + 199, 67, 204, 198, 67, 204, 197, 67, 204, 196, 67, 204, 195, 67, 204, + 194, 67, 204, 193, 67, 204, 192, 67, 204, 191, 67, 204, 189, 67, 204, + 188, 67, 204, 187, 67, 204, 186, 67, 204, 185, 67, 204, 184, 67, 204, + 183, 67, 204, 182, 67, 204, 181, 67, 204, 180, 67, 204, 177, 67, 204, + 176, 67, 204, 175, 67, 204, 174, 67, 204, 173, 67, 204, 172, 67, 204, + 171, 67, 204, 170, 67, 204, 169, 67, 204, 168, 67, 204, 166, 67, 204, + 165, 67, 204, 164, 67, 204, 163, 67, 204, 162, 67, 204, 161, 67, 204, + 160, 67, 204, 159, 67, 204, 158, 67, 204, 157, 67, 204, 155, 67, 204, + 154, 67, 204, 153, 67, 204, 152, 67, 204, 151, 67, 204, 150, 67, 204, + 149, 67, 204, 148, 67, 204, 147, 67, 204, 146, 67, 204, 144, 67, 204, + 143, 67, 204, 142, 67, 204, 141, 67, 204, 140, 67, 204, 139, 67, 204, + 138, 67, 204, 137, 67, 204, 136, 67, 204, 135, 67, 204, 133, 67, 204, + 132, 67, 204, 131, 67, 204, 130, 67, 204, 129, 67, 204, 128, 67, 204, + 127, 67, 204, 126, 67, 204, 125, 67, 204, 124, 67, 204, 122, 67, 204, + 121, 67, 204, 120, 67, 204, 119, 67, 204, 118, 67, 204, 117, 67, 204, + 116, 212, 140, 212, 142, 201, 99, 79, 229, 234, 202, 28, 201, 99, 79, + 199, 53, 201, 7, 234, 97, 79, 199, 53, 233, 246, 234, 97, 79, 198, 11, + 234, 59, 234, 83, 234, 84, 252, 53, 252, 54, 251, 191, 248, 240, 249, + 142, 248, 18, 246, 242, 199, 230, 228, 243, 199, 230, 228, 167, 199, 236, + 219, 115, 233, 52, 214, 82, 219, 114, 234, 97, 79, 219, 114, 219, 163, + 213, 107, 234, 62, 219, 115, 199, 230, 81, 199, 230, 193, 251, 232, 148, + 233, 52, 233, 29, 247, 90, 207, 23, 238, 238, 203, 78, 211, 16, 219, 35, + 107, 202, 47, 203, 78, 223, 164, 219, 35, 191, 77, 202, 223, 237, 212, + 219, 105, 234, 16, 236, 187, 237, 77, 239, 24, 107, 237, 201, 237, 77, + 239, 24, 109, 237, 200, 237, 77, 239, 24, 138, 237, 199, 237, 77, 239, + 24, 134, 237, 198, 214, 108, 252, 53, 214, 235, 200, 69, 223, 230, 200, + 73, 234, 97, 79, 198, 12, 248, 131, 233, 254, 247, 128, 247, 130, 234, + 97, 79, 216, 214, 234, 60, 234, 116, 200, 227, 200, 246, 234, 16, 234, + 17, 223, 139, 204, 12, 134, 233, 9, 204, 11, 232, 92, 223, 139, 204, 12, + 138, 230, 189, 204, 11, 230, 186, 223, 139, 204, 12, 109, 207, 100, 204, + 11, 206, 75, 223, 139, 204, 12, 107, 196, 91, 204, 11, 196, 45, 201, 251, + 237, 118, 237, 120, 210, 210, 246, 241, 210, 212, 137, 211, 160, 208, + 222, 228, 246, 248, 44, 210, 3, 229, 194, 248, 60, 213, 46, 248, 44, 229, + 194, 214, 193, 223, 150, 223, 152, 214, 75, 219, 114, 214, 106, 201, 99, + 79, 205, 37, 251, 10, 201, 176, 234, 97, 79, 205, 37, 251, 10, 234, 19, + 246, 242, 199, 231, 203, 253, 228, 243, 199, 231, 203, 253, 228, 164, + 246, 242, 199, 231, 4, 222, 166, 228, 243, 199, 231, 4, 222, 166, 228, + 165, 219, 115, 199, 231, 203, 253, 81, 199, 231, 203, 253, 193, 250, 210, + 107, 219, 115, 232, 134, 210, 107, 219, 115, 235, 125, 209, 96, 210, 107, + 219, 115, 249, 141, 210, 107, 219, 115, 196, 77, 209, 90, 207, 20, 219, + 115, 233, 52, 207, 20, 223, 150, 207, 2, 202, 171, 203, 78, 109, 202, + 168, 201, 178, 202, 171, 203, 78, 138, 202, 167, 201, 177, 237, 77, 239, + 24, 201, 31, 237, 196, 208, 207, 196, 44, 107, 208, 207, 196, 42, 208, + 166, 208, 207, 196, 44, 109, 208, 207, 196, 41, 208, 165, 203, 254, 198, + 10, 201, 96, 201, 14, 247, 129, 246, 241, 247, 63, 216, 171, 193, 171, + 215, 83, 201, 99, 79, 230, 174, 251, 10, 201, 99, 79, 208, 184, 251, 10, + 201, 250, 234, 97, 79, 230, 174, 251, 10, 234, 97, 79, 208, 184, 251, 10, + 234, 57, 201, 99, 79, 201, 31, 202, 10, 202, 171, 230, 218, 246, 242, + 223, 98, 203, 171, 202, 171, 246, 242, 223, 98, 205, 86, 239, 24, 204, 8, + 223, 98, 238, 198, 201, 32, 199, 80, 201, 119, 211, 70, 200, 58, 242, 75, + 211, 36, 208, 208, 216, 170, 209, 78, 251, 47, 208, 200, 242, 75, 251, + 64, 214, 181, 202, 232, 8, 6, 1, 231, 93, 8, 2, 1, 231, 93, 247, 6, 9, 2, + 137, 34, 131, 4, 99, 249, 82, 251, 168, 200, 63, 200, 233, 242, 86, 202, + 111, 219, 226, 222, 83, 1, 219, 64, 220, 19, 1, 232, 178, 232, 168, 220, + 19, 1, 232, 178, 233, 64, 220, 19, 1, 206, 163, 220, 19, 1, 219, 45, 86, + 87, 248, 143, 203, 51, 231, 56, 216, 120, 207, 10, 30, 125, 192, 54, 30, + 125, 192, 50, 30, 125, 201, 154, 30, 125, 192, 55, 232, 68, 232, 67, 232, + 66, 215, 85, 232, 65, 200, 197, 1, 251, 16, 68, 190, 232, 190, 233, 190, + 235, 218, 231, 206, 171, 218, 233, 206, 173, 210, 68, 218, 230, 206, 170, + 213, 77, 216, 18, 193, 50, 218, 232, 206, 172, 232, 91, 210, 67, 193, + 111, 234, 121, 232, 78, 216, 94, 211, 107, 196, 46, 113, 216, 94, 237, + 218, 113, 118, 197, 240, 64, 4, 55, 81, 106, 96, 197, 240, 64, 4, 55, 81, + 106, 11, 5, 223, 53, 77, 80, 1, 221, 208, 219, 75, 194, 251, 194, 140, + 194, 72, 194, 61, 194, 50, 194, 39, 194, 28, 194, 17, 194, 6, 194, 250, + 194, 239, 194, 228, 194, 217, 194, 206, 194, 195, 194, 184, 208, 223, + 232, 148, 40, 81, 50, 63, 219, 189, 248, 55, 247, 200, 211, 53, 77, 248, + 102, 190, 234, 10, 3, 212, 150, 199, 84, 10, 3, 212, 150, 139, 212, 150, + 247, 233, 139, 247, 232, 216, 220, 6, 1, 230, 118, 216, 220, 6, 1, 214, + 72, 216, 220, 2, 1, 230, 118, 216, 220, 2, 1, 214, 72, 61, 1, 235, 16, + 73, 37, 16, 232, 90, 202, 107, 243, 54, 195, 164, 194, 173, 194, 162, + 194, 151, 194, 139, 194, 128, 194, 117, 194, 106, 194, 95, 194, 84, 194, + 76, 194, 75, 194, 74, 194, 73, 194, 71, 194, 70, 194, 69, 194, 68, 194, + 67, 194, 66, 194, 65, 194, 64, 194, 63, 194, 62, 194, 60, 194, 59, 194, + 58, 194, 57, 194, 56, 194, 55, 194, 54, 194, 53, 194, 52, 194, 51, 194, + 49, 194, 48, 194, 47, 194, 46, 194, 45, 194, 44, 194, 43, 194, 42, 194, + 41, 194, 40, 194, 38, 194, 37, 194, 36, 194, 35, 194, 34, 194, 33, 194, + 32, 194, 31, 194, 30, 194, 29, 194, 27, 194, 26, 194, 25, 194, 24, 194, + 23, 194, 22, 194, 21, 194, 20, 194, 19, 194, 18, 194, 16, 194, 15, 194, + 14, 194, 13, 194, 12, 194, 11, 194, 10, 194, 9, 194, 8, 194, 7, 194, 5, + 194, 4, 194, 3, 194, 2, 194, 1, 194, 0, 193, 255, 193, 254, 193, 253, + 193, 252, 194, 249, 194, 248, 194, 247, 194, 246, 194, 245, 194, 244, + 194, 243, 194, 242, 194, 241, 194, 240, 194, 238, 194, 237, 194, 236, + 194, 235, 194, 234, 194, 233, 194, 232, 194, 231, 194, 230, 194, 229, + 194, 227, 194, 226, 194, 225, 194, 224, 194, 223, 194, 222, 194, 221, + 194, 220, 194, 219, 194, 218, 194, 216, 194, 215, 194, 214, 194, 213, + 194, 212, 194, 211, 194, 210, 194, 209, 194, 208, 194, 207, 194, 205, + 194, 204, 194, 203, 194, 202, 194, 201, 194, 200, 194, 199, 194, 198, + 194, 197, 194, 196, 194, 194, 194, 193, 194, 192, 194, 191, 194, 190, + 194, 189, 194, 188, 194, 187, 194, 186, 194, 185, 194, 183, 194, 182, + 194, 181, 194, 180, 194, 179, 194, 178, 194, 177, 194, 176, 194, 175, + 194, 174, 194, 172, 194, 171, 194, 170, 194, 169, 194, 168, 194, 167, + 194, 166, 194, 165, 194, 164, 194, 163, 194, 161, 194, 160, 194, 159, + 194, 158, 194, 157, 194, 156, 194, 155, 194, 154, 194, 153, 194, 152, + 194, 150, 194, 149, 194, 148, 194, 147, 194, 146, 194, 145, 194, 144, + 194, 143, 194, 142, 194, 141, 194, 138, 194, 137, 194, 136, 194, 135, + 194, 134, 194, 133, 194, 132, 194, 131, 194, 130, 194, 129, 194, 127, + 194, 126, 194, 125, 194, 124, 194, 123, 194, 122, 194, 121, 194, 120, + 194, 119, 194, 118, 194, 116, 194, 115, 194, 114, 194, 113, 194, 112, + 194, 111, 194, 110, 194, 109, 194, 108, 194, 107, 194, 105, 194, 104, + 194, 103, 194, 102, 194, 101, 194, 100, 194, 99, 194, 98, 194, 97, 194, + 96, 194, 94, 194, 93, 194, 92, 194, 91, 194, 90, 194, 89, 194, 88, 194, + 87, 194, 86, 194, 85, 194, 83, 194, 82, 194, 81, 194, 80, 194, 79, 194, + 78, 194, 77, 221, 221, 31, 56, 221, 221, 250, 195, 221, 221, 17, 191, 77, + 221, 221, 17, 107, 221, 221, 17, 109, 221, 221, 17, 138, 221, 221, 17, + 134, 221, 221, 17, 150, 221, 221, 17, 169, 221, 221, 17, 175, 221, 221, + 17, 171, 221, 221, 17, 178, 8, 6, 1, 42, 4, 217, 149, 23, 230, 212, 8, 2, + 1, 42, 4, 217, 149, 23, 230, 212, 8, 6, 1, 228, 76, 4, 217, 149, 23, 230, + 212, 8, 2, 1, 228, 76, 4, 217, 149, 23, 230, 212, 8, 6, 1, 126, 4, 217, + 149, 23, 230, 212, 8, 2, 1, 126, 4, 217, 149, 23, 230, 212, 8, 6, 1, 235, + 17, 4, 81, 219, 115, 60, 8, 2, 1, 235, 17, 4, 81, 219, 115, 60, 8, 6, 1, + 235, 17, 4, 81, 219, 115, 248, 235, 23, 230, 212, 8, 2, 1, 235, 17, 4, + 81, 219, 115, 248, 235, 23, 230, 212, 8, 6, 1, 235, 17, 4, 81, 219, 115, + 248, 235, 23, 252, 48, 8, 2, 1, 235, 17, 4, 81, 219, 115, 248, 235, 23, + 252, 48, 8, 6, 1, 187, 4, 81, 219, 115, 60, 8, 2, 1, 187, 4, 81, 219, + 115, 60, 8, 6, 1, 187, 4, 81, 219, 115, 248, 235, 23, 230, 212, 8, 2, 1, + 187, 4, 81, 219, 115, 248, 235, 23, 230, 212, 8, 6, 1, 187, 4, 81, 219, + 115, 248, 235, 23, 252, 48, 8, 2, 1, 187, 4, 81, 219, 115, 248, 235, 23, + 252, 48, 8, 6, 1, 206, 10, 4, 81, 219, 115, 60, 8, 2, 1, 206, 10, 4, 81, + 219, 115, 60, 8, 6, 1, 235, 17, 4, 243, 4, 23, 217, 148, 8, 2, 1, 235, + 17, 4, 243, 4, 23, 217, 148, 8, 6, 1, 235, 17, 4, 243, 4, 23, 247, 94, 8, + 2, 1, 235, 17, 4, 243, 4, 23, 247, 94, 8, 2, 1, 228, 76, 4, 75, 93, 23, + 252, 48, 8, 2, 1, 214, 73, 4, 198, 153, 58, 8, 6, 1, 42, 4, 211, 141, 23, + 252, 48, 8, 2, 1, 42, 4, 211, 141, 23, 252, 48, 8, 6, 1, 42, 4, 211, 141, + 23, 198, 152, 8, 2, 1, 42, 4, 211, 141, 23, 198, 152, 8, 6, 1, 235, 17, + 4, 211, 141, 23, 252, 48, 8, 2, 1, 235, 17, 4, 211, 141, 23, 252, 48, 8, + 6, 1, 235, 17, 4, 211, 141, 23, 198, 152, 8, 2, 1, 235, 17, 4, 211, 141, + 23, 198, 152, 8, 6, 1, 235, 17, 4, 75, 93, 23, 252, 48, 8, 2, 1, 235, 17, + 4, 75, 93, 23, 252, 48, 8, 6, 1, 235, 17, 4, 75, 93, 23, 198, 152, 8, 2, + 1, 235, 17, 4, 75, 93, 23, 198, 152, 8, 2, 1, 228, 76, 4, 75, 93, 23, + 230, 212, 8, 2, 1, 228, 76, 4, 75, 93, 23, 198, 152, 8, 6, 1, 228, 76, 4, + 211, 141, 23, 252, 48, 8, 2, 1, 228, 76, 4, 211, 141, 23, 75, 93, 23, + 252, 48, 8, 6, 1, 228, 76, 4, 211, 141, 23, 198, 152, 8, 2, 1, 228, 76, + 4, 211, 141, 23, 75, 93, 23, 198, 152, 8, 6, 1, 223, 38, 4, 198, 152, 8, + 2, 1, 223, 38, 4, 75, 93, 23, 198, 152, 8, 6, 1, 220, 145, 4, 198, 152, + 8, 2, 1, 220, 145, 4, 198, 152, 8, 6, 1, 218, 171, 4, 198, 152, 8, 2, 1, + 218, 171, 4, 198, 152, 8, 6, 1, 207, 224, 4, 198, 152, 8, 2, 1, 207, 224, + 4, 198, 152, 8, 6, 1, 126, 4, 211, 141, 23, 252, 48, 8, 2, 1, 126, 4, + 211, 141, 23, 252, 48, 8, 6, 1, 126, 4, 211, 141, 23, 198, 152, 8, 2, 1, + 126, 4, 211, 141, 23, 198, 152, 8, 6, 1, 126, 4, 217, 149, 23, 252, 48, + 8, 2, 1, 126, 4, 217, 149, 23, 252, 48, 8, 6, 1, 126, 4, 217, 149, 23, + 198, 152, 8, 2, 1, 126, 4, 217, 149, 23, 198, 152, 8, 2, 1, 252, 28, 4, + 230, 212, 8, 2, 1, 211, 79, 187, 4, 230, 212, 8, 2, 1, 211, 79, 187, 4, + 252, 48, 8, 2, 1, 154, 196, 13, 4, 230, 212, 8, 2, 1, 154, 196, 13, 4, + 252, 48, 8, 2, 1, 205, 88, 4, 230, 212, 8, 2, 1, 205, 88, 4, 252, 48, 8, + 2, 1, 228, 252, 205, 88, 4, 230, 212, 8, 2, 1, 228, 252, 205, 88, 4, 252, + 48, 9, 204, 8, 99, 4, 230, 60, 93, 4, 251, 194, 9, 204, 8, 99, 4, 230, + 60, 93, 4, 193, 133, 9, 204, 8, 99, 4, 230, 60, 93, 4, 131, 217, 101, 9, + 204, 8, 99, 4, 230, 60, 93, 4, 211, 153, 9, 204, 8, 99, 4, 230, 60, 93, + 4, 66, 9, 204, 8, 99, 4, 230, 60, 93, 4, 191, 225, 9, 204, 8, 99, 4, 230, + 60, 93, 4, 71, 9, 204, 8, 99, 4, 230, 60, 93, 4, 252, 27, 9, 204, 8, 213, + 27, 4, 222, 6, 100, 204, 8, 40, 1, 208, 98, 100, 204, 8, 40, 1, 221, 195, + 100, 204, 8, 40, 1, 231, 68, 100, 204, 8, 40, 1, 191, 123, 100, 204, 8, + 40, 1, 237, 182, 100, 204, 8, 40, 1, 207, 7, 100, 204, 8, 40, 1, 233, + 111, 100, 204, 8, 40, 1, 191, 175, 248, 227, 204, 8, 40, 1, 206, 110, + 248, 227, 204, 8, 40, 1, 207, 7, 248, 227, 204, 8, 40, 1, 191, 175, 230, + 146, 204, 8, 40, 1, 219, 75, 230, 146, 204, 8, 40, 1, 203, 166, 230, 146, + 204, 8, 40, 1, 221, 195, 230, 146, 204, 8, 40, 1, 231, 68, 230, 146, 204, + 8, 40, 1, 191, 123, 230, 146, 204, 8, 40, 1, 233, 111, 211, 47, 204, 8, + 40, 1, 206, 110, 211, 47, 204, 8, 40, 1, 207, 7, 248, 227, 1, 221, 189, + 44, 120, 222, 154, 44, 120, 214, 72, 44, 120, 247, 195, 44, 120, 212, + 105, 44, 120, 197, 135, 44, 120, 213, 82, 44, 120, 200, 43, 44, 120, 215, + 63, 44, 120, 210, 238, 44, 120, 218, 170, 44, 120, 192, 159, 44, 120, + 146, 44, 120, 172, 44, 120, 196, 12, 44, 120, 219, 65, 44, 120, 219, 76, + 44, 120, 206, 111, 44, 120, 213, 64, 44, 120, 223, 37, 44, 120, 203, 168, + 44, 120, 201, 179, 44, 120, 206, 9, 44, 120, 230, 118, 44, 120, 220, 249, + 44, 5, 222, 129, 44, 5, 221, 168, 44, 5, 221, 147, 44, 5, 220, 234, 44, + 5, 220, 189, 44, 5, 222, 24, 44, 5, 222, 15, 44, 5, 222, 104, 44, 5, 221, + 69, 44, 5, 221, 43, 44, 5, 222, 44, 44, 5, 214, 69, 44, 5, 214, 18, 44, + 5, 214, 14, 44, 5, 213, 239, 44, 5, 213, 230, 44, 5, 214, 57, 44, 5, 214, + 55, 44, 5, 214, 66, 44, 5, 213, 251, 44, 5, 213, 246, 44, 5, 214, 59, 44, + 5, 247, 161, 44, 5, 243, 31, 44, 5, 243, 21, 44, 5, 238, 197, 44, 5, 238, + 155, 44, 5, 247, 44, 44, 5, 247, 36, 44, 5, 247, 150, 44, 5, 242, 101, + 44, 5, 239, 20, 44, 5, 247, 78, 44, 5, 212, 102, 44, 5, 212, 83, 44, 5, + 212, 77, 44, 5, 212, 60, 44, 5, 212, 52, 44, 5, 212, 92, 44, 5, 212, 91, + 44, 5, 212, 99, 44, 5, 212, 67, 44, 5, 212, 64, 44, 5, 212, 95, 44, 5, + 197, 131, 44, 5, 197, 111, 44, 5, 197, 110, 44, 5, 197, 99, 44, 5, 197, + 96, 44, 5, 197, 127, 44, 5, 197, 126, 44, 5, 197, 130, 44, 5, 197, 109, + 44, 5, 197, 108, 44, 5, 197, 129, 44, 5, 213, 80, 44, 5, 213, 66, 44, 5, + 213, 65, 44, 5, 213, 49, 44, 5, 213, 48, 44, 5, 213, 76, 44, 5, 213, 75, + 44, 5, 213, 79, 44, 5, 213, 51, 44, 5, 213, 50, 44, 5, 213, 78, 44, 5, + 199, 245, 44, 5, 198, 193, 44, 5, 198, 170, 44, 5, 197, 94, 44, 5, 197, + 49, 44, 5, 199, 145, 44, 5, 199, 121, 44, 5, 199, 217, 44, 5, 159, 44, 5, + 198, 59, 44, 5, 199, 166, 44, 5, 214, 252, 44, 5, 213, 221, 44, 5, 213, + 188, 44, 5, 212, 180, 44, 5, 212, 117, 44, 5, 214, 123, 44, 5, 214, 112, + 44, 5, 214, 238, 44, 5, 213, 45, 44, 5, 213, 28, 44, 5, 214, 207, 44, 5, + 210, 222, 44, 5, 209, 187, 44, 5, 209, 147, 44, 5, 208, 167, 44, 5, 208, + 130, 44, 5, 210, 65, 44, 5, 210, 51, 44, 5, 210, 200, 44, 5, 209, 75, 44, + 5, 209, 39, 44, 5, 210, 82, 44, 5, 217, 153, 44, 5, 216, 102, 44, 5, 216, + 63, 44, 5, 215, 157, 44, 5, 215, 95, 44, 5, 216, 234, 44, 5, 216, 213, + 44, 5, 217, 114, 44, 5, 216, 14, 44, 5, 215, 213, 44, 5, 217, 27, 44, 5, + 192, 140, 44, 5, 192, 33, 44, 5, 192, 23, 44, 5, 191, 225, 44, 5, 191, + 188, 44, 5, 192, 80, 44, 5, 192, 77, 44, 5, 192, 119, 44, 5, 192, 12, 44, + 5, 191, 246, 44, 5, 192, 91, 44, 5, 207, 180, 44, 5, 207, 2, 44, 5, 206, + 196, 44, 5, 206, 69, 44, 5, 206, 30, 44, 5, 207, 115, 44, 5, 207, 86, 44, + 5, 207, 158, 44, 5, 206, 163, 44, 5, 206, 135, 44, 5, 207, 127, 44, 5, + 220, 127, 44, 5, 219, 148, 44, 5, 219, 130, 44, 5, 218, 227, 44, 5, 218, + 196, 44, 5, 219, 240, 44, 5, 219, 230, 44, 5, 220, 98, 44, 5, 219, 45, + 44, 5, 219, 10, 44, 5, 220, 2, 44, 5, 195, 187, 44, 5, 195, 69, 44, 5, + 195, 51, 44, 5, 193, 249, 44, 5, 193, 241, 44, 5, 195, 153, 44, 5, 195, + 148, 44, 5, 195, 183, 44, 5, 195, 24, 44, 5, 195, 8, 44, 5, 195, 160, 44, + 5, 219, 63, 44, 5, 219, 58, 44, 5, 219, 57, 44, 5, 219, 54, 44, 5, 219, + 53, 44, 5, 219, 60, 44, 5, 219, 59, 44, 5, 219, 62, 44, 5, 219, 56, 44, + 5, 219, 55, 44, 5, 219, 61, 44, 5, 219, 74, 44, 5, 219, 67, 44, 5, 219, + 66, 44, 5, 219, 50, 44, 5, 219, 49, 44, 5, 219, 70, 44, 5, 219, 69, 44, + 5, 219, 73, 44, 5, 219, 52, 44, 5, 219, 51, 44, 5, 219, 71, 44, 5, 206, + 109, 44, 5, 206, 98, 44, 5, 206, 97, 44, 5, 206, 90, 44, 5, 206, 83, 44, + 5, 206, 105, 44, 5, 206, 104, 44, 5, 206, 108, 44, 5, 206, 96, 44, 5, + 206, 95, 44, 5, 206, 107, 44, 5, 213, 62, 44, 5, 213, 57, 44, 5, 213, 56, + 44, 5, 213, 53, 44, 5, 213, 52, 44, 5, 213, 59, 44, 5, 213, 58, 44, 5, + 213, 61, 44, 5, 213, 55, 44, 5, 213, 54, 44, 5, 213, 60, 44, 5, 223, 33, + 44, 5, 222, 246, 44, 5, 222, 238, 44, 5, 222, 184, 44, 5, 222, 164, 44, + 5, 223, 12, 44, 5, 223, 10, 44, 5, 223, 27, 44, 5, 222, 203, 44, 5, 222, + 193, 44, 5, 223, 19, 44, 5, 203, 161, 44, 5, 203, 82, 44, 5, 203, 77, 44, + 5, 203, 6, 44, 5, 202, 244, 44, 5, 203, 114, 44, 5, 203, 112, 44, 5, 203, + 149, 44, 5, 203, 57, 44, 5, 203, 49, 44, 5, 203, 123, 44, 5, 201, 175, + 44, 5, 201, 143, 44, 5, 201, 139, 44, 5, 201, 130, 44, 5, 201, 127, 44, + 5, 201, 149, 44, 5, 201, 148, 44, 5, 201, 174, 44, 5, 201, 135, 44, 5, + 201, 134, 44, 5, 201, 151, 44, 5, 205, 198, 44, 5, 202, 223, 44, 5, 202, + 194, 44, 5, 201, 5, 44, 5, 200, 160, 44, 5, 205, 69, 44, 5, 205, 51, 44, + 5, 205, 182, 44, 5, 202, 47, 44, 5, 202, 17, 44, 5, 205, 115, 44, 5, 230, + 93, 44, 5, 229, 160, 44, 5, 229, 132, 44, 5, 228, 161, 44, 5, 228, 130, + 44, 5, 229, 247, 44, 5, 229, 217, 44, 5, 230, 82, 44, 5, 229, 25, 44, 5, + 228, 254, 44, 5, 230, 4, 44, 5, 220, 248, 44, 5, 220, 247, 44, 5, 220, + 242, 44, 5, 220, 241, 44, 5, 220, 238, 44, 5, 220, 237, 44, 5, 220, 244, + 44, 5, 220, 243, 44, 5, 220, 246, 44, 5, 220, 240, 44, 5, 220, 239, 44, + 5, 220, 245, 44, 5, 203, 15, 166, 120, 3, 192, 105, 166, 120, 3, 207, + 146, 166, 120, 3, 207, 51, 101, 1, 196, 224, 95, 120, 3, 242, 93, 155, + 95, 120, 3, 242, 93, 221, 217, 95, 120, 3, 242, 93, 221, 69, 95, 120, 3, + 242, 93, 221, 185, 95, 120, 3, 242, 93, 213, 251, 95, 120, 3, 242, 93, + 247, 162, 95, 120, 3, 242, 93, 247, 3, 95, 120, 3, 242, 93, 242, 101, 95, + 120, 3, 242, 93, 243, 70, 95, 120, 3, 242, 93, 212, 67, 95, 120, 3, 242, + 93, 238, 34, 95, 120, 3, 242, 93, 197, 120, 95, 120, 3, 242, 93, 236, + 176, 95, 120, 3, 242, 93, 197, 115, 95, 120, 3, 242, 93, 181, 95, 120, 3, + 242, 93, 190, 190, 95, 120, 3, 242, 93, 199, 49, 95, 120, 3, 242, 93, + 159, 95, 120, 3, 242, 93, 198, 241, 95, 120, 3, 242, 93, 213, 45, 95, + 120, 3, 242, 93, 249, 155, 95, 120, 3, 242, 93, 209, 230, 95, 120, 3, + 242, 93, 209, 75, 95, 120, 3, 242, 93, 209, 201, 95, 120, 3, 242, 93, + 216, 14, 95, 120, 3, 242, 93, 192, 12, 95, 120, 3, 242, 93, 206, 163, 95, + 120, 3, 242, 93, 219, 45, 95, 120, 3, 242, 93, 195, 24, 95, 120, 3, 242, + 93, 203, 166, 95, 120, 3, 242, 93, 201, 176, 95, 120, 3, 242, 93, 188, + 95, 120, 3, 242, 93, 140, 95, 120, 3, 242, 93, 173, 95, 18, 3, 242, 93, + 208, 98, 95, 223, 151, 18, 3, 242, 93, 208, 35, 95, 223, 151, 18, 3, 242, + 93, 206, 18, 95, 223, 151, 18, 3, 242, 93, 206, 11, 95, 223, 151, 18, 3, + 242, 93, 208, 77, 95, 18, 3, 211, 115, 95, 18, 3, 252, 169, 229, 122, 1, + 248, 183, 214, 70, 229, 122, 1, 248, 183, 214, 18, 229, 122, 1, 248, 183, + 213, 239, 229, 122, 1, 248, 183, 214, 57, 229, 122, 1, 248, 183, 213, + 251, 72, 1, 248, 183, 214, 70, 72, 1, 248, 183, 214, 18, 72, 1, 248, 183, + 213, 239, 72, 1, 248, 183, 214, 57, 72, 1, 248, 183, 213, 251, 72, 1, + 251, 230, 247, 44, 72, 1, 251, 230, 197, 94, 72, 1, 251, 230, 159, 72, 1, + 251, 230, 210, 238, 52, 1, 233, 202, 233, 201, 239, 28, 163, 164, 52, 1, + 233, 201, 233, 202, 239, 28, 163, 164, }; static const unsigned short phrasebook_offset1[] = { @@ -22436,108 +22442,108 @@ static const unsigned int phrasebook_offset2[] = { 64361, 64365, 64369, 64373, 64377, 64381, 64385, 64389, 64393, 64397, 64401, 64405, 64409, 64413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64417, 64425, 64433, 64443, 64453, - 64462, 64472, 64482, 64493, 64505, 64516, 64528, 0, 0, 0, 0, 64535, - 64538, 64541, 64546, 64549, 64556, 64560, 64564, 64568, 64573, 64578, - 64584, 64590, 64595, 64600, 64606, 64612, 64618, 64624, 64627, 64630, - 64637, 64644, 64650, 64656, 64664, 64672, 64677, 64682, 64686, 64694, - 64700, 64707, 64712, 64717, 64722, 64727, 64732, 64737, 64742, 64747, - 64752, 64757, 64762, 64767, 64772, 64777, 64783, 64788, 64792, 64798, - 64809, 64818, 64832, 64841, 64845, 64855, 64861, 64867, 64873, 64878, - 64881, 64886, 64890, 0, 64896, 64901, 64905, 64910, 64914, 64919, 64923, - 64928, 64932, 64937, 64941, 64945, 64950, 64955, 64960, 64965, 64970, - 64975, 64980, 64985, 64990, 64994, 64999, 65004, 65009, 65014, 65019, - 65024, 65029, 65034, 65039, 65044, 65049, 65054, 65059, 65065, 65070, - 65075, 65080, 65085, 65089, 65094, 65098, 65103, 65108, 65113, 65118, - 65122, 65127, 65131, 65136, 65141, 65146, 65151, 65156, 65161, 65166, - 65171, 65176, 65181, 65186, 65191, 65195, 65200, 65205, 65210, 65215, - 65220, 65224, 65230, 65235, 65241, 65246, 65250, 65255, 65260, 65265, - 65270, 65276, 65281, 65286, 65291, 65296, 65301, 65306, 65311, 0, 0, - 65317, 65325, 65333, 65340, 65347, 65352, 65359, 65365, 65370, 65374, - 65377, 65381, 65384, 65388, 65391, 65395, 65398, 65402, 65405, 65408, - 65412, 65416, 65420, 65424, 65428, 65432, 65436, 65440, 65444, 65447, - 65451, 65455, 65459, 65463, 65467, 65471, 65475, 65479, 65483, 65487, - 65491, 65495, 65499, 65504, 65508, 65512, 65516, 65520, 65523, 65527, - 65530, 65534, 65538, 65542, 65546, 65549, 65553, 65556, 65560, 65564, - 65568, 65572, 65576, 65580, 65584, 65588, 65592, 65596, 65600, 65604, - 65607, 65611, 65615, 65619, 65623, 65627, 65630, 65635, 65639, 65644, - 65648, 65651, 65655, 65659, 65663, 65667, 65672, 65676, 65680, 65684, - 65688, 65692, 65696, 65700, 65705, 65709, 65713, 65717, 65721, 65725, - 65732, 65736, 65742, 0, 0, 0, 0, 0, 65747, 65752, 65757, 65762, 65767, - 65772, 65777, 65782, 65786, 65791, 65796, 65801, 65806, 65811, 65816, - 65821, 65826, 65831, 65835, 65840, 65845, 65850, 65854, 65858, 65862, - 65867, 65872, 65877, 65882, 65887, 65892, 65897, 65902, 65907, 65912, - 65916, 65920, 65925, 65930, 65935, 65940, 65945, 65952, 0, 65957, 65961, - 65965, 65969, 65973, 65977, 65981, 65985, 65989, 65993, 65997, 66001, - 66005, 66009, 66013, 66017, 66021, 66025, 66029, 66033, 66037, 66041, - 66045, 66049, 66053, 66057, 66061, 66065, 66069, 66073, 66077, 66080, - 66084, 66087, 66091, 66095, 66098, 66102, 66106, 66109, 66113, 66117, - 66121, 66125, 66128, 66132, 66136, 66140, 66144, 66148, 66152, 66155, - 66158, 66162, 66166, 66170, 66174, 66178, 66182, 66186, 66190, 66194, - 66198, 66202, 66206, 66210, 66214, 66218, 66222, 66226, 66230, 66234, - 66238, 66242, 66246, 66250, 66254, 66258, 66262, 66266, 66270, 66274, - 66278, 66282, 66286, 66290, 66294, 66298, 66302, 66306, 66310, 66314, - 66318, 66322, 0, 66326, 66332, 66338, 66343, 66348, 66353, 66359, 66365, - 66370, 66376, 66382, 66388, 66394, 66400, 66406, 66412, 66418, 66423, - 66428, 66433, 66438, 66443, 66448, 66453, 66458, 66463, 66468, 66473, - 66478, 66483, 66488, 66493, 66498, 66503, 66508, 66513, 66518, 66524, - 66530, 66536, 66542, 66547, 66552, 66557, 66563, 66568, 66573, 66578, - 66583, 66588, 66593, 66598, 66603, 66608, 66613, 66618, 66623, 66628, - 66633, 66638, 66643, 66648, 66653, 66658, 66663, 66668, 66673, 66678, - 66683, 66688, 66693, 66698, 66703, 66708, 66713, 66718, 66723, 66728, - 66733, 66738, 66743, 66748, 66753, 66758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 66763, 66768, 66773, 66778, 66782, 66787, 66791, 66796, 66801, - 66806, 66811, 66816, 66820, 66825, 66830, 66835, 66840, 66844, 66848, - 66852, 66856, 66860, 66864, 66868, 66872, 66876, 66880, 66884, 66888, - 66892, 66896, 66901, 66906, 66911, 66916, 66921, 66926, 66931, 66936, - 66941, 66946, 66951, 66956, 66961, 66966, 66971, 66978, 0, 66986, 66990, - 66994, 66998, 67002, 67006, 67010, 67014, 67018, 67022, 67027, 67032, - 67037, 67042, 67047, 67052, 67057, 67062, 67067, 67072, 67077, 67082, - 67087, 67092, 67097, 67102, 67107, 67112, 67117, 67122, 67127, 67132, - 67137, 67142, 67147, 67152, 67157, 67162, 67167, 67172, 67177, 67186, - 67195, 67204, 67213, 67222, 67231, 67240, 67249, 67252, 67257, 67262, - 67267, 67272, 67277, 67282, 67287, 67292, 67297, 67301, 67306, 67311, - 67316, 67321, 67326, 67330, 67334, 67338, 67342, 67346, 67350, 67354, - 67358, 67362, 67366, 67370, 67374, 67378, 67382, 67387, 67392, 67397, - 67402, 67407, 67412, 67417, 67422, 67427, 67432, 67437, 67442, 67447, - 67452, 67459, 67466, 67471, 67476, 67480, 67484, 67488, 67492, 67496, - 67500, 67504, 67508, 67512, 67517, 67522, 67527, 67532, 67537, 67542, - 67547, 67552, 67557, 67562, 67567, 67572, 67577, 67582, 67587, 67592, - 67597, 67602, 67607, 67612, 67617, 67622, 67627, 67632, 67637, 67642, - 67647, 67652, 67657, 67662, 67667, 67671, 67676, 67681, 67686, 67691, - 67696, 67701, 67706, 67711, 67716, 67721, 67726, 67731, 67735, 67740, - 67745, 67750, 67755, 67760, 67765, 67770, 67775, 67780, 67784, 67791, - 67798, 67805, 67812, 67819, 67826, 67833, 67840, 67847, 67854, 67861, - 67868, 67871, 67874, 67877, 67882, 67885, 67888, 67891, 67894, 67897, - 67900, 67904, 67908, 67912, 67916, 67919, 67923, 67927, 67931, 67935, - 67939, 67943, 67947, 67951, 67954, 67957, 67961, 67965, 67969, 67973, - 67976, 67980, 67984, 67988, 67992, 67995, 67999, 68003, 68007, 68011, - 68014, 68018, 68022, 68025, 68029, 68033, 68037, 68041, 68045, 68049, - 68053, 68057, 68064, 68067, 68070, 68073, 68076, 68079, 68082, 68085, - 68088, 68091, 68094, 68097, 68100, 68103, 68106, 68109, 68112, 68115, - 68118, 68121, 68124, 68127, 68130, 68133, 68136, 68139, 68142, 68145, - 68148, 68151, 68154, 68157, 68160, 68163, 68166, 68169, 68172, 68175, - 68178, 68181, 68184, 68187, 68190, 68193, 68196, 68199, 68202, 68205, - 68208, 68211, 68214, 68217, 68220, 68223, 68226, 68229, 68232, 68235, - 68238, 68241, 68244, 68247, 68250, 68253, 68256, 68259, 68262, 68265, - 68268, 68271, 68274, 68277, 68280, 68283, 68286, 68289, 68292, 68295, - 68298, 68301, 68304, 68307, 68310, 68313, 68316, 68319, 68322, 68325, - 68328, 68337, 68345, 68353, 68361, 68369, 68377, 68385, 68393, 68401, - 68409, 68418, 68427, 68436, 68445, 68454, 68463, 68472, 68481, 68490, - 68499, 68508, 68517, 68526, 68535, 68544, 68547, 68550, 68553, 68555, - 68558, 68561, 68564, 68569, 68574, 68577, 68584, 68591, 68598, 68605, - 68608, 68613, 68615, 68619, 68621, 68623, 68626, 68629, 68632, 68635, - 68638, 68641, 68644, 68649, 68654, 68657, 68660, 68663, 68666, 68669, - 68672, 68675, 68679, 68682, 68685, 68688, 68691, 68694, 68699, 68702, - 68705, 68708, 68713, 68718, 68723, 68728, 68733, 68738, 68743, 68748, - 68754, 68762, 68764, 68767, 68770, 68773, 68776, 68782, 68790, 68793, - 68796, 68801, 68804, 68807, 68810, 68815, 68818, 68821, 68826, 68829, - 68832, 68837, 68840, 68843, 68848, 68853, 68858, 68861, 68864, 68867, - 68870, 68876, 68879, 68882, 68885, 68887, 68890, 68893, 68896, 68901, - 68904, 68907, 68910, 68913, 68916, 68921, 68924, 68927, 68930, 68933, - 68936, 68939, 68942, 68945, 68948, 68954, 68959, 68967, 68975, 68983, - 68991, 68999, 69007, 69015, 69023, 69031, 69040, 69049, 69058, 69067, - 69076, 69085, 69094, 69103, 69112, 69121, 69130, 69139, 69148, 69157, - 69166, 69175, 69184, 69193, 69202, 69211, 69220, 69229, 0, 0, 0, 0, 0, 0, + 64462, 64472, 64482, 64493, 64505, 64516, 64528, 64535, 64545, 64556, + 64565, 64572, 64575, 64578, 64583, 64586, 64593, 64597, 64601, 64605, + 64610, 64615, 64621, 64627, 64632, 64637, 64643, 64649, 64655, 64661, + 64664, 64667, 64674, 64681, 64687, 64693, 64701, 64709, 64714, 64719, + 64723, 64731, 64737, 64744, 64749, 64754, 64759, 64764, 64769, 64774, + 64779, 64784, 64789, 64794, 64799, 64804, 64809, 64814, 64820, 64825, + 64829, 64835, 64846, 64855, 64869, 64878, 64882, 64892, 64898, 64904, + 64910, 64915, 64918, 64923, 64927, 0, 64933, 64938, 64942, 64947, 64951, + 64956, 64960, 64965, 64969, 64974, 64978, 64982, 64987, 64992, 64997, + 65002, 65007, 65012, 65017, 65022, 65027, 65031, 65036, 65041, 65046, + 65051, 65056, 65061, 65066, 65071, 65076, 65081, 65086, 65091, 65096, + 65102, 65107, 65112, 65117, 65122, 65126, 65131, 65135, 65140, 65145, + 65150, 65155, 65159, 65164, 65168, 65173, 65178, 65183, 65188, 65193, + 65198, 65203, 65208, 65213, 65218, 65223, 65228, 65232, 65237, 65242, + 65247, 65252, 65257, 65261, 65267, 65272, 65278, 65283, 65287, 65292, + 65297, 65302, 65307, 65313, 65318, 65323, 65328, 65333, 65338, 65343, + 65348, 0, 0, 65354, 65362, 65370, 65377, 65384, 65389, 65396, 65402, + 65407, 65411, 65414, 65418, 65421, 65425, 65428, 65432, 65435, 65439, + 65442, 65445, 65449, 65453, 65457, 65461, 65465, 65469, 65473, 65477, + 65481, 65484, 65488, 65492, 65496, 65500, 65504, 65508, 65512, 65516, + 65520, 65524, 65528, 65532, 65536, 65541, 65545, 65549, 65553, 65557, + 65560, 65564, 65567, 65571, 65575, 65579, 65583, 65586, 65590, 65593, + 65597, 65601, 65605, 65609, 65613, 65617, 65621, 65625, 65629, 65633, + 65637, 65641, 65644, 65648, 65652, 65656, 65660, 65664, 65667, 65672, + 65676, 65681, 65685, 65688, 65692, 65696, 65700, 65704, 65709, 65713, + 65717, 65721, 65725, 65729, 65733, 65737, 65742, 65746, 65750, 65754, + 65758, 65762, 65769, 65773, 65779, 0, 0, 0, 0, 0, 65784, 65789, 65794, + 65799, 65804, 65809, 65814, 65819, 65823, 65828, 65833, 65838, 65843, + 65848, 65853, 65858, 65863, 65868, 65872, 65877, 65882, 65887, 65891, + 65895, 65899, 65904, 65909, 65914, 65919, 65924, 65929, 65934, 65939, + 65944, 65949, 65953, 65957, 65962, 65967, 65972, 65977, 65982, 65989, 0, + 65994, 65998, 66002, 66006, 66010, 66014, 66018, 66022, 66026, 66030, + 66034, 66038, 66042, 66046, 66050, 66054, 66058, 66062, 66066, 66070, + 66074, 66078, 66082, 66086, 66090, 66094, 66098, 66102, 66106, 66110, + 66114, 66117, 66121, 66124, 66128, 66132, 66135, 66139, 66143, 66146, + 66150, 66154, 66158, 66162, 66165, 66169, 66173, 66177, 66181, 66185, + 66189, 66192, 66195, 66199, 66203, 66207, 66211, 66215, 66219, 66223, + 66227, 66231, 66235, 66239, 66243, 66247, 66251, 66255, 66259, 66263, + 66267, 66271, 66275, 66279, 66283, 66287, 66291, 66295, 66299, 66303, + 66307, 66311, 66315, 66319, 66323, 66327, 66331, 66335, 66339, 66343, + 66347, 66351, 66355, 66359, 0, 66363, 66369, 66375, 66380, 66385, 66390, + 66396, 66402, 66407, 66413, 66419, 66425, 66431, 66437, 66443, 66449, + 66455, 66460, 66465, 66470, 66475, 66480, 66485, 66490, 66495, 66500, + 66505, 66510, 66515, 66520, 66525, 66530, 66535, 66540, 66545, 66550, + 66555, 66561, 66567, 66573, 66579, 66584, 66589, 66594, 66600, 66605, + 66610, 66615, 66620, 66625, 66630, 66635, 66640, 66645, 66650, 66655, + 66660, 66665, 66670, 66675, 66680, 66685, 66690, 66695, 66700, 66705, + 66710, 66715, 66720, 66725, 66730, 66735, 66740, 66745, 66750, 66755, + 66760, 66765, 66770, 66775, 66780, 66785, 66790, 66795, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 66800, 66807, 66812, 66817, 66822, 66826, 66831, 66835, + 66840, 66845, 66850, 66855, 66860, 66864, 66869, 66874, 66879, 66884, + 66888, 66892, 66896, 66900, 66904, 66908, 66912, 66916, 66920, 66924, + 66928, 66932, 66936, 66940, 66945, 66950, 66955, 66960, 66965, 66970, + 66975, 66980, 66985, 66990, 66995, 67000, 67005, 67010, 67015, 67022, 0, + 67030, 67034, 67038, 67042, 67046, 67050, 67054, 67058, 67062, 67066, + 67071, 67076, 67081, 67086, 67091, 67096, 67101, 67106, 67111, 67116, + 67121, 67126, 67131, 67136, 67141, 67146, 67151, 67156, 67161, 67166, + 67171, 67176, 67181, 67186, 67191, 67196, 67201, 67206, 67211, 67216, + 67221, 67230, 67239, 67248, 67257, 67266, 67275, 67284, 67293, 67296, + 67301, 67306, 67311, 67316, 67321, 67326, 67331, 67336, 67341, 67345, + 67350, 67355, 67360, 67365, 67370, 67374, 67378, 67382, 67386, 67390, + 67394, 67398, 67402, 67406, 67410, 67414, 67418, 67422, 67426, 67431, + 67436, 67441, 67446, 67451, 67456, 67461, 67466, 67471, 67476, 67481, + 67486, 67491, 67496, 67503, 67510, 67515, 67520, 67524, 67528, 67532, + 67536, 67540, 67544, 67548, 67552, 67556, 67561, 67566, 67571, 67576, + 67581, 67586, 67591, 67596, 67601, 67606, 67611, 67616, 67621, 67626, + 67631, 67636, 67641, 67646, 67651, 67656, 67661, 67666, 67671, 67676, + 67681, 67686, 67691, 67696, 67701, 67706, 67711, 67715, 67720, 67725, + 67730, 67735, 67740, 67745, 67750, 67755, 67760, 67765, 67770, 67775, + 67779, 67784, 67789, 67794, 67799, 67804, 67809, 67814, 67819, 67824, + 67828, 67835, 67842, 67849, 67856, 67863, 67870, 67877, 67884, 67891, + 67898, 67905, 67912, 67915, 67918, 67921, 67926, 67929, 67932, 67935, + 67938, 67941, 67944, 67948, 67952, 67956, 67960, 67963, 67967, 67971, + 67975, 67979, 67983, 67987, 67991, 67995, 67998, 68001, 68005, 68009, + 68013, 68017, 68020, 68024, 68028, 68032, 68036, 68039, 68043, 68047, + 68051, 68055, 68058, 68062, 68066, 68069, 68073, 68077, 68081, 68085, + 68089, 68093, 68097, 68101, 68108, 68111, 68114, 68117, 68120, 68123, + 68126, 68129, 68132, 68135, 68138, 68141, 68144, 68147, 68150, 68153, + 68156, 68159, 68162, 68165, 68168, 68171, 68174, 68177, 68180, 68183, + 68186, 68189, 68192, 68195, 68198, 68201, 68204, 68207, 68210, 68213, + 68216, 68219, 68222, 68225, 68228, 68231, 68234, 68237, 68240, 68243, + 68246, 68249, 68252, 68255, 68258, 68261, 68264, 68267, 68270, 68273, + 68276, 68279, 68282, 68285, 68288, 68291, 68294, 68297, 68300, 68303, + 68306, 68309, 68312, 68315, 68318, 68321, 68324, 68327, 68330, 68333, + 68336, 68339, 68342, 68345, 68348, 68351, 68354, 68357, 68360, 68363, + 68366, 68369, 68372, 68381, 68389, 68397, 68405, 68413, 68421, 68429, + 68437, 68445, 68453, 68462, 68471, 68480, 68489, 68498, 68507, 68516, + 68525, 68534, 68543, 68552, 68561, 68570, 68579, 68588, 68591, 68594, + 68597, 68599, 68602, 68605, 68608, 68613, 68618, 68621, 68628, 68635, + 68642, 68649, 68652, 68657, 68659, 68663, 68665, 68667, 68670, 68673, + 68676, 68679, 68682, 68685, 68688, 68693, 68698, 68701, 68704, 68707, + 68710, 68713, 68716, 68719, 68723, 68726, 68729, 68732, 68735, 68738, + 68743, 68746, 68749, 68752, 68757, 68762, 68767, 68772, 68777, 68782, + 68787, 68792, 68798, 68806, 68808, 68811, 68814, 68817, 68820, 68826, + 68834, 68837, 68840, 68845, 68848, 68851, 68854, 68859, 68862, 68865, + 68870, 68873, 68876, 68881, 68884, 68887, 68892, 68897, 68902, 68905, + 68908, 68911, 68914, 68920, 68923, 68926, 68929, 68931, 68934, 68937, + 68940, 68945, 68948, 68951, 68954, 68957, 68960, 68965, 68968, 68971, + 68974, 68977, 68980, 68983, 68986, 68989, 68992, 68998, 69003, 69011, + 69019, 69027, 69035, 69043, 69051, 69059, 69067, 69075, 69084, 69093, + 69102, 69111, 69120, 69129, 69138, 69147, 69156, 69165, 69174, 69183, + 69192, 69201, 69210, 69219, 69228, 69237, 69246, 69255, 69264, 69273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -22545,320 +22551,319 @@ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69232, 69241, - 69250, 69261, 69268, 69273, 69278, 69285, 69292, 69298, 69303, 69308, - 69313, 69318, 69325, 69330, 69335, 69340, 69351, 69356, 69361, 69368, - 69373, 69380, 69385, 69390, 69397, 69404, 69411, 69420, 69429, 69434, - 69439, 69444, 69451, 69456, 69466, 69473, 69478, 69483, 69488, 69493, - 69498, 69503, 69511, 69518, 69525, 69530, 69537, 69542, 69549, 69558, - 69569, 69574, 69583, 69588, 69595, 69604, 69613, 69618, 69623, 69630, - 69636, 69643, 69650, 69654, 69658, 69661, 69665, 69669, 69673, 69677, - 69681, 69685, 69689, 69692, 69696, 69700, 69704, 69708, 69712, 69716, - 69719, 69723, 69727, 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, 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, - 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, 70309, 70313, - 70317, 70321, 70325, 70329, 70333, 70337, 70341, 70345, 70349, 70353, - 70357, 70361, 70365, 70369, 70373, 70377, 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, 70564, 70568, 70572, 70576, 70580, 70584, 70588, 70592, - 70596, 70600, 70604, 70608, 70612, 70616, 70620, 70624, 70628, 70632, - 70636, 70640, 70644, 70648, 70652, 70656, 70660, 70664, 70668, 70672, - 70676, 70680, 70684, 70688, 70692, 70696, 70700, 70704, 70708, 70712, - 70716, 70720, 70724, 70728, 70732, 70736, 70740, 70744, 70748, 70752, - 70756, 70760, 70764, 70768, 70772, 70776, 70780, 70784, 70788, 70792, - 70796, 70800, 70804, 70808, 70812, 70816, 70820, 70824, 70828, 70832, - 70836, 70840, 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, 71019, 71023, 71027, 71031, - 71035, 71039, 71043, 71047, 71051, 71055, 71059, 71063, 71067, 71071, - 71075, 71079, 71083, 71087, 71091, 71095, 71099, 71103, 71107, 71111, - 71115, 71119, 71123, 71127, 71131, 71135, 71139, 71143, 71147, 71151, - 71155, 71159, 71163, 71167, 71171, 71175, 71179, 71183, 71187, 71191, - 71195, 71199, 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, 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, 71629, - 71633, 71637, 71641, 71645, 71649, 71653, 71657, 71661, 71665, 71669, - 71673, 71677, 71681, 71685, 71689, 71693, 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, - 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, 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, 72754, 72758, 72762, 72766, 72770, 72774, 72778, 72782, 72785, - 72789, 72793, 72797, 72801, 72805, 72809, 72813, 72817, 72821, 72825, - 72829, 72833, 72837, 72841, 72845, 72849, 72853, 72857, 72861, 72865, - 72869, 72873, 72877, 72881, 72885, 72889, 72893, 72897, 72901, 72905, - 72909, 72913, 72917, 72921, 72925, 72929, 72933, 72937, 72941, 72945, - 72949, 72953, 72957, 72961, 72965, 72969, 72973, 72977, 72981, 72985, - 72989, 72993, 72997, 73001, 73005, 73009, 73013, 73017, 73021, 73025, - 73029, 73033, 73037, 73041, 73045, 73049, 73053, 73057, 73061, 73065, - 73069, 73073, 73077, 73081, 73085, 73089, 73093, 73097, 73101, 73105, - 73109, 73113, 73117, 73121, 73125, 73129, 73133, 73137, 73141, 73145, - 73149, 73153, 73157, 73161, 73165, 73169, 73173, 73177, 73181, 73185, - 73189, 73193, 73197, 73201, 73205, 73209, 73213, 73217, 73221, 73225, - 73229, 73233, 73237, 73241, 73245, 73249, 73253, 73257, 73261, 73265, - 73269, 73273, 73277, 73281, 73285, 73289, 73293, 73297, 73301, 73305, - 73309, 73313, 73317, 73321, 73325, 73329, 73333, 73337, 73341, 73345, - 73349, 73353, 73357, 73361, 73365, 73369, 73373, 73377, 73381, 73385, - 73389, 73393, 73397, 73401, 73405, 73409, 73413, 73417, 73421, 73425, - 73429, 73433, 73437, 73441, 73445, 73449, 73453, 73457, 73461, 73465, - 73469, 73473, 73477, 73481, 73485, 73489, 73493, 73497, 73501, 73505, - 73509, 73512, 73516, 73520, 73524, 73528, 73532, 73536, 73540, 73544, - 73548, 73552, 73556, 73560, 73564, 73568, 73572, 73576, 73580, 73584, - 73588, 73592, 73596, 73600, 73604, 73608, 73612, 73616, 73620, 73624, - 73628, 73632, 73636, 73640, 73644, 73648, 73652, 73656, 73660, 73664, - 73668, 73672, 73676, 73680, 73684, 73688, 73692, 73696, 73700, 73704, - 73708, 73712, 73716, 73720, 73724, 73728, 73732, 73736, 73740, 73744, - 73748, 73752, 73756, 73760, 73764, 73768, 73772, 73776, 73780, 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, 73932, 73936, 73940, 73944, - 73948, 73952, 73956, 73960, 73964, 73968, 73972, 73976, 73980, 73984, - 73988, 73992, 73996, 74000, 74004, 74008, 74012, 74016, 74020, 74024, - 74028, 74032, 74036, 74040, 74044, 74048, 74052, 74056, 74060, 74064, - 74068, 74072, 74076, 74080, 74084, 74088, 74092, 74096, 74100, 74104, - 74108, 74112, 74116, 74120, 74124, 74128, 74132, 74136, 74140, 74144, - 74148, 74152, 74156, 74160, 74164, 74168, 74172, 74176, 74180, 74184, - 74188, 74192, 74196, 74200, 74204, 74208, 74212, 74216, 74220, 74224, - 74228, 74232, 74236, 74240, 74244, 74248, 74252, 74256, 74260, 74264, - 74268, 74272, 74276, 74280, 74284, 74288, 74292, 0, 0, 0, 74296, 74300, - 74304, 74308, 74312, 74316, 74320, 74324, 74328, 74332, 74336, 74340, - 74344, 74348, 74352, 74356, 74360, 74364, 74368, 74372, 74376, 74380, - 74384, 74388, 74392, 74396, 74400, 74404, 74408, 74412, 74416, 74420, - 74424, 74428, 74432, 74436, 74440, 74444, 74448, 74452, 74456, 74460, - 74464, 74468, 74472, 74476, 74480, 74484, 74488, 74492, 74496, 74500, - 74504, 74508, 74512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74516, 74521, 74525, - 74530, 74535, 74540, 74545, 74550, 74554, 74559, 74564, 74569, 74574, - 74579, 74584, 74589, 74593, 74597, 74601, 74605, 74610, 74615, 74620, - 74624, 74629, 74634, 74639, 74644, 74649, 74653, 74658, 74662, 74667, - 74671, 74676, 74680, 74684, 74688, 74693, 74698, 74703, 74711, 74719, - 74727, 74735, 74742, 74750, 74756, 74764, 74768, 74772, 74776, 74780, - 74784, 74788, 74792, 74796, 74800, 74804, 74808, 74812, 74816, 74820, - 74824, 74828, 74832, 74836, 74840, 74844, 74848, 74852, 74856, 74860, - 74864, 74868, 74872, 74876, 74880, 74884, 74888, 74892, 74896, 74900, - 74904, 74908, 74911, 74915, 74919, 74923, 74927, 74931, 74935, 74939, - 74943, 74947, 74951, 74955, 74959, 74963, 74967, 74971, 74975, 74979, - 74983, 74987, 74991, 74995, 74999, 75003, 75007, 75011, 75015, 75019, - 75023, 75027, 75031, 75035, 75039, 75043, 75047, 75051, 75055, 75058, - 75062, 75066, 75069, 75073, 75077, 75081, 75084, 75088, 75092, 75096, - 75100, 75104, 75108, 75112, 75116, 75120, 75124, 75128, 75132, 75136, - 75139, 75142, 75146, 75150, 75153, 75157, 75161, 75165, 75169, 75173, - 75177, 75180, 75183, 75187, 75191, 75195, 75198, 75201, 75205, 75209, - 75213, 75217, 75221, 75225, 75229, 75233, 75237, 75241, 75245, 75249, - 75253, 75257, 75261, 75265, 75269, 75273, 75277, 75281, 75285, 75289, - 75293, 75297, 75301, 75305, 75309, 75313, 75317, 75321, 75325, 75329, - 75333, 75337, 75341, 75345, 75349, 75352, 75356, 75360, 75364, 75368, - 75372, 75376, 75380, 75384, 75388, 75392, 75396, 75400, 75404, 75408, - 75412, 75416, 75420, 75424, 75428, 75432, 75436, 75440, 75444, 75448, - 75452, 75456, 75460, 75464, 75468, 75472, 75476, 75480, 75484, 75488, - 75492, 75496, 75499, 75503, 75507, 75511, 75515, 75519, 75523, 75527, - 75531, 75535, 75539, 75543, 75547, 75551, 75555, 75559, 75563, 75566, - 75570, 75574, 75578, 75582, 75586, 75590, 75594, 75598, 75602, 75606, - 75610, 75614, 75618, 75622, 75626, 75630, 75634, 75638, 75642, 75646, - 75650, 75653, 75657, 75661, 75665, 75669, 75673, 75677, 75681, 75685, - 75689, 75693, 75697, 75701, 75705, 75709, 75713, 75717, 75721, 75725, - 75729, 75733, 75737, 75741, 75745, 75749, 75753, 75757, 75761, 75765, - 75769, 75773, 75777, 75781, 75785, 75789, 75793, 75797, 75801, 75805, - 75809, 75813, 75817, 75821, 75825, 75828, 75833, 75837, 75843, 75848, - 75854, 75858, 75862, 75866, 75870, 75874, 75878, 75882, 75886, 75890, - 75894, 75898, 75902, 75906, 75910, 75913, 75916, 75919, 75922, 75925, - 75928, 75931, 75934, 75937, 75942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 75948, 75953, 75958, 75963, 75968, 75975, 75982, - 75987, 75992, 75997, 76002, 76009, 76016, 76023, 76030, 76037, 76044, - 76054, 76064, 76071, 76078, 76085, 76092, 76098, 76104, 76113, 76122, - 76129, 76136, 76147, 76158, 76163, 76168, 76175, 76182, 76189, 76196, - 76203, 76210, 76217, 76224, 76230, 76236, 76242, 76248, 76255, 76262, - 76267, 76271, 76278, 76285, 76292, 76296, 76303, 76307, 76312, 76316, - 76322, 76327, 76333, 76338, 76342, 76346, 76349, 76352, 76357, 76362, - 76367, 76372, 76377, 76382, 76387, 76392, 76397, 76402, 76410, 76418, - 76423, 76428, 76433, 76438, 76443, 76448, 76453, 76458, 76463, 76468, - 76473, 76478, 76483, 76488, 76494, 76500, 76506, 76512, 76517, 76523, - 76526, 76529, 76532, 76536, 76540, 76544, 76548, 76551, 76555, 76558, - 76561, 76564, 76568, 76572, 76576, 76580, 76584, 76588, 76592, 76596, - 76600, 76604, 76608, 76612, 76616, 76620, 76624, 76628, 76632, 76636, - 76640, 76644, 76648, 76652, 76655, 76659, 76663, 76667, 76671, 76675, - 76679, 76683, 76687, 76691, 76695, 76699, 76703, 76707, 76711, 76715, - 76719, 76723, 76727, 76731, 76735, 76739, 76743, 76747, 76751, 76754, - 76758, 76762, 76766, 76770, 76774, 76778, 76782, 76785, 76789, 76793, - 76797, 76801, 76805, 76809, 76813, 76817, 76821, 76825, 76829, 76833, - 76838, 76843, 76846, 76851, 76854, 76857, 76860, 0, 0, 0, 0, 0, 0, 0, 0, - 76864, 76873, 76882, 76891, 76900, 76909, 76918, 76927, 76936, 76944, - 76951, 76959, 76966, 76974, 76984, 76993, 77003, 77012, 77022, 77030, - 77037, 77045, 77052, 77060, 77065, 77070, 77076, 77084, 77090, 77096, - 77103, 77112, 77120, 77128, 77136, 77143, 77150, 77157, 77164, 77169, - 77174, 77179, 77184, 77189, 77194, 77199, 77204, 77212, 77220, 77226, - 77232, 77237, 77242, 77247, 77252, 77257, 77262, 77267, 77272, 77281, - 77290, 77295, 77300, 77310, 77320, 77327, 77334, 77343, 77352, 77364, - 77376, 77382, 77388, 77396, 77404, 77414, 77424, 77431, 77438, 77443, - 77448, 77460, 77472, 77480, 77488, 77498, 77508, 77520, 77532, 77541, - 77550, 77557, 77564, 77571, 77578, 77587, 77596, 77601, 77606, 77613, - 77620, 77627, 77634, 77646, 77658, 77663, 77668, 77673, 77678, 77683, - 77688, 77693, 77698, 77702, 77707, 77712, 77717, 77722, 77727, 77733, - 77738, 77743, 77750, 77757, 77764, 77771, 77778, 77786, 77794, 77799, - 77804, 77810, 77816, 77823, 77830, 77837, 77844, 77851, 77855, 77862, - 77867, 77872, 77878, 77891, 77897, 77905, 77913, 77920, 77927, 77936, - 77945, 77952, 77959, 77966, 77973, 77980, 77987, 77994, 78001, 78008, - 78015, 78024, 78033, 78042, 78051, 78060, 78069, 78078, 78087, 78096, - 78105, 78112, 78120, 78126, 78134, 78140, 78146, 78152, 78158, 78166, - 78171, 78176, 78181, 78186, 78191, 78197, 78203, 78209, 78215, 78221, - 78227, 78233, 78239, 78246, 78253, 78260, 78267, 78276, 78283, 78292, - 78304, 78316, 78328, 0, 0, 0, 0, 0, 78340, 78349, 0, 78358, 0, 78364, - 78370, 78378, 78386, 78393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 78400, 78405, 78410, 78415, 78423, 78431, - 78438, 78445, 78451, 78458, 78466, 78474, 78482, 78490, 78498, 78504, - 78510, 78517, 78523, 78529, 78535, 78542, 78549, 78556, 78563, 78570, - 78577, 78584, 78591, 78598, 78605, 78612, 78619, 78626, 78633, 78639, - 78646, 78653, 78660, 78667, 78674, 78681, 78688, 78695, 78702, 78709, - 78716, 78723, 78730, 78737, 78744, 78751, 78758, 78765, 78773, 78781, - 78789, 78797, 78805, 0, 0, 0, 78814, 78822, 78830, 78838, 78846, 78854, - 78862, 78868, 78874, 78880, 0, 0, 0, 0, 0, 0, 78886, 78890, 78895, 78900, - 78905, 78910, 78915, 78920, 78925, 78930, 78935, 78940, 78944, 78948, - 78953, 78958, 78962, 78967, 78972, 78977, 78982, 78987, 78992, 78997, - 79001, 79005, 79009, 79014, 79018, 79022, 79026, 79030, 79034, 79038, - 79042, 79047, 79052, 79057, 79062, 79067, 79074, 79080, 79085, 79090, - 79095, 79100, 79106, 79113, 79119, 79126, 79132, 79138, 79143, 79150, - 79156, 79161, 0, 0, 0, 0, 0, 0, 0, 0, 79167, 79172, 79177, 79181, 79186, - 79190, 79195, 79199, 79204, 79209, 79215, 79220, 79226, 79230, 79235, - 79240, 79244, 79249, 79254, 79258, 79263, 79268, 79273, 79278, 79283, - 79288, 79293, 79298, 79303, 79308, 79313, 79318, 79323, 79328, 79333, - 79338, 79343, 79348, 79352, 79356, 79361, 79366, 79371, 79375, 79379, - 79383, 79387, 79392, 79397, 79402, 79406, 79410, 79415, 79421, 79427, - 79432, 79438, 79443, 79449, 79455, 79462, 79468, 79475, 79480, 79486, - 79492, 79497, 79503, 79509, 79514, 0, 0, 0, 0, 0, 0, 0, 0, 79519, 79523, - 79528, 79533, 79537, 79541, 79545, 79549, 79553, 79557, 79561, 79565, 0, - 0, 0, 0, 0, 0, 79569, 79574, 79578, 79582, 79586, 79590, 79594, 79598, - 79602, 79606, 79610, 79614, 79618, 79622, 79626, 79630, 79634, 79639, - 79644, 79650, 79656, 79663, 79668, 79673, 79679, 79683, 79688, 79691, - 79694, 79698, 79703, 79707, 79712, 79719, 79725, 79731, 79737, 79743, - 79749, 79755, 79761, 79767, 79773, 79779, 79786, 79793, 79800, 79806, - 79813, 79820, 79827, 79834, 79841, 79847, 79853, 79860, 79866, 79873, - 79880, 79886, 79892, 79898, 79905, 79912, 79918, 79925, 79932, 79938, - 79945, 79951, 79958, 79965, 79971, 79977, 79984, 79990, 79997, 80004, - 80013, 80020, 80027, 80031, 80036, 80041, 80046, 80051, 80055, 80059, - 80064, 80068, 80073, 80078, 80083, 80087, 80091, 80095, 80099, 80104, - 80108, 80113, 80118, 80123, 80128, 80132, 80137, 80142, 80147, 80153, - 80158, 80164, 80170, 80176, 80182, 80188, 80193, 80199, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 80203, 80208, 80212, 80216, 80220, 80224, 80228, 80232, - 80236, 80240, 80244, 80248, 80252, 80256, 80260, 80264, 80268, 80272, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 69276, 69285, 69294, 69305, 69312, 69317, 69322, 69329, 69336, 69342, + 69347, 69352, 69357, 69362, 69369, 69374, 69379, 69384, 69395, 69400, + 69405, 69412, 69417, 69424, 69429, 69434, 69441, 69448, 69455, 69464, + 69473, 69478, 69483, 69488, 69495, 69500, 69510, 69517, 69522, 69527, + 69532, 69537, 69542, 69547, 69555, 69562, 69569, 69574, 69581, 69586, + 69593, 69602, 69613, 69618, 69627, 69632, 69639, 69648, 69657, 69662, + 69667, 69674, 69680, 69687, 69694, 69698, 69702, 69705, 69709, 69713, + 69717, 69721, 69725, 69729, 69733, 69736, 69740, 69744, 69748, 69752, + 69756, 69760, 69763, 69767, 69771, 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, + 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, 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, 70309, + 70313, 70317, 70321, 70325, 70329, 70333, 70337, 70341, 70345, 70349, + 70353, 70357, 70361, 70365, 70369, 70373, 70377, 70381, 70385, 70389, + 70393, 70397, 70401, 70405, 70409, 70413, 70417, 70421, 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, 70564, 70568, 70572, 70576, 70580, 70584, 70588, + 70592, 70596, 70600, 70604, 70608, 70612, 70616, 70620, 70624, 70628, + 70632, 70636, 70640, 70644, 70648, 70652, 70656, 70660, 70664, 70668, + 70672, 70676, 70680, 70684, 70688, 70692, 70696, 70700, 70704, 70708, + 70712, 70716, 70720, 70724, 70728, 70732, 70736, 70740, 70744, 70748, + 70752, 70756, 70760, 70764, 70768, 70772, 70776, 70780, 70784, 70788, + 70792, 70796, 70800, 70804, 70808, 70812, 70816, 70820, 70824, 70828, + 70832, 70836, 70840, 70844, 70848, 70852, 70856, 70860, 70864, 70868, + 70872, 70876, 70880, 70884, 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, 71019, 71023, 71027, + 71031, 71035, 71039, 71043, 71047, 71051, 71055, 71059, 71063, 71067, + 71071, 71075, 71079, 71083, 71087, 71091, 71095, 71099, 71103, 71107, + 71111, 71115, 71119, 71123, 71127, 71131, 71135, 71139, 71143, 71147, + 71151, 71155, 71159, 71163, 71167, 71171, 71175, 71179, 71183, 71187, + 71191, 71195, 71199, 71203, 71207, 71211, 71215, 71219, 71223, 71227, + 71231, 71235, 71239, 71243, 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, 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, + 71629, 71633, 71637, 71641, 71645, 71649, 71653, 71657, 71661, 71665, + 71669, 71673, 71677, 71681, 71685, 71689, 71693, 71697, 71701, 71705, + 71709, 71713, 71717, 71721, 71725, 71729, 71733, 71737, 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, 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, + 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, 72798, 72802, 72806, 72810, 72814, 72818, 72822, + 72826, 72829, 72833, 72837, 72841, 72845, 72849, 72853, 72857, 72861, + 72865, 72869, 72873, 72877, 72881, 72885, 72889, 72893, 72897, 72901, + 72905, 72909, 72913, 72917, 72921, 72925, 72929, 72933, 72937, 72941, + 72945, 72949, 72953, 72957, 72961, 72965, 72969, 72973, 72977, 72981, + 72985, 72989, 72993, 72997, 73001, 73005, 73009, 73013, 73017, 73021, + 73025, 73029, 73033, 73037, 73041, 73045, 73049, 73053, 73057, 73061, + 73065, 73069, 73073, 73077, 73081, 73085, 73089, 73093, 73097, 73101, + 73105, 73109, 73113, 73117, 73121, 73125, 73129, 73133, 73137, 73141, + 73145, 73149, 73153, 73157, 73161, 73165, 73169, 73173, 73177, 73181, + 73185, 73189, 73193, 73197, 73201, 73205, 73209, 73213, 73217, 73221, + 73225, 73229, 73233, 73237, 73241, 73245, 73249, 73253, 73257, 73261, + 73265, 73269, 73273, 73277, 73281, 73285, 73289, 73293, 73297, 73301, + 73305, 73309, 73313, 73317, 73321, 73325, 73329, 73333, 73337, 73341, + 73345, 73349, 73353, 73357, 73361, 73365, 73369, 73373, 73377, 73381, + 73385, 73389, 73393, 73397, 73401, 73405, 73409, 73413, 73417, 73421, + 73425, 73429, 73433, 73437, 73441, 73445, 73449, 73453, 73457, 73461, + 73465, 73469, 73473, 73477, 73481, 73485, 73489, 73493, 73497, 73501, + 73505, 73509, 73513, 73517, 73521, 73525, 73529, 73533, 73537, 73541, + 73545, 73549, 73553, 73556, 73560, 73564, 73568, 73572, 73576, 73580, + 73584, 73588, 73592, 73596, 73600, 73604, 73608, 73612, 73616, 73620, + 73624, 73628, 73632, 73636, 73640, 73644, 73648, 73652, 73656, 73660, + 73664, 73668, 73672, 73676, 73680, 73684, 73688, 73692, 73696, 73700, + 73704, 73708, 73712, 73716, 73720, 73724, 73728, 73732, 73736, 73740, + 73744, 73748, 73752, 73756, 73760, 73764, 73768, 73772, 73776, 73780, + 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, 73932, 73936, 73940, + 73944, 73948, 73952, 73956, 73960, 73964, 73968, 73972, 73976, 73980, + 73984, 73988, 73992, 73996, 74000, 74004, 74008, 74012, 74016, 74020, + 74024, 74028, 74032, 74036, 74040, 74044, 74048, 74052, 74056, 74060, + 74064, 74068, 74072, 74076, 74080, 74084, 74088, 74092, 74096, 74100, + 74104, 74108, 74112, 74116, 74120, 74124, 74128, 74132, 74136, 74140, + 74144, 74148, 74152, 74156, 74160, 74164, 74168, 74172, 74176, 74180, + 74184, 74188, 74192, 74196, 74200, 74204, 74208, 74212, 74216, 74220, + 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, 0, 0, 0, + 74340, 74344, 74348, 74352, 74356, 74360, 74364, 74368, 74372, 74376, + 74380, 74384, 74388, 74392, 74396, 74400, 74404, 74408, 74412, 74416, + 74420, 74424, 74428, 74432, 74436, 74440, 74444, 74448, 74452, 74456, + 74460, 74464, 74468, 74472, 74476, 74480, 74484, 74488, 74492, 74496, + 74500, 74504, 74508, 74512, 74516, 74520, 74524, 74528, 74532, 74536, + 74540, 74544, 74548, 74552, 74556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74560, + 74565, 74569, 74574, 74579, 74584, 74589, 74594, 74598, 74603, 74608, + 74613, 74618, 74623, 74628, 74633, 74637, 74641, 74645, 74649, 74654, + 74659, 74664, 74668, 74673, 74678, 74683, 74688, 74693, 74697, 74702, + 74706, 74711, 74715, 74720, 74724, 74728, 74732, 74737, 74742, 74747, + 74755, 74763, 74771, 74779, 74786, 74794, 74800, 74808, 74812, 74816, + 74820, 74824, 74828, 74832, 74836, 74840, 74844, 74848, 74852, 74856, + 74860, 74864, 74868, 74872, 74876, 74880, 74884, 74888, 74892, 74896, + 74900, 74904, 74908, 74912, 74916, 74920, 74924, 74928, 74932, 74936, + 74940, 74944, 74948, 74952, 74955, 74959, 74963, 74967, 74971, 74975, + 74979, 74983, 74987, 74991, 74995, 74999, 75003, 75007, 75011, 75015, + 75019, 75023, 75027, 75031, 75035, 75039, 75043, 75047, 75051, 75055, + 75059, 75063, 75067, 75071, 75075, 75079, 75083, 75087, 75091, 75095, + 75099, 75102, 75106, 75110, 75113, 75117, 75121, 75125, 75128, 75132, + 75136, 75140, 75144, 75148, 75152, 75156, 75160, 75164, 75168, 75172, + 75176, 75180, 75183, 75186, 75190, 75194, 75197, 75201, 75205, 75209, + 75213, 75217, 75221, 75224, 75227, 75231, 75235, 75239, 75242, 75245, + 75249, 75253, 75257, 75261, 75265, 75269, 75273, 75277, 75281, 75285, + 75289, 75293, 75297, 75301, 75305, 75309, 75313, 75317, 75321, 75325, + 75329, 75333, 75337, 75341, 75345, 75349, 75353, 75357, 75361, 75365, + 75369, 75373, 75377, 75381, 75385, 75389, 75393, 75396, 75400, 75404, + 75408, 75412, 75416, 75420, 75424, 75428, 75432, 75436, 75440, 75444, + 75448, 75452, 75456, 75460, 75464, 75468, 75472, 75476, 75480, 75484, + 75488, 75492, 75496, 75500, 75504, 75508, 75512, 75516, 75520, 75524, + 75528, 75532, 75536, 75540, 75543, 75547, 75551, 75555, 75559, 75563, + 75567, 75571, 75575, 75579, 75583, 75587, 75591, 75595, 75599, 75603, + 75607, 75610, 75614, 75618, 75622, 75626, 75630, 75634, 75638, 75642, + 75646, 75650, 75654, 75658, 75662, 75666, 75670, 75674, 75678, 75682, + 75686, 75690, 75694, 75697, 75701, 75705, 75709, 75713, 75717, 75721, + 75725, 75729, 75733, 75737, 75741, 75745, 75749, 75753, 75757, 75761, + 75765, 75769, 75773, 75777, 75781, 75785, 75789, 75793, 75797, 75801, + 75805, 75809, 75813, 75817, 75821, 75825, 75829, 75833, 75837, 75841, + 75845, 75849, 75853, 75857, 75861, 75865, 75869, 75872, 75877, 75881, + 75887, 75892, 75898, 75902, 75906, 75910, 75914, 75918, 75922, 75926, + 75930, 75934, 75938, 75942, 75946, 75950, 75954, 75957, 75960, 75963, + 75966, 75969, 75972, 75975, 75978, 75981, 75986, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75992, 75997, 76002, 76007, 76012, + 76019, 76026, 76031, 76036, 76041, 76046, 76053, 76060, 76067, 76074, + 76081, 76088, 76098, 76108, 76115, 76122, 76129, 76136, 76142, 76148, + 76157, 76166, 76173, 76180, 76191, 76202, 76207, 76212, 76219, 76226, + 76233, 76240, 76247, 76254, 76261, 76268, 76274, 76280, 76286, 76292, + 76299, 76306, 76311, 76315, 76322, 76329, 76336, 76340, 76347, 76351, + 76356, 76360, 76366, 76371, 76377, 76382, 76386, 76390, 76393, 76396, + 76401, 76406, 76411, 76416, 76421, 76426, 76431, 76436, 76441, 76446, + 76454, 76462, 76467, 76472, 76477, 76482, 76487, 76492, 76497, 76502, + 76507, 76512, 76517, 76522, 76527, 76532, 76538, 76544, 76550, 76556, + 76561, 76567, 76570, 76573, 76576, 76580, 76584, 76588, 76592, 76595, + 76599, 76602, 76605, 76608, 76612, 76616, 76620, 76624, 76628, 76632, + 76636, 76640, 76644, 76648, 76652, 76656, 76660, 76664, 76668, 76672, + 76676, 76680, 76684, 76688, 76692, 76696, 76699, 76703, 76707, 76711, + 76715, 76719, 76723, 76727, 76731, 76735, 76739, 76743, 76747, 76751, + 76755, 76759, 76763, 76767, 76771, 76775, 76779, 76783, 76787, 76791, + 76795, 76798, 76802, 76806, 76810, 76814, 76818, 76822, 76826, 76829, + 76833, 76837, 76841, 76845, 76849, 76853, 76857, 76861, 76865, 76869, + 76873, 76877, 76882, 76887, 76890, 76895, 76898, 76901, 76904, 0, 0, 0, + 0, 0, 0, 0, 0, 76908, 76917, 76926, 76935, 76944, 76953, 76962, 76971, + 76980, 76988, 76995, 77003, 77010, 77018, 77028, 77037, 77047, 77056, + 77066, 77074, 77081, 77089, 77096, 77104, 77109, 77114, 77120, 77128, + 77134, 77140, 77147, 77156, 77164, 77172, 77180, 77187, 77194, 77201, + 77208, 77213, 77218, 77223, 77228, 77233, 77238, 77243, 77248, 77256, + 77264, 77270, 77276, 77281, 77286, 77291, 77296, 77301, 77306, 77311, + 77316, 77325, 77334, 77339, 77344, 77354, 77364, 77371, 77378, 77387, + 77396, 77408, 77420, 77426, 77432, 77440, 77448, 77458, 77468, 77475, + 77482, 77487, 77492, 77504, 77516, 77524, 77532, 77542, 77552, 77564, + 77576, 77585, 77594, 77601, 77608, 77615, 77622, 77631, 77640, 77645, + 77650, 77657, 77664, 77671, 77678, 77690, 77702, 77707, 77712, 77717, + 77722, 77727, 77732, 77737, 77742, 77746, 77751, 77756, 77761, 77766, + 77771, 77777, 77782, 77787, 77794, 77801, 77808, 77815, 77822, 77830, + 77838, 77843, 77848, 77854, 77860, 77867, 77874, 77881, 77888, 77895, + 77899, 77906, 77911, 77916, 77922, 77935, 77941, 77949, 77957, 77964, + 77971, 77980, 77989, 77996, 78003, 78010, 78017, 78024, 78031, 78038, + 78045, 78052, 78059, 78068, 78077, 78086, 78095, 78104, 78113, 78122, + 78131, 78140, 78149, 78156, 78164, 78170, 78178, 78184, 78190, 78196, + 78202, 78210, 78215, 78220, 78225, 78230, 78235, 78241, 78247, 78253, + 78259, 78265, 78271, 78277, 78283, 78290, 78297, 78304, 78311, 78320, + 78327, 78336, 78348, 78360, 78372, 0, 0, 0, 0, 0, 78384, 78393, 0, 78402, + 0, 78408, 78414, 78422, 78430, 78437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78444, 78449, 78454, 78459, 78467, + 78475, 78482, 78489, 78495, 78502, 78510, 78518, 78526, 78534, 78542, + 78548, 78554, 78561, 78567, 78573, 78579, 78586, 78593, 78600, 78607, + 78614, 78621, 78628, 78635, 78642, 78649, 78656, 78663, 78670, 78677, + 78683, 78690, 78697, 78704, 78711, 78718, 78725, 78732, 78739, 78746, + 78753, 78760, 78767, 78774, 78781, 78788, 78795, 78802, 78809, 78817, + 78825, 78833, 78841, 78849, 0, 0, 0, 78858, 78866, 78874, 78882, 78890, + 78898, 78906, 78912, 78918, 78924, 0, 0, 0, 0, 0, 0, 78930, 78934, 78939, + 78944, 78949, 78954, 78959, 78964, 78969, 78974, 78979, 78984, 78988, + 78992, 78997, 79002, 79006, 79011, 79016, 79021, 79026, 79031, 79036, + 79041, 79045, 79049, 79053, 79058, 79062, 79066, 79070, 79074, 79078, + 79082, 79086, 79091, 79096, 79101, 79106, 79111, 79118, 79124, 79129, + 79134, 79139, 79144, 79150, 79157, 79163, 79170, 79176, 79182, 79187, + 79194, 79200, 79205, 0, 0, 0, 0, 0, 0, 0, 0, 79211, 79216, 79221, 79225, + 79230, 79234, 79239, 79243, 79248, 79253, 79259, 79264, 79270, 79274, + 79279, 79284, 79288, 79293, 79298, 79302, 79307, 79312, 79317, 79322, + 79327, 79332, 79337, 79342, 79347, 79352, 79357, 79362, 79367, 79372, + 79377, 79382, 79387, 79392, 79396, 79400, 79405, 79410, 79415, 79419, + 79423, 79427, 79431, 79436, 79441, 79446, 79450, 79454, 79459, 79465, + 79471, 79476, 79482, 79487, 79493, 79499, 79506, 79512, 79519, 79524, + 79530, 79536, 79541, 79547, 79553, 79558, 0, 0, 0, 0, 0, 0, 0, 0, 79563, + 79567, 79572, 79577, 79581, 79585, 79589, 79593, 79597, 79601, 79605, + 79609, 0, 0, 0, 0, 0, 0, 79613, 79618, 79622, 79626, 79630, 79634, 79638, + 79642, 79646, 79650, 79654, 79658, 79662, 79666, 79670, 79674, 79678, + 79683, 79688, 79694, 79700, 79707, 79712, 79717, 79723, 79727, 79732, + 79735, 79738, 79742, 79747, 79751, 79756, 79763, 79769, 79775, 79781, + 79787, 79793, 79799, 79805, 79811, 79817, 79823, 79830, 79837, 79844, + 79850, 79857, 79864, 79871, 79878, 79885, 79891, 79897, 79904, 79910, + 79917, 79924, 79930, 79936, 79942, 79949, 79956, 79962, 79969, 79976, + 79982, 79989, 79995, 80002, 80009, 80015, 80021, 80028, 80034, 80041, + 80048, 80057, 80064, 80071, 80075, 80080, 80085, 80090, 80095, 80099, + 80103, 80108, 80112, 80117, 80122, 80127, 80131, 80135, 80139, 80143, + 80148, 80152, 80157, 80162, 80167, 80172, 80176, 80181, 80186, 80191, + 80197, 80202, 80208, 80214, 80220, 80226, 80232, 80237, 80243, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 80247, 80252, 80256, 80260, 80264, 80268, 80272, 80276, 80280, 80284, 80288, 80292, 80296, 80300, 80304, 80308, 80312, - 80316, 80320, 0, 0, 0, 80324, 80329, 80334, 80339, 80344, 80348, 80355, - 80359, 80364, 80368, 80375, 80382, 80391, 80395, 80400, 80404, 80408, - 80415, 80422, 80427, 80434, 80439, 80444, 80451, 80456, 80463, 80470, - 80475, 80480, 80487, 80492, 80499, 80506, 80511, 80518, 80523, 80530, - 80534, 80538, 80545, 80550, 80557, 80561, 80565, 80569, 80576, 80580, - 80585, 80592, 80599, 80603, 80607, 80614, 80620, 80626, 80632, 80640, - 80646, 80654, 80660, 80668, 80674, 80680, 80686, 80692, 80696, 80701, - 80706, 80712, 80718, 80724, 80730, 80736, 80742, 80748, 80754, 80762, - 80768, 0, 80775, 80779, 80784, 80788, 80792, 80796, 80800, 80804, 80808, - 80812, 80816, 0, 0, 0, 0, 80820, 80828, 80834, 80840, 80846, 80852, - 80858, 80864, 80870, 80877, 80884, 80891, 80898, 80905, 80912, 80919, - 80926, 80933, 80940, 80947, 80953, 80959, 80965, 80971, 80977, 80983, - 80989, 80995, 81001, 81008, 81015, 81022, 81029, 0, 81036, 81040, 81044, - 81048, 81052, 81057, 81061, 81065, 81070, 81075, 81080, 81085, 81090, - 81095, 81100, 81105, 81110, 81115, 81120, 81125, 81130, 81135, 81140, - 81145, 81150, 81154, 81159, 81163, 81168, 81173, 81178, 81183, 81188, - 81192, 81197, 81201, 81205, 81209, 81214, 81219, 81223, 81227, 81233, - 81238, 81244, 81250, 81255, 81261, 81266, 81272, 81278, 81284, 81289, - 81294, 81299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81305, 81311, 81317, 81323, - 81330, 81336, 81342, 81348, 81354, 81360, 81365, 81370, 81376, 81383, 0, - 0, 81390, 81395, 81399, 81403, 81407, 81411, 81415, 81419, 81423, 81427, - 0, 0, 81431, 81437, 81443, 81450, 81458, 81464, 81470, 81476, 81482, - 81488, 81494, 81500, 81506, 81512, 81518, 81524, 81529, 81534, 81539, - 81545, 81551, 81558, 81564, 81570, 81575, 81582, 81589, 81596, 81602, - 81607, 81612, 81617, 81625, 81632, 81639, 81647, 81655, 81662, 81669, - 81676, 81683, 81690, 81697, 81704, 81711, 81718, 81725, 81732, 81739, - 81746, 81753, 81760, 81767, 81774, 81781, 81788, 81795, 81801, 81807, - 81814, 81821, 81828, 81835, 81842, 81849, 81856, 81863, 81870, 81877, - 81884, 81891, 81898, 81905, 81912, 81919, 81926, 81933, 81940, 81947, - 81954, 81961, 81968, 81975, 81981, 81987, 81994, 82000, 82005, 82011, - 82016, 82021, 82026, 82033, 82039, 82045, 82051, 82057, 82063, 82069, - 82075, 82083, 82091, 82099, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 82107, 82113, 82119, 82125, 82133, 82141, - 82147, 82153, 82160, 82167, 82174, 82181, 82188, 82195, 82202, 82209, - 82216, 82224, 82232, 82240, 82248, 82256, 82262, 82270, 82276, 82284, - 82293, 82301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82307, 82311, 82315, 82319, - 82323, 82327, 0, 0, 82331, 82335, 82339, 82343, 82347, 82351, 0, 0, - 82355, 82359, 82363, 82367, 82371, 82375, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82379, 82383, 82387, 82391, 82395, 82399, 82403, 0, 82407, 82411, 82415, - 82419, 82423, 82427, 82431, 0, 82435, 82442, 82448, 82454, 82460, 82468, - 82475, 82484, 82496, 82506, 82515, 82523, 82531, 82539, 82545, 82553, - 82561, 82568, 82576, 82586, 82593, 82602, 82608, 82618, 82627, 82632, - 82640, 82649, 82654, 82663, 82670, 82680, 82692, 82697, 82703, 82710, - 82715, 82725, 82735, 82745, 82755, 82770, 82783, 82794, 82802, 82807, - 82819, 82828, 82835, 82842, 82848, 82855, 82860, 82867, 82873, 82884, - 82895, 82905, 82911, 82916, 0, 0, 0, 0, 82921, 82925, 82929, 82933, - 82937, 82941, 82946, 82951, 82955, 82960, 82965, 82970, 82975, 82980, - 82984, 82989, 82994, 82999, 83004, 83009, 83013, 83018, 83023, 83028, - 83033, 83038, 83042, 83047, 83052, 83057, 83062, 83066, 83071, 83076, - 83081, 83086, 83091, 83096, 83101, 83106, 83111, 83116, 83121, 83126, - 83131, 83135, 83140, 83145, 83150, 83155, 83160, 83165, 83170, 83175, - 83180, 83185, 83190, 83195, 83200, 83205, 83210, 83215, 83220, 83225, - 83230, 83235, 83240, 83245, 83250, 83255, 83260, 83265, 83270, 83275, - 83280, 83285, 83290, 83295, 83300, 83305, 83309, 83316, 83323, 83330, - 83337, 83343, 83349, 83356, 83363, 83370, 83377, 83384, 83391, 83398, - 83405, 83412, 83418, 83425, 83432, 83439, 83446, 83453, 83460, 83467, - 83474, 83481, 83488, 83495, 83504, 83513, 83522, 83531, 83540, 83549, - 83558, 83567, 83575, 83583, 83591, 83599, 83607, 83615, 83623, 83631, - 83637, 83645, 0, 0, 83653, 83660, 83666, 83672, 83678, 83684, 83690, - 83696, 83702, 83708, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80316, 80320, 80324, 80328, 80332, 80336, 80340, 80344, 80348, 80352, + 80356, 80360, 80364, 0, 0, 0, 80368, 80373, 80378, 80383, 80388, 80392, + 80399, 80403, 80408, 80412, 80419, 80426, 80435, 80439, 80444, 80448, + 80452, 80459, 80466, 80471, 80478, 80483, 80488, 80495, 80500, 80507, + 80514, 80519, 80524, 80531, 80536, 80543, 80550, 80555, 80562, 80567, + 80574, 80578, 80582, 80589, 80594, 80601, 80605, 80609, 80613, 80620, + 80624, 80629, 80636, 80643, 80647, 80651, 80658, 80664, 80670, 80676, + 80684, 80690, 80698, 80704, 80712, 80718, 80724, 80730, 80736, 80740, + 80745, 80750, 80756, 80762, 80768, 80774, 80780, 80786, 80792, 80798, + 80806, 80812, 0, 80819, 80823, 80828, 80832, 80836, 80840, 80844, 80848, + 80852, 80856, 80860, 0, 0, 0, 0, 80864, 80872, 80878, 80884, 80890, + 80896, 80902, 80908, 80914, 80921, 80928, 80935, 80942, 80949, 80956, + 80963, 80970, 80977, 80984, 80991, 80997, 81003, 81009, 81015, 81021, + 81027, 81033, 81039, 81045, 81052, 81059, 81066, 81073, 0, 81080, 81084, + 81088, 81092, 81096, 81101, 81105, 81109, 81114, 81119, 81124, 81129, + 81134, 81139, 81144, 81149, 81154, 81159, 81164, 81169, 81174, 81179, + 81184, 81189, 81194, 81198, 81203, 81207, 81212, 81217, 81222, 81227, + 81232, 81236, 81241, 81245, 81249, 81253, 81258, 81263, 81267, 81271, + 81277, 81282, 81288, 81294, 81299, 81305, 81310, 81316, 81322, 81328, + 81333, 81338, 81343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81349, 81355, 81361, + 81367, 81374, 81380, 81386, 81392, 81398, 81404, 81409, 81414, 81420, + 81427, 0, 0, 81434, 81439, 81443, 81447, 81451, 81455, 81459, 81463, + 81467, 81471, 0, 0, 81475, 81481, 81487, 81494, 81502, 81508, 81514, + 81520, 81526, 81532, 81538, 81544, 81550, 81556, 81562, 81568, 81573, + 81578, 81583, 81589, 81595, 81602, 81608, 81614, 81619, 81626, 81633, + 81640, 81646, 81651, 81656, 81661, 81669, 81676, 81683, 81691, 81699, + 81706, 81713, 81720, 81727, 81734, 81741, 81748, 81755, 81762, 81769, + 81776, 81783, 81790, 81797, 81804, 81811, 81818, 81825, 81832, 81839, + 81845, 81851, 81858, 81865, 81872, 81879, 81886, 81893, 81900, 81907, + 81914, 81921, 81928, 81935, 81942, 81949, 81956, 81963, 81970, 81977, + 81984, 81991, 81998, 82005, 82012, 82019, 82025, 82031, 82038, 82044, + 82049, 82055, 82060, 82065, 82070, 82077, 82083, 82089, 82095, 82101, + 82107, 82113, 82119, 82127, 82135, 82143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82151, 82157, 82163, 82169, + 82177, 82185, 82191, 82197, 82204, 82211, 82218, 82225, 82232, 82239, + 82246, 82253, 82260, 82268, 82276, 82284, 82292, 82300, 82306, 82314, + 82320, 82328, 82337, 82345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82351, 82355, + 82359, 82363, 82367, 82371, 0, 0, 82375, 82379, 82383, 82387, 82391, + 82395, 0, 0, 82399, 82403, 82407, 82411, 82415, 82419, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 82423, 82427, 82431, 82435, 82439, 82443, 82447, 0, 82451, + 82455, 82459, 82463, 82467, 82471, 82475, 0, 82479, 82486, 82492, 82498, + 82504, 82512, 82519, 82528, 82540, 82550, 82559, 82567, 82575, 82583, + 82589, 82597, 82605, 82612, 82620, 82630, 82637, 82646, 82652, 82662, + 82671, 82676, 82684, 82693, 82698, 82707, 82714, 82724, 82736, 82741, + 82747, 82754, 82759, 82769, 82779, 82789, 82799, 82814, 82827, 82838, + 82846, 82851, 82863, 82872, 82879, 82886, 82892, 82899, 82904, 82911, + 82917, 82928, 82939, 82949, 82955, 82960, 0, 0, 0, 0, 82965, 82969, + 82973, 82977, 82981, 82985, 82990, 82995, 82999, 83004, 83009, 83014, + 83019, 83024, 83028, 83033, 83038, 83043, 83048, 83053, 83057, 83062, + 83067, 83072, 83077, 83082, 83086, 83091, 83096, 83101, 83106, 83110, + 83115, 83120, 83125, 83130, 83135, 83140, 83145, 83150, 83155, 83160, + 83165, 83170, 83175, 83179, 83184, 83189, 83194, 83199, 83204, 83209, + 83214, 83219, 83224, 83229, 83234, 83239, 83244, 83249, 83254, 83259, + 83264, 83269, 83274, 83279, 83284, 83289, 83294, 83299, 83304, 83309, + 83314, 83319, 83324, 83329, 83334, 83339, 83344, 83349, 83353, 83360, + 83367, 83374, 83381, 83387, 83393, 83400, 83407, 83414, 83421, 83428, + 83435, 83442, 83449, 83456, 83462, 83469, 83476, 83483, 83490, 83497, + 83504, 83511, 83518, 83525, 83532, 83539, 83548, 83557, 83566, 83575, + 83584, 83593, 83602, 83611, 83619, 83627, 83635, 83643, 83651, 83659, + 83667, 83675, 83681, 83689, 0, 0, 83697, 83704, 83710, 83716, 83722, + 83728, 83734, 83740, 83746, 83752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83714, 83719, 83724, 83729, 83734, - 83739, 83744, 83749, 83754, 83759, 83764, 83769, 83774, 83779, 83784, - 83789, 83794, 83799, 83804, 83809, 83814, 83819, 83824, 0, 0, 0, 0, - 83829, 83833, 83837, 83841, 83845, 83849, 83853, 83857, 83861, 83865, - 83869, 83873, 83877, 83881, 83885, 83889, 83893, 83897, 83901, 83905, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83758, 83763, 83768, + 83773, 83778, 83783, 83788, 83793, 83798, 83803, 83808, 83813, 83818, + 83823, 83828, 83833, 83838, 83843, 83848, 83853, 83858, 83863, 83868, 0, + 0, 0, 0, 83873, 83877, 83881, 83885, 83889, 83893, 83897, 83901, 83905, 83909, 83913, 83917, 83921, 83925, 83929, 83933, 83937, 83941, 83945, 83949, 83953, 83957, 83961, 83965, 83969, 83973, 83977, 83981, 83985, - 83989, 83993, 83997, 84001, 84005, 84009, 84013, 84017, 84021, 0, 0, 0, - 0, 84025, 84029, 84033, 84037, 84041, 84045, 84049, 84053, 84057, 84061, - 84065, 84069, 84073, 84077, 84081, 84085, 84089, 84093, 84097, 84101, + 83989, 83993, 83997, 84001, 84005, 84009, 84013, 84017, 84021, 84025, + 84029, 84033, 84037, 84041, 84045, 84049, 84053, 84057, 84061, 84065, 0, + 0, 0, 0, 84069, 84073, 84077, 84081, 84085, 84089, 84093, 84097, 84101, 84105, 84109, 84113, 84117, 84121, 84125, 84129, 84133, 84137, 84141, 84145, 84149, 84153, 84157, 84161, 84165, 84169, 84173, 84177, 84181, 84185, 84189, 84193, 84197, 84201, 84205, 84209, 84213, 84217, 84221, @@ -22893,8 +22898,8 @@ static const unsigned int phrasebook_offset2[] = { 85345, 85349, 85353, 85357, 85361, 85365, 85369, 85373, 85377, 85381, 85385, 85389, 85393, 85397, 85401, 85405, 85409, 85413, 85417, 85421, 85425, 85429, 85433, 85437, 85441, 85445, 85449, 85453, 85457, 85461, - 85465, 85469, 85473, 85477, 85481, 85485, 0, 0, 85489, 85493, 85497, - 85501, 85505, 85509, 85513, 85517, 85521, 85525, 85529, 85533, 85537, + 85465, 85469, 85473, 85477, 85481, 85485, 85489, 85493, 85497, 85501, + 85505, 85509, 85513, 85517, 85521, 85525, 85529, 0, 0, 85533, 85537, 85541, 85545, 85549, 85553, 85557, 85561, 85565, 85569, 85573, 85577, 85581, 85585, 85589, 85593, 85597, 85601, 85605, 85609, 85613, 85617, 85621, 85625, 85629, 85633, 85637, 85641, 85645, 85649, 85653, 85657, @@ -22904,731 +22909,732 @@ static const unsigned int phrasebook_offset2[] = { 85781, 85785, 85789, 85793, 85797, 85801, 85805, 85809, 85813, 85817, 85821, 85825, 85829, 85833, 85837, 85841, 85845, 85849, 85853, 85857, 85861, 85865, 85869, 85873, 85877, 85881, 85885, 85889, 85893, 85897, - 85901, 85905, 85909, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85913, - 85918, 85923, 85928, 85933, 85938, 85946, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 85951, 85959, 85967, 85975, 85983, 0, 0, 0, 0, 0, 85991, 85998, - 86005, 86015, 86021, 86027, 86033, 86039, 86045, 86051, 86058, 86064, - 86070, 86076, 86085, 86094, 86106, 86118, 86124, 86130, 86136, 86143, - 86150, 86157, 86164, 86171, 0, 86178, 86185, 86192, 86200, 86207, 0, - 86214, 0, 86221, 86228, 0, 86235, 86243, 0, 86250, 86257, 86264, 86271, - 86278, 86285, 86292, 86299, 86306, 86313, 86318, 86325, 86332, 86338, - 86344, 86350, 86357, 86363, 86369, 86375, 86382, 86388, 86394, 86400, - 86407, 86413, 86419, 86425, 86432, 86438, 86444, 86450, 86457, 86463, - 86469, 86475, 86482, 86488, 86494, 86500, 86507, 86513, 86519, 86525, - 86532, 86538, 86544, 86550, 86557, 86563, 86569, 86575, 86582, 86588, - 86594, 86600, 86607, 86613, 86619, 86625, 86632, 86638, 86644, 86650, - 86656, 86662, 86668, 86674, 86680, 86686, 86692, 86698, 86704, 86710, - 86716, 86722, 86729, 86735, 86741, 86747, 86754, 86760, 86766, 86772, - 86779, 86785, 86791, 86797, 86804, 86812, 86820, 86826, 86832, 86838, - 86845, 86854, 86863, 86871, 86879, 86887, 86896, 86904, 86912, 86920, - 86929, 86936, 86943, 86954, 86965, 86969, 86973, 86978, 86983, 86988, - 86993, 87002, 87011, 87017, 87023, 87030, 87037, 87044, 87048, 87054, - 87060, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87065, 87071, - 87077, 87083, 87090, 87095, 87100, 87106, 87112, 87118, 87124, 87133, - 87139, 87145, 87153, 87161, 87169, 87177, 87183, 87189, 87195, 87202, - 87215, 87229, 87240, 87251, 87263, 87275, 87287, 87299, 87310, 87321, - 87333, 87345, 87357, 87369, 87381, 87393, 87405, 87422, 87439, 87456, - 87463, 87470, 87477, 87485, 87497, 87508, 87519, 87532, 87543, 87552, - 87560, 87569, 87577, 87587, 87595, 87604, 87612, 87621, 87629, 87639, - 87647, 87656, 87664, 87674, 87682, 87690, 87698, 87706, 87713, 87722, - 87730, 87738, 87747, 87755, 87764, 87772, 87780, 87788, 87797, 87805, - 87814, 87822, 87830, 87838, 87846, 87855, 87863, 87872, 87880, 87889, - 87897, 87906, 87914, 87924, 87932, 87940, 87948, 87958, 87966, 87974, - 87983, 87991, 88000, 88009, 88017, 88027, 88035, 88044, 88052, 88061, - 88069, 88079, 88087, 88095, 88102, 88110, 88117, 88126, 88133, 88142, - 88150, 88159, 88167, 88177, 88185, 88194, 88202, 88212, 88220, 88228, - 88235, 88243, 88250, 88259, 88266, 88276, 88286, 88297, 88306, 88315, - 88324, 88333, 88342, 88352, 88364, 88376, 88387, 88399, 88412, 88423, - 88432, 88441, 88449, 88458, 88468, 88476, 88485, 88494, 88502, 88511, - 88521, 88529, 88538, 88547, 88555, 88564, 88574, 88582, 88592, 88600, - 88610, 88618, 88626, 88635, 88643, 88653, 88661, 88669, 88679, 88687, - 88694, 88701, 88710, 88719, 88727, 88736, 88746, 88754, 88765, 88773, - 88781, 88788, 88796, 88805, 88812, 88824, 88835, 88847, 88858, 88870, - 88879, 88887, 88896, 88904, 88913, 88922, 88930, 88939, 88947, 88956, - 88964, 88972, 88980, 88988, 88995, 89004, 89012, 89021, 89029, 89038, - 89046, 89054, 89063, 89071, 89080, 89088, 89097, 89105, 89113, 89121, - 89130, 89138, 89147, 89155, 89164, 89172, 89181, 89189, 89197, 89205, - 89214, 89222, 89231, 89240, 89248, 89257, 89265, 89274, 89282, 89291, - 89299, 89306, 89314, 89321, 89330, 89338, 89347, 89355, 89364, 89373, - 89381, 89391, 89399, 89406, 89414, 89421, 89429, 89441, 89454, 89463, - 89473, 89482, 89492, 89501, 89511, 89520, 89530, 89539, 89549, 89559, - 89568, 89577, 89586, 89596, 89604, 89613, 89623, 89633, 89643, 89653, - 89661, 89671, 89679, 89689, 89697, 89707, 89715, 89725, 89733, 89742, - 89749, 89759, 89767, 89777, 89785, 89795, 89803, 89813, 89821, 89830, - 89838, 89847, 89855, 89864, 89873, 89882, 89891, 89901, 89909, 89919, - 89927, 89937, 89945, 89955, 89963, 89973, 89981, 89990, 89997, 90007, - 90015, 90025, 90033, 90043, 90051, 90061, 90069, 90078, 90086, 90095, - 90103, 90112, 90121, 90130, 90139, 90148, 90156, 90165, 90173, 90182, - 90191, 90199, 90209, 90218, 90228, 90238, 90247, 90257, 90266, 90275, - 90283, 90291, 90296, 90301, 90307, 90315, 90323, 90331, 90339, 90347, - 90355, 90361, 90367, 90373, 90381, 90387, 90397, 90403, 90409, 90415, - 90426, 90437, 90448, 90458, 90469, 90480, 90490, 90501, 90511, 90521, - 90530, 90541, 90552, 90563, 90576, 90586, 90596, 90607, 90617, 90627, - 90637, 90647, 90657, 90667, 90677, 90688, 90699, 90710, 90720, 90730, - 90742, 90753, 90764, 90774, 90784, 90794, 90804, 90815, 90825, 90835, - 90847, 90857, 90867, 90879, 90890, 90901, 90911, 90921, 90931, 90941, - 90953, 90965, 90977, 90988, 90999, 91009, 91019, 91029, 91038, 91047, - 91057, 91067, 91078, 0, 0, 91088, 91099, 91110, 91120, 91130, 91142, - 91153, 91164, 91177, 91187, 91199, 91208, 91217, 91228, 91239, 91252, - 91263, 91276, 91286, 91298, 91308, 91320, 91332, 91345, 91355, 91365, - 91375, 91386, 91396, 91405, 91415, 91424, 91433, 91443, 91453, 91463, - 91473, 91483, 91493, 91504, 91514, 91525, 91535, 91546, 91557, 91567, - 91577, 91587, 91597, 91607, 91617, 91628, 91638, 91649, 0, 0, 0, 0, 0, 0, - 0, 91660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91666, 91681, 91696, 91702, 91708, - 91714, 91720, 91726, 91732, 91738, 91744, 91752, 91756, 91759, 91767, - 91775, 91783, 91786, 91789, 91792, 91795, 91798, 91801, 91804, 91807, - 91810, 91813, 91816, 91819, 91822, 91825, 91828, 91831, 91839, 91848, - 91859, 91867, 91875, 91884, 91893, 91905, 91917, 0, 0, 0, 0, 0, 0, 91927, - 91932, 91937, 91944, 91951, 91957, 91963, 91968, 91973, 91978, 91984, - 91990, 91996, 92002, 92008, 92015, 92022, 92032, 92042, 92052, 92061, - 92072, 92081, 92090, 92101, 92112, 92125, 92138, 92150, 92162, 92174, - 92186, 92197, 92208, 92219, 92230, 92242, 92254, 92258, 92263, 92273, - 92283, 92287, 92291, 92295, 92300, 92305, 92310, 92315, 92318, 92322, 0, - 92327, 92330, 92333, 92337, 92341, 92346, 92350, 92354, 92360, 92366, - 92374, 92382, 92385, 92388, 92391, 92394, 92397, 92401, 92405, 0, 92409, - 92414, 92418, 92422, 0, 0, 0, 0, 92427, 92432, 92439, 92444, 92449, 0, - 92454, 92459, 92465, 92470, 92476, 92481, 92487, 92492, 92498, 92503, - 92509, 92515, 92524, 92533, 92542, 92551, 92561, 92571, 92581, 92591, - 92600, 92609, 92618, 92628, 92633, 92638, 92644, 92650, 92656, 92663, - 92671, 92679, 92685, 92691, 92697, 92704, 92710, 92716, 92722, 92729, - 92735, 92741, 92747, 92754, 92759, 92764, 92769, 92775, 92781, 92787, - 92793, 92800, 92806, 92812, 92818, 92824, 92830, 92836, 92842, 92848, - 92854, 92860, 92866, 92873, 92879, 92885, 92891, 92898, 92904, 92910, - 92916, 92923, 92929, 92935, 92941, 92948, 92954, 92960, 92966, 92973, - 92979, 92985, 92991, 92998, 93004, 93010, 93016, 93023, 93029, 93035, - 93041, 93048, 93054, 93060, 93066, 93073, 93079, 93085, 93091, 93098, - 93104, 93110, 93116, 93123, 93129, 93135, 93141, 93148, 93153, 93158, - 93163, 93169, 93175, 93181, 93187, 93194, 93200, 93206, 93212, 93219, - 93225, 93231, 93238, 93245, 93250, 93255, 93260, 93266, 93278, 93290, - 93302, 93314, 93327, 93340, 93348, 0, 0, 93356, 0, 93364, 93369, 93374, - 93378, 93383, 93388, 93392, 93396, 93401, 93406, 93410, 93414, 93418, - 93422, 93428, 93432, 93437, 93441, 93445, 93449, 93453, 93457, 93461, - 93465, 93469, 93473, 93477, 93481, 93486, 93491, 93496, 93501, 93507, - 93513, 93520, 93527, 93534, 93540, 93547, 93554, 93561, 93567, 93574, - 93581, 93587, 93594, 93601, 93607, 93614, 93621, 93627, 93634, 93641, - 93647, 93654, 93661, 93668, 93675, 93682, 93688, 93694, 93700, 93706, - 93711, 93717, 93723, 93730, 93737, 93744, 93750, 93757, 93764, 93771, - 93777, 93784, 93791, 93797, 93804, 93811, 93817, 93824, 93831, 93837, - 93844, 93851, 93857, 93864, 93871, 93878, 93885, 93892, 93899, 93904, - 93911, 93915, 93921, 93927, 93933, 93939, 93945, 93949, 93954, 93959, - 93964, 93969, 93974, 93979, 93984, 93989, 93995, 94001, 94007, 94015, - 94019, 94023, 94027, 94031, 94035, 94039, 94044, 94049, 94054, 94059, - 94063, 94068, 94073, 94078, 94083, 94088, 94093, 94098, 94103, 94107, - 94111, 94116, 94121, 94126, 94131, 94135, 94140, 94145, 94150, 94155, - 94159, 94164, 94169, 94174, 94179, 94183, 94188, 94193, 94197, 94202, - 94207, 94212, 94217, 94222, 94227, 94234, 94241, 94245, 94250, 94255, - 94260, 94265, 94270, 94275, 94280, 94285, 94290, 94295, 94300, 94305, - 94310, 94315, 94320, 94325, 94330, 94335, 94340, 94345, 94350, 94355, - 94360, 94365, 94370, 94375, 94380, 94385, 94390, 0, 0, 0, 94395, 94399, - 94404, 94408, 94413, 94418, 0, 0, 94422, 94427, 94432, 94436, 94441, - 94446, 0, 0, 94451, 94456, 94460, 94465, 94470, 94475, 0, 0, 94480, - 94485, 94490, 0, 0, 0, 94494, 94499, 94504, 94509, 94513, 94518, 94523, - 0, 94528, 94534, 94537, 94541, 94544, 94548, 94552, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 94556, 94562, 94568, 94574, 94580, 0, 0, 94584, 94590, 94596, - 94602, 94608, 94614, 94621, 94628, 94635, 94642, 94649, 94656, 0, 94663, - 94670, 94677, 94683, 94690, 94697, 94704, 94711, 94717, 94724, 94731, - 94738, 94745, 94751, 94758, 94765, 94772, 94779, 94785, 94792, 94799, - 94806, 94813, 94820, 94827, 94834, 0, 94841, 94847, 94854, 94861, 94868, - 94875, 94881, 94888, 94895, 94902, 94909, 94916, 94923, 94930, 94936, - 94943, 94950, 94957, 94964, 0, 94971, 94978, 0, 94985, 94992, 94999, - 95006, 95013, 95020, 95027, 95034, 95041, 95048, 95055, 95062, 95069, - 95076, 95083, 0, 0, 95089, 95094, 95099, 95104, 95109, 95114, 95119, - 95124, 95129, 95134, 95139, 95144, 95149, 95154, 0, 0, 0, 0, 0, 0, 0, 0, + 85901, 85905, 85909, 85913, 85917, 85921, 85925, 85929, 85933, 85937, + 85941, 85945, 85949, 85953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 85957, 85962, 85967, 85972, 85977, 85982, 85990, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 85995, 86003, 86011, 86019, 86027, 0, 0, 0, 0, 0, 86035, + 86042, 86049, 86059, 86065, 86071, 86077, 86083, 86089, 86095, 86102, + 86108, 86114, 86120, 86129, 86138, 86150, 86162, 86168, 86174, 86180, + 86187, 86194, 86201, 86208, 86215, 0, 86222, 86229, 86236, 86244, 86251, + 0, 86258, 0, 86265, 86272, 0, 86279, 86287, 0, 86294, 86301, 86308, + 86315, 86322, 86329, 86336, 86343, 86350, 86357, 86362, 86369, 86376, + 86382, 86388, 86394, 86401, 86407, 86413, 86419, 86426, 86432, 86438, + 86444, 86451, 86457, 86463, 86469, 86476, 86482, 86488, 86494, 86501, + 86507, 86513, 86519, 86526, 86532, 86538, 86544, 86551, 86557, 86563, + 86569, 86576, 86582, 86588, 86594, 86601, 86607, 86613, 86619, 86626, + 86632, 86638, 86644, 86651, 86657, 86663, 86669, 86676, 86682, 86688, + 86694, 86700, 86706, 86712, 86718, 86724, 86730, 86736, 86742, 86748, + 86754, 86760, 86766, 86773, 86779, 86785, 86791, 86798, 86804, 86810, + 86816, 86823, 86829, 86835, 86841, 86848, 86856, 86864, 86870, 86876, + 86882, 86889, 86898, 86907, 86915, 86923, 86931, 86940, 86948, 86956, + 86964, 86973, 86980, 86987, 86998, 87009, 87013, 87017, 87022, 87027, + 87032, 87037, 87046, 87055, 87061, 87067, 87074, 87081, 87088, 87092, + 87098, 87104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87109, + 87115, 87121, 87127, 87134, 87139, 87144, 87150, 87156, 87162, 87168, + 87177, 87183, 87189, 87197, 87205, 87213, 87221, 87227, 87233, 87239, + 87246, 87259, 87273, 87284, 87295, 87307, 87319, 87331, 87343, 87354, + 87365, 87377, 87389, 87401, 87413, 87425, 87437, 87449, 87466, 87483, + 87500, 87507, 87514, 87521, 87529, 87541, 87552, 87563, 87576, 87587, + 87596, 87604, 87613, 87621, 87631, 87639, 87648, 87656, 87665, 87673, + 87683, 87691, 87700, 87708, 87718, 87726, 87734, 87742, 87750, 87757, + 87766, 87774, 87782, 87791, 87799, 87808, 87816, 87824, 87832, 87841, + 87849, 87858, 87866, 87874, 87882, 87890, 87899, 87907, 87916, 87924, + 87933, 87941, 87950, 87958, 87968, 87976, 87984, 87992, 88002, 88010, + 88018, 88027, 88035, 88044, 88053, 88061, 88071, 88079, 88088, 88096, + 88105, 88113, 88123, 88131, 88139, 88146, 88154, 88161, 88170, 88177, + 88186, 88194, 88203, 88211, 88221, 88229, 88238, 88246, 88256, 88264, + 88272, 88279, 88287, 88294, 88303, 88310, 88320, 88330, 88341, 88350, + 88359, 88368, 88377, 88386, 88396, 88408, 88420, 88431, 88443, 88456, + 88467, 88476, 88485, 88493, 88502, 88512, 88520, 88529, 88538, 88546, + 88555, 88565, 88573, 88582, 88591, 88599, 88608, 88618, 88626, 88636, + 88644, 88654, 88662, 88670, 88679, 88687, 88697, 88705, 88713, 88723, + 88731, 88738, 88745, 88754, 88763, 88771, 88780, 88790, 88798, 88809, + 88817, 88825, 88832, 88840, 88849, 88856, 88868, 88879, 88891, 88902, + 88914, 88923, 88931, 88940, 88948, 88957, 88966, 88974, 88983, 88991, + 89000, 89008, 89016, 89024, 89032, 89039, 89048, 89056, 89065, 89073, + 89082, 89090, 89098, 89107, 89115, 89124, 89132, 89141, 89149, 89157, + 89165, 89174, 89182, 89191, 89199, 89208, 89216, 89225, 89233, 89241, + 89249, 89258, 89266, 89275, 89284, 89292, 89301, 89309, 89318, 89326, + 89335, 89343, 89350, 89358, 89365, 89374, 89382, 89391, 89399, 89408, + 89417, 89425, 89435, 89443, 89450, 89458, 89465, 89473, 89485, 89498, + 89507, 89517, 89526, 89536, 89545, 89555, 89564, 89574, 89583, 89593, + 89603, 89612, 89621, 89630, 89640, 89648, 89657, 89667, 89677, 89687, + 89697, 89705, 89715, 89723, 89733, 89741, 89751, 89759, 89769, 89777, + 89786, 89793, 89803, 89811, 89821, 89829, 89839, 89847, 89857, 89865, + 89874, 89882, 89891, 89899, 89908, 89917, 89926, 89935, 89945, 89953, + 89963, 89971, 89981, 89989, 89999, 90007, 90017, 90025, 90034, 90041, + 90051, 90059, 90069, 90077, 90087, 90095, 90105, 90113, 90122, 90130, + 90139, 90147, 90156, 90165, 90174, 90183, 90192, 90200, 90209, 90217, + 90226, 90235, 90243, 90253, 90262, 90272, 90282, 90291, 90301, 90310, + 90319, 90327, 90335, 90340, 90345, 90351, 90359, 90367, 90375, 90383, + 90391, 90399, 90405, 90411, 90417, 90425, 90431, 90441, 90447, 90453, + 90459, 90470, 90481, 90492, 90502, 90513, 90524, 90534, 90545, 90555, + 90565, 90574, 90585, 90596, 90607, 90620, 90630, 90640, 90651, 90661, + 90671, 90681, 90691, 90701, 90711, 90721, 90732, 90743, 90754, 90764, + 90774, 90786, 90797, 90808, 90818, 90828, 90838, 90848, 90859, 90869, + 90879, 90891, 90901, 90911, 90923, 90934, 90945, 90955, 90965, 90975, + 90985, 90997, 91009, 91021, 91032, 91043, 91053, 91063, 91073, 91082, + 91091, 91101, 91111, 91122, 0, 0, 91132, 91143, 91154, 91164, 91174, + 91186, 91197, 91208, 91221, 91231, 91243, 91252, 91261, 91272, 91283, + 91296, 91307, 91320, 91330, 91342, 91352, 91364, 91376, 91389, 91399, + 91409, 91419, 91430, 91440, 91449, 91459, 91468, 91477, 91487, 91497, + 91507, 91517, 91527, 91537, 91548, 91558, 91569, 91579, 91590, 91601, + 91611, 91621, 91631, 91641, 91651, 91661, 91672, 91682, 91693, 0, 0, 0, + 0, 0, 0, 0, 91704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91710, 91725, 91740, 91746, + 91752, 91758, 91764, 91770, 91776, 91782, 91788, 91796, 91800, 91803, + 91811, 91819, 91827, 91830, 91833, 91836, 91839, 91842, 91845, 91848, + 91851, 91854, 91857, 91860, 91863, 91866, 91869, 91872, 91875, 91883, + 91892, 91903, 91911, 91919, 91928, 91937, 91949, 91961, 0, 0, 0, 0, 0, 0, + 91971, 91976, 91981, 91988, 91995, 92001, 92007, 92012, 92017, 92022, + 92028, 92034, 92040, 92046, 92052, 92059, 92066, 92076, 92086, 92096, + 92105, 92116, 92125, 92134, 92145, 92156, 92169, 92182, 92194, 92206, + 92218, 92230, 92241, 92252, 92263, 92274, 92286, 92298, 92302, 92307, + 92317, 92327, 92331, 92335, 92339, 92344, 92349, 92354, 92359, 92362, + 92366, 0, 92371, 92374, 92377, 92381, 92385, 92390, 92394, 92398, 92404, + 92410, 92418, 92426, 92429, 92432, 92435, 92438, 92441, 92445, 92449, 0, + 92453, 92458, 92462, 92466, 0, 0, 0, 0, 92471, 92476, 92483, 92488, + 92493, 0, 92498, 92503, 92509, 92514, 92520, 92525, 92531, 92536, 92542, + 92547, 92553, 92559, 92568, 92577, 92586, 92595, 92605, 92615, 92625, + 92635, 92644, 92653, 92662, 92672, 92677, 92682, 92688, 92694, 92700, + 92707, 92715, 92723, 92729, 92735, 92741, 92748, 92754, 92760, 92766, + 92773, 92779, 92785, 92791, 92798, 92803, 92808, 92813, 92819, 92825, + 92831, 92837, 92844, 92850, 92856, 92862, 92868, 92874, 92880, 92886, + 92892, 92898, 92904, 92910, 92917, 92923, 92929, 92935, 92942, 92948, + 92954, 92960, 92967, 92973, 92979, 92985, 92992, 92998, 93004, 93010, + 93017, 93023, 93029, 93035, 93042, 93048, 93054, 93060, 93067, 93073, + 93079, 93085, 93092, 93098, 93104, 93110, 93117, 93123, 93129, 93135, + 93142, 93148, 93154, 93160, 93167, 93173, 93179, 93185, 93192, 93197, + 93202, 93207, 93213, 93219, 93225, 93231, 93238, 93244, 93250, 93256, + 93263, 93269, 93275, 93282, 93289, 93294, 93299, 93304, 93310, 93322, + 93334, 93346, 93358, 93371, 93384, 93392, 0, 0, 93400, 0, 93408, 93413, + 93418, 93422, 93427, 93432, 93436, 93440, 93445, 93450, 93454, 93458, + 93462, 93466, 93472, 93476, 93481, 93485, 93489, 93493, 93497, 93501, + 93505, 93509, 93513, 93517, 93521, 93525, 93530, 93535, 93540, 93545, + 93551, 93557, 93564, 93571, 93578, 93584, 93591, 93598, 93605, 93611, + 93618, 93625, 93631, 93638, 93645, 93651, 93658, 93665, 93671, 93678, + 93685, 93691, 93698, 93705, 93712, 93719, 93726, 93732, 93738, 93744, + 93750, 93755, 93761, 93767, 93774, 93781, 93788, 93794, 93801, 93808, + 93815, 93821, 93828, 93835, 93841, 93848, 93855, 93861, 93868, 93875, + 93881, 93888, 93895, 93901, 93908, 93915, 93922, 93929, 93936, 93943, + 93948, 93955, 93959, 93965, 93971, 93977, 93983, 93989, 93993, 93998, + 94003, 94008, 94013, 94018, 94023, 94028, 94033, 94039, 94045, 94051, + 94059, 94063, 94067, 94071, 94075, 94079, 94083, 94088, 94093, 94098, + 94103, 94107, 94112, 94117, 94122, 94127, 94132, 94137, 94142, 94147, + 94151, 94155, 94160, 94165, 94170, 94175, 94179, 94184, 94189, 94194, + 94199, 94203, 94208, 94213, 94218, 94223, 94227, 94232, 94237, 94241, + 94246, 94251, 94256, 94261, 94266, 94271, 94278, 94285, 94289, 94294, + 94299, 94304, 94309, 94314, 94319, 94324, 94329, 94334, 94339, 94344, + 94349, 94354, 94359, 94364, 94369, 94374, 94379, 94384, 94389, 94394, + 94399, 94404, 94409, 94414, 94419, 94424, 94429, 94434, 0, 0, 0, 94439, + 94443, 94448, 94452, 94457, 94462, 0, 0, 94466, 94471, 94476, 94480, + 94485, 94490, 0, 0, 94495, 94500, 94504, 94509, 94514, 94519, 0, 0, + 94524, 94529, 94534, 0, 0, 0, 94538, 94543, 94548, 94553, 94557, 94562, + 94567, 0, 94572, 94578, 94581, 94585, 94588, 94592, 94596, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 94600, 94606, 94612, 94618, 94624, 0, 0, 94628, 94634, + 94640, 94646, 94652, 94658, 94665, 94672, 94679, 94686, 94693, 94700, 0, + 94707, 94714, 94721, 94727, 94734, 94741, 94748, 94755, 94761, 94768, + 94775, 94782, 94789, 94795, 94802, 94809, 94816, 94823, 94829, 94836, + 94843, 94850, 94857, 94864, 94871, 94878, 0, 94885, 94891, 94898, 94905, + 94912, 94919, 94925, 94932, 94939, 94946, 94953, 94960, 94967, 94974, + 94980, 94987, 94994, 95001, 95008, 0, 95015, 95022, 0, 95029, 95036, + 95043, 95050, 95057, 95064, 95071, 95078, 95085, 95092, 95099, 95106, + 95113, 95120, 95127, 0, 0, 95133, 95138, 95143, 95148, 95153, 95158, + 95163, 95168, 95173, 95178, 95183, 95188, 95193, 95198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 95159, 95166, 95173, 95180, 95187, 95194, 95201, 95208, 95215, - 95222, 95229, 95236, 95243, 95250, 95257, 95264, 95271, 95278, 95285, - 95292, 95300, 95308, 95315, 95322, 95327, 95335, 95343, 95350, 95357, - 95362, 95369, 95374, 95379, 95386, 95391, 95396, 95401, 95409, 95414, - 95419, 95426, 95431, 95436, 95443, 95450, 95455, 95460, 95465, 95470, - 95475, 95480, 95485, 95490, 95495, 95502, 95507, 95514, 95519, 95524, - 95529, 95534, 95539, 95544, 95549, 95554, 95559, 95564, 95569, 95576, - 95583, 95590, 95597, 95603, 95608, 95615, 95620, 95625, 95634, 95641, - 95650, 95657, 95662, 95667, 95675, 95680, 95685, 95690, 95695, 95700, - 95707, 95712, 95717, 95722, 95727, 95732, 95739, 95746, 95753, 95760, - 95767, 95774, 95781, 95788, 95795, 95802, 95809, 95816, 95823, 95830, - 95837, 95844, 95851, 95858, 95865, 95872, 95879, 95886, 95893, 95900, - 95907, 95914, 95921, 95928, 0, 0, 0, 0, 0, 95935, 95943, 95951, 0, 0, 0, - 0, 95956, 95960, 95964, 95968, 95972, 95976, 95980, 95984, 95988, 95992, - 95997, 96002, 96007, 96012, 96017, 96022, 96027, 96032, 96037, 96043, - 96049, 96055, 96062, 96069, 96076, 96083, 96090, 96097, 96102, 96107, - 96112, 96118, 96124, 96130, 96136, 96142, 96148, 96154, 96160, 96166, - 96172, 96178, 96184, 96190, 96196, 0, 0, 0, 96202, 96210, 96218, 96226, - 96234, 96242, 96252, 96262, 96270, 96278, 96286, 96294, 96302, 96308, - 96315, 96324, 96332, 96340, 96349, 96358, 96367, 96377, 96388, 96398, - 96409, 96418, 96427, 96436, 96446, 96457, 96467, 96478, 96489, 96498, - 96506, 96512, 96518, 96524, 96530, 96538, 96546, 96552, 96559, 96569, - 96576, 96583, 96590, 96597, 96604, 96614, 96621, 96628, 96636, 96644, - 96653, 96662, 96671, 96680, 96689, 96696, 96704, 96713, 96722, 96726, - 96733, 96738, 96743, 96747, 96751, 96755, 96759, 96764, 96769, 96775, - 96781, 96785, 96791, 96795, 96799, 96803, 96807, 96811, 96815, 96821, - 96825, 96830, 96834, 96838, 0, 96841, 96846, 96851, 96856, 96861, 96868, - 96873, 96878, 96883, 96888, 96893, 96898, 96903, 0, 0, 0, 96906, 0, 0, 0, + 0, 0, 0, 0, 95203, 95210, 95217, 95224, 95231, 95238, 95245, 95252, + 95259, 95266, 95273, 95280, 95287, 95294, 95301, 95308, 95315, 95322, + 95329, 95336, 95344, 95352, 95359, 95366, 95371, 95379, 95387, 95394, + 95401, 95406, 95413, 95418, 95423, 95430, 95435, 95440, 95445, 95453, + 95458, 95463, 95470, 95475, 95480, 95487, 95494, 95499, 95504, 95509, + 95514, 95519, 95524, 95529, 95534, 95539, 95546, 95551, 95558, 95563, + 95568, 95573, 95578, 95583, 95588, 95593, 95598, 95603, 95608, 95613, + 95620, 95627, 95634, 95641, 95647, 95652, 95659, 95664, 95669, 95678, + 95685, 95694, 95701, 95706, 95711, 95719, 95724, 95729, 95734, 95739, + 95744, 95751, 95756, 95761, 95766, 95771, 95776, 95783, 95790, 95797, + 95804, 95811, 95818, 95825, 95832, 95839, 95846, 95853, 95860, 95867, + 95874, 95881, 95888, 95895, 95902, 95909, 95916, 95923, 95930, 95937, + 95944, 95951, 95958, 95965, 95972, 0, 0, 0, 0, 0, 95979, 95987, 95995, 0, + 0, 0, 0, 96000, 96004, 96008, 96012, 96016, 96020, 96024, 96028, 96032, + 96036, 96041, 96046, 96051, 96056, 96061, 96066, 96071, 96076, 96081, + 96087, 96093, 96099, 96106, 96113, 96120, 96127, 96134, 96141, 96146, + 96151, 96156, 96162, 96168, 96174, 96180, 96186, 96192, 96198, 96204, + 96210, 96216, 96222, 96228, 96234, 96240, 0, 0, 0, 96246, 96254, 96262, + 96270, 96278, 96286, 96296, 96306, 96314, 96322, 96330, 96338, 96346, + 96352, 96359, 96368, 96376, 96384, 96393, 96402, 96411, 96421, 96432, + 96442, 96453, 96462, 96471, 96480, 96490, 96501, 96511, 96522, 96533, + 96542, 96550, 96556, 96562, 96568, 96574, 96582, 96590, 96596, 96603, + 96613, 96620, 96627, 96634, 96641, 96648, 96658, 96665, 96672, 96680, + 96688, 96697, 96706, 96715, 96724, 96733, 96740, 96748, 96757, 96766, + 96770, 96777, 96782, 96787, 96791, 96795, 96799, 96803, 96808, 96813, + 96819, 96825, 96829, 96835, 96839, 96843, 96847, 96851, 96855, 96859, + 96865, 96869, 96874, 96878, 96882, 0, 96885, 96890, 96895, 96900, 96905, + 96912, 96917, 96922, 96927, 96932, 96937, 96942, 96947, 0, 0, 0, 96950, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96912, 96919, - 96928, 96937, 96944, 96951, 96958, 96965, 96972, 96979, 96985, 96992, - 96999, 97006, 97013, 97020, 97027, 97034, 97041, 97050, 97057, 97064, - 97071, 97078, 97085, 97092, 97099, 97106, 97115, 97122, 97129, 97136, - 97143, 97150, 97157, 97166, 97173, 97180, 97187, 97194, 97203, 97210, - 97217, 97224, 97232, 97241, 0, 0, 97250, 97254, 97258, 97263, 97268, - 97273, 97278, 97282, 97287, 97292, 97297, 97302, 97307, 97312, 97316, - 97321, 97326, 97331, 97336, 97340, 97345, 97350, 97354, 97359, 97364, - 97369, 97374, 97379, 97384, 0, 0, 0, 97389, 97393, 97398, 97403, 97407, - 97412, 97416, 97421, 97426, 97431, 97436, 97441, 97445, 97450, 97455, - 97460, 97465, 97470, 97475, 97479, 97484, 97489, 97494, 97499, 97504, - 97509, 97513, 97517, 97522, 97527, 97532, 97537, 97542, 97547, 97552, - 97557, 97562, 97567, 97572, 97577, 97582, 97587, 97592, 97597, 97602, - 97607, 97612, 97617, 97622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 97627, 97633, 97638, 97643, 97648, 97653, 97658, 97663, 97668, 97673, - 97678, 97684, 97690, 97696, 97702, 97708, 97714, 97720, 97726, 97732, - 97739, 97746, 97753, 97761, 97769, 97777, 97785, 97793, 0, 0, 0, 0, - 97801, 97805, 97810, 97815, 97820, 97824, 97829, 97834, 97839, 97844, - 97848, 97852, 97857, 97862, 97867, 97872, 97876, 97881, 97886, 97891, - 97896, 97901, 97906, 97910, 97915, 97920, 97925, 97930, 97935, 97940, - 97945, 97950, 97955, 97960, 97965, 97971, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 97977, 97982, 97989, 97996, 98001, 98006, 98011, 98016, 98021, 98026, - 98031, 98036, 98041, 98046, 98051, 98056, 98061, 98066, 98071, 98076, - 98081, 98086, 98091, 98096, 98101, 98106, 98111, 98116, 98121, 98126, 0, - 0, 0, 0, 0, 98133, 98139, 98145, 98151, 98157, 98162, 98168, 98174, - 98180, 98186, 98191, 98197, 98203, 98209, 98215, 98221, 98227, 98233, - 98239, 98245, 98250, 98256, 98262, 98268, 98274, 98280, 98285, 98291, - 98297, 98302, 98308, 98314, 98320, 98326, 98332, 98338, 98344, 98349, - 98355, 98362, 98369, 98376, 98383, 0, 0, 0, 0, 0, 98390, 98395, 98400, - 98405, 98410, 98415, 98420, 98425, 98430, 98435, 98440, 98445, 98450, - 98455, 98460, 98465, 98470, 98475, 98480, 98485, 98490, 98495, 98500, - 98505, 98510, 98515, 98520, 98524, 98528, 98532, 0, 98537, 98543, 98548, - 98553, 98558, 98563, 98569, 98575, 98581, 98587, 98593, 98599, 98605, - 98611, 98617, 98623, 98629, 98635, 98641, 98646, 98652, 98658, 98663, - 98669, 98674, 98680, 98686, 98691, 98697, 98703, 98708, 98714, 98719, - 98724, 98730, 98736, 98742, 0, 0, 0, 0, 98747, 98753, 98759, 98765, - 98771, 98777, 98783, 98789, 98795, 98802, 98807, 98812, 98818, 98824, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96956, 96963, 96972, 96981, 96988, 96995, 97002, 97009, 97016, 97023, + 97029, 97036, 97043, 97050, 97057, 97064, 97071, 97078, 97085, 97094, + 97101, 97108, 97115, 97122, 97129, 97136, 97143, 97150, 97159, 97166, + 97173, 97180, 97187, 97194, 97201, 97210, 97217, 97224, 97231, 97238, + 97247, 97254, 97261, 97268, 97276, 97285, 0, 0, 97294, 97298, 97302, + 97307, 97312, 97317, 97322, 97326, 97331, 97336, 97341, 97346, 97351, + 97356, 97360, 97365, 97370, 97375, 97380, 97384, 97389, 97394, 97398, + 97403, 97408, 97413, 97418, 97423, 97428, 0, 0, 0, 97433, 97437, 97442, + 97447, 97451, 97456, 97460, 97465, 97470, 97475, 97480, 97485, 97489, + 97494, 97499, 97504, 97509, 97514, 97519, 97523, 97528, 97533, 97538, + 97543, 97548, 97553, 97557, 97561, 97566, 97571, 97576, 97581, 97586, + 97591, 97596, 97601, 97606, 97611, 97616, 97621, 97626, 97631, 97636, + 97641, 97646, 97651, 97656, 97661, 97666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 97671, 97677, 97682, 97687, 97692, 97697, 97702, 97707, + 97712, 97717, 97722, 97728, 97734, 97740, 97746, 97752, 97758, 97764, + 97770, 97776, 97783, 97790, 97797, 97805, 97813, 97821, 97829, 97837, 0, + 0, 0, 0, 97845, 97849, 97854, 97859, 97864, 97868, 97873, 97878, 97883, + 97888, 97892, 97896, 97901, 97906, 97911, 97916, 97920, 97925, 97930, + 97935, 97940, 97945, 97950, 97954, 97959, 97964, 97969, 97974, 97979, + 97984, 97989, 97994, 97999, 98004, 98009, 98015, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 98021, 98026, 98033, 98040, 98045, 98050, 98055, 98060, 98065, 98070, + 98075, 98080, 98085, 98090, 98095, 98100, 98105, 98110, 98115, 98120, + 98125, 98130, 98135, 98140, 98145, 98150, 98155, 98160, 98165, 98170, 0, + 0, 0, 0, 0, 98177, 98183, 98189, 98195, 98201, 98206, 98212, 98218, + 98224, 98230, 98235, 98241, 98247, 98253, 98259, 98265, 98271, 98277, + 98283, 98289, 98294, 98300, 98306, 98312, 98318, 98324, 98329, 98335, + 98341, 98346, 98352, 98358, 98364, 98370, 98376, 98382, 98388, 98393, + 98399, 98406, 98413, 98420, 98427, 0, 0, 0, 0, 0, 98434, 98439, 98444, + 98449, 98454, 98459, 98464, 98469, 98474, 98479, 98484, 98489, 98494, + 98499, 98504, 98509, 98514, 98519, 98524, 98529, 98534, 98539, 98544, + 98549, 98554, 98559, 98564, 98568, 98572, 98576, 0, 98581, 98587, 98592, + 98597, 98602, 98607, 98613, 98619, 98625, 98631, 98637, 98643, 98649, + 98655, 98661, 98667, 98673, 98679, 98685, 98690, 98696, 98702, 98707, + 98713, 98718, 98724, 98730, 98735, 98741, 98747, 98752, 98758, 98763, + 98768, 98774, 98780, 98786, 0, 0, 0, 0, 98791, 98797, 98803, 98809, + 98815, 98821, 98827, 98833, 98839, 98846, 98851, 98856, 98862, 98868, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98830, 98836, 98842, - 98848, 98855, 98861, 98868, 98875, 98882, 98889, 98897, 98904, 98912, - 98918, 98924, 98930, 98936, 98942, 98948, 98954, 98960, 98966, 98972, - 98978, 98984, 98990, 98996, 99002, 99008, 99014, 99020, 99026, 99032, - 99038, 99044, 99050, 99056, 99062, 99068, 99074, 99080, 99086, 99092, - 99098, 99105, 99111, 99118, 99125, 99132, 99139, 99147, 99154, 99162, - 99168, 99174, 99180, 99186, 99192, 99198, 99204, 99210, 99216, 99222, - 99228, 99234, 99240, 99246, 99252, 99258, 99264, 99270, 99276, 99282, - 99288, 99294, 99300, 99306, 99312, 99318, 99324, 99330, 99335, 99340, - 99345, 99350, 99355, 99360, 99365, 99370, 99375, 99380, 99385, 99390, - 99395, 99400, 99405, 99410, 99415, 99420, 99425, 99430, 99435, 99440, - 99445, 99450, 99455, 99460, 99465, 99470, 99475, 99480, 99485, 99490, - 99495, 99500, 99505, 99510, 99515, 99520, 99525, 99530, 99535, 99540, - 99545, 99550, 99555, 99560, 99565, 99570, 99575, 99580, 99585, 99590, - 99595, 99600, 99605, 99609, 99613, 99618, 99623, 99628, 99633, 99638, - 99643, 99648, 99653, 99658, 99663, 99668, 99672, 99676, 99680, 99684, - 99688, 99692, 99696, 99701, 99706, 0, 0, 99711, 99716, 99720, 99724, - 99728, 99732, 99736, 99740, 99744, 99748, 0, 0, 0, 0, 0, 0, 99752, 99757, - 99763, 99769, 99775, 99781, 99787, 99793, 99798, 99804, 99809, 99815, - 99820, 99825, 99831, 99837, 99842, 99847, 99852, 99857, 99863, 99868, - 99874, 99879, 99885, 99891, 99897, 99903, 99909, 99915, 99921, 99926, - 99932, 99938, 99944, 99950, 0, 0, 0, 0, 99956, 99961, 99967, 99973, - 99979, 99985, 99991, 99997, 100002, 100008, 100013, 100019, 100024, - 100029, 100035, 100041, 100046, 100051, 100056, 100061, 100067, 100072, - 100078, 100083, 100089, 100095, 100101, 100107, 100113, 100119, 100125, - 100130, 100136, 100142, 100148, 100154, 0, 0, 0, 0, 100160, 100164, - 100169, 100174, 100179, 100184, 100189, 100194, 100199, 100203, 100208, - 100213, 100218, 100223, 100227, 100232, 100237, 100242, 100247, 100252, - 100257, 100261, 100266, 100270, 100275, 100280, 100285, 100290, 100295, - 100300, 100305, 100310, 100314, 100319, 100324, 100329, 100334, 100339, - 100344, 100349, 0, 0, 0, 0, 0, 0, 0, 0, 100354, 100361, 100368, 100375, - 100382, 100389, 100396, 100403, 100410, 100417, 100424, 100431, 100438, - 100445, 100452, 100459, 100466, 100473, 100480, 100487, 100494, 100501, - 100508, 100515, 100522, 100529, 100536, 100543, 100550, 100557, 100564, - 100571, 100578, 100585, 100592, 100599, 100606, 100613, 100620, 100627, - 100634, 100641, 100648, 100655, 100662, 100669, 100676, 100683, 100690, - 100697, 100704, 100711, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100718, 100725, - 100730, 100736, 100742, 100748, 100754, 100760, 100766, 100772, 100777, - 100783, 0, 100789, 100794, 100800, 100805, 100811, 100817, 100822, - 100827, 100833, 100839, 100845, 100851, 100856, 100862, 100868, 0, - 100874, 100880, 100886, 100892, 100898, 100903, 100909, 0, 100915, - 100921, 0, 100927, 100932, 100938, 100944, 100950, 100956, 100962, - 100968, 100974, 100979, 100985, 0, 100991, 100996, 101002, 101007, - 101013, 101019, 101024, 101029, 101035, 101041, 101047, 101053, 101058, - 101064, 101070, 0, 101076, 101082, 101088, 101094, 101100, 101105, - 101111, 0, 101117, 101123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98874, 98880, 98886, + 98892, 98899, 98905, 98912, 98919, 98926, 98933, 98941, 98948, 98956, + 98962, 98968, 98974, 98980, 98986, 98992, 98998, 99004, 99010, 99016, + 99022, 99028, 99034, 99040, 99046, 99052, 99058, 99064, 99070, 99076, + 99082, 99088, 99094, 99100, 99106, 99112, 99118, 99124, 99130, 99136, + 99142, 99149, 99155, 99162, 99169, 99176, 99183, 99191, 99198, 99206, + 99212, 99218, 99224, 99230, 99236, 99242, 99248, 99254, 99260, 99266, + 99272, 99278, 99284, 99290, 99296, 99302, 99308, 99314, 99320, 99326, + 99332, 99338, 99344, 99350, 99356, 99362, 99368, 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, 99653, 99657, 99662, 99667, 99672, 99677, 99682, + 99687, 99692, 99697, 99702, 99707, 99712, 99716, 99720, 99724, 99728, + 99732, 99736, 99740, 99745, 99750, 0, 0, 99755, 99760, 99764, 99768, + 99772, 99776, 99780, 99784, 99788, 99792, 0, 0, 0, 0, 0, 0, 99796, 99801, + 99807, 99813, 99819, 99825, 99831, 99837, 99842, 99848, 99853, 99859, + 99864, 99869, 99875, 99881, 99886, 99891, 99896, 99901, 99907, 99912, + 99918, 99923, 99929, 99935, 99941, 99947, 99953, 99959, 99965, 99970, + 99976, 99982, 99988, 99994, 0, 0, 0, 0, 100000, 100005, 100011, 100017, + 100023, 100029, 100035, 100041, 100046, 100052, 100057, 100063, 100068, + 100073, 100079, 100085, 100090, 100095, 100100, 100105, 100111, 100116, + 100122, 100127, 100133, 100139, 100145, 100151, 100157, 100163, 100169, + 100174, 100180, 100186, 100192, 100198, 0, 0, 0, 0, 100204, 100208, + 100213, 100218, 100223, 100228, 100233, 100238, 100243, 100247, 100252, + 100257, 100262, 100267, 100271, 100276, 100281, 100286, 100291, 100296, + 100301, 100305, 100310, 100314, 100319, 100324, 100329, 100334, 100339, + 100344, 100349, 100354, 100358, 100363, 100368, 100373, 100378, 100383, + 100388, 100393, 0, 0, 0, 0, 0, 0, 0, 0, 100398, 100405, 100412, 100419, + 100426, 100433, 100440, 100447, 100454, 100461, 100468, 100475, 100482, + 100489, 100496, 100503, 100510, 100517, 100524, 100531, 100538, 100545, + 100552, 100559, 100566, 100573, 100580, 100587, 100594, 100601, 100608, + 100615, 100622, 100629, 100636, 100643, 100650, 100657, 100664, 100671, + 100678, 100685, 100692, 100699, 100706, 100713, 100720, 100727, 100734, + 100741, 100748, 100755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100762, 100769, + 100774, 100780, 100786, 100792, 100798, 100804, 100810, 100816, 100821, + 100827, 0, 100833, 100838, 100844, 100849, 100855, 100861, 100866, + 100871, 100877, 100883, 100889, 100895, 100900, 100906, 100912, 0, + 100918, 100924, 100930, 100936, 100942, 100947, 100953, 0, 100959, + 100965, 0, 100971, 100976, 100982, 100988, 100994, 101000, 101006, + 101012, 101018, 101023, 101029, 0, 101035, 101040, 101046, 101051, + 101057, 101063, 101068, 101073, 101079, 101085, 101091, 101097, 101102, + 101108, 101114, 0, 101120, 101126, 101132, 101138, 101144, 101149, + 101155, 0, 101161, 101167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 101129, 101134, 101139, 101144, 101149, 101154, 101159, - 101164, 101169, 101174, 101179, 101184, 101189, 101194, 101199, 101204, - 101209, 101214, 101219, 101224, 101229, 101234, 101239, 101244, 101249, - 101254, 101259, 101264, 101269, 101274, 101279, 101284, 101289, 101294, - 101299, 101304, 101309, 101314, 101319, 101324, 101329, 101334, 101339, - 101344, 101349, 101354, 101359, 101364, 101369, 101374, 101379, 101384, - 101389, 101394, 101399, 101404, 101409, 101414, 101419, 101424, 101429, - 101434, 101439, 101444, 101449, 101454, 101459, 101464, 101469, 101474, - 101479, 101484, 101489, 101494, 101499, 101504, 101509, 101514, 101519, - 101524, 101529, 101534, 101539, 101544, 101549, 101554, 101559, 101564, - 101569, 101574, 101579, 101584, 101589, 101594, 101599, 101604, 101609, - 101614, 101619, 101624, 101629, 101634, 101639, 101644, 101649, 101654, - 101659, 101664, 101669, 101674, 101679, 101684, 101689, 101694, 101699, - 101704, 101709, 101714, 101719, 101724, 101729, 101734, 101739, 101744, - 101749, 101754, 101759, 101764, 101769, 101774, 101779, 101784, 101789, - 101794, 101799, 101804, 101809, 101814, 101819, 101824, 101829, 101834, - 101839, 101844, 101849, 101854, 101859, 101864, 101869, 101874, 101879, - 101884, 101889, 101894, 101899, 101904, 101909, 101914, 101919, 101924, - 101929, 101934, 101939, 101944, 101949, 101954, 101959, 101964, 101969, - 101974, 101979, 101984, 101989, 101994, 101999, 102004, 102009, 102014, - 102019, 102024, 102029, 102034, 102039, 102044, 102049, 102054, 102059, - 102064, 102069, 102074, 102079, 102084, 102089, 102094, 102099, 102104, - 102109, 102114, 102119, 102124, 102129, 102134, 102139, 102144, 102149, - 102154, 102159, 102164, 102169, 102174, 102179, 102184, 102189, 102194, - 102199, 102204, 102209, 102214, 102219, 102224, 102229, 102234, 102239, - 102244, 102249, 102254, 102259, 102264, 102269, 102274, 102279, 102284, - 102289, 102294, 102299, 102304, 102309, 102314, 102319, 102324, 102329, - 102334, 102339, 102344, 102349, 102354, 102359, 102364, 102369, 102374, - 102379, 102384, 102389, 102394, 102399, 102404, 102409, 102414, 102419, - 102424, 102429, 102434, 102439, 102444, 102449, 102454, 102459, 102464, - 102469, 102474, 102479, 102484, 102489, 102494, 102499, 102504, 102509, - 102514, 102519, 102524, 102529, 102534, 102539, 102544, 102549, 102554, - 102559, 102564, 102569, 102574, 102579, 102584, 102589, 102594, 102599, - 102604, 102609, 102614, 102619, 102624, 102629, 102634, 102639, 102644, - 102649, 102654, 102659, 102664, 102669, 102674, 102679, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 102684, 102690, 102697, 102704, 102710, 102717, 102724, 102731, - 102738, 102744, 102751, 102758, 102765, 102772, 102779, 102786, 102793, - 102800, 102807, 102814, 102821, 102828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 102835, 102840, 102845, 102850, 102855, 102860, 102865, 102870, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102875, - 102881, 102889, 102898, 102903, 102909, 0, 102915, 102922, 102933, - 102943, 102950, 102958, 102965, 102976, 102982, 102992, 102999, 103006, - 103012, 103019, 103027, 103034, 103040, 103047, 103059, 103066, 103073, - 103081, 103090, 103103, 103108, 103117, 103123, 103132, 103138, 103144, - 103151, 103156, 103166, 103180, 103188, 103196, 103201, 103211, 103218, - 103229, 103236, 103245, 0, 103253, 103259, 103267, 103277, 103283, - 103289, 103295, 103301, 103311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 101173, 101178, 101183, 101188, 101193, 101198, 101203, + 101208, 101213, 101218, 101223, 101228, 101233, 101238, 101243, 101248, + 101253, 101258, 101263, 101268, 101273, 101278, 101283, 101288, 101293, + 101298, 101303, 101308, 101313, 101318, 101323, 101328, 101333, 101338, + 101343, 101348, 101353, 101358, 101363, 101368, 101373, 101378, 101383, + 101388, 101393, 101398, 101403, 101408, 101413, 101418, 101423, 101428, + 101433, 101438, 101443, 101448, 101453, 101458, 101463, 101468, 101473, + 101478, 101483, 101488, 101493, 101498, 101503, 101508, 101513, 101518, + 101523, 101528, 101533, 101538, 101543, 101548, 101553, 101558, 101563, + 101568, 101573, 101578, 101583, 101588, 101593, 101598, 101603, 101608, + 101613, 101618, 101623, 101628, 101633, 101638, 101643, 101648, 101653, + 101658, 101663, 101668, 101673, 101678, 101683, 101688, 101693, 101698, + 101703, 101708, 101713, 101718, 101723, 101728, 101733, 101738, 101743, + 101748, 101753, 101758, 101763, 101768, 101773, 101778, 101783, 101788, + 101793, 101798, 101803, 101808, 101813, 101818, 101823, 101828, 101833, + 101838, 101843, 101848, 101853, 101858, 101863, 101868, 101873, 101878, + 101883, 101888, 101893, 101898, 101903, 101908, 101913, 101918, 101923, + 101928, 101933, 101938, 101943, 101948, 101953, 101958, 101963, 101968, + 101973, 101978, 101983, 101988, 101993, 101998, 102003, 102008, 102013, + 102018, 102023, 102028, 102033, 102038, 102043, 102048, 102053, 102058, + 102063, 102068, 102073, 102078, 102083, 102088, 102093, 102098, 102103, + 102108, 102113, 102118, 102123, 102128, 102133, 102138, 102143, 102148, + 102153, 102158, 102163, 102168, 102173, 102178, 102183, 102188, 102193, + 102198, 102203, 102208, 102213, 102218, 102223, 102228, 102233, 102238, + 102243, 102248, 102253, 102258, 102263, 102268, 102273, 102278, 102283, + 102288, 102293, 102298, 102303, 102308, 102313, 102318, 102323, 102328, + 102333, 102338, 102343, 102348, 102353, 102358, 102363, 102368, 102373, + 102378, 102383, 102388, 102393, 102398, 102403, 102408, 102413, 102418, + 102423, 102428, 102433, 102438, 102443, 102448, 102453, 102458, 102463, + 102468, 102473, 102478, 102483, 102488, 102493, 102498, 102503, 102508, + 102513, 102518, 102523, 102528, 102533, 102538, 102543, 102548, 102553, + 102558, 102563, 102568, 102573, 102578, 102583, 102588, 102593, 102598, + 102603, 102608, 102613, 102618, 102623, 102628, 102633, 102638, 102643, + 102648, 102653, 102658, 102663, 102668, 102673, 102678, 102683, 102688, + 102693, 102698, 102703, 102708, 102713, 102718, 102723, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 102728, 102734, 102741, 102748, 102754, 102761, 102768, 102775, + 102782, 102788, 102795, 102802, 102809, 102816, 102823, 102830, 102837, + 102844, 102851, 102858, 102865, 102872, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 102879, 102884, 102889, 102894, 102899, 102904, 102909, 102914, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102919, + 102925, 102933, 102942, 102947, 102953, 0, 102959, 102966, 102977, + 102987, 102994, 103002, 103009, 103020, 103026, 103036, 103043, 103050, + 103056, 103063, 103071, 103078, 103084, 103091, 103103, 103110, 103117, + 103125, 103134, 103147, 103152, 103161, 103167, 103176, 103182, 103188, + 103195, 103200, 103210, 103224, 103232, 103240, 103245, 103255, 103262, + 103273, 103280, 103289, 0, 103297, 103303, 103311, 103321, 103327, + 103333, 103339, 103345, 103355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 103319, 103323, 103327, 103331, 103335, 103339, 0, - 0, 103344, 0, 103349, 103353, 103358, 103363, 103368, 103373, 103377, - 103382, 103387, 103392, 103397, 103401, 103406, 103411, 103416, 103421, - 103425, 103430, 103435, 103440, 103445, 103449, 103454, 103459, 103464, - 103469, 103473, 103478, 103483, 103488, 103493, 103497, 103502, 103507, - 103512, 103517, 103522, 103527, 103532, 103536, 103541, 103546, 103551, - 103556, 0, 103561, 103566, 0, 0, 0, 103571, 0, 0, 103576, 103581, 103588, - 103595, 103602, 103609, 103616, 103623, 103630, 103637, 103644, 103651, - 103658, 103665, 103672, 103679, 103686, 103693, 103700, 103707, 103714, - 103721, 103728, 0, 103735, 103742, 103748, 103754, 103760, 103767, - 103774, 103782, 103789, 103797, 103802, 103807, 103812, 103817, 103822, - 103827, 103832, 103837, 103842, 103847, 103852, 103857, 103862, 103868, - 103873, 103878, 103883, 103888, 103893, 103898, 103903, 103908, 103913, - 103919, 103925, 103929, 103933, 103937, 103941, 103945, 103950, 103955, - 103961, 103966, 103972, 103977, 103982, 103987, 103993, 103998, 104003, - 104008, 104013, 104018, 104024, 104029, 104035, 104040, 104046, 104051, - 104057, 104062, 104068, 104073, 104078, 104083, 104088, 104093, 104098, - 104103, 104109, 104114, 0, 0, 0, 0, 0, 0, 0, 0, 104119, 104123, 104127, - 104131, 104135, 104141, 104145, 104150, 104155, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 103363, 103367, 103371, 103375, 103379, 103383, 0, + 0, 103388, 0, 103393, 103397, 103402, 103407, 103412, 103417, 103421, + 103426, 103431, 103436, 103441, 103445, 103450, 103455, 103460, 103465, + 103469, 103474, 103479, 103484, 103489, 103493, 103498, 103503, 103508, + 103513, 103517, 103522, 103527, 103532, 103537, 103541, 103546, 103551, + 103556, 103561, 103566, 103571, 103576, 103580, 103585, 103590, 103595, + 103600, 0, 103605, 103610, 0, 0, 0, 103615, 0, 0, 103620, 103625, 103632, + 103639, 103646, 103653, 103660, 103667, 103674, 103681, 103688, 103695, + 103702, 103709, 103716, 103723, 103730, 103737, 103744, 103751, 103758, + 103765, 103772, 0, 103779, 103786, 103792, 103798, 103804, 103811, + 103818, 103826, 103833, 103841, 103846, 103851, 103856, 103861, 103866, + 103871, 103876, 103881, 103886, 103891, 103896, 103901, 103906, 103912, + 103917, 103922, 103927, 103932, 103937, 103942, 103947, 103952, 103957, + 103963, 103969, 103973, 103977, 103981, 103985, 103989, 103994, 103999, + 104005, 104010, 104016, 104021, 104026, 104031, 104037, 104042, 104047, + 104052, 104057, 104062, 104068, 104073, 104079, 104084, 104090, 104095, + 104101, 104106, 104112, 104117, 104122, 104127, 104132, 104137, 104142, + 104147, 104153, 104158, 0, 0, 0, 0, 0, 0, 0, 0, 104163, 104167, 104171, + 104175, 104179, 104185, 104189, 104194, 104199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104161, 104166, 104171, - 104176, 104181, 104186, 104191, 104196, 104201, 104206, 104211, 104216, - 104221, 104226, 104231, 104236, 104241, 104246, 104251, 0, 104256, - 104261, 0, 0, 0, 0, 0, 104266, 104270, 104274, 104279, 104284, 104290, - 104295, 104300, 104305, 104310, 104315, 104320, 104325, 104330, 104335, - 104340, 104345, 104350, 104355, 104360, 104365, 104370, 104375, 104380, - 104385, 104390, 104395, 104400, 104404, 104409, 104414, 104420, 104424, - 0, 0, 0, 104428, 104434, 104438, 104443, 104448, 104453, 104457, 104462, - 104466, 104471, 104476, 104480, 104485, 104490, 104494, 104498, 104503, - 104508, 104512, 104517, 104522, 104527, 104532, 104537, 104542, 104547, - 104552, 0, 0, 0, 0, 0, 104557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104205, 104210, 104215, + 104220, 104225, 104230, 104235, 104240, 104245, 104250, 104255, 104260, + 104265, 104270, 104275, 104280, 104285, 104290, 104295, 0, 104300, + 104305, 0, 0, 0, 0, 0, 104310, 104314, 104318, 104323, 104328, 104334, + 104339, 104344, 104349, 104354, 104359, 104364, 104369, 104374, 104379, + 104384, 104389, 104394, 104399, 104404, 104409, 104414, 104419, 104424, + 104429, 104434, 104439, 104444, 104448, 104453, 104458, 104464, 104468, + 0, 0, 0, 104472, 104478, 104482, 104487, 104492, 104497, 104501, 104506, + 104510, 104515, 104520, 104524, 104529, 104534, 104538, 104542, 104547, + 104552, 104556, 104561, 104566, 104571, 104576, 104581, 104586, 104591, + 104596, 0, 0, 0, 0, 0, 104601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 104562, 104567, 104572, 104577, 104582, 104587, 104593, 104599, - 104605, 104610, 104615, 104620, 104626, 104632, 104638, 104643, 104649, - 104654, 104660, 104666, 104671, 104677, 104683, 104688, 104694, 104700, - 104706, 104712, 104718, 104723, 104729, 104735, 104741, 104746, 104751, - 104756, 104761, 104766, 104772, 104778, 104783, 104788, 104793, 104799, - 104804, 104809, 104815, 104821, 104826, 104833, 104839, 104844, 104850, - 104856, 104862, 104867, 0, 0, 0, 0, 104873, 104882, 104890, 104897, - 104904, 104909, 104914, 104919, 104924, 104929, 104934, 104939, 104944, - 104949, 104955, 104961, 104967, 104973, 104979, 104985, 0, 0, 104991, - 104998, 105005, 105012, 105020, 105028, 105036, 105044, 105052, 105060, - 105066, 105072, 105078, 105085, 105092, 105099, 105106, 105113, 105120, - 105127, 105134, 105141, 105148, 105155, 105162, 105169, 105176, 105183, - 105191, 105199, 105207, 105216, 105225, 105234, 105243, 105252, 105261, - 105269, 105277, 105285, 105294, 105303, 105312, 105321, 105330, 105339, - 105348, 105352, 105357, 105362, 0, 105368, 105373, 0, 0, 0, 0, 0, 105378, - 105384, 105391, 105396, 105401, 105405, 105410, 105415, 0, 105420, - 105425, 105430, 0, 105435, 105440, 105445, 105450, 105455, 105460, - 105465, 105470, 105475, 105480, 105485, 105489, 105493, 105498, 105503, - 105508, 105512, 105516, 105520, 105524, 105529, 105534, 105539, 105543, - 105548, 105552, 105557, 105562, 105567, 0, 0, 105572, 105578, 105583, 0, - 0, 0, 0, 105588, 105592, 105596, 105600, 105604, 105608, 105613, 105618, - 105624, 105629, 0, 0, 0, 0, 0, 0, 0, 105636, 105642, 105649, 105655, - 105662, 105668, 105674, 105680, 105687, 0, 0, 0, 0, 0, 0, 0, 105693, - 105701, 105709, 105717, 105725, 105733, 105741, 105749, 105757, 105765, - 105773, 105781, 105789, 105797, 105805, 105813, 105821, 105829, 105837, - 105845, 105853, 105861, 105869, 105877, 105885, 105893, 105901, 105909, - 105917, 105925, 105932, 105940, 105948, 105955, 105962, 105969, 105976, - 105983, 105990, 105997, 106004, 106011, 106018, 106025, 106032, 106039, - 106046, 106053, 106060, 106067, 106074, 106081, 106088, 106095, 106102, - 106109, 106116, 106123, 106130, 106137, 106144, 106151, 106157, 106164, + 0, 0, 104606, 104611, 104616, 104621, 104626, 104631, 104637, 104643, + 104649, 104654, 104659, 104664, 104670, 104676, 104682, 104687, 104693, + 104698, 104704, 104710, 104715, 104721, 104727, 104732, 104738, 104744, + 104750, 104756, 104762, 104767, 104773, 104779, 104785, 104790, 104795, + 104800, 104805, 104810, 104816, 104822, 104827, 104832, 104837, 104843, + 104848, 104853, 104859, 104865, 104870, 104877, 104883, 104888, 104894, + 104900, 104906, 104911, 0, 0, 0, 0, 104917, 104926, 104934, 104941, + 104948, 104953, 104958, 104963, 104968, 104973, 104978, 104983, 104988, + 104993, 104999, 105005, 105011, 105017, 105023, 105029, 0, 0, 105035, + 105042, 105049, 105056, 105064, 105072, 105080, 105088, 105096, 105104, + 105110, 105116, 105122, 105129, 105136, 105143, 105150, 105157, 105164, + 105171, 105178, 105185, 105192, 105199, 105206, 105213, 105220, 105227, + 105235, 105243, 105251, 105260, 105269, 105278, 105287, 105296, 105305, + 105313, 105321, 105329, 105338, 105347, 105356, 105365, 105374, 105383, + 105392, 105396, 105401, 105406, 0, 105412, 105417, 0, 0, 0, 0, 0, 105422, + 105428, 105435, 105440, 105445, 105449, 105454, 105459, 0, 105464, + 105469, 105474, 0, 105479, 105484, 105489, 105494, 105499, 105504, + 105509, 105514, 105519, 105524, 105529, 105533, 105537, 105542, 105547, + 105552, 105556, 105560, 105564, 105568, 105573, 105578, 105583, 105587, + 105592, 105596, 105601, 105606, 105611, 0, 0, 105616, 105622, 105627, 0, + 0, 0, 0, 105632, 105636, 105640, 105644, 105648, 105652, 105657, 105662, + 105668, 105673, 0, 0, 0, 0, 0, 0, 0, 105680, 105686, 105693, 105699, + 105706, 105712, 105718, 105724, 105731, 0, 0, 0, 0, 0, 0, 0, 105737, + 105745, 105753, 105761, 105769, 105777, 105785, 105793, 105801, 105809, + 105817, 105825, 105833, 105841, 105849, 105857, 105865, 105873, 105881, + 105889, 105897, 105905, 105913, 105921, 105929, 105937, 105945, 105953, + 105961, 105969, 105976, 105984, 105992, 105999, 106006, 106013, 106020, + 106027, 106034, 106041, 106048, 106055, 106062, 106069, 106076, 106083, + 106090, 106097, 106104, 106111, 106118, 106125, 106132, 106139, 106146, + 106153, 106160, 106167, 106174, 106181, 106188, 106195, 106201, 106208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 106171, 106176, 106181, 106186, 106191, 106196, - 106201, 106206, 106211, 106216, 106221, 106226, 106231, 106236, 106241, - 106246, 106251, 106256, 106261, 106266, 106271, 106276, 106281, 106286, - 106291, 106296, 106301, 106306, 106311, 106316, 106321, 106326, 106331, - 106336, 106341, 106346, 106351, 106356, 106362, 0, 0, 0, 0, 106368, - 106372, 106376, 106381, 106386, 106392, 106398, 106404, 106414, 106423, - 106429, 106436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106444, 106448, 106453, - 106458, 106463, 106468, 106473, 106478, 106483, 106487, 106492, 106496, - 106501, 106505, 106510, 106514, 106519, 106524, 106529, 106534, 106539, - 106544, 106549, 106554, 106559, 106564, 106569, 106574, 106579, 106584, - 106589, 106594, 106599, 106604, 106609, 106614, 106619, 106624, 106629, - 106634, 106639, 106644, 106649, 106654, 106659, 106664, 106669, 106674, - 106679, 106684, 106689, 106694, 106699, 106704, 0, 0, 0, 106709, 106714, - 106723, 106731, 106740, 106749, 106760, 106771, 106778, 106785, 106792, - 106799, 106806, 106813, 106820, 106827, 106834, 106841, 106848, 106855, - 106862, 106869, 106876, 106883, 106890, 106897, 106904, 106911, 106918, - 0, 0, 106925, 106931, 106937, 106943, 106949, 106956, 106963, 106971, - 106978, 106985, 106992, 106999, 107006, 107013, 107020, 107027, 107034, - 107041, 107048, 107055, 107062, 107069, 107076, 107083, 107090, 107097, - 107104, 0, 0, 0, 0, 0, 107111, 107117, 107123, 107129, 107135, 107142, - 107149, 107157, 107164, 107171, 107178, 107185, 107192, 107199, 107206, - 107213, 107220, 107227, 107234, 107241, 107248, 107255, 107262, 107269, - 107276, 107283, 0, 0, 0, 0, 0, 0, 0, 107290, 107297, 107305, 107315, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107325, 107331, 107337, 107343, 107349, - 107356, 107363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 106215, 106220, 106225, 106230, 106235, 106240, + 106245, 106250, 106255, 106260, 106265, 106270, 106275, 106280, 106285, + 106290, 106295, 106300, 106305, 106310, 106315, 106320, 106325, 106330, + 106335, 106340, 106345, 106350, 106355, 106360, 106365, 106370, 106375, + 106380, 106385, 106390, 106395, 106400, 106406, 0, 0, 0, 0, 106412, + 106416, 106420, 106425, 106430, 106436, 106442, 106448, 106458, 106467, + 106473, 106480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106488, 106492, 106497, + 106502, 106507, 106512, 106517, 106522, 106527, 106531, 106536, 106540, + 106545, 106549, 106554, 106558, 106563, 106568, 106573, 106578, 106583, + 106588, 106593, 106598, 106603, 106608, 106613, 106618, 106623, 106628, + 106633, 106638, 106643, 106648, 106653, 106658, 106663, 106668, 106673, + 106678, 106683, 106688, 106693, 106698, 106703, 106708, 106713, 106718, + 106723, 106728, 106733, 106738, 106743, 106748, 0, 0, 0, 106753, 106758, + 106767, 106775, 106784, 106793, 106804, 106815, 106822, 106829, 106836, + 106843, 106850, 106857, 106864, 106871, 106878, 106885, 106892, 106899, + 106906, 106913, 106920, 106927, 106934, 106941, 106948, 106955, 106962, + 0, 0, 106969, 106975, 106981, 106987, 106993, 107000, 107007, 107015, + 107022, 107029, 107036, 107043, 107050, 107057, 107064, 107071, 107078, + 107085, 107092, 107099, 107106, 107113, 107120, 107127, 107134, 107141, + 107148, 0, 0, 0, 0, 0, 107155, 107161, 107167, 107173, 107179, 107186, + 107193, 107201, 107208, 107215, 107222, 107229, 107236, 107243, 107250, + 107257, 107264, 107271, 107278, 107285, 107292, 107299, 107306, 107313, + 107320, 107327, 0, 0, 0, 0, 0, 0, 0, 107334, 107341, 107349, 107359, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107369, 107375, 107381, 107387, 107393, + 107400, 107407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107371, 107378, 107385, 107393, - 107400, 107407, 107414, 107421, 107429, 107437, 107445, 107453, 107461, - 107469, 107477, 107485, 107493, 107501, 107509, 107517, 107525, 107533, - 107541, 107549, 107557, 107565, 107573, 107581, 107589, 107597, 107605, - 107613, 107621, 107629, 107637, 107645, 107653, 107661, 107669, 107677, - 107685, 107693, 107701, 107709, 107717, 107725, 107733, 107741, 107749, - 107757, 107765, 107773, 107781, 107789, 107797, 107805, 107813, 107821, - 107829, 107837, 107845, 107853, 107861, 107869, 107877, 107885, 107893, - 107901, 107909, 107917, 107925, 107933, 107941, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107415, 107422, 107429, 107437, + 107444, 107451, 107458, 107465, 107473, 107481, 107489, 107497, 107505, + 107513, 107521, 107529, 107537, 107545, 107553, 107561, 107569, 107577, + 107585, 107593, 107601, 107609, 107617, 107625, 107633, 107641, 107649, + 107657, 107665, 107673, 107681, 107689, 107697, 107705, 107713, 107721, + 107729, 107737, 107745, 107753, 107761, 107769, 107777, 107785, 107793, + 107801, 107809, 107817, 107825, 107833, 107841, 107849, 107857, 107865, + 107873, 107881, 107889, 107897, 107905, 107913, 107921, 107929, 107937, + 107945, 107953, 107961, 107969, 107977, 107985, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 107949, 107954, 107960, 107966, 107972, 107978, 107984, 107990, 107996, - 108002, 108007, 108014, 108020, 108026, 108032, 108038, 108044, 108049, - 108055, 108061, 108067, 108073, 108079, 108085, 108091, 108097, 108103, - 108109, 108114, 108120, 108128, 108136, 108142, 108148, 108154, 108160, - 108168, 108174, 108180, 108186, 108192, 108198, 108204, 108209, 108215, - 108223, 108231, 108237, 108243, 108249, 108256, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 108262, 108267, 108273, 108279, 108285, 108291, 108297, - 108303, 108309, 108315, 108320, 108327, 108333, 108339, 108345, 108351, - 108357, 108362, 108368, 108374, 108380, 108386, 108392, 108398, 108404, - 108410, 108416, 108422, 108427, 108433, 108441, 108449, 108455, 108461, - 108467, 108473, 108481, 108487, 108493, 108499, 108505, 108511, 108517, - 108522, 108528, 108536, 108544, 108550, 108556, 108562, 108569, 0, 0, 0, - 0, 0, 0, 0, 108575, 108579, 108583, 108588, 108593, 108599, 108604, - 108610, 108617, 108623, 108630, 108637, 108644, 108651, 108657, 108664, - 108671, 108678, 108685, 108691, 108698, 108705, 108711, 108718, 108724, - 108731, 108737, 108743, 108749, 108756, 108765, 108771, 108779, 108786, - 108793, 108800, 108806, 108812, 108818, 108824, 108830, 108837, 108846, - 108853, 108860, 108867, 0, 0, 0, 0, 0, 0, 0, 0, 108874, 108881, 108887, - 108893, 108899, 108905, 108911, 108917, 108923, 108929, 0, 0, 0, 0, 0, 0, + 107993, 107998, 108004, 108010, 108016, 108022, 108028, 108034, 108040, + 108046, 108051, 108058, 108064, 108070, 108076, 108082, 108088, 108093, + 108099, 108105, 108111, 108117, 108123, 108129, 108135, 108141, 108147, + 108153, 108158, 108164, 108172, 108180, 108186, 108192, 108198, 108204, + 108212, 108218, 108224, 108230, 108236, 108242, 108248, 108253, 108259, + 108267, 108275, 108281, 108287, 108293, 108300, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 108306, 108311, 108317, 108323, 108329, 108335, 108341, + 108347, 108353, 108359, 108364, 108371, 108377, 108383, 108389, 108395, + 108401, 108406, 108412, 108418, 108424, 108430, 108436, 108442, 108448, + 108454, 108460, 108466, 108471, 108477, 108485, 108493, 108499, 108505, + 108511, 108517, 108525, 108531, 108537, 108543, 108549, 108555, 108561, + 108566, 108572, 108580, 108588, 108594, 108600, 108606, 108613, 0, 0, 0, + 0, 0, 0, 0, 108619, 108623, 108627, 108632, 108637, 108643, 108648, + 108654, 108661, 108667, 108674, 108681, 108688, 108695, 108701, 108708, + 108715, 108722, 108729, 108735, 108742, 108749, 108755, 108762, 108768, + 108775, 108781, 108787, 108793, 108800, 108809, 108815, 108823, 108830, + 108837, 108844, 108850, 108856, 108862, 108868, 108874, 108881, 108890, + 108897, 108904, 108911, 0, 0, 0, 0, 0, 0, 0, 0, 108918, 108925, 108931, + 108937, 108943, 108949, 108955, 108961, 108967, 108973, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108935, 108939, 108943, - 108947, 108951, 108955, 108959, 108963, 108967, 108971, 108976, 108981, - 108986, 108991, 108996, 109001, 109006, 109011, 109016, 109022, 109028, - 109034, 109041, 109048, 109055, 109062, 109069, 109076, 109083, 109090, - 109097, 0, 109104, 109109, 109114, 109119, 109124, 109129, 109134, - 109139, 109144, 109149, 109154, 109159, 109164, 109169, 109173, 109178, - 109183, 109188, 109193, 109198, 109203, 109208, 109213, 109218, 109223, - 109228, 109233, 109238, 109246, 109251, 109256, 109261, 109266, 109271, - 109276, 109281, 109286, 109291, 109296, 109301, 109306, 109311, 0, - 109316, 109322, 109328, 0, 0, 109333, 109341, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108979, 108983, 108987, + 108991, 108995, 108999, 109003, 109007, 109011, 109015, 109020, 109025, + 109030, 109035, 109040, 109045, 109050, 109055, 109060, 109066, 109072, + 109078, 109085, 109092, 109099, 109106, 109113, 109120, 109127, 109134, + 109141, 0, 109148, 109153, 109158, 109163, 109168, 109173, 109178, + 109183, 109188, 109193, 109198, 109203, 109208, 109213, 109217, 109222, + 109227, 109232, 109237, 109242, 109247, 109252, 109257, 109262, 109267, + 109272, 109277, 109282, 109290, 109295, 109300, 109305, 109310, 109315, + 109320, 109325, 109330, 109335, 109340, 109345, 109350, 109355, 0, + 109360, 109366, 109372, 0, 0, 109377, 109385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109350, 109357, - 109364, 109371, 109377, 109384, 109390, 109397, 109403, 109409, 109416, - 109422, 109428, 109434, 109440, 109446, 109452, 109458, 109464, 109471, - 109482, 109488, 109494, 109502, 109508, 109514, 109521, 109532, 109538, - 109544, 109550, 109557, 109568, 109573, 109578, 109583, 109588, 109593, - 109599, 109605, 109611, 109618, 109626, 0, 0, 0, 0, 0, 0, 0, 0, 109632, - 109637, 109642, 109647, 109652, 109657, 109662, 109667, 109672, 109677, - 109682, 109687, 109692, 109697, 109702, 109707, 109712, 109717, 109722, - 109727, 109732, 109737, 109743, 109748, 109754, 109759, 109765, 109771, - 109777, 109783, 109789, 109796, 109802, 109808, 109812, 109817, 109822, - 109828, 109836, 109847, 109856, 109866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109876, 109882, 109888, 109894, 109900, - 109906, 109913, 109919, 109925, 109931, 109937, 109943, 109949, 109955, - 109961, 109967, 109973, 109979, 109985, 109991, 109997, 110004, 110011, - 110017, 110025, 110033, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110042, - 110047, 110053, 110058, 110063, 110068, 110073, 110078, 110085, 110090, - 110095, 110100, 110105, 110110, 110115, 110120, 110125, 110130, 110135, - 110140, 110145, 110150, 110154, 110158, 110162, 110166, 110171, 110176, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110182, - 110187, 110192, 110197, 110202, 110207, 110212, 110217, 110222, 110227, - 110232, 110237, 110242, 110247, 110252, 110257, 110262, 110267, 110272, - 110277, 110282, 110287, 110292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110297, - 110301, 110305, 110309, 110313, 110317, 110320, 110324, 110327, 110331, - 110334, 110338, 110342, 110347, 110351, 110356, 110359, 110363, 110366, - 110370, 110373, 110377, 110381, 110385, 110389, 110393, 110397, 110401, - 110405, 110409, 110413, 110417, 110421, 110425, 110429, 110433, 110437, - 110441, 110445, 110448, 110451, 110455, 110459, 110463, 110466, 110469, - 110472, 110475, 110479, 110483, 110487, 110490, 110493, 110497, 110503, - 110509, 110515, 110520, 110527, 110531, 110536, 110540, 110545, 110550, - 110556, 110561, 110567, 110571, 110576, 110580, 110585, 110588, 110591, - 110595, 110600, 110606, 110611, 110617, 0, 0, 0, 0, 110622, 110625, - 110628, 110631, 110634, 110637, 110640, 110643, 110646, 110649, 110653, - 110657, 110661, 110665, 110669, 110673, 110677, 110681, 110685, 110690, - 110694, 110698, 110701, 110704, 110707, 110710, 110713, 110716, 110719, - 110722, 110725, 110731, 110738, 110745, 110753, 110761, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 110767, 110771, 110776, 110781, 110786, 110790, 110795, 110799, - 110804, 110808, 110813, 110817, 110822, 110826, 110831, 110835, 110840, - 110845, 110850, 110855, 110860, 110865, 110870, 110875, 110880, 110885, - 110890, 110895, 110900, 110905, 110910, 110915, 110920, 110925, 110930, - 110935, 110939, 110943, 110948, 110953, 110958, 110962, 110966, 110970, - 110974, 110979, 110984, 110989, 110993, 110997, 111003, 111008, 111014, - 111019, 111025, 111030, 111036, 111041, 111047, 111052, 111057, 111062, - 111067, 111071, 111076, 111082, 111086, 111091, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 111097, 0, 0, 111102, 111109, 111116, 111123, 111130, 111137, - 111144, 111151, 111158, 111165, 111172, 111179, 111186, 111193, 111200, - 111207, 111214, 111221, 111228, 111235, 111242, 111249, 111256, 111263, - 111270, 0, 0, 0, 0, 0, 0, 0, 111277, 111284, 111290, 111296, 111302, - 111308, 111314, 111320, 111326, 111332, 0, 0, 0, 0, 0, 0, 111338, 111343, - 111348, 111353, 111358, 111362, 111366, 111370, 111375, 111380, 111385, - 111390, 111395, 111400, 111405, 111410, 111415, 111420, 111425, 111430, - 111435, 111440, 111445, 111450, 111455, 111460, 111465, 111470, 111475, - 111480, 111485, 111490, 111495, 111500, 111505, 111510, 111515, 111520, - 111525, 111530, 111535, 111540, 111546, 111551, 111557, 111562, 111568, - 111573, 111579, 111585, 111589, 111594, 111598, 0, 111602, 111607, - 111611, 111615, 111619, 111623, 111627, 111631, 111635, 111639, 111643, - 111648, 111652, 111657, 111662, 111667, 111673, 111679, 0, 0, 0, 0, 0, 0, - 0, 0, 111684, 111688, 111692, 111696, 111700, 111704, 111708, 111713, - 111718, 111723, 111728, 111733, 111738, 111743, 111748, 111753, 111758, - 111763, 111768, 111773, 111778, 111783, 111788, 111793, 111797, 111801, - 111806, 111811, 111816, 111820, 111824, 111828, 111833, 111837, 111841, - 111846, 111851, 111856, 111861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111866, - 111871, 111876, 111881, 111885, 111890, 111894, 111899, 111903, 111908, - 111913, 111919, 111924, 111930, 111934, 111939, 111943, 111948, 111952, - 111957, 111962, 111967, 111972, 111977, 111982, 111987, 111992, 111997, - 112002, 112007, 112012, 112017, 112022, 112027, 112032, 112037, 112042, - 112046, 112050, 112055, 112060, 112065, 112069, 112073, 112077, 112081, - 112086, 112091, 112096, 112101, 112105, 112109, 112115, 112120, 112126, - 112131, 112137, 112143, 112150, 112156, 112163, 112168, 112174, 112179, - 112185, 112190, 112195, 112200, 112205, 112209, 112213, 112218, 112223, - 112227, 112232, 112237, 112242, 112250, 112255, 112262, 112269, 112274, - 112278, 112282, 112286, 112290, 112294, 112298, 112302, 112306, 112310, - 112314, 112319, 112323, 112328, 112334, 0, 112340, 112345, 112350, - 112355, 112360, 112365, 112370, 112375, 112380, 112385, 112391, 112397, - 112403, 112409, 112415, 112421, 112427, 112433, 112439, 112446, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 112452, 112456, 112461, 112465, 112469, 112473, - 112478, 112482, 112487, 112491, 112496, 112501, 112506, 112511, 112516, - 112521, 112526, 112531, 0, 112536, 112541, 112546, 112551, 112556, - 112561, 112566, 112571, 112576, 112581, 112586, 112591, 112595, 112599, - 112604, 112609, 112614, 112619, 112623, 112627, 112631, 112635, 112640, - 112644, 112648, 112653, 112659, 112664, 112670, 112675, 112680, 112686, - 112691, 112697, 112702, 112707, 112712, 112717, 112721, 112726, 112732, - 112737, 112743, 112748, 112753, 112758, 112764, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109394, 109401, + 109408, 109415, 109421, 109428, 109434, 109441, 109447, 109453, 109460, + 109466, 109472, 109478, 109484, 109490, 109496, 109502, 109508, 109515, + 109526, 109532, 109538, 109546, 109552, 109558, 109565, 109576, 109582, + 109588, 109594, 109601, 109612, 109617, 109622, 109627, 109632, 109637, + 109643, 109649, 109655, 109662, 109670, 0, 0, 0, 0, 0, 0, 0, 0, 109676, + 109681, 109686, 109691, 109696, 109701, 109706, 109711, 109716, 109721, + 109726, 109731, 109736, 109741, 109746, 109751, 109756, 109761, 109766, + 109771, 109776, 109781, 109787, 109792, 109798, 109803, 109809, 109815, + 109821, 109827, 109833, 109840, 109846, 109852, 109856, 109861, 109866, + 109872, 109880, 109891, 109900, 109910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109920, 109926, 109932, 109938, 109944, + 109950, 109957, 109963, 109969, 109975, 109981, 109987, 109993, 109999, + 110005, 110011, 110017, 110023, 110029, 110035, 110041, 110048, 110055, + 110061, 110069, 110077, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110086, + 110091, 110097, 110102, 110107, 110112, 110117, 110122, 110129, 110134, + 110139, 110144, 110149, 110154, 110159, 110164, 110169, 110174, 110179, + 110184, 110189, 110194, 110198, 110202, 110206, 110210, 110215, 110220, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110226, + 110231, 110236, 110241, 110246, 110251, 110256, 110261, 110266, 110271, + 110276, 110281, 110286, 110291, 110296, 110301, 110306, 110311, 110316, + 110321, 110326, 110331, 110336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110341, + 110345, 110349, 110353, 110357, 110361, 110364, 110368, 110371, 110375, + 110378, 110382, 110386, 110391, 110395, 110400, 110403, 110407, 110410, + 110414, 110417, 110421, 110425, 110429, 110433, 110437, 110441, 110445, + 110449, 110453, 110457, 110461, 110465, 110469, 110473, 110477, 110481, + 110485, 110489, 110492, 110495, 110499, 110503, 110507, 110510, 110513, + 110516, 110519, 110523, 110527, 110531, 110534, 110537, 110541, 110547, + 110553, 110559, 110564, 110571, 110575, 110580, 110584, 110589, 110594, + 110600, 110605, 110611, 110615, 110620, 110624, 110629, 110632, 110635, + 110639, 110644, 110650, 110655, 110661, 0, 0, 0, 0, 110666, 110669, + 110672, 110675, 110678, 110681, 110684, 110687, 110690, 110693, 110697, + 110701, 110705, 110709, 110713, 110717, 110721, 110725, 110729, 110734, + 110738, 110742, 110745, 110748, 110751, 110754, 110757, 110760, 110763, + 110766, 110769, 110775, 110782, 110789, 110797, 110805, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 110811, 110815, 110820, 110825, 110830, 110834, 110839, 110843, + 110848, 110852, 110857, 110861, 110866, 110870, 110875, 110879, 110884, + 110889, 110894, 110899, 110904, 110909, 110914, 110919, 110924, 110929, + 110934, 110939, 110944, 110949, 110954, 110959, 110964, 110969, 110974, + 110979, 110983, 110987, 110992, 110997, 111002, 111006, 111010, 111014, + 111018, 111023, 111028, 111033, 111037, 111041, 111047, 111052, 111058, + 111063, 111069, 111074, 111080, 111085, 111091, 111096, 111101, 111106, + 111111, 111115, 111120, 111126, 111130, 111135, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 111141, 0, 0, 111146, 111153, 111160, 111167, 111174, 111181, + 111188, 111195, 111202, 111209, 111216, 111223, 111230, 111237, 111244, + 111251, 111258, 111265, 111272, 111279, 111286, 111293, 111300, 111307, + 111314, 0, 0, 0, 0, 0, 0, 0, 111321, 111328, 111334, 111340, 111346, + 111352, 111358, 111364, 111370, 111376, 0, 0, 0, 0, 0, 0, 111382, 111387, + 111392, 111397, 111402, 111406, 111410, 111414, 111419, 111424, 111429, + 111434, 111439, 111444, 111449, 111454, 111459, 111464, 111469, 111474, + 111479, 111484, 111489, 111494, 111499, 111504, 111509, 111514, 111519, + 111524, 111529, 111534, 111539, 111544, 111549, 111554, 111559, 111564, + 111569, 111574, 111579, 111584, 111590, 111595, 111601, 111606, 111612, + 111617, 111623, 111629, 111633, 111638, 111642, 0, 111646, 111651, + 111655, 111659, 111663, 111667, 111671, 111675, 111679, 111683, 111687, + 111692, 111696, 111701, 111706, 111711, 111717, 111723, 0, 0, 0, 0, 0, 0, + 0, 0, 111728, 111732, 111736, 111740, 111744, 111748, 111752, 111757, + 111762, 111767, 111772, 111777, 111782, 111787, 111792, 111797, 111802, + 111807, 111812, 111817, 111822, 111827, 111832, 111837, 111841, 111845, + 111850, 111855, 111860, 111864, 111868, 111872, 111877, 111881, 111885, + 111890, 111895, 111900, 111905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111910, + 111915, 111920, 111925, 111929, 111934, 111938, 111943, 111947, 111952, + 111957, 111963, 111968, 111974, 111978, 111983, 111987, 111992, 111996, + 112001, 112006, 112011, 112016, 112021, 112026, 112031, 112036, 112041, + 112046, 112051, 112056, 112061, 112066, 112071, 112076, 112081, 112086, + 112090, 112094, 112099, 112104, 112109, 112113, 112117, 112121, 112125, + 112130, 112135, 112140, 112145, 112149, 112153, 112159, 112164, 112170, + 112175, 112181, 112187, 112194, 112200, 112207, 112212, 112218, 112223, + 112229, 112234, 112239, 112244, 112249, 112253, 112257, 112262, 112267, + 112271, 112276, 112281, 112286, 112294, 112299, 112306, 112313, 112318, + 112322, 112326, 112330, 112334, 112338, 112342, 112346, 112350, 112354, + 112358, 112363, 112367, 112372, 112378, 0, 112384, 112389, 112394, + 112399, 112404, 112409, 112414, 112419, 112424, 112429, 112435, 112441, + 112447, 112453, 112459, 112465, 112471, 112477, 112483, 112490, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 112496, 112500, 112505, 112509, 112513, 112517, + 112522, 112526, 112531, 112535, 112540, 112545, 112550, 112555, 112560, + 112565, 112570, 112575, 0, 112580, 112585, 112590, 112595, 112600, + 112605, 112610, 112615, 112620, 112625, 112630, 112635, 112639, 112643, + 112648, 112653, 112658, 112663, 112667, 112671, 112675, 112679, 112684, + 112688, 112692, 112697, 112703, 112708, 112714, 112719, 112724, 112730, + 112735, 112741, 112746, 112751, 112756, 112761, 112765, 112770, 112776, + 112781, 112787, 112792, 112797, 112802, 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, 0, 0, - 0, 0, 0, 0, 0, 0, 112770, 112774, 112778, 112782, 112786, 112790, 112795, - 0, 112800, 0, 112805, 112810, 112815, 112820, 0, 112825, 112830, 112835, - 112840, 112845, 112850, 112855, 112860, 112865, 112870, 112875, 112880, - 112884, 112888, 112893, 0, 112898, 112903, 112907, 112911, 112915, - 112919, 112924, 112928, 112932, 112937, 112942, 0, 0, 0, 0, 0, 0, 112947, - 112951, 112956, 112960, 112965, 112969, 112974, 112978, 112983, 112987, - 112992, 112996, 113001, 113006, 113011, 113016, 113021, 113026, 113031, - 113036, 113041, 113046, 113051, 113056, 113061, 113066, 113071, 113076, - 113081, 113086, 113091, 113096, 113101, 113106, 113110, 113114, 113119, - 113124, 113129, 113134, 113138, 113142, 113146, 113150, 113155, 113160, - 113164, 113168, 113173, 113179, 113184, 113190, 113195, 113201, 113206, - 113212, 113217, 113223, 113228, 0, 0, 0, 0, 0, 113233, 113238, 113242, - 113246, 113250, 113254, 113258, 113262, 113266, 113270, 0, 0, 0, 0, 0, 0, - 113274, 113281, 113286, 113291, 0, 113296, 113300, 113305, 113309, - 113314, 113318, 113323, 113328, 0, 0, 113333, 113338, 0, 0, 113343, - 113348, 113353, 113357, 113362, 113367, 113372, 113377, 113382, 113387, - 113392, 113397, 113402, 113407, 113412, 113417, 113422, 113427, 113432, - 113437, 113442, 113447, 0, 113451, 113455, 113460, 113465, 113470, - 113474, 113478, 0, 113482, 113486, 0, 113491, 113496, 113501, 113506, - 113510, 0, 113514, 113518, 113523, 113528, 113534, 113539, 113545, - 113550, 113556, 113562, 0, 0, 113569, 113575, 0, 0, 113581, 113587, - 113593, 0, 0, 113598, 0, 0, 0, 0, 0, 0, 113602, 0, 0, 0, 0, 0, 113609, - 113614, 113621, 113629, 113635, 113641, 113647, 0, 0, 113654, 113660, - 113665, 113670, 113675, 113680, 113685, 0, 0, 0, 113690, 113695, 113700, - 113705, 113711, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113716, 113720, 113725, - 113729, 113734, 113738, 113743, 113748, 113754, 113759, 113765, 113769, - 113774, 113778, 113783, 113787, 113792, 113797, 113802, 113807, 113812, - 113817, 113822, 113827, 113832, 113837, 113842, 113847, 113852, 113857, - 113862, 113867, 113872, 113877, 113882, 113887, 113891, 113896, 113900, - 113905, 113910, 113915, 113919, 113924, 113928, 113932, 113937, 113941, - 113946, 113951, 113956, 113961, 113965, 113969, 113975, 113980, 113986, - 113991, 113997, 114003, 114010, 114016, 114023, 114028, 114034, 114039, - 114045, 114050, 114055, 114060, 114065, 114070, 114075, 114081, 114085, - 114089, 114093, 114098, 114102, 114108, 114113, 114118, 114122, 114126, - 114130, 114134, 114138, 114142, 114146, 114150, 114154, 114159, 0, - 114164, 114169, 114174, 114181, 114186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114191, 114195, - 114199, 114204, 114208, 114213, 114217, 114222, 114227, 114233, 114238, - 114244, 114248, 114253, 114257, 114262, 114266, 114271, 114276, 114281, - 114286, 114291, 114296, 114301, 114306, 114311, 114316, 114321, 114326, - 114331, 114336, 114341, 114346, 114351, 114356, 114360, 114364, 114369, - 114374, 114379, 114383, 114387, 114391, 114395, 114400, 114405, 114410, - 114414, 114418, 114424, 114429, 114435, 114440, 114446, 114452, 114459, - 114465, 114472, 114477, 114484, 114490, 114495, 114502, 114508, 114513, - 114518, 114523, 114528, 114533, 114538, 114542, 114547, 0, 0, 0, 0, 0, 0, - 0, 0, 114551, 114556, 114560, 114564, 114568, 114572, 114576, 114580, - 114584, 114588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114592, 114596, - 114601, 114605, 114610, 114614, 114619, 114624, 114630, 114635, 114641, - 114645, 114650, 114654, 114659, 114663, 114668, 114673, 114678, 114683, - 114688, 114693, 114698, 114703, 114708, 114713, 114718, 114723, 114728, - 114733, 114738, 114743, 114748, 114753, 114757, 114761, 114766, 114771, - 114776, 114780, 114784, 114788, 114792, 114797, 114802, 114807, 114811, - 114815, 114821, 114826, 114832, 114837, 114843, 114849, 0, 0, 114856, - 114861, 114867, 114872, 114878, 114883, 114888, 114893, 114898, 114903, - 114908, 114912, 114917, 114923, 114928, 114934, 114940, 114946, 114954, - 114967, 114980, 114993, 115007, 115022, 115030, 115041, 115050, 115060, - 115070, 115080, 115091, 115103, 115116, 115124, 115132, 115141, 115147, - 115154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115162, 115166, 115171, 115175, - 115180, 115184, 115189, 115194, 115200, 115205, 115211, 115215, 115220, - 115224, 115229, 115233, 115238, 115243, 115248, 115253, 115258, 115263, - 115268, 115273, 115278, 115283, 115288, 115293, 115298, 115303, 115308, - 115313, 115318, 115323, 115327, 115331, 115336, 115341, 115346, 115350, - 115354, 115358, 115362, 115367, 115372, 115377, 115381, 115385, 115390, - 115396, 115401, 115407, 115412, 115418, 115424, 115431, 115437, 115444, - 115449, 115455, 115460, 115466, 115471, 115476, 115481, 115486, 115490, - 115495, 115500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115505, 115510, 115514, - 115518, 115522, 115526, 115530, 115534, 115538, 115542, 0, 0, 0, 0, 0, 0, - 115546, 115552, 115557, 115564, 115572, 115579, 115587, 115596, 115601, - 115610, 115615, 115623, 115632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 115642, 115646, 115651, 115655, 115660, 115664, 115669, - 115673, 115678, 115682, 115687, 115691, 115696, 115701, 115706, 115711, - 115716, 115721, 115726, 115731, 115736, 115741, 115746, 115751, 115756, - 115761, 115766, 115771, 115776, 115781, 115785, 115789, 115794, 115799, - 115804, 115808, 115812, 115816, 115820, 115825, 115830, 115834, 115838, - 115843, 115848, 115853, 115859, 115864, 115870, 115875, 115881, 115886, - 115892, 115897, 115903, 115908, 115913, 115920, 0, 0, 0, 0, 0, 0, 115925, - 115930, 115934, 115938, 115942, 115946, 115950, 115954, 115958, 115962, + 0, 0, 0, 0, 0, 0, 112814, 112818, 112822, 112826, 112830, 112834, 112839, + 0, 112844, 0, 112849, 112854, 112859, 112864, 0, 112869, 112874, 112879, + 112884, 112889, 112894, 112899, 112904, 112909, 112914, 112919, 112924, + 112928, 112932, 112937, 0, 112942, 112947, 112951, 112955, 112959, + 112963, 112968, 112972, 112976, 112981, 112986, 0, 0, 0, 0, 0, 0, 112991, + 112995, 113000, 113004, 113009, 113013, 113018, 113022, 113027, 113031, + 113036, 113040, 113045, 113050, 113055, 113060, 113065, 113070, 113075, + 113080, 113085, 113090, 113095, 113100, 113105, 113110, 113115, 113120, + 113125, 113130, 113135, 113140, 113145, 113150, 113154, 113158, 113163, + 113168, 113173, 113178, 113182, 113186, 113190, 113194, 113199, 113204, + 113208, 113212, 113217, 113223, 113228, 113234, 113239, 113245, 113250, + 113256, 113261, 113267, 113272, 0, 0, 0, 0, 0, 113277, 113282, 113286, + 113290, 113294, 113298, 113302, 113306, 113310, 113314, 0, 0, 0, 0, 0, 0, + 113318, 113325, 113330, 113335, 0, 113340, 113344, 113349, 113353, + 113358, 113362, 113367, 113372, 0, 0, 113377, 113382, 0, 0, 113387, + 113392, 113397, 113401, 113406, 113411, 113416, 113421, 113426, 113431, + 113436, 113441, 113446, 113451, 113456, 113461, 113466, 113471, 113476, + 113481, 113486, 113491, 0, 113495, 113499, 113504, 113509, 113514, + 113518, 113522, 0, 113526, 113530, 0, 113535, 113540, 113545, 113550, + 113554, 0, 113558, 113562, 113567, 113572, 113578, 113583, 113589, + 113594, 113600, 113606, 0, 0, 113613, 113619, 0, 0, 113625, 113631, + 113637, 0, 0, 113642, 0, 0, 0, 0, 0, 0, 113646, 0, 0, 0, 0, 0, 113653, + 113658, 113665, 113673, 113679, 113685, 113691, 0, 0, 113698, 113704, + 113709, 113714, 113719, 113724, 113729, 0, 0, 0, 113734, 113739, 113744, + 113749, 113755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113760, 113764, 113769, + 113773, 113778, 113782, 113787, 113792, 113798, 113803, 113809, 113813, + 113818, 113822, 113827, 113831, 113836, 113841, 113846, 113851, 113856, + 113861, 113866, 113871, 113876, 113881, 113886, 113891, 113896, 113901, + 113906, 113911, 113916, 113921, 113926, 113931, 113935, 113940, 113944, + 113949, 113954, 113959, 113963, 113968, 113972, 113976, 113981, 113985, + 113990, 113995, 114000, 114005, 114009, 114013, 114019, 114024, 114030, + 114035, 114041, 114047, 114054, 114060, 114067, 114072, 114078, 114083, + 114089, 114094, 114099, 114104, 114109, 114114, 114119, 114125, 114129, + 114133, 114137, 114142, 114146, 114152, 114157, 114162, 114166, 114170, + 114174, 114178, 114182, 114186, 114190, 114194, 114198, 114203, 0, + 114208, 114213, 114218, 114225, 114230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114235, 114239, + 114243, 114248, 114252, 114257, 114261, 114266, 114271, 114277, 114282, + 114288, 114292, 114297, 114301, 114306, 114310, 114315, 114320, 114325, + 114330, 114335, 114340, 114345, 114350, 114355, 114360, 114365, 114370, + 114375, 114380, 114385, 114390, 114395, 114400, 114404, 114408, 114413, + 114418, 114423, 114427, 114431, 114435, 114439, 114444, 114449, 114454, + 114458, 114462, 114468, 114473, 114479, 114484, 114490, 114496, 114503, + 114509, 114516, 114521, 114528, 114534, 114539, 114546, 114552, 114557, + 114562, 114567, 114572, 114577, 114582, 114586, 114591, 0, 0, 0, 0, 0, 0, + 0, 0, 114595, 114600, 114604, 114608, 114612, 114616, 114620, 114624, + 114628, 114632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114636, 114640, + 114645, 114649, 114654, 114658, 114663, 114668, 114674, 114679, 114685, + 114689, 114694, 114698, 114703, 114707, 114712, 114717, 114722, 114727, + 114732, 114737, 114742, 114747, 114752, 114757, 114762, 114767, 114772, + 114777, 114782, 114787, 114792, 114797, 114801, 114805, 114810, 114815, + 114820, 114824, 114828, 114832, 114836, 114841, 114846, 114851, 114855, + 114859, 114865, 114870, 114876, 114881, 114887, 114893, 0, 0, 114900, + 114905, 114911, 114916, 114922, 114927, 114932, 114937, 114942, 114947, + 114952, 114956, 114961, 114967, 114972, 114978, 114984, 114990, 114998, + 115011, 115024, 115037, 115051, 115066, 115074, 115085, 115094, 115104, + 115114, 115124, 115135, 115147, 115160, 115168, 115176, 115185, 115191, + 115198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115206, 115210, 115215, 115219, + 115224, 115228, 115233, 115238, 115244, 115249, 115255, 115259, 115264, + 115268, 115273, 115277, 115282, 115287, 115292, 115297, 115302, 115307, + 115312, 115317, 115322, 115327, 115332, 115337, 115342, 115347, 115352, + 115357, 115362, 115367, 115371, 115375, 115380, 115385, 115390, 115394, + 115398, 115402, 115406, 115411, 115416, 115421, 115425, 115429, 115434, + 115440, 115445, 115451, 115456, 115462, 115468, 115475, 115481, 115488, + 115493, 115499, 115504, 115510, 115515, 115520, 115525, 115530, 115534, + 115539, 115544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115549, 115554, 115558, + 115562, 115566, 115570, 115574, 115578, 115582, 115586, 0, 0, 0, 0, 0, 0, + 115590, 115596, 115601, 115608, 115616, 115623, 115631, 115640, 115645, + 115654, 115659, 115667, 115676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 115686, 115690, 115695, 115699, 115704, 115708, 115713, + 115717, 115722, 115726, 115731, 115735, 115740, 115745, 115750, 115755, + 115760, 115765, 115770, 115775, 115780, 115785, 115790, 115795, 115800, + 115805, 115810, 115815, 115820, 115825, 115829, 115833, 115838, 115843, + 115848, 115852, 115856, 115860, 115864, 115869, 115874, 115878, 115882, + 115887, 115892, 115897, 115903, 115908, 115914, 115919, 115925, 115930, + 115936, 115941, 115947, 115952, 115957, 115964, 0, 0, 0, 0, 0, 0, 115969, + 115974, 115978, 115982, 115986, 115990, 115994, 115998, 116002, 116006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 115966, 115970, 115975, 115980, 115984, 115989, 115996, - 116000, 116005, 116010, 116014, 116019, 116024, 116029, 116033, 116037, - 116041, 116046, 116050, 116054, 116059, 116064, 116069, 116076, 116081, - 116086, 116091, 0, 0, 116098, 116105, 116112, 116121, 116126, 116132, - 116137, 116143, 116148, 116154, 116159, 116165, 116170, 116176, 116182, - 0, 0, 0, 0, 116187, 116192, 116196, 116200, 116204, 116208, 116212, - 116216, 116220, 116224, 116228, 116233, 116238, 116244, 116249, 116254, - 116259, 116264, 116269, 116274, 116279, 116284, 116289, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 116010, 116014, 116019, 116024, 116028, 116033, 116040, + 116044, 116049, 116054, 116058, 116063, 116068, 116073, 116077, 116081, + 116085, 116090, 116094, 116098, 116103, 116108, 116113, 116120, 116125, + 116130, 116135, 0, 0, 116142, 116149, 116156, 116165, 116170, 116176, + 116181, 116187, 116192, 116198, 116203, 116209, 116214, 116220, 116226, + 0, 0, 0, 0, 116231, 116236, 116240, 116244, 116248, 116252, 116256, + 116260, 116264, 116268, 116272, 116277, 116282, 116288, 116293, 116298, + 116303, 116308, 116313, 116318, 116323, 116328, 116333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 116294, 116298, 116303, 116307, 116312, 116316, 116321, 116325, - 116330, 116334, 116339, 116343, 116348, 116353, 116358, 116363, 116368, - 116373, 116378, 116383, 116388, 116393, 116398, 116403, 116408, 116413, - 116418, 116423, 116428, 116433, 116437, 116441, 116446, 116451, 116456, - 116460, 116464, 116468, 116472, 116477, 116482, 116487, 116491, 116495, - 116500, 116506, 116511, 116517, 116522, 116528, 116534, 116541, 116546, - 116552, 116557, 116563, 116568, 116573, 116578, 116583, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 116338, 116342, 116347, 116351, 116356, 116360, 116365, 116369, + 116374, 116378, 116383, 116387, 116392, 116397, 116402, 116407, 116412, + 116417, 116422, 116427, 116432, 116437, 116442, 116447, 116452, 116457, + 116462, 116467, 116472, 116477, 116481, 116485, 116490, 116495, 116500, + 116504, 116508, 116512, 116516, 116521, 116526, 116531, 116535, 116539, + 116544, 116550, 116555, 116561, 116566, 116572, 116578, 116585, 116590, + 116596, 116601, 116607, 116612, 116617, 116622, 116627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116588, - 116596, 116603, 116611, 116619, 116626, 116634, 116642, 116650, 116657, - 116664, 116672, 116680, 116688, 116696, 116704, 116712, 116720, 116728, - 116736, 116744, 116752, 116760, 116768, 116776, 116784, 116792, 116800, - 116808, 116816, 116824, 116832, 116840, 116848, 116855, 116863, 116871, - 116878, 116886, 116894, 116902, 116909, 116916, 116924, 116932, 116940, - 116948, 116956, 116964, 116972, 116980, 116988, 116996, 117004, 117012, - 117020, 117028, 117036, 117044, 117052, 117060, 117068, 117076, 117084, - 117092, 117099, 117105, 117111, 117117, 117123, 117129, 117135, 117141, - 117147, 117153, 117160, 117167, 117174, 117181, 117188, 117195, 117202, - 117209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117216, 117222, 117228, - 117235, 117241, 117248, 117254, 117261, 0, 0, 117267, 0, 0, 117273, - 117279, 117286, 117293, 117300, 117307, 117314, 117321, 0, 117328, - 117335, 0, 117342, 117349, 117356, 117363, 117370, 117377, 117384, - 117391, 117397, 117403, 117410, 117417, 117424, 117430, 117436, 117443, - 117449, 117455, 117462, 117469, 117476, 117482, 117488, 117495, 117502, - 117510, 117517, 117525, 117532, 117540, 0, 117547, 117555, 0, 0, 117562, - 117569, 117576, 117583, 117589, 117598, 117605, 117611, 117618, 117625, - 117632, 117640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117650, 117657, 117663, - 117669, 117675, 117681, 117687, 117693, 117699, 117705, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116632, + 116640, 116647, 116655, 116663, 116670, 116678, 116686, 116694, 116701, + 116708, 116716, 116724, 116732, 116740, 116748, 116756, 116764, 116772, + 116780, 116788, 116796, 116804, 116812, 116820, 116828, 116836, 116844, + 116852, 116860, 116868, 116876, 116884, 116892, 116899, 116907, 116915, + 116922, 116930, 116938, 116946, 116953, 116960, 116968, 116976, 116984, + 116992, 117000, 117008, 117016, 117024, 117032, 117040, 117048, 117056, + 117064, 117072, 117080, 117088, 117096, 117104, 117112, 117120, 117128, + 117136, 117143, 117149, 117155, 117161, 117167, 117173, 117179, 117185, + 117191, 117197, 117204, 117211, 117218, 117225, 117232, 117239, 117246, + 117253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117260, 117266, 117272, + 117279, 117285, 117292, 117298, 117305, 0, 0, 117311, 0, 0, 117317, + 117323, 117330, 117337, 117344, 117351, 117358, 117365, 0, 117372, + 117379, 0, 117386, 117393, 117400, 117407, 117414, 117421, 117428, + 117435, 117441, 117447, 117454, 117461, 117468, 117474, 117480, 117487, + 117493, 117499, 117506, 117513, 117520, 117526, 117532, 117539, 117546, + 117554, 117561, 117569, 117576, 117584, 0, 117591, 117599, 0, 0, 117606, + 117613, 117620, 117627, 117633, 117642, 117649, 117655, 117662, 117669, + 117676, 117684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117694, 117701, 117707, + 117713, 117719, 117725, 117731, 117737, 117743, 117749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117711, 117715, 117720, - 117724, 117729, 117733, 117738, 117743, 0, 0, 117749, 117753, 117758, - 117762, 117767, 117771, 117776, 117781, 117786, 117791, 117796, 117801, - 117806, 117811, 117816, 117821, 117826, 117831, 117836, 117841, 117846, - 117851, 117856, 117861, 117865, 117869, 117874, 117879, 117884, 117888, - 117892, 117896, 117900, 117905, 117910, 117915, 117919, 117923, 117928, - 117933, 117939, 117944, 117950, 117955, 117961, 117967, 0, 0, 117974, - 117979, 117985, 117990, 117996, 118001, 118006, 118011, 118016, 118021, - 118025, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 118032, 118037, 118043, 118050, 118056, 118062, 118069, - 118075, 118082, 118089, 118097, 118104, 118109, 118115, 118121, 118127, - 118133, 118139, 118145, 118151, 118157, 118163, 118169, 118175, 118181, - 118187, 118193, 118199, 118205, 118211, 118216, 118221, 118227, 118233, - 118239, 118244, 118250, 118256, 118262, 118268, 118274, 118280, 118286, - 118291, 118296, 118301, 118307, 118313, 118319, 118324, 118329, 118335, - 118341, 118347, 118353, 118362, 118371, 118377, 118383, 118390, 118397, - 118404, 118411, 118419, 118426, 118434, 118440, 118446, 118453, 118460, - 118469, 118479, 0, 0, 0, 0, 0, 0, 0, 0, 118484, 118488, 118493, 118499, - 118504, 118509, 118514, 118520, 118526, 118532, 118538, 118544, 118550, - 118554, 118559, 118564, 118569, 118574, 118579, 118584, 118589, 118594, - 118599, 118604, 118609, 118614, 118619, 118624, 118629, 118634, 118639, - 118644, 118648, 118652, 118657, 118662, 118667, 118671, 118676, 118681, - 118686, 118691, 118696, 118701, 118705, 118709, 118713, 118718, 118723, - 118728, 118732, 118736, 118741, 118746, 118751, 118757, 118763, 118770, - 118776, 118783, 118790, 118797, 118804, 118811, 118818, 118825, 118831, - 118837, 118844, 118851, 118858, 118863, 118868, 118873, 118877, 118882, - 118887, 118893, 118898, 118914, 118928, 118939, 118945, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 118951, 118957, 118963, 118969, 118975, 118980, - 118986, 118992, 118998, 119004, 119010, 119016, 119022, 119026, 119030, - 119034, 119038, 119046, 119054, 119062, 119070, 119079, 119088, 119097, - 119106, 119114, 119123, 119132, 119140, 119149, 119158, 119167, 119176, - 119184, 119193, 119201, 119210, 119219, 119227, 119235, 119243, 119251, - 119259, 119268, 119277, 119287, 119297, 119307, 119317, 119327, 119336, - 119346, 119356, 119366, 119377, 119387, 119399, 119411, 119422, 119436, - 119447, 119457, 119469, 119480, 119490, 119502, 119514, 119525, 119536, - 119546, 119556, 119568, 119579, 0, 0, 0, 0, 0, 0, 0, 119591, 119595, - 119602, 119606, 119612, 119618, 119626, 119634, 119642, 119650, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117755, 117759, 117764, + 117768, 117773, 117777, 117782, 117787, 0, 0, 117793, 117797, 117802, + 117806, 117811, 117815, 117820, 117825, 117830, 117835, 117840, 117845, + 117850, 117855, 117860, 117865, 117870, 117875, 117880, 117885, 117890, + 117895, 117900, 117905, 117909, 117913, 117918, 117923, 117928, 117932, + 117936, 117940, 117944, 117949, 117954, 117959, 117963, 117967, 117972, + 117977, 117983, 117988, 117994, 117999, 118005, 118011, 0, 0, 118018, + 118023, 118029, 118034, 118040, 118045, 118050, 118055, 118060, 118065, + 118069, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 118076, 118081, 118087, 118094, 118100, 118106, 118113, + 118119, 118126, 118133, 118141, 118148, 118153, 118159, 118165, 118171, + 118177, 118183, 118189, 118195, 118201, 118207, 118213, 118219, 118225, + 118231, 118237, 118243, 118249, 118255, 118260, 118265, 118271, 118277, + 118283, 118288, 118294, 118300, 118306, 118312, 118318, 118324, 118330, + 118335, 118340, 118345, 118351, 118357, 118363, 118368, 118373, 118379, + 118385, 118391, 118397, 118406, 118415, 118421, 118427, 118434, 118441, + 118448, 118455, 118463, 118470, 118478, 118484, 118490, 118497, 118504, + 118513, 118523, 0, 0, 0, 0, 0, 0, 0, 0, 118528, 118532, 118537, 118543, + 118548, 118553, 118558, 118564, 118570, 118576, 118582, 118588, 118594, + 118598, 118603, 118608, 118613, 118618, 118623, 118628, 118633, 118638, + 118643, 118648, 118653, 118658, 118663, 118668, 118673, 118678, 118683, + 118688, 118692, 118696, 118701, 118706, 118711, 118715, 118720, 118725, + 118730, 118735, 118740, 118745, 118749, 118753, 118757, 118762, 118767, + 118772, 118776, 118780, 118785, 118790, 118795, 118801, 118807, 118814, + 118820, 118827, 118834, 118841, 118848, 118855, 118862, 118869, 118875, + 118881, 118888, 118895, 118902, 118907, 118912, 118917, 118921, 118926, + 118931, 118937, 118942, 118958, 118972, 118983, 118989, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 118995, 119001, 119007, 119013, 119019, 119024, + 119030, 119036, 119042, 119048, 119054, 119060, 119066, 119070, 119074, + 119078, 119082, 119090, 119098, 119106, 119114, 119123, 119132, 119141, + 119150, 119158, 119167, 119176, 119184, 119193, 119202, 119211, 119220, + 119228, 119237, 119245, 119254, 119263, 119271, 119279, 119287, 119295, + 119303, 119312, 119321, 119331, 119341, 119351, 119361, 119371, 119380, + 119390, 119400, 119410, 119421, 119431, 119443, 119455, 119466, 119480, + 119491, 119501, 119513, 119524, 119534, 119546, 119558, 119569, 119580, + 119590, 119600, 119612, 119623, 0, 0, 0, 0, 0, 0, 0, 119635, 119639, + 119646, 119650, 119656, 119662, 119670, 119678, 119686, 119694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119654, 119658, - 119663, 119667, 119672, 119676, 119681, 119686, 119692, 0, 119697, - 119701, 119706, 119710, 119715, 119719, 119724, 119729, 119734, 119739, - 119744, 119749, 119754, 119759, 119764, 119769, 119774, 119779, 119784, - 119789, 119794, 119799, 119804, 119809, 119813, 119817, 119822, 119827, - 119832, 119836, 119840, 119844, 119848, 119853, 119858, 119863, 119867, - 119871, 119877, 119882, 119888, 119893, 119899, 119905, 119912, 0, - 119918, 119923, 119929, 119934, 119940, 119945, 119950, 119955, 119960, - 119965, 119969, 119974, 119980, 119986, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 119992, 119997, 120001, 120005, 120009, 120013, 120017, 120021, 120025, - 120029, 120033, 120037, 120041, 120045, 120049, 120053, 120057, 120061, - 120065, 120069, 120074, 120079, 120084, 120089, 120094, 120099, 120104, - 120109, 120114, 0, 0, 0, 120121, 120126, 120131, 120135, 120140, 120145, - 120150, 120155, 120160, 120165, 120170, 120175, 120180, 120185, 120189, - 120193, 120198, 120203, 120207, 120212, 120217, 120222, 120227, 120232, - 120237, 120242, 120246, 120250, 120254, 120259, 120263, 120267, 0, 0, - 120271, 120277, 120284, 120291, 120298, 120305, 120312, 120319, 120326, - 120333, 120340, 120347, 120353, 120359, 120366, 120373, 120379, 120386, - 120393, 120400, 120407, 120414, 0, 120421, 120427, 120433, 120439, - 120446, 120452, 120458, 120464, 120470, 120475, 120480, 120485, 120490, - 120495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119698, 119702, + 119707, 119711, 119716, 119720, 119725, 119730, 119736, 0, 119741, + 119745, 119750, 119754, 119759, 119763, 119768, 119773, 119778, 119783, + 119788, 119793, 119798, 119803, 119808, 119813, 119818, 119823, 119828, + 119833, 119838, 119843, 119848, 119853, 119857, 119861, 119866, 119871, + 119876, 119880, 119884, 119888, 119892, 119897, 119902, 119907, 119911, + 119915, 119921, 119926, 119932, 119937, 119943, 119949, 119956, 0, + 119962, 119967, 119973, 119978, 119984, 119989, 119994, 119999, 120004, + 120009, 120013, 120018, 120024, 120030, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 120036, 120041, 120045, 120049, 120053, 120057, 120061, 120065, 120069, + 120073, 120077, 120081, 120085, 120089, 120093, 120097, 120101, 120105, + 120109, 120113, 120118, 120123, 120128, 120133, 120138, 120143, 120148, + 120153, 120158, 0, 0, 0, 120165, 120170, 120175, 120179, 120184, 120189, + 120194, 120199, 120204, 120209, 120214, 120219, 120224, 120229, 120233, + 120237, 120242, 120247, 120251, 120256, 120261, 120266, 120271, 120276, + 120281, 120286, 120290, 120294, 120298, 120303, 120307, 120311, 0, 0, + 120315, 120321, 120328, 120335, 120342, 120349, 120356, 120363, 120370, + 120377, 120384, 120391, 120397, 120403, 120410, 120417, 120423, 120430, + 120437, 120444, 120451, 120458, 0, 120465, 120471, 120477, 120483, + 120490, 120496, 120502, 120508, 120514, 120519, 120524, 120529, 120534, + 120539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 120500, 120505, 120511, 120516, 120522, 120527, 120533, 0, - 120538, 120544, 0, 120549, 120555, 120560, 120566, 120572, 120578, - 120584, 120590, 120596, 120602, 120608, 120614, 120620, 120626, 120632, - 120638, 120644, 120650, 120656, 120662, 120668, 120673, 120678, 120684, - 120690, 120696, 120701, 120706, 120711, 120716, 120722, 120728, 120734, - 120739, 120744, 120750, 120756, 120762, 120768, 120775, 120781, 120788, - 120794, 120801, 0, 0, 0, 120808, 0, 120814, 120821, 0, 120827, 120834, - 120840, 120846, 120852, 120858, 120864, 120869, 120874, 0, 0, 0, 0, 0, 0, - 0, 0, 120879, 120885, 120890, 120895, 120900, 120905, 120910, 120915, - 120920, 120925, 0, 0, 0, 0, 0, 0, 120930, 120935, 120941, 120946, 120952, - 120957, 0, 120963, 120969, 0, 120975, 120981, 120987, 120992, 120998, - 121004, 121010, 121015, 121020, 121026, 121032, 121038, 121043, 121049, - 121055, 121061, 121067, 121072, 121078, 121084, 121090, 121096, 121102, - 121108, 121114, 121120, 121126, 121132, 121137, 121143, 121148, 121153, - 121158, 121165, 121171, 121178, 121184, 0, 121191, 121198, 0, 121205, - 121212, 121219, 121225, 121231, 121236, 0, 0, 0, 0, 0, 0, 0, 121241, - 121247, 121252, 121257, 121262, 121267, 121272, 121277, 121282, 121287, + 0, 0, 0, 120544, 120549, 120555, 120560, 120566, 120571, 120577, 0, + 120582, 120588, 0, 120593, 120599, 120604, 120610, 120616, 120622, + 120628, 120634, 120640, 120646, 120652, 120658, 120664, 120670, 120676, + 120682, 120688, 120694, 120700, 120706, 120712, 120717, 120722, 120728, + 120734, 120740, 120745, 120750, 120755, 120760, 120766, 120772, 120778, + 120783, 120788, 120794, 120800, 120806, 120812, 120819, 120825, 120832, + 120838, 120845, 0, 0, 0, 120852, 0, 120858, 120865, 0, 120871, 120878, + 120884, 120890, 120896, 120902, 120908, 120913, 120918, 0, 0, 0, 0, 0, 0, + 0, 0, 120923, 120929, 120934, 120939, 120944, 120949, 120954, 120959, + 120964, 120969, 0, 0, 0, 0, 0, 0, 120974, 120979, 120985, 120990, 120996, + 121001, 0, 121007, 121013, 0, 121019, 121025, 121031, 121036, 121042, + 121048, 121054, 121059, 121064, 121070, 121076, 121082, 121087, 121093, + 121099, 121105, 121111, 121116, 121122, 121128, 121134, 121140, 121146, + 121152, 121158, 121164, 121170, 121176, 121181, 121187, 121192, 121197, + 121202, 121209, 121215, 121222, 121228, 0, 121235, 121242, 0, 121249, + 121256, 121263, 121269, 121275, 121280, 0, 0, 0, 0, 0, 0, 0, 121285, + 121291, 121296, 121301, 121306, 121311, 121316, 121321, 121326, 121331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -23636,1725 +23642,1725 @@ 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, 0, 0, 0, 0, 0, 121292, 121296, 121301, 121306, - 121310, 121315, 121319, 121324, 121329, 121333, 121338, 121343, 121348, - 121352, 121356, 121360, 121365, 121369, 121373, 121377, 121382, 121387, - 121392, 121397, 121401, 0, 0, 0, 0, 0, 0, 0, 121408, 121413, 121418, - 121423, 121428, 121432, 121437, 121441, 121446, 121450, 121455, 121460, - 121466, 121471, 121477, 121481, 121486, 0, 121490, 121494, 121499, - 121504, 121509, 121514, 121519, 121524, 121529, 121534, 121539, 121544, - 121549, 121554, 121559, 121564, 121569, 121574, 121579, 121584, 121588, - 121592, 121597, 121602, 121607, 121611, 121615, 121619, 121623, 121628, - 121633, 121638, 121642, 121646, 121651, 121657, 121665, 121670, 121676, - 121681, 121687, 0, 0, 0, 121693, 121698, 121704, 121710, 121715, 121719, - 121723, 121728, 121736, 121746, 121752, 121760, 121766, 121773, 121781, - 121787, 121795, 121801, 121809, 121814, 121818, 121822, 121826, 121830, - 121834, 121838, 121842, 121846, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121336, 121340, 121345, 121350, + 121354, 121359, 121363, 121368, 121373, 121377, 121382, 121387, 121392, + 121396, 121400, 121404, 121409, 121413, 121417, 121421, 121426, 121431, + 121436, 121441, 121445, 0, 0, 0, 0, 0, 0, 0, 121452, 121457, 121462, + 121467, 121472, 121476, 121481, 121485, 121490, 121494, 121499, 121504, + 121510, 121515, 121521, 121525, 121530, 0, 121534, 121538, 121543, + 121548, 121553, 121558, 121563, 121568, 121573, 121578, 121583, 121588, + 121593, 121598, 121603, 121608, 121613, 121618, 121623, 121628, 121632, + 121636, 121641, 121646, 121651, 121655, 121659, 121663, 121667, 121672, + 121677, 121682, 121686, 121690, 121695, 121701, 121709, 121714, 121720, + 121725, 121731, 0, 0, 0, 121737, 121742, 121748, 121754, 121759, 121763, + 121767, 121772, 121780, 121790, 121796, 121804, 121810, 121817, 121825, + 121831, 121839, 121845, 121853, 121858, 121862, 121866, 121870, 121874, + 121878, 121882, 121886, 121890, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 121850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121855, 121861, - 121867, 121873, 121879, 121885, 121891, 121897, 121903, 121909, 121915, - 121921, 121927, 121933, 121939, 121945, 121951, 121957, 121963, 121969, - 121975, 121984, 121988, 121992, 121996, 122000, 122004, 122008, 122012, - 122016, 122020, 122024, 122028, 122032, 122036, 122040, 122044, 122050, - 122056, 122060, 122066, 122072, 122077, 122081, 122086, 122090, 122094, - 122100, 122106, 122110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122114, - 122122, 122125, 122130, 122136, 122144, 122149, 122155, 122163, 122169, - 122175, 122179, 122183, 122190, 122199, 122206, 122215, 122221, 122230, - 122237, 122244, 122251, 122261, 122267, 122271, 122278, 122287, 122297, - 122304, 122311, 122315, 122319, 122326, 122336, 122340, 122347, 122354, - 122361, 122367, 122374, 122381, 122388, 122395, 122399, 122403, 122407, - 122414, 122418, 122425, 122432, 122446, 122455, 122459, 122463, 122467, - 122474, 122478, 122482, 122486, 122494, 122502, 122521, 122531, 122551, - 122555, 122559, 122563, 122567, 122571, 122575, 122579, 122586, 122590, - 122593, 122597, 122601, 122607, 122614, 122623, 122627, 122636, 122645, - 122653, 122657, 122664, 122668, 122672, 122676, 122680, 122691, 122700, - 122709, 122718, 122727, 122739, 122748, 122757, 122766, 122774, 122783, - 122795, 122804, 122812, 122821, 122833, 122842, 122851, 122863, 122872, - 122881, 122893, 122902, 122906, 122910, 122914, 122918, 122922, 122926, - 122930, 122937, 122941, 122945, 122956, 122960, 122964, 122971, 122977, - 122983, 122987, 122994, 122998, 123002, 123006, 123010, 123014, 123018, - 123024, 123032, 123036, 123040, 123043, 123050, 123062, 123066, 123078, - 123085, 123092, 123099, 123106, 123112, 123116, 123120, 123124, 123128, - 123135, 123144, 123151, 123159, 123167, 123173, 123177, 123181, 123185, - 123189, 123195, 123204, 123216, 123223, 123230, 123239, 123250, 123256, - 123265, 123274, 123281, 123290, 123297, 123303, 123313, 123320, 123327, - 123334, 123341, 123345, 123351, 123355, 123366, 123374, 123383, 123395, - 123402, 123409, 123419, 123426, 123435, 123442, 123451, 123458, 123465, - 123475, 123482, 123489, 123498, 123505, 123517, 123526, 123533, 123540, - 123547, 123556, 123566, 123579, 123586, 123595, 123605, 123612, 123621, - 123634, 123641, 123648, 123655, 123665, 123675, 123681, 123691, 123698, - 123705, 123715, 123721, 123728, 123735, 123742, 123752, 123759, 123766, - 123773, 123779, 123786, 123796, 123803, 123807, 123815, 123819, 123831, - 123835, 123849, 123853, 123857, 123861, 123865, 123871, 123878, 123886, - 123890, 123894, 123898, 123902, 123909, 123913, 123919, 123925, 123933, - 123937, 123944, 123952, 123956, 123960, 123966, 123970, 123979, 123988, - 123995, 124005, 124011, 124015, 124019, 124027, 124034, 124041, 124047, - 124051, 124059, 124063, 124070, 124082, 124089, 124099, 124105, 124109, - 124118, 124125, 124134, 124138, 124142, 124149, 124153, 124157, 124161, - 124165, 124168, 124174, 124180, 124184, 124188, 124195, 124202, 124209, - 124216, 124223, 124230, 124237, 124244, 124250, 124254, 124258, 124265, - 124272, 124279, 124286, 124293, 124297, 124300, 124305, 124309, 124313, - 124322, 124331, 124335, 124339, 124345, 124351, 124368, 124374, 124378, - 124387, 124391, 124395, 124402, 124410, 124418, 124424, 124428, 124432, - 124436, 124440, 124443, 124449, 124456, 124466, 124473, 124480, 124487, - 124493, 124500, 124507, 124514, 124521, 124528, 124537, 124544, 124556, - 124563, 124570, 124580, 124591, 124598, 124605, 124612, 124619, 124626, - 124633, 124640, 124647, 124654, 124661, 124671, 124681, 124691, 124698, - 124708, 124715, 124722, 124729, 124736, 124742, 124749, 124756, 124763, - 124770, 124777, 124784, 124791, 124798, 124804, 124811, 124818, 124827, - 124834, 124841, 124845, 124853, 124857, 124861, 124865, 124869, 124873, - 124880, 124884, 124893, 124897, 124904, 124912, 124916, 124920, 124924, - 124937, 124953, 124957, 124961, 124968, 124974, 124981, 124985, 124989, - 124993, 124997, 125001, 125008, 125012, 125030, 125034, 125038, 125045, - 125049, 125053, 125059, 125063, 125067, 125075, 125079, 125083, 125086, - 125090, 125096, 125107, 125116, 125125, 125132, 125139, 125150, 125157, - 125164, 125171, 125178, 125185, 125192, 125199, 125209, 125215, 125222, - 125232, 125241, 125248, 125257, 125267, 125274, 125281, 125288, 125295, - 125307, 125314, 125321, 125328, 125335, 125342, 125352, 125359, 125366, - 125376, 125389, 125401, 125408, 125418, 125425, 125432, 125439, 125453, - 125459, 125467, 125477, 125487, 125494, 125501, 125507, 125511, 125518, - 125528, 125534, 125547, 125551, 125555, 125562, 125566, 125573, 125583, - 125587, 125591, 125595, 125599, 125603, 125610, 125614, 125621, 125628, - 125635, 125644, 125653, 125663, 125670, 125677, 125684, 125694, 125701, - 125711, 125718, 125728, 125735, 125742, 125752, 125762, 125769, 125775, - 125783, 125791, 125797, 125803, 125807, 125811, 125818, 125826, 125832, - 125836, 125840, 125844, 125851, 125863, 125866, 125873, 125879, 125883, - 125887, 125891, 125895, 125899, 125903, 125907, 125911, 125915, 125919, - 125926, 125930, 125936, 125940, 125944, 125948, 125954, 125961, 125968, - 125975, 125986, 125994, 125998, 126004, 126013, 126020, 126026, 126029, - 126033, 126037, 126043, 126052, 126060, 126064, 126070, 126074, 126078, - 126082, 126088, 126095, 126101, 126105, 126111, 126115, 126119, 126128, - 126140, 126144, 126151, 126158, 126168, 126175, 126187, 126194, 126201, - 126208, 126219, 126229, 126242, 126252, 126259, 126263, 126267, 126271, - 126275, 126284, 126293, 126302, 126319, 126328, 126334, 126341, 126349, - 126362, 126366, 126375, 126384, 126393, 126402, 126413, 126422, 126430, - 126439, 126448, 126457, 126466, 126476, 126479, 126483, 126487, 126491, - 126495, 126499, 126505, 126512, 126519, 126526, 126532, 126538, 126545, - 126551, 126558, 126566, 126570, 126577, 126584, 126591, 126599, 126602, - 126606, 126610, 126614, 126617, 126623, 126627, 126633, 126640, 126647, - 126653, 126660, 126667, 126674, 126681, 126688, 126695, 126702, 126709, - 126716, 126723, 126730, 126737, 126744, 126751, 126757, 126761, 126770, - 126774, 126778, 126782, 126786, 126792, 126799, 126806, 126813, 126820, - 126827, 126833, 126841, 126845, 126849, 126853, 126857, 126863, 126880, - 126897, 126901, 126905, 126909, 126913, 126917, 126921, 126927, 126934, - 126938, 126944, 126951, 126958, 126965, 126972, 126979, 126988, 126995, - 127002, 127009, 127016, 127020, 127024, 127030, 127042, 127046, 127050, - 127059, 127063, 127067, 127071, 127077, 127081, 127085, 127094, 127098, - 127102, 127106, 127113, 127117, 127121, 127125, 127129, 127133, 127137, - 127141, 127145, 127151, 127158, 127165, 127171, 127175, 127192, 127198, - 127202, 127209, 127216, 127223, 127230, 127237, 127244, 127248, 127252, - 127256, 127262, 127266, 127272, 127276, 127280, 127287, 127294, 127311, - 127315, 127319, 127323, 127327, 127331, 127343, 127346, 127351, 127356, - 127371, 127381, 127393, 127397, 127401, 127405, 127411, 127418, 127425, - 127435, 127447, 127453, 127459, 127468, 127472, 127476, 127483, 127493, - 127500, 127506, 127510, 127514, 127521, 127527, 127531, 127537, 127541, - 127549, 127555, 127559, 127567, 127575, 127582, 127588, 127595, 127602, - 127612, 127622, 127626, 127630, 127634, 127638, 127644, 127651, 127657, - 127664, 127671, 127678, 127687, 127694, 127701, 127707, 127714, 127721, - 127728, 127735, 127742, 127749, 127755, 127762, 127769, 127776, 127785, - 127792, 127799, 127803, 127809, 127813, 127819, 127826, 127833, 127840, - 127844, 127848, 127852, 127856, 127860, 127867, 127871, 127875, 127881, - 127889, 127893, 127897, 127901, 127905, 127912, 127916, 127920, 127928, - 127932, 127936, 127940, 127944, 127950, 127954, 127958, 127964, 127971, - 127977, 127984, 127996, 128000, 128007, 128014, 128021, 128028, 128040, - 128047, 128051, 128055, 128059, 128066, 128073, 128080, 128087, 128097, - 128104, 128110, 128117, 128124, 128131, 128138, 128147, 128157, 128164, - 128168, 128175, 128179, 128183, 128187, 128194, 128201, 128211, 128217, - 128221, 128230, 128234, 128241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 121894, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121899, 121905, + 121911, 121917, 121923, 121929, 121935, 121941, 121947, 121953, 121959, + 121965, 121971, 121977, 121983, 121989, 121995, 122001, 122007, 122013, + 122019, 122028, 122032, 122036, 122040, 122044, 122048, 122052, 122056, + 122060, 122064, 122068, 122072, 122076, 122080, 122084, 122088, 122094, + 122100, 122104, 122110, 122116, 122121, 122125, 122130, 122134, 122138, + 122144, 122150, 122154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122158, + 122166, 122169, 122174, 122180, 122188, 122193, 122199, 122207, 122213, + 122219, 122223, 122227, 122234, 122243, 122250, 122259, 122265, 122274, + 122281, 122288, 122295, 122305, 122311, 122315, 122322, 122331, 122341, + 122348, 122355, 122359, 122363, 122370, 122380, 122384, 122391, 122398, + 122405, 122411, 122418, 122425, 122432, 122439, 122443, 122447, 122451, + 122458, 122462, 122469, 122476, 122490, 122499, 122503, 122507, 122511, + 122518, 122522, 122526, 122530, 122538, 122546, 122565, 122575, 122595, + 122599, 122603, 122607, 122611, 122615, 122619, 122623, 122630, 122634, + 122637, 122641, 122645, 122651, 122658, 122667, 122671, 122680, 122689, + 122697, 122701, 122708, 122712, 122716, 122720, 122724, 122735, 122744, + 122753, 122762, 122771, 122783, 122792, 122801, 122810, 122818, 122827, + 122839, 122848, 122856, 122865, 122877, 122886, 122895, 122907, 122916, + 122925, 122937, 122946, 122950, 122954, 122958, 122962, 122966, 122970, + 122974, 122981, 122985, 122989, 123000, 123004, 123008, 123015, 123021, + 123027, 123031, 123038, 123042, 123046, 123050, 123054, 123058, 123062, + 123068, 123076, 123080, 123084, 123087, 123094, 123106, 123110, 123122, + 123129, 123136, 123143, 123150, 123156, 123160, 123164, 123168, 123172, + 123179, 123188, 123195, 123203, 123211, 123217, 123221, 123225, 123229, + 123233, 123239, 123248, 123260, 123267, 123274, 123283, 123294, 123300, + 123309, 123318, 123325, 123334, 123341, 123347, 123357, 123364, 123371, + 123378, 123385, 123389, 123395, 123399, 123410, 123418, 123427, 123439, + 123446, 123453, 123463, 123470, 123479, 123486, 123495, 123502, 123509, + 123519, 123526, 123533, 123542, 123549, 123561, 123570, 123577, 123584, + 123591, 123600, 123610, 123623, 123630, 123639, 123649, 123656, 123665, + 123678, 123685, 123692, 123699, 123709, 123719, 123725, 123735, 123742, + 123749, 123759, 123765, 123772, 123779, 123786, 123796, 123803, 123810, + 123817, 123823, 123830, 123840, 123847, 123851, 123859, 123863, 123875, + 123879, 123893, 123897, 123901, 123905, 123909, 123915, 123922, 123930, + 123934, 123938, 123942, 123946, 123953, 123957, 123963, 123969, 123977, + 123981, 123988, 123996, 124000, 124004, 124010, 124014, 124023, 124032, + 124039, 124049, 124055, 124059, 124063, 124071, 124078, 124085, 124091, + 124095, 124103, 124107, 124114, 124126, 124133, 124143, 124149, 124153, + 124162, 124169, 124178, 124182, 124186, 124193, 124197, 124201, 124205, + 124209, 124212, 124218, 124224, 124228, 124232, 124239, 124246, 124253, + 124260, 124267, 124274, 124281, 124288, 124294, 124298, 124302, 124309, + 124316, 124323, 124330, 124337, 124341, 124344, 124349, 124353, 124357, + 124366, 124375, 124379, 124383, 124389, 124395, 124412, 124418, 124422, + 124431, 124435, 124439, 124446, 124454, 124462, 124468, 124472, 124476, + 124480, 124484, 124487, 124493, 124500, 124510, 124517, 124524, 124531, + 124537, 124544, 124551, 124558, 124565, 124572, 124581, 124588, 124600, + 124607, 124614, 124624, 124635, 124642, 124649, 124656, 124663, 124670, + 124677, 124684, 124691, 124698, 124705, 124715, 124725, 124735, 124742, + 124752, 124759, 124766, 124773, 124780, 124786, 124793, 124800, 124807, + 124814, 124821, 124828, 124835, 124842, 124848, 124855, 124862, 124871, + 124878, 124885, 124889, 124897, 124901, 124905, 124909, 124913, 124917, + 124924, 124928, 124937, 124941, 124948, 124956, 124960, 124964, 124968, + 124981, 124997, 125001, 125005, 125012, 125018, 125025, 125029, 125033, + 125037, 125041, 125045, 125052, 125056, 125074, 125078, 125082, 125089, + 125093, 125097, 125103, 125107, 125111, 125119, 125123, 125127, 125130, + 125134, 125140, 125151, 125160, 125169, 125176, 125183, 125194, 125201, + 125208, 125215, 125222, 125229, 125236, 125243, 125253, 125259, 125266, + 125276, 125285, 125292, 125301, 125311, 125318, 125325, 125332, 125339, + 125351, 125358, 125365, 125372, 125379, 125386, 125396, 125403, 125410, + 125420, 125433, 125445, 125452, 125462, 125469, 125476, 125483, 125497, + 125503, 125511, 125521, 125531, 125538, 125545, 125551, 125555, 125562, + 125572, 125578, 125591, 125595, 125599, 125606, 125610, 125617, 125627, + 125631, 125635, 125639, 125643, 125647, 125654, 125658, 125665, 125672, + 125679, 125688, 125697, 125707, 125714, 125721, 125728, 125738, 125745, + 125755, 125762, 125772, 125779, 125786, 125796, 125806, 125813, 125819, + 125827, 125835, 125841, 125847, 125851, 125855, 125862, 125870, 125876, + 125880, 125884, 125888, 125895, 125907, 125910, 125917, 125923, 125927, + 125931, 125935, 125939, 125943, 125947, 125951, 125955, 125959, 125963, + 125970, 125974, 125980, 125984, 125988, 125992, 125998, 126005, 126012, + 126019, 126030, 126038, 126042, 126048, 126057, 126064, 126070, 126073, + 126077, 126081, 126087, 126096, 126104, 126108, 126114, 126118, 126122, + 126126, 126132, 126139, 126145, 126149, 126155, 126159, 126163, 126172, + 126184, 126188, 126195, 126202, 126212, 126219, 126231, 126238, 126245, + 126252, 126263, 126273, 126286, 126296, 126303, 126307, 126311, 126315, + 126319, 126328, 126337, 126346, 126363, 126372, 126378, 126385, 126393, + 126406, 126410, 126419, 126428, 126437, 126446, 126457, 126466, 126474, + 126483, 126492, 126501, 126510, 126520, 126523, 126527, 126531, 126535, + 126539, 126543, 126549, 126556, 126563, 126570, 126576, 126582, 126589, + 126595, 126602, 126610, 126614, 126621, 126628, 126635, 126643, 126646, + 126650, 126654, 126658, 126661, 126667, 126671, 126677, 126684, 126691, + 126697, 126704, 126711, 126718, 126725, 126732, 126739, 126746, 126753, + 126760, 126767, 126774, 126781, 126788, 126795, 126801, 126805, 126814, + 126818, 126822, 126826, 126830, 126836, 126843, 126850, 126857, 126864, + 126871, 126877, 126885, 126889, 126893, 126897, 126901, 126907, 126924, + 126941, 126945, 126949, 126953, 126957, 126961, 126965, 126971, 126978, + 126982, 126988, 126995, 127002, 127009, 127016, 127023, 127032, 127039, + 127046, 127053, 127060, 127064, 127068, 127074, 127086, 127090, 127094, + 127103, 127107, 127111, 127115, 127121, 127125, 127129, 127138, 127142, + 127146, 127150, 127157, 127161, 127165, 127169, 127173, 127177, 127181, + 127185, 127189, 127195, 127202, 127209, 127215, 127219, 127236, 127242, + 127246, 127253, 127260, 127267, 127274, 127281, 127288, 127292, 127296, + 127300, 127306, 127310, 127316, 127320, 127324, 127331, 127338, 127355, + 127359, 127363, 127367, 127371, 127375, 127387, 127390, 127395, 127400, + 127415, 127425, 127437, 127441, 127445, 127449, 127455, 127462, 127469, + 127479, 127491, 127497, 127503, 127512, 127516, 127520, 127527, 127537, + 127544, 127550, 127554, 127558, 127565, 127571, 127575, 127581, 127585, + 127593, 127599, 127603, 127611, 127619, 127626, 127632, 127639, 127646, + 127656, 127666, 127670, 127674, 127678, 127682, 127688, 127695, 127701, + 127708, 127715, 127722, 127731, 127738, 127745, 127751, 127758, 127765, + 127772, 127779, 127786, 127793, 127799, 127806, 127813, 127820, 127829, + 127836, 127843, 127847, 127853, 127857, 127863, 127870, 127877, 127884, + 127888, 127892, 127896, 127900, 127904, 127911, 127915, 127919, 127925, + 127933, 127937, 127941, 127945, 127949, 127956, 127960, 127964, 127972, + 127976, 127980, 127984, 127988, 127994, 127998, 128002, 128008, 128015, + 128021, 128028, 128040, 128044, 128051, 128058, 128065, 128072, 128084, + 128091, 128095, 128099, 128103, 128110, 128117, 128124, 128131, 128141, + 128148, 128154, 128161, 128168, 128175, 128182, 128191, 128201, 128208, + 128212, 128219, 128223, 128227, 128231, 128238, 128245, 128255, 128261, + 128265, 128274, 128278, 128285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128245, 128251, 128257, - 128264, 128271, 128278, 128285, 128292, 128299, 128305, 128312, 128319, - 128326, 128333, 128340, 128347, 128353, 128359, 128365, 128371, 128377, - 128383, 128389, 128395, 128401, 128408, 128415, 128422, 128429, 128436, - 128443, 128449, 128455, 128461, 128468, 128475, 128481, 128487, 128496, - 128503, 128510, 128517, 128524, 128531, 128538, 128544, 128550, 128556, - 128565, 128572, 128579, 128590, 128601, 128607, 128613, 128619, 128628, - 128635, 128642, 128652, 128662, 128673, 128684, 128696, 128709, 128720, - 128731, 128743, 128756, 128767, 128778, 128789, 128800, 128811, 128823, - 128831, 128839, 128848, 128857, 128866, 128872, 128878, 128884, 128891, - 128901, 128908, 128918, 128923, 128928, 128934, 128940, 128948, 128956, - 128965, 128976, 128987, 128995, 129003, 129012, 129021, 129029, 129036, - 129044, 129052, 129059, 129066, 129075, 129084, 129093, 129102, 129111, - 0, 129120, 129131, 129138, 129146, 129154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129162, 129171, 129178, 129185, 129194, 129201, 129208, 129215, - 129225, 129232, 129239, 129246, 129254, 129261, 129268, 129275, 129286, - 129293, 129300, 129307, 129314, 129321, 129330, 129337, 129343, 129350, - 129359, 129366, 129373, 129380, 129390, 129397, 129404, 129414, 129424, - 129431, 129438, 129445, 129452, 129459, 129466, 129475, 129482, 129489, - 129495, 129503, 129512, 129521, 129532, 129540, 129549, 129558, 129567, - 129576, 129583, 129590, 129599, 129611, 129621, 129628, 129635, 129645, - 129655, 129664, 129674, 129681, 129691, 129698, 129705, 129712, 129722, - 129732, 129739, 129746, 129756, 129762, 129773, 129782, 129792, 129800, - 129813, 129820, 129826, 129834, 129841, 129851, 129855, 129859, 129863, - 129867, 129871, 129875, 129879, 129888, 129892, 129899, 129903, 129907, - 129911, 129915, 129919, 129923, 129927, 129931, 129935, 129939, 129943, - 129947, 129951, 129955, 129959, 129963, 129967, 129971, 129975, 129982, - 129989, 129999, 130012, 130022, 130026, 130030, 130034, 130038, 130042, - 130046, 130050, 130054, 130058, 130062, 130066, 130073, 130080, 130091, - 130098, 130104, 130111, 130118, 130125, 130132, 130139, 130143, 130147, - 130154, 130161, 130168, 130177, 130184, 130197, 130207, 130214, 130221, - 130225, 130229, 130238, 130245, 130252, 130259, 130272, 130279, 130286, - 130296, 130306, 130315, 130322, 130329, 130336, 130343, 130350, 130357, - 130367, 130373, 130381, 130388, 130396, 130403, 130414, 130421, 130427, - 130434, 130441, 130448, 130455, 130465, 130475, 130482, 130489, 130498, - 130506, 130512, 130519, 130526, 130533, 130540, 130544, 130554, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128289, 128295, 128301, + 128308, 128315, 128322, 128329, 128336, 128343, 128349, 128356, 128363, + 128370, 128377, 128384, 128391, 128397, 128403, 128409, 128415, 128421, + 128427, 128433, 128439, 128445, 128452, 128459, 128466, 128473, 128480, + 128487, 128493, 128499, 128505, 128512, 128519, 128525, 128531, 128540, + 128547, 128554, 128561, 128568, 128575, 128582, 128588, 128594, 128600, + 128609, 128616, 128623, 128634, 128645, 128651, 128657, 128663, 128672, + 128679, 128686, 128696, 128706, 128717, 128728, 128740, 128753, 128764, + 128775, 128787, 128800, 128811, 128822, 128833, 128844, 128855, 128867, + 128875, 128883, 128892, 128901, 128910, 128916, 128922, 128928, 128935, + 128945, 128952, 128962, 128967, 128972, 128978, 128984, 128992, 129000, + 129009, 129020, 129031, 129039, 129047, 129056, 129065, 129073, 129080, + 129088, 129096, 129103, 129110, 129119, 129128, 129137, 129146, 129155, + 0, 129164, 129175, 129182, 129190, 129198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 129206, 129215, 129222, 129229, 129238, 129245, 129252, 129259, + 129269, 129276, 129283, 129290, 129298, 129305, 129312, 129319, 129330, + 129337, 129344, 129351, 129358, 129365, 129374, 129381, 129387, 129394, + 129403, 129410, 129417, 129424, 129434, 129441, 129448, 129458, 129468, + 129475, 129482, 129489, 129496, 129503, 129510, 129519, 129526, 129533, + 129539, 129547, 129556, 129565, 129576, 129584, 129593, 129602, 129611, + 129620, 129627, 129634, 129643, 129655, 129665, 129672, 129679, 129689, + 129699, 129708, 129718, 129725, 129735, 129742, 129749, 129756, 129766, + 129776, 129783, 129790, 129800, 129806, 129817, 129826, 129836, 129844, + 129857, 129864, 129870, 129878, 129885, 129895, 129899, 129903, 129907, + 129911, 129915, 129919, 129923, 129932, 129936, 129943, 129947, 129951, + 129955, 129959, 129963, 129967, 129971, 129975, 129979, 129983, 129987, + 129991, 129995, 129999, 130003, 130007, 130011, 130015, 130019, 130026, + 130033, 130043, 130056, 130066, 130070, 130074, 130078, 130082, 130086, + 130090, 130094, 130098, 130102, 130106, 130110, 130117, 130124, 130135, + 130142, 130148, 130155, 130162, 130169, 130176, 130183, 130187, 130191, + 130198, 130205, 130212, 130221, 130228, 130241, 130251, 130258, 130265, + 130269, 130273, 130282, 130289, 130296, 130303, 130316, 130323, 130330, + 130340, 130350, 130359, 130366, 130373, 130380, 130387, 130394, 130401, + 130411, 130417, 130425, 130432, 130440, 130447, 130458, 130465, 130471, + 130478, 130485, 130492, 130499, 130509, 130519, 130526, 130533, 130542, + 130550, 130556, 130563, 130570, 130577, 130584, 130588, 130598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 130564, 130569, 130574, 130579, 130584, 130589, 130594, 130599, - 130604, 130609, 130614, 130619, 130624, 130629, 130634, 130639, 130644, - 130649, 130654, 130659, 130664, 130669, 130674, 130679, 130684, 130689, - 130694, 130699, 130704, 130709, 130714, 130719, 130724, 130729, 130734, - 130739, 130744, 130749, 130754, 130759, 130764, 130769, 130774, 130779, - 130784, 130789, 130794, 130799, 130804, 130809, 130814, 130819, 130824, - 130829, 130834, 130839, 130844, 130849, 130854, 130859, 130864, 130869, - 130874, 130879, 130884, 130889, 130894, 130899, 130904, 130909, 130914, - 130919, 130924, 130929, 130934, 130939, 130944, 130949, 130954, 130959, - 130964, 130969, 130974, 130979, 130984, 130989, 130994, 130999, 131004, - 131009, 131014, 131019, 131024, 131029, 131034, 131039, 131044, 131049, - 131054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131059, 131063, 131067, - 131071, 131075, 131079, 131083, 131087, 131091, 131095, 131099, 131103, - 131107, 131111, 131115, 131119, 131123, 131127, 131131, 131135, 131139, - 131143, 131147, 131151, 131155, 131159, 131163, 131167, 131171, 131175, - 131179, 131183, 131187, 131191, 131195, 131199, 131203, 131207, 131211, - 131215, 131219, 131223, 131227, 131231, 131235, 131239, 131243, 131247, - 131251, 131255, 131259, 131263, 131267, 131271, 131275, 131279, 131283, - 131287, 131291, 131295, 131299, 131303, 131307, 131311, 131315, 131319, - 131323, 131327, 131331, 131335, 131339, 131343, 131347, 131351, 131355, - 131359, 131363, 131367, 131371, 131375, 131379, 131383, 131387, 131391, - 131395, 131399, 131403, 131407, 131411, 131415, 131419, 131423, 131427, - 131431, 131435, 131439, 131443, 131447, 131451, 131455, 131459, 131463, - 131467, 131471, 131475, 131479, 131483, 131487, 131491, 131495, 131499, - 131503, 131507, 131511, 131515, 131519, 131523, 131527, 131531, 131535, - 131539, 131543, 131547, 131551, 131555, 131559, 131563, 131567, 131571, - 131575, 131579, 131583, 131587, 131591, 131595, 131599, 131603, 131607, - 131611, 131615, 131619, 131623, 131627, 131631, 131635, 131639, 131643, - 131647, 131651, 131655, 131659, 131663, 131667, 131671, 131675, 131679, - 131683, 131687, 131691, 131695, 131699, 131703, 131707, 131711, 131715, - 131719, 131723, 131727, 131731, 131735, 131739, 131743, 131747, 131751, - 131755, 131759, 131763, 131767, 131771, 131775, 131779, 131783, 131787, - 131791, 131795, 131799, 131803, 131807, 131811, 131815, 131819, 131823, - 131827, 131831, 131835, 131839, 131843, 131847, 131851, 131855, 131859, - 131863, 131867, 131871, 131875, 131879, 131883, 131887, 131891, 131895, - 131899, 131903, 131907, 131911, 131915, 131919, 131923, 131927, 131931, - 131935, 131939, 131943, 131947, 131951, 131955, 131959, 131963, 131967, - 131971, 131975, 131979, 131983, 131987, 131991, 131995, 131999, 132003, - 132007, 132011, 132015, 132019, 132023, 132027, 132031, 132035, 132039, - 132043, 132047, 132051, 132055, 132059, 132063, 132067, 132071, 132075, - 132079, 132083, 132087, 132091, 132095, 132099, 132103, 132107, 132111, - 132115, 132119, 132123, 132127, 132131, 132135, 132139, 132143, 132147, - 132151, 132155, 132159, 132163, 132167, 132171, 132175, 132179, 132183, - 132187, 132191, 132195, 132199, 132203, 132207, 132211, 132215, 132219, - 132223, 132227, 132231, 132235, 132239, 132243, 132247, 132251, 132255, - 132259, 132263, 132267, 132271, 132275, 132279, 132283, 132287, 132291, - 132295, 132299, 132303, 132307, 132311, 132315, 132319, 132323, 132327, - 132331, 132335, 132339, 132343, 132347, 132351, 132355, 132359, 132363, - 132367, 132371, 132375, 132379, 132383, 132387, 132391, 132395, 132399, - 132403, 132407, 132411, 132415, 132419, 132423, 132427, 132431, 132435, - 132439, 132443, 132447, 132451, 132455, 132459, 132463, 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, - 132943, 132947, 132951, 132955, 132959, 132963, 132967, 132971, 132975, - 132979, 132983, 132987, 132991, 132995, 132999, 133003, 133007, 133011, - 133015, 133019, 133023, 133027, 133031, 133035, 133039, 133043, 133047, - 133051, 133055, 133059, 133063, 133067, 133071, 133075, 133079, 133083, - 133087, 133091, 133095, 133099, 133103, 133107, 133111, 133115, 133119, - 133123, 133127, 133131, 133135, 133139, 133143, 133147, 133151, 133155, - 133159, 133163, 133167, 133171, 133175, 133179, 133183, 133187, 133191, - 133195, 133199, 133203, 133207, 133211, 133215, 133219, 133223, 133227, - 133231, 133235, 133239, 133243, 133247, 133251, 133255, 133259, 133263, - 133267, 133271, 133275, 133279, 133283, 133287, 133291, 133295, 133299, - 133303, 133307, 133311, 133315, 133319, 133323, 133327, 133331, 133335, - 133339, 133343, 133347, 133351, 133355, 133359, 133363, 133367, 133371, - 133375, 133379, 133383, 133387, 133391, 133395, 133399, 133403, 133407, - 133411, 133415, 133419, 133423, 133427, 133431, 133435, 133439, 133443, - 133447, 133451, 133455, 133459, 133463, 133467, 133471, 133475, 133479, - 133483, 133487, 133491, 133495, 133499, 133503, 133507, 133511, 133515, - 133519, 133523, 133527, 133531, 133535, 133539, 133543, 133547, 133551, - 133555, 133559, 133563, 133567, 133571, 133575, 133579, 133583, 133587, - 133591, 133595, 133599, 133603, 133607, 133611, 133615, 133619, 133623, - 133627, 133631, 133635, 133639, 133643, 133647, 133651, 133655, 133659, - 133663, 133667, 133671, 133675, 133679, 133683, 133687, 133691, 133695, - 133699, 133703, 133707, 133711, 133715, 133719, 133723, 133727, 133731, - 133735, 133739, 133743, 133747, 133751, 133755, 133759, 133763, 133767, - 133771, 133775, 133779, 133783, 133787, 133791, 133795, 133799, 133803, - 133807, 133811, 133815, 133819, 133823, 133827, 133831, 133835, 133839, - 133843, 133847, 133851, 133855, 133859, 133863, 133867, 133871, 133875, - 133879, 133883, 133887, 133891, 133895, 133899, 133903, 133907, 133911, - 133915, 133919, 133923, 133927, 133931, 133935, 133939, 133943, 133947, - 133951, 133955, 133959, 133963, 133967, 133971, 133975, 133979, 133983, - 133987, 133991, 133995, 133999, 134003, 134007, 134011, 134015, 134019, - 134023, 134027, 134031, 134035, 134039, 134043, 134047, 134051, 134055, - 134059, 134063, 134067, 134071, 134075, 134079, 134083, 134087, 134091, - 134095, 134099, 134103, 134107, 134111, 134115, 134119, 134123, 134127, - 134131, 134135, 134139, 134143, 134147, 134151, 134155, 134159, 134163, - 134167, 134171, 134175, 134179, 134183, 134187, 134191, 134195, 134199, - 134203, 134207, 134211, 134215, 134219, 134223, 134227, 134231, 134235, - 134239, 134243, 134247, 134251, 134255, 134259, 134263, 134267, 134271, - 134275, 134279, 134283, 134287, 134291, 134295, 134299, 134303, 134307, - 134311, 134315, 134319, 134323, 134327, 134331, 134335, 134339, 134343, - 134347, 134351, 134355, 134359, 134363, 134367, 134371, 134375, 134379, - 134383, 134387, 134391, 134395, 134399, 134403, 134407, 134411, 134415, - 134419, 134423, 134427, 134431, 134435, 134439, 134443, 134447, 134451, - 134455, 134459, 134463, 134467, 134471, 134475, 134479, 134483, 134487, - 134491, 134495, 134499, 134503, 134507, 134511, 134515, 134519, 134523, - 134527, 134531, 134535, 134539, 134543, 134547, 134551, 134555, 134559, - 134563, 134567, 134571, 134575, 134579, 134583, 134587, 134591, 134595, - 134599, 134603, 134607, 134611, 134615, 134619, 134623, 134627, 134631, - 134635, 134639, 134643, 134647, 134651, 134655, 134659, 134663, 134667, - 134671, 134675, 134679, 134683, 134687, 134691, 134695, 134699, 134703, - 134707, 134711, 134715, 134719, 134723, 134727, 134731, 134735, 134739, - 134743, 134747, 134751, 134755, 134759, 134763, 134767, 134771, 134775, - 134779, 134783, 134787, 134791, 134795, 134799, 134803, 134807, 134811, - 134815, 134819, 134823, 134827, 134831, 134835, 134839, 134843, 134847, - 134851, 134855, 134859, 134863, 134867, 134871, 134875, 134879, 134883, - 134887, 134891, 134895, 134899, 134903, 134907, 134911, 134915, 134919, - 134923, 134927, 134931, 134935, 134939, 134943, 134947, 134951, 134955, - 134959, 134963, 134967, 134971, 134975, 134979, 134983, 134987, 134991, - 134995, 134999, 135003, 135007, 135011, 135015, 135019, 135023, 135027, - 135031, 135035, 135039, 135043, 135047, 135051, 135055, 135059, 135063, - 135067, 135071, 135075, 135079, 135083, 135087, 135091, 135095, 135099, - 135103, 135107, 135111, 135115, 135119, 135123, 135127, 135131, 135135, - 135139, 135143, 135147, 135151, 135155, 135159, 135163, 135167, 135171, - 135175, 135179, 135183, 135187, 135191, 135195, 135199, 135203, 135207, - 135211, 135215, 135219, 135223, 135227, 135231, 135235, 135239, 135243, - 135247, 135251, 135255, 135259, 135263, 135267, 135271, 135275, 135279, - 135283, 135287, 135291, 135295, 135299, 135303, 135307, 135311, 135315, - 135319, 135323, 135327, 135331, 135335, 135339, 135343, 135347, 135352, - 135358, 135368, 135378, 135388, 135398, 135404, 135410, 135416, 135424, - 135432, 135440, 135446, 135452, 135460, 135468, 135474, 135480, 135485, - 135490, 135496, 135503, 135510, 135521, 135532, 135541, 135552, 135561, - 135577, 135589, 135600, 135616, 135625, 135637, 135646, 135658, 135670, + 0, 130608, 130613, 130618, 130623, 130628, 130633, 130638, 130643, + 130648, 130653, 130658, 130663, 130668, 130673, 130678, 130683, 130688, + 130693, 130698, 130703, 130708, 130713, 130718, 130723, 130728, 130733, + 130738, 130743, 130748, 130753, 130758, 130763, 130768, 130773, 130778, + 130783, 130788, 130793, 130798, 130803, 130808, 130813, 130818, 130823, + 130828, 130833, 130838, 130843, 130848, 130853, 130858, 130863, 130868, + 130873, 130878, 130883, 130888, 130893, 130898, 130903, 130908, 130913, + 130918, 130923, 130928, 130933, 130938, 130943, 130948, 130953, 130958, + 130963, 130968, 130973, 130978, 130983, 130988, 130993, 130998, 131003, + 131008, 131013, 131018, 131023, 131028, 131033, 131038, 131043, 131048, + 131053, 131058, 131063, 131068, 131073, 131078, 131083, 131088, 131093, + 131098, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131103, 131107, 131111, + 131115, 131119, 131123, 131127, 131131, 131135, 131139, 131143, 131147, + 131151, 131155, 131159, 131163, 131167, 131171, 131175, 131179, 131183, + 131187, 131191, 131195, 131199, 131203, 131207, 131211, 131215, 131219, + 131223, 131227, 131231, 131235, 131239, 131243, 131247, 131251, 131255, + 131259, 131263, 131267, 131271, 131275, 131279, 131283, 131287, 131291, + 131295, 131299, 131303, 131307, 131311, 131315, 131319, 131323, 131327, + 131331, 131335, 131339, 131343, 131347, 131351, 131355, 131359, 131363, + 131367, 131371, 131375, 131379, 131383, 131387, 131391, 131395, 131399, + 131403, 131407, 131411, 131415, 131419, 131423, 131427, 131431, 131435, + 131439, 131443, 131447, 131451, 131455, 131459, 131463, 131467, 131471, + 131475, 131479, 131483, 131487, 131491, 131495, 131499, 131503, 131507, + 131511, 131515, 131519, 131523, 131527, 131531, 131535, 131539, 131543, + 131547, 131551, 131555, 131559, 131563, 131567, 131571, 131575, 131579, + 131583, 131587, 131591, 131595, 131599, 131603, 131607, 131611, 131615, + 131619, 131623, 131627, 131631, 131635, 131639, 131643, 131647, 131651, + 131655, 131659, 131663, 131667, 131671, 131675, 131679, 131683, 131687, + 131691, 131695, 131699, 131703, 131707, 131711, 131715, 131719, 131723, + 131727, 131731, 131735, 131739, 131743, 131747, 131751, 131755, 131759, + 131763, 131767, 131771, 131775, 131779, 131783, 131787, 131791, 131795, + 131799, 131803, 131807, 131811, 131815, 131819, 131823, 131827, 131831, + 131835, 131839, 131843, 131847, 131851, 131855, 131859, 131863, 131867, + 131871, 131875, 131879, 131883, 131887, 131891, 131895, 131899, 131903, + 131907, 131911, 131915, 131919, 131923, 131927, 131931, 131935, 131939, + 131943, 131947, 131951, 131955, 131959, 131963, 131967, 131971, 131975, + 131979, 131983, 131987, 131991, 131995, 131999, 132003, 132007, 132011, + 132015, 132019, 132023, 132027, 132031, 132035, 132039, 132043, 132047, + 132051, 132055, 132059, 132063, 132067, 132071, 132075, 132079, 132083, + 132087, 132091, 132095, 132099, 132103, 132107, 132111, 132115, 132119, + 132123, 132127, 132131, 132135, 132139, 132143, 132147, 132151, 132155, + 132159, 132163, 132167, 132171, 132175, 132179, 132183, 132187, 132191, + 132195, 132199, 132203, 132207, 132211, 132215, 132219, 132223, 132227, + 132231, 132235, 132239, 132243, 132247, 132251, 132255, 132259, 132263, + 132267, 132271, 132275, 132279, 132283, 132287, 132291, 132295, 132299, + 132303, 132307, 132311, 132315, 132319, 132323, 132327, 132331, 132335, + 132339, 132343, 132347, 132351, 132355, 132359, 132363, 132367, 132371, + 132375, 132379, 132383, 132387, 132391, 132395, 132399, 132403, 132407, + 132411, 132415, 132419, 132423, 132427, 132431, 132435, 132439, 132443, + 132447, 132451, 132455, 132459, 132463, 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, 132943, 132947, + 132951, 132955, 132959, 132963, 132967, 132971, 132975, 132979, 132983, + 132987, 132991, 132995, 132999, 133003, 133007, 133011, 133015, 133019, + 133023, 133027, 133031, 133035, 133039, 133043, 133047, 133051, 133055, + 133059, 133063, 133067, 133071, 133075, 133079, 133083, 133087, 133091, + 133095, 133099, 133103, 133107, 133111, 133115, 133119, 133123, 133127, + 133131, 133135, 133139, 133143, 133147, 133151, 133155, 133159, 133163, + 133167, 133171, 133175, 133179, 133183, 133187, 133191, 133195, 133199, + 133203, 133207, 133211, 133215, 133219, 133223, 133227, 133231, 133235, + 133239, 133243, 133247, 133251, 133255, 133259, 133263, 133267, 133271, + 133275, 133279, 133283, 133287, 133291, 133295, 133299, 133303, 133307, + 133311, 133315, 133319, 133323, 133327, 133331, 133335, 133339, 133343, + 133347, 133351, 133355, 133359, 133363, 133367, 133371, 133375, 133379, + 133383, 133387, 133391, 133395, 133399, 133403, 133407, 133411, 133415, + 133419, 133423, 133427, 133431, 133435, 133439, 133443, 133447, 133451, + 133455, 133459, 133463, 133467, 133471, 133475, 133479, 133483, 133487, + 133491, 133495, 133499, 133503, 133507, 133511, 133515, 133519, 133523, + 133527, 133531, 133535, 133539, 133543, 133547, 133551, 133555, 133559, + 133563, 133567, 133571, 133575, 133579, 133583, 133587, 133591, 133595, + 133599, 133603, 133607, 133611, 133615, 133619, 133623, 133627, 133631, + 133635, 133639, 133643, 133647, 133651, 133655, 133659, 133663, 133667, + 133671, 133675, 133679, 133683, 133687, 133691, 133695, 133699, 133703, + 133707, 133711, 133715, 133719, 133723, 133727, 133731, 133735, 133739, + 133743, 133747, 133751, 133755, 133759, 133763, 133767, 133771, 133775, + 133779, 133783, 133787, 133791, 133795, 133799, 133803, 133807, 133811, + 133815, 133819, 133823, 133827, 133831, 133835, 133839, 133843, 133847, + 133851, 133855, 133859, 133863, 133867, 133871, 133875, 133879, 133883, + 133887, 133891, 133895, 133899, 133903, 133907, 133911, 133915, 133919, + 133923, 133927, 133931, 133935, 133939, 133943, 133947, 133951, 133955, + 133959, 133963, 133967, 133971, 133975, 133979, 133983, 133987, 133991, + 133995, 133999, 134003, 134007, 134011, 134015, 134019, 134023, 134027, + 134031, 134035, 134039, 134043, 134047, 134051, 134055, 134059, 134063, + 134067, 134071, 134075, 134079, 134083, 134087, 134091, 134095, 134099, + 134103, 134107, 134111, 134115, 134119, 134123, 134127, 134131, 134135, + 134139, 134143, 134147, 134151, 134155, 134159, 134163, 134167, 134171, + 134175, 134179, 134183, 134187, 134191, 134195, 134199, 134203, 134207, + 134211, 134215, 134219, 134223, 134227, 134231, 134235, 134239, 134243, + 134247, 134251, 134255, 134259, 134263, 134267, 134271, 134275, 134279, + 134283, 134287, 134291, 134295, 134299, 134303, 134307, 134311, 134315, + 134319, 134323, 134327, 134331, 134335, 134339, 134343, 134347, 134351, + 134355, 134359, 134363, 134367, 134371, 134375, 134379, 134383, 134387, + 134391, 134395, 134399, 134403, 134407, 134411, 134415, 134419, 134423, + 134427, 134431, 134435, 134439, 134443, 134447, 134451, 134455, 134459, + 134463, 134467, 134471, 134475, 134479, 134483, 134487, 134491, 134495, + 134499, 134503, 134507, 134511, 134515, 134519, 134523, 134527, 134531, + 134535, 134539, 134543, 134547, 134551, 134555, 134559, 134563, 134567, + 134571, 134575, 134579, 134583, 134587, 134591, 134595, 134599, 134603, + 134607, 134611, 134615, 134619, 134623, 134627, 134631, 134635, 134639, + 134643, 134647, 134651, 134655, 134659, 134663, 134667, 134671, 134675, + 134679, 134683, 134687, 134691, 134695, 134699, 134703, 134707, 134711, + 134715, 134719, 134723, 134727, 134731, 134735, 134739, 134743, 134747, + 134751, 134755, 134759, 134763, 134767, 134771, 134775, 134779, 134783, + 134787, 134791, 134795, 134799, 134803, 134807, 134811, 134815, 134819, + 134823, 134827, 134831, 134835, 134839, 134843, 134847, 134851, 134855, + 134859, 134863, 134867, 134871, 134875, 134879, 134883, 134887, 134891, + 134895, 134899, 134903, 134907, 134911, 134915, 134919, 134923, 134927, + 134931, 134935, 134939, 134943, 134947, 134951, 134955, 134959, 134963, + 134967, 134971, 134975, 134979, 134983, 134987, 134991, 134995, 134999, + 135003, 135007, 135011, 135015, 135019, 135023, 135027, 135031, 135035, + 135039, 135043, 135047, 135051, 135055, 135059, 135063, 135067, 135071, + 135075, 135079, 135083, 135087, 135091, 135095, 135099, 135103, 135107, + 135111, 135115, 135119, 135123, 135127, 135131, 135135, 135139, 135143, + 135147, 135151, 135155, 135159, 135163, 135167, 135171, 135175, 135179, + 135183, 135187, 135191, 135195, 135199, 135203, 135207, 135211, 135215, + 135219, 135223, 135227, 135231, 135235, 135239, 135243, 135247, 135251, + 135255, 135259, 135263, 135267, 135271, 135275, 135279, 135283, 135287, + 135291, 135295, 135299, 135303, 135307, 135311, 135315, 135319, 135323, + 135327, 135331, 135335, 135339, 135343, 135347, 135351, 135355, 135359, + 135363, 135367, 135371, 135375, 135379, 135383, 135387, 135391, 135396, + 135402, 135412, 135422, 135432, 135442, 135448, 135454, 135460, 135468, + 135476, 135484, 135490, 135496, 135504, 135512, 135518, 135524, 135529, + 135534, 135540, 135547, 135554, 135565, 135576, 135585, 135596, 135605, + 135621, 135633, 135644, 135660, 135669, 135681, 135690, 135702, 135714, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135675, 135679, - 135683, 135687, 135691, 135695, 135699, 135703, 135707, 135711, 135715, - 135719, 135723, 135727, 135731, 135735, 135739, 135743, 135747, 135751, - 135755, 135759, 135763, 135767, 135771, 135775, 135779, 135783, 135787, - 135791, 135795, 135799, 135803, 135807, 135811, 135815, 135819, 135823, - 135827, 135831, 135835, 135839, 135843, 135847, 135851, 135855, 135859, - 135863, 135867, 135871, 135875, 135879, 135883, 135887, 135891, 135895, - 135899, 135903, 135907, 135911, 135915, 135919, 135923, 135927, 135931, - 135935, 135939, 135943, 135947, 135951, 135955, 135959, 135963, 135967, - 135971, 135975, 135979, 135983, 135987, 135991, 135995, 135999, 136003, - 136007, 136011, 136015, 136019, 136023, 136027, 136031, 136035, 136039, - 136043, 136047, 136051, 136055, 136059, 136063, 136067, 136071, 136075, - 136079, 136083, 136087, 136091, 136095, 136099, 136103, 136107, 136111, - 136115, 136119, 136123, 136127, 136131, 136135, 136139, 136143, 136147, - 136151, 136155, 136159, 136163, 136167, 136171, 136175, 136179, 136183, - 136187, 136191, 136195, 136199, 136203, 136207, 136211, 136215, 136219, - 136223, 136227, 136231, 136235, 136239, 136243, 136247, 136251, 136255, - 136259, 136263, 136267, 136271, 136275, 136279, 136283, 136287, 136291, - 136295, 136299, 136303, 136307, 136311, 136315, 136319, 136323, 136327, - 136331, 136335, 136339, 136343, 136347, 136351, 136355, 136359, 136363, - 136367, 136371, 136375, 136379, 136383, 136387, 136391, 136395, 136399, - 136403, 136407, 136411, 136415, 136419, 136423, 136427, 136431, 136435, - 136439, 136443, 136447, 136451, 136455, 136459, 136463, 136467, 136471, - 136475, 136479, 136483, 136487, 136491, 136495, 136499, 136503, 136507, - 136511, 136515, 136519, 136523, 136527, 136531, 136535, 136539, 136543, - 136547, 136551, 136555, 136559, 136563, 136567, 136571, 136575, 136579, - 136583, 136587, 136591, 136595, 136599, 136603, 136607, 136611, 136615, - 136619, 136623, 136627, 136631, 136635, 136639, 136643, 136647, 136651, - 136655, 136659, 136663, 136667, 136671, 136675, 136679, 136683, 136687, - 136691, 136695, 136699, 136703, 136707, 136711, 136715, 136719, 136723, - 136727, 136731, 136735, 136739, 136743, 136747, 136751, 136755, 136759, - 136763, 136767, 136771, 136775, 136779, 136783, 136787, 136791, 136795, - 136799, 136803, 136807, 136811, 136815, 136819, 136823, 136827, 136831, - 136835, 136839, 136843, 136847, 136851, 136855, 136859, 136863, 136867, - 136871, 136875, 136879, 136883, 136887, 136891, 136895, 136899, 136903, - 136907, 136911, 136915, 136919, 136923, 136927, 136931, 136935, 136939, - 136943, 136947, 136951, 136955, 136959, 136963, 136967, 136971, 136975, - 136979, 136983, 136987, 136991, 136995, 136999, 137003, 137007, 137011, - 137015, 137019, 137023, 137027, 137031, 137035, 137039, 137043, 137047, - 137051, 137055, 137059, 137063, 137067, 137071, 137075, 137079, 137083, - 137087, 137091, 137095, 137099, 137103, 137107, 137111, 137115, 137119, - 137123, 137127, 137131, 137135, 137139, 137143, 137147, 137151, 137155, - 137159, 137163, 137167, 137171, 137175, 137179, 137183, 137187, 137191, - 137195, 137199, 137203, 137207, 137211, 137215, 137219, 137223, 137227, - 137231, 137235, 137239, 137243, 137247, 137251, 137255, 137259, 137263, - 137267, 137271, 137275, 137279, 137283, 137287, 137291, 137295, 137299, - 137303, 137307, 137311, 137315, 137319, 137323, 137327, 137331, 137335, - 137339, 137343, 137347, 137351, 137355, 137359, 137363, 137367, 137371, - 137375, 137379, 137383, 137387, 137391, 137395, 137399, 137403, 137407, - 137417, 137421, 137425, 137429, 137433, 137437, 137441, 137445, 137449, - 137453, 137457, 137461, 137466, 137470, 137474, 137478, 137482, 137486, - 137490, 137494, 137498, 137502, 137506, 137510, 137514, 137518, 137522, - 137526, 137530, 137539, 137548, 137552, 137556, 137560, 137564, 137568, - 137572, 137576, 137580, 137584, 137588, 137592, 137596, 137600, 137604, - 137608, 137612, 137616, 137620, 137624, 137628, 137632, 137636, 137640, - 137644, 137648, 137652, 137656, 137660, 137664, 137668, 137672, 137676, - 137680, 137684, 137688, 137692, 137696, 137700, 137704, 137708, 137712, - 137716, 137720, 137724, 137728, 137732, 137736, 137740, 137744, 137748, - 137752, 137756, 137760, 137764, 137768, 137772, 137776, 137780, 137784, - 137788, 137792, 137796, 137800, 137804, 137808, 137812, 137816, 137820, - 137824, 137828, 137832, 137836, 137840, 137844, 137848, 137852, 137856, - 137860, 137864, 137868, 137872, 137876, 137880, 137884, 137888, 137892, - 137896, 137900, 137904, 137908, 137912, 137916, 137920, 137924, 137928, - 137932, 137936, 137940, 137944, 137948, 137952, 137956, 137960, 137964, - 137968, 137972, 137976, 137980, 137984, 137988, 137992, 137996, 138000, - 138004, 138008, 138012, 138016, 138020, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135719, 135723, + 135727, 135731, 135735, 135739, 135743, 135747, 135751, 135755, 135759, + 135763, 135767, 135771, 135775, 135779, 135783, 135787, 135791, 135795, + 135799, 135803, 135807, 135811, 135815, 135819, 135823, 135827, 135831, + 135835, 135839, 135843, 135847, 135851, 135855, 135859, 135863, 135867, + 135871, 135875, 135879, 135883, 135887, 135891, 135895, 135899, 135903, + 135907, 135911, 135915, 135919, 135923, 135927, 135931, 135935, 135939, + 135943, 135947, 135951, 135955, 135959, 135963, 135967, 135971, 135975, + 135979, 135983, 135987, 135991, 135995, 135999, 136003, 136007, 136011, + 136015, 136019, 136023, 136027, 136031, 136035, 136039, 136043, 136047, + 136051, 136055, 136059, 136063, 136067, 136071, 136075, 136079, 136083, + 136087, 136091, 136095, 136099, 136103, 136107, 136111, 136115, 136119, + 136123, 136127, 136131, 136135, 136139, 136143, 136147, 136151, 136155, + 136159, 136163, 136167, 136171, 136175, 136179, 136183, 136187, 136191, + 136195, 136199, 136203, 136207, 136211, 136215, 136219, 136223, 136227, + 136231, 136235, 136239, 136243, 136247, 136251, 136255, 136259, 136263, + 136267, 136271, 136275, 136279, 136283, 136287, 136291, 136295, 136299, + 136303, 136307, 136311, 136315, 136319, 136323, 136327, 136331, 136335, + 136339, 136343, 136347, 136351, 136355, 136359, 136363, 136367, 136371, + 136375, 136379, 136383, 136387, 136391, 136395, 136399, 136403, 136407, + 136411, 136415, 136419, 136423, 136427, 136431, 136435, 136439, 136443, + 136447, 136451, 136455, 136459, 136463, 136467, 136471, 136475, 136479, + 136483, 136487, 136491, 136495, 136499, 136503, 136507, 136511, 136515, + 136519, 136523, 136527, 136531, 136535, 136539, 136543, 136547, 136551, + 136555, 136559, 136563, 136567, 136571, 136575, 136579, 136583, 136587, + 136591, 136595, 136599, 136603, 136607, 136611, 136615, 136619, 136623, + 136627, 136631, 136635, 136639, 136643, 136647, 136651, 136655, 136659, + 136663, 136667, 136671, 136675, 136679, 136683, 136687, 136691, 136695, + 136699, 136703, 136707, 136711, 136715, 136719, 136723, 136727, 136731, + 136735, 136739, 136743, 136747, 136751, 136755, 136759, 136763, 136767, + 136771, 136775, 136779, 136783, 136787, 136791, 136795, 136799, 136803, + 136807, 136811, 136815, 136819, 136823, 136827, 136831, 136835, 136839, + 136843, 136847, 136851, 136855, 136859, 136863, 136867, 136871, 136875, + 136879, 136883, 136887, 136891, 136895, 136899, 136903, 136907, 136911, + 136915, 136919, 136923, 136927, 136931, 136935, 136939, 136943, 136947, + 136951, 136955, 136959, 136963, 136967, 136971, 136975, 136979, 136983, + 136987, 136991, 136995, 136999, 137003, 137007, 137011, 137015, 137019, + 137023, 137027, 137031, 137035, 137039, 137043, 137047, 137051, 137055, + 137059, 137063, 137067, 137071, 137075, 137079, 137083, 137087, 137091, + 137095, 137099, 137103, 137107, 137111, 137115, 137119, 137123, 137127, + 137131, 137135, 137139, 137143, 137147, 137151, 137155, 137159, 137163, + 137167, 137171, 137175, 137179, 137183, 137187, 137191, 137195, 137199, + 137203, 137207, 137211, 137215, 137219, 137223, 137227, 137231, 137235, + 137239, 137243, 137247, 137251, 137255, 137259, 137263, 137267, 137271, + 137275, 137279, 137283, 137287, 137291, 137295, 137299, 137303, 137307, + 137311, 137315, 137319, 137323, 137327, 137331, 137335, 137339, 137343, + 137347, 137351, 137355, 137359, 137363, 137367, 137371, 137375, 137379, + 137383, 137387, 137391, 137395, 137399, 137403, 137407, 137411, 137415, + 137419, 137423, 137427, 137431, 137435, 137439, 137443, 137447, 137451, + 137461, 137465, 137469, 137473, 137477, 137481, 137485, 137489, 137493, + 137497, 137501, 137505, 137510, 137514, 137518, 137522, 137526, 137530, + 137534, 137538, 137542, 137546, 137550, 137554, 137558, 137562, 137566, + 137570, 137574, 137583, 137592, 137596, 137600, 137604, 137608, 137612, + 137616, 137620, 137624, 137628, 137632, 137636, 137640, 137644, 137648, + 137652, 137656, 137660, 137664, 137668, 137672, 137676, 137680, 137684, + 137688, 137692, 137696, 137700, 137704, 137708, 137712, 137716, 137720, + 137724, 137728, 137732, 137736, 137740, 137744, 137748, 137752, 137756, + 137760, 137764, 137768, 137772, 137776, 137780, 137784, 137788, 137792, + 137796, 137800, 137804, 137808, 137812, 137816, 137820, 137824, 137828, + 137832, 137836, 137840, 137844, 137848, 137852, 137856, 137860, 137864, + 137868, 137872, 137876, 137880, 137884, 137888, 137892, 137896, 137900, + 137904, 137908, 137912, 137916, 137920, 137924, 137928, 137932, 137936, + 137940, 137944, 137948, 137952, 137956, 137960, 137964, 137968, 137972, + 137976, 137980, 137984, 137988, 137992, 137996, 138000, 138004, 138008, + 138012, 138016, 138020, 138024, 138028, 138032, 138036, 138040, 138044, + 138048, 138052, 138056, 138060, 138064, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138024, - 138032, 138040, 138050, 138060, 138068, 138074, 138082, 138090, 138100, - 138112, 138124, 138130, 138138, 138144, 138150, 138156, 138162, 138168, - 138174, 138180, 138186, 138192, 138198, 138204, 138212, 138220, 138226, - 138232, 138238, 138244, 138252, 138260, 138269, 138275, 138283, 138289, - 138295, 138301, 138307, 138313, 138321, 138329, 138335, 138341, 138347, - 138353, 138359, 138365, 138371, 138377, 138383, 138389, 138395, 138401, - 138407, 138413, 138419, 138425, 138431, 138437, 138443, 138451, 138457, - 138463, 138473, 138481, 138487, 138493, 138499, 138505, 138511, 138517, - 138523, 138529, 138535, 138541, 138547, 138553, 138559, 138565, 138571, - 138577, 138583, 138589, 138595, 138601, 138607, 138613, 138621, 138627, - 138635, 138643, 138651, 138657, 138663, 138669, 138675, 138681, 138689, - 138699, 138707, 138715, 138721, 138727, 138735, 138743, 138749, 138757, - 138765, 138773, 138779, 138785, 138791, 138797, 138803, 138809, 138817, - 138825, 138831, 138837, 138843, 138849, 138855, 138863, 138869, 138875, - 138881, 138887, 138893, 138899, 138907, 138913, 138919, 138925, 138931, - 138939, 138947, 138953, 138959, 138965, 138970, 138976, 138982, 138990, - 138996, 139002, 139008, 139014, 139020, 139026, 139032, 139038, 139044, - 139054, 139062, 139068, 139074, 139080, 139088, 139094, 139100, 139106, - 139114, 139120, 139126, 139132, 139138, 139144, 139150, 139156, 139162, - 139168, 139174, 139180, 139188, 139194, 139202, 139208, 139214, 139222, - 139228, 139234, 139240, 139246, 139252, 139258, 139264, 139270, 139276, - 139282, 139288, 139294, 139300, 139306, 139312, 139318, 139324, 139330, - 139336, 139344, 139350, 139356, 139362, 139368, 139374, 139380, 139386, - 139392, 139398, 139404, 139410, 139416, 139422, 139430, 139436, 139442, - 139450, 139456, 139462, 139468, 139474, 139480, 139486, 139492, 139498, - 139504, 139510, 139518, 139524, 139530, 139536, 139542, 139548, 139556, - 139564, 139570, 139576, 139582, 139588, 139594, 139600, 139605, 139610, - 139615, 139620, 139625, 139630, 139635, 139640, 139645, 139650, 139655, - 139660, 139665, 139670, 139675, 139680, 139685, 139690, 139695, 139700, - 139705, 139710, 139715, 139720, 139725, 139730, 139735, 139740, 139745, - 139750, 139757, 139762, 139767, 139772, 139777, 139782, 139787, 139792, - 139797, 139802, 139807, 139812, 139817, 139822, 139827, 139832, 139837, - 139842, 139847, 139852, 139857, 139862, 139867, 139872, 139877, 139882, - 139887, 139892, 139897, 139902, 139907, 139912, 139917, 139922, 139927, - 139932, 139937, 139942, 139947, 139952, 139957, 139962, 139967, 139972, - 139977, 139982, 139987, 139992, 139997, 140002, 140007, 140012, 140017, - 140022, 140027, 140032, 140037, 140042, 140047, 140054, 140059, 140064, - 140069, 140074, 140079, 140084, 140089, 140094, 140099, 140104, 140109, - 140114, 140119, 140124, 140129, 140134, 140139, 140144, 140149, 140154, - 140159, 140166, 140171, 140176, 140182, 140187, 140192, 140197, 140202, - 140207, 140212, 140217, 140222, 140227, 140232, 140237, 140242, 140247, - 140252, 140257, 140262, 140267, 140272, 140277, 140282, 140287, 140292, - 140297, 140302, 140307, 140312, 140317, 140322, 140327, 140332, 140337, - 140342, 140347, 140352, 140357, 140362, 140367, 140372, 140377, 140382, - 140387, 140392, 140397, 140404, 140409, 140414, 140421, 140428, 140433, - 140438, 140443, 140448, 140453, 140458, 140463, 140468, 140473, 140478, - 140483, 140488, 140493, 140498, 140503, 140508, 140513, 140518, 140523, - 140528, 140533, 140538, 140543, 140548, 140553, 140560, 140565, 140570, - 140575, 140580, 140585, 140590, 140595, 140600, 140605, 140610, 140615, - 140620, 140625, 140630, 140635, 140640, 140645, 140650, 140657, 140662, - 140667, 140672, 140677, 140682, 140687, 140692, 140698, 140703, 140708, - 140713, 140718, 140723, 140728, 140733, 140738, 140745, 140752, 140757, - 140762, 140766, 140771, 140775, 140779, 140784, 140791, 140796, 140801, - 140810, 140815, 140820, 140825, 140830, 140837, 140844, 140849, 140854, - 140859, 140864, 140871, 140876, 140881, 140886, 140891, 140896, 140901, - 140906, 140911, 140916, 140921, 140926, 140931, 140938, 140942, 140947, - 140952, 140957, 140962, 140966, 140971, 140976, 140981, 140986, 140991, - 140996, 141001, 141006, 141011, 141017, 141023, 141029, 141035, 141041, - 141046, 141052, 141058, 141064, 141070, 141076, 141082, 141088, 141094, - 141100, 141106, 141112, 141118, 141124, 141130, 141136, 141142, 141148, - 141154, 141159, 141165, 141171, 141177, 141183, 141189, 141195, 141201, - 141207, 141213, 141219, 141225, 141231, 141237, 141243, 141249, 141255, - 141261, 141267, 141273, 141279, 141284, 141290, 141296, 141302, 141308, - 141314, 0, 0, 0, 0, 0, 0, 0, 141320, 141325, 141330, 141335, 141340, - 141345, 141350, 141354, 141359, 141364, 141369, 141374, 141379, 141384, - 141389, 141394, 141399, 141403, 141408, 141412, 141417, 141422, 141427, - 141432, 141437, 141441, 141446, 141451, 141455, 141460, 141465, 0, - 141470, 141475, 141479, 141483, 141487, 141491, 141495, 141499, 141503, - 141507, 0, 0, 0, 0, 141511, 141515, 141520, 141525, 141530, 141535, - 141540, 141545, 141550, 141555, 141560, 141565, 141570, 141575, 141580, - 141585, 141590, 141595, 141600, 141605, 141610, 141615, 141620, 141625, - 141630, 141635, 141640, 141645, 141650, 141655, 141660, 141665, 141670, - 141675, 141680, 141686, 141692, 141699, 141706, 141711, 141716, 141721, - 141726, 141731, 141736, 141741, 141746, 141751, 141756, 141761, 141766, - 141770, 141775, 141780, 141785, 141789, 141793, 141798, 141802, 141807, - 141812, 141817, 141821, 141825, 141829, 141833, 141838, 141843, 141848, - 141852, 141857, 141862, 141867, 141872, 141877, 141882, 141887, 141892, - 141897, 141902, 141907, 0, 141912, 141917, 141921, 141925, 141929, - 141933, 141937, 141941, 141945, 141949, 0, 0, 0, 0, 0, 0, 141953, 141960, - 141966, 141973, 141980, 141987, 141994, 142001, 142008, 142015, 142022, - 142029, 142036, 142043, 142050, 142057, 142064, 142071, 142077, 142084, - 142091, 142098, 142104, 142111, 142117, 142123, 142130, 142136, 142143, - 142149, 0, 0, 142155, 142163, 142171, 142180, 142189, 142198, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 142206, 142211, 142216, 142221, 142226, 142231, 142236, - 142241, 142246, 142251, 142256, 142261, 142266, 142271, 142276, 142281, - 142286, 142291, 142296, 142301, 142306, 142311, 142316, 142321, 142326, - 142331, 142336, 142341, 142346, 142351, 142356, 142361, 142366, 142371, - 142376, 142381, 142386, 142391, 142396, 142401, 142406, 142411, 142416, - 142421, 142426, 142431, 142436, 142441, 142446, 142453, 142460, 142467, - 142474, 142481, 142488, 142495, 142502, 142511, 142518, 142525, 142532, - 142539, 142546, 142553, 142560, 142567, 142574, 142581, 142588, 142593, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142602, 142607, 142611, 142615, 142619, - 142623, 142627, 142631, 142635, 142639, 0, 142643, 142648, 142653, - 142660, 142665, 142672, 142679, 0, 142684, 142691, 142696, 142701, - 142708, 142715, 142720, 142725, 142730, 142735, 142740, 142747, 142754, - 142759, 142764, 142769, 142782, 142791, 142798, 142807, 142816, 0, 0, 0, - 0, 0, 142825, 142832, 142839, 142846, 142853, 142860, 142867, 142874, - 142881, 142888, 142895, 142902, 142909, 142916, 142923, 142930, 142937, - 142944, 142951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138068, + 138076, 138084, 138094, 138104, 138112, 138118, 138126, 138134, 138144, + 138156, 138168, 138174, 138182, 138188, 138194, 138200, 138206, 138212, + 138218, 138224, 138230, 138236, 138242, 138248, 138256, 138264, 138270, + 138276, 138282, 138288, 138296, 138304, 138313, 138319, 138327, 138333, + 138339, 138345, 138351, 138357, 138365, 138373, 138379, 138385, 138391, + 138397, 138403, 138409, 138415, 138421, 138427, 138433, 138439, 138445, + 138451, 138457, 138463, 138469, 138475, 138481, 138487, 138495, 138501, + 138507, 138517, 138525, 138531, 138537, 138543, 138549, 138555, 138561, + 138567, 138573, 138579, 138585, 138591, 138597, 138603, 138609, 138615, + 138621, 138627, 138633, 138639, 138645, 138651, 138657, 138665, 138671, + 138679, 138687, 138695, 138701, 138707, 138713, 138719, 138725, 138733, + 138743, 138751, 138759, 138765, 138771, 138779, 138787, 138793, 138801, + 138809, 138817, 138823, 138829, 138835, 138841, 138847, 138853, 138861, + 138869, 138875, 138881, 138887, 138893, 138899, 138907, 138913, 138919, + 138925, 138931, 138937, 138943, 138951, 138957, 138963, 138969, 138975, + 138983, 138991, 138997, 139003, 139009, 139014, 139020, 139026, 139034, + 139040, 139046, 139052, 139058, 139064, 139070, 139076, 139082, 139088, + 139098, 139106, 139112, 139118, 139124, 139132, 139138, 139144, 139150, + 139158, 139164, 139170, 139176, 139182, 139188, 139194, 139200, 139206, + 139212, 139218, 139224, 139232, 139238, 139246, 139252, 139258, 139266, + 139272, 139278, 139284, 139290, 139296, 139302, 139308, 139314, 139320, + 139326, 139332, 139338, 139344, 139350, 139356, 139362, 139368, 139374, + 139380, 139388, 139394, 139400, 139406, 139412, 139418, 139424, 139430, + 139436, 139442, 139448, 139454, 139460, 139466, 139474, 139480, 139486, + 139494, 139500, 139506, 139512, 139518, 139524, 139530, 139536, 139542, + 139548, 139554, 139562, 139568, 139574, 139580, 139586, 139592, 139600, + 139608, 139614, 139620, 139626, 139632, 139638, 139644, 139649, 139654, + 139659, 139664, 139669, 139674, 139679, 139684, 139689, 139694, 139699, + 139704, 139709, 139714, 139719, 139724, 139729, 139734, 139739, 139744, + 139749, 139754, 139759, 139764, 139769, 139774, 139779, 139784, 139789, + 139794, 139801, 139806, 139811, 139816, 139821, 139826, 139831, 139836, + 139841, 139846, 139851, 139856, 139861, 139866, 139871, 139876, 139881, + 139886, 139891, 139896, 139901, 139906, 139911, 139916, 139921, 139926, + 139931, 139936, 139941, 139946, 139951, 139956, 139961, 139966, 139971, + 139976, 139981, 139986, 139991, 139996, 140001, 140006, 140011, 140016, + 140021, 140026, 140031, 140036, 140041, 140046, 140051, 140056, 140061, + 140066, 140071, 140076, 140081, 140086, 140091, 140098, 140103, 140108, + 140113, 140118, 140123, 140128, 140133, 140138, 140143, 140148, 140153, + 140158, 140163, 140168, 140173, 140178, 140183, 140188, 140193, 140198, + 140203, 140210, 140215, 140220, 140226, 140231, 140236, 140241, 140246, + 140251, 140256, 140261, 140266, 140271, 140276, 140281, 140286, 140291, + 140296, 140301, 140306, 140311, 140316, 140321, 140326, 140331, 140336, + 140341, 140346, 140351, 140356, 140361, 140366, 140371, 140376, 140381, + 140386, 140391, 140396, 140401, 140406, 140411, 140416, 140421, 140426, + 140431, 140436, 140441, 140448, 140453, 140458, 140465, 140472, 140477, + 140482, 140487, 140492, 140497, 140502, 140507, 140512, 140517, 140522, + 140527, 140532, 140537, 140542, 140547, 140552, 140557, 140562, 140567, + 140572, 140577, 140582, 140587, 140592, 140597, 140604, 140609, 140614, + 140619, 140624, 140629, 140634, 140639, 140644, 140649, 140654, 140659, + 140664, 140669, 140674, 140679, 140684, 140689, 140694, 140701, 140706, + 140711, 140716, 140721, 140726, 140731, 140736, 140742, 140747, 140752, + 140757, 140762, 140767, 140772, 140777, 140782, 140789, 140796, 140801, + 140806, 140810, 140815, 140819, 140823, 140828, 140835, 140840, 140845, + 140854, 140859, 140864, 140869, 140874, 140881, 140888, 140893, 140898, + 140903, 140908, 140915, 140920, 140925, 140930, 140935, 140940, 140945, + 140950, 140955, 140960, 140965, 140970, 140975, 140982, 140986, 140991, + 140996, 141001, 141006, 141010, 141015, 141020, 141025, 141030, 141035, + 141040, 141045, 141050, 141055, 141061, 141067, 141073, 141079, 141085, + 141090, 141096, 141102, 141108, 141114, 141120, 141126, 141132, 141138, + 141144, 141150, 141156, 141162, 141168, 141174, 141180, 141186, 141192, + 141198, 141203, 141209, 141215, 141221, 141227, 141233, 141239, 141245, + 141251, 141257, 141263, 141269, 141275, 141281, 141287, 141293, 141299, + 141305, 141311, 141317, 141323, 141328, 141334, 141340, 141346, 141352, + 141358, 0, 0, 0, 0, 0, 0, 0, 141364, 141369, 141374, 141379, 141384, + 141389, 141394, 141398, 141403, 141408, 141413, 141418, 141423, 141428, + 141433, 141438, 141443, 141447, 141452, 141456, 141461, 141466, 141471, + 141476, 141481, 141485, 141490, 141495, 141499, 141504, 141509, 0, + 141514, 141519, 141523, 141527, 141531, 141535, 141539, 141543, 141547, + 141551, 0, 0, 0, 0, 141555, 141559, 141564, 141569, 141574, 141579, + 141584, 141589, 141594, 141599, 141604, 141609, 141614, 141619, 141624, + 141629, 141634, 141639, 141644, 141649, 141654, 141659, 141664, 141669, + 141674, 141679, 141684, 141689, 141694, 141699, 141704, 141709, 141714, + 141719, 141724, 141730, 141736, 141743, 141750, 141755, 141760, 141765, + 141770, 141775, 141780, 141785, 141790, 141795, 141800, 141805, 141810, + 141814, 141819, 141824, 141829, 141833, 141837, 141842, 141846, 141851, + 141856, 141861, 141865, 141869, 141873, 141877, 141882, 141887, 141892, + 141896, 141901, 141906, 141911, 141916, 141921, 141926, 141931, 141936, + 141941, 141946, 141951, 0, 141956, 141961, 141965, 141969, 141973, + 141977, 141981, 141985, 141989, 141993, 0, 0, 0, 0, 0, 0, 141997, 142004, + 142010, 142017, 142024, 142031, 142038, 142045, 142052, 142059, 142066, + 142073, 142080, 142087, 142094, 142101, 142108, 142115, 142121, 142128, + 142135, 142142, 142148, 142155, 142161, 142167, 142174, 142180, 142187, + 142193, 0, 0, 142199, 142207, 142215, 142224, 142233, 142242, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 142250, 142255, 142260, 142265, 142270, 142275, 142280, + 142285, 142290, 142295, 142300, 142305, 142310, 142315, 142320, 142325, + 142330, 142335, 142340, 142345, 142350, 142355, 142360, 142365, 142370, + 142375, 142380, 142385, 142390, 142395, 142400, 142405, 142410, 142415, + 142420, 142425, 142430, 142435, 142440, 142445, 142450, 142455, 142460, + 142465, 142470, 142475, 142480, 142485, 142490, 142497, 142504, 142511, + 142518, 142525, 142532, 142539, 142546, 142555, 142562, 142569, 142576, + 142583, 142590, 142597, 142604, 142611, 142618, 142625, 142632, 142637, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142646, 142651, 142655, 142659, 142663, + 142667, 142671, 142675, 142679, 142683, 0, 142687, 142692, 142697, + 142704, 142709, 142716, 142723, 0, 142728, 142735, 142740, 142745, + 142752, 142759, 142764, 142769, 142774, 142779, 142784, 142791, 142798, + 142803, 142808, 142813, 142826, 142835, 142842, 142851, 142860, 0, 0, 0, + 0, 0, 142869, 142876, 142883, 142890, 142897, 142904, 142911, 142918, + 142925, 142932, 142939, 142946, 142953, 142960, 142967, 142974, 142981, + 142988, 142995, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142958, 142964, 142970, 142976, - 142982, 142988, 142994, 143000, 143006, 143012, 143018, 143024, 143029, - 143035, 143040, 143046, 143051, 143057, 143063, 143068, 143074, 143079, - 143085, 143091, 143097, 143103, 143109, 143115, 143121, 143126, 143131, - 143137, 143143, 143149, 143155, 143161, 143167, 143173, 143179, 143185, - 143191, 143197, 143203, 143209, 143214, 143220, 143225, 143231, 143236, - 143242, 143248, 143253, 143259, 143264, 143270, 143276, 143282, 143288, - 143294, 143300, 143306, 143311, 143316, 143322, 143328, 143333, 143337, - 143341, 143345, 143349, 143353, 143357, 143361, 143365, 143369, 143374, - 143379, 143384, 143389, 143394, 143399, 143404, 143409, 143414, 143419, - 143426, 143433, 143440, 143444, 143450, 143455, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143002, 143008, 143014, 143020, + 143026, 143032, 143038, 143044, 143050, 143056, 143062, 143068, 143073, + 143079, 143084, 143090, 143095, 143101, 143107, 143112, 143118, 143123, + 143129, 143135, 143141, 143147, 143153, 143159, 143165, 143170, 143175, + 143181, 143187, 143193, 143199, 143205, 143211, 143217, 143223, 143229, + 143235, 143241, 143247, 143253, 143258, 143264, 143269, 143275, 143280, + 143286, 143292, 143297, 143303, 143308, 143314, 143320, 143326, 143332, + 143338, 143344, 143350, 143355, 143360, 143366, 143372, 143377, 143381, + 143385, 143389, 143393, 143397, 143401, 143405, 143409, 143413, 143418, + 143423, 143428, 143433, 143438, 143443, 143448, 143453, 143458, 143463, + 143470, 143477, 143484, 143488, 143494, 143499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143461, - 143464, 143468, 143472, 143476, 143479, 143483, 143488, 143492, 143496, - 143500, 143504, 143508, 143513, 143518, 143522, 143526, 143529, 143533, - 143538, 143543, 143547, 143551, 143554, 143558, 143562, 143566, 143570, - 143574, 143578, 143582, 143585, 143589, 143593, 143597, 143601, 143605, - 143609, 143615, 143618, 143622, 143626, 143630, 143634, 143638, 143642, - 143646, 143650, 143654, 143659, 143664, 143670, 143674, 143678, 143682, - 143686, 143690, 143694, 143699, 143702, 143706, 143710, 143714, 143718, - 143724, 143728, 143732, 143736, 143740, 143744, 143748, 143752, 143756, - 143760, 143764, 0, 0, 0, 0, 143768, 143773, 143777, 143781, 143787, - 143793, 143797, 143802, 143807, 143812, 143817, 143821, 143826, 143831, - 143836, 143840, 143845, 143850, 143855, 143859, 143864, 143869, 143874, - 143879, 143884, 143889, 143894, 143899, 143903, 143908, 143913, 143918, - 143923, 143928, 143933, 143938, 143943, 143948, 143953, 143958, 143965, - 143970, 143977, 143982, 143987, 143992, 143997, 144002, 144007, 144012, - 144017, 144022, 144027, 144032, 144037, 144042, 144047, 0, 0, 0, 0, 0, 0, - 0, 144052, 144055, 144060, 144063, 144066, 144070, 144074, 144078, - 144082, 144086, 144090, 144094, 144100, 144106, 144112, 144118, 144124, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143505, + 143508, 143512, 143516, 143520, 143523, 143527, 143532, 143536, 143540, + 143544, 143548, 143552, 143557, 143562, 143566, 143570, 143573, 143577, + 143582, 143587, 143591, 143595, 143598, 143602, 143606, 143610, 143614, + 143618, 143622, 143626, 143629, 143633, 143637, 143641, 143645, 143649, + 143653, 143659, 143662, 143666, 143670, 143674, 143678, 143682, 143686, + 143690, 143694, 143698, 143703, 143708, 143714, 143718, 143722, 143726, + 143730, 143734, 143738, 143743, 143746, 143750, 143754, 143758, 143762, + 143768, 143772, 143776, 143780, 143784, 143788, 143792, 143796, 143800, + 143804, 143808, 0, 0, 0, 0, 143812, 143817, 143821, 143825, 143831, + 143837, 143841, 143846, 143851, 143856, 143861, 143865, 143870, 143875, + 143880, 143884, 143889, 143894, 143899, 143903, 143908, 143913, 143918, + 143923, 143928, 143933, 143938, 143943, 143947, 143952, 143957, 143962, + 143967, 143972, 143977, 143982, 143987, 143992, 143997, 144002, 144009, + 144014, 144021, 144026, 144031, 144036, 144041, 144046, 144051, 144056, + 144061, 144066, 144071, 144076, 144081, 144086, 144091, 0, 0, 0, 0, 0, 0, + 0, 144096, 144099, 144104, 144107, 144110, 144114, 144118, 144122, + 144126, 144130, 144134, 144138, 144144, 144150, 144156, 144162, 144168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144130, 144134, 144138, - 144144, 144150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144155, 144164, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144173, 144176, 144179, 144182, 144185, - 144188, 144191, 144194, 144197, 144200, 144203, 144206, 144209, 144212, - 144215, 144218, 144221, 144224, 144227, 144230, 144233, 144236, 144239, - 144242, 144245, 144248, 144251, 144254, 144257, 144260, 144263, 144266, - 144269, 144272, 144275, 144278, 144281, 144284, 144287, 144290, 144293, - 144296, 144299, 144302, 144305, 144308, 144311, 144314, 144317, 144320, - 144323, 144326, 144329, 144332, 144335, 144338, 144341, 144344, 144347, - 144350, 144353, 144356, 144359, 144362, 144365, 144368, 144371, 144374, - 144377, 144380, 144383, 144386, 144389, 144392, 144395, 144398, 144401, - 144404, 144407, 144410, 144413, 144416, 144419, 144422, 144425, 144428, - 144431, 144434, 144437, 144440, 144443, 144446, 144449, 144452, 144455, - 144458, 144461, 144464, 144467, 144470, 144473, 144476, 144479, 144482, - 144485, 144488, 144491, 144494, 144497, 144500, 144503, 144506, 144509, - 144512, 144515, 144518, 144521, 144524, 144527, 144530, 144533, 144536, - 144539, 144542, 144545, 144548, 144551, 144554, 144557, 144560, 144563, - 144566, 144569, 144572, 144575, 144578, 144581, 144584, 144587, 144590, - 144593, 144596, 144599, 144602, 144605, 144608, 144611, 144614, 144617, - 144620, 144623, 144626, 144629, 144632, 144635, 144638, 144641, 144644, - 144647, 144650, 144653, 144656, 144659, 144662, 144665, 144668, 144671, - 144674, 144677, 144680, 144683, 144686, 144689, 144692, 144695, 144698, - 144701, 144704, 144707, 144710, 144713, 144716, 144719, 144722, 144725, - 144728, 144731, 144734, 144737, 144740, 144743, 144746, 144749, 144752, - 144755, 144758, 144761, 144764, 144767, 144770, 144773, 144776, 144779, - 144782, 144785, 144788, 144791, 144794, 144797, 144800, 144803, 144806, - 144809, 144812, 144815, 144818, 144821, 144824, 144827, 144830, 144833, - 144836, 144839, 144842, 144845, 144848, 144851, 144854, 144857, 144860, - 144863, 144866, 144869, 144872, 144875, 144878, 144881, 144884, 144887, - 144890, 144893, 144896, 144899, 144902, 144905, 144908, 144911, 144914, - 144917, 144920, 144923, 144926, 144929, 144932, 144935, 144938, 144941, - 144944, 144947, 144950, 144953, 144956, 144959, 144962, 144965, 144968, - 144971, 144974, 144977, 144980, 144983, 144986, 144989, 144992, 144995, - 144998, 145001, 145004, 145007, 145010, 145013, 145016, 145019, 145022, - 145025, 145028, 145031, 145034, 145037, 145040, 145043, 145046, 145049, - 145052, 145055, 145058, 145061, 145064, 145067, 145070, 145073, 145076, - 145079, 145082, 145085, 145088, 145091, 145094, 145097, 145100, 145103, - 145106, 145109, 145112, 145115, 145118, 145121, 145124, 145127, 145130, - 145133, 145136, 145139, 145142, 145145, 145148, 145151, 145154, 145157, - 145160, 145163, 145166, 145169, 145172, 145175, 145178, 145181, 145184, - 145187, 145190, 145193, 145196, 145199, 145202, 145205, 145208, 145211, - 145214, 145217, 145220, 145223, 145226, 145229, 145232, 145235, 145238, - 145241, 145244, 145247, 145250, 145253, 145256, 145259, 145262, 145265, - 145268, 145271, 145274, 145277, 145280, 145283, 145286, 145289, 145292, - 145295, 145298, 145301, 145304, 145307, 145310, 145313, 145316, 145319, - 145322, 145325, 145328, 145331, 145334, 145337, 145340, 145343, 145346, - 145349, 145352, 145355, 145358, 145361, 145364, 145367, 145370, 145373, - 145376, 145379, 145382, 145385, 145388, 145391, 145394, 145397, 145400, - 145403, 145406, 145409, 145412, 145415, 145418, 145421, 145424, 145427, - 145430, 145433, 145436, 145439, 145442, 145445, 145448, 145451, 145454, - 145457, 145460, 145463, 145466, 145469, 145472, 145475, 145478, 145481, - 145484, 145487, 145490, 145493, 145496, 145499, 145502, 145505, 145508, - 145511, 145514, 145517, 145520, 145523, 145526, 145529, 145532, 145535, - 145538, 145541, 145544, 145547, 145550, 145553, 145556, 145559, 145562, - 145565, 145568, 145571, 145574, 145577, 145580, 145583, 145586, 145589, - 145592, 145595, 145598, 145601, 145604, 145607, 145610, 145613, 145616, - 145619, 145622, 145625, 145628, 145631, 145634, 145637, 145640, 145643, - 145646, 145649, 145652, 145655, 145658, 145661, 145664, 145667, 145670, - 145673, 145676, 145679, 145682, 145685, 145688, 145691, 145694, 145697, - 145700, 145703, 145706, 145709, 145712, 145715, 145718, 145721, 145724, - 145727, 145730, 145733, 145736, 145739, 145742, 145745, 145748, 145751, - 145754, 145757, 145760, 145763, 145766, 145769, 145772, 145775, 145778, - 145781, 145784, 145787, 145790, 145793, 145796, 145799, 145802, 145805, - 145808, 145811, 145814, 145817, 145820, 145823, 145826, 145829, 145832, - 145835, 145838, 145841, 145844, 145847, 145850, 145853, 145856, 145859, - 145862, 145865, 145868, 145871, 145874, 145877, 145880, 145883, 145886, - 145889, 145892, 145895, 145898, 145901, 145904, 145907, 145910, 145913, - 145916, 145919, 145922, 145925, 145928, 145931, 145934, 145937, 145940, - 145943, 145946, 145949, 145952, 145955, 145958, 145961, 145964, 145967, - 145970, 145973, 145976, 145979, 145982, 145985, 145988, 145991, 145994, - 145997, 146000, 146003, 146006, 146009, 146012, 146015, 146018, 146021, - 146024, 146027, 146030, 146033, 146036, 146039, 146042, 146045, 146048, - 146051, 146054, 146057, 146060, 146063, 146066, 146069, 146072, 146075, - 146078, 146081, 146084, 146087, 146090, 146093, 146096, 146099, 146102, - 146105, 146108, 146111, 146114, 146117, 146120, 146123, 146126, 146129, - 146132, 146135, 146138, 146141, 146144, 146147, 146150, 146153, 146156, - 146159, 146162, 146165, 146168, 146171, 146174, 146177, 146180, 146183, - 146186, 146189, 146192, 146195, 146198, 146201, 146204, 146207, 146210, - 146213, 146216, 146219, 146222, 146225, 146228, 146231, 146234, 146237, - 146240, 146243, 146246, 146249, 146252, 146255, 146258, 146261, 146264, - 146267, 146270, 146273, 146276, 146279, 146282, 146285, 146288, 146291, - 146294, 146297, 146300, 146303, 146306, 146309, 146312, 146315, 146318, - 146321, 146324, 146327, 146330, 146333, 146336, 146339, 146342, 146345, - 146348, 146351, 146354, 146357, 146360, 146363, 146366, 146369, 146372, - 146375, 146378, 146381, 146384, 146387, 146390, 146393, 146396, 146399, - 146402, 146405, 146408, 146411, 146414, 146417, 146420, 146423, 146426, - 146429, 146432, 146435, 146438, 146441, 146444, 146447, 146450, 146453, - 146456, 146459, 146462, 146465, 146468, 146471, 146474, 146477, 146482, - 146487, 146492, 146497, 146502, 146507, 146512, 146517, 146522, 146527, - 146532, 146537, 146542, 146547, 146552, 146557, 146562, 146567, 146572, - 146577, 146582, 146587, 146592, 146597, 146602, 146607, 146612, 146617, - 146622, 146627, 146632, 146637, 146642, 146647, 146652, 146657, 146662, - 146667, 146672, 146677, 146682, 146687, 146692, 146697, 146702, 146707, - 146712, 146717, 146722, 146727, 146732, 146737, 146742, 146747, 146752, - 146757, 146762, 146767, 146772, 146777, 146782, 146787, 146792, 146797, - 146802, 146807, 146812, 146817, 146822, 146827, 146832, 146837, 146842, - 146847, 146852, 146857, 146862, 146867, 146872, 146877, 146882, 146887, - 146892, 146897, 146902, 146907, 146912, 146917, 146922, 146927, 146932, - 146937, 146942, 146947, 146952, 146957, 146962, 146967, 146972, 146977, - 146982, 146987, 146992, 146997, 147002, 147007, 147012, 147017, 147022, - 147027, 147032, 147037, 147042, 147047, 147052, 147057, 147062, 147067, - 147072, 147077, 147082, 147087, 147092, 147097, 147102, 147107, 147112, - 147117, 147122, 147127, 147132, 147137, 147142, 147147, 147152, 147157, - 147162, 147167, 147172, 147177, 147182, 147187, 147192, 147197, 147202, - 147207, 147212, 147217, 147222, 147227, 147232, 147237, 147242, 147247, - 147252, 147257, 147262, 147267, 147272, 147277, 147282, 147287, 147292, - 147297, 147302, 147307, 147312, 147317, 147322, 147327, 147332, 147337, - 147342, 147347, 147352, 147357, 147362, 147367, 147372, 147377, 147382, - 147387, 147392, 147397, 147402, 147407, 147412, 147417, 147422, 147427, - 147432, 147437, 147442, 147447, 147452, 147457, 147462, 147467, 147472, - 147477, 147482, 147487, 147492, 147497, 147502, 147507, 147512, 147517, - 147522, 147527, 147532, 147537, 147542, 147547, 147552, 147557, 147562, - 147567, 147572, 147577, 147582, 147587, 147592, 147597, 147602, 147607, - 147612, 147617, 147622, 147627, 147632, 147637, 147642, 147647, 147652, - 147657, 147662, 147667, 147672, 147677, 147682, 147687, 147692, 147697, - 147702, 147707, 147712, 147717, 147722, 147727, 147732, 147737, 147742, - 147747, 147752, 147757, 147762, 147767, 147772, 147777, 147782, 147787, - 147792, 147797, 147802, 147807, 147812, 147817, 147822, 147827, 147832, - 147837, 147842, 147847, 147852, 147857, 147862, 147867, 147872, 147877, - 147882, 147887, 147892, 147897, 147902, 147907, 147912, 147917, 147922, - 147927, 147932, 147937, 147942, 147947, 147952, 147957, 147962, 147967, - 147972, 147977, 147982, 147987, 147992, 147997, 148002, 148007, 148012, - 148017, 148022, 148027, 148032, 148037, 148042, 148047, 148052, 148057, - 148062, 148067, 148072, 148077, 148082, 148087, 148092, 148097, 148102, - 148107, 148112, 148117, 148122, 148127, 148132, 148137, 148142, 148147, - 148152, 148157, 148162, 148167, 148172, 148177, 148182, 148187, 148192, - 148197, 148202, 148207, 148212, 148217, 148222, 148227, 148232, 148237, - 148242, 148247, 148252, 148257, 148262, 148267, 148272, 148277, 148282, - 148287, 148292, 148297, 148302, 148307, 148312, 148317, 148322, 148327, - 148332, 148337, 148342, 148347, 148352, 148357, 148362, 148367, 148372, - 148377, 148382, 148387, 148392, 148397, 148402, 148407, 148412, 148417, - 148422, 148427, 148432, 148437, 148442, 148447, 148452, 148457, 148462, - 148467, 148472, 148477, 148482, 148487, 148492, 148497, 148502, 148507, - 148512, 148517, 148522, 148527, 148532, 148537, 148542, 148547, 148552, - 148557, 148562, 148567, 148572, 148577, 148582, 148587, 148592, 148597, - 148602, 148607, 148612, 148617, 148622, 148627, 148632, 148637, 148642, - 148647, 148652, 148657, 148662, 148667, 148672, 148677, 148682, 148687, - 148692, 148697, 148702, 148707, 148712, 148717, 148722, 148727, 148732, - 148737, 148742, 148747, 148752, 148757, 148762, 148767, 148772, 148777, - 148782, 148787, 148792, 148797, 148802, 148807, 148812, 148817, 148822, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144174, 144178, 144182, + 144188, 144194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144199, 144208, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144217, 144220, 144223, 144226, 144229, + 144232, 144235, 144238, 144241, 144244, 144247, 144250, 144253, 144256, + 144259, 144262, 144265, 144268, 144271, 144274, 144277, 144280, 144283, + 144286, 144289, 144292, 144295, 144298, 144301, 144304, 144307, 144310, + 144313, 144316, 144319, 144322, 144325, 144328, 144331, 144334, 144337, + 144340, 144343, 144346, 144349, 144352, 144355, 144358, 144361, 144364, + 144367, 144370, 144373, 144376, 144379, 144382, 144385, 144388, 144391, + 144394, 144397, 144400, 144403, 144406, 144409, 144412, 144415, 144418, + 144421, 144424, 144427, 144430, 144433, 144436, 144439, 144442, 144445, + 144448, 144451, 144454, 144457, 144460, 144463, 144466, 144469, 144472, + 144475, 144478, 144481, 144484, 144487, 144490, 144493, 144496, 144499, + 144502, 144505, 144508, 144511, 144514, 144517, 144520, 144523, 144526, + 144529, 144532, 144535, 144538, 144541, 144544, 144547, 144550, 144553, + 144556, 144559, 144562, 144565, 144568, 144571, 144574, 144577, 144580, + 144583, 144586, 144589, 144592, 144595, 144598, 144601, 144604, 144607, + 144610, 144613, 144616, 144619, 144622, 144625, 144628, 144631, 144634, + 144637, 144640, 144643, 144646, 144649, 144652, 144655, 144658, 144661, + 144664, 144667, 144670, 144673, 144676, 144679, 144682, 144685, 144688, + 144691, 144694, 144697, 144700, 144703, 144706, 144709, 144712, 144715, + 144718, 144721, 144724, 144727, 144730, 144733, 144736, 144739, 144742, + 144745, 144748, 144751, 144754, 144757, 144760, 144763, 144766, 144769, + 144772, 144775, 144778, 144781, 144784, 144787, 144790, 144793, 144796, + 144799, 144802, 144805, 144808, 144811, 144814, 144817, 144820, 144823, + 144826, 144829, 144832, 144835, 144838, 144841, 144844, 144847, 144850, + 144853, 144856, 144859, 144862, 144865, 144868, 144871, 144874, 144877, + 144880, 144883, 144886, 144889, 144892, 144895, 144898, 144901, 144904, + 144907, 144910, 144913, 144916, 144919, 144922, 144925, 144928, 144931, + 144934, 144937, 144940, 144943, 144946, 144949, 144952, 144955, 144958, + 144961, 144964, 144967, 144970, 144973, 144976, 144979, 144982, 144985, + 144988, 144991, 144994, 144997, 145000, 145003, 145006, 145009, 145012, + 145015, 145018, 145021, 145024, 145027, 145030, 145033, 145036, 145039, + 145042, 145045, 145048, 145051, 145054, 145057, 145060, 145063, 145066, + 145069, 145072, 145075, 145078, 145081, 145084, 145087, 145090, 145093, + 145096, 145099, 145102, 145105, 145108, 145111, 145114, 145117, 145120, + 145123, 145126, 145129, 145132, 145135, 145138, 145141, 145144, 145147, + 145150, 145153, 145156, 145159, 145162, 145165, 145168, 145171, 145174, + 145177, 145180, 145183, 145186, 145189, 145192, 145195, 145198, 145201, + 145204, 145207, 145210, 145213, 145216, 145219, 145222, 145225, 145228, + 145231, 145234, 145237, 145240, 145243, 145246, 145249, 145252, 145255, + 145258, 145261, 145264, 145267, 145270, 145273, 145276, 145279, 145282, + 145285, 145288, 145291, 145294, 145297, 145300, 145303, 145306, 145309, + 145312, 145315, 145318, 145321, 145324, 145327, 145330, 145333, 145336, + 145339, 145342, 145345, 145348, 145351, 145354, 145357, 145360, 145363, + 145366, 145369, 145372, 145375, 145378, 145381, 145384, 145387, 145390, + 145393, 145396, 145399, 145402, 145405, 145408, 145411, 145414, 145417, + 145420, 145423, 145426, 145429, 145432, 145435, 145438, 145441, 145444, + 145447, 145450, 145453, 145456, 145459, 145462, 145465, 145468, 145471, + 145474, 145477, 145480, 145483, 145486, 145489, 145492, 145495, 145498, + 145501, 145504, 145507, 145510, 145513, 145516, 145519, 145522, 145525, + 145528, 145531, 145534, 145537, 145540, 145543, 145546, 145549, 145552, + 145555, 145558, 145561, 145564, 145567, 145570, 145573, 145576, 145579, + 145582, 145585, 145588, 145591, 145594, 145597, 145600, 145603, 145606, + 145609, 145612, 145615, 145618, 145621, 145624, 145627, 145630, 145633, + 145636, 145639, 145642, 145645, 145648, 145651, 145654, 145657, 145660, + 145663, 145666, 145669, 145672, 145675, 145678, 145681, 145684, 145687, + 145690, 145693, 145696, 145699, 145702, 145705, 145708, 145711, 145714, + 145717, 145720, 145723, 145726, 145729, 145732, 145735, 145738, 145741, + 145744, 145747, 145750, 145753, 145756, 145759, 145762, 145765, 145768, + 145771, 145774, 145777, 145780, 145783, 145786, 145789, 145792, 145795, + 145798, 145801, 145804, 145807, 145810, 145813, 145816, 145819, 145822, + 145825, 145828, 145831, 145834, 145837, 145840, 145843, 145846, 145849, + 145852, 145855, 145858, 145861, 145864, 145867, 145870, 145873, 145876, + 145879, 145882, 145885, 145888, 145891, 145894, 145897, 145900, 145903, + 145906, 145909, 145912, 145915, 145918, 145921, 145924, 145927, 145930, + 145933, 145936, 145939, 145942, 145945, 145948, 145951, 145954, 145957, + 145960, 145963, 145966, 145969, 145972, 145975, 145978, 145981, 145984, + 145987, 145990, 145993, 145996, 145999, 146002, 146005, 146008, 146011, + 146014, 146017, 146020, 146023, 146026, 146029, 146032, 146035, 146038, + 146041, 146044, 146047, 146050, 146053, 146056, 146059, 146062, 146065, + 146068, 146071, 146074, 146077, 146080, 146083, 146086, 146089, 146092, + 146095, 146098, 146101, 146104, 146107, 146110, 146113, 146116, 146119, + 146122, 146125, 146128, 146131, 146134, 146137, 146140, 146143, 146146, + 146149, 146152, 146155, 146158, 146161, 146164, 146167, 146170, 146173, + 146176, 146179, 146182, 146185, 146188, 146191, 146194, 146197, 146200, + 146203, 146206, 146209, 146212, 146215, 146218, 146221, 146224, 146227, + 146230, 146233, 146236, 146239, 146242, 146245, 146248, 146251, 146254, + 146257, 146260, 146263, 146266, 146269, 146272, 146275, 146278, 146281, + 146284, 146287, 146290, 146293, 146296, 146299, 146302, 146305, 146308, + 146311, 146314, 146317, 146320, 146323, 146326, 146329, 146332, 146335, + 146338, 146341, 146344, 146347, 146350, 146353, 146356, 146359, 146362, + 146365, 146368, 146371, 146374, 146377, 146380, 146383, 146386, 146389, + 146392, 146395, 146398, 146401, 146404, 146407, 146410, 146413, 146416, + 146419, 146422, 146425, 146428, 146431, 146434, 146437, 146440, 146443, + 146446, 146449, 146452, 146455, 146458, 146461, 146464, 146467, 146470, + 146473, 146476, 146479, 146482, 146485, 146488, 146491, 146494, 146497, + 146500, 146503, 146506, 146509, 146512, 146515, 146518, 146521, 146526, + 146531, 146536, 146541, 146546, 146551, 146556, 146561, 146566, 146571, + 146576, 146581, 146586, 146591, 146596, 146601, 146606, 146611, 146616, + 146621, 146626, 146631, 146636, 146641, 146646, 146651, 146656, 146661, + 146666, 146671, 146676, 146681, 146686, 146691, 146696, 146701, 146706, + 146711, 146716, 146721, 146726, 146731, 146736, 146741, 146746, 146751, + 146756, 146761, 146766, 146771, 146776, 146781, 146786, 146791, 146796, + 146801, 146806, 146811, 146816, 146821, 146826, 146831, 146836, 146841, + 146846, 146851, 146856, 146861, 146866, 146871, 146876, 146881, 146886, + 146891, 146896, 146901, 146906, 146911, 146916, 146921, 146926, 146931, + 146936, 146941, 146946, 146951, 146956, 146961, 146966, 146971, 146976, + 146981, 146986, 146991, 146996, 147001, 147006, 147011, 147016, 147021, + 147026, 147031, 147036, 147041, 147046, 147051, 147056, 147061, 147066, + 147071, 147076, 147081, 147086, 147091, 147096, 147101, 147106, 147111, + 147116, 147121, 147126, 147131, 147136, 147141, 147146, 147151, 147156, + 147161, 147166, 147171, 147176, 147181, 147186, 147191, 147196, 147201, + 147206, 147211, 147216, 147221, 147226, 147231, 147236, 147241, 147246, + 147251, 147256, 147261, 147266, 147271, 147276, 147281, 147286, 147291, + 147296, 147301, 147306, 147311, 147316, 147321, 147326, 147331, 147336, + 147341, 147346, 147351, 147356, 147361, 147366, 147371, 147376, 147381, + 147386, 147391, 147396, 147401, 147406, 147411, 147416, 147421, 147426, + 147431, 147436, 147441, 147446, 147451, 147456, 147461, 147466, 147471, + 147476, 147481, 147486, 147491, 147496, 147501, 147506, 147511, 147516, + 147521, 147526, 147531, 147536, 147541, 147546, 147551, 147556, 147561, + 147566, 147571, 147576, 147581, 147586, 147591, 147596, 147601, 147606, + 147611, 147616, 147621, 147626, 147631, 147636, 147641, 147646, 147651, + 147656, 147661, 147666, 147671, 147676, 147681, 147686, 147691, 147696, + 147701, 147706, 147711, 147716, 147721, 147726, 147731, 147736, 147741, + 147746, 147751, 147756, 147761, 147766, 147771, 147776, 147781, 147786, + 147791, 147796, 147801, 147806, 147811, 147816, 147821, 147826, 147831, + 147836, 147841, 147846, 147851, 147856, 147861, 147866, 147871, 147876, + 147881, 147886, 147891, 147896, 147901, 147906, 147911, 147916, 147921, + 147926, 147931, 147936, 147941, 147946, 147951, 147956, 147961, 147966, + 147971, 147976, 147981, 147986, 147991, 147996, 148001, 148006, 148011, + 148016, 148021, 148026, 148031, 148036, 148041, 148046, 148051, 148056, + 148061, 148066, 148071, 148076, 148081, 148086, 148091, 148096, 148101, + 148106, 148111, 148116, 148121, 148126, 148131, 148136, 148141, 148146, + 148151, 148156, 148161, 148166, 148171, 148176, 148181, 148186, 148191, + 148196, 148201, 148206, 148211, 148216, 148221, 148226, 148231, 148236, + 148241, 148246, 148251, 148256, 148261, 148266, 148271, 148276, 148281, + 148286, 148291, 148296, 148301, 148306, 148311, 148316, 148321, 148326, + 148331, 148336, 148341, 148346, 148351, 148356, 148361, 148366, 148371, + 148376, 148381, 148386, 148391, 148396, 148401, 148406, 148411, 148416, + 148421, 148426, 148431, 148436, 148441, 148446, 148451, 148456, 148461, + 148466, 148471, 148476, 148481, 148486, 148491, 148496, 148501, 148506, + 148511, 148516, 148521, 148526, 148531, 148536, 148541, 148546, 148551, + 148556, 148561, 148566, 148571, 148576, 148581, 148586, 148591, 148596, + 148601, 148606, 148611, 148616, 148621, 148626, 148631, 148636, 148641, + 148646, 148651, 148656, 148661, 148666, 148671, 148676, 148681, 148686, + 148691, 148696, 148701, 148706, 148711, 148716, 148721, 148726, 148731, + 148736, 148741, 148746, 148751, 148756, 148761, 148766, 148771, 148776, + 148781, 148786, 148791, 148796, 148801, 148806, 148811, 148816, 148821, + 148826, 148831, 148836, 148841, 148846, 148851, 148856, 148861, 148866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148827, 148833, 148839, 148845, 0, 148851, - 148857, 148863, 148871, 148879, 148887, 148895, 0, 148903, 148911, 0, - 148919, 148924, 148931, 148935, 148939, 148943, 148947, 148951, 148955, - 148959, 148963, 148967, 148971, 148975, 148979, 148983, 148987, 148991, - 148995, 148999, 149003, 149007, 149011, 149015, 149019, 149023, 149027, - 149031, 149035, 149039, 149043, 149047, 149051, 149055, 149059, 149063, - 149067, 149071, 149075, 149079, 149083, 149087, 149091, 149095, 149099, - 149103, 149107, 149111, 149115, 149119, 149123, 149127, 149131, 149135, - 149139, 149143, 149147, 149151, 149155, 149159, 149163, 149167, 149171, - 149175, 149179, 149183, 149187, 149191, 149195, 149199, 149203, 149207, - 149211, 149215, 149219, 149223, 149227, 149231, 149235, 149239, 149243, - 149247, 149251, 149255, 149259, 149263, 149267, 149271, 149275, 149279, - 149283, 149287, 149291, 149295, 149299, 149303, 149307, 149311, 149315, - 149319, 149323, 149327, 149331, 149335, 149339, 149343, 149347, 149351, - 149355, 149359, 149363, 149367, 149371, 149375, 149379, 149383, 149387, - 149391, 149395, 149399, 149403, 149407, 149411, 149415, 149419, 149423, - 149427, 149431, 149435, 149439, 149443, 149447, 149451, 149455, 149459, - 149463, 149467, 149471, 149475, 149479, 149483, 149487, 149491, 149495, - 149499, 149503, 149507, 149511, 149515, 149519, 149523, 149527, 149531, - 149535, 149539, 149543, 149547, 149551, 149555, 149559, 149563, 149567, - 149571, 149575, 149579, 149583, 149587, 149591, 149595, 149599, 149603, - 149607, 149611, 149615, 149619, 149623, 149627, 149631, 149635, 149639, - 149643, 149647, 149651, 149655, 149659, 149663, 149667, 149671, 149675, - 149679, 149683, 149687, 149691, 149695, 149699, 149703, 149707, 149711, - 149715, 149719, 149723, 149727, 149731, 149735, 149739, 149743, 149747, - 149751, 149755, 149759, 149763, 149767, 149771, 149775, 149779, 149783, - 149787, 149791, 149795, 149799, 149803, 149807, 149811, 149815, 149819, - 149823, 149827, 149831, 149835, 149839, 149843, 149847, 149851, 149855, - 149859, 149863, 149867, 149871, 149875, 149879, 149883, 149887, 149891, - 149895, 149899, 149903, 149907, 149911, 149915, 149919, 149923, 149927, - 149931, 149935, 149939, 149943, 149947, 149951, 149955, 149959, 149963, - 149967, 149971, 149975, 149979, 149983, 149987, 149991, 149995, 149999, - 150003, 150007, 150011, 150015, 150019, 150023, 150027, 150031, 150035, - 150039, 150043, 150047, 150051, 150055, 150059, 150063, 150067, 150071, - 150078, 150084, 150090, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 150096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 150102, 150108, 150114, 0, 0, 150120, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 150125, 150130, 150135, 150140, 0, 0, 0, 0, 0, - 0, 0, 0, 150145, 150148, 150151, 150154, 150157, 150160, 150163, 150166, - 150169, 150172, 150175, 150178, 150181, 150184, 150187, 150190, 150193, - 150196, 150199, 150202, 150205, 150208, 150211, 150214, 150217, 150220, - 150223, 150226, 150229, 150232, 150235, 150238, 150241, 150244, 150247, - 150250, 150253, 150256, 150259, 150262, 150265, 150268, 150271, 150274, - 150277, 150280, 150283, 150286, 150289, 150292, 150295, 150298, 150301, - 150304, 150307, 150310, 150313, 150316, 150319, 150322, 150325, 150328, - 150331, 150334, 150337, 150340, 150343, 150346, 150349, 150352, 150355, - 150358, 150361, 150364, 150367, 150370, 150373, 150376, 150379, 150382, - 150385, 150388, 150391, 150394, 150397, 150400, 150403, 150406, 150409, - 150412, 150415, 150418, 150421, 150424, 150427, 150430, 150433, 150436, - 150439, 150442, 150445, 150448, 150451, 150454, 150457, 150460, 150463, - 150466, 150469, 150472, 150475, 150478, 150481, 150484, 150487, 150490, - 150493, 150496, 150499, 150502, 150505, 150508, 150511, 150514, 150517, - 150520, 150523, 150526, 150529, 150532, 150535, 150538, 150541, 150544, - 150547, 150550, 150553, 150556, 150559, 150562, 150565, 150568, 150571, - 150574, 150577, 150580, 150583, 150586, 150589, 150592, 150595, 150598, - 150601, 150604, 150607, 150610, 150613, 150616, 150619, 150622, 150625, - 150628, 150631, 150634, 150637, 150640, 150643, 150646, 150649, 150652, - 150655, 150658, 150661, 150664, 150667, 150670, 150673, 150676, 150679, - 150682, 150685, 150688, 150691, 150694, 150697, 150700, 150703, 150706, - 150709, 150712, 150715, 150718, 150721, 150724, 150727, 150730, 150733, - 150736, 150739, 150742, 150745, 150748, 150751, 150754, 150757, 150760, - 150763, 150766, 150769, 150772, 150775, 150778, 150781, 150784, 150787, - 150790, 150793, 150796, 150799, 150802, 150805, 150808, 150811, 150814, - 150817, 150820, 150823, 150826, 150829, 150832, 150835, 150838, 150841, - 150844, 150847, 150850, 150853, 150856, 150859, 150862, 150865, 150868, - 150871, 150874, 150877, 150880, 150883, 150886, 150889, 150892, 150895, - 150898, 150901, 150904, 150907, 150910, 150913, 150916, 150919, 150922, - 150925, 150928, 150931, 150934, 150937, 150940, 150943, 150946, 150949, - 150952, 150955, 150958, 150961, 150964, 150967, 150970, 150973, 150976, - 150979, 150982, 150985, 150988, 150991, 150994, 150997, 151000, 151003, - 151006, 151009, 151012, 151015, 151018, 151021, 151024, 151027, 151030, - 151033, 151036, 151039, 151042, 151045, 151048, 151051, 151054, 151057, - 151060, 151063, 151066, 151069, 151072, 151075, 151078, 151081, 151084, - 151087, 151090, 151093, 151096, 151099, 151102, 151105, 151108, 151111, - 151114, 151117, 151120, 151123, 151126, 151129, 151132, 151135, 151138, - 151141, 151144, 151147, 151150, 151153, 151156, 151159, 151162, 151165, - 151168, 151171, 151174, 151177, 151180, 151183, 151186, 151189, 151192, - 151195, 151198, 151201, 151204, 151207, 151210, 151213, 151216, 151219, - 151222, 151225, 151228, 151231, 151234, 151237, 151240, 151243, 151246, - 151249, 151252, 151255, 151258, 151261, 151264, 151267, 151270, 151273, - 151276, 151279, 151282, 151285, 151288, 151291, 151294, 151297, 151300, - 151303, 151306, 151309, 151312, 151315, 151318, 151321, 151324, 151327, - 151330, 0, 0, 0, 0, 151333, 151337, 151341, 151345, 151349, 151353, - 151357, 151360, 151364, 151368, 151372, 151376, 151379, 151385, 151391, - 151397, 151403, 151409, 151413, 151419, 151423, 151427, 151433, 151437, - 151441, 151445, 151449, 151453, 151457, 151461, 151467, 151473, 151479, - 151485, 151492, 151499, 151506, 151516, 151523, 151530, 151536, 151542, - 151548, 151554, 151562, 151570, 151578, 151586, 151595, 151601, 151609, - 151615, 151622, 151628, 151635, 151641, 151649, 151653, 151657, 151662, - 151668, 151674, 151682, 151690, 151696, 151703, 151706, 151712, 151716, - 151719, 151723, 151726, 151729, 151733, 151738, 151742, 151746, 151752, - 151757, 151763, 151767, 151771, 151774, 151778, 151782, 151787, 151791, - 151796, 151800, 151805, 151809, 151813, 151817, 151821, 151825, 151829, - 151833, 151837, 151842, 151847, 151852, 151857, 151863, 151869, 151875, - 151881, 151887, 0, 0, 0, 0, 0, 151892, 151900, 151909, 151917, 151924, - 151932, 151939, 151946, 151955, 151962, 151969, 151977, 151985, 0, 0, 0, - 151993, 151999, 152007, 152013, 152020, 152026, 152032, 152038, 152044, - 0, 0, 0, 0, 0, 0, 0, 152050, 152056, 152064, 152070, 152077, 152083, - 152089, 152095, 152101, 152107, 0, 0, 152112, 152118, 152124, 152127, - 152136, 152143, 152151, 152158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148871, 148877, 148883, 148889, 0, 148895, + 148901, 148907, 148915, 148923, 148931, 148939, 0, 148947, 148955, 0, + 148963, 148968, 148975, 148979, 148983, 148987, 148991, 148995, 148999, + 149003, 149007, 149011, 149015, 149019, 149023, 149027, 149031, 149035, + 149039, 149043, 149047, 149051, 149055, 149059, 149063, 149067, 149071, + 149075, 149079, 149083, 149087, 149091, 149095, 149099, 149103, 149107, + 149111, 149115, 149119, 149123, 149127, 149131, 149135, 149139, 149143, + 149147, 149151, 149155, 149159, 149163, 149167, 149171, 149175, 149179, + 149183, 149187, 149191, 149195, 149199, 149203, 149207, 149211, 149215, + 149219, 149223, 149227, 149231, 149235, 149239, 149243, 149247, 149251, + 149255, 149259, 149263, 149267, 149271, 149275, 149279, 149283, 149287, + 149291, 149295, 149299, 149303, 149307, 149311, 149315, 149319, 149323, + 149327, 149331, 149335, 149339, 149343, 149347, 149351, 149355, 149359, + 149363, 149367, 149371, 149375, 149379, 149383, 149387, 149391, 149395, + 149399, 149403, 149407, 149411, 149415, 149419, 149423, 149427, 149431, + 149435, 149439, 149443, 149447, 149451, 149455, 149459, 149463, 149467, + 149471, 149475, 149479, 149483, 149487, 149491, 149495, 149499, 149503, + 149507, 149511, 149515, 149519, 149523, 149527, 149531, 149535, 149539, + 149543, 149547, 149551, 149555, 149559, 149563, 149567, 149571, 149575, + 149579, 149583, 149587, 149591, 149595, 149599, 149603, 149607, 149611, + 149615, 149619, 149623, 149627, 149631, 149635, 149639, 149643, 149647, + 149651, 149655, 149659, 149663, 149667, 149671, 149675, 149679, 149683, + 149687, 149691, 149695, 149699, 149703, 149707, 149711, 149715, 149719, + 149723, 149727, 149731, 149735, 149739, 149743, 149747, 149751, 149755, + 149759, 149763, 149767, 149771, 149775, 149779, 149783, 149787, 149791, + 149795, 149799, 149803, 149807, 149811, 149815, 149819, 149823, 149827, + 149831, 149835, 149839, 149843, 149847, 149851, 149855, 149859, 149863, + 149867, 149871, 149875, 149879, 149883, 149887, 149891, 149895, 149899, + 149903, 149907, 149911, 149915, 149919, 149923, 149927, 149931, 149935, + 149939, 149943, 149947, 149951, 149955, 149959, 149963, 149967, 149971, + 149975, 149979, 149983, 149987, 149991, 149995, 149999, 150003, 150007, + 150011, 150015, 150019, 150023, 150027, 150031, 150035, 150039, 150043, + 150047, 150051, 150055, 150059, 150063, 150067, 150071, 150075, 150079, + 150083, 150087, 150091, 150095, 150099, 150103, 150107, 150111, 150115, + 150122, 150128, 150134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 150140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 150146, 150152, 150158, 0, 0, 150164, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 150169, 150174, 150179, 150184, 0, 0, 0, 0, 0, + 0, 0, 0, 150189, 150192, 150195, 150198, 150201, 150204, 150207, 150210, + 150213, 150216, 150219, 150222, 150225, 150228, 150231, 150234, 150237, + 150240, 150243, 150246, 150249, 150252, 150255, 150258, 150261, 150264, + 150267, 150270, 150273, 150276, 150279, 150282, 150285, 150288, 150291, + 150294, 150297, 150300, 150303, 150306, 150309, 150312, 150315, 150318, + 150321, 150324, 150327, 150330, 150333, 150336, 150339, 150342, 150345, + 150348, 150351, 150354, 150357, 150360, 150363, 150366, 150369, 150372, + 150375, 150378, 150381, 150384, 150387, 150390, 150393, 150396, 150399, + 150402, 150405, 150408, 150411, 150414, 150417, 150420, 150423, 150426, + 150429, 150432, 150435, 150438, 150441, 150444, 150447, 150450, 150453, + 150456, 150459, 150462, 150465, 150468, 150471, 150474, 150477, 150480, + 150483, 150486, 150489, 150492, 150495, 150498, 150501, 150504, 150507, + 150510, 150513, 150516, 150519, 150522, 150525, 150528, 150531, 150534, + 150537, 150540, 150543, 150546, 150549, 150552, 150555, 150558, 150561, + 150564, 150567, 150570, 150573, 150576, 150579, 150582, 150585, 150588, + 150591, 150594, 150597, 150600, 150603, 150606, 150609, 150612, 150615, + 150618, 150621, 150624, 150627, 150630, 150633, 150636, 150639, 150642, + 150645, 150648, 150651, 150654, 150657, 150660, 150663, 150666, 150669, + 150672, 150675, 150678, 150681, 150684, 150687, 150690, 150693, 150696, + 150699, 150702, 150705, 150708, 150711, 150714, 150717, 150720, 150723, + 150726, 150729, 150732, 150735, 150738, 150741, 150744, 150747, 150750, + 150753, 150756, 150759, 150762, 150765, 150768, 150771, 150774, 150777, + 150780, 150783, 150786, 150789, 150792, 150795, 150798, 150801, 150804, + 150807, 150810, 150813, 150816, 150819, 150822, 150825, 150828, 150831, + 150834, 150837, 150840, 150843, 150846, 150849, 150852, 150855, 150858, + 150861, 150864, 150867, 150870, 150873, 150876, 150879, 150882, 150885, + 150888, 150891, 150894, 150897, 150900, 150903, 150906, 150909, 150912, + 150915, 150918, 150921, 150924, 150927, 150930, 150933, 150936, 150939, + 150942, 150945, 150948, 150951, 150954, 150957, 150960, 150963, 150966, + 150969, 150972, 150975, 150978, 150981, 150984, 150987, 150990, 150993, + 150996, 150999, 151002, 151005, 151008, 151011, 151014, 151017, 151020, + 151023, 151026, 151029, 151032, 151035, 151038, 151041, 151044, 151047, + 151050, 151053, 151056, 151059, 151062, 151065, 151068, 151071, 151074, + 151077, 151080, 151083, 151086, 151089, 151092, 151095, 151098, 151101, + 151104, 151107, 151110, 151113, 151116, 151119, 151122, 151125, 151128, + 151131, 151134, 151137, 151140, 151143, 151146, 151149, 151152, 151155, + 151158, 151161, 151164, 151167, 151170, 151173, 151176, 151179, 151182, + 151185, 151188, 151191, 151194, 151197, 151200, 151203, 151206, 151209, + 151212, 151215, 151218, 151221, 151224, 151227, 151230, 151233, 151236, + 151239, 151242, 151245, 151248, 151251, 151254, 151257, 151260, 151263, + 151266, 151269, 151272, 151275, 151278, 151281, 151284, 151287, 151290, + 151293, 151296, 151299, 151302, 151305, 151308, 151311, 151314, 151317, + 151320, 151323, 151326, 151329, 151332, 151335, 151338, 151341, 151344, + 151347, 151350, 151353, 151356, 151359, 151362, 151365, 151368, 151371, + 151374, 0, 0, 0, 0, 151377, 151381, 151385, 151389, 151393, 151397, + 151401, 151404, 151408, 151412, 151416, 151420, 151423, 151429, 151435, + 151441, 151447, 151453, 151457, 151463, 151467, 151471, 151477, 151481, + 151485, 151489, 151493, 151497, 151501, 151505, 151511, 151517, 151523, + 151529, 151536, 151543, 151550, 151560, 151567, 151574, 151580, 151586, + 151592, 151598, 151606, 151614, 151622, 151630, 151639, 151645, 151653, + 151659, 151666, 151672, 151679, 151685, 151693, 151697, 151701, 151706, + 151712, 151718, 151726, 151734, 151740, 151747, 151750, 151756, 151760, + 151763, 151767, 151770, 151773, 151777, 151782, 151786, 151790, 151796, + 151801, 151807, 151811, 151815, 151818, 151822, 151826, 151831, 151835, + 151840, 151844, 151849, 151853, 151857, 151861, 151865, 151869, 151873, + 151877, 151881, 151886, 151891, 151896, 151901, 151907, 151913, 151919, + 151925, 151931, 0, 0, 0, 0, 0, 151936, 151944, 151953, 151961, 151968, + 151976, 151983, 151990, 151999, 152006, 152013, 152021, 152029, 0, 0, 0, + 152037, 152043, 152051, 152057, 152064, 152070, 152076, 152082, 152088, + 0, 0, 0, 0, 0, 0, 0, 152094, 152100, 152108, 152114, 152121, 152127, + 152133, 152139, 152145, 152151, 0, 0, 152156, 152162, 152168, 152171, + 152180, 152187, 152195, 152202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 152165, 152180, 152193, 152202, 152213, 152222, 152231, - 152242, 152251, 152260, 152275, 152288, 152301, 152315, 152327, 152335, - 152345, 152353, 152361, 152371, 152379, 152387, 152401, 152413, 152425, - 152434, 152445, 152454, 152463, 152470, 152479, 152488, 152495, 152500, - 152505, 152510, 152515, 152520, 152525, 152530, 152535, 152540, 152545, - 152550, 152555, 152560, 0, 0, 152569, 152578, 152587, 152596, 152601, - 152608, 152613, 152618, 152626, 152631, 152638, 152643, 152650, 152655, - 152660, 152667, 152674, 152679, 152688, 152694, 152700, 152708, 152714, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 152720, 152724, 152730, 152734, 152742, - 152746, 152750, 152754, 152762, 152766, 152772, 152781, 152785, 152789, - 152793, 152799, 152805, 152811, 152817, 152823, 152829, 152835, 152841, - 152847, 152855, 152863, 152871, 152879, 152884, 152890, 152894, 152898, - 152902, 152906, 152912, 152918, 152924, 152930, 152936, 152944, 152950, - 152958, 152966, 152974, 152982, 152990, 152994, 153002, 153008, 153016, - 153020, 153024, 153028, 153032, 153036, 153040, 153048, 153056, 153068, - 153080, 153086, 153096, 153104, 153114, 153126, 153130, 153136, 153142, - 153148, 153154, 153160, 153166, 153172, 153178, 153184, 153192, 153198, - 153204, 153210, 153218, 153226, 153237, 153248, 153254, 153260, 153270, - 153276, 153284, 153288, 153294, 153300, 153306, 153312, 153318, 153324, - 153330, 153334, 153340, 153346, 153354, 153362, 153370, 153376, 153384, - 153397, 153410, 153418, 153426, 153438, 153446, 153456, 153464, 153468, - 153472, 153476, 153480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 152209, 152224, 152237, 152246, 152257, 152266, 152275, + 152286, 152295, 152304, 152319, 152332, 152345, 152359, 152371, 152379, + 152389, 152397, 152405, 152415, 152423, 152431, 152445, 152457, 152469, + 152478, 152489, 152498, 152507, 152514, 152523, 152532, 152539, 152544, + 152549, 152554, 152559, 152564, 152569, 152574, 152579, 152584, 152589, + 152594, 152599, 152604, 0, 0, 152613, 152622, 152631, 152640, 152645, + 152652, 152657, 152662, 152670, 152675, 152682, 152687, 152694, 152699, + 152704, 152711, 152718, 152723, 152732, 152738, 152744, 152752, 152758, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 152764, 152768, 152774, 152778, 152786, + 152790, 152794, 152798, 152806, 152810, 152816, 152825, 152829, 152833, + 152837, 152843, 152849, 152855, 152861, 152867, 152873, 152879, 152885, + 152891, 152899, 152907, 152915, 152923, 152928, 152934, 152938, 152942, + 152946, 152950, 152956, 152962, 152968, 152974, 152980, 152988, 152994, + 153002, 153010, 153018, 153026, 153034, 153038, 153046, 153052, 153060, + 153064, 153068, 153072, 153076, 153080, 153084, 153092, 153100, 153112, + 153124, 153130, 153140, 153148, 153158, 153170, 153174, 153180, 153186, + 153192, 153198, 153204, 153210, 153216, 153222, 153228, 153236, 153242, + 153248, 153254, 153262, 153270, 153281, 153292, 153298, 153304, 153314, + 153320, 153328, 153332, 153338, 153344, 153350, 153356, 153362, 153368, + 153374, 153378, 153384, 153390, 153398, 153406, 153414, 153420, 153428, + 153441, 153454, 153462, 153470, 153482, 153490, 153500, 153508, 153512, + 153516, 153520, 153524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153484, - 153489, 153494, 153499, 153506, 153513, 153520, 153527, 153532, 153537, - 153542, 153547, 153554, 153559, 153566, 153573, 153578, 153583, 153588, - 153595, 153600, 153605, 153612, 153619, 153624, 153629, 153634, 153641, - 153648, 153655, 153660, 153665, 153672, 153679, 153686, 153693, 153698, - 153703, 153708, 153715, 153720, 153725, 153730, 153737, 153746, 153753, - 153758, 153763, 153768, 153773, 153778, 153783, 153792, 153799, 153804, - 153811, 153818, 153823, 153828, 153833, 153840, 153845, 153852, 153859, - 153864, 153869, 153874, 153881, 153888, 153893, 153898, 153905, 153912, - 153919, 153924, 153929, 153934, 153939, 153946, 153955, 153964, 153969, - 153976, 153985, 153990, 153995, 154000, 154005, 154012, 154019, 154026, - 154033, 154038, 154043, 154048, 154055, 154062, 154069, 154074, 154079, - 154086, 154091, 154098, 154103, 154110, 154115, 154122, 154129, 154134, - 154139, 154144, 154149, 154154, 154159, 154164, 154169, 154174, 154181, - 154188, 154195, 154202, 154209, 154218, 154223, 154228, 154235, 154242, - 154247, 154254, 154261, 154268, 154275, 154282, 154289, 154294, 154299, - 154304, 154309, 154314, 154323, 154332, 154341, 154350, 154359, 154368, - 154377, 154386, 154391, 154402, 154413, 154422, 154427, 154432, 154437, - 154442, 154451, 154458, 154465, 154472, 154479, 154486, 154493, 154502, - 154511, 154522, 154531, 154542, 154551, 154558, 154567, 154578, 154587, - 154596, 154605, 154614, 154621, 154628, 154635, 154644, 154653, 154664, - 154673, 154682, 154693, 154698, 154703, 154714, 154722, 154731, 154740, - 154749, 154760, 154769, 154778, 154789, 154800, 154811, 154822, 154833, - 154844, 154851, 154858, 154865, 154872, 154883, 154892, 154899, 154906, - 154913, 154924, 154935, 154946, 154957, 154968, 154979, 154990, 155001, - 155008, 155015, 155024, 155033, 155040, 155047, 155054, 155063, 155072, - 155081, 155088, 155097, 155106, 155115, 155122, 155129, 155134, 155140, - 155147, 155154, 155161, 155168, 155175, 155182, 155191, 155200, 155209, - 155218, 155225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155234, 155240, 155245, - 155250, 155257, 155263, 155269, 155275, 155281, 155287, 155293, 155299, - 155303, 155307, 155313, 155319, 155325, 155329, 155334, 155339, 155343, - 155347, 155351, 155357, 155363, 155369, 155375, 155381, 155387, 155393, - 155399, 155405, 155415, 155425, 155431, 155437, 155447, 155457, 155463, - 0, 0, 155469, 155477, 155482, 155487, 155493, 155499, 155505, 155511, - 155517, 155523, 155530, 155537, 155543, 155549, 155555, 155561, 155567, - 155573, 155579, 155585, 155590, 155596, 155602, 155608, 155614, 155620, - 155629, 155635, 155640, 155648, 155655, 155662, 155671, 155680, 155689, - 155698, 155707, 155716, 155725, 155734, 155744, 155754, 155762, 155770, - 155779, 155788, 155794, 155800, 155806, 155812, 155820, 155828, 155832, - 155838, 155843, 155849, 155855, 155861, 155867, 155873, 155882, 155887, - 155894, 155899, 155904, 155909, 155915, 155921, 155927, 155934, 155939, - 155944, 155949, 155954, 155959, 155965, 155971, 155977, 155983, 155989, - 155995, 156001, 156007, 156012, 156017, 156022, 156027, 156032, 156037, - 156042, 156047, 156053, 156059, 156064, 156069, 156074, 156079, 156084, - 156090, 156097, 156101, 156105, 156109, 156113, 156117, 156121, 156125, - 156129, 156137, 156147, 156151, 156155, 156161, 156167, 156173, 156179, - 156185, 156191, 156197, 156203, 156209, 156215, 156221, 156227, 156233, - 156239, 156243, 156247, 156254, 156260, 156266, 156272, 156277, 156284, - 156289, 156295, 156301, 156307, 156313, 156318, 156322, 156328, 156332, - 156336, 156340, 156346, 156352, 156356, 156362, 156368, 156374, 156380, - 156386, 156394, 156402, 156408, 156414, 156420, 156426, 156438, 156450, - 156464, 156476, 156488, 156502, 156516, 156530, 156534, 156542, 156550, - 156555, 156559, 156563, 156567, 156571, 156575, 156579, 156583, 156589, - 156595, 156601, 156607, 156615, 156624, 156631, 156638, 156646, 156653, - 156665, 156677, 156689, 156701, 156708, 156712, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156716, 156723, 156730, 156737, - 156744, 156751, 156758, 156765, 156772, 156779, 156786, 156793, 156800, - 156807, 156814, 156821, 156828, 156835, 156842, 156849, 156856, 156863, - 156870, 156877, 156884, 156891, 156898, 156905, 156912, 156919, 156926, - 156933, 156940, 156947, 156954, 156961, 156968, 156975, 156982, 156989, - 156996, 157003, 157010, 157017, 157024, 157031, 157038, 157045, 157052, - 157059, 157066, 157073, 157080, 157087, 157094, 157101, 157108, 157115, - 157122, 157129, 157136, 157143, 157150, 157157, 157164, 157171, 157178, - 157183, 157188, 157193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153528, + 153533, 153538, 153543, 153550, 153557, 153564, 153571, 153576, 153581, + 153586, 153591, 153598, 153603, 153610, 153617, 153622, 153627, 153632, + 153639, 153644, 153649, 153656, 153663, 153668, 153673, 153678, 153685, + 153692, 153699, 153704, 153709, 153716, 153723, 153730, 153737, 153742, + 153747, 153752, 153759, 153764, 153769, 153774, 153781, 153790, 153797, + 153802, 153807, 153812, 153817, 153822, 153827, 153836, 153843, 153848, + 153855, 153862, 153867, 153872, 153877, 153884, 153889, 153896, 153903, + 153908, 153913, 153918, 153925, 153932, 153937, 153942, 153949, 153956, + 153963, 153968, 153973, 153978, 153983, 153990, 153999, 154008, 154013, + 154020, 154029, 154034, 154039, 154044, 154049, 154056, 154063, 154070, + 154077, 154082, 154087, 154092, 154099, 154106, 154113, 154118, 154123, + 154130, 154135, 154142, 154147, 154154, 154159, 154166, 154173, 154178, + 154183, 154188, 154193, 154198, 154203, 154208, 154213, 154218, 154225, + 154232, 154239, 154246, 154253, 154262, 154267, 154272, 154279, 154286, + 154291, 154298, 154305, 154312, 154319, 154326, 154333, 154338, 154343, + 154348, 154353, 154358, 154367, 154376, 154385, 154394, 154403, 154412, + 154421, 154430, 154435, 154446, 154457, 154466, 154471, 154476, 154481, + 154486, 154495, 154502, 154509, 154516, 154523, 154530, 154537, 154546, + 154555, 154566, 154575, 154586, 154595, 154602, 154611, 154622, 154631, + 154640, 154649, 154658, 154665, 154672, 154679, 154688, 154697, 154708, + 154717, 154726, 154737, 154742, 154747, 154758, 154766, 154775, 154784, + 154793, 154804, 154813, 154822, 154833, 154844, 154855, 154866, 154877, + 154888, 154895, 154902, 154909, 154916, 154927, 154936, 154943, 154950, + 154957, 154968, 154979, 154990, 155001, 155012, 155023, 155034, 155045, + 155052, 155059, 155068, 155077, 155084, 155091, 155098, 155107, 155116, + 155125, 155132, 155141, 155150, 155159, 155166, 155173, 155178, 155184, + 155191, 155198, 155205, 155212, 155219, 155226, 155235, 155244, 155253, + 155262, 155269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155278, 155284, 155289, + 155294, 155301, 155307, 155313, 155319, 155325, 155331, 155337, 155343, + 155347, 155351, 155357, 155363, 155369, 155373, 155378, 155383, 155387, + 155391, 155395, 155401, 155407, 155413, 155419, 155425, 155431, 155437, + 155443, 155449, 155459, 155469, 155475, 155481, 155491, 155501, 155507, + 0, 0, 155513, 155521, 155526, 155531, 155537, 155543, 155549, 155555, + 155561, 155567, 155574, 155581, 155587, 155593, 155599, 155605, 155611, + 155617, 155623, 155629, 155634, 155640, 155646, 155652, 155658, 155664, + 155673, 155679, 155684, 155692, 155699, 155706, 155715, 155724, 155733, + 155742, 155751, 155760, 155769, 155778, 155788, 155798, 155806, 155814, + 155823, 155832, 155838, 155844, 155850, 155856, 155864, 155872, 155876, + 155882, 155887, 155893, 155899, 155905, 155911, 155917, 155926, 155931, + 155938, 155943, 155948, 155953, 155959, 155965, 155971, 155978, 155983, + 155988, 155993, 155998, 156003, 156009, 156015, 156021, 156027, 156033, + 156039, 156045, 156051, 156056, 156061, 156066, 156071, 156076, 156081, + 156086, 156091, 156097, 156103, 156108, 156113, 156118, 156123, 156128, + 156134, 156141, 156145, 156149, 156153, 156157, 156161, 156165, 156169, + 156173, 156181, 156191, 156195, 156199, 156205, 156211, 156217, 156223, + 156229, 156235, 156241, 156247, 156253, 156259, 156265, 156271, 156277, + 156283, 156287, 156291, 156298, 156304, 156310, 156316, 156321, 156328, + 156333, 156339, 156345, 156351, 156357, 156362, 156366, 156372, 156376, + 156380, 156384, 156390, 156396, 156400, 156406, 156412, 156418, 156424, + 156430, 156438, 156446, 156452, 156458, 156464, 156470, 156482, 156494, + 156508, 156520, 156532, 156546, 156560, 156574, 156578, 156586, 156594, + 156599, 156603, 156607, 156611, 156615, 156619, 156623, 156627, 156633, + 156639, 156645, 156651, 156659, 156668, 156675, 156682, 156690, 156697, + 156709, 156721, 156733, 156745, 156752, 156756, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156760, 156767, 156774, 156781, + 156788, 156795, 156802, 156809, 156816, 156823, 156830, 156837, 156844, + 156851, 156858, 156865, 156872, 156879, 156886, 156893, 156900, 156907, + 156914, 156921, 156928, 156935, 156942, 156949, 156956, 156963, 156970, + 156977, 156984, 156991, 156998, 157005, 157012, 157019, 157026, 157033, + 157040, 157047, 157054, 157061, 157068, 157075, 157082, 157089, 157096, + 157103, 157110, 157117, 157124, 157131, 157138, 157145, 157152, 157159, + 157166, 157173, 157180, 157187, 157194, 157201, 157208, 157215, 157222, + 157227, 157232, 157237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 157197, 157203, 157208, 157213, 157218, - 157223, 157228, 157233, 157238, 157243, 157248, 157254, 157260, 157266, - 157272, 157278, 157284, 157290, 157296, 157302, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 157308, 157314, 157319, 157324, 157329, 157334, 157339, - 157344, 157349, 157354, 157359, 157365, 157371, 157377, 157383, 157389, - 157395, 157401, 157407, 157413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 157419, 157424, 157431, 157438, 157445, 157452, 157457, 157462, 157469, - 157474, 157479, 157486, 157491, 157496, 157501, 157508, 157517, 157522, - 157527, 157532, 157537, 157542, 157547, 157554, 157559, 157564, 157569, - 157574, 157579, 157584, 157589, 157594, 157599, 157604, 157609, 157614, - 157620, 157625, 157630, 157635, 157640, 157645, 157650, 157655, 157660, - 157665, 157674, 157679, 157687, 157692, 157697, 157702, 157707, 157712, - 157717, 157722, 157731, 157736, 157741, 157746, 157751, 157756, 157763, - 157768, 157775, 157780, 157785, 157790, 157795, 157800, 157805, 157810, - 157815, 157820, 157825, 157830, 157835, 157840, 157845, 157850, 157855, - 157860, 157865, 157870, 157879, 157884, 157889, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 157894, 157902, 157910, 157918, 157926, 157934, 157942, 157950, - 157958, 157966, 157974, 157982, 157990, 157998, 158006, 158014, 158022, - 158030, 158038, 158043, 158048, 158053, 158058, 158063, 158067, 0, 0, 0, - 0, 0, 0, 0, 158071, 158075, 158080, 158085, 158090, 158094, 158099, - 158104, 158109, 158113, 158118, 158123, 158127, 158132, 158137, 158141, - 158146, 158151, 158155, 158160, 158165, 158169, 158174, 158179, 158184, - 158189, 158194, 158198, 158203, 158208, 158213, 158217, 158222, 158227, - 158232, 158236, 158241, 158246, 158250, 158255, 158260, 158264, 158269, - 158274, 158278, 158283, 158288, 158292, 158297, 158302, 158307, 158312, - 158317, 158321, 158326, 158331, 158336, 158340, 158345, 158350, 158355, - 158359, 158364, 158369, 158373, 158378, 158383, 158387, 158392, 158397, - 158401, 158406, 158411, 158415, 158420, 158425, 158430, 158435, 158440, - 158444, 158449, 158454, 158459, 158463, 158468, 0, 158473, 158477, - 158482, 158487, 158491, 158496, 158501, 158505, 158510, 158515, 158519, - 158524, 158529, 158533, 158538, 158543, 158548, 158553, 158558, 158563, - 158569, 158575, 158581, 158586, 158592, 158598, 158604, 158609, 158615, - 158621, 158626, 158632, 158638, 158643, 158649, 158655, 158660, 158666, - 158672, 158677, 158683, 158689, 158695, 158701, 158707, 158712, 158718, - 158724, 158730, 158735, 158741, 158747, 158753, 158758, 158764, 158770, - 158775, 158781, 158787, 158792, 158798, 158804, 158809, 158815, 158821, - 158826, 158832, 158838, 158844, 158850, 158856, 0, 158860, 158865, 0, 0, - 158870, 0, 0, 158875, 158880, 0, 0, 158885, 158890, 158894, 158899, 0, - 158904, 158909, 158914, 158918, 158923, 158928, 158933, 158938, 158943, - 158947, 158952, 158957, 0, 158962, 0, 158967, 158972, 158976, 158981, - 158986, 158990, 158995, 0, 159000, 159005, 159010, 159014, 159019, - 159024, 159028, 159033, 159038, 159043, 159048, 159053, 159058, 159064, - 159070, 159076, 159081, 159087, 159093, 159099, 159104, 159110, 159116, - 159121, 159127, 159133, 159138, 159144, 159150, 159155, 159161, 159167, - 159172, 159178, 159184, 159190, 159196, 159202, 159207, 159213, 159219, - 159225, 159230, 159236, 159242, 159248, 159253, 159259, 159265, 159270, - 159276, 159282, 159287, 159293, 159299, 159304, 159310, 159316, 159321, - 159327, 159333, 159339, 159345, 159351, 159356, 0, 159362, 159368, - 159373, 159379, 0, 0, 159385, 159391, 159397, 159402, 159408, 159414, - 159419, 159425, 0, 159431, 159437, 159443, 159448, 159454, 159460, - 159466, 0, 159472, 159477, 159483, 159489, 159495, 159500, 159506, - 159512, 159518, 159523, 159529, 159535, 159540, 159546, 159552, 159557, - 159563, 159569, 159574, 159580, 159586, 159591, 159597, 159603, 159609, - 159615, 159621, 159626, 0, 159632, 159638, 159643, 159649, 0, 159655, - 159660, 159666, 159672, 159677, 0, 159683, 0, 0, 0, 159688, 159694, - 159700, 159705, 159711, 159717, 159723, 0, 159729, 159734, 159740, - 159746, 159752, 159757, 159763, 159769, 159775, 159780, 159786, 159792, - 159797, 159803, 159809, 159814, 159820, 159826, 159831, 159837, 159843, - 159848, 159854, 159860, 159866, 159872, 159878, 159884, 159891, 159898, - 159905, 159911, 159918, 159925, 159932, 159938, 159945, 159952, 159958, - 159965, 159972, 159978, 159985, 159992, 159998, 160005, 160012, 160018, - 160025, 160032, 160039, 160046, 160053, 160059, 160066, 160073, 160080, - 160086, 160093, 160100, 160107, 160113, 160120, 160127, 160133, 160140, - 160147, 160153, 160160, 160167, 160173, 160180, 160187, 160193, 160200, - 160207, 160214, 160221, 160228, 160232, 160237, 160242, 160247, 160251, - 160256, 160261, 160266, 160270, 160275, 160280, 160284, 160289, 160294, - 160298, 160303, 160308, 160312, 160317, 160322, 160326, 160331, 160336, - 160341, 160346, 160351, 160355, 160360, 160365, 160370, 160374, 160379, - 160384, 160389, 160393, 160398, 160403, 160407, 160412, 160417, 160421, - 160426, 160431, 160435, 160440, 160445, 160449, 160454, 160459, 160464, - 160469, 160474, 160479, 160485, 160491, 160497, 160502, 160508, 160514, - 160520, 160525, 160531, 160537, 160542, 160548, 160554, 160559, 160565, - 160571, 160576, 160582, 160588, 160593, 160599, 160605, 160611, 160617, - 160623, 160628, 160634, 160640, 160646, 160651, 160657, 160663, 160669, - 160674, 160680, 160686, 160691, 160697, 160703, 160708, 160714, 160720, - 160725, 160731, 160737, 160742, 160748, 160754, 160760, 160766, 160772, - 160777, 160783, 160789, 160795, 160800, 160806, 160812, 160818, 160823, - 160829, 160835, 160840, 160846, 160852, 160857, 160863, 160869, 160874, - 160880, 160886, 160891, 160897, 160903, 160909, 160915, 160921, 160926, - 160932, 160938, 160944, 160949, 160955, 160961, 160967, 160972, 160978, - 160984, 160989, 160995, 161001, 161006, 161012, 161018, 161023, 161029, - 161035, 161040, 161046, 161052, 161058, 161064, 161070, 161076, 161083, - 161090, 161097, 161103, 161110, 161117, 161124, 161130, 161137, 161144, - 161150, 161157, 161164, 161170, 161177, 161184, 161190, 161197, 161204, - 161210, 161217, 161224, 161231, 161238, 161245, 161251, 161258, 161265, - 161272, 161278, 161285, 161292, 161299, 161305, 161312, 161319, 161325, - 161332, 161339, 161345, 161352, 161359, 161365, 161372, 161379, 161385, - 161392, 161399, 161406, 161413, 161420, 161425, 161431, 161437, 161443, - 161448, 161454, 161460, 161466, 161471, 161477, 161483, 161488, 161494, - 161500, 161505, 161511, 161517, 161522, 161528, 161534, 161539, 161545, - 161551, 161557, 161563, 161569, 161574, 161580, 161586, 161592, 161597, - 161603, 161609, 161615, 161620, 161626, 161632, 161637, 161643, 161649, - 161654, 161660, 161666, 161671, 161677, 161683, 161688, 161694, 161700, - 161706, 161712, 161718, 161724, 0, 0, 161731, 161736, 161741, 161746, - 161751, 161756, 161761, 161766, 161771, 161776, 161781, 161786, 161791, - 161796, 161801, 161806, 161811, 161816, 161822, 161827, 161832, 161837, - 161842, 161847, 161852, 161857, 161861, 161866, 161871, 161876, 161881, - 161886, 161891, 161896, 161901, 161906, 161911, 161916, 161921, 161926, - 161931, 161936, 161941, 161946, 161952, 161957, 161962, 161967, 161972, - 161977, 161982, 161987, 161993, 161998, 162003, 162008, 162013, 162018, - 162023, 162028, 162033, 162038, 162043, 162048, 162053, 162058, 162063, - 162068, 162073, 162078, 162083, 162088, 162093, 162098, 162103, 162108, - 162114, 162119, 162124, 162129, 162134, 162139, 162144, 162149, 162153, - 162158, 162163, 162168, 162173, 162178, 162183, 162188, 162193, 162198, - 162203, 162208, 162213, 162218, 162223, 162228, 162233, 162238, 162244, - 162249, 162254, 162259, 162264, 162269, 162274, 162279, 162285, 162290, - 162295, 162300, 162305, 162310, 162315, 162321, 162327, 162333, 162339, - 162345, 162351, 162357, 162363, 162369, 162375, 162381, 162387, 162393, - 162399, 162405, 162411, 162417, 162424, 162430, 162436, 162442, 162448, - 162454, 162460, 162466, 162471, 162477, 162483, 162489, 162495, 162501, - 162507, 162513, 162519, 162525, 162531, 162537, 162543, 162549, 162555, - 162561, 162567, 162573, 162580, 162586, 162592, 162598, 162604, 162610, - 162616, 162622, 162629, 162635, 162641, 162647, 162653, 162659, 162665, - 162671, 162677, 162683, 162689, 162695, 162701, 162707, 162713, 162719, - 162725, 162731, 162737, 162743, 162749, 162755, 162761, 162767, 162774, - 162780, 162786, 162792, 162798, 162804, 162810, 162816, 162821, 162827, - 162833, 162839, 162845, 162851, 162857, 162863, 162869, 162875, 162881, - 162887, 162893, 162899, 162905, 162911, 162917, 162923, 162930, 162936, - 162942, 162948, 162954, 162960, 162966, 162972, 162979, 162985, 162991, - 162997, 163003, 163009, 163015, 163022, 163029, 163036, 163043, 163050, - 163057, 163064, 163071, 163078, 163085, 163092, 163099, 163106, 163113, - 163120, 163127, 163134, 163142, 163149, 163156, 163163, 163170, 163177, - 163184, 163191, 163197, 163204, 163211, 163218, 163225, 163232, 163239, - 163246, 163253, 163260, 163267, 163274, 163281, 163288, 163295, 163302, - 163309, 163316, 163324, 163331, 163338, 163345, 163352, 163359, 163366, - 163373, 163381, 163388, 163395, 163402, 163409, 163416, 163423, 163428, - 0, 0, 163433, 163438, 163442, 163446, 163450, 163454, 163458, 163462, - 163466, 163470, 163474, 163480, 163485, 163490, 163495, 163500, 163505, - 163510, 163515, 163520, 163525, 163530, 163534, 163538, 163542, 163546, - 163550, 163554, 163558, 163562, 163566, 163572, 163577, 163582, 163587, - 163592, 163597, 163602, 163607, 163612, 163617, 163623, 163628, 163633, - 163638, 163643, 163648, 163653, 163658, 163663, 163668, 163672, 163677, - 163682, 163687, 163692, 163697, 163702, 163708, 163716, 163723, 163728, - 163733, 163740, 163746, 163751, 163757, 163763, 163771, 163777, 163784, - 163792, 163798, 163807, 163816, 163824, 163832, 163838, 163845, 163853, - 163861, 163867, 163874, 163883, 163892, 163899, 163910, 163920, 163930, - 163940, 163950, 163957, 163964, 163971, 163978, 163987, 163996, 164007, - 164018, 164027, 164036, 164047, 164056, 164065, 164076, 164085, 164094, - 164102, 164110, 164121, 164132, 164140, 164149, 164158, 164165, 164176, - 164187, 164196, 164205, 164212, 164221, 164230, 164239, 164250, 164259, - 164269, 164278, 164287, 164298, 164311, 164326, 164337, 164350, 164362, - 164371, 164382, 164393, 164402, 164413, 164427, 164442, 164445, 164454, - 164459, 164465, 164473, 164479, 164485, 164494, 164501, 164511, 164523, - 164530, 164533, 164539, 164546, 164552, 164557, 164560, 164565, 164568, - 164576, 164582, 164591, 164598, 164606, 164612, 164617, 164620, 164623, - 164626, 164632, 164639, 164645, 164650, 164658, 164661, 164666, 164674, - 164680, 164689, 164696, 164706, 164715, 164718, 164724, 164731, 164738, - 164745, 164750, 164758, 164766, 164775, 164781, 164790, 164799, 164808, - 164814, 164823, 164830, 164837, 164844, 164852, 164858, 164866, 164872, - 164879, 164886, 164894, 164905, 164915, 164921, 164928, 164935, 164942, - 164948, 164955, 164962, 164967, 164974, 164982, 164991, 164997, 165009, - 165020, 165026, 165034, 165040, 165047, 165054, 165061, 165067, 165074, - 165083, 165089, 165095, 165102, 165109, 165117, 165127, 165137, 165147, - 165157, 165165, 165173, 165183, 165191, 165196, 165201, 165206, 165212, - 165219, 165226, 165232, 165238, 165243, 165250, 165258, 165268, 165276, - 165284, 165294, 165304, 165312, 165322, 165332, 165344, 165356, 165368, - 165378, 165384, 165390, 165397, 165406, 165415, 165424, 165433, 165443, - 165452, 165461, 165470, 165475, 165481, 165490, 165500, 165509, 165515, - 165521, 165528, 165535, 165542, 165548, 165555, 165562, 165569, 165575, - 165579, 165584, 165591, 165598, 165605, 165610, 165618, 165626, 165635, - 165643, 165650, 165658, 165667, 165677, 165680, 165684, 165689, 165694, - 165699, 165704, 165709, 165714, 165719, 165724, 165729, 165734, 165739, - 165744, 165749, 165754, 165759, 165764, 165769, 165776, 165782, 165789, - 165795, 165800, 165807, 165813, 165820, 165826, 165831, 165838, 165845, - 165852, 165858, 165864, 165873, 165882, 165892, 165899, 165906, 165915, - 165924, 165933, 165942, 165951, 165957, 165965, 165971, 165981, 165986, - 165995, 166004, 166011, 166022, 166029, 166036, 166043, 166050, 166057, - 166064, 166071, 166078, 166085, 166092, 166098, 166104, 166110, 166117, - 166124, 166131, 166138, 166145, 166152, 166159, 166166, 166173, 166180, - 166187, 166194, 166199, 166208, 166217, 166226, 166233, 166240, 166247, - 166254, 166261, 166268, 166275, 166282, 166291, 166300, 166309, 166318, - 166327, 166336, 166345, 166354, 166363, 166372, 166381, 166390, 166399, - 166405, 166413, 166419, 166429, 166434, 166443, 166452, 166461, 166472, - 166477, 166484, 166491, 166498, 166503, 166509, 166515, 166521, 166528, - 166535, 166542, 166549, 166556, 166563, 166570, 166577, 166584, 166591, - 166598, 166605, 166610, 166619, 166628, 166637, 166646, 166655, 166664, - 166673, 166682, 166693, 166704, 166711, 166718, 166725, 166732, 166739, - 166746, 166754, 166764, 166774, 166784, 166795, 166806, 166817, 166826, - 166835, 166844, 166849, 166854, 166859, 166864, 166875, 166886, 166897, - 166908, 166919, 166929, 166940, 166949, 166958, 166967, 166976, 166985, - 166993, 167002, 167013, 167024, 167035, 167046, 167057, 167069, 167082, - 167094, 167107, 167119, 167132, 167144, 167157, 167168, 167179, 167188, - 167196, 167205, 167216, 167227, 167239, 167252, 167266, 167281, 167293, - 167306, 167318, 167331, 167342, 167353, 167362, 167370, 167379, 167386, - 167393, 167400, 167407, 167414, 167421, 167428, 167435, 167442, 167449, - 167454, 167459, 167464, 167471, 167481, 167492, 167502, 167513, 167527, - 167542, 167557, 167571, 167586, 167601, 167612, 167623, 167636, 167649, - 167658, 167667, 167680, 167693, 167700, 167707, 167712, 167717, 167722, - 167727, 167732, 167739, 167748, 167753, 167756, 167761, 167768, 167775, - 167782, 167789, 167796, 167803, 167816, 167830, 167845, 167852, 167859, - 167866, 167875, 167883, 167891, 167900, 167905, 167910, 167915, 167920, - 167925, 167930, 167937, 167944, 167950, 167957, 167963, 167970, 167975, - 167980, 167985, 167990, 167995, 168002, 168009, 168014, 168021, 168028, - 168033, 168038, 168043, 168048, 168053, 168058, 168065, 168072, 168079, - 168082, 168087, 168092, 168097, 168102, 168109, 168116, 168124, 168132, - 168137, 168142, 168149, 168156, 168163, 168168, 168175, 168182, 168187, - 168194, 168201, 168208, 168215, 168222, 168229, 168238, 168247, 168254, - 168263, 168272, 168277, 168284, 168291, 168296, 168303, 168310, 168317, - 168324, 168331, 168336, 168343, 168350, 168359, 168366, 168375, 168386, - 168395, 168404, 168413, 168422, 168425, 168430, 168437, 168446, 168453, - 168462, 168469, 168474, 168479, 168482, 168485, 168488, 168495, 168502, - 168511, 168520, 168529, 168536, 168543, 168548, 168560, 168565, 168570, - 168575, 168580, 168585, 168590, 168595, 168600, 168603, 168608, 168613, - 168618, 168623, 168628, 168635, 168640, 168647, 168650, 168655, 168658, - 168661, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168664, 168669, - 168674, 168679, 168684, 0, 168689, 168694, 168699, 168704, 168709, - 168714, 168719, 168724, 168729, 168734, 168739, 168744, 168749, 168754, - 168759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 157241, 157247, 157252, 157257, 157262, + 157267, 157272, 157277, 157282, 157287, 157292, 157298, 157304, 157310, + 157316, 157322, 157328, 157334, 157340, 157346, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 157352, 157358, 157363, 157368, 157373, 157378, 157383, + 157388, 157393, 157398, 157403, 157409, 157415, 157421, 157427, 157433, + 157439, 157445, 157451, 157457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157463, 157468, 157475, 157482, 157489, 157496, 157501, 157506, 157513, + 157518, 157523, 157530, 157535, 157540, 157545, 157552, 157561, 157566, + 157571, 157576, 157581, 157586, 157591, 157598, 157603, 157608, 157613, + 157618, 157623, 157628, 157633, 157638, 157643, 157648, 157653, 157658, + 157664, 157669, 157674, 157679, 157684, 157689, 157694, 157699, 157704, + 157709, 157718, 157723, 157731, 157736, 157741, 157746, 157751, 157756, + 157761, 157766, 157775, 157780, 157785, 157790, 157795, 157800, 157807, + 157812, 157819, 157824, 157829, 157834, 157839, 157844, 157849, 157854, + 157859, 157864, 157869, 157874, 157879, 157884, 157889, 157894, 157899, + 157904, 157909, 157914, 157923, 157928, 157933, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 157938, 157946, 157954, 157962, 157970, 157978, 157986, 157994, + 158002, 158010, 158018, 158026, 158034, 158042, 158050, 158058, 158066, + 158074, 158082, 158087, 158092, 158097, 158102, 158107, 158111, 0, 0, 0, + 0, 0, 0, 0, 158115, 158119, 158124, 158129, 158134, 158138, 158143, + 158148, 158153, 158157, 158162, 158167, 158171, 158176, 158181, 158185, + 158190, 158195, 158199, 158204, 158209, 158213, 158218, 158223, 158228, + 158233, 158238, 158242, 158247, 158252, 158257, 158261, 158266, 158271, + 158276, 158280, 158285, 158290, 158294, 158299, 158304, 158308, 158313, + 158318, 158322, 158327, 158332, 158336, 158341, 158346, 158351, 158356, + 158361, 158365, 158370, 158375, 158380, 158384, 158389, 158394, 158399, + 158403, 158408, 158413, 158417, 158422, 158427, 158431, 158436, 158441, + 158445, 158450, 158455, 158459, 158464, 158469, 158474, 158479, 158484, + 158488, 158493, 158498, 158503, 158507, 158512, 0, 158517, 158521, + 158526, 158531, 158535, 158540, 158545, 158549, 158554, 158559, 158563, + 158568, 158573, 158577, 158582, 158587, 158592, 158597, 158602, 158607, + 158613, 158619, 158625, 158630, 158636, 158642, 158648, 158653, 158659, + 158665, 158670, 158676, 158682, 158687, 158693, 158699, 158704, 158710, + 158716, 158721, 158727, 158733, 158739, 158745, 158751, 158756, 158762, + 158768, 158774, 158779, 158785, 158791, 158797, 158802, 158808, 158814, + 158819, 158825, 158831, 158836, 158842, 158848, 158853, 158859, 158865, + 158870, 158876, 158882, 158888, 158894, 158900, 0, 158904, 158909, 0, 0, + 158914, 0, 0, 158919, 158924, 0, 0, 158929, 158934, 158938, 158943, 0, + 158948, 158953, 158958, 158962, 158967, 158972, 158977, 158982, 158987, + 158991, 158996, 159001, 0, 159006, 0, 159011, 159016, 159020, 159025, + 159030, 159034, 159039, 0, 159044, 159049, 159054, 159058, 159063, + 159068, 159072, 159077, 159082, 159087, 159092, 159097, 159102, 159108, + 159114, 159120, 159125, 159131, 159137, 159143, 159148, 159154, 159160, + 159165, 159171, 159177, 159182, 159188, 159194, 159199, 159205, 159211, + 159216, 159222, 159228, 159234, 159240, 159246, 159251, 159257, 159263, + 159269, 159274, 159280, 159286, 159292, 159297, 159303, 159309, 159314, + 159320, 159326, 159331, 159337, 159343, 159348, 159354, 159360, 159365, + 159371, 159377, 159383, 159389, 159395, 159400, 0, 159406, 159412, + 159417, 159423, 0, 0, 159429, 159435, 159441, 159446, 159452, 159458, + 159463, 159469, 0, 159475, 159481, 159487, 159492, 159498, 159504, + 159510, 0, 159516, 159521, 159527, 159533, 159539, 159544, 159550, + 159556, 159562, 159567, 159573, 159579, 159584, 159590, 159596, 159601, + 159607, 159613, 159618, 159624, 159630, 159635, 159641, 159647, 159653, + 159659, 159665, 159670, 0, 159676, 159682, 159687, 159693, 0, 159699, + 159704, 159710, 159716, 159721, 0, 159727, 0, 0, 0, 159732, 159738, + 159744, 159749, 159755, 159761, 159767, 0, 159773, 159778, 159784, + 159790, 159796, 159801, 159807, 159813, 159819, 159824, 159830, 159836, + 159841, 159847, 159853, 159858, 159864, 159870, 159875, 159881, 159887, + 159892, 159898, 159904, 159910, 159916, 159922, 159928, 159935, 159942, + 159949, 159955, 159962, 159969, 159976, 159982, 159989, 159996, 160002, + 160009, 160016, 160022, 160029, 160036, 160042, 160049, 160056, 160062, + 160069, 160076, 160083, 160090, 160097, 160103, 160110, 160117, 160124, + 160130, 160137, 160144, 160151, 160157, 160164, 160171, 160177, 160184, + 160191, 160197, 160204, 160211, 160217, 160224, 160231, 160237, 160244, + 160251, 160258, 160265, 160272, 160276, 160281, 160286, 160291, 160295, + 160300, 160305, 160310, 160314, 160319, 160324, 160328, 160333, 160338, + 160342, 160347, 160352, 160356, 160361, 160366, 160370, 160375, 160380, + 160385, 160390, 160395, 160399, 160404, 160409, 160414, 160418, 160423, + 160428, 160433, 160437, 160442, 160447, 160451, 160456, 160461, 160465, + 160470, 160475, 160479, 160484, 160489, 160493, 160498, 160503, 160508, + 160513, 160518, 160523, 160529, 160535, 160541, 160546, 160552, 160558, + 160564, 160569, 160575, 160581, 160586, 160592, 160598, 160603, 160609, + 160615, 160620, 160626, 160632, 160637, 160643, 160649, 160655, 160661, + 160667, 160672, 160678, 160684, 160690, 160695, 160701, 160707, 160713, + 160718, 160724, 160730, 160735, 160741, 160747, 160752, 160758, 160764, + 160769, 160775, 160781, 160786, 160792, 160798, 160804, 160810, 160816, + 160821, 160827, 160833, 160839, 160844, 160850, 160856, 160862, 160867, + 160873, 160879, 160884, 160890, 160896, 160901, 160907, 160913, 160918, + 160924, 160930, 160935, 160941, 160947, 160953, 160959, 160965, 160970, + 160976, 160982, 160988, 160993, 160999, 161005, 161011, 161016, 161022, + 161028, 161033, 161039, 161045, 161050, 161056, 161062, 161067, 161073, + 161079, 161084, 161090, 161096, 161102, 161108, 161114, 161120, 161127, + 161134, 161141, 161147, 161154, 161161, 161168, 161174, 161181, 161188, + 161194, 161201, 161208, 161214, 161221, 161228, 161234, 161241, 161248, + 161254, 161261, 161268, 161275, 161282, 161289, 161295, 161302, 161309, + 161316, 161322, 161329, 161336, 161343, 161349, 161356, 161363, 161369, + 161376, 161383, 161389, 161396, 161403, 161409, 161416, 161423, 161429, + 161436, 161443, 161450, 161457, 161464, 161469, 161475, 161481, 161487, + 161492, 161498, 161504, 161510, 161515, 161521, 161527, 161532, 161538, + 161544, 161549, 161555, 161561, 161566, 161572, 161578, 161583, 161589, + 161595, 161601, 161607, 161613, 161618, 161624, 161630, 161636, 161641, + 161647, 161653, 161659, 161664, 161670, 161676, 161681, 161687, 161693, + 161698, 161704, 161710, 161715, 161721, 161727, 161732, 161738, 161744, + 161750, 161756, 161762, 161768, 0, 0, 161775, 161780, 161785, 161790, + 161795, 161800, 161805, 161810, 161815, 161820, 161825, 161830, 161835, + 161840, 161845, 161850, 161855, 161860, 161866, 161871, 161876, 161881, + 161886, 161891, 161896, 161901, 161905, 161910, 161915, 161920, 161925, + 161930, 161935, 161940, 161945, 161950, 161955, 161960, 161965, 161970, + 161975, 161980, 161985, 161990, 161996, 162001, 162006, 162011, 162016, + 162021, 162026, 162031, 162037, 162042, 162047, 162052, 162057, 162062, + 162067, 162072, 162077, 162082, 162087, 162092, 162097, 162102, 162107, + 162112, 162117, 162122, 162127, 162132, 162137, 162142, 162147, 162152, + 162158, 162163, 162168, 162173, 162178, 162183, 162188, 162193, 162197, + 162202, 162207, 162212, 162217, 162222, 162227, 162232, 162237, 162242, + 162247, 162252, 162257, 162262, 162267, 162272, 162277, 162282, 162288, + 162293, 162298, 162303, 162308, 162313, 162318, 162323, 162329, 162334, + 162339, 162344, 162349, 162354, 162359, 162365, 162371, 162377, 162383, + 162389, 162395, 162401, 162407, 162413, 162419, 162425, 162431, 162437, + 162443, 162449, 162455, 162461, 162468, 162474, 162480, 162486, 162492, + 162498, 162504, 162510, 162515, 162521, 162527, 162533, 162539, 162545, + 162551, 162557, 162563, 162569, 162575, 162581, 162587, 162593, 162599, + 162605, 162611, 162617, 162624, 162630, 162636, 162642, 162648, 162654, + 162660, 162666, 162673, 162679, 162685, 162691, 162697, 162703, 162709, + 162715, 162721, 162727, 162733, 162739, 162745, 162751, 162757, 162763, + 162769, 162775, 162781, 162787, 162793, 162799, 162805, 162811, 162818, + 162824, 162830, 162836, 162842, 162848, 162854, 162860, 162865, 162871, + 162877, 162883, 162889, 162895, 162901, 162907, 162913, 162919, 162925, + 162931, 162937, 162943, 162949, 162955, 162961, 162967, 162974, 162980, + 162986, 162992, 162998, 163004, 163010, 163016, 163023, 163029, 163035, + 163041, 163047, 163053, 163059, 163066, 163073, 163080, 163087, 163094, + 163101, 163108, 163115, 163122, 163129, 163136, 163143, 163150, 163157, + 163164, 163171, 163178, 163186, 163193, 163200, 163207, 163214, 163221, + 163228, 163235, 163241, 163248, 163255, 163262, 163269, 163276, 163283, + 163290, 163297, 163304, 163311, 163318, 163325, 163332, 163339, 163346, + 163353, 163360, 163368, 163375, 163382, 163389, 163396, 163403, 163410, + 163417, 163425, 163432, 163439, 163446, 163453, 163460, 163467, 163472, + 0, 0, 163477, 163482, 163486, 163490, 163494, 163498, 163502, 163506, + 163510, 163514, 163518, 163524, 163529, 163534, 163539, 163544, 163549, + 163554, 163559, 163564, 163569, 163574, 163578, 163582, 163586, 163590, + 163594, 163598, 163602, 163606, 163610, 163616, 163621, 163626, 163631, + 163636, 163641, 163646, 163651, 163656, 163661, 163667, 163672, 163677, + 163682, 163687, 163692, 163697, 163702, 163707, 163712, 163716, 163721, + 163726, 163731, 163736, 163741, 163746, 163752, 163760, 163767, 163772, + 163777, 163784, 163790, 163795, 163801, 163807, 163815, 163821, 163828, + 163836, 163842, 163851, 163860, 163868, 163876, 163882, 163889, 163897, + 163905, 163911, 163918, 163927, 163936, 163943, 163954, 163964, 163974, + 163984, 163994, 164001, 164008, 164015, 164022, 164031, 164040, 164051, + 164062, 164071, 164080, 164091, 164100, 164109, 164120, 164129, 164138, + 164146, 164154, 164165, 164176, 164184, 164193, 164202, 164209, 164220, + 164231, 164240, 164249, 164256, 164265, 164274, 164283, 164294, 164303, + 164313, 164322, 164331, 164342, 164355, 164370, 164381, 164394, 164406, + 164415, 164426, 164437, 164446, 164457, 164471, 164486, 164489, 164498, + 164503, 164509, 164517, 164523, 164529, 164538, 164545, 164555, 164567, + 164574, 164577, 164583, 164590, 164596, 164601, 164604, 164609, 164612, + 164620, 164626, 164635, 164642, 164650, 164656, 164661, 164664, 164667, + 164670, 164676, 164683, 164689, 164694, 164702, 164705, 164710, 164718, + 164724, 164733, 164740, 164750, 164759, 164762, 164768, 164775, 164782, + 164789, 164794, 164802, 164810, 164819, 164825, 164834, 164843, 164852, + 164858, 164867, 164874, 164881, 164888, 164896, 164902, 164910, 164916, + 164923, 164930, 164938, 164949, 164959, 164965, 164972, 164979, 164986, + 164992, 164999, 165006, 165011, 165018, 165026, 165035, 165041, 165053, + 165064, 165070, 165078, 165084, 165091, 165098, 165105, 165111, 165118, + 165127, 165133, 165139, 165146, 165153, 165161, 165171, 165181, 165191, + 165201, 165209, 165217, 165227, 165235, 165240, 165245, 165250, 165256, + 165263, 165270, 165276, 165282, 165287, 165294, 165302, 165312, 165320, + 165328, 165338, 165348, 165356, 165366, 165376, 165388, 165400, 165412, + 165422, 165428, 165434, 165441, 165450, 165459, 165468, 165477, 165487, + 165496, 165505, 165514, 165519, 165525, 165534, 165544, 165553, 165559, + 165565, 165572, 165579, 165586, 165592, 165599, 165606, 165613, 165619, + 165623, 165628, 165635, 165642, 165649, 165654, 165662, 165670, 165679, + 165687, 165694, 165702, 165711, 165721, 165724, 165728, 165733, 165738, + 165743, 165748, 165753, 165758, 165763, 165768, 165773, 165778, 165783, + 165788, 165793, 165798, 165803, 165808, 165813, 165820, 165826, 165833, + 165839, 165844, 165851, 165857, 165864, 165870, 165875, 165882, 165889, + 165896, 165902, 165908, 165917, 165926, 165936, 165943, 165950, 165959, + 165968, 165977, 165986, 165995, 166001, 166009, 166015, 166025, 166030, + 166039, 166048, 166055, 166066, 166073, 166080, 166087, 166094, 166101, + 166108, 166115, 166122, 166129, 166136, 166142, 166148, 166154, 166161, + 166168, 166175, 166182, 166189, 166196, 166203, 166210, 166217, 166224, + 166231, 166238, 166243, 166252, 166261, 166270, 166277, 166284, 166291, + 166298, 166305, 166312, 166319, 166326, 166335, 166344, 166353, 166362, + 166371, 166380, 166389, 166398, 166407, 166416, 166425, 166434, 166443, + 166449, 166457, 166463, 166473, 166478, 166487, 166496, 166505, 166516, + 166521, 166528, 166535, 166542, 166547, 166553, 166559, 166565, 166572, + 166579, 166586, 166593, 166600, 166607, 166614, 166621, 166628, 166635, + 166642, 166649, 166654, 166663, 166672, 166681, 166690, 166699, 166708, + 166717, 166726, 166737, 166748, 166755, 166762, 166769, 166776, 166783, + 166790, 166798, 166808, 166818, 166828, 166839, 166850, 166861, 166870, + 166879, 166888, 166893, 166898, 166903, 166908, 166919, 166930, 166941, + 166952, 166963, 166973, 166984, 166993, 167002, 167011, 167020, 167029, + 167037, 167046, 167057, 167068, 167079, 167090, 167101, 167113, 167126, + 167138, 167151, 167163, 167176, 167188, 167201, 167212, 167223, 167232, + 167240, 167249, 167260, 167271, 167283, 167296, 167310, 167325, 167337, + 167350, 167362, 167375, 167386, 167397, 167406, 167414, 167423, 167430, + 167437, 167444, 167451, 167458, 167465, 167472, 167479, 167486, 167493, + 167498, 167503, 167508, 167515, 167525, 167536, 167546, 167557, 167571, + 167586, 167601, 167615, 167630, 167645, 167656, 167667, 167680, 167693, + 167702, 167711, 167724, 167737, 167744, 167751, 167756, 167761, 167766, + 167771, 167776, 167783, 167792, 167797, 167800, 167805, 167812, 167819, + 167826, 167833, 167840, 167847, 167860, 167874, 167889, 167896, 167903, + 167910, 167919, 167927, 167935, 167944, 167949, 167954, 167959, 167964, + 167969, 167974, 167981, 167988, 167994, 168001, 168007, 168014, 168019, + 168024, 168029, 168034, 168039, 168046, 168053, 168058, 168065, 168072, + 168077, 168082, 168087, 168092, 168097, 168102, 168109, 168116, 168123, + 168126, 168131, 168136, 168141, 168146, 168153, 168160, 168168, 168176, + 168181, 168186, 168193, 168200, 168207, 168212, 168219, 168226, 168231, + 168238, 168245, 168252, 168259, 168266, 168273, 168282, 168291, 168298, + 168307, 168316, 168321, 168328, 168335, 168340, 168347, 168354, 168361, + 168368, 168375, 168380, 168387, 168394, 168403, 168410, 168419, 168430, + 168439, 168448, 168457, 168466, 168469, 168474, 168481, 168490, 168497, + 168506, 168513, 168518, 168523, 168526, 168529, 168532, 168539, 168546, + 168555, 168564, 168573, 168580, 168587, 168592, 168604, 168609, 168614, + 168619, 168624, 168629, 168634, 168639, 168644, 168647, 168652, 168657, + 168662, 168667, 168672, 168679, 168684, 168691, 168694, 168699, 168702, + 168705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168708, 168713, + 168718, 168723, 168728, 0, 168733, 168738, 168743, 168748, 168753, + 168758, 168763, 168768, 168773, 168778, 168783, 168788, 168793, 168798, + 168803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168764, 168774, 168782, 168789, 168796, - 168805, 168814, 168823, 168830, 168844, 168856, 168866, 168874, 168886, - 168895, 168906, 168915, 168922, 168930, 168941, 168953, 168962, 168972, - 168984, 168995, 169004, 169015, 169027, 169035, 169046, 169055, 0, 0, 0, - 0, 0, 0, 169063, 169073, 169083, 169093, 169103, 169113, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168808, 168818, 168826, 168833, 168840, + 168849, 168858, 168867, 168874, 168888, 168900, 168910, 168918, 168930, + 168939, 168950, 168959, 168966, 168974, 168985, 168997, 169006, 169016, + 169028, 169039, 169048, 169059, 169071, 169079, 169090, 169099, 0, 0, 0, + 0, 0, 0, 169107, 169117, 169127, 169137, 169147, 169157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 169123, 169128, 169133, 169138, 169143, 169148, - 169153, 0, 169158, 169163, 169168, 169174, 169178, 169183, 169188, - 169193, 169198, 169203, 169208, 169213, 169218, 169223, 169228, 169233, - 169238, 0, 0, 169243, 169248, 169253, 169258, 169263, 169268, 169273, 0, - 169278, 169283, 0, 169289, 169294, 169302, 169309, 169318, 0, 0, 0, 0, 0, - 169323, 169328, 169334, 169340, 169346, 169352, 169358, 169364, 169370, - 169375, 169380, 169386, 169392, 169397, 169403, 169409, 169415, 169421, - 169426, 169432, 169437, 169443, 169449, 169455, 169461, 169466, 169472, - 169478, 169484, 169491, 169497, 169504, 169511, 169517, 169523, 169530, - 169537, 169544, 169551, 169558, 169565, 169572, 169578, 169584, 169591, - 169597, 169604, 169611, 169617, 169624, 169630, 169637, 169644, 169651, - 169659, 169666, 169676, 169684, 169691, 169698, 169707, 169718, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 169167, 169172, 169177, 169182, 169187, 169192, + 169197, 0, 169202, 169207, 169212, 169218, 169222, 169227, 169232, + 169237, 169242, 169247, 169252, 169257, 169262, 169267, 169272, 169277, + 169282, 0, 0, 169287, 169292, 169297, 169302, 169307, 169312, 169317, 0, + 169322, 169327, 0, 169333, 169338, 169346, 169353, 169362, 0, 0, 0, 0, 0, + 169367, 169372, 169378, 169384, 169390, 169396, 169402, 169408, 169414, + 169419, 169424, 169430, 169436, 169441, 169447, 169453, 169459, 169465, + 169470, 169476, 169481, 169487, 169493, 169499, 169505, 169510, 169516, + 169522, 169528, 169535, 169541, 169548, 169555, 169561, 169567, 169574, + 169581, 169588, 169595, 169602, 169609, 169616, 169622, 169628, 169635, + 169641, 169648, 169655, 169661, 169668, 169674, 169681, 169688, 169695, + 169703, 169710, 169720, 169728, 169735, 169742, 169751, 169762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 169727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 169771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 169734, 169741, 169749, 169757, 169765, 169772, 169779, 169787, 169795, - 169803, 169810, 169817, 169825, 169833, 169841, 169848, 169856, 169864, - 169872, 169880, 169888, 169896, 169904, 169911, 169919, 169926, 169934, - 169941, 169949, 169957, 169965, 169973, 169981, 169989, 169997, 170005, - 170013, 170020, 170028, 170035, 170042, 170049, 170057, 170064, 170072, - 0, 0, 0, 170080, 170087, 170094, 170101, 170108, 170115, 170122, 170129, - 170138, 170147, 170156, 170165, 170174, 170184, 0, 0, 170192, 170200, - 170207, 170214, 170221, 170228, 170235, 170242, 170249, 170256, 0, 0, 0, - 0, 170263, 170272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 169778, 169785, 169793, 169801, 169809, 169816, 169823, 169831, 169839, + 169847, 169854, 169861, 169869, 169877, 169885, 169892, 169900, 169908, + 169916, 169924, 169932, 169940, 169948, 169955, 169963, 169970, 169978, + 169985, 169993, 170001, 170009, 170017, 170025, 170033, 170041, 170049, + 170057, 170064, 170072, 170079, 170086, 170093, 170101, 170108, 170116, + 0, 0, 0, 170124, 170131, 170138, 170145, 170152, 170159, 170166, 170173, + 170182, 170191, 170200, 170209, 170218, 170228, 0, 0, 170236, 170244, + 170251, 170258, 170265, 170272, 170279, 170286, 170293, 170300, 0, 0, 0, + 0, 170307, 170316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170280, - 170284, 170289, 170294, 170299, 170303, 170308, 170312, 170316, 170321, - 170325, 170330, 170334, 170339, 170344, 170348, 170352, 170356, 170360, - 170366, 170371, 170378, 170382, 170386, 170392, 170397, 170404, 170408, - 170413, 170420, 170424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 170431, 170436, 170440, 170445, 170450, 170455, 170460, 170464, - 170469, 170473, 170477, 170481, 170486, 170491, 170496, 170500, 170505, - 170510, 170515, 170520, 170525, 170529, 170533, 170538, 170542, 170546, - 170551, 170555, 170559, 170563, 170568, 170572, 170577, 170582, 170587, - 170592, 170597, 170602, 170607, 170612, 170617, 170622, 170627, 170632, - 170637, 170642, 170647, 170652, 170657, 170662, 170666, 170670, 170674, - 170678, 170682, 170686, 170690, 170694, 0, 0, 0, 0, 0, 170698, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170324, + 170328, 170333, 170338, 170343, 170347, 170352, 170356, 170360, 170365, + 170369, 170374, 170378, 170383, 170388, 170392, 170396, 170400, 170404, + 170410, 170415, 170422, 170426, 170430, 170436, 170441, 170448, 170452, + 170457, 170464, 170468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 170475, 170480, 170484, 170489, 170494, 170499, 170504, 170508, + 170513, 170517, 170521, 170525, 170530, 170535, 170540, 170544, 170549, + 170554, 170559, 170564, 170569, 170573, 170577, 170582, 170586, 170590, + 170595, 170599, 170603, 170607, 170612, 170616, 170621, 170626, 170631, + 170636, 170641, 170646, 170651, 170656, 170661, 170666, 170671, 170676, + 170681, 170686, 170691, 170696, 170701, 170706, 170710, 170714, 170718, + 170722, 170726, 170730, 170734, 170738, 0, 0, 0, 0, 0, 170742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 170703, 170709, 170716, 170723, 170730, 170737, 170743, - 170750, 170757, 170764, 170771, 170777, 170784, 170791, 170798, 170805, - 170811, 170818, 170825, 170832, 170839, 170845, 170852, 170859, 170866, - 170873, 170880, 170887, 170894, 170901, 170908, 170915, 170922, 170929, - 170935, 170941, 170947, 170953, 170959, 170965, 170971, 170977, 0, 0, 0, + 0, 0, 0, 0, 0, 170747, 170753, 170760, 170767, 170774, 170781, 170787, + 170794, 170801, 170808, 170815, 170821, 170828, 170835, 170842, 170849, + 170855, 170862, 170869, 170876, 170883, 170889, 170896, 170903, 170910, + 170917, 170924, 170931, 170938, 170945, 170952, 170959, 170966, 170973, + 170979, 170985, 170991, 170997, 171003, 171009, 171015, 171021, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 170983, 170987, 170991, 170995, 170999, 171003, 171007, 0, - 171011, 171017, 171021, 171025, 0, 171029, 171035, 0, 171041, 171047, - 171053, 171059, 171065, 171071, 171077, 171083, 171089, 171095, 171101, - 171107, 171113, 171119, 171125, 0, 171131, 171138, 171144, 171151, - 171158, 171165, 171172, 171179, 171186, 171193, 171200, 171207, 171214, - 171221, 171228, 171235, 171242, 171249, 171256, 171263, 171270, 171277, - 171284, 171291, 171298, 171305, 171312, 171319, 171326, 171333, 171340, - 171347, 171354, 171361, 171368, 171374, 171380, 171386, 171393, 171399, - 171406, 171412, 171419, 171426, 171433, 171440, 171447, 171454, 171460, - 171467, 171474, 171481, 171488, 171495, 171502, 171509, 171515, 171522, - 171529, 171536, 171543, 171550, 171558, 171565, 171572, 171579, 171586, - 171593, 171600, 171607, 171614, 171621, 171628, 171635, 171642, 171648, - 171655, 171662, 171669, 171676, 171683, 171690, 171697, 171705, 171712, - 171718, 171725, 171732, 171739, 171746, 171753, 171760, 171767, 171774, - 171781, 171788, 171795, 171802, 171809, 171816, 171823, 171830, 171837, - 171844, 171851, 171858, 171864, 171871, 171878, 171885, 171892, 171899, - 171906, 171913, 171920, 171927, 171934, 171941, 171948, 171955, 171962, - 171969, 171976, 171983, 171990, 171997, 172004, 172011, 172018, 172026, - 172034, 172042, 172049, 172056, 172063, 172070, 172077, 172084, 172091, - 172098, 172105, 172112, 172118, 172125, 172132, 172139, 172146, 172153, - 172160, 172167, 172174, 172181, 172188, 172195, 172202, 172209, 172216, - 172224, 172232, 172240, 172247, 172254, 172261, 172268, 172275, 172282, - 172289, 172296, 172303, 172310, 172317, 172324, 172331, 172338, 172344, - 172351, 172358, 172365, 172372, 172379, 172386, 172393, 172400, 172407, - 172414, 172421, 172428, 172435, 172442, 172449, 172456, 172463, 172470, - 172477, 172484, 172491, 172498, 0, 0, 172505, 172509, 172513, 172517, - 172521, 172525, 172529, 172533, 172537, 172541, 172547, 172553, 172559, - 172565, 172573, 172581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171027, 171031, 171035, 171039, 171043, 171047, 171051, 0, + 171055, 171061, 171065, 171069, 0, 171073, 171079, 0, 171085, 171091, + 171097, 171103, 171109, 171115, 171121, 171127, 171133, 171139, 171145, + 171151, 171157, 171163, 171169, 0, 171175, 171182, 171188, 171195, + 171202, 171209, 171216, 171223, 171230, 171237, 171244, 171251, 171258, + 171265, 171272, 171279, 171286, 171293, 171300, 171307, 171314, 171321, + 171328, 171335, 171342, 171349, 171356, 171363, 171370, 171377, 171384, + 171391, 171398, 171405, 171412, 171418, 171424, 171430, 171437, 171443, + 171450, 171456, 171463, 171470, 171477, 171484, 171491, 171498, 171504, + 171511, 171518, 171525, 171532, 171539, 171546, 171553, 171559, 171566, + 171573, 171580, 171587, 171594, 171602, 171609, 171616, 171623, 171630, + 171637, 171644, 171651, 171658, 171665, 171672, 171679, 171686, 171692, + 171699, 171706, 171713, 171720, 171727, 171734, 171741, 171749, 171756, + 171762, 171769, 171776, 171783, 171790, 171797, 171804, 171811, 171818, + 171825, 171832, 171839, 171846, 171853, 171860, 171867, 171874, 171881, + 171888, 171895, 171902, 171908, 171915, 171922, 171929, 171936, 171943, + 171950, 171957, 171964, 171971, 171978, 171985, 171992, 171999, 172006, + 172013, 172020, 172027, 172034, 172041, 172048, 172055, 172062, 172070, + 172078, 172086, 172093, 172100, 172107, 172114, 172121, 172128, 172135, + 172142, 172149, 172156, 172162, 172169, 172176, 172183, 172190, 172197, + 172204, 172211, 172218, 172225, 172232, 172239, 172246, 172253, 172260, + 172268, 172276, 172284, 172291, 172298, 172305, 172312, 172319, 172326, + 172333, 172340, 172347, 172354, 172361, 172368, 172375, 172382, 172388, + 172395, 172402, 172409, 172416, 172423, 172430, 172437, 172444, 172451, + 172458, 172465, 172472, 172479, 172486, 172493, 172500, 172507, 172514, + 172521, 172528, 172535, 172542, 0, 0, 172549, 172553, 172557, 172561, + 172565, 172569, 172573, 172577, 172581, 172585, 172591, 172597, 172603, + 172609, 172617, 172625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 172587, 172593, 172599, 172605, 172611, 172617, 172623, 172629, - 172635, 172640, 172645, 172651, 172656, 172661, 172667, 172673, 172679, - 172685, 172691, 172696, 172701, 172707, 172713, 172718, 172724, 172730, - 172736, 172742, 172748, 172754, 172760, 172766, 172772, 172778, 172784, - 172790, 172796, 172802, 172808, 172814, 172820, 172826, 172832, 172837, - 172842, 172848, 172853, 172858, 172864, 172870, 172876, 172882, 172888, - 172893, 172898, 172904, 172910, 172915, 172921, 172927, 172933, 172939, - 172945, 172951, 172957, 172963, 172969, 172975, 172981, 172987, 172992, - 172997, 173001, 173006, 173013, 173017, 0, 0, 0, 0, 173022, 173027, - 173031, 173035, 173039, 173043, 173047, 173051, 173055, 173059, 0, 0, 0, - 0, 173063, 173069, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 172631, 172637, 172643, 172649, 172655, 172661, 172667, 172673, + 172679, 172684, 172689, 172695, 172700, 172705, 172711, 172717, 172723, + 172729, 172735, 172740, 172745, 172751, 172757, 172762, 172768, 172774, + 172780, 172786, 172792, 172798, 172804, 172810, 172816, 172822, 172828, + 172834, 172840, 172846, 172852, 172858, 172864, 172870, 172876, 172881, + 172886, 172892, 172897, 172902, 172908, 172914, 172920, 172926, 172932, + 172937, 172942, 172948, 172954, 172959, 172965, 172971, 172977, 172983, + 172989, 172995, 173001, 173007, 173013, 173019, 173025, 173031, 173036, + 173041, 173045, 173050, 173057, 173061, 0, 0, 0, 0, 173066, 173071, + 173075, 173079, 173083, 173087, 173091, 173095, 173099, 173103, 0, 0, 0, + 0, 173107, 173113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 173075, 173080, 173085, 173090, 173095, 173100, - 173105, 173110, 173115, 173120, 173126, 173132, 173138, 173144, 173150, - 173156, 173162, 173168, 173174, 173181, 173188, 173195, 173203, 173211, - 173219, 173227, 173235, 173243, 173249, 173255, 173261, 173268, 173275, - 173282, 173289, 173296, 173303, 173310, 173317, 173324, 173331, 173338, - 173345, 173352, 173359, 173366, 173372, 173378, 173384, 173390, 173396, - 173403, 173410, 173417, 173424, 173431, 173438, 173445, 173452, 173459, - 173464, 173472, 173480, 173488, 173494, 173501, 173508, 173517, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 173119, 173124, 173129, 173134, 173139, 173144, + 173149, 173154, 173159, 173164, 173170, 173176, 173182, 173188, 173194, + 173200, 173206, 173212, 173218, 173225, 173232, 173239, 173247, 173255, + 173263, 173271, 173279, 173287, 173293, 173299, 173305, 173312, 173319, + 173326, 173333, 173340, 173347, 173354, 173361, 173368, 173375, 173382, + 173389, 173396, 173403, 173410, 173416, 173422, 173428, 173434, 173440, + 173447, 173454, 173461, 173468, 173475, 173482, 173489, 173496, 173503, + 173508, 173516, 173524, 173532, 173538, 173545, 173552, 173561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 173525, 173530, 173535, 173540, 173545, 173550, 173555, 173560, - 173565, 173570, 173576, 173582, 173588, 173594, 173600, 173606, 173612, - 173618, 173624, 173631, 173638, 173645, 173653, 173661, 173669, 173677, - 173685, 173693, 173699, 173705, 173711, 173718, 173725, 173732, 173739, - 173746, 173753, 173760, 173767, 173774, 173781, 173788, 173795, 173802, - 173809, 173816, 173821, 173828, 173835, 173842, 173849, 173856, 173863, - 173870, 173877, 173885, 173895, 173905, 173913, 173922, 173930, 0, 0, 0, + 0, 173569, 173574, 173579, 173584, 173589, 173594, 173599, 173604, + 173609, 173614, 173620, 173626, 173632, 173638, 173644, 173650, 173656, + 173662, 173668, 173675, 173682, 173689, 173697, 173705, 173713, 173721, + 173729, 173737, 173743, 173749, 173755, 173762, 173769, 173776, 173783, + 173790, 173797, 173804, 173811, 173818, 173825, 173832, 173839, 173846, + 173853, 173860, 173865, 173872, 173879, 173886, 173893, 173900, 173907, + 173914, 173921, 173929, 173939, 173949, 173957, 173966, 173974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173938, 173942, 173946, - 173950, 0, 173954, 173958, 173962, 173966, 173970, 173974, 173978, - 173982, 173986, 173990, 173994, 173998, 174002, 174006, 174010, 174014, - 174018, 174022, 174026, 174030, 174034, 174038, 174042, 174046, 174052, - 174058, 174064, 0, 174070, 174075, 0, 174080, 0, 0, 174085, 0, 174090, - 174095, 174100, 174105, 174110, 174115, 174120, 174125, 174130, 174135, - 0, 174140, 174145, 174150, 174155, 0, 174160, 0, 174165, 0, 0, 0, 0, 0, - 0, 174170, 0, 0, 0, 0, 174176, 0, 174182, 0, 174188, 0, 174194, 174200, - 174206, 0, 174212, 174218, 0, 174224, 0, 0, 174230, 0, 174236, 0, 174242, - 0, 174248, 0, 174256, 0, 174264, 174270, 0, 174276, 0, 0, 174282, 174288, - 174294, 174300, 0, 174306, 174312, 174318, 174324, 174330, 174336, - 174342, 0, 174348, 174354, 174360, 174366, 0, 174372, 174378, 174384, - 174390, 0, 174398, 0, 174406, 174412, 174418, 174424, 174430, 174436, - 174442, 174448, 174454, 174460, 0, 174466, 174472, 174478, 174484, - 174490, 174496, 174502, 174508, 174514, 174520, 174526, 174532, 174538, - 174544, 174550, 174556, 174562, 0, 0, 0, 0, 0, 174568, 174574, 174580, 0, - 174586, 174592, 174598, 174604, 174610, 0, 174616, 174622, 174628, - 174634, 174640, 174646, 174652, 174658, 174664, 174670, 174676, 174682, - 174688, 174694, 174700, 174706, 174712, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173982, 173986, 173990, + 173994, 0, 173998, 174002, 174006, 174010, 174014, 174018, 174022, + 174026, 174030, 174034, 174038, 174042, 174046, 174050, 174054, 174058, + 174062, 174066, 174070, 174074, 174078, 174082, 174086, 174090, 174096, + 174102, 174108, 0, 174114, 174119, 0, 174124, 0, 0, 174129, 0, 174134, + 174139, 174144, 174149, 174154, 174159, 174164, 174169, 174174, 174179, + 0, 174184, 174189, 174194, 174199, 0, 174204, 0, 174209, 0, 0, 0, 0, 0, + 0, 174214, 0, 0, 0, 0, 174220, 0, 174226, 0, 174232, 0, 174238, 174244, + 174250, 0, 174256, 174262, 0, 174268, 0, 0, 174274, 0, 174280, 0, 174286, + 0, 174292, 0, 174300, 0, 174308, 174314, 0, 174320, 0, 0, 174326, 174332, + 174338, 174344, 0, 174350, 174356, 174362, 174368, 174374, 174380, + 174386, 0, 174392, 174398, 174404, 174410, 0, 174416, 174422, 174428, + 174434, 0, 174442, 0, 174450, 174456, 174462, 174468, 174474, 174480, + 174486, 174492, 174498, 174504, 0, 174510, 174516, 174522, 174528, + 174534, 174540, 174546, 174552, 174558, 174564, 174570, 174576, 174582, + 174588, 174594, 174600, 174606, 0, 0, 0, 0, 0, 174612, 174618, 174624, 0, + 174630, 174636, 174642, 174648, 174654, 0, 174660, 174666, 174672, + 174678, 174684, 174690, 174696, 174702, 174708, 174714, 174720, 174726, + 174732, 174738, 174744, 174750, 174756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174718, 174728, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174736, 174743, 174750, 174757, - 174763, 174770, 174777, 174783, 174790, 174797, 174804, 174812, 174820, - 174828, 174836, 174844, 174852, 174859, 174866, 174873, 174881, 174889, - 174897, 174905, 174913, 174921, 174928, 174935, 174942, 174950, 174958, - 174966, 174974, 174982, 174990, 174995, 175000, 175005, 175010, 175015, - 175020, 175025, 175030, 175035, 0, 0, 0, 0, 175040, 175047, 175052, - 175057, 175062, 175067, 175072, 175077, 175082, 175087, 175092, 175097, - 175102, 175107, 175112, 175117, 175122, 175127, 175132, 175137, 175142, - 175147, 175152, 175157, 175162, 175167, 175172, 175177, 175182, 175187, - 175192, 175197, 175202, 175207, 175212, 175217, 175222, 175227, 175232, - 175237, 175242, 175247, 175252, 175257, 175262, 175267, 175272, 175277, - 175282, 175287, 175292, 175298, 175303, 175308, 175313, 175318, 175323, - 175328, 175333, 175338, 175343, 175348, 175353, 175358, 175363, 175368, - 175373, 175378, 175383, 175388, 175393, 175398, 175403, 175408, 175413, - 175418, 175423, 175428, 175433, 175438, 175443, 175448, 175453, 175458, - 175463, 175468, 175473, 175478, 175483, 175488, 175493, 175498, 175503, - 175508, 175513, 175518, 175523, 175528, 175533, 175538, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 175543, 175549, 175558, 175566, 175574, 175583, 175592, - 175601, 175610, 175619, 175628, 175637, 175646, 175655, 175664, 0, 0, - 175673, 175682, 175690, 175698, 175707, 175716, 175725, 175734, 175743, - 175752, 175761, 175770, 175779, 175788, 175797, 0, 175805, 175814, - 175822, 175830, 175839, 175848, 175857, 175866, 175875, 175884, 175893, - 175902, 175911, 175920, 175929, 0, 175936, 175945, 175953, 175961, - 175970, 175979, 175988, 175997, 176006, 176015, 176024, 176033, 176042, - 176051, 176060, 176067, 176073, 176079, 176085, 176091, 176097, 176103, - 176109, 176115, 176121, 176127, 176133, 176139, 176145, 176151, 176157, - 176163, 176169, 176175, 176181, 176187, 176193, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 176199, 176206, 176211, 176215, 176219, 176223, 176228, 176233, - 176238, 176243, 176248, 176253, 176260, 176269, 176275, 176279, 176288, - 176293, 176299, 176305, 176311, 176316, 176322, 176328, 176334, 176339, - 176345, 176351, 176356, 176362, 176368, 176373, 176379, 176385, 176390, - 176396, 176402, 176407, 176413, 176419, 176425, 176431, 176437, 176448, - 176455, 176461, 176464, 176467, 176470, 176475, 176481, 176487, 176493, - 176498, 176504, 176510, 176516, 176521, 176527, 176533, 176538, 176544, - 176550, 176555, 176561, 176567, 176572, 176578, 176584, 176589, 176595, - 176601, 176607, 176613, 176619, 176622, 176625, 176628, 176631, 176634, - 176637, 176644, 176652, 176660, 176668, 176675, 176683, 176691, 176699, - 176706, 176714, 176722, 176729, 176737, 176745, 176752, 176760, 176768, - 176775, 176783, 176791, 176798, 176806, 176814, 176822, 176830, 176838, - 176843, 176848, 176853, 176856, 176864, 176869, 176876, 176884, 176892, - 176900, 176907, 176915, 176923, 176931, 176938, 176946, 176954, 176961, - 176969, 176977, 176984, 176992, 177000, 177007, 177015, 177023, 177030, - 177038, 177046, 177054, 177062, 177070, 177080, 177085, 177089, 177093, - 177098, 177103, 177106, 177109, 177112, 177115, 177118, 177121, 177124, - 177127, 177130, 177136, 177139, 177143, 177148, 177152, 177157, 177162, - 177168, 177174, 177180, 177185, 177193, 177199, 177202, 177205, 177208, - 177211, 177214, 177217, 177220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174762, 174772, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174780, 174787, 174794, 174801, + 174807, 174814, 174821, 174827, 174834, 174841, 174848, 174856, 174864, + 174872, 174880, 174888, 174896, 174903, 174910, 174917, 174925, 174933, + 174941, 174949, 174957, 174965, 174972, 174979, 174986, 174994, 175002, + 175010, 175018, 175026, 175034, 175039, 175044, 175049, 175054, 175059, + 175064, 175069, 175074, 175079, 0, 0, 0, 0, 175084, 175091, 175096, + 175101, 175106, 175111, 175116, 175121, 175126, 175131, 175136, 175141, + 175146, 175151, 175156, 175161, 175166, 175171, 175176, 175181, 175186, + 175191, 175196, 175201, 175206, 175211, 175216, 175221, 175226, 175231, + 175236, 175241, 175246, 175251, 175256, 175261, 175266, 175271, 175276, + 175281, 175286, 175291, 175296, 175301, 175306, 175311, 175316, 175321, + 175326, 175331, 175336, 175342, 175347, 175352, 175357, 175362, 175367, + 175372, 175377, 175382, 175387, 175392, 175397, 175402, 175407, 175412, + 175417, 175422, 175427, 175432, 175437, 175442, 175447, 175452, 175457, + 175462, 175467, 175472, 175477, 175482, 175487, 175492, 175497, 175502, + 175507, 175512, 175517, 175522, 175527, 175532, 175537, 175542, 175547, + 175552, 175557, 175562, 175567, 175572, 175577, 175582, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 175587, 175593, 175602, 175610, 175618, 175627, 175636, + 175645, 175654, 175663, 175672, 175681, 175690, 175699, 175708, 0, 0, + 175717, 175726, 175734, 175742, 175751, 175760, 175769, 175778, 175787, + 175796, 175805, 175814, 175823, 175832, 175841, 0, 175849, 175858, + 175866, 175874, 175883, 175892, 175901, 175910, 175919, 175928, 175937, + 175946, 175955, 175964, 175973, 0, 175980, 175989, 175997, 176005, + 176014, 176023, 176032, 176041, 176050, 176059, 176068, 176077, 176086, + 176095, 176104, 176111, 176117, 176123, 176129, 176135, 176141, 176147, + 176153, 176159, 176165, 176171, 176177, 176183, 176189, 176195, 176201, + 176207, 176213, 176219, 176225, 176231, 176237, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 176243, 176250, 176255, 176259, 176263, 176267, 176272, 176277, + 176282, 176287, 176292, 176297, 176304, 176313, 176319, 176323, 176332, + 176337, 176343, 176349, 176355, 176360, 176366, 176372, 176378, 176383, + 176389, 176395, 176400, 176406, 176412, 176417, 176423, 176429, 176434, + 176440, 176446, 176451, 176457, 176463, 176469, 176475, 176481, 176492, + 176499, 176505, 176508, 176511, 176514, 176519, 176525, 176531, 176537, + 176542, 176548, 176554, 176560, 176565, 176571, 176577, 176582, 176588, + 176594, 176599, 176605, 176611, 176616, 176622, 176628, 176633, 176639, + 176645, 176651, 176657, 176663, 176666, 176669, 176672, 176675, 176678, + 176681, 176688, 176696, 176704, 176712, 176719, 176727, 176735, 176743, + 176750, 176758, 176766, 176773, 176781, 176789, 176796, 176804, 176812, + 176819, 176827, 176835, 176842, 176850, 176858, 176866, 176874, 176882, + 176887, 176892, 176897, 176900, 176908, 176913, 176920, 176928, 176936, + 176944, 176951, 176959, 176967, 176975, 176982, 176990, 176998, 177005, + 177013, 177021, 177028, 177036, 177044, 177051, 177059, 177067, 177074, + 177082, 177090, 177098, 177106, 177114, 177124, 177129, 177133, 177137, + 177142, 177147, 177150, 177153, 177156, 177159, 177162, 177165, 177168, + 177171, 177174, 177180, 177183, 177187, 177192, 177196, 177201, 177206, + 177212, 177218, 177224, 177229, 177237, 177243, 177246, 177249, 177252, + 177255, 177258, 177261, 177264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177225, 177232, - 177240, 177248, 177256, 177263, 177271, 177279, 177287, 177294, 177302, - 177310, 177317, 177325, 177333, 177340, 177348, 177356, 177363, 177371, - 177379, 177386, 177394, 177402, 177410, 177418, 177426, 177431, 177435, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177438, 177444, 177450, 177456, - 177460, 177466, 177472, 177478, 177484, 177490, 177496, 177502, 177508, - 177514, 177520, 177526, 177532, 177538, 177544, 177550, 177556, 177562, - 177568, 177574, 177580, 177586, 177592, 177598, 177604, 177610, 177616, - 177622, 177628, 177634, 177640, 177646, 177652, 177658, 177664, 177670, - 177676, 177682, 177688, 177694, 0, 0, 0, 0, 177700, 177711, 177722, - 177733, 177744, 177755, 177766, 177777, 177788, 0, 0, 0, 0, 0, 0, 0, - 177799, 177804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177809, 177815, - 177821, 177827, 177833, 177839, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177845, 177847, 177849, 177853, - 177858, 177863, 177865, 177871, 177876, 177878, 177884, 177888, 177890, - 177894, 177900, 177906, 177912, 177917, 177922, 177929, 177936, 177943, - 177948, 177955, 177962, 177969, 177973, 177980, 177989, 177998, 178005, - 178010, 178014, 178018, 178020, 178023, 178026, 178033, 178040, 178050, - 178055, 178060, 178065, 178070, 178072, 178078, 178082, 178084, 178086, - 178088, 178090, 178094, 178098, 178102, 178104, 178108, 178110, 178114, - 178116, 178118, 178120, 178122, 178127, 178132, 178134, 178140, 178144, - 178148, 178156, 178158, 178160, 178162, 178164, 178166, 178168, 178170, - 178172, 178174, 178176, 178180, 178184, 178186, 178188, 178190, 178192, - 178194, 178199, 178205, 178209, 178213, 178217, 178221, 178226, 178230, - 178232, 178234, 178238, 178244, 178246, 178248, 178250, 178254, 178263, - 178269, 178273, 178277, 178279, 178281, 178284, 178286, 178288, 178290, - 178294, 178296, 178300, 178305, 178307, 178312, 178318, 178325, 178329, - 178333, 178337, 178341, 178347, 178351, 178359, 178366, 178368, 178370, - 178374, 178378, 178380, 178384, 178388, 178390, 178394, 178396, 178400, - 178404, 178408, 178412, 178416, 178420, 178424, 178428, 178434, 178438, - 178442, 178453, 178458, 178462, 178466, 178472, 178476, 178480, 178484, - 178491, 178498, 178502, 178506, 178510, 178514, 178518, 178525, 178527, - 178531, 178533, 178535, 178539, 178543, 178547, 178549, 178553, 178557, - 178561, 178565, 178569, 178571, 178575, 178577, 178583, 178586, 178591, - 178593, 178595, 178598, 178600, 178602, 178605, 178612, 178619, 178626, - 178631, 178635, 178637, 178639, 178641, 178645, 178647, 178651, 178655, - 178659, 178661, 178665, 178667, 178671, 178675, 178682, 178684, 178693, - 178702, 178711, 178717, 178719, 178724, 178728, 178732, 178734, 178740, - 178744, 178746, 178750, 178754, 178756, 178760, 178765, 178769, 178775, - 178781, 178783, 178785, 178791, 178793, 178797, 178801, 178803, 178807, - 178809, 178813, 178817, 178821, 178824, 178827, 178832, 178837, 178839, - 178842, 178844, 178851, 178855, 178857, 178864, 178871, 178878, 178885, - 178892, 178894, 178896, 178898, 178902, 178904, 178906, 178908, 178910, - 178912, 178914, 178916, 178918, 178920, 178922, 178924, 178926, 178928, - 178930, 178932, 178934, 178936, 178938, 178940, 178942, 178944, 178946, - 178950, 178952, 178954, 178956, 178960, 178962, 178966, 178968, 178970, - 178974, 178978, 178984, 178986, 178988, 178990, 178992, 178996, 179000, - 179002, 179006, 179010, 179014, 179018, 179022, 179026, 179030, 179034, - 179038, 179042, 179046, 179050, 179054, 179058, 179062, 179066, 179070, - 179074, 179076, 179078, 179080, 179082, 179084, 179086, 179088, 179096, - 179104, 179112, 179120, 179125, 179130, 179135, 179139, 179143, 179148, - 179153, 179155, 179159, 179161, 179163, 179165, 179167, 179169, 179171, - 179173, 179177, 179179, 179181, 179183, 179187, 179191, 179195, 179199, - 179203, 179205, 179211, 179217, 179219, 179221, 179223, 179225, 179227, - 179236, 179243, 179250, 179254, 179261, 179266, 179273, 179282, 179287, - 179291, 179295, 179297, 179301, 179303, 179307, 179311, 179313, 179317, - 179321, 179325, 179327, 179329, 179335, 179337, 179339, 179341, 179345, - 179349, 179351, 179355, 179357, 179359, 179362, 179366, 179368, 179372, - 179374, 179376, 179381, 179383, 179387, 179391, 179394, 179398, 179402, - 179406, 179410, 179414, 179418, 179422, 179427, 179431, 179435, 179444, - 179449, 179452, 179454, 179457, 179460, 179465, 179467, 179470, 179475, - 179479, 179482, 179486, 179490, 179493, 179498, 179502, 179506, 179510, - 179514, 179520, 179526, 179532, 179538, 179543, 179554, 179556, 179560, - 179562, 179564, 179568, 179572, 179574, 179578, 179584, 179589, 179595, - 179597, 179601, 179605, 179612, 179619, 179623, 179625, 179627, 179631, - 179633, 179637, 179641, 179645, 179647, 179649, 179656, 179660, 179664, - 179668, 179672, 179676, 179678, 179682, 179684, 179686, 179690, 179692, - 179696, 179700, 179706, 179710, 179714, 179718, 179720, 179723, 179727, - 179734, 179743, 179752, 179761, 179770, 179772, 179776, 179778, 179782, - 179793, 179797, 179803, 179809, 179814, 179816, 179821, 179825, 179827, - 179829, 179831, 179835, 179839, 179843, 179848, 179859, 179875, 179888, - 179901, 179905, 179909, 179915, 179917, 179925, 179933, 179935, 179939, - 179945, 179951, 179958, 179965, 179967, 179969, 179973, 179975, 179981, - 179983, 179986, 179990, 179996, 180002, 180013, 180019, 180026, 180034, - 180038, 180046, 180054, 180060, 180066, 180073, 180075, 180079, 180081, - 180083, 180088, 180090, 180092, 180094, 180096, 180100, 180110, 180116, - 180120, 180124, 180128, 180134, 180140, 180146, 180152, 180157, 180162, - 180168, 180174, 180181, 180188, 180195, 180202, 180207, 180215, 180219, - 180228, 180237, 180243, 180247, 180251, 180255, 180258, 180263, 180265, - 180267, 180269, 180276, 180281, 180288, 180295, 180302, 180310, 180318, - 180326, 180334, 180342, 180350, 180358, 180366, 180374, 180380, 180386, - 180392, 180398, 180404, 180410, 180416, 180422, 180428, 180434, 180440, - 180446, 180449, 180458, 180467, 180469, 180476, 180480, 180482, 180484, - 180488, 180494, 180498, 180500, 180510, 180516, 180520, 180522, 180526, - 180528, 180532, 180539, 180546, 180553, 180558, 180563, 180572, 180578, - 180583, 180587, 180592, 180596, 180603, 180607, 180610, 180614, 180620, - 180626, 180630, 180634, 180639, 180645, 180654, 180665, 180671, 180677, - 180683, 180693, 180708, 180717, 180725, 180733, 180741, 180749, 180757, - 180765, 180773, 180781, 180789, 180797, 180805, 180813, 180816, 180820, - 180825, 180830, 180832, 180836, 180845, 180854, 180862, 180866, 180870, - 180875, 180880, 180885, 180887, 180892, 180896, 180898, 180902, 180906, - 180912, 180917, 180925, 180930, 180935, 180940, 180947, 180950, 180952, - 180956, 180961, 180967, 180971, 180975, 180981, 180987, 180989, 180993, - 180997, 181001, 181005, 181009, 181011, 181013, 181015, 181017, 181023, - 181029, 181033, 181035, 181037, 181039, 181048, 181052, 181059, 181066, - 181068, 181071, 181075, 181081, 181085, 181089, 181091, 181099, 181103, - 181107, 181112, 181116, 181121, 181126, 181131, 181136, 181141, 181146, - 181151, 181156, 181160, 181166, 181170, 181176, 181181, 181188, 181194, - 181202, 181206, 181213, 181217, 181221, 181225, 181230, 181235, 181237, - 181241, 181250, 181258, 181267, 181281, 181295, 181309, 181316, 181323, - 181327, 181336, 181344, 181348, 181357, 181364, 181368, 181372, 181376, - 181380, 181387, 181391, 181395, 181399, 181403, 181410, 181419, 181428, - 181435, 181447, 181459, 181463, 181467, 181471, 181475, 181479, 181483, - 181491, 181499, 181508, 181512, 181516, 181520, 181524, 181528, 181532, - 181538, 181545, 181549, 181561, 181569, 181573, 181577, 181581, 181585, - 181591, 181598, 181609, 181619, 181630, 181641, 181650, 181661, 181667, - 181673, 181679, 181685, 181691, 181695, 181702, 181711, 181718, 181724, - 181728, 181732, 181736, 181745, 181757, 181761, 181768, 181775, 181782, - 181790, 181797, 181805, 181813, 181822, 181830, 181839, 181848, 181858, - 181867, 181877, 181887, 181898, 181908, 181919, 181926, 181934, 181941, - 181949, 181957, 181966, 181974, 181983, 181990, 182002, 182009, 182021, - 182024, 182028, 182031, 182035, 182041, 182048, 182055, 182063, 182068, - 182074, 182085, 182095, 182106, 182111, 182116, 182122, 182127, 182134, - 182138, 182144, 182146, 182148, 182152, 182156, 182160, 182169, 182171, - 182173, 182176, 182178, 182180, 182184, 182186, 182190, 182192, 182196, - 182198, 182200, 182204, 182208, 182214, 182216, 182220, 182222, 182226, - 182230, 182234, 182238, 182240, 182242, 182246, 182250, 182254, 182258, - 182260, 182262, 182264, 182270, 182275, 182278, 182286, 182294, 182296, - 182301, 182304, 182309, 182320, 182327, 182332, 182337, 182339, 182343, - 182345, 182349, 182351, 182355, 182359, 182362, 182365, 182367, 182370, - 182372, 182376, 182378, 182380, 182382, 182386, 182388, 182392, 182395, - 182402, 182405, 182410, 182413, 182416, 182421, 182425, 182429, 182433, - 182435, 182440, 182443, 182447, 182449, 182451, 182455, 182457, 0, 0, 0, - 0, 182459, 182461, 182465, 182467, 182471, 182476, 182478, 182482, - 182484, 182488, 182492, 182498, 182502, 182507, 182510, 182514, 182518, - 0, 0, 0, 182522, 182524, 182530, 182534, 182538, 182540, 182544, 182546, - 182548, 182552, 182554, 182558, 182562, 0, 0, 0, 182566, 182571, 182576, - 182581, 182586, 182591, 182596, 182603, 182610, 182617, 182624, 182629, - 182634, 182639, 182644, 182651, 182657, 182664, 182671, 182678, 182683, - 182688, 182693, 182698, 182703, 182710, 182717, 182722, 182727, 182734, - 182741, 182749, 182757, 182764, 182771, 182779, 182787, 182795, 182802, - 182812, 182823, 182828, 182835, 182842, 182849, 182857, 182865, 182876, - 182884, 182892, 182900, 182905, 182910, 182915, 182920, 182925, 182930, - 182935, 182940, 182945, 182950, 182955, 182960, 182967, 182972, 182977, - 182984, 182989, 182994, 182999, 183004, 183009, 183014, 183019, 183024, - 183029, 183034, 183039, 183044, 183051, 183059, 183064, 183069, 183076, - 183081, 183086, 183091, 183098, 183103, 183110, 183115, 183122, 183127, - 183136, 183145, 183150, 183155, 183160, 183165, 183170, 183175, 183180, - 183185, 183190, 183195, 183200, 183205, 183210, 183218, 183226, 183231, - 183236, 183241, 183246, 183251, 183257, 183263, 183268, 183270, 0, 0, 0, - 0, 183274, 183276, 183278, 183280, 183282, 183284, 183292, 183300, - 183308, 183316, 183322, 183328, 183332, 183336, 183342, 183348, 183357, - 183361, 183366, 183372, 183376, 183381, 183385, 183389, 183395, 183401, - 183411, 183420, 183423, 183428, 183434, 183440, 183451, 183461, 183465, - 183470, 183476, 183482, 183491, 183496, 183500, 183505, 183509, 183515, - 183521, 183527, 183531, 183534, 183538, 183541, 183544, 183549, 183554, - 183561, 183569, 183576, 183583, 183592, 183601, 183608, 183616, 183623, - 183630, 183639, 183648, 183655, 183663, 183670, 183677, 183686, 183693, - 183701, 183707, 183716, 183724, 183733, 183740, 183750, 183761, 183769, - 183777, 183786, 183794, 183802, 183811, 183819, 183829, 183838, 183846, - 183854, 183863, 183866, 183871, 183874, 183879, 0, 0, 0, 0, 0, 0, 183886, - 183892, 183898, 183904, 183910, 183916, 183922, 183928, 183934, 183940, - 183946, 183952, 0, 0, 0, 0, 183958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 183962, 183970, 183979, 183987, 183996, 184005, 184015, 184024, - 184034, 184043, 184053, 184062, 0, 0, 0, 0, 184072, 184080, 184089, - 184097, 184106, 184113, 184121, 184128, 184136, 184144, 184153, 184161, - 184170, 184180, 184191, 184201, 184212, 184221, 184231, 184240, 184250, - 184259, 184269, 184278, 184288, 184296, 184305, 184313, 184322, 184330, - 184339, 184347, 184356, 184366, 184377, 184387, 184398, 184402, 184407, - 184411, 184416, 184419, 184423, 184426, 184430, 184434, 184439, 184443, - 184448, 184453, 184459, 184464, 184470, 184473, 184477, 184480, 0, 0, 0, - 0, 0, 0, 0, 0, 184484, 184487, 184491, 184494, 184498, 184503, 184508, - 184514, 184520, 184524, 0, 0, 0, 0, 0, 0, 184528, 184534, 184541, 184547, - 184554, 184562, 184570, 184579, 184588, 184593, 184599, 184604, 184610, - 184617, 184624, 184632, 184640, 184647, 184655, 184662, 184670, 184679, - 184688, 184698, 184708, 184714, 184721, 184727, 184734, 184742, 184750, - 184759, 184768, 184776, 184785, 184793, 184802, 184812, 184822, 184833, - 0, 0, 0, 0, 0, 0, 0, 0, 184844, 184849, 184855, 184860, 184866, 184875, - 184885, 184894, 184904, 184911, 184919, 184926, 184934, 184941, 184950, - 184959, 184968, 184973, 184980, 184987, 184994, 184999, 185004, 185009, - 185014, 185021, 185028, 185035, 185042, 185049, 0, 0, 185058, 185068, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177269, 177276, + 177284, 177292, 177300, 177307, 177315, 177323, 177331, 177338, 177346, + 177354, 177361, 177369, 177377, 177384, 177392, 177400, 177407, 177415, + 177423, 177430, 177438, 177446, 177454, 177462, 177470, 177475, 177479, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177482, 177488, 177494, 177500, + 177504, 177510, 177516, 177522, 177528, 177534, 177540, 177546, 177552, + 177558, 177564, 177570, 177576, 177582, 177588, 177594, 177600, 177606, + 177612, 177618, 177624, 177630, 177636, 177642, 177648, 177654, 177660, + 177666, 177672, 177678, 177684, 177690, 177696, 177702, 177708, 177714, + 177720, 177726, 177732, 177738, 0, 0, 0, 0, 177744, 177755, 177766, + 177777, 177788, 177799, 177810, 177821, 177832, 0, 0, 0, 0, 0, 0, 0, + 177843, 177848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177853, 177859, + 177865, 177871, 177877, 177883, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177889, 177891, 177893, 177897, + 177902, 177907, 177909, 177915, 177920, 177922, 177928, 177932, 177934, + 177938, 177944, 177950, 177956, 177961, 177966, 177973, 177980, 177987, + 177992, 177999, 178006, 178013, 178017, 178024, 178033, 178042, 178049, + 178054, 178058, 178062, 178064, 178067, 178070, 178077, 178084, 178094, + 178099, 178104, 178109, 178114, 178116, 178122, 178126, 178128, 178130, + 178132, 178134, 178138, 178142, 178146, 178148, 178152, 178154, 178158, + 178160, 178162, 178164, 178166, 178171, 178176, 178178, 178184, 178188, + 178192, 178200, 178202, 178204, 178206, 178208, 178210, 178212, 178214, + 178216, 178218, 178220, 178224, 178228, 178230, 178232, 178234, 178236, + 178238, 178243, 178249, 178253, 178257, 178261, 178265, 178270, 178274, + 178276, 178278, 178282, 178288, 178290, 178292, 178294, 178298, 178307, + 178313, 178317, 178321, 178323, 178325, 178328, 178330, 178332, 178334, + 178338, 178340, 178344, 178349, 178351, 178356, 178362, 178369, 178373, + 178377, 178381, 178385, 178391, 178395, 178403, 178410, 178412, 178414, + 178418, 178422, 178424, 178428, 178432, 178434, 178438, 178440, 178444, + 178448, 178452, 178456, 178460, 178464, 178468, 178472, 178478, 178482, + 178486, 178497, 178502, 178506, 178510, 178516, 178520, 178524, 178528, + 178535, 178542, 178546, 178550, 178554, 178558, 178562, 178569, 178571, + 178575, 178577, 178579, 178583, 178587, 178591, 178593, 178597, 178601, + 178605, 178609, 178613, 178615, 178619, 178621, 178627, 178630, 178635, + 178637, 178639, 178642, 178644, 178646, 178649, 178656, 178663, 178670, + 178675, 178679, 178681, 178683, 178685, 178689, 178691, 178695, 178699, + 178703, 178705, 178709, 178711, 178715, 178719, 178726, 178728, 178737, + 178746, 178755, 178761, 178763, 178768, 178772, 178776, 178778, 178784, + 178788, 178790, 178794, 178798, 178800, 178804, 178809, 178813, 178819, + 178825, 178827, 178829, 178835, 178837, 178841, 178845, 178847, 178851, + 178853, 178857, 178861, 178865, 178868, 178871, 178876, 178881, 178883, + 178886, 178888, 178895, 178899, 178901, 178908, 178915, 178922, 178929, + 178936, 178938, 178940, 178942, 178946, 178948, 178950, 178952, 178954, + 178956, 178958, 178960, 178962, 178964, 178966, 178968, 178970, 178972, + 178974, 178976, 178978, 178980, 178982, 178984, 178986, 178988, 178990, + 178994, 178996, 178998, 179000, 179004, 179006, 179010, 179012, 179014, + 179018, 179022, 179028, 179030, 179032, 179034, 179036, 179040, 179044, + 179046, 179050, 179054, 179058, 179062, 179066, 179070, 179074, 179078, + 179082, 179086, 179090, 179094, 179098, 179102, 179106, 179110, 179114, + 179118, 179120, 179122, 179124, 179126, 179128, 179130, 179132, 179140, + 179148, 179156, 179164, 179169, 179174, 179179, 179183, 179187, 179192, + 179197, 179199, 179203, 179205, 179207, 179209, 179211, 179213, 179215, + 179217, 179221, 179223, 179225, 179227, 179231, 179235, 179239, 179243, + 179247, 179249, 179255, 179261, 179263, 179265, 179267, 179269, 179271, + 179280, 179287, 179294, 179298, 179305, 179310, 179317, 179326, 179331, + 179335, 179339, 179341, 179345, 179347, 179351, 179355, 179357, 179361, + 179365, 179369, 179371, 179373, 179379, 179381, 179383, 179385, 179389, + 179393, 179395, 179399, 179401, 179403, 179406, 179410, 179412, 179416, + 179418, 179420, 179425, 179427, 179431, 179435, 179438, 179442, 179446, + 179450, 179454, 179458, 179462, 179466, 179471, 179475, 179479, 179488, + 179493, 179496, 179498, 179501, 179504, 179509, 179511, 179514, 179519, + 179523, 179526, 179530, 179534, 179537, 179542, 179546, 179550, 179554, + 179558, 179564, 179570, 179576, 179582, 179587, 179598, 179600, 179604, + 179606, 179608, 179612, 179616, 179618, 179622, 179628, 179633, 179639, + 179641, 179645, 179649, 179656, 179663, 179667, 179669, 179671, 179675, + 179677, 179681, 179685, 179689, 179691, 179693, 179700, 179704, 179708, + 179712, 179716, 179720, 179722, 179726, 179728, 179730, 179734, 179736, + 179740, 179744, 179750, 179754, 179758, 179762, 179764, 179767, 179771, + 179778, 179787, 179796, 179805, 179814, 179816, 179820, 179822, 179826, + 179837, 179841, 179847, 179853, 179858, 179860, 179865, 179869, 179871, + 179873, 179875, 179879, 179883, 179887, 179892, 179903, 179919, 179932, + 179945, 179949, 179953, 179959, 179961, 179969, 179977, 179979, 179983, + 179989, 179995, 180002, 180009, 180011, 180013, 180017, 180019, 180025, + 180027, 180030, 180034, 180040, 180046, 180057, 180063, 180070, 180078, + 180082, 180090, 180098, 180104, 180110, 180117, 180119, 180123, 180125, + 180127, 180132, 180134, 180136, 180138, 180140, 180144, 180154, 180160, + 180164, 180168, 180172, 180178, 180184, 180190, 180196, 180201, 180206, + 180212, 180218, 180225, 180232, 180239, 180246, 180251, 180259, 180263, + 180272, 180281, 180287, 180291, 180295, 180299, 180302, 180307, 180309, + 180311, 180313, 180320, 180325, 180332, 180339, 180346, 180354, 180362, + 180370, 180378, 180386, 180394, 180402, 180410, 180418, 180424, 180430, + 180436, 180442, 180448, 180454, 180460, 180466, 180472, 180478, 180484, + 180490, 180493, 180502, 180511, 180513, 180520, 180524, 180526, 180528, + 180532, 180538, 180542, 180544, 180554, 180560, 180564, 180566, 180570, + 180572, 180576, 180583, 180590, 180597, 180602, 180607, 180616, 180622, + 180627, 180631, 180636, 180640, 180647, 180651, 180654, 180658, 180664, + 180670, 180674, 180678, 180683, 180689, 180698, 180709, 180715, 180721, + 180727, 180737, 180752, 180761, 180769, 180777, 180785, 180793, 180801, + 180809, 180817, 180825, 180833, 180841, 180849, 180857, 180860, 180864, + 180869, 180874, 180876, 180880, 180889, 180898, 180906, 180910, 180914, + 180919, 180924, 180929, 180931, 180936, 180940, 180942, 180946, 180950, + 180956, 180961, 180969, 180974, 180979, 180984, 180991, 180994, 180996, + 181000, 181005, 181011, 181015, 181019, 181025, 181031, 181033, 181037, + 181041, 181045, 181049, 181053, 181055, 181057, 181059, 181061, 181067, + 181073, 181077, 181079, 181081, 181083, 181092, 181096, 181103, 181110, + 181112, 181115, 181119, 181125, 181129, 181133, 181135, 181143, 181147, + 181151, 181156, 181160, 181165, 181170, 181175, 181180, 181185, 181190, + 181195, 181200, 181204, 181210, 181214, 181220, 181225, 181232, 181238, + 181246, 181250, 181257, 181261, 181265, 181269, 181274, 181279, 181281, + 181285, 181294, 181302, 181311, 181325, 181339, 181353, 181360, 181367, + 181371, 181380, 181388, 181392, 181401, 181408, 181412, 181416, 181420, + 181424, 181431, 181435, 181439, 181443, 181447, 181454, 181463, 181472, + 181479, 181491, 181503, 181507, 181511, 181515, 181519, 181523, 181527, + 181535, 181543, 181552, 181556, 181560, 181564, 181568, 181572, 181576, + 181582, 181589, 181593, 181605, 181613, 181617, 181621, 181625, 181629, + 181635, 181642, 181653, 181663, 181674, 181685, 181694, 181705, 181711, + 181717, 181723, 181729, 181735, 181739, 181746, 181755, 181762, 181768, + 181772, 181776, 181780, 181789, 181801, 181805, 181812, 181819, 181826, + 181834, 181841, 181849, 181857, 181866, 181874, 181883, 181892, 181902, + 181911, 181921, 181931, 181942, 181952, 181963, 181970, 181978, 181985, + 181993, 182001, 182010, 182018, 182027, 182034, 182046, 182053, 182065, + 182068, 182072, 182075, 182079, 182085, 182092, 182099, 182107, 182112, + 182118, 182129, 182139, 182150, 182155, 182160, 182166, 182171, 182178, + 182182, 182188, 182190, 182192, 182196, 182200, 182204, 182213, 182215, + 182217, 182220, 182222, 182224, 182228, 182230, 182234, 182236, 182240, + 182242, 182244, 182248, 182252, 182258, 182260, 182264, 182266, 182270, + 182274, 182278, 182282, 182284, 182286, 182290, 182294, 182298, 182302, + 182304, 182306, 182308, 182314, 182319, 182322, 182330, 182338, 182340, + 182345, 182348, 182353, 182364, 182371, 182376, 182381, 182383, 182387, + 182389, 182393, 182395, 182399, 182403, 182406, 182409, 182411, 182414, + 182416, 182420, 182422, 182424, 182426, 182430, 182432, 182436, 182439, + 182446, 182449, 182454, 182457, 182460, 182465, 182469, 182473, 182477, + 182479, 182484, 182487, 182491, 182493, 182495, 182499, 182501, 0, 0, 0, + 0, 182503, 182505, 182509, 182511, 182515, 182520, 182522, 182526, + 182528, 182532, 182536, 182542, 182546, 182551, 182554, 182558, 182562, + 0, 0, 0, 182566, 182568, 182574, 182578, 182582, 182584, 182588, 182590, + 182592, 182596, 182598, 182602, 182606, 0, 0, 0, 182610, 182615, 182620, + 182625, 182630, 182635, 182640, 182647, 182654, 182661, 182668, 182673, + 182678, 182683, 182688, 182695, 182701, 182708, 182715, 182722, 182727, + 182732, 182737, 182742, 182747, 182754, 182761, 182766, 182771, 182778, + 182785, 182793, 182801, 182808, 182815, 182823, 182831, 182839, 182846, + 182856, 182867, 182872, 182879, 182886, 182893, 182901, 182909, 182920, + 182928, 182936, 182944, 182949, 182954, 182959, 182964, 182969, 182974, + 182979, 182984, 182989, 182994, 182999, 183004, 183011, 183016, 183021, + 183028, 183033, 183038, 183043, 183048, 183053, 183058, 183063, 183068, + 183073, 183078, 183083, 183088, 183095, 183103, 183108, 183113, 183120, + 183125, 183130, 183135, 183142, 183147, 183154, 183159, 183166, 183171, + 183180, 183189, 183194, 183199, 183204, 183209, 183214, 183219, 183224, + 183229, 183234, 183239, 183244, 183249, 183254, 183262, 183270, 183275, + 183280, 183285, 183290, 183295, 183301, 183307, 183312, 183314, 0, 0, 0, + 0, 183318, 183320, 183322, 183324, 183326, 183328, 183336, 183344, + 183352, 183360, 183366, 183372, 183376, 183380, 183386, 183392, 183401, + 183405, 183410, 183416, 183420, 183425, 183429, 183433, 183439, 183445, + 183455, 183464, 183467, 183472, 183478, 183484, 183495, 183505, 183509, + 183514, 183520, 183526, 183535, 183540, 183544, 183549, 183553, 183559, + 183565, 183571, 183575, 183578, 183582, 183585, 183588, 183593, 183598, + 183605, 183613, 183620, 183627, 183636, 183645, 183652, 183660, 183667, + 183674, 183683, 183692, 183699, 183707, 183714, 183721, 183730, 183737, + 183745, 183751, 183760, 183768, 183777, 183784, 183794, 183805, 183813, + 183821, 183830, 183838, 183846, 183855, 183863, 183873, 183882, 183890, + 183898, 183907, 183910, 183915, 183918, 183923, 0, 0, 0, 0, 0, 0, 183930, + 183936, 183942, 183948, 183954, 183960, 183966, 183972, 183978, 183984, + 183990, 183996, 0, 0, 0, 0, 184002, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 184006, 184014, 184023, 184031, 184040, 184049, 184059, 184068, + 184078, 184087, 184097, 184106, 0, 0, 0, 0, 184116, 184124, 184133, + 184141, 184150, 184157, 184165, 184172, 184180, 184188, 184197, 184205, + 184214, 184224, 184235, 184245, 184256, 184265, 184275, 184284, 184294, + 184303, 184313, 184322, 184332, 184340, 184349, 184357, 184366, 184374, + 184383, 184391, 184400, 184410, 184421, 184431, 184442, 184446, 184451, + 184455, 184460, 184463, 184467, 184470, 184474, 184478, 184483, 184487, + 184492, 184497, 184503, 184508, 184514, 184517, 184521, 184524, 0, 0, 0, + 0, 0, 0, 0, 0, 184528, 184531, 184535, 184538, 184542, 184547, 184552, + 184558, 184564, 184568, 0, 0, 0, 0, 0, 0, 184572, 184578, 184585, 184591, + 184598, 184606, 184614, 184623, 184632, 184637, 184643, 184648, 184654, + 184661, 184668, 184676, 184684, 184691, 184699, 184706, 184714, 184723, + 184732, 184742, 184752, 184758, 184765, 184771, 184778, 184786, 184794, + 184803, 184812, 184820, 184829, 184837, 184846, 184856, 184866, 184877, + 0, 0, 0, 0, 0, 0, 0, 0, 184888, 184893, 184899, 184904, 184910, 184919, + 184929, 184938, 184948, 184955, 184963, 184970, 184978, 184985, 184994, + 185003, 185012, 185017, 185024, 185031, 185038, 185043, 185048, 185053, + 185058, 185065, 185072, 185079, 185086, 185093, 0, 0, 185102, 185112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 185080, 185090, 185099, 185104, 185113, 185121, 185129, - 185136, 185140, 185145, 185152, 185161, 185172, 185176, 185179, 185183, - 185187, 185191, 185195, 185200, 185204, 185208, 185213, 185217, 185221, - 185227, 185233, 185240, 185244, 185248, 185250, 185260, 185269, 185276, - 185280, 185284, 185294, 185298, 185302, 185306, 185310, 185318, 185327, - 185340, 185351, 185362, 185378, 185387, 185396, 185400, 185402, 185407, - 185409, 185411, 185417, 185421, 185423, 185429, 185431, 185433, 185437, - 185439, 185443, 185445, 185449, 185453, 185458, 185462, 185466, 185468, - 185472, 185474, 185480, 185486, 185492, 185496, 185502, 185506, 185513, - 185515, 185519, 185521, 185523, 185525, 185527, 185529, 185531, 185535, - 185539, 185546, 185550, 185552, 185557, 185559, 185561, 185563, 185565, - 185569, 185573, 185575, 185580, 185585, 185587, 185589, 185591, 185593, - 185598, 185600, 185604, 185608, 185610, 185614, 185616, 185629, 185633, - 185640, 185652, 185664, 185668, 185672, 185674, 185678, 185686, 185693, - 185695, 185699, 185701, 185705, 185709, 185711, 185715, 185717, 185719, - 185723, 185725, 185727, 185729, 185731, 185733, 185737, 185739, 185741, - 185743, 185745, 185747, 185749, 185751, 185755, 185759, 185761, 185763, - 185765, 185767, 185769, 185771, 185773, 185775, 185777, 185779, 185781, - 185783, 185785, 185787, 185789, 185791, 185793, 185795, 185797, 185799, - 185801, 185803, 185805, 185807, 185809, 185811, 185815, 185819, 185827, - 185835, 185841, 185848, 185850, 185852, 185854, 185856, 185858, 185860, - 185864, 185871, 185875, 185879, 185883, 185887, 185891, 185893, 185897, - 185901, 185903, 185905, 185907, 185909, 185911, 185915, 185919, 185923, - 185925, 185929, 185933, 185937, 185942, 185944, 185946, 185950, 185954, - 185959, 185967, 185971, 185979, 185981, 185983, 185985, 185987, 185989, - 185991, 185993, 185995, 185999, 186003, 186005, 186007, 186009, 186011, - 186017, 186019, 186025, 186029, 186033, 186038, 186040, 186042, 186046, - 186048, 186050, 186052, 186054, 186058, 186063, 186068, 186072, 186076, - 186078, 186080, 186085, 186090, 186092, 186094, 186098, 186104, 186110, - 186116, 186122, 186128, 186134, 186145, 186156, 186168, 186179, 186190, - 186201, 186212, 186223, 186234, 186245, 186256, 186267, 186278, 186289, - 186300, 186312, 186324, 186336, 186348, 186360, 186372, 186386, 186400, - 186415, 186421, 186427, 186433, 186439, 186445, 186451, 186457, 186463, - 186469, 186475, 186481, 186487, 186494, 186501, 186508, 186515, 186522, - 186529, 186543, 186557, 186572, 186586, 186600, 186614, 186628, 186642, - 186656, 186670, 186684, 186698, 186712, 186726, 186740, 186755, 186770, - 186785, 186800, 186815, 186830, 186844, 186858, 186873, 186878, 186883, - 186889, 186900, 186911, 186923, 186928, 186933, 186938, 186943, 186948, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 186953, 186959, 186965, 186971, - 186977, 186983, 186989, 186995, 187000, 187005, 187010, 187015, 187020, - 187025, 0, 0, 187030, 187034, 187038, 187040, 187042, 187046, 187051, - 187055, 187059, 187064, 187068, 187070, 187072, 0, 0, 0, 187074, 187076, - 187078, 187080, 187082, 187086, 187088, 187092, 187094, 0, 0, 0, 0, 0, 0, - 0, 187096, 187100, 187102, 187104, 187106, 187110, 187112, 187116, - 187118, 187121, 187123, 187127, 187129, 187131, 187132, 187134, 187136, - 187138, 187142, 187144, 187146, 187150, 187152, 187154, 187156, 187158, - 187162, 187166, 187169, 187171, 187177, 187181, 187183, 187185, 187187, - 187189, 187191, 187195, 187197, 187199, 187201, 187203, 187207, 187212, - 187214, 187216, 0, 187218, 187220, 187224, 187226, 187230, 187234, - 187238, 0, 0, 0, 0, 0, 0, 0, 0, 187243, 187245, 187247, 187249, 187253, - 187255, 187257, 187259, 187261, 187263, 187267, 187269, 187271, 187275, - 0, 0, 0, 0, 187279, 187283, 187287, 187300, 187307, 187314, 187320, - 187324, 187326, 0, 0, 0, 0, 0, 0, 0, 187330, 187340, 187343, 187346, - 187351, 187356, 187365, 187369, 187374, 0, 0, 0, 0, 0, 0, 0, 187379, - 187382, 187385, 187388, 187391, 187394, 187397, 187400, 187403, 187406, - 187409, 187412, 187415, 187418, 187421, 187424, 187427, 187430, 187433, - 187436, 187439, 187442, 187445, 187448, 187451, 187454, 187457, 187460, - 187463, 187466, 187469, 187472, 187475, 187478, 187481, 187484, 187487, - 187490, 187493, 187496, 187499, 187502, 187505, 187508, 187511, 187514, - 187517, 187520, 187523, 187526, 187529, 187532, 187535, 187538, 187541, - 187544, 187547, 187550, 187553, 187556, 187559, 187571, 187582, 187594, - 187605, 187616, 187628, 187639, 187651, 187662, 187673, 187685, 187697, - 187708, 187720, 187731, 187742, 187754, 187765, 187777, 187788, 187799, - 187811, 187823, 187834, 187846, 187857, 187868, 187880, 187891, 187903, - 187914, 187925, 187937, 187949, 187960, 187972, 187983, 187994, 188006, - 188017, 188029, 188040, 188051, 188063, 188075, 188087, 188099, 188111, - 188119, 188127, 188135, 188143, 188149, 188155, 188161, 188167, 188173, - 188179, 188186, 188193, 188200, 188207, 188214, 188221, 188229, 188237, - 188245, 188253, 188261, 188268, 188274, 188280, 188287, 188293, 188300, - 188306, 188312, 188319, 188325, 188332, 188338, 188344, 188350, 188356, - 188362, 188374, 0, 188387, 188400, 188406, 188414, 188419, 188426, - 188433, 188441, 188449, 188457, 188465, 188473, 188481, 188493, 188504, - 188515, 188526, 188541, 188556, 188570, 188584, 188602, 188620, 188639, - 188657, 188675, 188693, 188700, 188708, 188712, 188717, 188723, 188729, - 188739, 188750, 188761, 188771, 188781, 188785, 188789, 188794, 188800, - 188806, 188816, 188822, 188831, 188840, 188849, 188858, 188864, 188868, - 188877, 188885, 188892, 188899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 185124, 185134, 185143, 185148, 185157, 185165, 185173, + 185180, 185184, 185189, 185196, 185205, 185216, 185220, 185223, 185227, + 185231, 185235, 185239, 185244, 185248, 185252, 185257, 185261, 185265, + 185271, 185277, 185284, 185288, 185292, 185294, 185304, 185313, 185320, + 185324, 185328, 185338, 185342, 185346, 185350, 185354, 185362, 185371, + 185384, 185395, 185406, 185422, 185431, 185440, 185444, 185446, 185451, + 185453, 185455, 185461, 185465, 185467, 185473, 185475, 185477, 185481, + 185483, 185487, 185489, 185493, 185497, 185502, 185506, 185510, 185512, + 185516, 185518, 185524, 185530, 185536, 185540, 185546, 185550, 185557, + 185559, 185563, 185565, 185567, 185569, 185571, 185573, 185575, 185579, + 185583, 185590, 185594, 185596, 185601, 185603, 185605, 185607, 185609, + 185613, 185617, 185619, 185624, 185629, 185631, 185633, 185635, 185637, + 185642, 185644, 185648, 185652, 185654, 185658, 185660, 185673, 185677, + 185684, 185696, 185708, 185712, 185716, 185718, 185722, 185730, 185737, + 185739, 185743, 185745, 185749, 185753, 185755, 185759, 185761, 185763, + 185767, 185769, 185771, 185773, 185775, 185777, 185781, 185783, 185785, + 185787, 185789, 185791, 185793, 185795, 185799, 185803, 185805, 185807, + 185809, 185811, 185813, 185815, 185817, 185819, 185821, 185823, 185825, + 185827, 185829, 185831, 185833, 185835, 185837, 185839, 185841, 185843, + 185845, 185847, 185849, 185851, 185853, 185855, 185859, 185863, 185871, + 185879, 185885, 185892, 185894, 185896, 185898, 185900, 185902, 185904, + 185908, 185915, 185919, 185923, 185927, 185931, 185935, 185937, 185941, + 185945, 185947, 185949, 185951, 185953, 185955, 185959, 185963, 185967, + 185969, 185973, 185977, 185981, 185986, 185988, 185990, 185994, 185998, + 186003, 186011, 186015, 186023, 186025, 186027, 186029, 186031, 186033, + 186035, 186037, 186039, 186043, 186047, 186049, 186051, 186053, 186055, + 186061, 186063, 186069, 186073, 186077, 186082, 186084, 186086, 186090, + 186092, 186094, 186096, 186098, 186102, 186107, 186112, 186116, 186120, + 186122, 186124, 186129, 186134, 186136, 186138, 186142, 186148, 186154, + 186160, 186166, 186172, 186178, 186189, 186200, 186212, 186223, 186234, + 186245, 186256, 186267, 186278, 186289, 186300, 186311, 186322, 186333, + 186344, 186356, 186368, 186380, 186392, 186404, 186416, 186430, 186444, + 186459, 186465, 186471, 186477, 186483, 186489, 186495, 186501, 186507, + 186513, 186519, 186525, 186531, 186538, 186545, 186552, 186559, 186566, + 186573, 186587, 186601, 186616, 186630, 186644, 186658, 186672, 186686, + 186700, 186714, 186728, 186742, 186756, 186770, 186784, 186799, 186814, + 186829, 186844, 186859, 186874, 186888, 186902, 186917, 186922, 186927, + 186933, 186944, 186955, 186967, 186972, 186977, 186982, 186987, 186992, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 186997, 187003, 187009, 187015, + 187021, 187027, 187033, 187039, 187044, 187049, 187054, 187059, 187064, + 187069, 0, 0, 187074, 187078, 187082, 187084, 187086, 187090, 187095, + 187099, 187103, 187108, 187112, 187114, 187116, 0, 0, 0, 187118, 187120, + 187122, 187124, 187126, 187130, 187132, 187136, 187138, 0, 0, 0, 0, 0, 0, + 0, 187140, 187144, 187146, 187148, 187150, 187154, 187156, 187160, + 187162, 187165, 187167, 187171, 187173, 187175, 187176, 187178, 187180, + 187182, 187186, 187188, 187190, 187194, 187196, 187198, 187200, 187202, + 187206, 187210, 187213, 187215, 187221, 187225, 187227, 187229, 187231, + 187233, 187235, 187239, 187241, 187243, 187245, 187247, 187251, 187256, + 187258, 187260, 0, 187262, 187264, 187268, 187270, 187274, 187278, + 187282, 0, 0, 0, 0, 0, 0, 0, 0, 187287, 187289, 187291, 187293, 187297, + 187299, 187301, 187303, 187305, 187307, 187311, 187313, 187315, 187319, + 0, 0, 0, 0, 187323, 187327, 187331, 187344, 187351, 187358, 187364, + 187368, 187370, 0, 0, 0, 0, 0, 0, 0, 187374, 187384, 187387, 187390, + 187395, 187400, 187409, 187413, 187418, 0, 0, 0, 0, 0, 0, 0, 187423, + 187426, 187429, 187432, 187435, 187438, 187441, 187444, 187447, 187450, + 187453, 187456, 187459, 187462, 187465, 187468, 187471, 187474, 187477, + 187480, 187483, 187486, 187489, 187492, 187495, 187498, 187501, 187504, + 187507, 187510, 187513, 187516, 187519, 187522, 187525, 187528, 187531, + 187534, 187537, 187540, 187543, 187546, 187549, 187552, 187555, 187558, + 187561, 187564, 187567, 187570, 187573, 187576, 187579, 187582, 187585, + 187588, 187591, 187594, 187597, 187600, 187603, 187615, 187626, 187638, + 187649, 187660, 187672, 187683, 187695, 187706, 187717, 187729, 187741, + 187752, 187764, 187775, 187786, 187798, 187809, 187821, 187832, 187843, + 187855, 187867, 187878, 187890, 187901, 187912, 187924, 187935, 187947, + 187958, 187969, 187981, 187993, 188004, 188016, 188027, 188038, 188050, + 188061, 188073, 188084, 188095, 188107, 188119, 188131, 188143, 188155, + 188163, 188171, 188179, 188187, 188193, 188199, 188205, 188211, 188217, + 188223, 188230, 188237, 188244, 188251, 188258, 188265, 188273, 188281, + 188289, 188297, 188305, 188312, 188318, 188324, 188331, 188337, 188344, + 188350, 188356, 188363, 188369, 188376, 188382, 188388, 188394, 188400, + 188406, 188418, 0, 188431, 188444, 188450, 188458, 188463, 188470, + 188477, 188485, 188493, 188501, 188509, 188517, 188525, 188537, 188548, + 188559, 188570, 188585, 188600, 188614, 188628, 188646, 188664, 188683, + 188701, 188719, 188737, 188744, 188752, 188756, 188761, 188767, 188773, + 188783, 188794, 188805, 188815, 188825, 188829, 188833, 188838, 188844, + 188850, 188860, 188866, 188875, 188884, 188893, 188902, 188908, 188912, + 188921, 188929, 188936, 188943, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 188904, 188909, 188913, 188917, 188921, 188925, 188929, 188933, 188937, - 188941, 0, 0, 0, 0, 0, 0, 188945, 188949, 188953, 188957, 188961, 188965, - 188969, 188973, 188977, 188981, 188985, 188989, 188993, 188997, 189001, - 189005, 189009, 189013, 189017, 189021, 189025, 189029, 189033, 189037, - 189041, 189045, 189049, 189053, 189057, 189061, 189065, 189069, 189073, - 189077, 189081, 189085, 189089, 189093, 189097, 189101, 189105, 189109, - 189113, 189117, 189121, 189125, 189129, 189133, 189137, 189141, 189145, - 189149, 189153, 189157, 189161, 189165, 189169, 189173, 189177, 189181, - 189185, 189189, 189193, 189197, 189201, 189205, 189209, 189213, 189217, - 189221, 189225, 189229, 189233, 189237, 189241, 189245, 189249, 189253, - 189257, 189261, 189265, 189269, 189273, 189277, 189281, 189285, 189289, - 189293, 189297, 189301, 189305, 189309, 189313, 189317, 189321, 189325, - 189329, 189333, 189337, 189341, 189345, 189349, 189353, 189357, 189361, - 189365, 189369, 189373, 189377, 189381, 189385, 189389, 189393, 189397, - 189401, 189405, 189409, 189413, 189417, 189421, 189425, 189429, 189433, - 189437, 189441, 189445, 189449, 189453, 189457, 189461, 189465, 189469, - 189473, 189477, 189481, 189485, 189489, 189493, 189497, 189501, 189505, - 189509, 189513, 189517, 189521, 189525, 189529, 189533, 189537, 189541, - 189545, 189549, 189553, 189557, 189561, 189565, 189569, 189573, 189577, - 189581, 189585, 189589, 189593, 189597, 189601, 189605, 189609, 189613, - 189617, 189621, 189625, 189629, 189633, 189637, 189641, 189645, 189649, - 189653, 189657, 189661, 189665, 189669, 189673, 189677, 189681, 189685, - 189689, 189693, 189697, 189701, 189705, 189709, 189713, 189717, 189721, - 189725, 189729, 189733, 189737, 189741, 189745, 189749, 189753, 189757, - 189761, 189765, 189769, 189773, 189777, 189781, 189785, 189789, 189793, - 189797, 189801, 189805, 189809, 189813, 189817, 189821, 189825, 189829, - 189833, 189837, 189841, 189845, 189849, 189853, 189857, 189861, 189865, - 189869, 189873, 189877, 189881, 189885, 189889, 189893, 189897, 189901, - 189905, 189909, 189913, 189917, 189921, 189925, 189929, 189933, 189937, - 189941, 189945, 189949, 189953, 189957, 189961, 189965, 189969, 189973, - 189977, 189981, 189985, 189989, 189993, 189997, 190001, 190005, 190009, - 190013, 190017, 190021, 190025, 190029, 190033, 190037, 190041, 190045, - 190049, 190053, 190057, 190061, 190065, 190069, 190073, 190077, 190081, - 190085, 190089, 190093, 190097, 190101, 190105, 190109, 190113, 190117, - 190121, 190125, 190129, 190133, 190137, 190141, 190145, 190149, 190153, - 190157, 190161, 190165, 190169, 190173, 190177, 190181, 190185, 190189, - 190193, 190197, 190201, 190205, 190209, 190213, 190217, 190221, 190225, - 190229, 190233, 190237, 190241, 190245, 190249, 190253, 190257, 190261, - 190265, 190269, 190273, 190277, 190281, 190285, 190289, 190293, 190297, - 190301, 190305, 190309, 190313, 190317, 190321, 190325, 190329, 190333, - 190337, 190341, 190345, 190349, 190353, 190357, 190361, 190365, 190369, - 190373, 190377, 190381, 190385, 190389, 190393, 190397, 190401, 190405, - 190409, 190413, 190417, 190421, 190425, 190429, 190433, 190437, 190441, - 190445, 190449, 190453, 190457, 190461, 190465, 190469, 190473, 190477, - 190481, 190485, 190489, 190493, 190497, 190501, 190505, 190509, 190513, - 190517, 190521, 190525, 190529, 190533, 190537, 190541, 190545, 190549, - 190553, 190557, 190561, 190565, 190569, 190573, 190577, 190581, 190585, - 190589, 190593, 190597, 190601, 190605, 190609, 190613, 190617, 190621, - 190625, 190629, 190633, 190637, 190641, 190645, 190649, 190653, 190657, - 190661, 190665, 190669, 190673, 190677, 190681, 190685, 190689, 190693, - 190697, 190701, 190705, 190709, 190713, 190717, 190721, 190725, 190729, - 190733, 190737, 190741, 190745, 190749, 190753, 190757, 190761, 190765, - 190769, 190773, 190777, 190781, 190785, 190789, 190793, 190797, 190801, - 190805, 190809, 190813, 190817, 190821, 190825, 190829, 190833, 190837, - 190841, 190845, 190849, 190853, 190857, 190861, 190865, 190869, 190873, - 190877, 190881, 190885, 190889, 190893, 190897, 190901, 190905, 190909, - 190913, 190917, 190921, 190925, 190929, 190933, 190937, 190941, 190945, - 190949, 190953, 190957, 190961, 190965, 190969, 190973, 190977, 190981, - 190985, 190989, 190993, 190997, 191001, 191005, 191009, 191013, 191017, - 191021, 191025, 191029, 191033, 191037, 191041, 191045, 191049, 191053, - 191057, 191061, 191065, 191069, 191073, 191077, 191081, 191085, 191089, - 191093, 191097, 191101, 191105, 191109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 188948, 188953, 188957, 188961, 188965, 188969, 188973, 188977, 188981, + 188985, 0, 0, 0, 0, 0, 0, 188989, 188993, 188997, 189001, 189005, 189009, + 189013, 189017, 189021, 189025, 189029, 189033, 189037, 189041, 189045, + 189049, 189053, 189057, 189061, 189065, 189069, 189073, 189077, 189081, + 189085, 189089, 189093, 189097, 189101, 189105, 189109, 189113, 189117, + 189121, 189125, 189129, 189133, 189137, 189141, 189145, 189149, 189153, + 189157, 189161, 189165, 189169, 189173, 189177, 189181, 189185, 189189, + 189193, 189197, 189201, 189205, 189209, 189213, 189217, 189221, 189225, + 189229, 189233, 189237, 189241, 189245, 189249, 189253, 189257, 189261, + 189265, 189269, 189273, 189277, 189281, 189285, 189289, 189293, 189297, + 189301, 189305, 189309, 189313, 189317, 189321, 189325, 189329, 189333, + 189337, 189341, 189345, 189349, 189353, 189357, 189361, 189365, 189369, + 189373, 189377, 189381, 189385, 189389, 189393, 189397, 189401, 189405, + 189409, 189413, 189417, 189421, 189425, 189429, 189433, 189437, 189441, + 189445, 189449, 189453, 189457, 189461, 189465, 189469, 189473, 189477, + 189481, 189485, 189489, 189493, 189497, 189501, 189505, 189509, 189513, + 189517, 189521, 189525, 189529, 189533, 189537, 189541, 189545, 189549, + 189553, 189557, 189561, 189565, 189569, 189573, 189577, 189581, 189585, + 189589, 189593, 189597, 189601, 189605, 189609, 189613, 189617, 189621, + 189625, 189629, 189633, 189637, 189641, 189645, 189649, 189653, 189657, + 189661, 189665, 189669, 189673, 189677, 189681, 189685, 189689, 189693, + 189697, 189701, 189705, 189709, 189713, 189717, 189721, 189725, 189729, + 189733, 189737, 189741, 189745, 189749, 189753, 189757, 189761, 189765, + 189769, 189773, 189777, 189781, 189785, 189789, 189793, 189797, 189801, + 189805, 189809, 189813, 189817, 189821, 189825, 189829, 189833, 189837, + 189841, 189845, 189849, 189853, 189857, 189861, 189865, 189869, 189873, + 189877, 189881, 189885, 189889, 189893, 189897, 189901, 189905, 189909, + 189913, 189917, 189921, 189925, 189929, 189933, 189937, 189941, 189945, + 189949, 189953, 189957, 189961, 189965, 189969, 189973, 189977, 189981, + 189985, 189989, 189993, 189997, 190001, 190005, 190009, 190013, 190017, + 190021, 190025, 190029, 190033, 190037, 190041, 190045, 190049, 190053, + 190057, 190061, 190065, 190069, 190073, 190077, 190081, 190085, 190089, + 190093, 190097, 190101, 190105, 190109, 190113, 190117, 190121, 190125, + 190129, 190133, 190137, 190141, 190145, 190149, 190153, 190157, 190161, + 190165, 190169, 190173, 190177, 190181, 190185, 190189, 190193, 190197, + 190201, 190205, 190209, 190213, 190217, 190221, 190225, 190229, 190233, + 190237, 190241, 190245, 190249, 190253, 190257, 190261, 190265, 190269, + 190273, 190277, 190281, 190285, 190289, 190293, 190297, 190301, 190305, + 190309, 190313, 190317, 190321, 190325, 190329, 190333, 190337, 190341, + 190345, 190349, 190353, 190357, 190361, 190365, 190369, 190373, 190377, + 190381, 190385, 190389, 190393, 190397, 190401, 190405, 190409, 190413, + 190417, 190421, 190425, 190429, 190433, 190437, 190441, 190445, 190449, + 190453, 190457, 190461, 190465, 190469, 190473, 190477, 190481, 190485, + 190489, 190493, 190497, 190501, 190505, 190509, 190513, 190517, 190521, + 190525, 190529, 190533, 190537, 190541, 190545, 190549, 190553, 190557, + 190561, 190565, 190569, 190573, 190577, 190581, 190585, 190589, 190593, + 190597, 190601, 190605, 190609, 190613, 190617, 190621, 190625, 190629, + 190633, 190637, 190641, 190645, 190649, 190653, 190657, 190661, 190665, + 190669, 190673, 190677, 190681, 190685, 190689, 190693, 190697, 190701, + 190705, 190709, 190713, 190717, 190721, 190725, 190729, 190733, 190737, + 190741, 190745, 190749, 190753, 190757, 190761, 190765, 190769, 190773, + 190777, 190781, 190785, 190789, 190793, 190797, 190801, 190805, 190809, + 190813, 190817, 190821, 190825, 190829, 190833, 190837, 190841, 190845, + 190849, 190853, 190857, 190861, 190865, 190869, 190873, 190877, 190881, + 190885, 190889, 190893, 190897, 190901, 190905, 190909, 190913, 190917, + 190921, 190925, 190929, 190933, 190937, 190941, 190945, 190949, 190953, + 190957, 190961, 190965, 190969, 190973, 190977, 190981, 190985, 190989, + 190993, 190997, 191001, 191005, 191009, 191013, 191017, 191021, 191025, + 191029, 191033, 191037, 191041, 191045, 191049, 191053, 191057, 191061, + 191065, 191069, 191073, 191077, 191081, 191085, 191089, 191093, 191097, + 191101, 191105, 191109, 191113, 191117, 191121, 191125, 191129, 191133, + 191137, 191141, 191145, 191149, 191153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191113, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 191117, 191121, 191126, 191131, 191135, 191140, 191145, 191149, 191153, - 191158, 191163, 191167, 191171, 191175, 191179, 191185, 191189, 191194, - 191198, 191202, 191206, 191210, 191214, 191218, 191222, 191226, 191230, - 191234, 191238, 191243, 191248, 191253, 191258, 191264, 191270, 191277, - 191284, 191291, 191297, 191304, 191311, 191318, 191324, 191331, 191338, - 191344, 191351, 191358, 191364, 191371, 191378, 191384, 191391, 191398, - 191404, 191411, 191418, 191425, 191432, 191439, 191445, 191451, 191457, - 191463, 191468, 191474, 191480, 191487, 191494, 191501, 191507, 191514, - 191521, 191528, 191534, 191541, 191548, 191554, 191561, 191568, 191574, - 191581, 191588, 191594, 191601, 191608, 191614, 191621, 191628, 191635, - 191642, 191649, 191656, 191661, 191668, 191672, 191676, 191679, 191682, - 191685, 191688, 191691, 191694, 191697, 191700, 191703, 191706, 191709, - 191712, 191715, 191718, 191721, 191724, 191727, 191730, 191733, 191736, - 191739, 191742, 191745, 191748, 191751, 191754, 191757, 191760, 191763, - 191766, 191769, 191772, 191775, 191778, 191781, 191784, 191787, 191790, - 191793, 191796, 191799, 191802, 191805, 191808, 191811, 191814, 191817, - 191820, 191823, 191826, 191829, 191832, 191835, 191838, 191841, 191844, - 191847, 191850, 191853, 191856, 191859, 191862, 191865, 191868, 191871, - 191874, 191877, 191880, 191883, 191886, 191889, 191892, 191895, 191898, - 191901, 191904, 191907, 191910, 191913, 191916, 191919, 191922, 191925, - 191928, 191931, 191934, 191937, 191940, 191943, 191946, 191949, 191952, - 191955, 191958, 191961, 191964, 191967, 191970, 191973, 191976, 191979, - 191982, 191985, 191988, 191991, 191994, 191997, 192000, 192003, 192006, - 192009, 192012, 192015, 192018, 192021, 192024, 192027, 192030, 192033, - 192036, 192039, 192042, 192045, 192048, 192051, 192054, 192057, 192060, - 192063, 192066, 192069, 192072, 192075, 192078, 192081, 192084, 192087, - 192090, 192093, 192096, 192099, 192102, 192105, 192108, 192111, 192114, - 192117, 192120, 192123, 192126, 192129, 192132, 192135, 192138, 192141, - 192144, 192147, 192150, 192153, 192156, 192159, 192162, 192165, 192168, - 192171, 192174, 192177, 192180, 192183, 192186, 192189, 192192, 192195, - 192198, 192201, 192204, 192207, 192210, 192213, 192216, 192219, 192222, - 192225, 192228, 192231, 192234, 192237, 192240, 192243, 192246, 192249, - 192252, 192255, 192258, 192261, 192264, 192267, 192270, 192273, 192276, - 192279, 192282, 192285, 192288, 192291, 192294, 192297, 192300, 192303, - 192306, 192309, 192312, 192315, 192318, 192321, 192324, 192327, 192330, - 192333, 192336, 192339, 192342, 192345, 192348, 192351, 192354, 192357, - 192360, 192363, 192366, 192369, 192372, 192375, 192378, 192381, 192384, - 192387, 192390, 192393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 192396, 192398, 192400, 192405, 192407, 192412, 192414, 192419, 192421, - 192426, 192428, 192430, 192432, 192434, 192436, 192438, 192440, 192442, - 192444, 192448, 192452, 192454, 192456, 192460, 192464, 192469, 192471, - 192473, 192475, 192479, 192482, 192484, 192488, 192490, 192494, 192496, - 192500, 192503, 192505, 192509, 192513, 192515, 192521, 192523, 192528, - 192530, 192535, 192537, 192542, 192544, 192549, 192551, 192555, 192557, - 192561, 192563, 192570, 192572, 192574, 192576, 192581, 192583, 192585, - 192587, 192589, 192591, 192593, 192598, 192602, 192604, 192609, 192613, - 192615, 192620, 192624, 192626, 192631, 192635, 192637, 192639, 192641, - 192643, 192647, 192649, 192654, 192656, 192662, 192664, 192670, 192672, - 192674, 192676, 192680, 192682, 192689, 192691, 192698, 192700, 192706, - 192712, 192714, 192721, 192728, 192730, 192736, 192741, 192743, 192749, - 192755, 192757, 192763, 192769, 192771, 192777, 192781, 192783, 192788, - 192790, 192792, 192797, 192799, 192801, 192807, 192809, 192814, 192818, - 192820, 192825, 192829, 192831, 192837, 192839, 192843, 192845, 192849, - 192851, 192858, 192865, 192867, 192874, 192881, 192883, 192888, 192890, - 192898, 192900, 192906, 192908, 192914, 192916, 192920, 192922, 192928, - 192930, 192934, 192936, 192942, 192944, 192946, 192948, 192953, 192958, - 192960, 192969, 192971, 192981, 192986, 192993, 193000, 193005, 193010, - 193022, 193026, 193030, 193034, 193038, 193040, 193042, 193044, 193046, - 193048, 193054, 193056, 193058, 193060, 193062, 193064, 193066, 193068, - 193070, 193072, 193074, 193076, 193078, 193080, 193082, 193084, 193086, - 193088, 193094, 193101, 193106, 193114, 193122, 193127, 193133, 193135, - 193137, 193139, 193141, 193143, 193145, 193147, 193149, 193151, 193153, - 193155, 193157, 193159, 193161, 193163, 193165, 193177, 193182, 193184, - 193186, 193192, 193204, 193210, 193216, 193222, 193228, 193232, 193243, - 193245, 193247, 193249, 193251, 193253, 193255, 193257, 193259, 193261, - 193263, 193265, 193267, 193269, 193271, 193273, 193275, 193277, 193279, - 193281, 193283, 193285, 193287, 193289, 193291, 193293, 193295, 193297, - 193299, 193301, 193303, 193305, 193307, 193309, 193311, 193313, 193315, - 193317, 193319, 193321, 193323, 193325, 193327, 193329, 193331, 193333, - 193335, 193337, 193339, 193341, 193343, 193345, 193347, 193349, 193351, - 193353, 193355, 193357, 193359, 193361, 193363, 193365, 193367, 193369, - 193371, 193373, 193375, 193377, 193379, 193381, 193383, 193385, 193387, - 193389, 193391, 193393, 193395, 193397, 193399, 193401, 193403, 193405, - 193407, 193409, 193411, 193413, 193415, 193417, 193419, 193421, 193423, - 193425, 193427, 193429, 193431, 193433, 193435, 193437, 193439, 193441, - 193443, 193445, 193447, 193449, 193451, 193453, 193455, 193457, 193459, - 193461, 193463, 193465, 193467, 193469, 193471, 193473, 193475, 193477, - 193479, 193481, 193483, 193485, 193487, 193489, 193491, 193493, 193495, - 193497, 193499, 193501, 193503, 193505, 193507, 193509, 193511, 193513, - 193515, 193517, 193519, 193521, 193523, 193525, 193527, 193529, 193531, - 193533, 193535, 193537, 193539, 193541, 193543, 193545, 193547, 193549, - 193551, 193553, 193555, 193557, 193559, 193561, 193563, 193565, 193567, - 193569, 193571, 193573, 193575, 193577, 193579, 193581, 193583, 193585, - 193587, 193589, 193591, 193593, 193595, 193597, 193599, 193601, 193603, - 193605, 193607, 193609, 193611, 193613, 193615, 193617, 193619, 193621, - 193623, 193625, 193627, 193629, 193631, 193633, 193635, 193637, 193639, - 193641, 193643, 193645, 193647, 193649, 193651, 193653, 193655, 193657, - 193659, 193661, 193663, 193665, 193667, 193669, 193671, 193673, 193675, - 193677, 193679, 193681, 193683, 193685, 193687, 193689, 193691, 193693, - 193695, 193697, 193699, 193701, 193703, 193705, 193707, 193709, 193711, - 193713, 193715, 193717, 193719, 193721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 191161, 191165, 191170, 191175, 191179, 191184, 191189, 191193, 191197, + 191202, 191207, 191211, 191215, 191219, 191223, 191229, 191233, 191238, + 191242, 191246, 191250, 191254, 191258, 191262, 191266, 191270, 191274, + 191278, 191282, 191287, 191292, 191297, 191302, 191308, 191314, 191321, + 191328, 191335, 191341, 191348, 191355, 191362, 191368, 191375, 191382, + 191388, 191395, 191402, 191408, 191415, 191422, 191428, 191435, 191442, + 191448, 191455, 191462, 191469, 191476, 191483, 191489, 191495, 191501, + 191507, 191512, 191518, 191524, 191531, 191538, 191545, 191551, 191558, + 191565, 191572, 191578, 191585, 191592, 191598, 191605, 191612, 191618, + 191625, 191632, 191638, 191645, 191652, 191658, 191665, 191672, 191679, + 191686, 191693, 191700, 191705, 191712, 191716, 191720, 191723, 191726, + 191729, 191732, 191735, 191738, 191741, 191744, 191747, 191750, 191753, + 191756, 191759, 191762, 191765, 191768, 191771, 191774, 191777, 191780, + 191783, 191786, 191789, 191792, 191795, 191798, 191801, 191804, 191807, + 191810, 191813, 191816, 191819, 191822, 191825, 191828, 191831, 191834, + 191837, 191840, 191843, 191846, 191849, 191852, 191855, 191858, 191861, + 191864, 191867, 191870, 191873, 191876, 191879, 191882, 191885, 191888, + 191891, 191894, 191897, 191900, 191903, 191906, 191909, 191912, 191915, + 191918, 191921, 191924, 191927, 191930, 191933, 191936, 191939, 191942, + 191945, 191948, 191951, 191954, 191957, 191960, 191963, 191966, 191969, + 191972, 191975, 191978, 191981, 191984, 191987, 191990, 191993, 191996, + 191999, 192002, 192005, 192008, 192011, 192014, 192017, 192020, 192023, + 192026, 192029, 192032, 192035, 192038, 192041, 192044, 192047, 192050, + 192053, 192056, 192059, 192062, 192065, 192068, 192071, 192074, 192077, + 192080, 192083, 192086, 192089, 192092, 192095, 192098, 192101, 192104, + 192107, 192110, 192113, 192116, 192119, 192122, 192125, 192128, 192131, + 192134, 192137, 192140, 192143, 192146, 192149, 192152, 192155, 192158, + 192161, 192164, 192167, 192170, 192173, 192176, 192179, 192182, 192185, + 192188, 192191, 192194, 192197, 192200, 192203, 192206, 192209, 192212, + 192215, 192218, 192221, 192224, 192227, 192230, 192233, 192236, 192239, + 192242, 192245, 192248, 192251, 192254, 192257, 192260, 192263, 192266, + 192269, 192272, 192275, 192278, 192281, 192284, 192287, 192290, 192293, + 192296, 192299, 192302, 192305, 192308, 192311, 192314, 192317, 192320, + 192323, 192326, 192329, 192332, 192335, 192338, 192341, 192344, 192347, + 192350, 192353, 192356, 192359, 192362, 192365, 192368, 192371, 192374, + 192377, 192380, 192383, 192386, 192389, 192392, 192395, 192398, 192401, + 192404, 192407, 192410, 192413, 192416, 192419, 192422, 192425, 192428, + 192431, 192434, 192437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 192440, 192442, 192444, 192449, 192451, 192456, 192458, 192463, 192465, + 192470, 192472, 192474, 192476, 192478, 192480, 192482, 192484, 192486, + 192488, 192492, 192496, 192498, 192500, 192504, 192508, 192513, 192515, + 192517, 192519, 192523, 192526, 192528, 192532, 192534, 192538, 192540, + 192544, 192547, 192549, 192553, 192557, 192559, 192565, 192567, 192572, + 192574, 192579, 192581, 192586, 192588, 192593, 192595, 192599, 192601, + 192605, 192607, 192614, 192616, 192618, 192620, 192625, 192627, 192629, + 192631, 192633, 192635, 192637, 192642, 192646, 192648, 192653, 192657, + 192659, 192664, 192668, 192670, 192675, 192679, 192681, 192683, 192685, + 192687, 192691, 192693, 192698, 192700, 192706, 192708, 192714, 192716, + 192718, 192720, 192724, 192726, 192733, 192735, 192742, 192744, 192750, + 192756, 192758, 192765, 192772, 192774, 192780, 192785, 192787, 192793, + 192799, 192801, 192807, 192813, 192815, 192821, 192825, 192827, 192832, + 192834, 192836, 192841, 192843, 192845, 192851, 192853, 192858, 192862, + 192864, 192869, 192873, 192875, 192881, 192883, 192887, 192889, 192893, + 192895, 192902, 192909, 192911, 192918, 192925, 192927, 192932, 192934, + 192942, 192944, 192950, 192952, 192958, 192960, 192964, 192966, 192972, + 192974, 192978, 192980, 192986, 192988, 192990, 192992, 192997, 193002, + 193004, 193013, 193015, 193025, 193030, 193037, 193044, 193049, 193054, + 193066, 193070, 193074, 193078, 193082, 193084, 193086, 193088, 193090, + 193092, 193098, 193100, 193102, 193104, 193106, 193108, 193110, 193112, + 193114, 193116, 193118, 193120, 193122, 193124, 193126, 193128, 193130, + 193132, 193138, 193145, 193150, 193158, 193166, 193171, 193177, 193179, + 193181, 193183, 193185, 193187, 193189, 193191, 193193, 193195, 193197, + 193199, 193201, 193203, 193205, 193207, 193209, 193221, 193226, 193228, + 193230, 193236, 193248, 193254, 193260, 193266, 193272, 193276, 193287, + 193289, 193291, 193293, 193295, 193297, 193299, 193301, 193303, 193305, + 193307, 193309, 193311, 193313, 193315, 193317, 193319, 193321, 193323, + 193325, 193327, 193329, 193331, 193333, 193335, 193337, 193339, 193341, + 193343, 193345, 193347, 193349, 193351, 193353, 193355, 193357, 193359, + 193361, 193363, 193365, 193367, 193369, 193371, 193373, 193375, 193377, + 193379, 193381, 193383, 193385, 193387, 193389, 193391, 193393, 193395, + 193397, 193399, 193401, 193403, 193405, 193407, 193409, 193411, 193413, + 193415, 193417, 193419, 193421, 193423, 193425, 193427, 193429, 193431, + 193433, 193435, 193437, 193439, 193441, 193443, 193445, 193447, 193449, + 193451, 193453, 193455, 193457, 193459, 193461, 193463, 193465, 193467, + 193469, 193471, 193473, 193475, 193477, 193479, 193481, 193483, 193485, + 193487, 193489, 193491, 193493, 193495, 193497, 193499, 193501, 193503, + 193505, 193507, 193509, 193511, 193513, 193515, 193517, 193519, 193521, + 193523, 193525, 193527, 193529, 193531, 193533, 193535, 193537, 193539, + 193541, 193543, 193545, 193547, 193549, 193551, 193553, 193555, 193557, + 193559, 193561, 193563, 193565, 193567, 193569, 193571, 193573, 193575, + 193577, 193579, 193581, 193583, 193585, 193587, 193589, 193591, 193593, + 193595, 193597, 193599, 193601, 193603, 193605, 193607, 193609, 193611, + 193613, 193615, 193617, 193619, 193621, 193623, 193625, 193627, 193629, + 193631, 193633, 193635, 193637, 193639, 193641, 193643, 193645, 193647, + 193649, 193651, 193653, 193655, 193657, 193659, 193661, 193663, 193665, + 193667, 193669, 193671, 193673, 193675, 193677, 193679, 193681, 193683, + 193685, 193687, 193689, 193691, 193693, 193695, 193697, 193699, 193701, + 193703, 193705, 193707, 193709, 193711, 193713, 193715, 193717, 193719, + 193721, 193723, 193725, 193727, 193729, 193731, 193733, 193735, 193737, + 193739, 193741, 193743, 193745, 193747, 193749, 193751, 193753, 193755, + 193757, 193759, 193761, 193763, 193765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 193723, 193727, 193731, 193736, 193740, 193744, 193748, - 193752, 193756, 193760, 193764, 193768, 193772, 193782, 193792, 193803, - 193814, 193824, 193834, 193844, 193854, 193868, 193882, 193896, 193910, - 193919, 193928, 193941, 193954, 193967, 193980, 193990, 194000, 194011, - 194022, 194033, 194044, 194055, 194064, 194074, 194084, 194094, 194104, - 194115, 194126, 194137, 194148, 194159, 194170, 194181, 194192, 194203, - 194214, 194225, 194239, 194250, 194264, 194272, 194283, 194291, 194299, - 194307, 194315, 194323, 194331, 194341, 194351, 194361, 194371, 194381, - 194391, 194401, 194411, 194419, 194428, 194437, 194446, 194455, 194463, - 194471, 194481, 194491, 194502, 194513, 194525, 194536, 194546, 194557, - 194567, 194578, 194586, 194593, 194600, 194607, 194614, 194621, 194628, - 194635, 194642, 194650, 194658, 194666, 194674, 194682, 194690, 194698, - 194706, 194714, 194722, 194730, 194735, 194739, 194743, 194747, 194751, - 194755, 194759, 194763, 194767, 194771, 194775, 194779, 194782, 194785, - 194789, 194793, 194797, 194801, 194805, 194809, 194813, 194817, 194821, - 194825, 194829, 194833, 194837, 194841, 194845, 194849, 194853, 194857, - 194861, 194865, 194869, 194873, 194877, 194881, 194885, 194889, 194893, - 194897, 194901, 194905, 194909, 194913, 194917, 194921, 194925, 194929, - 194933, 194937, 194941, 194945, 194949, 194953, 194957, 194961, 194965, - 194969, 194973, 194977, 194981, 194985, 194989, 194993, 194997, 195001, - 195005, 195009, 195013, 195017, 195021, 195025, 195029, 195033, 195037, - 195041, 195045, 195049, 195053, 195057, 195061, 195065, 195069, 195073, - 195077, 195081, 195085, 195089, 195093, 195097, 195101, 195105, 195109, - 195113, 195117, 195121, 195125, 195128, 195132, 195136, 195140, 195144, - 195148, 195152, 195156, 195160, 195164, 195168, 195172, 195176, 195180, - 195184, 195188, 195192, 195196, 195200, 195204, 195208, 195212, 195216, - 195220, 195224, 195228, 195232, 195236, 195240, 195244, 195248, 195252, - 195256, 195260, 195264, 195268, 195272, 195276, 195280, 195284, 195288, - 195292, 195296, 195300, 195304, 195308, 195312, 195316, 195320, 195324, - 195328, 195332, 195336, 195340, 195344, 195348, 195352, 195356, 195360, - 195364, 195368, 195372, 195376, 195380, 195384, 195388, 195392, 195396, - 195400, 195404, 195408, 195412, 195416, 195420, 195424, 195428, 195432, - 195436, 195440, 195444, 195448, 195452, 195456, 195460, 195464, 195468, - 195472, 195476, 195480, 195484, 195488, 195492, 195496, 195500, 195504, - 195508, 195512, 195516, 195520, 195524, 195528, 195532, 195536, 195540, - 195544, 195548, 195552, 195556, 195560, 195564, 195568, 195572, 195576, - 195580, 195584, 195588, 195592, 195596, 195600, 195604, 195608, 195612, - 195616, 195620, 195624, 195628, 195632, 195636, 195640, 195644, 195648, - 195652, 195656, 195660, 195664, 195668, 195672, 195676, 195680, 195684, - 195688, 195692, 195696, 195700, 195704, 195708, 195712, 195716, 195720, - 195724, 195728, 195732, 195736, 195740, 195744, 195748, 195752, 195756, - 195760, 195764, 195768, 195772, 195776, 195780, 195784, 195788, 195792, - 195796, 195800, 195804, 195808, 195812, 195816, 195820, 195824, 195828, - 195832, 195836, 195840, 195844, 195848, 195852, 195856, 195860, 195864, - 195868, 195872, 195876, 195880, 195884, 195888, 195892, 195897, 195902, - 195907, 195911, 195917, 195924, 195931, 195938, 195945, 195952, 195959, - 195966, 195973, 195980, 195987, 195994, 196001, 196008, 196014, 196021, - 196028, 196034, 196041, 196048, 196055, 196062, 196069, 196076, 196083, - 196090, 196097, 196104, 196111, 196118, 196125, 196131, 196137, 196143, - 196150, 196159, 196168, 196177, 196186, 196191, 196196, 196203, 196210, - 196217, 196224, 196231, 196237, 196243, 196249, 196255, 196261, 196267, - 196273, 196278, 196284, 196294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 193767, 193771, 193775, 193780, 193784, 193788, 193792, + 193796, 193800, 193804, 193808, 193812, 193816, 193826, 193836, 193847, + 193858, 193868, 193878, 193888, 193898, 193912, 193926, 193940, 193954, + 193963, 193972, 193985, 193998, 194011, 194024, 194034, 194044, 194055, + 194066, 194077, 194088, 194099, 194108, 194118, 194128, 194138, 194148, + 194159, 194170, 194181, 194192, 194203, 194214, 194225, 194236, 194247, + 194258, 194269, 194283, 194294, 194308, 194316, 194327, 194335, 194343, + 194351, 194359, 194367, 194375, 194385, 194395, 194405, 194415, 194425, + 194435, 194445, 194455, 194463, 194472, 194481, 194490, 194499, 194507, + 194515, 194525, 194535, 194546, 194557, 194569, 194580, 194590, 194601, + 194611, 194622, 194630, 194637, 194644, 194651, 194658, 194665, 194672, + 194679, 194686, 194694, 194702, 194710, 194718, 194726, 194734, 194742, + 194750, 194758, 194766, 194774, 194779, 194783, 194787, 194791, 194795, + 194799, 194803, 194807, 194811, 194815, 194819, 194823, 194826, 194829, + 194833, 194837, 194841, 194845, 194849, 194853, 194857, 194861, 194865, + 194869, 194873, 194877, 194881, 194885, 194889, 194893, 194897, 194901, + 194905, 194909, 194913, 194917, 194921, 194925, 194929, 194933, 194937, + 194941, 194945, 194949, 194953, 194957, 194961, 194965, 194969, 194973, + 194977, 194981, 194985, 194989, 194993, 194997, 195001, 195005, 195009, + 195013, 195017, 195021, 195025, 195029, 195033, 195037, 195041, 195045, + 195049, 195053, 195057, 195061, 195065, 195069, 195073, 195077, 195081, + 195085, 195089, 195093, 195097, 195101, 195105, 195109, 195113, 195117, + 195121, 195125, 195129, 195133, 195137, 195141, 195145, 195149, 195153, + 195157, 195161, 195165, 195169, 195172, 195176, 195180, 195184, 195188, + 195192, 195196, 195200, 195204, 195208, 195212, 195216, 195220, 195224, + 195228, 195232, 195236, 195240, 195244, 195248, 195252, 195256, 195260, + 195264, 195268, 195272, 195276, 195280, 195284, 195288, 195292, 195296, + 195300, 195304, 195308, 195312, 195316, 195320, 195324, 195328, 195332, + 195336, 195340, 195344, 195348, 195352, 195356, 195360, 195364, 195368, + 195372, 195376, 195380, 195384, 195388, 195392, 195396, 195400, 195404, + 195408, 195412, 195416, 195420, 195424, 195428, 195432, 195436, 195440, + 195444, 195448, 195452, 195456, 195460, 195464, 195468, 195472, 195476, + 195480, 195484, 195488, 195492, 195496, 195500, 195504, 195508, 195512, + 195516, 195520, 195524, 195528, 195532, 195536, 195540, 195544, 195548, + 195552, 195556, 195560, 195564, 195568, 195572, 195576, 195580, 195584, + 195588, 195592, 195596, 195600, 195604, 195608, 195612, 195616, 195620, + 195624, 195628, 195632, 195636, 195640, 195644, 195648, 195652, 195656, + 195660, 195664, 195668, 195672, 195676, 195680, 195684, 195688, 195692, + 195696, 195700, 195704, 195708, 195712, 195716, 195720, 195724, 195728, + 195732, 195736, 195740, 195744, 195748, 195752, 195756, 195760, 195764, + 195768, 195772, 195776, 195780, 195784, 195788, 195792, 195796, 195800, + 195804, 195808, 195812, 195816, 195820, 195824, 195828, 195832, 195836, + 195840, 195844, 195848, 195852, 195856, 195860, 195864, 195868, 195872, + 195876, 195880, 195884, 195888, 195892, 195896, 195900, 195904, 195908, + 195912, 195916, 195920, 195924, 195928, 195932, 195936, 195941, 195946, + 195951, 195955, 195961, 195968, 195975, 195982, 195989, 195996, 196003, + 196010, 196017, 196024, 196031, 196038, 196045, 196052, 196058, 196065, + 196072, 196078, 196085, 196092, 196099, 196106, 196113, 196120, 196127, + 196134, 196141, 196148, 196155, 196162, 196169, 196175, 196181, 196187, + 196194, 196203, 196212, 196221, 196230, 196235, 196240, 196247, 196254, + 196261, 196268, 196275, 196281, 196287, 196293, 196299, 196305, 196311, + 196317, 196322, 196328, 196338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; @@ -25771,7 +25777,7 @@ static const unsigned int code_hash[] = { 64721, 0, 0, 0, 0, 0, 983789, 0, 0, 5311, 0, 965, 0, 11993, 78055, 11278, 128787, 0, 0, 0, 121076, 120705, 0, 6294, 3144, 0, 0, 65019, 0, 0, 0, 0, 118721, 63966, 2330, 535, 3148, 12375, 110774, 0, 10556, 2475, 12388, - 4889, 0, 67863, 120404, 0, 72750, 2342, 0, 0, 0, 4894, 0, 4890, 0, 0, 0, + 4889, 0, 67863, 120404, 0, 12287, 2342, 0, 0, 0, 4894, 0, 4890, 0, 0, 0, 4893, 128426, 6571, 118581, 4888, 4157, 78048, 78049, 78046, 11263, 0, 78045, 64895, 121437, 0, 0, 0, 0, 0, 119041, 2332, 78063, 78060, 78061, 64932, 78059, 65125, 121098, 0, 0, 129991, 73941, 78066, 12203, 78064, @@ -26147,7 +26153,7 @@ static const unsigned int code_hash[] = { 72720, 72020, 11386, 1009, 70405, 66871, 2333, 0, 0, 0, 0, 0, 70407, 128121, 0, 0, 0, 0, 983657, 66949, 0, 74968, 0, 0, 110601, 0, 0, 41261, 0, 0, 0, 0, 118989, 6736, 917883, 124132, 43010, 66952, 0, 69635, 73011, - 983716, 0, 0, 7293, 0, 0, 0, 0, 111332, 0, 128245, 69928, 127071, 0, + 983716, 72750, 0, 7293, 0, 0, 0, 0, 111332, 0, 128245, 69928, 127071, 0, 127072, 64445, 111336, 6635, 0, 0, 72707, 74936, 0, 0, 917876, 0, 93025, 66948, 0, 111329, 0, 129887, 128045, 65219, 11925, 0, 92434, 0, 0, 9845, 101317, 7546, 0, 0, 11230, 4985, 13288, 672, 8098, 0, 0, 0, 128126, @@ -27037,7 +27043,7 @@ static const unsigned int code_hash[] = { 0, 64260, 0, 12606, 0, 0, 0, 0, 562, 983614, 0, 129648, 66455, 127533, 3219, 0, 0, 0, 1037, 0, 64491, 0, 78579, 78572, 78580, 4568, 549, 0, 0, 0, 0, 0, 128095, 70851, 2205, 0, 0, 0, 0, 129716, 0, 10825, 8079, 118962, - 0, 0, 0, 128855, 0, 13071, 0, 0, 41049, 42840, 43614, 129341, 74881, + 12285, 0, 0, 128855, 0, 13071, 0, 0, 41049, 42840, 43614, 129341, 74881, 74596, 127191, 5212, 0, 66402, 119191, 0, 9747, 0, 0, 129778, 984008, 41047, 1668, 0, 0, 0, 1187, 0, 74416, 0, 0, 0, 0, 3240, 128518, 9213, 0, 0, 0, 127174, 69822, 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, 0, 11272, 0, 73914, @@ -28020,7 +28026,7 @@ static const unsigned int code_hash[] = { 0, 0, 0, 4843, 0, 74772, 4098, 0, 0, 0, 3436, 0, 127279, 12817, 0, 126607, 118678, 0, 0, 0, 74433, 0, 0, 71962, 0, 121296, 65916, 0, 0, 121458, 0, 129107, 93815, 0, 73743, 0, 0, 983133, 67676, 0, 0, 74627, - 128928, 0, 127892, 0, 71326, 67222, 0, 75013, 92435, 0, 128500, 0, 0, + 128928, 0, 127892, 0, 71326, 67222, 0, 75013, 92435, 12284, 128500, 0, 0, 9613, 43425, 4526, 121415, 0, 64520, 71336, 0, 0, 55278, 10228, 64957, 0, 0, 3807, 2081, 66640, 0, 0, 0, 0, 119269, 0, 128688, 0, 128142, 1451, 0, 0, 4134, 0, 74847, 0, 74793, 0, 78913, 74295, 9960, 1201, 0, 12846, @@ -28492,12 +28498,12 @@ static const unsigned int code_hash[] = { 78726, 0, 724, 0, 113675, 78749, 9975, 78746, 78747, 78744, 4175, 78741, 78743, 78751, 939, 0, 128799, 983120, 0, 0, 0, 78763, 78764, 78760, 78761, 78758, 78759, 78755, 8425, 0, 0, 0, 8188, 0, 0, 0, 0, 0, 6370, 0, - 7827, 68441, 75008, 0, 917943, 0, 118863, 0, 0, 0, 0, 121243, 73988, 0, - 113668, 0, 11012, 0, 43764, 178, 12972, 74620, 113671, 0, 113735, 0, - 66764, 0, 0, 65690, 72339, 0, 0, 917950, 9252, 0, 4652, 74259, 0, 917947, - 0, 0, 0, 10806, 0, 0, 70016, 0, 6723, 0, 0, 6993, 0, 0, 12855, 0, 0, - 11390, 0, 0, 0, 92503, 0, 0, 983162, 125270, 92627, 8278, 0, 4034, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 12750, 9350, 66037, 0, 0, 73700, 12747, 0, 0, + 7827, 68441, 75008, 0, 917943, 0, 118863, 0, 0, 0, 0, 121243, 73988, + 12286, 113668, 0, 11012, 0, 43764, 178, 12972, 74620, 113671, 0, 113735, + 0, 66764, 0, 0, 65690, 72339, 0, 0, 917950, 9252, 0, 4652, 74259, 0, + 917947, 0, 0, 0, 10806, 0, 0, 70016, 0, 6723, 0, 0, 6993, 0, 0, 12855, 0, + 0, 11390, 0, 0, 0, 92503, 0, 0, 983162, 125270, 92627, 8278, 0, 4034, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 12750, 9350, 66037, 0, 0, 73700, 12747, 0, 0, 128064, 8922, 74640, 0, 0, 43150, 0, 983090, 983088, 66779, 66777, 10813, 2592, 43139, 0, 0, 118612, 0, 0, 71891, 0, 0, 0, 0, 0, 0, 71697, 0, 128825, 1596, 0, 0, 0, 0, 6838, 66572, 0, 126574, 120627, 8092, 12805, @@ -29642,7 +29648,7 @@ static const unsigned int code_hash[] = { 100884, 0, 0, 0, 123564, 0, 5134, 69980, 322, 4643, 5132, 0, 194942, 0, 5143, 0, 72309, 119628, 0, 0, 72112, 0, 129964, 0, 0, 0, 0, 0, 0, 73097, 0, 0, 0, 127923, 0, 0, 0, 0, 0, 3234, 0, 100886, 0, 100889, 118924, 0, 0, - 100875, 68231, 74489, 100872, 120746, 0, 100876, 0, 12714, 0, 64585, + 100875, 68231, 74489, 100872, 120746, 12783, 100876, 0, 12714, 0, 64585, 93775, 0, 0, 0, 129428, 0, 11027, 0, 10059, 0, 64524, 9767, 789, 1749, 0, 66766, 984010, 320, 0, 0, 0, 3049, 0, 6471, 0, 74479, 9925, 127356, 127355, 127358, 4960, 5549, 127359, 127346, 127345, 127348, 5418, 127350, diff --git a/Objects/unicodetype_db.h b/Objects/unicodetype_db.h index 22f8243eaec1b7..39a567dc46e89a 100644 --- a/Objects/unicodetype_db.h +++ b/Objects/unicodetype_db.h @@ -360,6 +360,7 @@ const _PyUnicode_TypeRecord _PyUnicode_TypeRecords[] = { {0, -128, 0, 0, 0, 10113}, {0, -126, 0, 0, 0, 10113}, {33555335, 18875268, 16778121, 0, 0, 26433}, + {0, 0, 0, 0, 0, 4608}, {0, 0, 0, 0, 0, 3076}, {0, 0, 0, 0, 4, 3076}, {0, 0, 0, 0, 5, 3076}, @@ -1760,603 +1761,603 @@ static const unsigned short index1[] = { 76, 64, 77, 78, 79, 80, 81, 82, 83, 64, 64, 84, 85, 34, 34, 34, 34, 34, 34, 86, 34, 34, 34, 34, 34, 87, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 88, 89, 90, 91, 34, 34, 34, 92, 34, 34, - 34, 93, 94, 34, 34, 34, 34, 34, 95, 34, 34, 34, 96, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 97, 98, 99, 34, 34, 34, 34, 34, 34, 100, 101, 34, 34, - 34, 34, 34, 34, 34, 34, 102, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 103, 34, 34, 34, 34, 34, 34, 34, 34, 104, 34, 34, 34, 34, - 100, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 103, 34, 34, 34, 34, 34, 34, 105, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 106, 107, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 108, 109, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 110, 34, 34, 34, 34, 34, - 34, 34, 34, 111, 34, 34, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 88, 89, 90, 91, 92, 93, 34, 94, 34, 34, + 34, 95, 96, 34, 34, 34, 34, 34, 97, 34, 34, 34, 98, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 99, 100, 101, 34, 34, 34, 34, 34, 34, 102, 103, 34, + 34, 34, 34, 34, 34, 34, 34, 104, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 105, 34, 34, 34, 93, 34, 34, 34, 34, 34, 34, 34, 34, 106, 34, 34, 34, 34, + 107, 108, 34, 34, 34, 34, 34, 109, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 93, 34, 34, 34, 34, 34, 34, 110, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 111, 112, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 113, 34, 34, 34, 34, 114, 34, 34, 115, 116, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 117, 34, 34, 34, + 34, 34, 34, 34, 34, 118, 34, 34, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, 127, 128, - 129, 130, 131, 132, 34, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 125, 143, 144, 145, 146, 147, 148, 149, 34, 34, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 125, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 125, 174, 175, 125, 176, 177, 178, 179, - 125, 180, 181, 182, 183, 184, 185, 186, 125, 187, 188, 189, 190, 125, - 191, 192, 193, 34, 34, 34, 34, 34, 34, 34, 194, 195, 34, 196, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 197, 34, 34, 34, 34, 34, 34, 34, 34, 198, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 34, 34, 34, 34, 199, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 34, 34, 34, 34, 200, 201, 202, 203, 125, 125, 125, 125, 204, - 205, 206, 207, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 131, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 133, 134, + 135, 136, 137, 138, 139, 34, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 132, 150, 151, 152, 153, 154, 155, 156, 34, 34, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 132, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 132, 181, 182, 132, 183, 184, 185, + 186, 132, 187, 188, 189, 190, 191, 192, 193, 132, 194, 195, 196, 197, + 132, 198, 199, 200, 34, 34, 34, 34, 34, 34, 34, 201, 202, 34, 203, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 204, 34, 34, 34, 34, 34, 34, 34, 34, 205, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 34, 34, 34, 34, 206, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 34, 34, 34, 34, 207, 208, 209, 210, 132, 132, 132, 132, + 211, 212, 213, 214, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 208, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 209, 210, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 211, 34, 34, 212, 34, 34, 213, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 214, 215, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 216, 217, 64, 218, - 219, 220, 221, 222, 223, 125, 224, 225, 226, 227, 228, 229, 230, 231, 64, - 64, 64, 64, 232, 233, 125, 125, 125, 125, 125, 125, 125, 125, 234, 125, - 235, 236, 237, 125, 125, 238, 125, 125, 125, 239, 125, 125, 125, 125, - 125, 240, 34, 241, 242, 125, 125, 125, 125, 125, 243, 244, 245, 125, 246, - 247, 125, 125, 248, 249, 250, 251, 252, 125, 64, 253, 64, 64, 64, 64, 64, - 254, 255, 256, 257, 258, 64, 64, 259, 260, 64, 261, 125, 125, 125, 125, - 125, 125, 125, 125, 262, 263, 264, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 86, 265, 34, 266, 267, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 215, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 216, 217, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 218, 34, 34, 219, 34, 34, 220, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 221, 222, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 223, 224, 64, + 225, 226, 227, 228, 229, 230, 132, 231, 232, 233, 234, 235, 236, 237, + 238, 64, 64, 64, 64, 239, 240, 132, 132, 132, 132, 132, 132, 132, 132, + 241, 132, 242, 243, 244, 132, 132, 245, 132, 132, 132, 246, 132, 132, + 132, 132, 132, 247, 34, 248, 249, 132, 132, 132, 132, 132, 250, 251, 252, + 132, 253, 254, 132, 132, 255, 256, 257, 258, 259, 132, 64, 260, 64, 64, + 64, 64, 64, 261, 262, 263, 264, 265, 64, 64, 266, 267, 64, 268, 132, 132, + 132, 132, 132, 132, 132, 132, 269, 270, 271, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 86, 272, 34, 273, 274, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 268, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 269, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 270, + 34, 34, 34, 34, 34, 34, 34, 34, 275, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 276, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 277, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 271, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 109, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 272, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 273, 34, 274, 34, 34, + 278, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 279, 34, 280, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 275, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 281, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 276, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 34, 268, 34, 34, 277, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 282, 34, 34, 34, 34, 283, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 34, 275, 34, 34, 284, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 278, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 285, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 279, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 280, 125, 281, 282, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, + 34, 34, 34, 34, 34, 34, 286, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 287, 132, 288, 289, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, }; static const unsigned short index2[] = { @@ -2777,27 +2778,27 @@ static const unsigned short index2[] = { 342, 265, 265, 343, 343, 0, 5, 5, 5, 264, 264, 344, 345, 346, 126, 347, 348, 265, 265, 349, 349, 130, 5, 5, 5, 0, 0, 350, 351, 352, 0, 353, 354, 355, 355, 356, 356, 357, 5, 5, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, - 20, 20, 20, 20, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 5, 4, 4, 5, 2, 2, 20, 20, 20, 20, 20, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 17, 17, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 17, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 20, 20, 20, 20, 20, 0, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 358, 101, 0, 0, 359, 360, 361, 362, 363, - 364, 4, 4, 4, 4, 4, 101, 358, 25, 21, 22, 359, 360, 361, 362, 363, 364, - 4, 4, 4, 4, 4, 0, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 5, - 5, 5, 5, 24, 5, 5, 5, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 120, 4, 4, 4, 4, 120, 4, - 4, 19, 120, 120, 120, 19, 19, 120, 120, 120, 19, 4, 120, 4, 4, 365, 120, - 120, 120, 120, 120, 4, 4, 4, 4, 4, 4, 120, 4, 366, 4, 120, 4, 367, 368, - 120, 120, 365, 19, 120, 120, 369, 120, 19, 54, 54, 54, 54, 19, 4, 4, 19, - 19, 120, 120, 4, 4, 4, 4, 4, 120, 19, 19, 19, 19, 4, 4, 4, 4, 370, 4, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 371, 371, - 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, + 358, 358, 20, 20, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 5, 4, 4, 5, 2, 2, 20, 20, 20, 20, 20, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 17, 17, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 17, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 20, 20, 20, 20, 20, 0, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 359, 101, 0, 0, 360, 361, 362, 363, + 364, 365, 4, 4, 4, 4, 4, 101, 359, 25, 21, 22, 360, 361, 362, 363, 364, + 365, 4, 4, 4, 4, 4, 0, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 5, 5, 5, 5, 24, 5, 5, 5, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 120, 4, 4, 4, 4, + 120, 4, 4, 19, 120, 120, 120, 19, 19, 120, 120, 120, 19, 4, 120, 4, 4, + 366, 120, 120, 120, 120, 120, 4, 4, 4, 4, 4, 4, 120, 4, 367, 4, 120, 4, + 368, 369, 120, 120, 366, 19, 120, 120, 370, 120, 19, 54, 54, 54, 54, 19, + 4, 4, 19, 19, 120, 120, 4, 4, 4, 4, 4, 120, 19, 19, 19, 19, 4, 4, 4, 4, + 371, 4, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, - 372, 372, 242, 242, 242, 29, 30, 242, 242, 242, 242, 26, 4, 4, 0, 0, 0, - 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 372, 372, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, + 373, 373, 373, 373, 242, 242, 242, 29, 30, 242, 242, 242, 242, 26, 4, 4, + 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, @@ -2808,26 +2809,26 @@ static const unsigned short index2[] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 25, 21, 22, 359, 360, 361, 362, 363, 364, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 25, 21, 22, 359, 360, 361, 362, 363, 364, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 25, 21, 22, 359, 360, 361, 362, 363, 364, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 373, 373, 373, 373, 373, - 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, - 373, 373, 373, 373, 373, 373, 373, 374, 374, 374, 374, 374, 374, 374, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 25, 21, 22, 360, 361, 362, 363, 364, 365, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 25, 21, 22, 360, 361, 362, 363, 364, 365, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 21, 22, 360, 361, 362, 363, 364, + 365, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, - 374, 374, 374, 374, 374, 358, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, - 21, 22, 359, 360, 361, 362, 363, 364, 26, 358, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 374, 374, 374, 374, 374, 374, 374, 374, 375, 375, 375, 375, 375, 375, + 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, + 375, 375, 375, 375, 375, 375, 359, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 25, 21, 22, 360, 361, 362, 363, 364, 365, 26, 359, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 25, 21, 22, 359, 360, 361, 362, - 363, 364, 26, 25, 21, 22, 359, 360, 361, 362, 363, 364, 26, 25, 21, 22, - 359, 360, 361, 362, 363, 364, 26, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 25, 21, 22, 360, 361, + 362, 363, 364, 365, 26, 25, 21, 22, 360, 361, 362, 363, 364, 365, 26, 25, + 21, 22, 360, 361, 362, 363, 364, 365, 26, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, @@ -2836,85 +2837,85 @@ static const unsigned short index2[] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 135, 135, 135, 135, 135, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 135, 135, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 29, 30, 375, 376, 377, 378, 379, 29, - 30, 29, 30, 29, 30, 380, 381, 382, 383, 19, 29, 30, 19, 29, 30, 19, 19, - 19, 19, 19, 101, 101, 384, 384, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, - 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, - 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, - 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, - 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, - 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, - 19, 4, 4, 4, 4, 4, 4, 29, 30, 29, 30, 24, 24, 24, 29, 30, 0, 0, 0, 0, 0, - 4, 4, 4, 4, 26, 4, 4, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, - 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, - 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 0, - 385, 0, 0, 0, 0, 0, 385, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 102, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, - 54, 0, 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 0, 54, - 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, - 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 0, 24, 24, 24, 24, 24, 24, 24, + 136, 136, 136, 136, 136, 136, 136, 136, 29, 30, 376, 377, 378, 379, 380, + 29, 30, 29, 30, 29, 30, 381, 382, 383, 384, 19, 29, 30, 19, 29, 30, 19, + 19, 19, 19, 19, 101, 101, 385, 385, 29, 30, 29, 30, 29, 30, 29, 30, 29, + 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, + 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, + 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, + 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, + 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, + 30, 19, 4, 4, 4, 4, 4, 4, 29, 30, 29, 30, 24, 24, 24, 29, 30, 0, 0, 0, 0, + 0, 4, 4, 4, 4, 26, 4, 4, 386, 386, 386, 386, 386, 386, 386, 386, 386, + 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, + 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, + 386, 0, 386, 0, 0, 0, 0, 0, 386, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 102, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, + 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 0, + 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, + 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 24, 24, 24, 24, 24, 24, 24, 24, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 386, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 387, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 0, 0, 0, 0, 1, 4, 4, 4, 4, 102, 54, 242, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 24, 24, 24, 24, 17, 17, 4, 102, 102, 102, - 102, 102, 4, 4, 242, 242, 242, 102, 54, 4, 4, 4, 0, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 4, 4, 4, 4, 102, 54, 242, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 24, 24, 24, 24, 17, 17, 4, 102, 102, + 102, 102, 102, 4, 4, 242, 242, 242, 102, 54, 4, 4, 4, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 24, 24, 5, 5, 102, 102, 54, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 24, 24, 5, 5, 102, 102, 54, + 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 4, 102, 102, 102, 54, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 17, 102, 102, 102, 54, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 0, 4, 4, 26, 26, 26, 26, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 54, + 54, 54, 54, 54, 0, 4, 4, 26, 26, 26, 26, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 4, 4, 4, 4, 4, 4, 4, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, + 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, @@ -2927,14 +2928,14 @@ static const unsigned short index2[] = { 26, 26, 26, 26, 26, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 54, 54, - 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, @@ -2943,7 +2944,7 @@ static const unsigned short index2[] = { 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, @@ -2952,7 +2953,7 @@ static const unsigned short index2[] = { 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, @@ -2961,501 +2962,551 @@ static const unsigned short index2[] = { 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 387, 54, 54, 387, 54, 54, 54, 387, - 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 388, 54, 54, 388, 54, 54, 54, 388, + 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 388, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 387, 54, 387, + 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 388, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 388, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 387, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 387, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 387, 54, - 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 387, 387, 387, - 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 387, - 387, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 388, 54, 388, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, + 54, 388, 388, 388, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 388, 388, 388, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, - 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 387, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 387, 387, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 388, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 388, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 388, 388, + 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 387, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, + 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, - 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 102, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, - 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 102, - 102, 102, 102, 102, 102, 4, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 102, 4, 4, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 54, 54, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 29, 30, 29, 30, 29, 30, - 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, - 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, - 29, 30, 54, 24, 5, 5, 5, 4, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 4, - 102, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, - 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 101, 101, 24, 24, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 24, 24, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 102, 102, 102, 102, 102, 102, 102, 102, 102, 5, 5, 29, 30, 29, 30, 29, - 30, 29, 30, 29, 30, 29, 30, 29, 30, 19, 19, 29, 30, 29, 30, 29, 30, 29, - 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, - 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, + 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 388, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 102, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 102, 102, 102, + 102, 102, 102, 4, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 102, + 4, 4, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, - 30, 101, 19, 19, 19, 19, 19, 19, 19, 19, 29, 30, 29, 30, 388, 29, 30, 29, - 30, 29, 30, 29, 30, 29, 30, 102, 5, 5, 29, 30, 389, 19, 54, 29, 30, 29, - 30, 390, 19, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, - 30, 29, 30, 29, 30, 391, 392, 393, 394, 391, 19, 395, 396, 397, 398, 29, - 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 399, 400, - 401, 29, 30, 29, 30, 0, 0, 0, 0, 0, 29, 30, 0, 19, 0, 19, 29, 30, 29, 30, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 101, 101, 101, 29, 30, 54, 101, 101, 19, 54, 54, 54, 54, 54, 54, 54, 24, - 54, 54, 54, 24, 54, 54, 54, 54, 24, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 17, 17, 24, 24, - 17, 4, 4, 4, 4, 24, 0, 0, 0, 26, 26, 26, 26, 26, 26, 4, 4, 4, 4, 0, 0, 0, - 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 54, + 24, 5, 5, 5, 4, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 4, 102, 29, 30, + 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, + 29, 30, 29, 30, 29, 30, 29, 30, 101, 101, 24, 24, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 24, 24, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 5, 5, 29, 30, 29, 30, 29, 30, 29, + 30, 29, 30, 29, 30, 29, 30, 19, 19, 29, 30, 29, 30, 29, 30, 29, 30, 29, + 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, + 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, + 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 101, + 19, 19, 19, 19, 19, 19, 19, 19, 29, 30, 29, 30, 389, 29, 30, 29, 30, 29, + 30, 29, 30, 29, 30, 102, 5, 5, 29, 30, 390, 19, 54, 29, 30, 29, 30, 391, + 19, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, + 30, 29, 30, 392, 393, 394, 395, 392, 19, 396, 397, 398, 399, 29, 30, 29, + 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 400, 401, 402, 29, + 30, 29, 30, 0, 0, 0, 0, 0, 29, 30, 0, 19, 0, 19, 29, 30, 29, 30, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 101, + 101, 29, 30, 54, 101, 101, 19, 54, 54, 54, 54, 54, 54, 54, 24, 54, 54, + 54, 24, 54, 54, 54, 54, 24, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 17, 17, 24, 24, 17, 4, 4, + 4, 4, 24, 0, 0, 0, 26, 26, 26, 26, 26, 26, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 54, 54, 54, 54, 54, 54, 4, 4, 4, 54, - 4, 54, 54, 24, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 24, 24, 24, 24, 24, 24, 24, 24, 4, 4, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 4, 4, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 17, 17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 24, - 24, 24, 17, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 24, 17, 17, 24, - 24, 24, 24, 17, 17, 24, 24, 17, 17, 17, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 0, 102, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 4, 4, 54, - 54, 54, 54, 54, 24, 102, 54, 54, 54, 54, 54, 54, 54, 54, 54, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 54, 54, 54, 54, 54, 54, 4, 4, 4, 54, 4, 54, + 54, 24, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 24, 24, 24, 24, 24, 24, 24, 24, 4, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 24, - 24, 24, 24, 24, 24, 17, 17, 24, 24, 17, 17, 24, 24, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 54, 54, 54, 24, 54, 54, 54, 54, 54, 54, 54, 54, 24, 17, 0, 0, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 4, 4, 4, 4, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 102, 54, 54, 54, 54, 54, 54, 4, - 4, 4, 54, 17, 24, 17, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 24, 54, 24, 24, 24, 54, 54, 24, 24, 54, 54, 54, 54, 54, 24, 24, 54, - 24, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 54, 54, 102, 4, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 17, - 24, 24, 17, 17, 4, 4, 54, 102, 102, 17, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, - 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 0, 54, - 54, 54, 54, 54, 54, 54, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 402, 19, 19, 19, 19, 19, 19, 19, 5, 101, 101, - 101, 101, 19, 19, 19, 19, 19, 19, 19, 19, 19, 101, 5, 5, 0, 0, 0, 0, 403, - 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, - 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, - 474, 475, 476, 477, 478, 479, 480, 481, 482, 54, 54, 54, 54, 54, 54, 54, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 24, 24, + 24, 17, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 17, 17, 24, 17, 17, 24, 17, 17, - 4, 17, 24, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 24, 17, 17, 24, 24, + 24, 24, 17, 17, 24, 24, 17, 17, 17, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 0, 102, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 4, 4, 54, 54, + 54, 54, 54, 24, 102, 54, 54, 54, 54, 54, 54, 54, 54, 54, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 24, 24, + 24, 24, 24, 24, 17, 17, 24, 24, 17, 17, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 54, 54, 54, 24, 54, 54, 54, 54, 54, 54, 54, 54, 24, 17, 0, 0, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 0, 0, 4, 4, 4, 4, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 102, 54, 54, 54, 54, 54, 54, 4, 4, 4, + 54, 17, 24, 17, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 24, 54, 24, 24, 24, 54, 54, 24, 24, 54, 54, 54, 54, 54, 24, 24, 54, 24, + 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 54, 54, 102, 4, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 17, 24, + 24, 17, 17, 4, 4, 54, 102, 102, 17, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, + 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, + 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, + 54, 54, 54, 54, 54, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 403, 19, 19, 19, 19, 19, 19, 19, 5, 101, 101, 101, + 101, 19, 19, 19, 19, 19, 19, 19, 19, 19, 101, 5, 5, 0, 0, 0, 0, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 17, 17, 24, 17, 17, 24, 17, 17, 4, + 17, 24, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 387, 54, + 388, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 387, + 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 483, 484, 485, 486, 487, 488, 489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 490, 491, 492, 493, 494, 0, 0, 0, 0, 0, 54, 24, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 0, 54, 54, 54, 54, 54, 0, 54, 0, 54, 54, 0, 54, 54, 0, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 484, + 485, 486, 487, 488, 489, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, + 492, 493, 494, 495, 0, 0, 0, 0, 0, 54, 24, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 54, + 54, 54, 54, 54, 0, 54, 0, 54, 54, 0, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 495, - 495, 495, 495, 495, 495, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 496, 496, 496, + 496, 496, 496, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 4, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 495, 495, - 4, 4, 4, 4, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 4, 4, 4, 17, 17, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 17, 17, 17, - 4, 4, 5, 0, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, - 4, 4, 4, 4, 0, 0, 0, 0, 495, 54, 495, 54, 495, 0, 495, 54, 495, 54, 495, - 54, 495, 54, 495, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 496, 496, 4, 4, 4, + 4, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 4, 4, + 4, 5, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 4, 4, 4, 17, 17, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 17, 17, 17, 4, 4, 5, 0, + 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, + 0, 0, 0, 0, 496, 54, 496, 54, 496, 0, 496, 54, 496, 54, 496, 54, 496, 54, + 496, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 0, 0, 20, 0, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 5, 4, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 5, 4, 4, 4, 4, 4, 4, 16, 16, 16, 16, + 54, 0, 0, 20, 0, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 5, 4, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 5, 4, 4, 4, 4, 4, 4, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 4, 4, 4, 5, 17, 5, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 102, + 16, 4, 4, 4, 5, 17, 5, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 17, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 102, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 496, 496, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 497, 497, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 0, 0, 0, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, - 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 0, 0, 0, - 4, 4, 4, 5, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 20, 20, 20, 4, 4, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 0, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, + 54, 54, 54, 0, 0, 0, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, 54, + 54, 0, 0, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 0, 0, 0, 4, 4, 4, 5, + 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, + 20, 4, 4, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 0, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 4, 4, - 4, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 4, 4, 4, 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, 0, 0, 0, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 26, - 26, 26, 26, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 26, 26, 4, - 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 4, 0, 0, 0, 0, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 26, 26, 26, 26, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 26, 26, 4, 4, 4, 0, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24, 0, 0, 54, 54, 54, 54, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 26, 26, + 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 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, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, + 26, 26, 26, 26, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, + 54, 54, 54, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 242, 54, + 54, 54, 54, 54, 54, 54, 54, 242, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 242, 54, 54, 54, 54, 54, 54, 54, 54, 242, 0, 0, 0, 0, 0, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 24, - 24, 24, 24, 24, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 24, 24, 24, 24, + 24, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 0, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 4, 242, 242, 242, - 242, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, 497, - 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, - 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, - 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 498, 498, 498, 498, + 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 4, 242, 242, 242, 242, 242, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, - 498, 498, 498, 498, 498, 498, 498, 498, 54, 54, 54, 54, 54, 54, 54, 54, + 498, 498, 498, 498, 498, 498, 498, 498, 499, 499, 499, 499, 499, 499, + 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, + 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, + 499, 499, 499, 499, 499, 499, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 497, 497, 497, 497, - 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, - 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, - 497, 497, 497, 497, 0, 0, 0, 0, 498, 498, 498, 498, 498, 498, 498, 498, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, - 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 0, - 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, + 498, 0, 0, 0, 0, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, + 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, + 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 0, 499, 499, - 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 0, 499, - 499, 499, 499, 499, 499, 499, 0, 499, 499, 0, 500, 500, 500, 500, 500, - 500, 500, 500, 500, 500, 500, 0, 500, 500, 500, 500, 500, 500, 500, 500, - 500, 500, 500, 500, 500, 500, 500, 0, 500, 500, 500, 500, 500, 500, 500, - 0, 500, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 500, 500, + 500, 500, 500, 500, 500, 500, 500, 500, 500, 0, 500, 500, 500, 500, 500, + 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 0, 500, 500, 500, 500, + 500, 500, 500, 0, 500, 500, 0, 501, 501, 501, 501, 501, 501, 501, 501, + 501, 501, 501, 0, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, + 501, 501, 501, 501, 0, 501, 501, 501, 501, 501, 501, 501, 0, 501, 501, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 102, 102, 101, 101, 101, 0, 101, 101, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, + 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 101, 102, 102, 101, 101, 101, 0, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 0, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 0, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 0, 0, 54, 0, 54, 54, 54, + 0, 0, 0, 54, 54, 54, 54, 54, 54, 0, 0, 54, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 0, 54, 54, 0, 0, 0, 54, 0, 0, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 4, - 26, 26, 26, 26, 26, 26, 26, 26, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 4, 4, 26, 26, 26, 26, - 26, 26, 26, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, - 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, + 54, 0, 54, 54, 0, 0, 0, 54, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 4, 26, 26, 26, 26, + 26, 26, 26, 26, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 4, 4, 26, 26, 26, 26, 26, 26, 26, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 0, 0, - 0, 0, 0, 26, 26, 26, 26, 26, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 26, 26, 26, 26, 26, 26, 0, 0, - 0, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 0, 0, 0, 0, 0, 26, 26, + 26, 26, 26, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 26, 26, 26, 26, 26, 26, 0, 0, 0, 4, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 26, 26, 54, 54, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, + 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 26, 26, 54, 54, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 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, 54, 24, 24, 24, 0, 24, 24, 0, 0, 0, 0, 0, 24, - 24, 24, 24, 54, 54, 54, 54, 0, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, + 26, 26, 26, 26, 54, 24, 24, 24, 0, 24, 24, 0, 0, 0, 0, 0, 24, 24, 24, 24, + 54, 54, 54, 54, 0, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 0, 0, 24, 24, 24, 0, 0, 0, 0, 24, 25, 21, 22, 359, 26, - 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, - 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 26, 26, 4, 54, + 54, 0, 0, 24, 24, 24, 0, 0, 0, 0, 24, 25, 21, 22, 360, 26, 26, 26, 26, + 26, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 54, 54, 54, 54, 54, 54, 54, 54, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 26, 26, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 24, 24, 0, 0, 0, 0, 26, 26, 26, 26, 26, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, + 54, 54, 54, 54, 54, 54, 4, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 24, + 24, 0, 0, 0, 0, 26, 26, 26, 26, 26, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 26, 26, - 26, 26, 26, 26, 26, 26, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, - 26, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 54, 54, 54, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 26, 26, 26, + 26, 26, 26, 26, 26, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, + 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3473,7 +3524,7 @@ static const unsigned short index2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 25, 21, 22, 359, 360, 361, 362, 363, 364, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 21, 22, 360, 361, 362, 363, 364, 365, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, @@ -3498,7 +3549,7 @@ static const unsigned short index2[] = { 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 4, 4, 4, 4, - 4, 4, 4, 0, 0, 0, 0, 25, 21, 22, 359, 360, 361, 362, 363, 364, 26, 26, + 4, 4, 4, 0, 0, 0, 0, 25, 21, 22, 360, 361, 362, 363, 364, 365, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 24, 54, 54, 24, 24, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 17, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, @@ -3974,12 +4025,12 @@ static const unsigned short index2[] = { 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 501, 501, 501, 501, - 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, - 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, - 501, 501, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 502, 502, 502, 502, + 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, - 502, 502, 502, 502, 502, 502, 502, 502, 24, 24, 24, 24, 24, 24, 24, 102, + 502, 502, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, + 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, + 503, 503, 503, 503, 503, 503, 503, 503, 24, 24, 24, 24, 24, 24, 24, 102, 0, 0, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4023,15 +4074,15 @@ static const unsigned short index2[] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 358, 358, 25, 21, 22, 359, 360, 361, 362, 363, 364, 26, 26, 4, 4, + 0, 0, 359, 359, 25, 21, 22, 360, 361, 362, 363, 364, 365, 26, 26, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 503, 503, 503, 503, 503, 503, 503, 503, 503, - 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, - 503, 503, 503, 4, 4, 4, 4, 4, 4, 503, 503, 503, 503, 503, 503, 503, 503, - 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, - 503, 503, 503, 503, 4, 4, 4, 4, 4, 4, 503, 503, 503, 503, 503, 503, 503, - 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, - 503, 503, 503, 503, 503, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 504, 504, 504, 504, 504, 504, 504, 504, 504, + 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + 504, 504, 504, 4, 4, 4, 4, 4, 4, 504, 504, 504, 504, 504, 504, 504, 504, + 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + 504, 504, 504, 504, 4, 4, 4, 4, 4, 4, 504, 504, 504, 504, 504, 504, 504, + 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + 504, 504, 504, 504, 504, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4089,30 +4140,30 @@ static const unsigned short index2[] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 54, 387, 54, 54, 54, 54, + 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, @@ -4124,23 +4175,23 @@ static const unsigned short index2[] = { 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, + 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, @@ -4148,7 +4199,7 @@ static const unsigned short index2[] = { 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 387, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 388, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, @@ -4159,68 +4210,68 @@ static const unsigned short index2[] = { 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 387, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 54, 54, 54, + 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, + 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, - 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 20, 20, 20, 20, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, @@ -4233,8 +4284,8 @@ static const unsigned short index2[] = { 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, }; /* Returns the numeric value as double for Unicode characters @@ -4282,6 +4333,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x24EA: case 0x24FF: case 0x3007: + case 0x6D1E: case 0x96F6: case 0xA620: case 0xA6EF: @@ -4713,6 +4765,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ECA0: case 0x1ECB4: return (double) 100000.0; + case 0x5146: case 0x16B5E: return (double) 1000000.0; case 0x1ECA1: @@ -4721,11 +4774,14 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x5104: case 0x16B5F: return (double) 100000000.0; + case 0x79ED: + return (double) 1000000000.0; case 0x16B60: return (double) 10000000000.0; - case 0x5146: case 0x16B61: return (double) 1000000000000.0; + case 0x4EAC: + return (double) 1e+16; case 0x216A: case 0x217A: case 0x246A: @@ -4865,7 +4921,10 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x3221: case 0x3281: case 0x3483: + case 0x4E24: case 0x4E8C: + case 0x4FE9: + case 0x5006: case 0x5169: case 0x5F0D: case 0x5F10: @@ -5008,6 +5067,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1EC7B: case 0x1ED0B: return (double) 20.0; + case 0x7695: case 0x1011A: case 0x102F4: case 0x109D3: @@ -5894,6 +5954,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x3286: case 0x3B4D: case 0x4E03: + case 0x62D0: case 0x67D2: case 0x6F06: case 0xA627: @@ -6198,6 +6259,8 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x4E5D: case 0x5EFE: case 0x7396: + case 0x920E: + case 0x94A9: case 0xA629: case 0xA6EE: case 0xA8D9: diff --git a/Tools/unicode/makeunicodedata.py b/Tools/unicode/makeunicodedata.py index 034642db06e48b..6bf5274551c00a 100644 --- a/Tools/unicode/makeunicodedata.py +++ b/Tools/unicode/makeunicodedata.py @@ -44,7 +44,7 @@ # * Doc/library/stdtypes.rst, and # * Doc/library/unicodedata.rst # * Doc/reference/lexical_analysis.rst (two occurrences) -UNIDATA_VERSION = "15.0.0" +UNIDATA_VERSION = "15.1.0" UNICODE_DATA = "UnicodeData%s.txt" COMPOSITION_EXCLUSIONS = "CompositionExclusions%s.txt" EASTASIAN_WIDTH = "EastAsianWidth%s.txt" @@ -101,15 +101,16 @@ # these ranges need to match unicodedata.c:is_unified_ideograph cjk_ranges = [ - ('3400', '4DBF'), - ('4E00', '9FFF'), - ('20000', '2A6DF'), - ('2A700', '2B739'), - ('2B740', '2B81D'), - ('2B820', '2CEA1'), - ('2CEB0', '2EBE0'), - ('30000', '3134A'), - ('31350', '323AF'), + ('3400', '4DBF'), # CJK Ideograph Extension A CJK + ('4E00', '9FFF'), # CJK Ideograph + ('20000', '2A6DF'), # CJK Ideograph Extension B + ('2A700', '2B739'), # CJK Ideograph Extension C + ('2B740', '2B81D'), # CJK Ideograph Extension D + ('2B820', '2CEA1'), # CJK Ideograph Extension E + ('2CEB0', '2EBE0'), # CJK Ideograph Extension F + ('2EBF0', '2EE5D'), # CJK Ideograph Extension I + ('30000', '3134A'), # CJK Ideograph Extension G + ('31350', '323AF'), # CJK Ideograph Extension H ] @@ -1105,11 +1106,15 @@ def __init__(self, version, cjk_check=True): table[i].east_asian_width = widths[i] self.widths = widths - for char, (p,) in UcdFile(DERIVED_CORE_PROPERTIES, version).expanded(): + for char, (propname, *propinfo) in UcdFile(DERIVED_CORE_PROPERTIES, version).expanded(): + if propinfo: + # this is not a binary property, ignore it + continue + if table[char]: # Some properties (e.g. Default_Ignorable_Code_Point) # apply to unassigned code points; ignore them - table[char].binary_properties.add(p) + table[char].binary_properties.add(propname) for char_range, value in UcdFile(LINE_BREAK, version): if value not in MANDATORY_LINE_BREAKS: From 850cc8d0b1db0a912a6e458720e265e6a6e5c1ba Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Tue, 19 Sep 2023 22:40:34 -0700 Subject: [PATCH 265/357] gh-109559: Update unicodedata checksums for 15.1.0. (#109597) Update unicodedata checksums for 15.1.0. --- Lib/test/test_unicodedata.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py index 515c3840cb3647..6adf03316ca0bb 100644 --- a/Lib/test/test_unicodedata.py +++ b/Lib/test/test_unicodedata.py @@ -18,7 +18,7 @@ class UnicodeMethodsTest(unittest.TestCase): # update this, if the database changes - expectedchecksum = 'e708c31c0d51f758adf475cb7201cf80917362be' + expectedchecksum = '63aa77dcb36b0e1df082ee2a6071caeda7f0955e' @requires_resource('cpu') def test_method_checksum(self): @@ -71,7 +71,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 = '26ff0d31c14194b4606a5b3a81ac36df3a14e331' + expectedchecksum = '232affd2a50ec4bd69d2482aa0291385cbdefaba' @requires_resource('cpu') def test_function_checksum(self): From ced6924630037f1e5b3d1dbef2b600152fb07fbb Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 20 Sep 2023 15:54:19 +0200 Subject: [PATCH 266/357] gh-108973: Fix asyncio test_subprocess_consistent_callbacks() (#109431) SubprocessProtocol process_exited() method can be called before pipe_data_received() and pipe_connection_lost() methods. Document it and adapt the test for that. Revert commit 282edd7b2a74c4dfe1bfe3c5b1d30f9c21d554d6. _child_watcher_callback() calls immediately _process_exited(): don't add an additional delay with call_soon(). The reverted change didn't make _process_exited() more determistic: it can still be called before pipe_connection_lost() for example. Co-authored-by: Davide Rizzo --- Doc/library/asyncio-llapi-index.rst | 10 ++--- Doc/library/asyncio-protocol.rst | 19 ++++++++- Lib/asyncio/unix_events.py | 3 +- Lib/test/test_asyncio/test_subprocess.py | 54 +++++++++++++++++++----- 4 files changed, 67 insertions(+), 19 deletions(-) diff --git a/Doc/library/asyncio-llapi-index.rst b/Doc/library/asyncio-llapi-index.rst index 9ce48a24444e66..67136ba69ec875 100644 --- a/Doc/library/asyncio-llapi-index.rst +++ b/Doc/library/asyncio-llapi-index.rst @@ -484,19 +484,19 @@ Protocol classes can implement the following **callback methods**: :widths: 50 50 :class: full-width-table - * - ``callback`` :meth:`pipe_data_received() - ` + * - ``callback`` :meth:`~SubprocessProtocol.pipe_data_received` - Called when the child process writes data into its *stdout* or *stderr* pipe. - * - ``callback`` :meth:`pipe_connection_lost() - ` + * - ``callback`` :meth:`~SubprocessProtocol.pipe_connection_lost` - Called when one of the pipes communicating with the child process is closed. * - ``callback`` :meth:`process_exited() ` - - Called when the child process has exited. + - Called when the child process has exited. It can be called before + :meth:`~SubprocessProtocol.pipe_data_received` and + :meth:`~SubprocessProtocol.pipe_connection_lost` methods. Event Loop Policies diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst index 9781bda8b27df0..3f734f544afe21 100644 --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -708,6 +708,9 @@ factories passed to the :meth:`loop.subprocess_exec` and Called when the child process has exited. + It can be called before :meth:`~SubprocessProtocol.pipe_data_received` and + :meth:`~SubprocessProtocol.pipe_connection_lost` methods. + Examples ======== @@ -1003,12 +1006,26 @@ The subprocess is created by the :meth:`loop.subprocess_exec` method:: def __init__(self, exit_future): self.exit_future = exit_future self.output = bytearray() + self.pipe_closed = False + self.exited = False + + def pipe_connection_lost(self, fd, exc): + self.pipe_closed = True + self.check_for_exit() def pipe_data_received(self, fd, data): self.output.extend(data) def process_exited(self): - self.exit_future.set_result(True) + self.exited = True + # process_exited() method can be called before + # pipe_connection_lost() method: wait until both methods are + # called. + self.check_for_exit() + + def check_for_exit(self): + if self.pipe_closed and self.exited: + self.exit_future.set_result(True) async def get_date(): # Get a reference to the event loop as we plan to use diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index a2680865ed968f..28cef964debd36 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -226,8 +226,7 @@ async def _make_subprocess_transport(self, protocol, args, shell, return transp def _child_watcher_callback(self, pid, returncode, transp): - # Skip one iteration for callbacks to be executed - self.call_soon_threadsafe(self.call_soon, transp._process_exited, returncode) + self.call_soon_threadsafe(transp._process_exited, returncode) async def create_unix_connection( self, protocol_factory, path=None, *, diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index eeeca40c15cd28..429ef16fdb0e05 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -753,21 +753,44 @@ async def main() -> None: self.loop.run_until_complete(main()) - def test_subprocess_consistent_callbacks(self): + def test_subprocess_protocol_events(self): + # gh-108973: Test that all subprocess protocol methods are called. + # The protocol methods are not called in a determistic order. + # The order depends on the event loop and the operating system. events = [] + fds = [1, 2] + expected = [ + ('pipe_data_received', 1, b'stdout'), + ('pipe_data_received', 2, b'stderr'), + ('pipe_connection_lost', 1), + ('pipe_connection_lost', 2), + 'process_exited', + ] + per_fd_expected = [ + 'pipe_data_received', + 'pipe_connection_lost', + ] + class MyProtocol(asyncio.SubprocessProtocol): def __init__(self, exit_future: asyncio.Future) -> None: self.exit_future = exit_future def pipe_data_received(self, fd, data) -> None: events.append(('pipe_data_received', fd, data)) + self.exit_maybe() def pipe_connection_lost(self, fd, exc) -> None: - events.append('pipe_connection_lost') + events.append(('pipe_connection_lost', fd)) + self.exit_maybe() def process_exited(self) -> None: events.append('process_exited') - self.exit_future.set_result(True) + self.exit_maybe() + + def exit_maybe(self): + # Only exit when we got all expected events + if len(events) >= len(expected): + self.exit_future.set_result(True) async def main() -> None: loop = asyncio.get_running_loop() @@ -777,15 +800,24 @@ async def main() -> None: sys.executable, '-c', code, stdin=None) await exit_future transport.close() - self.assertEqual(events, [ - ('pipe_data_received', 1, b'stdout'), - ('pipe_data_received', 2, b'stderr'), - 'pipe_connection_lost', - 'pipe_connection_lost', - 'process_exited', - ]) - self.loop.run_until_complete(main()) + return events + + events = self.loop.run_until_complete(main()) + + # First, make sure that we received all events + self.assertSetEqual(set(events), set(expected)) + + # Second, check order of pipe events per file descriptor + per_fd_events = {fd: [] for fd in fds} + for event in events: + if event == 'process_exited': + continue + name, fd = event[:2] + per_fd_events[fd].append(name) + + for fd in fds: + self.assertEqual(per_fd_events[fd], per_fd_expected, (fd, events)) def test_subprocess_communicate_stdout(self): # See https://github.com/python/cpython/issues/100133 From d41d2e69f621ce25e7719f5057a6be6776bc6783 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 20 Sep 2023 18:51:53 +0200 Subject: [PATCH 267/357] gh-109054: Document configure variables (#109224) --- Doc/library/hashlib.rst | 2 + Doc/using/configure.rst | 149 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst index eb650c180ddbb4..761dd84edee299 100644 --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -364,6 +364,8 @@ include a `salt `_. .. versionadded:: 3.6 +.. _hashlib-blake2: + BLAKE2 ------ diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index 9d2952e0df95b8..16ed33dbcced15 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -289,6 +289,136 @@ General Options .. versionadded:: 3.13 +.. cmdoption:: PKG_CONFIG + + Path to ``pkg-config`` utility. + +.. cmdoption:: PKG_CONFIG_LIBDIR +.. cmdoption:: PKG_CONFIG_PATH + + ``pkg-config`` options. + + +C compiler options +------------------ + +.. cmdoption:: CC + + C compiler command. + +.. cmdoption:: CFLAGS + + C compiler flags. + +.. cmdoption:: CPP + + C preprocessor command. + +.. cmdoption:: CPPFLAGS + + C preprocessor flags, e.g. :samp:`-I{include_dir}`. + + +Linker options +-------------- + +.. cmdoption:: LDFLAGS + + Linker flags, e.g. :samp:`-L{library_directory}`. + +.. cmdoption:: LIBS + + Libraries to pass to the linker, e.g. :samp:`-l{library}`. + +.. cmdoption:: MACHDEP + + Name for machine-dependent library files. + + +Options for third-party dependencies +------------------------------------ + +.. versionadded:: 3.11 + +.. cmdoption:: BZIP2_CFLAGS +.. cmdoption:: BZIP2_LIBS + + C compiler and linker flags to link Python to ``libbz2``, used by :mod:`bz2` + module, overriding ``pkg-config``. + +.. cmdoption:: CURSES_CFLAGS +.. cmdoption:: CURSES_LIBS + + C compiler and linker flags for ``libncurses`` or ``libncursesw``, used by + :mod:`curses` module, overriding ``pkg-config``. + +.. cmdoption:: GDBM_CFLAGS +.. cmdoption:: GDBM_LIBS + + C compiler and linker flags for ``gdbm``. + +.. cmdoption:: LIBB2_CFLAGS +.. cmdoption:: LIBB2_LIBS + + C compiler and linker flags for ``libb2`` (:ref:`BLAKE2 `), + used by :mod:`hashlib` module, overriding ``pkg-config``. + +.. cmdoption:: LIBEDIT_CFLAGS +.. cmdoption:: LIBEDIT_LIBS + + C compiler and linker flags for ``libedit``, used by :mod:`readline` module, + overriding ``pkg-config``. + +.. cmdoption:: LIBFFI_CFLAGS +.. cmdoption:: LIBFFI_LIBS + + C compiler and linker flags for ``libffi``, used by :mod:`ctypes` module, + overriding ``pkg-config``. + +.. cmdoption:: LIBLZMA_CFLAGS +.. cmdoption:: LIBLZMA_LIBS + + C compiler and linker flags for ``liblzma``, used by :mod:`lzma` module, + overriding ``pkg-config``. + +.. cmdoption:: LIBREADLINE_CFLAGS +.. cmdoption:: LIBREADLINE_LIBS + + C compiler and linker flags for ``libreadline``, used by :mod:`readline` + module, overriding ``pkg-config``. + +.. cmdoption:: LIBSQLITE3_CFLAGS +.. cmdoption:: LIBSQLITE3_LIBS + + C compiler and linker flags for ``libsqlite3``, used by :mod:`sqlite3` + module, overriding ``pkg-config``. + +.. cmdoption:: LIBUUID_CFLAGS +.. cmdoption:: LIBUUID_LIBS + + C compiler and linker flags for ``libuuid``, used by :mod:`uuid` module, + overriding ``pkg-config``. + +.. cmdoption:: PANEL_CFLAGS +.. cmdoption:: PANEL_LIBS + + C compiler and Linker flags for PANEL, overriding ``pkg-config``. + + C compiler and linker flags for ``libpanel`` or ``libpanelw``, used by + :mod:`curses.panel` module, overriding ``pkg-config``. + +.. cmdoption:: TCLTK_CFLAGS +.. cmdoption:: TCLTK_LIBS + + C compiler and linker flags for TCLTK, overriding ``pkg-config``. + +.. cmdoption:: ZLIB_CFLAGS +.. cmdoption:: ZLIB_LIBS + + C compiler and linker flags for ``libzlib``, used by :mod:`gzip` module, + overriding ``pkg-config``. + + WebAssembly Options ------------------- @@ -428,6 +558,19 @@ also be used to improve performance. .. versionadded:: 3.12 +.. cmdoption:: BOLT_APPLY_FLAGS + + Arguments to ``llvm-bolt`` when creating a `BOLT optimized binary + `_. + + .. versionadded:: 3.12 + +.. cmdoption:: BOLT_INSTRUMENT_FLAGS + + Arguments to ``llvm-bolt`` when instrumenting binaries. + + .. versionadded:: 3.12 + .. cmdoption:: --with-computed-gotos Enable computed gotos in evaluation loop (enabled by default on supported @@ -775,6 +918,12 @@ the version of the cross compiled host Python. ac_cv_file__dev_ptmx=yes ac_cv_file__dev_ptc=no +.. cmdoption:: HOSTRUNNER + + Program to run CPython for the host platform for cross-compilation. + + .. versionadded:: 3.11 + Cross compiling example:: From 32ffe58c1298b0082ff6fe96ad45c4efe49f4338 Mon Sep 17 00:00:00 2001 From: Carl Meyer Date: Wed, 20 Sep 2023 10:55:56 -0600 Subject: [PATCH 268/357] gh-109390: add dump_symtable utility under #if 0 (#109391) Co-authored-by: Jelle Zijlstra --- Python/symtable.c | 111 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 1 deletion(-) diff --git a/Python/symtable.c b/Python/symtable.c index b0c7240a11e75b..75ea9e902f4381 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -4,6 +4,8 @@ #include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_symtable.h" // PySTEntryObject +// Set this to 1 to dump all symtables to stdout for debugging +#define _PY_DUMP_SYMTABLE 0 /* error strings used for warnings */ #define GLOBAL_PARAM \ @@ -251,6 +253,109 @@ static int symtable_visit_pattern(struct symtable *st, pattern_ty s); static int symtable_raise_if_annotation_block(struct symtable *st, const char *, expr_ty); static int symtable_raise_if_comprehension_block(struct symtable *st, expr_ty); +/* For debugging purposes only */ +#if _PY_DUMP_SYMTABLE +static void _dump_symtable(PySTEntryObject* ste, PyObject* prefix) +{ + const char *blocktype = ""; + switch (ste->ste_type) { + case FunctionBlock: blocktype = "FunctionBlock"; break; + case ClassBlock: blocktype = "ClassBlock"; break; + case ModuleBlock: blocktype = "ModuleBlock"; break; + case AnnotationBlock: blocktype = "AnnotationBlock"; break; + case TypeVarBoundBlock: blocktype = "TypeVarBoundBlock"; break; + case TypeAliasBlock: blocktype = "TypeAliasBlock"; break; + case TypeParamBlock: blocktype = "TypeParamBlock"; break; + } + const char *comptype = ""; + switch (ste->ste_comprehension) { + case ListComprehension: comptype = " ListComprehension"; break; + case DictComprehension: comptype = " DictComprehension"; break; + case SetComprehension: comptype = " SetComprehension"; break; + case GeneratorExpression: comptype = " GeneratorExpression"; break; + case NoComprehension: break; + } + PyObject* msg = PyUnicode_FromFormat( + ( + "%U=== Symtable for %U ===\n" + "%U%s%s\n" + "%U%s%s%s%s%s%s%s%s%s%s%s%s%s\n" + "%Ulineno: %d col_offset: %d\n" + "%U--- Symbols ---\n" + ), + prefix, + ste->ste_name, + prefix, + blocktype, + comptype, + prefix, + ste->ste_nested ? " nested" : "", + ste->ste_free ? " free" : "", + ste->ste_child_free ? " child_free" : "", + ste->ste_generator ? " generator" : "", + ste->ste_coroutine ? " coroutine" : "", + ste->ste_varargs ? " varargs" : "", + ste->ste_varkeywords ? " varkeywords" : "", + ste->ste_returns_value ? " returns_value" : "", + ste->ste_needs_class_closure ? " needs_class_closure" : "", + ste->ste_needs_classdict ? " needs_classdict" : "", + ste->ste_comp_inlined ? " comp_inlined" : "", + ste->ste_comp_iter_target ? " comp_iter_target" : "", + ste->ste_can_see_class_scope ? " can_see_class_scope" : "", + prefix, + ste->ste_lineno, + ste->ste_col_offset, + prefix + ); + assert(msg != NULL); + printf("%s", PyUnicode_AsUTF8(msg)); + Py_DECREF(msg); + PyObject *name, *value; + Py_ssize_t pos = 0; + while (PyDict_Next(ste->ste_symbols, &pos, &name, &value)) { + int scope = _PyST_GetScope(ste, name); + long flags = _PyST_GetSymbol(ste, name); + printf("%s %s: ", PyUnicode_AsUTF8(prefix), PyUnicode_AsUTF8(name)); + if (flags & DEF_GLOBAL) printf(" DEF_GLOBAL"); + if (flags & DEF_LOCAL) printf(" DEF_LOCAL"); + if (flags & DEF_PARAM) printf(" DEF_PARAM"); + if (flags & DEF_NONLOCAL) printf(" DEF_NONLOCAL"); + if (flags & USE) printf(" USE"); + if (flags & DEF_FREE) printf(" DEF_FREE"); + if (flags & DEF_FREE_CLASS) printf(" DEF_FREE_CLASS"); + if (flags & DEF_IMPORT) printf(" DEF_IMPORT"); + if (flags & DEF_ANNOT) printf(" DEF_ANNOT"); + if (flags & DEF_COMP_ITER) printf(" DEF_COMP_ITER"); + if (flags & DEF_TYPE_PARAM) printf(" DEF_TYPE_PARAM"); + if (flags & DEF_COMP_CELL) printf(" DEF_COMP_CELL"); + switch (scope) { + case LOCAL: printf(" LOCAL"); break; + case GLOBAL_EXPLICIT: printf(" GLOBAL_EXPLICIT"); break; + case GLOBAL_IMPLICIT: printf(" GLOBAL_IMPLICIT"); break; + case FREE: printf(" FREE"); break; + case CELL: printf(" CELL"); break; + } + printf("\n"); + } + printf("%s--- Children ---\n", PyUnicode_AsUTF8(prefix)); + PyObject *new_prefix = PyUnicode_FromFormat(" %U", prefix); + assert(new_prefix != NULL); + for (Py_ssize_t i = 0; i < PyList_GET_SIZE(ste->ste_children); i++) { + PyObject *child = PyList_GetItem(ste->ste_children, i); + assert(child != NULL && PySTEntry_Check(child)); + _dump_symtable((PySTEntryObject *)child, new_prefix); + } + Py_DECREF(new_prefix); +} + +static void dump_symtable(PySTEntryObject* ste) +{ + PyObject *empty = PyUnicode_FromString(""); + assert(empty != NULL); + _dump_symtable(ste, empty); + Py_DECREF(empty); +} +#endif #define DUPLICATE_ARGUMENT \ "duplicate argument '%U' in function definition" @@ -360,8 +465,12 @@ _PySymtable_Build(mod_ty mod, PyObject *filename, PyFutureFeatures *future) return NULL; } /* Make the second symbol analysis pass */ - if (symtable_analyze(st)) + if (symtable_analyze(st)) { +#if _PY_DUMP_SYMTABLE + dump_symtable(st->st_top); +#endif return st; + } _PySymtable_Free(st); return NULL; error: From ef6d475db3af4d30a3104fa6301dcd36c71eacab Mon Sep 17 00:00:00 2001 From: Heinz-Alexander Fuetterer <35225576+afuetterer@users.noreply.github.com> Date: Wed, 20 Sep 2023 18:58:23 +0200 Subject: [PATCH 269/357] Fix typos in docs and comments (#109619) --- Doc/c-api/exceptions.rst | 2 +- Doc/library/typing.rst | 2 +- Doc/library/unittest.mock.rst | 2 +- Doc/whatsnew/3.12.rst | 2 +- Doc/whatsnew/3.13.rst | 4 ++-- Doc/whatsnew/3.5.rst | 2 +- Lib/concurrent/futures/process.py | 2 +- Lib/test/test_descr.py | 2 +- Lib/test/test_dynamic.py | 2 +- Lib/test/test_frame.py | 2 +- Lib/test/test_unpack.py | 2 +- .../next/C API/2023-08-24-20-08-02.gh-issue-108014.20DOSS.rst | 2 +- Objects/object_layout.md | 2 +- Tools/cases_generator/generate_cases.py | 2 +- 14 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 6e2ac0a40a5f1b..2139da051e0193 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -786,7 +786,7 @@ Exception Objects Implement part of the interpreter's implementation of :keyword:`!except*`. *orig* is the original exception that was caught, and *excs* is the list of - the exceptions that need to be raised. This list contains the the unhandled + the exceptions that need to be raised. This list contains the unhandled part of *orig*, if any, as well as the exceptions that were raised from the :keyword:`!except*` clauses (so they have a different traceback from *orig*) and those that were reraised (and have the same traceback as *orig*). diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 18e15f304f9f80..e63b839931822c 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1301,7 +1301,7 @@ These can be used as types in annotations. They all support subscription using completely disables typechecking for a function or class. The responsibility of how to interpret the metadata - lies with the the tool or library encountering an + lies with the tool or library encountering an ``Annotated`` annotation. A tool or library encountering an ``Annotated`` type can scan through the metadata elements to determine if they are of interest (e.g., using :func:`isinstance`). diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 1452276436099b..49f7d453ee1c3a 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -1130,7 +1130,7 @@ object:: .. method:: wait_until_any_call_with(*args, **kwargs) - Waits until the the mock is called with the specified arguments. + Waits until the mock is called with the specified arguments. If a timeout was passed at the creation of the mock the function raises an :exc:`AssertionError` if the call is not performed in time. diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 4d4d1a69e0b44c..6b4ec99b43dea6 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -308,7 +308,7 @@ create an interpreter with its own GIL:: if (PyStatus_Exception(status)) { return -1; } - /* The new interpeter is now active in the current thread. */ + /* The new interpreter is now active in the current thread. */ For further examples how to use the C-API for sub-interpreters with a per-interpreter GIL, see :source:`Modules/_xxsubinterpretersmodule.c`. diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index fa24dc072ddefd..b4411a587c8bc7 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -119,7 +119,7 @@ copy ---- * Add :func:`copy.replace` function which allows to create a modified copy of - an object, which is especially usefule for immutable objects. + an object, which is especially useful for immutable objects. It supports named tuples created with the factory function :func:`collections.namedtuple`, :class:`~dataclasses.dataclass` instances, various :mod:`datetime` objects, :class:`~inspect.Signature` objects, @@ -208,7 +208,7 @@ tkinter traceback --------- -* Add *show_group* paramter to :func:`traceback.TracebackException.format_exception_only` +* Add *show_group* parameter to :func:`traceback.TracebackException.format_exception_only` to format the nested exceptions of a :exc:`BaseExceptionGroup` instance, recursively. (Contributed by Irit Katriel in :gh:`105292`.) diff --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst index 0c45a42d1a7c17..ae6affcab664c6 100644 --- a/Doc/whatsnew/3.5.rst +++ b/Doc/whatsnew/3.5.rst @@ -921,7 +921,7 @@ and improves their substitutability for lists. Docstrings produced by :func:`~collections.namedtuple` can now be updated:: Point = namedtuple('Point', ['x', 'y']) - Point.__doc__ += ': Cartesian coodinate' + Point.__doc__ += ': Cartesian coordinate' Point.x.__doc__ = 'abscissa' Point.y.__doc__ = 'ordinate' diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index f4b5cd1d869067..fba19d39d5c9c2 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -495,7 +495,7 @@ def terminate_broken(self, cause): # set_exception() fails if the future is cancelled: ignore it. # Trying to check if the future is cancelled before calling # set_exception() would leave a race condition if the future is - # cancelled betwen the check and set_exception(). + # cancelled between the check and set_exception(). pass # Delete references to object. See issue16284 del work_item diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 35ddb7915eb5c7..4a3db80ca43c27 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1989,7 +1989,7 @@ def __getattr__(self, attr): ns = {} exec(code, ns) number_attrs = ns["number_attrs"] - # Warm up the the function for quickening (PEP 659) + # Warm up the function for quickening (PEP 659) for _ in range(30): self.assertEqual(number_attrs(Numbers()), list(range(280))) diff --git a/Lib/test/test_dynamic.py b/Lib/test/test_dynamic.py index 7e12d428e0fde2..0aa3be6a1bde6a 100644 --- a/Lib/test/test_dynamic.py +++ b/Lib/test/test_dynamic.py @@ -145,7 +145,7 @@ def __missing__(self, key): code = "lambda: " + "+".join(f"_number_{i}" for i in range(variables)) sum_func = eval(code, MyGlobals()) expected = sum(range(variables)) - # Warm up the the function for quickening (PEP 659) + # Warm up the function for quickening (PEP 659) for _ in range(30): self.assertEqual(sum_func(), expected) diff --git a/Lib/test/test_frame.py b/Lib/test/test_frame.py index 6bb0144e9b1ed7..9491c7facdf077 100644 --- a/Lib/test/test_frame.py +++ b/Lib/test/test_frame.py @@ -322,7 +322,7 @@ def f(): sneaky_frame_object = None gc.enable() next(g) - # g.gi_frame should be the the frame object from the callback (the + # g.gi_frame should be the frame object from the callback (the # one that was *requested* second, but *created* first): self.assertIs(g.gi_frame, sneaky_frame_object) finally: diff --git a/Lib/test/test_unpack.py b/Lib/test/test_unpack.py index f5ca1d455b5c6f..515ec128a08a9c 100644 --- a/Lib/test/test_unpack.py +++ b/Lib/test/test_unpack.py @@ -162,7 +162,7 @@ def test_extended_oparg_not_ignored(self): ns = {} exec(code, ns) unpack_400 = ns["unpack_400"] - # Warm up the the function for quickening (PEP 659) + # Warm up the function for quickening (PEP 659) for _ in range(30): y = unpack_400(range(400)) self.assertEqual(y, 399) diff --git a/Misc/NEWS.d/next/C API/2023-08-24-20-08-02.gh-issue-108014.20DOSS.rst b/Misc/NEWS.d/next/C API/2023-08-24-20-08-02.gh-issue-108014.20DOSS.rst index 5c1b04f3237e78..35cb153ba09076 100644 --- a/Misc/NEWS.d/next/C API/2023-08-24-20-08-02.gh-issue-108014.20DOSS.rst +++ b/Misc/NEWS.d/next/C API/2023-08-24-20-08-02.gh-issue-108014.20DOSS.rst @@ -1,4 +1,4 @@ Add :c:func:`PyLong_AsInt` function: similar to :c:func:`PyLong_AsLong`, but store the result in a C :c:expr:`int` instead of a C :c:expr:`long`. -Previously, it was known as the the private function :c:func:`!_PyLong_AsInt` +Previously, it was known as the private function :c:func:`!_PyLong_AsInt` (with an underscore prefix). Patch by Victor Stinner. diff --git a/Objects/object_layout.md b/Objects/object_layout.md index 4430790f4f0f36..3f7d72eb22f224 100644 --- a/Objects/object_layout.md +++ b/Objects/object_layout.md @@ -36,7 +36,7 @@ and the ``dict`` field points to the dictionary. ## 3.12 pre-header -In 3.12 the the pointer to the list of weak references is added to the +In 3.12 the pointer to the list of weak references is added to the pre-header. In order to make space for it, the ``dict`` and ``values`` pointers are combined into a single tagged pointer: diff --git a/Tools/cases_generator/generate_cases.py b/Tools/cases_generator/generate_cases.py index 5ddcd6ef7bf274..898736248a98f9 100644 --- a/Tools/cases_generator/generate_cases.py +++ b/Tools/cases_generator/generate_cases.py @@ -168,7 +168,7 @@ def effect_str(effects: list[StackEffect]) -> str: popped, pushed = stacking.get_stack_effect_info_for_macro(instr) case parsing.Pseudo(): instr = self.pseudo_instrs[thing.name] - # Calculate stack effect, and check that it's the the same + # Calculate stack effect, and check that it's the same # for all targets. for target in self.pseudos[thing.name].targets: target_instr = self.instrs.get(target) From 14cdefa667f211401c9dfab33c4695e80b4e5e95 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Wed, 20 Sep 2023 12:56:42 -0600 Subject: [PATCH 270/357] gh-109408: Move Windows builds from Azure Pipelines PR to GitHub Actions (#109569) --- .azure-pipelines/pr.yml | 31 ------------------------------- .github/workflows/build.yml | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 31 deletions(-) diff --git a/.azure-pipelines/pr.yml b/.azure-pipelines/pr.yml index daa2c7ca97df6a..335a4b407cb83c 100644 --- a/.azure-pipelines/pr.yml +++ b/.azure-pipelines/pr.yml @@ -26,34 +26,3 @@ jobs: steps: - template: ./posix-steps.yml - - -- job: Windows_PR_Tests - displayName: Windows PR Tests - dependsOn: Prebuild - condition: and(succeeded(), eq(dependencies.Prebuild.outputs['tests.run'], 'true')) - - pool: - vmImage: windows-2022 - - strategy: - matrix: - win32: - arch: win32 - buildOpt: '-p Win32' - testRunTitle: '$(System.PullRequest.TargetBranch)-win32' - testRunPlatform: win32 - win64: - arch: amd64 - buildOpt: '-p x64' - testRunTitle: '$(System.PullRequest.TargetBranch)-win64' - testRunPlatform: win64 - winarm64: - arch: arm64 - buildOpt: '-p arm64' - maxParallel: 4 - - steps: - - template: ./windows-steps.yml - parameters: - targetBranch: $(System.PullRequest.TargetBranch) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cbe5c841a433cf..7f9d0f4da09be7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -118,6 +118,8 @@ jobs: path: config.cache key: ${{ github.job }}-${{ runner.os }}-${{ needs.check_source.outputs.config_hash }} - uses: actions/setup-python@v4 + with: + python-version: '3.x' - name: Install Dependencies run: sudo ./.github/workflows/posix-deps-apt.sh - name: Add ccache to PATH @@ -201,6 +203,21 @@ jobs: - name: Tests run: .\PCbuild\rt.bat -p x64 -d -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0 + build_win_arm64: + name: 'Windows (arm64)' + runs-on: windows-latest + timeout-minutes: 60 + needs: check_source + if: needs.check_source.outputs.run_tests == 'true' + env: + IncludeUwp: 'true' + steps: + - uses: actions/checkout@v4 + - name: Register MSVC problem matcher + run: echo "::add-matcher::.github/problem-matchers/msvc.json" + - name: Build CPython + run: .\PCbuild\build.bat -e -d -p arm64 + build_macos: name: 'macOS' runs-on: macos-latest @@ -530,6 +547,7 @@ jobs: - check_generated_files - build_win32 - build_win_amd64 + - build_win_arm64 - build_macos - build_ubuntu - build_ubuntu_ssltests @@ -546,6 +564,7 @@ jobs: build_macos, build_ubuntu_ssltests, build_win32, + build_win_arm64, test_hypothesis, allowed-skips: >- ${{ @@ -561,6 +580,7 @@ jobs: check_generated_files, build_win32, build_win_amd64, + build_win_arm64, build_macos, build_ubuntu, build_ubuntu_ssltests, From 9ccf0545efd5bc5af5aa51774030c471d49a972b Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Thu, 21 Sep 2023 00:08:06 +0100 Subject: [PATCH 271/357] gh-109627: duplicated smalll exit blocks need to be assigned jump target labels (#109630) --- Lib/test/test_compile.py | 9 ++++++++ ...-09-20-23-04-15.gh-issue-109627.xxe7De.rst | 2 ++ Python/flowgraph.c | 22 ++++++++++++++----- 3 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-20-23-04-15.gh-issue-109627.xxe7De.rst diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 39d972c84f345e..f4e28559194dd6 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -1252,6 +1252,15 @@ def f(): return a, b self.assertEqual(f(), (54, 96)) + def test_duplicated_small_exit_block(self): + # See gh-109627 + def f(): + while element and something: + try: + return something + except: + pass + @requires_debug_ranges() class TestSourcePositions(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-20-23-04-15.gh-issue-109627.xxe7De.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-20-23-04-15.gh-issue-109627.xxe7De.rst new file mode 100644 index 00000000000000..397d76e291419f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-20-23-04-15.gh-issue-109627.xxe7De.rst @@ -0,0 +1,2 @@ +Fix bug where the compiler does not assign a new jump target label to a +duplicated small exit block. diff --git a/Python/flowgraph.c b/Python/flowgraph.c index 5ad49911dfbea4..2df9b4811817f2 100644 --- a/Python/flowgraph.c +++ b/Python/flowgraph.c @@ -575,16 +575,23 @@ check_cfg(cfg_builder *g) { return SUCCESS; } -/* Calculate the actual jump target from the target_label */ static int -translate_jump_labels_to_targets(basicblock *entryblock) +get_max_label(basicblock *entryblock) { - int max_label = -1; + int lbl = -1; for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - if (b->b_label.id > max_label) { - max_label = b->b_label.id; + if (b->b_label.id > lbl) { + lbl = b->b_label.id; } } + return lbl; +} + +/* Calculate the actual jump target from the target_label */ +static int +translate_jump_labels_to_targets(basicblock *entryblock) +{ + int max_label = get_max_label(entryblock); size_t mapsize = sizeof(basicblock *) * (max_label + 1); basicblock **label2block = (basicblock **)PyMem_Malloc(mapsize); if (!label2block) { @@ -2229,6 +2236,7 @@ is_exit_without_lineno(basicblock *b) { return true; } + /* PEP 626 mandates that the f_lineno of a frame is correct * after a frame terminates. It would be prohibitively expensive * to continuously update the f_lineno field at runtime, @@ -2242,6 +2250,9 @@ static int duplicate_exits_without_lineno(cfg_builder *g) { assert(no_empty_basic_blocks(g)); + + int next_lbl = get_max_label(g->g_entryblock) + 1; + /* Copy all exit blocks without line number that are targets of a jump. */ basicblock *entryblock = g->g_entryblock; @@ -2260,6 +2271,7 @@ duplicate_exits_without_lineno(cfg_builder *g) target->b_predecessors--; new_target->b_predecessors = 1; new_target->b_next = target->b_next; + new_target->b_label.id = next_lbl++; target->b_next = new_target; } } From 712cb173f8e1d02c625a40ae03bba57b0c1c032a Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Thu, 21 Sep 2023 07:06:36 +0100 Subject: [PATCH 272/357] GH-109209: Bump the minimum Sphinx version to 4.2 (#109210) --- .github/workflows/reusable-docs.yml | 2 +- Doc/conf.py | 2 +- Doc/requirements-oldest-sphinx.txt | 10 ++++------ .../2023-09-10-02-39-06.gh-issue-109209.0LBewo.rst | 1 + 4 files changed, 7 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2023-09-10-02-39-06.gh-issue-109209.0LBewo.rst diff --git a/.github/workflows/reusable-docs.yml b/.github/workflows/reusable-docs.yml index 51efa54e8d1b3d..1c4fa4239c1e34 100644 --- a/.github/workflows/reusable-docs.yml +++ b/.github/workflows/reusable-docs.yml @@ -74,7 +74,7 @@ jobs: - name: 'Set up Python' uses: actions/setup-python@v4 with: - python-version: '3.11' # known to work with Sphinx 3.2 + python-version: '3.11' # known to work with Sphinx 4.2 cache: 'pip' cache-dependency-path: 'Doc/requirements-oldest-sphinx.txt' - name: 'Install build dependencies' diff --git a/Doc/conf.py b/Doc/conf.py index 16fd8bf257179e..c92ea60ee07094 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -66,7 +66,7 @@ highlight_language = 'python3' # Minimum version of sphinx required -needs_sphinx = '3.2' +needs_sphinx = '4.2' # Ignore any .rst files in the includes/ directory; # they're embedded in pages but not rendered individually. diff --git a/Doc/requirements-oldest-sphinx.txt b/Doc/requirements-oldest-sphinx.txt index 94611ca22f09fe..d3ef5bc17650ae 100644 --- a/Doc/requirements-oldest-sphinx.txt +++ b/Doc/requirements-oldest-sphinx.txt @@ -7,12 +7,10 @@ blurb python-docs-theme>=2022.1 # Generated from: -# pip install "Sphinx~=3.2.0" "docutils<0.17" "Jinja2<3" "MarkupSafe<2" +# pip install "Sphinx~=4.2.0" # pip freeze # -# Sphinx 3.2 comes from ``needs_sphinx = '3.2'`` in ``Doc/conf.py``. -# Docutils<0.17, Jinja2<3, and MarkupSafe<2 are additionally specified as -# Sphinx 3.2 is incompatible with newer releases of these packages. +# Sphinx 4.2 comes from ``needs_sphinx = '4.2'`` in ``Doc/conf.py``. alabaster==0.7.13 Babel==2.12.1 @@ -25,10 +23,10 @@ imagesize==1.4.1 Jinja2==2.11.3 MarkupSafe==1.1.1 packaging==23.1 -Pygments==2.15.1 +Pygments==2.16.1 requests==2.31.0 snowballstemmer==2.2.0 -Sphinx==3.2.1 +Sphinx==4.2.0 sphinxcontrib-applehelp==1.0.4 sphinxcontrib-devhelp==1.0.2 sphinxcontrib-htmlhelp==2.0.1 diff --git a/Misc/NEWS.d/next/Documentation/2023-09-10-02-39-06.gh-issue-109209.0LBewo.rst b/Misc/NEWS.d/next/Documentation/2023-09-10-02-39-06.gh-issue-109209.0LBewo.rst new file mode 100644 index 00000000000000..79cc0b72ec742f --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2023-09-10-02-39-06.gh-issue-109209.0LBewo.rst @@ -0,0 +1 @@ +The minimum Sphinx version required for the documentation is now 4.2. From 115c49ad5a5ccfb628fef3ae06a566f7a0197f97 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Thu, 21 Sep 2023 10:39:36 +0300 Subject: [PATCH 273/357] gh-109625: Move _ready_to_import() from test_import to support.import_helper (#109626) --- Lib/test/support/import_helper.py | 25 +++++++++++++++++++- Lib/test/test_import/__init__.py | 38 ++++++++----------------------- Lib/test/test_inspect.py | 6 ++--- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/Lib/test/support/import_helper.py b/Lib/test/support/import_helper.py index 67f18e530edc4b..3d804f2b590108 100644 --- a/Lib/test/support/import_helper.py +++ b/Lib/test/support/import_helper.py @@ -8,7 +8,7 @@ import unittest import warnings -from .os_helper import unlink +from .os_helper import unlink, temp_dir @contextlib.contextmanager @@ -274,3 +274,26 @@ def mock_register_at_fork(func): # memory. from unittest import mock return mock.patch('os.register_at_fork', create=True)(func) + + +@contextlib.contextmanager +def ready_to_import(name=None, source=""): + from test.support import script_helper + + # 1. Sets up a temporary directory and removes it afterwards + # 2. Creates the module file + # 3. Temporarily clears the module from sys.modules (if any) + # 4. Reverts or removes the module when cleaning up + name = name or "spam" + with temp_dir() as tempdir: + path = script_helper.make_script(tempdir, name, source) + old_module = sys.modules.pop(name, None) + try: + sys.path.insert(0, tempdir) + yield name, path + sys.path.remove(tempdir) + finally: + if old_module is not None: + sys.modules[name] = old_module + else: + sys.modules.pop(name, None) diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 33bce779f6cc01..a302a6075eca0a 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -30,9 +30,10 @@ STDLIB_DIR, swap_attr, swap_item, cpython_only, is_emscripten, is_wasi, run_in_subinterp, run_in_subinterp_with_config, Py_TRACE_REFS) from test.support.import_helper import ( - forget, make_legacy_pyc, unlink, unload, DirsOnSysPath, CleanImport) + forget, make_legacy_pyc, unlink, unload, ready_to_import, + DirsOnSysPath, CleanImport) from test.support.os_helper import ( - TESTFN, rmtree, temp_umask, TESTFN_UNENCODABLE, temp_dir) + TESTFN, rmtree, temp_umask, TESTFN_UNENCODABLE) from test.support import script_helper from test.support import threading_helper from test.test_importlib.util import uncache @@ -125,27 +126,6 @@ def wrapper(self): return deco -@contextlib.contextmanager -def _ready_to_import(name=None, source=""): - # sets up a temporary directory and removes it - # creates the module file - # temporarily clears the module from sys.modules (if any) - # reverts or removes the module when cleaning up - name = name or "spam" - with temp_dir() as tempdir: - path = script_helper.make_script(tempdir, name, source) - old_module = sys.modules.pop(name, None) - try: - sys.path.insert(0, tempdir) - yield name, path - sys.path.remove(tempdir) - finally: - if old_module is not None: - sys.modules[name] = old_module - elif name in sys.modules: - del sys.modules[name] - - if _testsinglephase is not None: def restore__testsinglephase(*, _orig=_testsinglephase): # We started with the module imported and want to restore @@ -401,7 +381,7 @@ def test_from_import_missing_attr_path_is_canonical(self): def test_from_import_star_invalid_type(self): import re - with _ready_to_import() as (name, path): + with ready_to_import() as (name, path): with open(path, 'w', encoding='utf-8') as f: f.write("__all__ = [b'invalid_type']") globals = {} @@ -410,7 +390,7 @@ def test_from_import_star_invalid_type(self): ): exec(f"from {name} import *", globals) self.assertNotIn(b"invalid_type", globals) - with _ready_to_import() as (name, path): + with ready_to_import() as (name, path): with open(path, 'w', encoding='utf-8') as f: f.write("globals()[b'invalid_type'] = object()") globals = {} @@ -818,7 +798,7 @@ class FilePermissionTests(unittest.TestCase): ) def test_creation_mode(self): mask = 0o022 - with temp_umask(mask), _ready_to_import() as (name, path): + with temp_umask(mask), ready_to_import() as (name, path): cached_path = importlib.util.cache_from_source(path) module = __import__(name) if not os.path.exists(cached_path): @@ -837,7 +817,7 @@ def test_creation_mode(self): def test_cached_mode_issue_2051(self): # permissions of .pyc should match those of .py, regardless of mask mode = 0o600 - with temp_umask(0o022), _ready_to_import() as (name, path): + with temp_umask(0o022), ready_to_import() as (name, path): cached_path = importlib.util.cache_from_source(path) os.chmod(path, mode) __import__(name) @@ -853,7 +833,7 @@ def test_cached_mode_issue_2051(self): @os_helper.skip_unless_working_chmod def test_cached_readonly(self): mode = 0o400 - with temp_umask(0o022), _ready_to_import() as (name, path): + with temp_umask(0o022), ready_to_import() as (name, path): cached_path = importlib.util.cache_from_source(path) os.chmod(path, mode) __import__(name) @@ -868,7 +848,7 @@ def test_cached_readonly(self): def test_pyc_always_writable(self): # Initially read-only .pyc files on Windows used to cause problems # with later updates, see issue #6074 for details - with _ready_to_import() as (name, path): + with ready_to_import() as (name, path): # Write a Python file, make it read-only and import it with open(path, 'w', encoding='utf-8') as f: f.write("x = 'original'\n") diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 2fb356a0529ab0..f9bd632a01ed2e 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -33,7 +33,7 @@ from test.support import cpython_only from test.support import MISSING_C_DOCSTRINGS, ALWAYS_EQ -from test.support.import_helper import DirsOnSysPath +from test.support.import_helper import DirsOnSysPath, ready_to_import from test.support.os_helper import TESTFN from test.support.script_helper import assert_python_ok, assert_python_failure from test import inspect_fodder as mod @@ -43,8 +43,6 @@ from test import inspect_stringized_annotations from test import inspect_stringized_annotations_2 -from test.test_import import _ready_to_import - # Functions tested in this suite: # ismodule, isclass, ismethod, isfunction, istraceback, isframe, iscode, @@ -4954,7 +4952,7 @@ def assertInspectEqual(self, path, source): def test_getsource_reload(self): # see issue 1218234 - with _ready_to_import('reload_bug', self.src_before) as (name, path): + with ready_to_import('reload_bug', self.src_before) as (name, path): module = importlib.import_module(name) self.assertInspectEqual(path, module) with open(path, 'w', encoding='utf-8') as src: From d4cea794a7b9b745817d2bd982d35412aef04710 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 21 Sep 2023 09:55:06 +0200 Subject: [PATCH 274/357] gh-109613: _pystat_fromstructstat() checks for exceptions (#109618) Fix os.stat() and os.DirEntry.stat(): check for exceptions. Previously, on Python built in debug mode, these functions could trigger a fatal Python error (and abort the process) when a function succeeded with an exception set. _pystat_fromstructstat() now exits immediately if an exception is raised, rather only checking for exceptions at the end. It fix following fatal error in fill_time(): Fatal Python error: _Py_CheckSlotResult: Slot * of type int succeeded with an exception set --- ...-09-20-17-45-46.gh-issue-109613.P13ogN.rst | 4 + Modules/posixmodule.c | 121 +++++++++++------- 2 files changed, 76 insertions(+), 49 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-20-17-45-46.gh-issue-109613.P13ogN.rst diff --git a/Misc/NEWS.d/next/Library/2023-09-20-17-45-46.gh-issue-109613.P13ogN.rst b/Misc/NEWS.d/next/Library/2023-09-20-17-45-46.gh-issue-109613.P13ogN.rst new file mode 100644 index 00000000000000..e21a758fc2eb05 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-20-17-45-46.gh-issue-109613.P13ogN.rst @@ -0,0 +1,4 @@ +Fix :func:`os.stat` and :meth:`os.DirEntry.stat`: check for exceptions. +Previously, on Python built in debug mode, these functions could trigger a +fatal Python error (and abort the process) when a function succeeded with an +exception set. Patch by Victor Stinner. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 2c89a68fa57f2e..096aa043514c85 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -2396,21 +2396,26 @@ _posix_free(void *module) _posix_clear((PyObject *)module); } -static void +static int fill_time(PyObject *module, PyObject *v, int s_index, int f_index, int ns_index, time_t sec, unsigned long nsec) { - PyObject *s = _PyLong_FromTime_t(sec); - PyObject *ns_fractional = PyLong_FromUnsignedLong(nsec); + assert(!PyErr_Occurred()); + + int res = -1; PyObject *s_in_ns = NULL; PyObject *ns_total = NULL; PyObject *float_s = NULL; - if (!(s && ns_fractional)) + PyObject *s = _PyLong_FromTime_t(sec); + PyObject *ns_fractional = PyLong_FromUnsignedLong(nsec); + if (!(s && ns_fractional)) { goto exit; + } s_in_ns = PyNumber_Multiply(s, get_posix_state(module)->billion); - if (!s_in_ns) + if (!s_in_ns) { goto exit; + } ns_total = PyNumber_Add(s_in_ns, ns_fractional); if (!ns_total) @@ -2433,12 +2438,17 @@ fill_time(PyObject *module, PyObject *v, int s_index, int f_index, int ns_index, PyStructSequence_SET_ITEM(v, ns_index, ns_total); ns_total = NULL; } + + assert(!PyErr_Occurred()); + res = 0; + exit: Py_XDECREF(s); Py_XDECREF(ns_fractional); Py_XDECREF(s_in_ns); Py_XDECREF(ns_total); Py_XDECREF(float_s); + return res; } #ifdef MS_WINDOWS @@ -2473,34 +2483,47 @@ _pystat_l128_from_l64_l64(uint64_t low, uint64_t high) static PyObject* _pystat_fromstructstat(PyObject *module, STRUCT_STAT *st) { - unsigned long ansec, mnsec, cnsec; + assert(!PyErr_Occurred()); + PyObject *StatResultType = get_posix_state(module)->StatResultType; PyObject *v = PyStructSequence_New((PyTypeObject *)StatResultType); - if (v == NULL) + if (v == NULL) { return NULL; + } + +#define SET_ITEM(pos, expr) \ + do { \ + PyObject *obj = (expr); \ + if (obj == NULL) { \ + goto error; \ + } \ + PyStructSequence_SET_ITEM(v, (pos), obj); \ + } while (0) - PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long)st->st_mode)); + SET_ITEM(0, PyLong_FromLong((long)st->st_mode)); #ifdef MS_WINDOWS - PyStructSequence_SET_ITEM(v, 1, _pystat_l128_from_l64_l64(st->st_ino, st->st_ino_high)); - PyStructSequence_SET_ITEM(v, 2, PyLong_FromUnsignedLongLong(st->st_dev)); + SET_ITEM(1, _pystat_l128_from_l64_l64(st->st_ino, st->st_ino_high)); + SET_ITEM(2, PyLong_FromUnsignedLongLong(st->st_dev)); #else static_assert(sizeof(unsigned long long) >= sizeof(st->st_ino), "stat.st_ino is larger than unsigned long long"); - PyStructSequence_SET_ITEM(v, 1, PyLong_FromUnsignedLongLong(st->st_ino)); - PyStructSequence_SET_ITEM(v, 2, _PyLong_FromDev(st->st_dev)); + SET_ITEM(1, PyLong_FromUnsignedLongLong(st->st_ino)); + SET_ITEM(2, _PyLong_FromDev(st->st_dev)); #endif - PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long)st->st_nlink)); + SET_ITEM(3, PyLong_FromLong((long)st->st_nlink)); #if defined(MS_WINDOWS) - PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong(0)); - PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong(0)); + SET_ITEM(4, PyLong_FromLong(0)); + SET_ITEM(5, PyLong_FromLong(0)); #else - PyStructSequence_SET_ITEM(v, 4, _PyLong_FromUid(st->st_uid)); - PyStructSequence_SET_ITEM(v, 5, _PyLong_FromGid(st->st_gid)); + SET_ITEM(4, _PyLong_FromUid(st->st_uid)); + SET_ITEM(5, _PyLong_FromGid(st->st_gid)); #endif static_assert(sizeof(long long) >= sizeof(st->st_size), "stat.st_size is larger than long long"); - PyStructSequence_SET_ITEM(v, 6, PyLong_FromLongLong(st->st_size)); + SET_ITEM(6, PyLong_FromLongLong(st->st_size)); + // Set st_atime, st_mtime and st_ctime + unsigned long ansec, mnsec, cnsec; #if defined(HAVE_STAT_TV_NSEC) ansec = st->st_atim.tv_nsec; mnsec = st->st_mtim.tv_nsec; @@ -2516,67 +2539,67 @@ _pystat_fromstructstat(PyObject *module, STRUCT_STAT *st) #else ansec = mnsec = cnsec = 0; #endif - fill_time(module, v, 7, 10, 13, st->st_atime, ansec); - fill_time(module, v, 8, 11, 14, st->st_mtime, mnsec); - fill_time(module, v, 9, 12, 15, st->st_ctime, cnsec); + if (fill_time(module, v, 7, 10, 13, st->st_atime, ansec) < 0) { + goto error; + } + if (fill_time(module, v, 8, 11, 14, st->st_mtime, mnsec) < 0) { + goto error; + } + if (fill_time(module, v, 9, 12, 15, st->st_ctime, cnsec) < 0) { + goto error; + } #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE - PyStructSequence_SET_ITEM(v, ST_BLKSIZE_IDX, - PyLong_FromLong((long)st->st_blksize)); + SET_ITEM(ST_BLKSIZE_IDX, PyLong_FromLong((long)st->st_blksize)); #endif #ifdef HAVE_STRUCT_STAT_ST_BLOCKS - PyStructSequence_SET_ITEM(v, ST_BLOCKS_IDX, - PyLong_FromLong((long)st->st_blocks)); + SET_ITEM(ST_BLOCKS_IDX, PyLong_FromLong((long)st->st_blocks)); #endif #ifdef HAVE_STRUCT_STAT_ST_RDEV - PyStructSequence_SET_ITEM(v, ST_RDEV_IDX, - PyLong_FromLong((long)st->st_rdev)); + SET_ITEM(ST_RDEV_IDX, PyLong_FromLong((long)st->st_rdev)); #endif #ifdef HAVE_STRUCT_STAT_ST_GEN - PyStructSequence_SET_ITEM(v, ST_GEN_IDX, - PyLong_FromLong((long)st->st_gen)); + SET_ITEM(ST_GEN_IDX, PyLong_FromLong((long)st->st_gen)); #endif #if defined(HAVE_STRUCT_STAT_ST_BIRTHTIME) { - PyObject *val; - unsigned long bsec,bnsec; + unsigned long bsec, bnsec; bsec = (long)st->st_birthtime; #ifdef HAVE_STAT_TV_NSEC2 bnsec = st->st_birthtimespec.tv_nsec; #else bnsec = 0; #endif - val = PyFloat_FromDouble(bsec + 1e-9*bnsec); - PyStructSequence_SET_ITEM(v, ST_BIRTHTIME_IDX, - val); + SET_ITEM(ST_BIRTHTIME_IDX, PyFloat_FromDouble(bsec + bnsec * 1e-9)); } #elif defined(MS_WINDOWS) - fill_time(module, v, -1, ST_BIRTHTIME_IDX, ST_BIRTHTIME_NS_IDX, - st->st_birthtime, st->st_birthtime_nsec); + if (fill_time(module, v, -1, ST_BIRTHTIME_IDX, ST_BIRTHTIME_NS_IDX, + st->st_birthtime, st->st_birthtime_nsec) < 0) { + goto error; + } #endif #ifdef HAVE_STRUCT_STAT_ST_FLAGS - PyStructSequence_SET_ITEM(v, ST_FLAGS_IDX, - PyLong_FromLong((long)st->st_flags)); + SET_ITEM(ST_FLAGS_IDX, PyLong_FromLong((long)st->st_flags)); #endif #ifdef HAVE_STRUCT_STAT_ST_FILE_ATTRIBUTES - PyStructSequence_SET_ITEM(v, ST_FILE_ATTRIBUTES_IDX, - PyLong_FromUnsignedLong(st->st_file_attributes)); + SET_ITEM(ST_FILE_ATTRIBUTES_IDX, + PyLong_FromUnsignedLong(st->st_file_attributes)); #endif #ifdef HAVE_STRUCT_STAT_ST_FSTYPE - PyStructSequence_SET_ITEM(v, ST_FSTYPE_IDX, - PyUnicode_FromString(st->st_fstype)); + SET_ITEM(ST_FSTYPE_IDX, PyUnicode_FromString(st->st_fstype)); #endif #ifdef HAVE_STRUCT_STAT_ST_REPARSE_TAG - PyStructSequence_SET_ITEM(v, ST_REPARSE_TAG_IDX, - PyLong_FromUnsignedLong(st->st_reparse_tag)); + SET_ITEM(ST_REPARSE_TAG_IDX, PyLong_FromUnsignedLong(st->st_reparse_tag)); #endif - if (PyErr_Occurred()) { - Py_DECREF(v); - return NULL; - } - + assert(!PyErr_Occurred()); return v; + +error: + Py_DECREF(v); + return NULL; + +#undef SET_ITEM } /* POSIX methods */ From 869f177b5cd5c2a2a015e4658cbbb0e9566210f7 Mon Sep 17 00:00:00 2001 From: AN Long Date: Thu, 21 Sep 2023 23:44:24 +0800 Subject: [PATCH 275/357] gh-74481: Add missing debug function docs and constants to msvcrt (GH-109650) --- Doc/library/msvcrt.rst | 115 ++++++++++++++++-- ...3-09-21-14-26-44.gh-issue-74481.KAUDcD.rst | 1 + PC/msvcrtmodule.c | 4 + 3 files changed, 107 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-21-14-26-44.gh-issue-74481.KAUDcD.rst diff --git a/Doc/library/msvcrt.rst b/Doc/library/msvcrt.rst index a24c037678de0c..0b059e746c61af 100644 --- a/Doc/library/msvcrt.rst +++ b/Doc/library/msvcrt.rst @@ -10,8 +10,8 @@ -------------- These functions provide access to some useful capabilities on Windows platforms. -Some higher-level modules use these functions to build the Windows -implementations of their services. For example, the :mod:`getpass` module uses +Some higher-level modules use these functions to build the Windows +implementations of their services. For example, the :mod:`getpass` module uses this in the implementation of the :func:`getpass` function. Further documentation on these functions can be found in the Platform API @@ -35,11 +35,11 @@ File Operations .. function:: locking(fd, mode, nbytes) - Lock part of a file based on file descriptor *fd* from the C runtime. Raises - :exc:`OSError` on failure. The locked region of the file extends from the + Lock part of a file based on file descriptor *fd* from the C runtime. Raises + :exc:`OSError` on failure. The locked region of the file extends from the current file position for *nbytes* bytes, and may continue beyond the end of the - file. *mode* must be one of the :const:`!LK_\*` constants listed below. Multiple - regions in a file may be locked at the same time, but may not overlap. Adjacent + file. *mode* must be one of the :const:`!LK_\*` constants listed below. Multiple + regions in a file may be locked at the same time, but may not overlap. Adjacent regions are not merged; they must be unlocked individually. .. audit-event:: msvcrt.locking fd,mode,nbytes msvcrt.locking @@ -49,7 +49,7 @@ File Operations LK_RLCK Locks the specified bytes. If the bytes cannot be locked, the program - immediately tries again after 1 second. If, after 10 attempts, the bytes cannot + immediately tries again after 1 second. If, after 10 attempts, the bytes cannot be locked, :exc:`OSError` is raised. @@ -74,9 +74,9 @@ File Operations .. function:: open_osfhandle(handle, flags) - Create a C runtime file descriptor from the file handle *handle*. The *flags* + Create a C runtime file descriptor from the file handle *handle*. The *flags* parameter should be a bitwise OR of :const:`os.O_APPEND`, :const:`os.O_RDONLY`, - and :const:`os.O_TEXT`. The returned file descriptor may be used as a parameter + and :const:`os.O_TEXT`. The returned file descriptor may be used as a parameter to :func:`os.fdopen` to create a file object. .. audit-event:: msvcrt.open_osfhandle handle,flags msvcrt.open_osfhandle @@ -84,7 +84,7 @@ File Operations .. function:: get_osfhandle(fd) - Return the file handle for the file descriptor *fd*. Raises :exc:`OSError` if + Return the file handle for the file descriptor *fd*. Raises :exc:`OSError` if *fd* is not recognized. .. audit-event:: msvcrt.get_osfhandle fd msvcrt.get_osfhandle @@ -105,7 +105,7 @@ Console I/O .. function:: getch() Read a keypress and return the resulting character as a byte string. - Nothing is echoed to the console. This call will block if a keypress + Nothing is echoed to the console. This call will block if a keypress is not already available, but will not wait for :kbd:`Enter` to be pressed. If the pressed key was a special function key, this will return ``'\000'`` or ``'\xe0'``; the next call will return the keycode. @@ -119,7 +119,7 @@ Console I/O .. function:: getche() - Similar to :func:`getch`, but the keypress will be echoed if it represents a + Similar to :func:`getch`, but the keypress will be echoed if it represents a printable character. @@ -158,4 +158,93 @@ Other Functions .. function:: heapmin() Force the :c:func:`malloc` heap to clean itself up and return unused blocks to - the operating system. On failure, this raises :exc:`OSError`. + the operating system. On failure, this raises :exc:`OSError`. + + +.. function:: set_error_mode(mode) + + Changes the location where the C runtime writes an error message for an error + that might end the program. *mode* must be one of the :const:`!OUT_\*` + constants listed below or :const:`REPORT_ERRMODE`. Returns the old setting + or -1 if an error occurs. Only available in + :ref:`debug build of Python `. + + +.. data:: OUT_TO_DEFAULT + + Error sink is determined by the app's type. Only available in + :ref:`debug build of Python `. + + +.. data:: OUT_TO_STDERR + + Error sink is a standard error. Only available in + :ref:`debug build of Python `. + + +.. data:: OUT_TO_MSGBOX + + Error sink is a message box. Only available in + :ref:`debug build of Python `. + + +.. data:: REPORT_ERRMODE + + Report the current error mode value. Only available in + :ref:`debug build of Python `. + + +.. function:: CrtSetReportMode(type, mode) + + Specifies the destination or destinations for a specific report type + generated by :c:func:`!_CrtDbgReport` in the MS VC++ runtime. *type* must be + one of the :const:`!CRT_\*` constants listed below. *mode* must be one of the + :const:`!CRTDBG_\*` constants listed below. Only available in + :ref:`debug build of Python `. + + +.. function:: CrtSetReportFile(type, file) + + After you use :func:`CrtSetReportMode` to specify :const:`CRTDBG_MODE_FILE`, + you can specify the file handle to receive the message text. *type* must be + one of the :const:`!CRT_\*` constants listed below. *file* shuld be the file + handle your want specified. Only available in + :ref:`debug build of Python `. + + +.. data:: CRT_WARN + + Warnings, messages, and information that doesn't need immediate attention. + + +.. data:: CRT_ERROR + + Errors, unrecoverable problems, and issues that require immediate attention. + + +.. data:: CRT_ASSERT + + Assertion failures. + + +.. data:: CRTDBG_MODE_DEBUG + + Writes the message to the debugger's output window. + + +.. data:: CRTDBG_MODE_FILE + + Writes the message to a user-supplied file handle. :func:`CrtSetReportFile` + should be called to define the specific file or stream to use as + the destination. + + +.. data:: CRTDBG_MODE_WNDW + + Creates a message box to display the message along with the ``Abort``, + ``Retry``, and ``Ignore`` buttons. + + +.. data:: CRTDBG_REPORT_MODE + + Returns current *mode* for the specified *type*. diff --git a/Misc/NEWS.d/next/Library/2023-09-21-14-26-44.gh-issue-74481.KAUDcD.rst b/Misc/NEWS.d/next/Library/2023-09-21-14-26-44.gh-issue-74481.KAUDcD.rst new file mode 100644 index 00000000000000..c2aca4eae64eda --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-21-14-26-44.gh-issue-74481.KAUDcD.rst @@ -0,0 +1 @@ +Add ``set_error_mode`` related constants in ``msvcrt`` module in Python debug build. diff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c index 9a3462141bffbf..5ff703217b421f 100644 --- a/PC/msvcrtmodule.c +++ b/PC/msvcrtmodule.c @@ -615,6 +615,10 @@ exec_module(PyObject* m) INSERTPTR(m, "CRTDBG_FILE_STDERR", _CRTDBG_FILE_STDERR); INSERTPTR(m, "CRTDBG_FILE_STDOUT", _CRTDBG_FILE_STDOUT); INSERTPTR(m, "CRTDBG_REPORT_FILE", _CRTDBG_REPORT_FILE); + INSERTINT(m, "OUT_TO_DEFAULT", _OUT_TO_DEFAULT); + INSERTINT(m, "OUT_TO_STDERR", _OUT_TO_STDERR); + INSERTINT(m, "OUT_TO_MSGBOX", _OUT_TO_MSGBOX); + INSERTINT(m, "REPORT_ERRMODE", _REPORT_ERRMODE); #endif #undef INSERTINT From 22b70ca480f5a2d19d3123cd35ab968fa65f224d Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Thu, 21 Sep 2023 19:50:33 +0100 Subject: [PATCH 276/357] GH-109190: Copyedit 3.12 What's New: PEP 709 (#109656) --- Doc/whatsnew/3.12.rst | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 6b4ec99b43dea6..9caf9c18856503 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -246,14 +246,12 @@ PEP 709: Comprehension inlining Dictionary, list, and set comprehensions are now inlined, rather than creating a new single-use function object for each execution of the comprehension. This -speeds up execution of a comprehension by up to 2x. +speeds up execution of a comprehension by up to two times. +See :pep:`709` for further details. -Comprehension iteration variables remain isolated; they don't overwrite a +Comprehension iteration variables remain isolated and don't overwrite a variable of the same name in the outer scope, nor are they visible after the -comprehension. This isolation is now maintained via stack/locals manipulation, -not via separate function scope. - -Inlining does result in a few visible behavior changes: +comprehension. Inlining does result in a few visible behavior changes: * There is no longer a separate frame for the comprehension in tracebacks, and tracing/profiling no longer shows the comprehension as a function call. @@ -270,7 +268,7 @@ Inlining does result in a few visible behavior changes: create a list of keys to iterate over: ``keys = list(locals()); [k for k in keys]``. -Contributed by Carl Meyer and Vladimir Matveev in :pep:`709`. +(Contributed by Carl Meyer and Vladimir Matveev in :pep:`709`.) .. _whatsnew312-pep688: From 11636788da9e5e64ceef2ac80df330e8170a8d08 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Thu, 21 Sep 2023 20:05:54 +0100 Subject: [PATCH 277/357] GH-109190: Copyedit 3.12 What's New: Typing PEPs (#109659) --- Doc/whatsnew/3.12.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 9caf9c18856503..ce668687c7d51e 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -331,7 +331,7 @@ See :mod:`sys.monitoring` for details. New Features Related to Type Hints ================================== -This section covers major changes affecting :pep:`484` type hints and +This section covers major changes affecting :pep:`type hints <484>` and the :mod:`typing` module. .. _whatsnew312-pep692: @@ -343,7 +343,7 @@ Typing ``**kwargs`` in a function signature as introduced by :pep:`484` allowed for valid annotations only in cases where all of the ``**kwargs`` were of the same type. -This PEP specifies a more precise way of typing ``**kwargs`` by relying on +:pep:`692` specifies a more precise way of typing ``**kwargs`` by relying on typed dictionaries:: from typing import TypedDict, Unpack @@ -387,6 +387,8 @@ Example:: def get_colour(self) -> str: return "red" +See :pep:`698` for more details. + (Contributed by Steven Troxler in :gh:`101561`.) .. _whatsnew312-pep695: @@ -432,8 +434,8 @@ parameters with bounds or constraints:: The value of type aliases and the bound and constraints of type variables created through this syntax are evaluated only on demand (see -:ref:`lazy-evaluation`). This means type aliases are able to refer to other -types defined later in the file. +:ref:`lazy evaluation `). This means type aliases are able to +refer to other types defined later in the file. Type parameters declared through a type parameter list are visible within the scope of the declaration and any nested scopes, but not in the outer scope. For From ed587be0d0383f2925bf7650e8ccf1bf3adc44f9 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Thu, 21 Sep 2023 22:14:41 +0300 Subject: [PATCH 278/357] gh-108303: Move all math files to `Lib/test/mathdata/` (#109512) --- Lib/test/{ => mathdata}/cmath_testcases.txt | 0 Lib/test/{ => mathdata}/floating_points.txt | 0 Lib/test/{ => mathdata}/formatfloat_testcases.txt | 0 Lib/test/{ => mathdata}/ieee754.txt | 0 Lib/test/{ => mathdata}/math_testcases.txt | 0 Lib/test/test_float.py | 3 ++- Lib/test/test_math.py | 6 +++--- Makefile.pre.in | 1 + 8 files changed, 6 insertions(+), 4 deletions(-) rename Lib/test/{ => mathdata}/cmath_testcases.txt (100%) rename Lib/test/{ => mathdata}/floating_points.txt (100%) rename Lib/test/{ => mathdata}/formatfloat_testcases.txt (100%) rename Lib/test/{ => mathdata}/ieee754.txt (100%) rename Lib/test/{ => mathdata}/math_testcases.txt (100%) diff --git a/Lib/test/cmath_testcases.txt b/Lib/test/mathdata/cmath_testcases.txt similarity index 100% rename from Lib/test/cmath_testcases.txt rename to Lib/test/mathdata/cmath_testcases.txt diff --git a/Lib/test/floating_points.txt b/Lib/test/mathdata/floating_points.txt similarity index 100% rename from Lib/test/floating_points.txt rename to Lib/test/mathdata/floating_points.txt diff --git a/Lib/test/formatfloat_testcases.txt b/Lib/test/mathdata/formatfloat_testcases.txt similarity index 100% rename from Lib/test/formatfloat_testcases.txt rename to Lib/test/mathdata/formatfloat_testcases.txt diff --git a/Lib/test/ieee754.txt b/Lib/test/mathdata/ieee754.txt similarity index 100% rename from Lib/test/ieee754.txt rename to Lib/test/mathdata/ieee754.txt diff --git a/Lib/test/math_testcases.txt b/Lib/test/mathdata/math_testcases.txt similarity index 100% rename from Lib/test/math_testcases.txt rename to Lib/test/mathdata/math_testcases.txt diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index 84270ce7dd4780..b6daae7e9280ff 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -25,7 +25,7 @@ #locate file with float format test values test_dir = os.path.dirname(__file__) or os.curdir -format_testfile = os.path.join(test_dir, 'formatfloat_testcases.txt') +format_testfile = os.path.join(test_dir, 'mathdata', 'formatfloat_testcases.txt') class FloatSubclass(float): pass @@ -768,6 +768,7 @@ def test_issue35560(self): class ReprTestCase(unittest.TestCase): def test_repr(self): with open(os.path.join(os.path.split(__file__)[0], + 'mathdata', 'floating_points.txt'), encoding="utf-8") as floats_file: for line in floats_file: line = line.strip() diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index b71d08b1124497..d5d2197c36b254 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -33,8 +33,8 @@ else: file = __file__ test_dir = os.path.dirname(file) or os.curdir -math_testcases = os.path.join(test_dir, 'math_testcases.txt') -test_file = os.path.join(test_dir, 'cmath_testcases.txt') +math_testcases = os.path.join(test_dir, 'mathdata', 'math_testcases.txt') +test_file = os.path.join(test_dir, 'mathdata', 'cmath_testcases.txt') def to_ulps(x): @@ -2559,7 +2559,7 @@ def test_fractions(self): def load_tests(loader, tests, pattern): from doctest import DocFileSuite - tests.addTest(DocFileSuite("ieee754.txt")) + tests.addTest(DocFileSuite(os.path.join("mathdata", "ieee754.txt"))) return tests if __name__ == '__main__': diff --git a/Makefile.pre.in b/Makefile.pre.in index 363be687d5a432..b6d00d5dc45007 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -2157,6 +2157,7 @@ TESTSUBDIRS= idlelib/idle_test \ test/encoded_modules \ test/leakers \ test/libregrtest \ + test/mathdata \ test/subprocessdata \ test/support \ test/support/_hypothesis_stubs \ From 16c24023c1f69f66d1e3313033be275a43329030 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Thu, 21 Sep 2023 20:24:44 +0100 Subject: [PATCH 279/357] GH-109190: Copyedit 3.12 What's New: Improved Error Messages (#109654) --- Doc/whatsnew/3.12.rst | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index ce668687c7d51e..751c5121cdafb1 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -98,7 +98,7 @@ Improved Error Messages * Modules from the standard library are now potentially suggested as part of the error messages displayed by the interpreter when a :exc:`NameError` is - raised to the top level. Contributed by Pablo Galindo in :gh:`98254`. + raised to the top level. (Contributed by Pablo Galindo in :gh:`98254`.) >>> sys.version_info Traceback (most recent call last): @@ -109,7 +109,7 @@ Improved Error Messages Now if a :exc:`NameError` is raised in a method and the instance has an attribute that's exactly equal to the name in the exception, the suggestion will include ``self.`` instead of the closest match in the method - scope. Contributed by Pablo Galindo in :gh:`99139`. + scope. (Contributed by Pablo Galindo in :gh:`99139`.) >>> class A: ... def __init__(self): @@ -117,7 +117,7 @@ Improved Error Messages ... ... def foo(self): ... somethin = blech - + ... >>> A().foo() Traceback (most recent call last): File "", line 1 @@ -125,9 +125,8 @@ Improved Error Messages ^^^^^ NameError: name 'blech' is not defined. Did you mean: 'self.blech'? - * Improve the :exc:`SyntaxError` error message when the user types ``import x - from y`` instead of ``from y import x``. Contributed by Pablo Galindo in :gh:`98931`. + from y`` instead of ``from y import x``. (Contributed by Pablo Galindo in :gh:`98931`.) >>> import a.y.z from b.y.z Traceback (most recent call last): @@ -138,7 +137,7 @@ Improved Error Messages * :exc:`ImportError` exceptions raised from failed ``from import `` statements now include suggestions for the value of ```` based on the - available names in ````. Contributed by Pablo Galindo in :gh:`91058`. + available names in ````. (Contributed by Pablo Galindo in :gh:`91058`.) >>> from collections import chainmap Traceback (most recent call last): From e47d12e222507b1873a81f6955fdd3cfb8293b65 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Thu, 21 Sep 2023 20:37:28 +0100 Subject: [PATCH 280/357] GH-109190: Copyedit 3.12 What's New: PEP 701 (#109655) --- Doc/whatsnew/3.12.rst | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 751c5121cdafb1..5d9e9e92bee10f 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -153,12 +153,13 @@ New Features PEP 701: Syntactic formalization of f-strings --------------------------------------------- -:pep:`701` lifts some restrictions on the usage of f-strings. Expression components -inside f-strings can now be any valid Python expression including backslashes, -unicode escaped sequences, multi-line expressions, comments and strings reusing the -same quote as the containing f-string. Let's cover these in detail: +:pep:`701` lifts some restrictions on the usage of :term:`f-strings `. +Expression components inside f-strings can now be any valid Python expression, +including strings reusing the same quote as the containing f-string, +multi-line expressions, comments, backslashes, and unicode escape sequences. +Let's cover these in detail: -* Quote reuse: in Python 3.11, reusing the same quotes as the containing f-string +* Quote reuse: in Python 3.11, reusing the same quotes as the enclosing f-string raises a :exc:`SyntaxError`, forcing the user to either use other available quotes (like using double quotes or triple quotes if the f-string uses single quotes). In Python 3.12, you can now do things like this: @@ -181,11 +182,12 @@ same quote as the containing f-string. Let's cover these in detail: >>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}" '2' -* Multi-line expressions and comments: In Python 3.11, f-strings expressions - must be defined in a single line even if outside f-strings expressions could - span multiple lines (like literal lists being defined over multiple lines), - making them harder to read. In Python 3.12 you can now define expressions - spanning multiple lines and include comments on them: +* Multi-line expressions and comments: In Python 3.11, f-string expressions + must be defined in a single line, even if the expression within the f-string + could normally span multiple lines + (like literal lists being defined over multiple lines), + making them harder to read. In Python 3.12 you can now define f-strings + spanning multiple lines, and add inline comments: >>> f"This is the playlist: {", ".join([ ... 'Take me back to Eden', # My, my, those eyes like fire @@ -195,10 +197,10 @@ same quote as the containing f-string. Let's cover these in detail: 'This is the playlist: Take me back to Eden, Alkaline, Ascensionism' * Backslashes and unicode characters: before Python 3.12 f-string expressions - couldn't contain any ``\`` character. This also affected unicode escaped - sequences (such as ``\N{snowman}``) as these contain the ``\N`` part that - previously could not be part of expression components of f-strings. Now, you - can define expressions like this: + couldn't contain any ``\`` character. This also affected unicode :ref:`escape + sequences ` (such as ``\N{snowman}``) as these contain + the ``\N`` part that previously could not be part of expression components of + f-strings. Now, you can define expressions like this: >>> print(f"This is the playlist: {"\n".join(songs)}") This is the playlist: Take me back to Eden @@ -210,7 +212,7 @@ same quote as the containing f-string. Let's cover these in detail: See :pep:`701` for more details. As a positive side-effect of how this feature has been implemented (by parsing f-strings -with the PEG parser (see :pep:`617`), now error messages for f-strings are more precise +with :pep:`the PEG parser <617>`, now error messages for f-strings are more precise and include the exact location of the error. For example, in Python 3.11, the following f-string raises a :exc:`SyntaxError`: From 5b8f0246834f211db0ea83b89277489abc2521ed Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 21 Sep 2023 21:48:20 +0200 Subject: [PATCH 281/357] gh-108303: Update test_fractions for new Lib/test/mathdata/ (#109686) --- Lib/test/test_fractions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index 4f4ea7c03f9a4c..499e3b6e656faa 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -18,7 +18,7 @@ #locate file with float format test values test_dir = os.path.dirname(__file__) or os.curdir -format_testfile = os.path.join(test_dir, 'formatfloat_testcases.txt') +format_testfile = os.path.join(test_dir, 'mathdata', 'formatfloat_testcases.txt') class DummyFloat(object): """Dummy float class for testing comparisons with Fractions""" From 2aceb21ae61b4648b47afd9f8fdba8c106a745d0 Mon Sep 17 00:00:00 2001 From: Sam Gross Date: Thu, 21 Sep 2023 16:57:20 -0400 Subject: [PATCH 282/357] gh-109693: Remove pycore_atomic_funcs.h (#109694) _PyUnicode_FromId() now uses pyatomic.h functions instead. --- Include/internal/pycore_atomic_funcs.h | 94 -------------------------- Makefile.pre.in | 1 - Modules/_testinternalcapi.c | 13 ---- Objects/unicodeobject.c | 7 +- PCbuild/pythoncore.vcxproj | 1 - PCbuild/pythoncore.vcxproj.filters | 3 - 6 files changed, 3 insertions(+), 116 deletions(-) delete mode 100644 Include/internal/pycore_atomic_funcs.h diff --git a/Include/internal/pycore_atomic_funcs.h b/Include/internal/pycore_atomic_funcs.h deleted file mode 100644 index a708789cea733b..00000000000000 --- a/Include/internal/pycore_atomic_funcs.h +++ /dev/null @@ -1,94 +0,0 @@ -/* Atomic functions: similar to pycore_atomic.h, but don't need - to declare variables as atomic. - - Py_ssize_t type: - - * value = _Py_atomic_size_get(&var) - * _Py_atomic_size_set(&var, value) - - Use sequentially-consistent ordering (__ATOMIC_SEQ_CST memory order): - enforce total ordering with all other atomic functions. -*/ -#ifndef Py_ATOMIC_FUNC_H -#define Py_ATOMIC_FUNC_H -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef Py_BUILD_CORE -# error "this header requires Py_BUILD_CORE define" -#endif - -#if defined(_MSC_VER) -# include // _InterlockedExchange() -#endif - - -// Use builtin atomic operations in GCC >= 4.7 and clang -#ifdef HAVE_BUILTIN_ATOMIC - -static inline Py_ssize_t _Py_atomic_size_get(Py_ssize_t *var) -{ - return __atomic_load_n(var, __ATOMIC_SEQ_CST); -} - -static inline void _Py_atomic_size_set(Py_ssize_t *var, Py_ssize_t value) -{ - __atomic_store_n(var, value, __ATOMIC_SEQ_CST); -} - -#elif defined(_MSC_VER) - -static inline Py_ssize_t _Py_atomic_size_get(Py_ssize_t *var) -{ -#if SIZEOF_VOID_P == 8 - Py_BUILD_ASSERT(sizeof(__int64) == sizeof(*var)); - volatile __int64 *volatile_var = (volatile __int64 *)var; - __int64 old; - do { - old = *volatile_var; - } while(_InterlockedCompareExchange64(volatile_var, old, old) != old); -#else - Py_BUILD_ASSERT(sizeof(long) == sizeof(*var)); - volatile long *volatile_var = (volatile long *)var; - long old; - do { - old = *volatile_var; - } while(_InterlockedCompareExchange(volatile_var, old, old) != old); -#endif - return old; -} - -static inline void _Py_atomic_size_set(Py_ssize_t *var, Py_ssize_t value) -{ -#if SIZEOF_VOID_P == 8 - Py_BUILD_ASSERT(sizeof(__int64) == sizeof(*var)); - volatile __int64 *volatile_var = (volatile __int64 *)var; - _InterlockedExchange64(volatile_var, value); -#else - Py_BUILD_ASSERT(sizeof(long) == sizeof(*var)); - volatile long *volatile_var = (volatile long *)var; - _InterlockedExchange(volatile_var, value); -#endif -} - -#else -// Fallback implementation using volatile - -static inline Py_ssize_t _Py_atomic_size_get(Py_ssize_t *var) -{ - volatile Py_ssize_t *volatile_var = (volatile Py_ssize_t *)var; - return *volatile_var; -} - -static inline void _Py_atomic_size_set(Py_ssize_t *var, Py_ssize_t value) -{ - volatile Py_ssize_t *volatile_var = (volatile Py_ssize_t *)var; - *volatile_var = value; -} -#endif - -#ifdef __cplusplus -} -#endif -#endif /* Py_ATOMIC_FUNC_H */ diff --git a/Makefile.pre.in b/Makefile.pre.in index b6d00d5dc45007..d123fa3e6f4a47 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1743,7 +1743,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_ast_state.h \ $(srcdir)/Include/internal/pycore_atexit.h \ $(srcdir)/Include/internal/pycore_atomic.h \ - $(srcdir)/Include/internal/pycore_atomic_funcs.h \ $(srcdir)/Include/internal/pycore_bitutils.h \ $(srcdir)/Include/internal/pycore_bytes_methods.h \ $(srcdir)/Include/internal/pycore_bytesobject.h \ diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 934e3637a9164d..f97b609f7ad2ef 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -10,7 +10,6 @@ #undef NDEBUG #include "Python.h" -#include "pycore_atomic_funcs.h" // _Py_atomic_int_get() #include "pycore_bitutils.h" // _Py_bswap32() #include "pycore_bytesobject.h" // _PyBytes_Find() #include "pycore_ceval.h" // _PyEval_AddPendingCall() @@ -349,17 +348,6 @@ test_reset_path_config(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(arg)) } -static PyObject* -test_atomic_funcs(PyObject *self, PyObject *Py_UNUSED(args)) -{ - // Test _Py_atomic_size_get() and _Py_atomic_size_set() - Py_ssize_t var = 1; - _Py_atomic_size_set(&var, 2); - assert(_Py_atomic_size_get(&var) == 2); - Py_RETURN_NONE; -} - - static int check_edit_cost(const char *a, const char *b, Py_ssize_t expected) { @@ -1488,7 +1476,6 @@ static PyMethodDef module_functions[] = { {"get_config", test_get_config, METH_NOARGS}, {"set_config", test_set_config, METH_O}, {"reset_path_config", test_reset_path_config, METH_NOARGS}, - {"test_atomic_funcs", test_atomic_funcs, METH_NOARGS}, {"test_edit_cost", test_edit_cost, METH_NOARGS}, {"test_bytes_find", test_bytes_find, METH_NOARGS}, {"normalize_path", normalize_path, METH_O, NULL}, diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 4b87bf8e37aa94..aca28e4842d645 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -40,7 +40,6 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "Python.h" #include "pycore_abstract.h" // _PyIndex_Check() -#include "pycore_atomic_funcs.h" // _Py_atomic_size_get() #include "pycore_bytes_methods.h" // _Py_bytes_lower() #include "pycore_bytesobject.h" // _PyBytes_Repeat() #include "pycore_ceval.h" // _PyEval_GetBuiltin() @@ -1906,19 +1905,19 @@ _PyUnicode_FromId(_Py_Identifier *id) PyInterpreterState *interp = _PyInterpreterState_GET(); struct _Py_unicode_ids *ids = &interp->unicode.ids; - Py_ssize_t index = _Py_atomic_size_get(&id->index); + Py_ssize_t index = _Py_atomic_load_ssize(&id->index); if (index < 0) { struct _Py_unicode_runtime_ids *rt_ids = &interp->runtime->unicode_state.ids; PyThread_acquire_lock(rt_ids->lock, WAIT_LOCK); // Check again to detect concurrent access. Another thread can have // initialized the index while this thread waited for the lock. - index = _Py_atomic_size_get(&id->index); + index = _Py_atomic_load_ssize(&id->index); if (index < 0) { assert(rt_ids->next_index < PY_SSIZE_T_MAX); index = rt_ids->next_index; rt_ids->next_index++; - _Py_atomic_size_set(&id->index, index); + _Py_atomic_store_ssize(&id->index, index); } PyThread_release_lock(rt_ids->lock); } diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 190eaa16daa8af..1ec106777db56d 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -204,7 +204,6 @@ - diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index f4fddfdd11f4c1..f381120c9b035a 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -531,9 +531,6 @@ Include\internal - - Include - Include\internal From 608c1f3083ea1e06d383ef1a9878a9758903de4b Mon Sep 17 00:00:00 2001 From: Davide Rizzo Date: Thu, 21 Sep 2023 23:20:29 +0200 Subject: [PATCH 283/357] gh-109582: test_fork_signal_handling should wait for event (#109605) Sometimes the child_handled event was missing because either the child quits before it gets a chance to handle the signal, or the parent asserts before the event notification is delivered via IPC. Synchronize explicitly to avoid this. --- Lib/test/test_asyncio/test_unix_events.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py index cdf3eaac68af15..7322be597ae2d2 100644 --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -11,9 +11,11 @@ import stat import sys import threading +import time import unittest from unittest import mock import warnings +from test import support from test.support import os_helper from test.support import socket_helper from test.support import wait_process @@ -1911,8 +1913,14 @@ def test_fork_signal_handling(self): parent_handled = manager.Event() def child_main(): - signal.signal(signal.SIGTERM, lambda *args: child_handled.set()) + def on_sigterm(*args): + child_handled.set() + sys.exit() + + signal.signal(signal.SIGTERM, on_sigterm) child_started.set() + while True: + time.sleep(1) async def main(): loop = asyncio.get_running_loop() @@ -1922,7 +1930,7 @@ async def main(): process.start() child_started.wait() os.kill(process.pid, signal.SIGTERM) - process.join() + process.join(timeout=support.SHORT_TIMEOUT) async def func(): await asyncio.sleep(0.1) @@ -1933,6 +1941,7 @@ async def func(): asyncio.run(main()) + child_handled.wait(timeout=support.SHORT_TIMEOUT) self.assertFalse(parent_handled.is_set()) self.assertTrue(child_handled.is_set()) From 26e06ad617bb416201c769fea91cd33d544c6a1c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Sep 2023 00:59:08 +0200 Subject: [PATCH 284/357] gh-108948: Skip test_tarfile.test_modes() on EFTYPE error (#109697) On FreeBSD, regular users cannot set the sticky bit. Skip the test if chmod() fails with EFTYPE error. --- Lib/test/test_tarfile.py | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 9a39dd4a4e5f03..cc26da05daeafc 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -1,3 +1,4 @@ +import errno import sys import os import io @@ -3823,14 +3824,26 @@ def test_modes(self): tmp_filename = os.path.join(TEMPDIR, "tmp.file") with open(tmp_filename, 'w'): pass - new_mode = (os.stat(tmp_filename).st_mode - | stat.S_ISVTX | stat.S_ISGID | stat.S_ISUID) - os.chmod(tmp_filename, new_mode) - got_mode = os.stat(tmp_filename).st_mode - _t_file = 't' if (got_mode & stat.S_ISVTX) else 'x' - _suid_file = 's' if (got_mode & stat.S_ISUID) else 'x' - _sgid_file = 's' if (got_mode & stat.S_ISGID) else 'x' - os.unlink(tmp_filename) + try: + new_mode = (os.stat(tmp_filename).st_mode + | stat.S_ISVTX | stat.S_ISGID | stat.S_ISUID) + try: + os.chmod(tmp_filename, new_mode) + except OSError as exc: + if exc.errno == getattr(errno, "EFTYPE", 0): + # gh-108948: On FreeBSD, regular users cannot set + # the sticky bit. + self.skipTest("chmod() failed with EFTYPE: " + "regular users cannot set sticky bit") + else: + raise + + got_mode = os.stat(tmp_filename).st_mode + _t_file = 't' if (got_mode & stat.S_ISVTX) else 'x' + _suid_file = 's' if (got_mode & stat.S_ISUID) else 'x' + _sgid_file = 's' if (got_mode & stat.S_ISGID) else 'x' + finally: + os.unlink(tmp_filename) os.mkdir(tmp_filename) new_mode = (os.stat(tmp_filename).st_mode From 3f5c5649cfefe5b03cebe53b3ae766e2739eee23 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Sep 2023 01:21:07 +0200 Subject: [PATCH 285/357] gh-104469: Disallow using Py_LIMITED_API with Py_BUILD_CORE (#109690) Fix make check-c-globals: complete USE_LIMITED_C_API list of the c-analyzer. --- Include/pyport.h | 4 ++++ Tools/c-analyzer/c_parser/preprocessor/gcc.py | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Include/pyport.h b/Include/pyport.h index 4b6858bf527df1..40d580a870fc75 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -48,6 +48,10 @@ # define Py_BUILD_CORE #endif +#if defined(Py_LIMITED_API) && defined(Py_BUILD_CORE) +# error "Py_LIMITED_API is not compatible with Py_BUILD_CORE" +#endif + /************************************************************************** Symbols and macros to supply platform-independent interfaces to basic diff --git a/Tools/c-analyzer/c_parser/preprocessor/gcc.py b/Tools/c-analyzer/c_parser/preprocessor/gcc.py index 18d1b1a5d0a37f..d206ceb43a268e 100644 --- a/Tools/c-analyzer/c_parser/preprocessor/gcc.py +++ b/Tools/c-analyzer/c_parser/preprocessor/gcc.py @@ -3,13 +3,18 @@ from . import common as _common -# The following C files must not be built with Py_BUILD_CORE, -# because they use the limited C API. +# The following C files define the Py_LIMITED_API macro, and so must not be +# built with the Py_BUILD_CORE macro defined. USE_LIMITED_C_API = frozenset(( + # Modules/ '_testcapimodule.c', '_testclinic_limited.c', 'xxlimited.c', 'xxlimited_35.c', + + # Modules/_testcapi/ + 'heaptype_relative.c', + 'vectorcall_limited.c', )) TOOL = 'gcc' From 4230d7ce93cc25e9c5fb564a0b37e93f19ca0e4e Mon Sep 17 00:00:00 2001 From: AN Long Date: Fri, 22 Sep 2023 08:19:48 +0800 Subject: [PATCH 286/357] gh-108996: fix and enable test_msvcrt (#109226) * Add _testconsole.flush_console_input_buffer() function. * test_kbhit(), test_getwch() and test_getwche() now call flush_console_input_buffer(). * Don't override sys.stdin anymore (not needed). --- Lib/test/test_msvcrt.py | 30 ++++---- ...-09-10-23-05-50.gh-issue-108996.tJBru6.rst | 1 + PC/_testconsole.c | 37 ++++++++++ PC/clinic/_testconsole.c.h | 70 ++++++++++++++++++- 4 files changed, 120 insertions(+), 18 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-10-23-05-50.gh-issue-108996.tJBru6.rst diff --git a/Lib/test/test_msvcrt.py b/Lib/test/test_msvcrt.py index 3a63de351e095d..81ec13026014e6 100644 --- a/Lib/test/test_msvcrt.py +++ b/Lib/test/test_msvcrt.py @@ -2,8 +2,6 @@ import sys import unittest -raise unittest.SkipTest("FIXME! broken test see: https://github.com/python/cpython/pull/109004") - from test.support import os_helper from test.support.os_helper import TESTFN, TESTFN_ASCII @@ -13,7 +11,7 @@ import _winapi import msvcrt; -from _testconsole import write_input +from _testconsole import write_input, flush_console_input_buffer class TestFileOperations(unittest.TestCase): @@ -64,6 +62,8 @@ def test_get_osfhandle(self): class TestConsoleIO(unittest.TestCase): def test_kbhit(self): + h = msvcrt.get_osfhandle(sys.stdin.fileno()) + flush_console_input_buffer(h) self.assertEqual(msvcrt.kbhit(), 0) def test_getch(self): @@ -71,28 +71,24 @@ def test_getch(self): self.assertEqual(msvcrt.getch(), b'c') def test_getwch(self): - stdin = open('CONIN$', 'r') - old_stdin = sys.stdin - try: - sys.stdin = stdin - write_input(stdin.buffer.raw, c_encoded) + with open('CONIN$', 'rb', buffering=0) as stdin: + h = msvcrt.get_osfhandle(stdin.fileno()) + flush_console_input_buffer(h) + + write_input(stdin, c_encoded) self.assertEqual(msvcrt.getwch(), c) - finally: - sys.stdin = old_stdin def test_getche(self): msvcrt.ungetch(b'c') self.assertEqual(msvcrt.getche(), b'c') def test_getwche(self): - stdin = open('CONIN$', 'r') - old_stdin = sys.stdin - try: - sys.stdin = stdin - write_input(stdin.buffer.raw, c_encoded) + with open('CONIN$', 'rb', buffering=0) as stdin: + h = msvcrt.get_osfhandle(stdin.fileno()) + flush_console_input_buffer(h) + + write_input(stdin, c_encoded) self.assertEqual(msvcrt.getwche(), c) - finally: - sys.stdin = old_stdin def test_putch(self): msvcrt.putch(b'c') diff --git a/Misc/NEWS.d/next/Tests/2023-09-10-23-05-50.gh-issue-108996.tJBru6.rst b/Misc/NEWS.d/next/Tests/2023-09-10-23-05-50.gh-issue-108996.tJBru6.rst new file mode 100644 index 00000000000000..ab6b5b5952b044 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-10-23-05-50.gh-issue-108996.tJBru6.rst @@ -0,0 +1 @@ +Fix and enable ``test_msvcrt``. diff --git a/PC/_testconsole.c b/PC/_testconsole.c index 3221b985d01ba0..5e5a771b96bfec 100644 --- a/PC/_testconsole.c +++ b/PC/_testconsole.c @@ -35,6 +35,23 @@ PyModuleDef_Slot testconsole_slots[] = { {0, NULL}, }; +/*[python input] +class HANDLE_converter(CConverter): + type = 'void *' + format_unit = '"_Py_PARSE_UINTPTR"' + + def parse_arg(self, argname, displayname, *, limited_capi): + return self.format_code(""" + {paramname} = PyLong_AsVoidPtr({argname}); + if (!{paramname} && PyErr_Occurred()) {{{{ + goto exit; + }}}} + """, + argname=argname) +[python start generated code]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=380aa5c91076742b]*/ +/*[python end generated code:]*/ + /*[clinic input] module _testconsole @@ -116,11 +133,31 @@ _testconsole_read_output_impl(PyObject *module, PyObject *file) Py_RETURN_NONE; } +/*[clinic input] +_testconsole.flush_console_input_buffer + handle: HANDLE + +Flushes the console input buffer. + +All input records currently in the input buffer are discarded. +[clinic start generated code]*/ + +static PyObject * +_testconsole_flush_console_input_buffer_impl(PyObject *module, void *handle) +/*[clinic end generated code: output=1f923a81331465ce input=be8203ae84a288f5]*/ +/*[clinic end generated code:]*/ +{ + FlushConsoleInputBuffer(handle); + + Py_RETURN_NONE; +} + #include "clinic\_testconsole.c.h" PyMethodDef testconsole_methods[] = { _TESTCONSOLE_WRITE_INPUT_METHODDEF _TESTCONSOLE_READ_OUTPUT_METHODDEF + _TESTCONSOLE_FLUSH_CONSOLE_INPUT_BUFFER_METHODDEF {NULL, NULL} }; diff --git a/PC/clinic/_testconsole.c.h b/PC/clinic/_testconsole.c.h index 99cd302ff34698..b76588909782ea 100644 --- a/PC/clinic/_testconsole.c.h +++ b/PC/clinic/_testconsole.c.h @@ -132,6 +132,70 @@ _testconsole_read_output(PyObject *module, PyObject *const *args, Py_ssize_t nar #endif /* defined(MS_WINDOWS) */ +#if defined(MS_WINDOWS) + +PyDoc_STRVAR(_testconsole_flush_console_input_buffer__doc__, +"flush_console_input_buffer($module, /, handle)\n" +"--\n" +"\n" +"Flushes the console input buffer.\n" +"\n" +"All input records currently in the input buffer are discarded."); + +#define _TESTCONSOLE_FLUSH_CONSOLE_INPUT_BUFFER_METHODDEF \ + {"flush_console_input_buffer", _PyCFunction_CAST(_testconsole_flush_console_input_buffer), METH_FASTCALL|METH_KEYWORDS, _testconsole_flush_console_input_buffer__doc__}, + +static PyObject * +_testconsole_flush_console_input_buffer_impl(PyObject *module, void *handle); + +static PyObject * +_testconsole_flush_console_input_buffer(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) + + #define NUM_KEYWORDS 1 + static struct { + PyGC_Head _this_is_not_used; + PyObject_VAR_HEAD + PyObject *ob_item[NUM_KEYWORDS]; + } _kwtuple = { + .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) + .ob_item = { &_Py_ID(handle), }, + }; + #undef NUM_KEYWORDS + #define KWTUPLE (&_kwtuple.ob_base.ob_base) + + #else // !Py_BUILD_CORE + # define KWTUPLE NULL + #endif // !Py_BUILD_CORE + + static const char * const _keywords[] = {"handle", NULL}; + static _PyArg_Parser _parser = { + .keywords = _keywords, + .fname = "flush_console_input_buffer", + .kwtuple = KWTUPLE, + }; + #undef KWTUPLE + PyObject *argsbuf[1]; + void *handle; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + handle = PyLong_AsVoidPtr(args[0]); + if (!handle && PyErr_Occurred()) { + goto exit; + } + return_value = _testconsole_flush_console_input_buffer_impl(module, handle); + +exit: + return return_value; +} + +#endif /* defined(MS_WINDOWS) */ + #ifndef _TESTCONSOLE_WRITE_INPUT_METHODDEF #define _TESTCONSOLE_WRITE_INPUT_METHODDEF #endif /* !defined(_TESTCONSOLE_WRITE_INPUT_METHODDEF) */ @@ -139,4 +203,8 @@ _testconsole_read_output(PyObject *module, PyObject *const *args, Py_ssize_t nar #ifndef _TESTCONSOLE_READ_OUTPUT_METHODDEF #define _TESTCONSOLE_READ_OUTPUT_METHODDEF #endif /* !defined(_TESTCONSOLE_READ_OUTPUT_METHODDEF) */ -/*[clinic end generated code: output=f59fe72cd4e73704 input=a9049054013a1b77]*/ + +#ifndef _TESTCONSOLE_FLUSH_CONSOLE_INPUT_BUFFER_METHODDEF + #define _TESTCONSOLE_FLUSH_CONSOLE_INPUT_BUFFER_METHODDEF +#endif /* !defined(_TESTCONSOLE_FLUSH_CONSOLE_INPUT_BUFFER_METHODDEF) */ +/*[clinic end generated code: output=5d488564f2500dd9 input=a9049054013a1b77]*/ From 1eb1b45183c3b8aeefe3d5d27694155741e82bbc Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Sep 2023 03:13:31 +0200 Subject: [PATCH 287/357] gh-109702: Increase concurrent_futures deadlock timeout (#109703) Replace SHORT_TIMEOUT with LONG_TIMEOUT in test_deadlock of test_concurrent_futures. --- Lib/test/test_concurrent_futures/test_deadlock.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_concurrent_futures/test_deadlock.py b/Lib/test/test_concurrent_futures/test_deadlock.py index baac2b51e0d4e2..1675a55b89eb80 100644 --- a/Lib/test/test_concurrent_futures/test_deadlock.py +++ b/Lib/test/test_concurrent_futures/test_deadlock.py @@ -88,7 +88,7 @@ def __reduce__(self): class ExecutorDeadlockTest: - TIMEOUT = support.SHORT_TIMEOUT + TIMEOUT = support.LONG_TIMEOUT def _fail_on_deadlock(self, executor): # If we did not recover before TIMEOUT seconds, consider that the From 3cce6be06abc42657445fcd7224f8f2af4c1c33f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Sep 2023 04:43:48 +0200 Subject: [PATCH 288/357] gh-109566: Fix typo in PCbuild/rt.bat (#109701) --- PCbuild/rt.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PCbuild/rt.bat b/PCbuild/rt.bat index cd32a386f0366b..33f4212e14567d 100644 --- a/PCbuild/rt.bat +++ b/PCbuild/rt.bat @@ -32,7 +32,7 @@ set pcbuild=%~dp0 set suffix= set qmode= set dashO= -set regrtestargs--fail-env-changed --fail-rerun +set regrtestargs=--fail-env-changed --fail-rerun set exe= :CheckOpts From 291401389bf76981688d82a0d7bb61fb8355ff14 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Fri, 22 Sep 2023 06:37:44 +0100 Subject: [PATCH 289/357] GH-109190: Copyedit 3.12 What's New: Consistently show module names (#109664) Consistently show module names --- Doc/whatsnew/3.12.rst | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 5d9e9e92bee10f..9ea4a12e8b1b4e 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -569,18 +569,18 @@ asyncio making some use-cases 2x to 5x faster. (Contributed by Jacob Bower & Itamar O in :gh:`102853`, :gh:`104140`, and :gh:`104138`) -* On Linux, :mod:`asyncio` uses :class:`~asyncio.PidfdChildWatcher` by default +* On Linux, :mod:`asyncio` uses :class:`asyncio.PidfdChildWatcher` by default if :func:`os.pidfd_open` is available and functional instead of - :class:`~asyncio.ThreadedChildWatcher`. + :class:`asyncio.ThreadedChildWatcher`. (Contributed by Kumar Aditya in :gh:`98024`.) -* The child watcher classes :class:`~asyncio.MultiLoopChildWatcher`, - :class:`~asyncio.FastChildWatcher`, :class:`~asyncio.AbstractChildWatcher` - and :class:`~asyncio.SafeChildWatcher` are deprecated and +* The child watcher classes :class:`asyncio.MultiLoopChildWatcher`, + :class:`asyncio.FastChildWatcher`, :class:`asyncio.AbstractChildWatcher` + and :class:`asyncio.SafeChildWatcher` are deprecated and will be removed in Python 3.14. It is recommended to not manually configure a child watcher as the event loop now uses the best available - child watcher for each platform (:class:`~asyncio.PidfdChildWatcher` - if supported and :class:`~asyncio.ThreadedChildWatcher` otherwise). + child watcher for each platform (:class:`asyncio.PidfdChildWatcher` + if supported and :class:`asyncio.ThreadedChildWatcher` otherwise). (Contributed by Kumar Aditya in :gh:`94597`.) * :func:`asyncio.set_child_watcher`, :func:`asyncio.get_child_watcher`, @@ -607,15 +607,15 @@ asyncio calendar -------- -* Add enums :data:`~calendar.Month` and :data:`~calendar.Day`. +* Add enums :data:`calendar.Month` and :data:`calendar.Day`. (Contributed by Prince Roshan in :gh:`103636`.) csv --- -* Add :const:`~csv.QUOTE_NOTNULL` and :const:`~csv.QUOTE_STRINGS` flags to +* Add :const:`csv.QUOTE_NOTNULL` and :const:`csv.QUOTE_STRINGS` flags to provide finer grained control of ``None`` and empty strings by - :class:`~csv.writer` objects. + :class:`csv.writer` objects. dis --- @@ -625,7 +625,7 @@ dis :mod:`dis` module. :opcode:`HAVE_ARGUMENT` is still relevant to real opcodes, but it is not useful for pseudo instructions. Use the new - :data:`~dis.hasarg` collection instead. + :data:`dis.hasarg` collection instead. (Contributed by Irit Katriel in :gh:`94216`.) fractions @@ -711,11 +711,11 @@ pathlib ------- * Add support for subclassing :class:`pathlib.PurePath` and - :class:`~pathlib.Path`, plus their Posix- and Windows-specific variants. - Subclasses may override the :meth:`~pathlib.PurePath.with_segments` method + :class:`pathlib.Path`, plus their Posix- and Windows-specific variants. + Subclasses may override the :meth:`pathlib.PurePath.with_segments` method to pass information between path instances. -* Add :meth:`~pathlib.Path.walk` for walking the directory trees and generating +* Add :meth:`pathlib.Path.walk` for walking the directory trees and generating all file or directory names within them, similar to :func:`os.walk`. (Contributed by Stanislav Zmiev in :gh:`90385`.) @@ -784,20 +784,20 @@ sqlite3 * Add a :ref:`command-line interface `. (Contributed by Erlend E. Aasland in :gh:`77617`.) -* Add the :attr:`~sqlite3.Connection.autocommit` attribute - to :class:`~sqlite3.Connection` - and the *autocommit* parameter to :func:`~sqlite3.connect` +* Add the :attr:`sqlite3.Connection.autocommit` attribute + to :class:`sqlite3.Connection` + and the *autocommit* parameter to :func:`sqlite3.connect` to control :pep:`249`-compliant :ref:`transaction handling `. (Contributed by Erlend E. Aasland in :gh:`83638`.) * Add *entrypoint* keyword-only parameter to - :meth:`~sqlite3.Connection.load_extension`, + :meth:`sqlite3.Connection.load_extension`, for overriding the SQLite extension entry point. (Contributed by Erlend E. Aasland in :gh:`103015`.) -* Add :meth:`~sqlite3.Connection.getconfig` and - :meth:`~sqlite3.Connection.setconfig` to :class:`~sqlite3.Connection` +* Add :meth:`sqlite3.Connection.getconfig` and + :meth:`sqlite3.Connection.setconfig` to :class:`sqlite3.Connection` to make configuration changes to a database connection. (Contributed by Erlend E. Aasland in :gh:`103489`.) From d3fe1a902fd060cc9fb41b768cc1e3ca5b52244d Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Fri, 22 Sep 2023 07:28:13 +0100 Subject: [PATCH 290/357] GH-109190: Copyedit 3.12 What's New: tokenize (#109663) --- Doc/whatsnew/3.12.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 9ea4a12e8b1b4e..62925e723e6eb6 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -867,8 +867,8 @@ tkinter tokenize -------- -* The :mod:`tokenize` module includes the changes introduced in :pep:`701`. ( - Contributed by Marta Gómez Macías and Pablo Galindo in :gh:`102856`.) +* The :mod:`tokenize` module includes the changes introduced in :pep:`701`. + (Contributed by Marta Gómez Macías and Pablo Galindo in :gh:`102856`.) See :ref:`whatsnew312-porting-to-python312` for more information on the changes to the :mod:`tokenize` module. From 34ddcc3fa118168901fa0d3a69b3b5444fc2f943 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Fri, 22 Sep 2023 07:29:48 +0100 Subject: [PATCH 291/357] GH-109190: Copyedit 3.12 What's New: calendar (#109662) Co-authored-by: Hugo van Kemenade --- Doc/whatsnew/3.12.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 62925e723e6eb6..3117d9183761b0 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -607,7 +607,8 @@ asyncio calendar -------- -* Add enums :data:`calendar.Month` and :data:`calendar.Day`. +* Add enums :data:`calendar.Month` and :data:`calendar.Day` + defining months of the year and days of the week. (Contributed by Prince Roshan in :gh:`103636`.) csv From 8fc071345b50dd3de61ebeeaa287ccef21d061b2 Mon Sep 17 00:00:00 2001 From: EliseevEgor Date: Fri, 22 Sep 2023 15:26:27 +0300 Subject: [PATCH 292/357] gh-106584: Fix exit code for unittest in Python 3.12 (#106588) Co-authored-by: sunmy2019 <59365878+sunmy2019@users.noreply.github.com> Co-authored-by: Nikita Sobolev --- Lib/test/test_unittest/test_discovery.py | 2 +- Lib/test/test_unittest/test_skipping.py | 12 ++++++------ Lib/unittest/case.py | 4 +++- Lib/unittest/result.py | 10 ++++++---- .../2023-07-11-08-56-40.gh-issue-106584.g-SBtC.rst | 2 ++ 5 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-07-11-08-56-40.gh-issue-106584.g-SBtC.rst diff --git a/Lib/test/test_unittest/test_discovery.py b/Lib/test/test_unittest/test_discovery.py index 004898ed431834..dcb72d73efceab 100644 --- a/Lib/test/test_unittest/test_discovery.py +++ b/Lib/test/test_unittest/test_discovery.py @@ -571,7 +571,7 @@ def _get_module_from_name(name): result = unittest.TestResult() suite.run(result) self.assertEqual(len(result.skipped), 1) - self.assertEqual(result.testsRun, 1) + self.assertEqual(result.testsRun, 0) self.assertEqual(import_calls, ['my_package']) # Check picklability diff --git a/Lib/test/test_unittest/test_skipping.py b/Lib/test/test_unittest/test_skipping.py index f146dcac18ecc0..1a6af06d32b433 100644 --- a/Lib/test/test_unittest/test_skipping.py +++ b/Lib/test/test_unittest/test_skipping.py @@ -103,16 +103,16 @@ def test_dont_skip(self): pass result = LoggingResult(events) self.assertIs(suite.run(result), result) self.assertEqual(len(result.skipped), 1) - expected = ['startTest', 'addSkip', 'stopTest', - 'startTest', 'addSuccess', 'stopTest'] + expected = ['addSkip', 'stopTest', 'startTest', + 'addSuccess', 'stopTest'] self.assertEqual(events, expected) - self.assertEqual(result.testsRun, 2) + self.assertEqual(result.testsRun, 1) self.assertEqual(result.skipped, [(test_do_skip, "testing")]) self.assertTrue(result.wasSuccessful()) events = [] result = test_do_skip.run() - self.assertEqual(events, ['startTestRun', 'startTest', 'addSkip', + self.assertEqual(events, ['startTestRun', 'addSkip', 'stopTest', 'stopTestRun']) self.assertEqual(result.skipped, [(test_do_skip, "testing")]) @@ -135,13 +135,13 @@ def test_1(self): test = Foo("test_1") suite = unittest.TestSuite([test]) self.assertIs(suite.run(result), result) - self.assertEqual(events, ['startTest', 'addSkip', 'stopTest']) + self.assertEqual(events, ['addSkip', 'stopTest']) self.assertEqual(result.skipped, [(test, "testing")]) self.assertEqual(record, []) events = [] result = test.run() - self.assertEqual(events, ['startTestRun', 'startTest', 'addSkip', + self.assertEqual(events, ['startTestRun', 'addSkip', 'stopTest', 'stopTestRun']) self.assertEqual(result.skipped, [(test, "testing")]) self.assertEqual(record, []) diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 001b640dc43ad6..811557498bb30e 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -606,7 +606,6 @@ def run(self, result=None): else: stopTestRun = None - result.startTest(self) try: testMethod = getattr(self, self._testMethodName) if (getattr(self.__class__, "__unittest_skip__", False) or @@ -617,6 +616,9 @@ def run(self, result=None): _addSkip(result, self, skip_why) return result + # Increase the number of tests only if it hasn't been skipped + result.startTest(self) + expecting_failure = ( getattr(self, "__unittest_expecting_failure__", False) or getattr(testMethod, "__unittest_expecting_failure__", False) diff --git a/Lib/unittest/result.py b/Lib/unittest/result.py index 3ace0a5b7bf2ef..9e56f658027f4d 100644 --- a/Lib/unittest/result.py +++ b/Lib/unittest/result.py @@ -97,10 +97,12 @@ def _restoreStdout(self): sys.stdout = self._original_stdout sys.stderr = self._original_stderr - self._stdout_buffer.seek(0) - self._stdout_buffer.truncate() - self._stderr_buffer.seek(0) - self._stderr_buffer.truncate() + if self._stdout_buffer is not None: + self._stdout_buffer.seek(0) + self._stdout_buffer.truncate() + if self._stderr_buffer is not None: + self._stderr_buffer.seek(0) + self._stderr_buffer.truncate() def stopTestRun(self): """Called once after all tests are executed. diff --git a/Misc/NEWS.d/next/Library/2023-07-11-08-56-40.gh-issue-106584.g-SBtC.rst b/Misc/NEWS.d/next/Library/2023-07-11-08-56-40.gh-issue-106584.g-SBtC.rst new file mode 100644 index 00000000000000..a13b61bf1c121b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-07-11-08-56-40.gh-issue-106584.g-SBtC.rst @@ -0,0 +1,2 @@ +Fix exit code for ``unittest`` if all tests are skipped. +Patch by Egor Eliseev. From d9415f6a45c2c4163b593713ef765cb2a60f8aa7 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Fri, 22 Sep 2023 13:50:20 +0100 Subject: [PATCH 293/357] GH-109190: Copyedit 3.12 What's New: bytecode (LOAD_METHOD) (#109665) bytecode: suppress reference to removed LOAD_METHOD --- Doc/whatsnew/3.12.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 3117d9183761b0..5c38e3b9bcfd51 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -1000,9 +1000,9 @@ Optimizations CPython bytecode changes ======================== -* Remove the :opcode:`LOAD_METHOD` instruction. It has been merged into +* Remove the :opcode:`!LOAD_METHOD` instruction. It has been merged into :opcode:`LOAD_ATTR`. :opcode:`LOAD_ATTR` will now behave like the old - :opcode:`LOAD_METHOD` instruction if the low bit of its oparg is set. + :opcode:`!LOAD_METHOD` instruction if the low bit of its oparg is set. (Contributed by Ken Jin in :gh:`93429`.) * Remove the :opcode:`!JUMP_IF_FALSE_OR_POP` and :opcode:`!JUMP_IF_TRUE_OR_POP` From e94a2232eac07eb526ec93ef01699513cf9b0fa3 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Fri, 22 Sep 2023 13:53:53 +0100 Subject: [PATCH 294/357] GH-109190: Copyedit 3.12 What's New: PEP 684 (#109657) --- Doc/whatsnew/3.12.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 5c38e3b9bcfd51..0b5ee5f7a8c8c3 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -291,9 +291,11 @@ can be used to customize buffer creation. PEP 684: A Per-Interpreter GIL ------------------------------ -Sub-interpreters may now be created with a unique GIL per interpreter. +:pep:`684` introduces a per-interpreter :term:`GIL `, +so that sub-interpreters may now be created with a unique GIL per interpreter. This allows Python programs to take full advantage of multiple CPU -cores. +cores. This is currently only available through the C-API, +though a Python API is :pep:`anticipated for 3.13 <554>`. Use the new :c:func:`Py_NewInterpreterFromConfig` function to create an interpreter with its own GIL:: @@ -312,8 +314,6 @@ create an interpreter with its own GIL:: For further examples how to use the C-API for sub-interpreters with a per-interpreter GIL, see :source:`Modules/_xxsubinterpretersmodule.c`. -A Python API is anticipated for 3.13. (See :pep:`554`.) - (Contributed by Eric Snow in :gh:`104210`, etc.) .. _whatsnew312-pep669: From 405b06375a8a4cdb08ff53afade09a8b66ec23d5 Mon Sep 17 00:00:00 2001 From: elfstrom Date: Fri, 22 Sep 2023 14:55:56 +0200 Subject: [PATCH 295/357] gh-105829: Fix concurrent.futures.ProcessPoolExecutor deadlock (#108513) This fixes issue #105829, https://github.com/python/cpython/issues/105829 Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Antoine Pitrou Co-authored-by: Chris Withers Co-authored-by: Thomas Moreau --- Lib/concurrent/futures/process.py | 18 ++++- .../test_concurrent_futures/test_deadlock.py | 72 ++++++++++++++++++- ...-08-26-12-35-39.gh-issue-105829.kyYhWI.rst | 1 + 3 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-08-26-12-35-39.gh-issue-105829.kyYhWI.rst diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index fba19d39d5c9c2..48d8db3ed423a5 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -71,6 +71,11 @@ def __init__(self): self._reader, self._writer = mp.Pipe(duplex=False) def close(self): + # Please note that we do not take the shutdown lock when + # calling clear() (to avoid deadlocking) so this method can + # only be called safely from the same thread as all calls to + # clear() even if you hold the shutdown lock. Otherwise we + # might try to read from the closed pipe. if not self._closed: self._closed = True self._writer.close() @@ -426,8 +431,12 @@ def wait_result_broken_or_wakeup(self): elif wakeup_reader in ready: is_broken = False - with self.shutdown_lock: - self.thread_wakeup.clear() + # No need to hold the _shutdown_lock here because: + # 1. we're the only thread to use the wakeup reader + # 2. we're also the only thread to call thread_wakeup.close() + # 3. we want to avoid a possible deadlock when both reader and writer + # would block (gh-105829) + self.thread_wakeup.clear() return result_item, is_broken, cause @@ -717,7 +726,10 @@ def __init__(self, max_workers=None, mp_context=None, # as it could result in a deadlock if a worker process dies with the # _result_queue write lock still acquired. # - # _shutdown_lock must be locked to access _ThreadWakeup. + # _shutdown_lock must be locked to access _ThreadWakeup.close() and + # .wakeup(). Care must also be taken to not call clear or close from + # more than one thread since _ThreadWakeup.clear() is not protected by + # the _shutdown_lock self._executor_manager_thread_wakeup = _ThreadWakeup() # Create communication channels for the executor diff --git a/Lib/test/test_concurrent_futures/test_deadlock.py b/Lib/test/test_concurrent_futures/test_deadlock.py index 1675a55b89eb80..a76e075c3be180 100644 --- a/Lib/test/test_concurrent_futures/test_deadlock.py +++ b/Lib/test/test_concurrent_futures/test_deadlock.py @@ -1,10 +1,13 @@ import contextlib +import queue +import signal import sys import time import unittest +import unittest.mock from pickle import PicklingError from concurrent import futures -from concurrent.futures.process import BrokenProcessPool +from concurrent.futures.process import BrokenProcessPool, _ThreadWakeup from test import support @@ -241,6 +244,73 @@ def test_crash_big_data(self): executor.shutdown(wait=True) + def test_gh105829_should_not_deadlock_if_wakeup_pipe_full(self): + # Issue #105829: The _ExecutorManagerThread wakeup pipe could + # fill up and block. See: https://github.com/python/cpython/issues/105829 + + # Lots of cargo culting while writing this test, apologies if + # something is really stupid... + + self.executor.shutdown(wait=True) + + if not hasattr(signal, 'alarm'): + raise unittest.SkipTest( + "Tested platform does not support the alarm signal") + + def timeout(_signum, _frame): + import faulthandler + faulthandler.dump_traceback() + + raise RuntimeError("timed out while submitting jobs?") + + thread_run = futures.process._ExecutorManagerThread.run + def mock_run(self): + # Delay thread startup so the wakeup pipe can fill up and block + time.sleep(3) + thread_run(self) + + class MockWakeup(_ThreadWakeup): + """Mock wakeup object to force the wakeup to block""" + def __init__(self): + super().__init__() + self._dummy_queue = queue.Queue(maxsize=1) + + def wakeup(self): + self._dummy_queue.put(None, block=True) + super().wakeup() + + def clear(self): + try: + while True: + self._dummy_queue.get_nowait() + except queue.Empty: + super().clear() + + with (unittest.mock.patch.object(futures.process._ExecutorManagerThread, + 'run', mock_run), + unittest.mock.patch('concurrent.futures.process._ThreadWakeup', + MockWakeup)): + with self.executor_type(max_workers=2, + mp_context=self.get_context()) as executor: + self.executor = executor # Allow clean up in fail_on_deadlock + + job_num = 100 + job_data = range(job_num) + + # Need to use sigalarm for timeout detection because + # Executor.submit is not guarded by any timeout (both + # self._work_ids.put(self._queue_count) and + # self._executor_manager_thread_wakeup.wakeup() might + # timeout, maybe more?). In this specific case it was + # the wakeup call that deadlocked on a blocking pipe. + old_handler = signal.signal(signal.SIGALRM, timeout) + try: + signal.alarm(int(self.TIMEOUT)) + self.assertEqual(job_num, len(list(executor.map(int, job_data)))) + finally: + signal.alarm(0) + signal.signal(signal.SIGALRM, old_handler) + create_executor_tests(globals(), ExecutorDeadlockTest, executor_mixins=(ProcessPoolForkMixin, diff --git a/Misc/NEWS.d/next/Library/2023-08-26-12-35-39.gh-issue-105829.kyYhWI.rst b/Misc/NEWS.d/next/Library/2023-08-26-12-35-39.gh-issue-105829.kyYhWI.rst new file mode 100644 index 00000000000000..eaa2a5a4330e28 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-08-26-12-35-39.gh-issue-105829.kyYhWI.rst @@ -0,0 +1 @@ +Fix concurrent.futures.ProcessPoolExecutor deadlock From cade5960ae5949899bccbec3af72b0287d0f6749 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Fri, 22 Sep 2023 14:05:39 +0100 Subject: [PATCH 296/357] GH-109190: Copyedit 3.12 What's New: Other Language Changes (#109660) --- Doc/whatsnew/3.12.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 0b5ee5f7a8c8c3..b21518c85062b5 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -459,12 +459,12 @@ and others in :gh:`103764`.) Other Language Changes ====================== -* Add :ref:`perf_profiling` through the new - environment variable :envvar:`PYTHONPERFSUPPORT`, - the new command-line option :option:`-X perf <-X>`, +* Add :ref:`support for the perf profiler ` through the new + environment variable :envvar:`PYTHONPERFSUPPORT` + and command-line option :option:`-X perf <-X>`, as well as the new :func:`sys.activate_stack_trampoline`, :func:`sys.deactivate_stack_trampoline`, - and :func:`sys.is_stack_trampoline_active` APIs. + and :func:`sys.is_stack_trampoline_active` functions. (Design by Pablo Galindo. Contributed by Pablo Galindo and Christian Heimes with contributions from Gregory P. Smith [Google] and Mark Shannon in :gh:`96123`.) @@ -473,7 +473,7 @@ Other Language Changes have a new a *filter* argument that allows limiting tar features than may be surprising or dangerous, such as creating files outside the destination directory. - See :ref:`tarfile-extraction-filter` for details. + See :ref:`tarfile extraction filters ` for details. In Python 3.14, the default will switch to ``'data'``. (Contributed by Petr Viktorin in :pep:`706`.) @@ -501,8 +501,8 @@ Other Language Changes * A backslash-character pair that is not a valid escape sequence now generates a :exc:`SyntaxWarning`, instead of :exc:`DeprecationWarning`. For example, ``re.compile("\d+\.\d+")`` now emits a :exc:`SyntaxWarning` - (``"\d"`` is an invalid escape sequence), use raw strings for regular - expression: ``re.compile(r"\d+\.\d+")``. + (``"\d"`` is an invalid escape sequence, use raw strings for regular + expression: ``re.compile(r"\d+\.\d+")``). In a future Python version, :exc:`SyntaxError` will eventually be raised, instead of :exc:`SyntaxWarning`. (Contributed by Victor Stinner in :gh:`98401`.) @@ -531,7 +531,7 @@ Other Language Changes when summing floats or mixed ints and floats. (Contributed by Raymond Hettinger in :gh:`100425`.) -* Exceptions raised in a typeobject's ``__set_name__`` method are no longer +* Exceptions raised in a class or type's ``__set_name__`` method are no longer wrapped by a :exc:`RuntimeError`. Context information is added to the exception as a :pep:`678` note. (Contributed by Irit Katriel in :gh:`77757`.) From 46b63ced2564ad6c3d7b65e0ea1f04fd5c7d2959 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Fri, 22 Sep 2023 15:09:32 +0200 Subject: [PATCH 297/357] Remove outdated docstring from the `quantify` itertools recipe (#109726) --- Doc/library/itertools.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index bd347e6448f1a0..5846d784c88ccc 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -845,7 +845,6 @@ which incur interpreter overhead. def quantify(iterable, pred=bool): "Given a predicate that returns True or False, count the True results." - "Count how many times the predicate is True" return sum(map(pred, iterable)) def all_equal(iterable): From cbbdf2c1440c804adcfc32ea0470865b3b3b8eb2 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Sep 2023 15:29:42 +0200 Subject: [PATCH 298/357] gh-109709: Fix asyncio test_stdin_broken_pipe() (#109710) Replace harcoded sleep of 500 ms with synchronization using a pipe. Fix also Process._feed_stdin(): catch also BrokenPipeError on stdin.write(input), not only on stdin.drain(). --- Lib/asyncio/subprocess.py | 14 ++++--- Lib/test/test_asyncio/test_subprocess.py | 52 +++++++++++++++++++----- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py index c4e5ba2061cffc..043359bbd03f8a 100644 --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -147,15 +147,17 @@ def kill(self): async def _feed_stdin(self, input): debug = self._loop.get_debug() - if input is not None: - self.stdin.write(input) - if debug: - logger.debug( - '%r communicate: feed stdin (%s bytes)', self, len(input)) try: + if input is not None: + self.stdin.write(input) + if debug: + logger.debug( + '%r communicate: feed stdin (%s bytes)', self, len(input)) + await self.stdin.drain() except (BrokenPipeError, ConnectionResetError) as exc: - # communicate() ignores BrokenPipeError and ConnectionResetError + # communicate() ignores BrokenPipeError and ConnectionResetError. + # write() and drain() can raise these exceptions. if debug: logger.debug('%r communicate: stdin got %r', self, exc) diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index 429ef16fdb0e05..dc5a48d500e8d5 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -1,6 +1,7 @@ import os import signal import sys +import textwrap import unittest import warnings from unittest import mock @@ -12,9 +13,14 @@ from test import support from test.support import os_helper -if sys.platform != 'win32': + +MS_WINDOWS = (sys.platform == 'win32') +if MS_WINDOWS: + import msvcrt +else: from asyncio import unix_events + if support.check_sanitizer(address=True): raise unittest.SkipTest("Exposes ASAN flakiness in GitHub CI") @@ -270,26 +276,43 @@ async def send_signal(proc): finally: signal.signal(signal.SIGHUP, old_handler) - def prepare_broken_pipe_test(self): + def test_stdin_broken_pipe(self): # buffer large enough to feed the whole pipe buffer large_data = b'x' * support.PIPE_MAX_SIZE + rfd, wfd = os.pipe() + self.addCleanup(os.close, rfd) + self.addCleanup(os.close, wfd) + if MS_WINDOWS: + handle = msvcrt.get_osfhandle(rfd) + os.set_handle_inheritable(handle, True) + code = textwrap.dedent(f''' + import os, msvcrt + handle = {handle} + fd = msvcrt.open_osfhandle(handle, os.O_RDONLY) + os.read(fd, 1) + ''') + from subprocess import STARTUPINFO + startupinfo = STARTUPINFO() + startupinfo.lpAttributeList = {"handle_list": [handle]} + kwargs = dict(startupinfo=startupinfo) + else: + code = f'import os; fd = {rfd}; os.read(fd, 1)' + kwargs = dict(pass_fds=(rfd,)) + # the program ends before the stdin can be fed proc = self.loop.run_until_complete( asyncio.create_subprocess_exec( - sys.executable, '-c', 'pass', + sys.executable, '-c', code, stdin=subprocess.PIPE, + **kwargs ) ) - return (proc, large_data) - - def test_stdin_broken_pipe(self): - proc, large_data = self.prepare_broken_pipe_test() - async def write_stdin(proc, data): - await asyncio.sleep(0.5) proc.stdin.write(data) + # Only exit the child process once the write buffer is filled + os.write(wfd, b'go') await proc.stdin.drain() coro = write_stdin(proc, large_data) @@ -300,7 +323,16 @@ async def write_stdin(proc, data): self.loop.run_until_complete(proc.wait()) def test_communicate_ignore_broken_pipe(self): - proc, large_data = self.prepare_broken_pipe_test() + # buffer large enough to feed the whole pipe buffer + large_data = b'x' * support.PIPE_MAX_SIZE + + # the program ends before the stdin can be fed + proc = self.loop.run_until_complete( + asyncio.create_subprocess_exec( + sys.executable, '-c', 'pass', + stdin=subprocess.PIPE, + ) + ) # communicate() must ignore BrokenPipeError when feeding stdin self.loop.set_exception_handler(lambda loop, msg: None) From 168c3a8a893fcb42f8a4d078a1e9a6bd7ad65253 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Fri, 22 Sep 2023 14:31:49 +0100 Subject: [PATCH 299/357] GH-109190: Copyedit 3.12 What's New: PEP 669 (#109658) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Łukasz Langa Co-authored-by: Hugo van Kemenade --- Doc/whatsnew/3.12.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index b21518c85062b5..ada6558175be7b 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -321,13 +321,15 @@ per-interpreter GIL, see :source:`Modules/_xxsubinterpretersmodule.c`. PEP 669: Low impact monitoring for CPython ------------------------------------------ -CPython 3.12 now supports the ability to monitor calls, -returns, lines, exceptions and other events using instrumentation. +:pep:`669` defines a new :mod:`API ` for profilers, +debuggers, and other tools to monitor events in CPython. +It covers a wide range of events, including calls, +returns, lines, exceptions, jumps, and more. This means that you only pay for what you use, providing support for near-zero overhead debuggers and coverage tools. - See :mod:`sys.monitoring` for details. +(Contributed by Mark Shannon in :gh:`103083`.) New Features Related to Type Hints ================================== From c32abf1f21c4bd32abcefe4d601611b152568961 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Fri, 22 Sep 2023 14:32:32 +0100 Subject: [PATCH 300/357] GH-109190: Copyedit 3.12 What's New: asyncio (#109661) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Łukasz Langa Co-authored-by: Itamar Oren Co-authored-by: Hugo van Kemenade --- Doc/whatsnew/3.12.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index ada6558175be7b..1223f859265ed9 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -569,7 +569,7 @@ asyncio * Added :func:`asyncio.eager_task_factory` and :func:`asyncio.create_eager_task_factory` functions to allow opting an event loop in to eager task execution, making some use-cases 2x to 5x faster. - (Contributed by Jacob Bower & Itamar O in :gh:`102853`, :gh:`104140`, and :gh:`104138`) + (Contributed by Jacob Bower & Itamar Oren in :gh:`102853`, :gh:`104140`, and :gh:`104138`) * On Linux, :mod:`asyncio` uses :class:`asyncio.PidfdChildWatcher` by default if :func:`os.pidfd_open` is available and functional instead of @@ -596,7 +596,7 @@ asyncio (Contributed by Kumar Aditya in :gh:`99388`.) * Add C implementation of :func:`asyncio.current_task` for 4x-6x speedup. - (Contributed by Itamar Ostricher and Pranav Thulasiram Bhat in :gh:`100344`.) + (Contributed by Itamar Oren and Pranav Thulasiram Bhat in :gh:`100344`.) * :func:`asyncio.iscoroutine` now returns ``False`` for generators as :mod:`asyncio` does not support legacy generator-based coroutines. @@ -987,7 +987,7 @@ Optimizations (Contributed by Serhiy Storchaka in :gh:`91524`.) * Speed up :class:`asyncio.Task` creation by deferring expensive string formatting. - (Contributed by Itamar O in :gh:`103793`.) + (Contributed by Itamar Oren in :gh:`103793`.) * The :func:`tokenize.tokenize` and :func:`tokenize.generate_tokens` functions are up to 64% faster as a side effect of the changes required to cover :pep:`701` in @@ -1840,7 +1840,7 @@ New Features * Added :c:func:`PyCode_AddWatcher` and :c:func:`PyCode_ClearWatcher` APIs to register callbacks to receive notification on creation and destruction of code objects. - (Contributed by Itamar Ostricher in :gh:`91054`.) + (Contributed by Itamar Oren in :gh:`91054`.) * Add :c:func:`PyFrame_GetVar` and :c:func:`PyFrame_GetVarString` functions to get a frame variable by its name. From 09a25616a908a028b6373f9ab372d86edf064282 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Sep 2023 16:54:37 +0200 Subject: [PATCH 301/357] gh-109723: Disable Py_BUILD_CORE in _testcapi (#109727) Make sure that the internal C API is not tested by mistake by _testcapi. Undefine Py_BUILD_CORE_BUILTIN and Py_BUILD_CORE_MODULE macros in Modules/_testcapi/parts.h: move code from _testcapimodule.c. heaptype_relative.c and vectorcall_limited.c are using the limited C API which is incompatible with the internal C API. Move test_long_numbits() from _testcapi to _testinternalcapi since it uses the internal C API "pycore_long.h". Fix Modules/_testcapi/pyatomic.c: don't include Python.h directly, just include _testcapi/parts.h. Ajust "make check-c-globals" for these changes. --- Modules/_testcapi/clinic/long.c.h | 19 +----- Modules/_testcapi/long.c | 53 ---------------- Modules/_testcapi/parts.h | 16 +++++ Modules/_testcapi/pyatomic.c | 4 -- Modules/_testcapimodule.c | 25 ++------ Modules/_testinternalcapi.c | 62 +++++++++++++++++++ Modules/clinic/_testinternalcapi.c.h | 19 +++++- Tools/c-analyzer/c_parser/preprocessor/gcc.py | 17 +++-- 8 files changed, 114 insertions(+), 101 deletions(-) diff --git a/Modules/_testcapi/clinic/long.c.h b/Modules/_testcapi/clinic/long.c.h index b77cb51810cb65..e2f7042be12c48 100644 --- a/Modules/_testcapi/clinic/long.c.h +++ b/Modules/_testcapi/clinic/long.c.h @@ -133,23 +133,6 @@ _testcapi_test_long_as_double(PyObject *module, PyObject *Py_UNUSED(ignored)) return _testcapi_test_long_as_double_impl(module); } -PyDoc_STRVAR(_testcapi_test_long_numbits__doc__, -"test_long_numbits($module, /)\n" -"--\n" -"\n"); - -#define _TESTCAPI_TEST_LONG_NUMBITS_METHODDEF \ - {"test_long_numbits", (PyCFunction)_testcapi_test_long_numbits, METH_NOARGS, _testcapi_test_long_numbits__doc__}, - -static PyObject * -_testcapi_test_long_numbits_impl(PyObject *module); - -static PyObject * -_testcapi_test_long_numbits(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - return _testcapi_test_long_numbits_impl(module); -} - PyDoc_STRVAR(_testcapi_call_long_compact_api__doc__, "call_long_compact_api($module, arg, /)\n" "--\n" @@ -165,4 +148,4 @@ PyDoc_STRVAR(_testcapi_PyLong_AsInt__doc__, #define _TESTCAPI_PYLONG_ASINT_METHODDEF \ {"PyLong_AsInt", (PyCFunction)_testcapi_PyLong_AsInt, METH_O, _testcapi_PyLong_AsInt__doc__}, -/*[clinic end generated code: output=31267ab2dd90aa1d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=de762870526e241d input=a9049054013a1b77]*/ diff --git a/Modules/_testcapi/long.c b/Modules/_testcapi/long.c index c1d2d42a2c434e..4362f431fc3f4d 100644 --- a/Modules/_testcapi/long.c +++ b/Modules/_testcapi/long.c @@ -4,7 +4,6 @@ #include "parts.h" #include "clinic/long.c.h" -#include "pycore_long.h" // _PyLong_Sign() /*[clinic input] module _testcapi @@ -535,57 +534,6 @@ _testcapi_test_long_as_double_impl(PyObject *module) return Py_None; } -/*[clinic input] -_testcapi.test_long_numbits -[clinic start generated code]*/ - -static PyObject * -_testcapi_test_long_numbits_impl(PyObject *module) -/*[clinic end generated code: output=9eaf8458cb15d7f7 input=265c02d48a13059e]*/ -{ - struct triple { - long input; - size_t nbits; - int sign; - } testcases[] = {{0, 0, 0}, - {1L, 1, 1}, - {-1L, 1, -1}, - {2L, 2, 1}, - {-2L, 2, -1}, - {3L, 2, 1}, - {-3L, 2, -1}, - {4L, 3, 1}, - {-4L, 3, -1}, - {0x7fffL, 15, 1}, /* one Python int digit */ - {-0x7fffL, 15, -1}, - {0xffffL, 16, 1}, - {-0xffffL, 16, -1}, - {0xfffffffL, 28, 1}, - {-0xfffffffL, 28, -1}}; - size_t i; - - for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) { - size_t nbits; - int sign; - PyObject *plong; - - plong = PyLong_FromLong(testcases[i].input); - if (plong == NULL) - return NULL; - nbits = _PyLong_NumBits(plong); - sign = _PyLong_Sign(plong); - - Py_DECREF(plong); - if (nbits != testcases[i].nbits) - return raiseTestError("test_long_numbits", - "wrong result for _PyLong_NumBits"); - if (sign != testcases[i].sign) - return raiseTestError("test_long_numbits", - "wrong result for _PyLong_Sign"); - } - Py_RETURN_NONE; -} - /*[clinic input] _testcapi.call_long_compact_api arg: object @@ -631,7 +579,6 @@ static PyMethodDef test_methods[] = { _TESTCAPI_TEST_LONG_AS_SIZE_T_METHODDEF _TESTCAPI_TEST_LONG_AS_UNSIGNED_LONG_LONG_MASK_METHODDEF _TESTCAPI_TEST_LONG_LONG_AND_OVERFLOW_METHODDEF - _TESTCAPI_TEST_LONG_NUMBITS_METHODDEF _TESTCAPI_TEST_LONGLONG_API_METHODDEF _TESTCAPI_CALL_LONG_COMPACT_API_METHODDEF _TESTCAPI_PYLONG_ASINT_METHODDEF diff --git a/Modules/_testcapi/parts.h b/Modules/_testcapi/parts.h index c162dbc65db81a..24abe54814e611 100644 --- a/Modules/_testcapi/parts.h +++ b/Modules/_testcapi/parts.h @@ -4,8 +4,24 @@ // Always enable assertions #undef NDEBUG +// The _testcapi extension tests the public C API: header files in Include/ and +// Include/cpython/ directories. The internal C API must not be tested by +// _testcapi: use _testinternalcapi for that. +// +// _testcapi C files can built with the Py_BUILD_CORE_BUILTIN macro defined if +// one of the Modules/Setup files asks to build _testcapi as "static" +// (gh-109723). +// +// The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE. +#undef Py_BUILD_CORE_MODULE +#undef Py_BUILD_CORE_BUILTIN + #include "Python.h" +#ifdef Py_BUILD_CORE +# error "_testcapi must test the public Python C API, not the internal C API" +#endif + int _PyTestCapi_Init_Vectorcall(PyObject *module); int _PyTestCapi_Init_Heaptype(PyObject *module); int _PyTestCapi_Init_Abstract(PyObject *module); diff --git a/Modules/_testcapi/pyatomic.c b/Modules/_testcapi/pyatomic.c index f0be2cfccccc98..5aedf687705707 100644 --- a/Modules/_testcapi/pyatomic.c +++ b/Modules/_testcapi/pyatomic.c @@ -4,10 +4,6 @@ * This only tests basic functionality, not any synchronizing ordering. */ -/* Always enable assertions */ -#undef NDEBUG - -#include "Python.h" #include "parts.h" // We define atomic bitwise operations on these types diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index f356fc5a6a016e..e09fd8806d2f64 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5,19 +5,13 @@ * standard Python regression test, via Lib/test/test_capi.py. */ -/* This module tests the public (Include/ and Include/cpython/) C API. - The internal C API must not be used here: use _testinternalcapi for that. - - The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE - macro defined, but only the public C API must be tested here. */ - -#undef Py_BUILD_CORE_MODULE -#undef Py_BUILD_CORE_BUILTIN - -/* Always enable assertions */ -#undef NDEBUG +// Include parts.h first since it takes care of NDEBUG and Py_BUILD_CORE macros +// and including Python.h. +// +// Several parts of this module are broken out into files in _testcapi/. +// Include definitions from there. +#include "_testcapi/parts.h" -#include "Python.h" #include "frameobject.h" // PyFrame_New() #include "marshal.h" // PyMarshal_WriteLongToFile() @@ -29,17 +23,10 @@ # include // W_STOPCODE #endif -#ifdef Py_BUILD_CORE -# error "_testcapi must test the public Python C API, not CPython internal C API" -#endif - #ifdef bool # error "The public headers should not include , see gh-48924" #endif -// Several parts of this module are broken out into files in _testcapi/. -// Include definitions from there. -#include "_testcapi/parts.h" #include "_testcapi/util.h" diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index f97b609f7ad2ef..c6b80fffdec16d 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -22,6 +22,7 @@ #include "pycore_hashtable.h" // _Py_hashtable_new() #include "pycore_initconfig.h" // _Py_GetConfigsAsDict() #include "pycore_interp.h" // _PyInterpreterState_GetConfigCopy() +#include "pycore_long.h" // _PyLong_Sign() #include "pycore_object.h" // _PyObject_IsFreed() #include "pycore_pathconfig.h" // _PyPathConfig_ClearGlobal() #include "pycore_pyerrors.h" // _PyErr_ChainExceptions1() @@ -1466,6 +1467,66 @@ _testinternalcapi_write_unraisable_exc_impl(PyObject *module, PyObject *exc, } +static PyObject * +raiseTestError(const char* test_name, const char* msg) +{ + PyErr_Format(PyExc_AssertionError, "%s: %s", test_name, msg); + return NULL; +} + + +/*[clinic input] +_testinternalcapi.test_long_numbits +[clinic start generated code]*/ + +static PyObject * +_testinternalcapi_test_long_numbits_impl(PyObject *module) +/*[clinic end generated code: output=745d62d120359434 input=f14ca6f638e44dad]*/ +{ + struct triple { + long input; + size_t nbits; + int sign; + } testcases[] = {{0, 0, 0}, + {1L, 1, 1}, + {-1L, 1, -1}, + {2L, 2, 1}, + {-2L, 2, -1}, + {3L, 2, 1}, + {-3L, 2, -1}, + {4L, 3, 1}, + {-4L, 3, -1}, + {0x7fffL, 15, 1}, /* one Python int digit */ + {-0x7fffL, 15, -1}, + {0xffffL, 16, 1}, + {-0xffffL, 16, -1}, + {0xfffffffL, 28, 1}, + {-0xfffffffL, 28, -1}}; + size_t i; + + for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) { + size_t nbits; + int sign; + PyObject *plong; + + plong = PyLong_FromLong(testcases[i].input); + if (plong == NULL) + return NULL; + nbits = _PyLong_NumBits(plong); + sign = _PyLong_Sign(plong); + + Py_DECREF(plong); + if (nbits != testcases[i].nbits) + return raiseTestError("test_long_numbits", + "wrong result for _PyLong_NumBits"); + if (sign != testcases[i].sign) + return raiseTestError("test_long_numbits", + "wrong result for _PyLong_Sign"); + } + Py_RETURN_NONE; +} + + static PyMethodDef module_functions[] = { {"get_configs", get_configs, METH_NOARGS}, {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, @@ -1521,6 +1582,7 @@ static PyMethodDef module_functions[] = { _PyCFunction_CAST(run_in_subinterp_with_config), METH_VARARGS | METH_KEYWORDS}, _TESTINTERNALCAPI_WRITE_UNRAISABLE_EXC_METHODDEF + _TESTINTERNALCAPI_TEST_LONG_NUMBITS_METHODDEF {NULL, NULL} /* sentinel */ }; diff --git a/Modules/clinic/_testinternalcapi.c.h b/Modules/clinic/_testinternalcapi.c.h index 38a3579d7dec77..c1b42672e13d53 100644 --- a/Modules/clinic/_testinternalcapi.c.h +++ b/Modules/clinic/_testinternalcapi.c.h @@ -296,4 +296,21 @@ _testinternalcapi_write_unraisable_exc(PyObject *module, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=c7156622e80df1ce input=a9049054013a1b77]*/ + +PyDoc_STRVAR(_testinternalcapi_test_long_numbits__doc__, +"test_long_numbits($module, /)\n" +"--\n" +"\n"); + +#define _TESTINTERNALCAPI_TEST_LONG_NUMBITS_METHODDEF \ + {"test_long_numbits", (PyCFunction)_testinternalcapi_test_long_numbits, METH_NOARGS, _testinternalcapi_test_long_numbits__doc__}, + +static PyObject * +_testinternalcapi_test_long_numbits_impl(PyObject *module); + +static PyObject * +_testinternalcapi_test_long_numbits(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return _testinternalcapi_test_long_numbits_impl(module); +} +/*[clinic end generated code: output=59144f59957627bd input=a9049054013a1b77]*/ diff --git a/Tools/c-analyzer/c_parser/preprocessor/gcc.py b/Tools/c-analyzer/c_parser/preprocessor/gcc.py index d206ceb43a268e..6ece70c77fd55c 100644 --- a/Tools/c-analyzer/c_parser/preprocessor/gcc.py +++ b/Tools/c-analyzer/c_parser/preprocessor/gcc.py @@ -3,18 +3,20 @@ from . import common as _common -# The following C files define the Py_LIMITED_API macro, and so must not be -# built with the Py_BUILD_CORE macro defined. -USE_LIMITED_C_API = frozenset(( +# The following C files must not built with Py_BUILD_CORE. +FILES_WITHOUT_INTERNAL_CAPI = frozenset(( # Modules/ '_testcapimodule.c', '_testclinic_limited.c', 'xxlimited.c', 'xxlimited_35.c', +)) +# C files in the fhe following directories must not be built with +# Py_BUILD_CORE. +DIRS_WITHOUT_INTERNAL_CAPI = frozenset(( # Modules/_testcapi/ - 'heaptype_relative.c', - 'vectorcall_limited.c', + '_testcapi', )) TOOL = 'gcc' @@ -75,7 +77,10 @@ def preprocess(filename, filename = _normpath(filename, cwd) postargs = POST_ARGS - if os.path.basename(filename) not in USE_LIMITED_C_API: + basename = os.path.basename(filename) + dirname = os.path.basename(os.path.dirname(filename)) + if (basename not in FILES_WITHOUT_INTERNAL_CAPI + and dirname not in DIRS_WITHOUT_INTERNAL_CAPI): postargs += ('-DPy_BUILD_CORE=1',) text = _common.preprocess( From 3e8fcb7df74248530c4280915c77e69811f69c3f Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Fri, 22 Sep 2023 15:56:07 +0100 Subject: [PATCH 302/357] ACKS: Fix ordering; Correct Itamar Oren's surname; Add Adam Turner (#109737) --- Misc/ACKS | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS index fd3c68b58a180c..b8a4f10347d74e 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -504,6 +504,7 @@ Daniel Ellis Phil Elson David Ely Victor van den Elzen +Vlad Emelianov Jeff Epler Tom Epperly Gökcen Eraslan @@ -1332,6 +1333,7 @@ Ethan Onstott Ken Jin Ooi Piet van Oostrum Tomas Oppelstrup +Itamar Oren Jason Orendorff Yan "yyyyyyyan" Orestes Bastien Orivel @@ -1342,7 +1344,6 @@ Michele Orrù Tomáš Orsava Oleg Oshmyan Denis Osipov -Itamar Ostricher Denis S. Otkidach Peter Otten Michael Otteneder @@ -1870,6 +1871,7 @@ Steven Troxler Brent Tubbs Anthony Tuininga Erno Tukia +Adam Turner David Turner Stephen Turner Itamar Turner-Trauring @@ -2077,7 +2079,5 @@ Jelle Zijlstra Gennadiy Zlobin Doug Zongker Peter Åstrand -Vlad Emelianov -Andrey Doroschenko (Entries should be added in rough alphabetical order by last names) From 73ccfa28c5e6ff68de15fdbb1321d4773a688e61 Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Fri, 22 Sep 2023 09:55:48 -0700 Subject: [PATCH 303/357] gh-109164: Replace `getopt` with `argparse` in pdb (#109165) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Victor Stinner --- Lib/pdb.py | 44 +++++++++++-------- ...-09-08-22-26-26.gh-issue-109164.-9BFWR.rst | 1 + 2 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-08-22-26-26.gh-issue-109164.-9BFWR.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index a391bc1df74d8e..fd62d246f124ab 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -2081,8 +2081,6 @@ def help(): pydoc.pager(__doc__) _usage = """\ -usage: pdb.py [-c command] ... [-m module | pyfile] [arg] ... - Debug the Python program given by pyfile. Alternatively, an executable module or package to debug can be specified using the -m switch. @@ -2097,34 +2095,44 @@ def help(): def main(): - import getopt - - opts, args = getopt.getopt(sys.argv[1:], 'mhc:', ['help', 'command=']) - - if not args: - print(_usage) + import argparse + + parser = argparse.ArgumentParser(prog="pdb", + description=_usage, + formatter_class=argparse.RawDescriptionHelpFormatter, + allow_abbrev=False) + + parser.add_argument('-c', '--command', action='append', default=[], metavar='command') + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('-m', metavar='module') + group.add_argument('pyfile', nargs='?') + parser.add_argument('args', nargs="*") + + if len(sys.argv) == 1: + # If no arguments were given (python -m pdb), print the whole help message. + # Without this check, argparse would only complain about missing required arguments. + parser.print_help() sys.exit(2) - if any(opt in ['-h', '--help'] for opt, optarg in opts): - print(_usage) - sys.exit() - - commands = [optarg for opt, optarg in opts if opt in ['-c', '--command']] + opts = parser.parse_args() - module_indicated = any(opt in ['-m'] for opt, optarg in opts) - cls = _ModuleTarget if module_indicated else _ScriptTarget - target = cls(args[0]) + if opts.m: + file = opts.m + target = _ModuleTarget(file) + else: + file = opts.pyfile + target = _ScriptTarget(file) target.check() - sys.argv[:] = args # Hide "pdb.py" and pdb options from argument list + sys.argv[:] = [file] + opts.args # Hide "pdb.py" and pdb options from argument list # Note on saving/restoring sys.argv: it's a good idea when sys.argv was # modified by the script being debugged. It's a bad idea when it was # changed by the user from the command line. There is a "restart" command # which allows explicit specification of command line arguments. pdb = Pdb() - pdb.rcLines.extend(commands) + pdb.rcLines.extend(opts.command) while True: try: pdb._run(target) diff --git a/Misc/NEWS.d/next/Library/2023-09-08-22-26-26.gh-issue-109164.-9BFWR.rst b/Misc/NEWS.d/next/Library/2023-09-08-22-26-26.gh-issue-109164.-9BFWR.rst new file mode 100644 index 00000000000000..b439c14ff535ff --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-08-22-26-26.gh-issue-109164.-9BFWR.rst @@ -0,0 +1 @@ +:mod:`pdb`: Replace :mod:`getopt` with :mod:`argparse` for parsing command line arguments. From 7c553991724d8d537f8444db73f016008753d77a Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Fri, 22 Sep 2023 17:59:35 +0100 Subject: [PATCH 304/357] gh-109719: Fix missing jump target labels when compiler reorders cold/warm blocks (#109734) --- Lib/test/test_compile.py | 11 +++++++++++ .../2023-09-22-13-38-17.gh-issue-109719.fx5OTz.rst | 1 + Python/flowgraph.c | 5 +++++ 3 files changed, 17 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-22-13-38-17.gh-issue-109719.fx5OTz.rst diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index f4e28559194dd6..d3a5517963c540 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -1261,6 +1261,17 @@ def f(): except: pass + def test_cold_block_moved_to_end(self): + # See gh-109719 + def f(): + while name: + try: + break + except: + pass + else: + 1 if 1 else 1 + @requires_debug_ranges() class TestSourcePositions(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-22-13-38-17.gh-issue-109719.fx5OTz.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-22-13-38-17.gh-issue-109719.fx5OTz.rst new file mode 100644 index 00000000000000..83be54c9ca793e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-22-13-38-17.gh-issue-109719.fx5OTz.rst @@ -0,0 +1 @@ +Fix missing jump target labels when compiler reorders cold/warm blocks. diff --git a/Python/flowgraph.c b/Python/flowgraph.c index 2df9b4811817f2..adfcef33895a53 100644 --- a/Python/flowgraph.c +++ b/Python/flowgraph.c @@ -2133,6 +2133,8 @@ push_cold_blocks_to_end(cfg_builder *g) { } RETURN_IF_ERROR(mark_cold(entryblock)); + int next_lbl = get_max_label(g->g_entryblock) + 1; + /* If we have a cold block with fallthrough to a warm block, add */ /* an explicit jump instead of fallthrough */ for (basicblock *b = entryblock; b != NULL; b = b->b_next) { @@ -2141,6 +2143,9 @@ push_cold_blocks_to_end(cfg_builder *g) { if (explicit_jump == NULL) { return ERROR; } + if (!IS_LABEL(b->b_next->b_label)) { + b->b_next->b_label.id = next_lbl++; + } basicblock_addop(explicit_jump, JUMP, b->b_next->b_label.id, NO_LOCATION); explicit_jump->b_cold = 1; explicit_jump->b_next = b->b_next; From b28ffaa193efc66f46ab90d383279174a11a11d7 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Fri, 22 Sep 2023 19:03:23 +0100 Subject: [PATCH 305/357] gh-109596: Ensure repeated rules in the grammar are not allowed and fix incorrect soft keywords (#109606) --- Grammar/python.gram | 11 +- Include/compile.h | 3 - Lib/test/test_peg_generator/test_pegen.py | 9 + ...-09-20-13-18-08.gh-issue-109596.RG0K2G.rst | 3 + Parser/parser.c | 2362 ++++++++--------- Parser/pegen_errors.c | 26 - Tools/peg_generator/pegen/grammar.py | 8 +- 7 files changed, 1203 insertions(+), 1219 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-20-13-18-08.gh-issue-109596.RG0K2G.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index ae998f98076a0a..73aaa796b075bc 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -19,8 +19,6 @@ _PyPegen_parse(Parser *p) result = eval_rule(p); } else if (p->start_rule == Py_func_type_input) { result = func_type_rule(p); - } else if (p->start_rule == Py_fstring_input) { - result = fstring_rule(p); } return result; @@ -89,7 +87,6 @@ file[mod_ty]: a=[statements] ENDMARKER { _PyPegen_make_module(p, a) } interactive[mod_ty]: a=statement_newline { _PyAST_Interactive(a, p->arena) } eval[mod_ty]: a=expressions NEWLINE* ENDMARKER { _PyAST_Expression(a, p->arena) } func_type[mod_ty]: '(' a=[type_expressions] ')' '->' b=expression NEWLINE* ENDMARKER { _PyAST_FunctionType(a, b, p->arena) } -fstring[expr_ty]: star_expressions # GENERAL STATEMENTS # ================== @@ -647,20 +644,20 @@ type_param_seq[asdl_type_param_seq*]: a[asdl_type_param_seq*]=','.type_param+ [' type_param[type_param_ty] (memo): | a=NAME b=[type_param_bound] { _PyAST_TypeVar(a->v.Name.id, b, EXTRA) } - | '*' a=NAME colon=":" e=expression { + | '*' a=NAME colon=':' e=expression { RAISE_SYNTAX_ERROR_STARTING_FROM(colon, e->kind == Tuple_kind ? "cannot use constraints with TypeVarTuple" : "cannot use bound with TypeVarTuple") } | '*' a=NAME { _PyAST_TypeVarTuple(a->v.Name.id, EXTRA) } - | '**' a=NAME colon=":" e=expression { + | '**' a=NAME colon=':' e=expression { RAISE_SYNTAX_ERROR_STARTING_FROM(colon, e->kind == Tuple_kind ? "cannot use constraints with ParamSpec" : "cannot use bound with ParamSpec") } | '**' a=NAME { _PyAST_ParamSpec(a->v.Name.id, EXTRA) } -type_param_bound[expr_ty]: ":" e=expression { e } +type_param_bound[expr_ty]: ':' e=expression { e } # EXPRESSIONS # ----------- @@ -915,7 +912,7 @@ fstring_middle[expr_ty]: | fstring_replacement_field | t=FSTRING_MIDDLE { _PyPegen_constant_from_token(p, t) } fstring_replacement_field[expr_ty]: - | '{' a=(yield_expr | star_expressions) debug_expr="="? conversion=[fstring_conversion] format=[fstring_full_format_spec] rbrace='}' { + | '{' a=(yield_expr | star_expressions) debug_expr='='? conversion=[fstring_conversion] format=[fstring_full_format_spec] rbrace='}' { _PyPegen_formatted_value(p, a, debug_expr, conversion, format, rbrace, EXTRA) } | invalid_replacement_field fstring_conversion[ResultTokenWithMetadata*]: diff --git a/Include/compile.h b/Include/compile.h index 3c5acd7209f763..52d0bc76c9fca4 100644 --- a/Include/compile.h +++ b/Include/compile.h @@ -10,9 +10,6 @@ extern "C" { #define Py_eval_input 258 #define Py_func_type_input 345 -/* This doesn't need to match anything */ -#define Py_fstring_input 800 - #ifndef Py_LIMITED_API # define Py_CPYTHON_COMPILE_H # include "cpython/compile.h" diff --git a/Lib/test/test_peg_generator/test_pegen.py b/Lib/test/test_peg_generator/test_pegen.py index 3af2c0cf47d20a..86db767b99a228 100644 --- a/Lib/test/test_peg_generator/test_pegen.py +++ b/Lib/test/test_peg_generator/test_pegen.py @@ -42,6 +42,15 @@ def test_parse_grammar(self) -> None: ) self.assertEqual(repr(rules["term"]), expected_repr) + def test_repeated_rules(self) -> None: + grammar_source = """ + start: the_rule NEWLINE + the_rule: 'b' NEWLINE + the_rule: 'a' NEWLINE + """ + with self.assertRaisesRegex(GrammarError, "Repeated rule 'the_rule'"): + parse_string(grammar_source, GrammarParser) + def test_long_rule_str(self) -> None: grammar_source = """ start: zero | one | one zero | one one | one zero zero | one zero one | one one zero | one one one diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-20-13-18-08.gh-issue-109596.RG0K2G.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-20-13-18-08.gh-issue-109596.RG0K2G.rst new file mode 100644 index 00000000000000..23ef73d578651d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-20-13-18-08.gh-issue-109596.RG0K2G.rst @@ -0,0 +1,3 @@ +Fix some tokens in the grammar that were incorrectly marked as soft +keywords. Also fix some repeated rule names and ensure that repeated rules +are not allowed. Patch by Pablo Galindo diff --git a/Parser/parser.c b/Parser/parser.c index e5847e7d1bd920..24f67f4dedfb1f 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -84,159 +84,159 @@ static char *soft_keywords[] = { #define interactive_type 1001 #define eval_type 1002 #define func_type_type 1003 -#define fstring_type 1004 -#define statements_type 1005 -#define statement_type 1006 -#define statement_newline_type 1007 -#define simple_stmts_type 1008 -#define simple_stmt_type 1009 -#define compound_stmt_type 1010 -#define assignment_type 1011 -#define annotated_rhs_type 1012 -#define augassign_type 1013 -#define return_stmt_type 1014 -#define raise_stmt_type 1015 -#define global_stmt_type 1016 -#define nonlocal_stmt_type 1017 -#define del_stmt_type 1018 -#define yield_stmt_type 1019 -#define assert_stmt_type 1020 -#define import_stmt_type 1021 -#define import_name_type 1022 -#define import_from_type 1023 -#define import_from_targets_type 1024 -#define import_from_as_names_type 1025 -#define import_from_as_name_type 1026 -#define dotted_as_names_type 1027 -#define dotted_as_name_type 1028 -#define dotted_name_type 1029 // Left-recursive -#define block_type 1030 -#define decorators_type 1031 -#define class_def_type 1032 -#define class_def_raw_type 1033 -#define function_def_type 1034 -#define function_def_raw_type 1035 -#define params_type 1036 -#define parameters_type 1037 -#define slash_no_default_type 1038 -#define slash_with_default_type 1039 -#define star_etc_type 1040 -#define kwds_type 1041 -#define param_no_default_type 1042 -#define param_no_default_star_annotation_type 1043 -#define param_with_default_type 1044 -#define param_maybe_default_type 1045 -#define param_type 1046 -#define param_star_annotation_type 1047 -#define annotation_type 1048 -#define star_annotation_type 1049 -#define default_type 1050 -#define if_stmt_type 1051 -#define elif_stmt_type 1052 -#define else_block_type 1053 -#define while_stmt_type 1054 -#define for_stmt_type 1055 -#define with_stmt_type 1056 -#define with_item_type 1057 -#define try_stmt_type 1058 -#define except_block_type 1059 -#define except_star_block_type 1060 -#define finally_block_type 1061 -#define match_stmt_type 1062 -#define subject_expr_type 1063 -#define case_block_type 1064 -#define guard_type 1065 -#define patterns_type 1066 -#define pattern_type 1067 -#define as_pattern_type 1068 -#define or_pattern_type 1069 -#define closed_pattern_type 1070 -#define literal_pattern_type 1071 -#define literal_expr_type 1072 -#define complex_number_type 1073 -#define signed_number_type 1074 -#define signed_real_number_type 1075 -#define real_number_type 1076 -#define imaginary_number_type 1077 -#define capture_pattern_type 1078 -#define pattern_capture_target_type 1079 -#define wildcard_pattern_type 1080 -#define value_pattern_type 1081 -#define attr_type 1082 // Left-recursive -#define name_or_attr_type 1083 // Left-recursive -#define group_pattern_type 1084 -#define sequence_pattern_type 1085 -#define open_sequence_pattern_type 1086 -#define maybe_sequence_pattern_type 1087 -#define maybe_star_pattern_type 1088 -#define star_pattern_type 1089 -#define mapping_pattern_type 1090 -#define items_pattern_type 1091 -#define key_value_pattern_type 1092 -#define double_star_pattern_type 1093 -#define class_pattern_type 1094 -#define positional_patterns_type 1095 -#define keyword_patterns_type 1096 -#define keyword_pattern_type 1097 -#define type_alias_type 1098 -#define type_params_type 1099 -#define type_param_seq_type 1100 -#define type_param_type 1101 -#define type_param_bound_type 1102 -#define expressions_type 1103 -#define expression_type 1104 -#define yield_expr_type 1105 -#define star_expressions_type 1106 -#define star_expression_type 1107 -#define star_named_expressions_type 1108 -#define star_named_expression_type 1109 -#define assignment_expression_type 1110 -#define named_expression_type 1111 -#define disjunction_type 1112 -#define conjunction_type 1113 -#define inversion_type 1114 -#define comparison_type 1115 -#define compare_op_bitwise_or_pair_type 1116 -#define eq_bitwise_or_type 1117 -#define noteq_bitwise_or_type 1118 -#define lte_bitwise_or_type 1119 -#define lt_bitwise_or_type 1120 -#define gte_bitwise_or_type 1121 -#define gt_bitwise_or_type 1122 -#define notin_bitwise_or_type 1123 -#define in_bitwise_or_type 1124 -#define isnot_bitwise_or_type 1125 -#define is_bitwise_or_type 1126 -#define bitwise_or_type 1127 // Left-recursive -#define bitwise_xor_type 1128 // Left-recursive -#define bitwise_and_type 1129 // Left-recursive -#define shift_expr_type 1130 // Left-recursive -#define sum_type 1131 // Left-recursive -#define term_type 1132 // Left-recursive -#define factor_type 1133 -#define power_type 1134 -#define await_primary_type 1135 -#define primary_type 1136 // Left-recursive -#define slices_type 1137 -#define slice_type 1138 -#define atom_type 1139 -#define group_type 1140 -#define lambdef_type 1141 -#define lambda_params_type 1142 -#define lambda_parameters_type 1143 -#define lambda_slash_no_default_type 1144 -#define lambda_slash_with_default_type 1145 -#define lambda_star_etc_type 1146 -#define lambda_kwds_type 1147 -#define lambda_param_no_default_type 1148 -#define lambda_param_with_default_type 1149 -#define lambda_param_maybe_default_type 1150 -#define lambda_param_type 1151 -#define fstring_middle_type 1152 -#define fstring_replacement_field_type 1153 -#define fstring_conversion_type 1154 -#define fstring_full_format_spec_type 1155 -#define fstring_format_spec_type 1156 +#define statements_type 1004 +#define statement_type 1005 +#define statement_newline_type 1006 +#define simple_stmts_type 1007 +#define simple_stmt_type 1008 +#define compound_stmt_type 1009 +#define assignment_type 1010 +#define annotated_rhs_type 1011 +#define augassign_type 1012 +#define return_stmt_type 1013 +#define raise_stmt_type 1014 +#define global_stmt_type 1015 +#define nonlocal_stmt_type 1016 +#define del_stmt_type 1017 +#define yield_stmt_type 1018 +#define assert_stmt_type 1019 +#define import_stmt_type 1020 +#define import_name_type 1021 +#define import_from_type 1022 +#define import_from_targets_type 1023 +#define import_from_as_names_type 1024 +#define import_from_as_name_type 1025 +#define dotted_as_names_type 1026 +#define dotted_as_name_type 1027 +#define dotted_name_type 1028 // Left-recursive +#define block_type 1029 +#define decorators_type 1030 +#define class_def_type 1031 +#define class_def_raw_type 1032 +#define function_def_type 1033 +#define function_def_raw_type 1034 +#define params_type 1035 +#define parameters_type 1036 +#define slash_no_default_type 1037 +#define slash_with_default_type 1038 +#define star_etc_type 1039 +#define kwds_type 1040 +#define param_no_default_type 1041 +#define param_no_default_star_annotation_type 1042 +#define param_with_default_type 1043 +#define param_maybe_default_type 1044 +#define param_type 1045 +#define param_star_annotation_type 1046 +#define annotation_type 1047 +#define star_annotation_type 1048 +#define default_type 1049 +#define if_stmt_type 1050 +#define elif_stmt_type 1051 +#define else_block_type 1052 +#define while_stmt_type 1053 +#define for_stmt_type 1054 +#define with_stmt_type 1055 +#define with_item_type 1056 +#define try_stmt_type 1057 +#define except_block_type 1058 +#define except_star_block_type 1059 +#define finally_block_type 1060 +#define match_stmt_type 1061 +#define subject_expr_type 1062 +#define case_block_type 1063 +#define guard_type 1064 +#define patterns_type 1065 +#define pattern_type 1066 +#define as_pattern_type 1067 +#define or_pattern_type 1068 +#define closed_pattern_type 1069 +#define literal_pattern_type 1070 +#define literal_expr_type 1071 +#define complex_number_type 1072 +#define signed_number_type 1073 +#define signed_real_number_type 1074 +#define real_number_type 1075 +#define imaginary_number_type 1076 +#define capture_pattern_type 1077 +#define pattern_capture_target_type 1078 +#define wildcard_pattern_type 1079 +#define value_pattern_type 1080 +#define attr_type 1081 // Left-recursive +#define name_or_attr_type 1082 // Left-recursive +#define group_pattern_type 1083 +#define sequence_pattern_type 1084 +#define open_sequence_pattern_type 1085 +#define maybe_sequence_pattern_type 1086 +#define maybe_star_pattern_type 1087 +#define star_pattern_type 1088 +#define mapping_pattern_type 1089 +#define items_pattern_type 1090 +#define key_value_pattern_type 1091 +#define double_star_pattern_type 1092 +#define class_pattern_type 1093 +#define positional_patterns_type 1094 +#define keyword_patterns_type 1095 +#define keyword_pattern_type 1096 +#define type_alias_type 1097 +#define type_params_type 1098 +#define type_param_seq_type 1099 +#define type_param_type 1100 +#define type_param_bound_type 1101 +#define expressions_type 1102 +#define expression_type 1103 +#define yield_expr_type 1104 +#define star_expressions_type 1105 +#define star_expression_type 1106 +#define star_named_expressions_type 1107 +#define star_named_expression_type 1108 +#define assignment_expression_type 1109 +#define named_expression_type 1110 +#define disjunction_type 1111 +#define conjunction_type 1112 +#define inversion_type 1113 +#define comparison_type 1114 +#define compare_op_bitwise_or_pair_type 1115 +#define eq_bitwise_or_type 1116 +#define noteq_bitwise_or_type 1117 +#define lte_bitwise_or_type 1118 +#define lt_bitwise_or_type 1119 +#define gte_bitwise_or_type 1120 +#define gt_bitwise_or_type 1121 +#define notin_bitwise_or_type 1122 +#define in_bitwise_or_type 1123 +#define isnot_bitwise_or_type 1124 +#define is_bitwise_or_type 1125 +#define bitwise_or_type 1126 // Left-recursive +#define bitwise_xor_type 1127 // Left-recursive +#define bitwise_and_type 1128 // Left-recursive +#define shift_expr_type 1129 // Left-recursive +#define sum_type 1130 // Left-recursive +#define term_type 1131 // Left-recursive +#define factor_type 1132 +#define power_type 1133 +#define await_primary_type 1134 +#define primary_type 1135 // Left-recursive +#define slices_type 1136 +#define slice_type 1137 +#define atom_type 1138 +#define group_type 1139 +#define lambdef_type 1140 +#define lambda_params_type 1141 +#define lambda_parameters_type 1142 +#define lambda_slash_no_default_type 1143 +#define lambda_slash_with_default_type 1144 +#define lambda_star_etc_type 1145 +#define lambda_kwds_type 1146 +#define lambda_param_no_default_type 1147 +#define lambda_param_with_default_type 1148 +#define lambda_param_maybe_default_type 1149 +#define lambda_param_type 1150 +#define fstring_middle_type 1151 +#define fstring_replacement_field_type 1152 +#define fstring_conversion_type 1153 +#define fstring_full_format_spec_type 1154 +#define fstring_format_spec_type 1155 +#define fstring_type 1156 #define string_type 1157 #define strings_type 1158 #define list_type 1159 @@ -326,10 +326,10 @@ static char *soft_keywords[] = { #define invalid_conversion_character_type 1243 #define _loop0_1_type 1244 #define _loop0_2_type 1245 -#define _loop0_3_type 1246 -#define _loop1_4_type 1247 -#define _loop0_6_type 1248 -#define _gather_5_type 1249 +#define _loop1_3_type 1246 +#define _loop0_5_type 1247 +#define _gather_4_type 1248 +#define _tmp_6_type 1249 #define _tmp_7_type 1250 #define _tmp_8_type 1251 #define _tmp_9_type 1252 @@ -337,106 +337,106 @@ static char *soft_keywords[] = { #define _tmp_11_type 1254 #define _tmp_12_type 1255 #define _tmp_13_type 1256 -#define _tmp_14_type 1257 -#define _loop1_15_type 1258 +#define _loop1_14_type 1257 +#define _tmp_15_type 1258 #define _tmp_16_type 1259 #define _tmp_17_type 1260 -#define _tmp_18_type 1261 -#define _loop0_20_type 1262 -#define _gather_19_type 1263 -#define _loop0_22_type 1264 -#define _gather_21_type 1265 +#define _loop0_19_type 1261 +#define _gather_18_type 1262 +#define _loop0_21_type 1263 +#define _gather_20_type 1264 +#define _tmp_22_type 1265 #define _tmp_23_type 1266 -#define _tmp_24_type 1267 -#define _loop0_25_type 1268 -#define _loop1_26_type 1269 -#define _loop0_28_type 1270 -#define _gather_27_type 1271 -#define _tmp_29_type 1272 -#define _loop0_31_type 1273 -#define _gather_30_type 1274 -#define _tmp_32_type 1275 -#define _loop1_33_type 1276 +#define _loop0_24_type 1267 +#define _loop1_25_type 1268 +#define _loop0_27_type 1269 +#define _gather_26_type 1270 +#define _tmp_28_type 1271 +#define _loop0_30_type 1272 +#define _gather_29_type 1273 +#define _tmp_31_type 1274 +#define _loop1_32_type 1275 +#define _tmp_33_type 1276 #define _tmp_34_type 1277 #define _tmp_35_type 1278 -#define _tmp_36_type 1279 +#define _loop0_36_type 1279 #define _loop0_37_type 1280 #define _loop0_38_type 1281 -#define _loop0_39_type 1282 -#define _loop1_40_type 1283 -#define _loop0_41_type 1284 +#define _loop1_39_type 1282 +#define _loop0_40_type 1283 +#define _loop1_41_type 1284 #define _loop1_42_type 1285 #define _loop1_43_type 1286 -#define _loop1_44_type 1287 -#define _loop0_45_type 1288 -#define _loop1_46_type 1289 -#define _loop0_47_type 1290 -#define _loop1_48_type 1291 +#define _loop0_44_type 1287 +#define _loop1_45_type 1288 +#define _loop0_46_type 1289 +#define _loop1_47_type 1290 +#define _loop0_48_type 1291 #define _loop0_49_type 1292 -#define _loop0_50_type 1293 -#define _loop1_51_type 1294 -#define _loop0_53_type 1295 -#define _gather_52_type 1296 -#define _loop0_55_type 1297 -#define _gather_54_type 1298 -#define _loop0_57_type 1299 -#define _gather_56_type 1300 -#define _loop0_59_type 1301 -#define _gather_58_type 1302 -#define _tmp_60_type 1303 +#define _loop1_50_type 1293 +#define _loop0_52_type 1294 +#define _gather_51_type 1295 +#define _loop0_54_type 1296 +#define _gather_53_type 1297 +#define _loop0_56_type 1298 +#define _gather_55_type 1299 +#define _loop0_58_type 1300 +#define _gather_57_type 1301 +#define _tmp_59_type 1302 +#define _loop1_60_type 1303 #define _loop1_61_type 1304 -#define _loop1_62_type 1305 +#define _tmp_62_type 1305 #define _tmp_63_type 1306 -#define _tmp_64_type 1307 -#define _loop1_65_type 1308 -#define _loop0_67_type 1309 -#define _gather_66_type 1310 +#define _loop1_64_type 1307 +#define _loop0_66_type 1308 +#define _gather_65_type 1309 +#define _tmp_67_type 1310 #define _tmp_68_type 1311 #define _tmp_69_type 1312 #define _tmp_70_type 1313 -#define _tmp_71_type 1314 -#define _loop0_73_type 1315 -#define _gather_72_type 1316 -#define _loop0_75_type 1317 -#define _gather_74_type 1318 -#define _tmp_76_type 1319 -#define _loop0_78_type 1320 -#define _gather_77_type 1321 -#define _loop0_80_type 1322 -#define _gather_79_type 1323 -#define _loop0_82_type 1324 -#define _gather_81_type 1325 +#define _loop0_72_type 1314 +#define _gather_71_type 1315 +#define _loop0_74_type 1316 +#define _gather_73_type 1317 +#define _tmp_75_type 1318 +#define _loop0_77_type 1319 +#define _gather_76_type 1320 +#define _loop0_79_type 1321 +#define _gather_78_type 1322 +#define _loop0_81_type 1323 +#define _gather_80_type 1324 +#define _loop1_82_type 1325 #define _loop1_83_type 1326 -#define _loop1_84_type 1327 -#define _loop0_86_type 1328 -#define _gather_85_type 1329 +#define _loop0_85_type 1327 +#define _gather_84_type 1328 +#define _loop1_86_type 1329 #define _loop1_87_type 1330 #define _loop1_88_type 1331 -#define _loop1_89_type 1332 -#define _tmp_90_type 1333 -#define _loop0_92_type 1334 -#define _gather_91_type 1335 +#define _tmp_89_type 1332 +#define _loop0_91_type 1333 +#define _gather_90_type 1334 +#define _tmp_92_type 1335 #define _tmp_93_type 1336 #define _tmp_94_type 1337 #define _tmp_95_type 1338 #define _tmp_96_type 1339 #define _tmp_97_type 1340 -#define _tmp_98_type 1341 +#define _loop0_98_type 1341 #define _loop0_99_type 1342 #define _loop0_100_type 1343 -#define _loop0_101_type 1344 -#define _loop1_102_type 1345 -#define _loop0_103_type 1346 +#define _loop1_101_type 1344 +#define _loop0_102_type 1345 +#define _loop1_103_type 1346 #define _loop1_104_type 1347 #define _loop1_105_type 1348 -#define _loop1_106_type 1349 -#define _loop0_107_type 1350 -#define _loop1_108_type 1351 -#define _loop0_109_type 1352 -#define _loop1_110_type 1353 -#define _loop0_111_type 1354 -#define _loop1_112_type 1355 -#define _tmp_113_type 1356 +#define _loop0_106_type 1349 +#define _loop1_107_type 1350 +#define _loop0_108_type 1351 +#define _loop1_109_type 1352 +#define _loop0_110_type 1353 +#define _loop1_111_type 1354 +#define _tmp_112_type 1355 +#define _loop0_113_type 1356 #define _loop0_114_type 1357 #define _loop1_115_type 1358 #define _tmp_116_type 1359 @@ -604,7 +604,6 @@ static mod_ty file_rule(Parser *p); static mod_ty interactive_rule(Parser *p); static mod_ty eval_rule(Parser *p); static mod_ty func_type_rule(Parser *p); -static expr_ty fstring_rule(Parser *p); static asdl_stmt_seq* statements_rule(Parser *p); static asdl_stmt_seq* statement_rule(Parser *p); static asdl_stmt_seq* statement_newline_rule(Parser *p); @@ -757,6 +756,7 @@ static expr_ty fstring_replacement_field_rule(Parser *p); static ResultTokenWithMetadata* fstring_conversion_rule(Parser *p); static ResultTokenWithMetadata* fstring_full_format_spec_rule(Parser *p); static expr_ty fstring_format_spec_rule(Parser *p); +static expr_ty fstring_rule(Parser *p); static expr_ty string_rule(Parser *p); static expr_ty strings_rule(Parser *p); static expr_ty list_rule(Parser *p); @@ -846,10 +846,10 @@ static void *invalid_replacement_field_rule(Parser *p); static void *invalid_conversion_character_rule(Parser *p); static asdl_seq *_loop0_1_rule(Parser *p); static asdl_seq *_loop0_2_rule(Parser *p); -static asdl_seq *_loop0_3_rule(Parser *p); -static asdl_seq *_loop1_4_rule(Parser *p); -static asdl_seq *_loop0_6_rule(Parser *p); -static asdl_seq *_gather_5_rule(Parser *p); +static asdl_seq *_loop1_3_rule(Parser *p); +static asdl_seq *_loop0_5_rule(Parser *p); +static asdl_seq *_gather_4_rule(Parser *p); +static void *_tmp_6_rule(Parser *p); static void *_tmp_7_rule(Parser *p); static void *_tmp_8_rule(Parser *p); static void *_tmp_9_rule(Parser *p); @@ -857,106 +857,106 @@ static void *_tmp_10_rule(Parser *p); static void *_tmp_11_rule(Parser *p); static void *_tmp_12_rule(Parser *p); static void *_tmp_13_rule(Parser *p); -static void *_tmp_14_rule(Parser *p); -static asdl_seq *_loop1_15_rule(Parser *p); +static asdl_seq *_loop1_14_rule(Parser *p); +static void *_tmp_15_rule(Parser *p); static void *_tmp_16_rule(Parser *p); static void *_tmp_17_rule(Parser *p); -static void *_tmp_18_rule(Parser *p); -static asdl_seq *_loop0_20_rule(Parser *p); -static asdl_seq *_gather_19_rule(Parser *p); -static asdl_seq *_loop0_22_rule(Parser *p); -static asdl_seq *_gather_21_rule(Parser *p); +static asdl_seq *_loop0_19_rule(Parser *p); +static asdl_seq *_gather_18_rule(Parser *p); +static asdl_seq *_loop0_21_rule(Parser *p); +static asdl_seq *_gather_20_rule(Parser *p); +static void *_tmp_22_rule(Parser *p); static void *_tmp_23_rule(Parser *p); -static void *_tmp_24_rule(Parser *p); -static asdl_seq *_loop0_25_rule(Parser *p); -static asdl_seq *_loop1_26_rule(Parser *p); -static asdl_seq *_loop0_28_rule(Parser *p); -static asdl_seq *_gather_27_rule(Parser *p); -static void *_tmp_29_rule(Parser *p); -static asdl_seq *_loop0_31_rule(Parser *p); -static asdl_seq *_gather_30_rule(Parser *p); -static void *_tmp_32_rule(Parser *p); -static asdl_seq *_loop1_33_rule(Parser *p); +static asdl_seq *_loop0_24_rule(Parser *p); +static asdl_seq *_loop1_25_rule(Parser *p); +static asdl_seq *_loop0_27_rule(Parser *p); +static asdl_seq *_gather_26_rule(Parser *p); +static void *_tmp_28_rule(Parser *p); +static asdl_seq *_loop0_30_rule(Parser *p); +static asdl_seq *_gather_29_rule(Parser *p); +static void *_tmp_31_rule(Parser *p); +static asdl_seq *_loop1_32_rule(Parser *p); +static void *_tmp_33_rule(Parser *p); static void *_tmp_34_rule(Parser *p); static void *_tmp_35_rule(Parser *p); -static void *_tmp_36_rule(Parser *p); +static asdl_seq *_loop0_36_rule(Parser *p); static asdl_seq *_loop0_37_rule(Parser *p); static asdl_seq *_loop0_38_rule(Parser *p); -static asdl_seq *_loop0_39_rule(Parser *p); -static asdl_seq *_loop1_40_rule(Parser *p); -static asdl_seq *_loop0_41_rule(Parser *p); +static asdl_seq *_loop1_39_rule(Parser *p); +static asdl_seq *_loop0_40_rule(Parser *p); +static asdl_seq *_loop1_41_rule(Parser *p); static asdl_seq *_loop1_42_rule(Parser *p); static asdl_seq *_loop1_43_rule(Parser *p); -static asdl_seq *_loop1_44_rule(Parser *p); -static asdl_seq *_loop0_45_rule(Parser *p); -static asdl_seq *_loop1_46_rule(Parser *p); -static asdl_seq *_loop0_47_rule(Parser *p); -static asdl_seq *_loop1_48_rule(Parser *p); +static asdl_seq *_loop0_44_rule(Parser *p); +static asdl_seq *_loop1_45_rule(Parser *p); +static asdl_seq *_loop0_46_rule(Parser *p); +static asdl_seq *_loop1_47_rule(Parser *p); +static asdl_seq *_loop0_48_rule(Parser *p); static asdl_seq *_loop0_49_rule(Parser *p); -static asdl_seq *_loop0_50_rule(Parser *p); -static asdl_seq *_loop1_51_rule(Parser *p); -static asdl_seq *_loop0_53_rule(Parser *p); -static asdl_seq *_gather_52_rule(Parser *p); -static asdl_seq *_loop0_55_rule(Parser *p); -static asdl_seq *_gather_54_rule(Parser *p); -static asdl_seq *_loop0_57_rule(Parser *p); -static asdl_seq *_gather_56_rule(Parser *p); -static asdl_seq *_loop0_59_rule(Parser *p); -static asdl_seq *_gather_58_rule(Parser *p); -static void *_tmp_60_rule(Parser *p); +static asdl_seq *_loop1_50_rule(Parser *p); +static asdl_seq *_loop0_52_rule(Parser *p); +static asdl_seq *_gather_51_rule(Parser *p); +static asdl_seq *_loop0_54_rule(Parser *p); +static asdl_seq *_gather_53_rule(Parser *p); +static asdl_seq *_loop0_56_rule(Parser *p); +static asdl_seq *_gather_55_rule(Parser *p); +static asdl_seq *_loop0_58_rule(Parser *p); +static asdl_seq *_gather_57_rule(Parser *p); +static void *_tmp_59_rule(Parser *p); +static asdl_seq *_loop1_60_rule(Parser *p); static asdl_seq *_loop1_61_rule(Parser *p); -static asdl_seq *_loop1_62_rule(Parser *p); +static void *_tmp_62_rule(Parser *p); static void *_tmp_63_rule(Parser *p); -static void *_tmp_64_rule(Parser *p); -static asdl_seq *_loop1_65_rule(Parser *p); -static asdl_seq *_loop0_67_rule(Parser *p); -static asdl_seq *_gather_66_rule(Parser *p); +static asdl_seq *_loop1_64_rule(Parser *p); +static asdl_seq *_loop0_66_rule(Parser *p); +static asdl_seq *_gather_65_rule(Parser *p); +static void *_tmp_67_rule(Parser *p); static void *_tmp_68_rule(Parser *p); static void *_tmp_69_rule(Parser *p); static void *_tmp_70_rule(Parser *p); -static void *_tmp_71_rule(Parser *p); -static asdl_seq *_loop0_73_rule(Parser *p); -static asdl_seq *_gather_72_rule(Parser *p); -static asdl_seq *_loop0_75_rule(Parser *p); -static asdl_seq *_gather_74_rule(Parser *p); -static void *_tmp_76_rule(Parser *p); -static asdl_seq *_loop0_78_rule(Parser *p); -static asdl_seq *_gather_77_rule(Parser *p); -static asdl_seq *_loop0_80_rule(Parser *p); -static asdl_seq *_gather_79_rule(Parser *p); -static asdl_seq *_loop0_82_rule(Parser *p); -static asdl_seq *_gather_81_rule(Parser *p); +static asdl_seq *_loop0_72_rule(Parser *p); +static asdl_seq *_gather_71_rule(Parser *p); +static asdl_seq *_loop0_74_rule(Parser *p); +static asdl_seq *_gather_73_rule(Parser *p); +static void *_tmp_75_rule(Parser *p); +static asdl_seq *_loop0_77_rule(Parser *p); +static asdl_seq *_gather_76_rule(Parser *p); +static asdl_seq *_loop0_79_rule(Parser *p); +static asdl_seq *_gather_78_rule(Parser *p); +static asdl_seq *_loop0_81_rule(Parser *p); +static asdl_seq *_gather_80_rule(Parser *p); +static asdl_seq *_loop1_82_rule(Parser *p); static asdl_seq *_loop1_83_rule(Parser *p); -static asdl_seq *_loop1_84_rule(Parser *p); -static asdl_seq *_loop0_86_rule(Parser *p); -static asdl_seq *_gather_85_rule(Parser *p); +static asdl_seq *_loop0_85_rule(Parser *p); +static asdl_seq *_gather_84_rule(Parser *p); +static asdl_seq *_loop1_86_rule(Parser *p); static asdl_seq *_loop1_87_rule(Parser *p); static asdl_seq *_loop1_88_rule(Parser *p); -static asdl_seq *_loop1_89_rule(Parser *p); -static void *_tmp_90_rule(Parser *p); -static asdl_seq *_loop0_92_rule(Parser *p); -static asdl_seq *_gather_91_rule(Parser *p); +static void *_tmp_89_rule(Parser *p); +static asdl_seq *_loop0_91_rule(Parser *p); +static asdl_seq *_gather_90_rule(Parser *p); +static void *_tmp_92_rule(Parser *p); static void *_tmp_93_rule(Parser *p); static void *_tmp_94_rule(Parser *p); static void *_tmp_95_rule(Parser *p); static void *_tmp_96_rule(Parser *p); static void *_tmp_97_rule(Parser *p); -static void *_tmp_98_rule(Parser *p); +static asdl_seq *_loop0_98_rule(Parser *p); static asdl_seq *_loop0_99_rule(Parser *p); static asdl_seq *_loop0_100_rule(Parser *p); -static asdl_seq *_loop0_101_rule(Parser *p); -static asdl_seq *_loop1_102_rule(Parser *p); -static asdl_seq *_loop0_103_rule(Parser *p); +static asdl_seq *_loop1_101_rule(Parser *p); +static asdl_seq *_loop0_102_rule(Parser *p); +static asdl_seq *_loop1_103_rule(Parser *p); static asdl_seq *_loop1_104_rule(Parser *p); static asdl_seq *_loop1_105_rule(Parser *p); -static asdl_seq *_loop1_106_rule(Parser *p); -static asdl_seq *_loop0_107_rule(Parser *p); -static asdl_seq *_loop1_108_rule(Parser *p); -static asdl_seq *_loop0_109_rule(Parser *p); -static asdl_seq *_loop1_110_rule(Parser *p); -static asdl_seq *_loop0_111_rule(Parser *p); -static asdl_seq *_loop1_112_rule(Parser *p); -static void *_tmp_113_rule(Parser *p); +static asdl_seq *_loop0_106_rule(Parser *p); +static asdl_seq *_loop1_107_rule(Parser *p); +static asdl_seq *_loop0_108_rule(Parser *p); +static asdl_seq *_loop1_109_rule(Parser *p); +static asdl_seq *_loop0_110_rule(Parser *p); +static asdl_seq *_loop1_111_rule(Parser *p); +static void *_tmp_112_rule(Parser *p); +static asdl_seq *_loop0_113_rule(Parser *p); static asdl_seq *_loop0_114_rule(Parser *p); static asdl_seq *_loop1_115_rule(Parser *p); static void *_tmp_116_rule(Parser *p); @@ -1320,55 +1320,6 @@ func_type_rule(Parser *p) return _res; } -// fstring: FSTRING_START fstring_middle* FSTRING_END -static expr_ty -fstring_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - _Pypegen_stack_overflow(p); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - expr_ty _res = NULL; - int _mark = p->mark; - { // FSTRING_START fstring_middle* FSTRING_END - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> fstring[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "FSTRING_START fstring_middle* FSTRING_END")); - Token * a; - asdl_seq * b; - Token * c; - if ( - (a = _PyPegen_expect_token(p, FSTRING_START)) // token='FSTRING_START' - && - (b = _loop0_3_rule(p)) // fstring_middle* - && - (c = _PyPegen_expect_token(p, FSTRING_END)) // token='FSTRING_END' - ) - { - D(fprintf(stderr, "%*c+ fstring[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "FSTRING_START fstring_middle* FSTRING_END")); - _res = _PyPegen_joined_str ( p , a , ( asdl_expr_seq* ) b , c ); - if (_res == NULL && PyErr_Occurred()) { - p->error_indicator = 1; - p->level--; - return NULL; - } - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s fstring[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_START fstring_middle* FSTRING_END")); - } - _res = NULL; - done: - p->level--; - return _res; -} - // statements: statement+ static asdl_stmt_seq* statements_rule(Parser *p) @@ -1390,7 +1341,7 @@ statements_rule(Parser *p) D(fprintf(stderr, "%*c> statements[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement+")); asdl_seq * a; if ( - (a = _loop1_4_rule(p)) // statement+ + (a = _loop1_3_rule(p)) // statement+ ) { D(fprintf(stderr, "%*c+ statements[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "statement+")); @@ -1663,7 +1614,7 @@ simple_stmts_rule(Parser *p) asdl_stmt_seq* a; Token * newline_var; if ( - (a = (asdl_stmt_seq*)_gather_5_rule(p)) // ';'.simple_stmt+ + (a = (asdl_stmt_seq*)_gather_4_rule(p)) // ';'.simple_stmt+ && (_opt_var = _PyPegen_expect_token(p, 13), !p->error_indicator) // ';'? && @@ -1831,7 +1782,7 @@ simple_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('import' | 'from') import_stmt")); stmt_ty import_stmt_var; if ( - _PyPegen_lookahead(1, _tmp_7_rule, p) + _PyPegen_lookahead(1, _tmp_6_rule, p) && (import_stmt_var = import_stmt_rule(p)) // import_stmt ) @@ -2105,7 +2056,7 @@ compound_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('def' | '@' | 'async') function_def")); stmt_ty function_def_var; if ( - _PyPegen_lookahead(1, _tmp_8_rule, p) + _PyPegen_lookahead(1, _tmp_7_rule, p) && (function_def_var = function_def_rule(p)) // function_def ) @@ -2147,7 +2098,7 @@ compound_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('class' | '@') class_def")); stmt_ty class_def_var; if ( - _PyPegen_lookahead(1, _tmp_9_rule, p) + _PyPegen_lookahead(1, _tmp_8_rule, p) && (class_def_var = class_def_rule(p)) // class_def ) @@ -2168,7 +2119,7 @@ compound_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('with' | 'async') with_stmt")); stmt_ty with_stmt_var; if ( - _PyPegen_lookahead(1, _tmp_10_rule, p) + _PyPegen_lookahead(1, _tmp_9_rule, p) && (with_stmt_var = with_stmt_rule(p)) // with_stmt ) @@ -2189,7 +2140,7 @@ compound_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('for' | 'async') for_stmt")); stmt_ty for_stmt_var; if ( - _PyPegen_lookahead(1, _tmp_11_rule, p) + _PyPegen_lookahead(1, _tmp_10_rule, p) && (for_stmt_var = for_stmt_rule(p)) // for_stmt ) @@ -2313,7 +2264,7 @@ assignment_rule(Parser *p) && (b = expression_rule(p)) // expression && - (c = _tmp_12_rule(p), !p->error_indicator) // ['=' annotated_rhs] + (c = _tmp_11_rule(p), !p->error_indicator) // ['=' annotated_rhs] ) { D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME ':' expression ['=' annotated_rhs]")); @@ -2349,13 +2300,13 @@ assignment_rule(Parser *p) expr_ty b; void *c; if ( - (a = _tmp_13_rule(p)) // '(' single_target ')' | single_subscript_attribute_target + (a = _tmp_12_rule(p)) // '(' single_target ')' | single_subscript_attribute_target && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && (b = expression_rule(p)) // expression && - (c = _tmp_14_rule(p), !p->error_indicator) // ['=' annotated_rhs] + (c = _tmp_13_rule(p), !p->error_indicator) // ['=' annotated_rhs] ) { D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs]")); @@ -2390,9 +2341,9 @@ assignment_rule(Parser *p) void *b; void *tc; if ( - (a = (asdl_expr_seq*)_loop1_15_rule(p)) // ((star_targets '='))+ + (a = (asdl_expr_seq*)_loop1_14_rule(p)) // ((star_targets '='))+ && - (b = _tmp_16_rule(p)) // yield_expr | star_expressions + (b = _tmp_15_rule(p)) // yield_expr | star_expressions && _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' && @@ -2438,7 +2389,7 @@ assignment_rule(Parser *p) && (_cut_var = 1) && - (c = _tmp_17_rule(p)) // yield_expr | star_expressions + (c = _tmp_16_rule(p)) // yield_expr | star_expressions ) { D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_target augassign ~ (yield_expr | star_expressions)")); @@ -2993,7 +2944,7 @@ raise_stmt_rule(Parser *p) && (a = expression_rule(p)) // expression && - (b = _tmp_18_rule(p), !p->error_indicator) // ['from' expression] + (b = _tmp_17_rule(p), !p->error_indicator) // ['from' expression] ) { D(fprintf(stderr, "%*c+ raise_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'raise' expression ['from' expression]")); @@ -3090,7 +3041,7 @@ global_stmt_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 526)) // token='global' && - (a = (asdl_expr_seq*)_gather_19_rule(p)) // ','.NAME+ + (a = (asdl_expr_seq*)_gather_18_rule(p)) // ','.NAME+ ) { D(fprintf(stderr, "%*c+ global_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'global' ','.NAME+")); @@ -3154,7 +3105,7 @@ nonlocal_stmt_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 527)) // token='nonlocal' && - (a = (asdl_expr_seq*)_gather_21_rule(p)) // ','.NAME+ + (a = (asdl_expr_seq*)_gather_20_rule(p)) // ','.NAME+ ) { D(fprintf(stderr, "%*c+ nonlocal_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'nonlocal' ','.NAME+")); @@ -3220,7 +3171,7 @@ del_stmt_rule(Parser *p) && (a = del_targets_rule(p)) // del_targets && - _PyPegen_lookahead(1, _tmp_23_rule, p) + _PyPegen_lookahead(1, _tmp_22_rule, p) ) { D(fprintf(stderr, "%*c+ del_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'del' del_targets &(';' | NEWLINE)")); @@ -3367,7 +3318,7 @@ assert_stmt_rule(Parser *p) && (a = expression_rule(p)) // expression && - (b = _tmp_24_rule(p), !p->error_indicator) // [',' expression] + (b = _tmp_23_rule(p), !p->error_indicator) // [',' expression] ) { D(fprintf(stderr, "%*c+ assert_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'assert' expression [',' expression]")); @@ -3576,7 +3527,7 @@ import_from_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 618)) // token='from' && - (a = _loop0_25_rule(p)) // (('.' | '...'))* + (a = _loop0_24_rule(p)) // (('.' | '...'))* && (b = dotted_name_rule(p)) // dotted_name && @@ -3620,7 +3571,7 @@ import_from_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 618)) // token='from' && - (a = _loop1_26_rule(p)) // (('.' | '...'))+ + (a = _loop1_25_rule(p)) // (('.' | '...'))+ && (_keyword_1 = _PyPegen_expect_token(p, 617)) // token='import' && @@ -3815,7 +3766,7 @@ import_from_as_names_rule(Parser *p) D(fprintf(stderr, "%*c> import_from_as_names[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.import_from_as_name+")); asdl_alias_seq* a; if ( - (a = (asdl_alias_seq*)_gather_27_rule(p)) // ','.import_from_as_name+ + (a = (asdl_alias_seq*)_gather_26_rule(p)) // ','.import_from_as_name+ ) { D(fprintf(stderr, "%*c+ import_from_as_names[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.import_from_as_name+")); @@ -3870,7 +3821,7 @@ import_from_as_name_rule(Parser *p) if ( (a = _PyPegen_name_token(p)) // NAME && - (b = _tmp_29_rule(p), !p->error_indicator) // ['as' NAME] + (b = _tmp_28_rule(p), !p->error_indicator) // ['as' NAME] ) { D(fprintf(stderr, "%*c+ import_from_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME ['as' NAME]")); @@ -3922,7 +3873,7 @@ dotted_as_names_rule(Parser *p) D(fprintf(stderr, "%*c> dotted_as_names[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.dotted_as_name+")); asdl_alias_seq* a; if ( - (a = (asdl_alias_seq*)_gather_30_rule(p)) // ','.dotted_as_name+ + (a = (asdl_alias_seq*)_gather_29_rule(p)) // ','.dotted_as_name+ ) { D(fprintf(stderr, "%*c+ dotted_as_names[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.dotted_as_name+")); @@ -3977,7 +3928,7 @@ dotted_as_name_rule(Parser *p) if ( (a = dotted_name_rule(p)) // dotted_name && - (b = _tmp_32_rule(p), !p->error_indicator) // ['as' NAME] + (b = _tmp_31_rule(p), !p->error_indicator) // ['as' NAME] ) { D(fprintf(stderr, "%*c+ dotted_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name ['as' NAME]")); @@ -4228,7 +4179,7 @@ decorators_rule(Parser *p) D(fprintf(stderr, "%*c> decorators[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(('@' named_expression NEWLINE))+")); asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_loop1_33_rule(p)) // (('@' named_expression NEWLINE))+ + (a = (asdl_expr_seq*)_loop1_32_rule(p)) // (('@' named_expression NEWLINE))+ ) { D(fprintf(stderr, "%*c+ decorators[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(('@' named_expression NEWLINE))+")); @@ -4377,7 +4328,7 @@ class_def_raw_rule(Parser *p) && (t = type_params_rule(p), !p->error_indicator) // type_params? && - (b = _tmp_34_rule(p), !p->error_indicator) // ['(' arguments? ')'] + (b = _tmp_33_rule(p), !p->error_indicator) // ['(' arguments? ')'] && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -4550,7 +4501,7 @@ function_def_raw_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' && - (a = _tmp_35_rule(p), !p->error_indicator) // ['->' expression] + (a = _tmp_34_rule(p), !p->error_indicator) // ['->' expression] && (_literal_2 = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && @@ -4613,7 +4564,7 @@ function_def_raw_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' && - (a = _tmp_36_rule(p), !p->error_indicator) // ['->' expression] + (a = _tmp_35_rule(p), !p->error_indicator) // ['->' expression] && (_literal_2 = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && @@ -4738,9 +4689,9 @@ parameters_rule(Parser *p) if ( (a = slash_no_default_rule(p)) // slash_no_default && - (b = (asdl_arg_seq*)_loop0_37_rule(p)) // param_no_default* + (b = (asdl_arg_seq*)_loop0_36_rule(p)) // param_no_default* && - (c = _loop0_38_rule(p)) // param_with_default* + (c = _loop0_37_rule(p)) // param_with_default* && (d = star_etc_rule(p), !p->error_indicator) // star_etc? ) @@ -4770,7 +4721,7 @@ parameters_rule(Parser *p) if ( (a = slash_with_default_rule(p)) // slash_with_default && - (b = _loop0_39_rule(p)) // param_with_default* + (b = _loop0_38_rule(p)) // param_with_default* && (c = star_etc_rule(p), !p->error_indicator) // star_etc? ) @@ -4798,9 +4749,9 @@ parameters_rule(Parser *p) asdl_seq * b; void *c; if ( - (a = (asdl_arg_seq*)_loop1_40_rule(p)) // param_no_default+ + (a = (asdl_arg_seq*)_loop1_39_rule(p)) // param_no_default+ && - (b = _loop0_41_rule(p)) // param_with_default* + (b = _loop0_40_rule(p)) // param_with_default* && (c = star_etc_rule(p), !p->error_indicator) // star_etc? ) @@ -4827,7 +4778,7 @@ parameters_rule(Parser *p) asdl_seq * a; void *b; if ( - (a = _loop1_42_rule(p)) // param_with_default+ + (a = _loop1_41_rule(p)) // param_with_default+ && (b = star_etc_rule(p), !p->error_indicator) // star_etc? ) @@ -4898,7 +4849,7 @@ slash_no_default_rule(Parser *p) Token * _literal_1; asdl_arg_seq* a; if ( - (a = (asdl_arg_seq*)_loop1_43_rule(p)) // param_no_default+ + (a = (asdl_arg_seq*)_loop1_42_rule(p)) // param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -4927,7 +4878,7 @@ slash_no_default_rule(Parser *p) Token * _literal; asdl_arg_seq* a; if ( - (a = (asdl_arg_seq*)_loop1_44_rule(p)) // param_no_default+ + (a = (asdl_arg_seq*)_loop1_43_rule(p)) // param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -4979,9 +4930,9 @@ slash_with_default_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _loop0_45_rule(p)) // param_no_default* + (a = _loop0_44_rule(p)) // param_no_default* && - (b = _loop1_46_rule(p)) // param_with_default+ + (b = _loop1_45_rule(p)) // param_with_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -5011,9 +4962,9 @@ slash_with_default_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _loop0_47_rule(p)) // param_no_default* + (a = _loop0_46_rule(p)) // param_no_default* && - (b = _loop1_48_rule(p)) // param_with_default+ + (b = _loop1_47_rule(p)) // param_with_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -5091,7 +5042,7 @@ star_etc_rule(Parser *p) && (a = param_no_default_rule(p)) // param_no_default && - (b = _loop0_49_rule(p)) // param_maybe_default* + (b = _loop0_48_rule(p)) // param_maybe_default* && (c = kwds_rule(p), !p->error_indicator) // kwds? ) @@ -5124,7 +5075,7 @@ star_etc_rule(Parser *p) && (a = param_no_default_star_annotation_rule(p)) // param_no_default_star_annotation && - (b = _loop0_50_rule(p)) // param_maybe_default* + (b = _loop0_49_rule(p)) // param_maybe_default* && (c = kwds_rule(p), !p->error_indicator) // kwds? ) @@ -5157,7 +5108,7 @@ star_etc_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' && - (b = _loop1_51_rule(p)) // param_maybe_default+ + (b = _loop1_50_rule(p)) // param_maybe_default+ && (c = kwds_rule(p), !p->error_indicator) // kwds? ) @@ -6584,7 +6535,7 @@ with_stmt_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = (asdl_withitem_seq*)_gather_52_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_51_rule(p)) // ','.with_item+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -6631,7 +6582,7 @@ with_stmt_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 629)) // token='with' && - (a = (asdl_withitem_seq*)_gather_54_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_53_rule(p)) // ','.with_item+ && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -6684,7 +6635,7 @@ with_stmt_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = (asdl_withitem_seq*)_gather_56_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_55_rule(p)) // ','.with_item+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -6734,7 +6685,7 @@ with_stmt_rule(Parser *p) && (_keyword_1 = _PyPegen_expect_token(p, 629)) // token='with' && - (a = (asdl_withitem_seq*)_gather_58_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_57_rule(p)) // ','.with_item+ && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -6822,7 +6773,7 @@ with_item_rule(Parser *p) && (t = star_target_rule(p)) // star_target && - _PyPegen_lookahead(1, _tmp_60_rule, p) + _PyPegen_lookahead(1, _tmp_59_rule, p) ) { D(fprintf(stderr, "%*c+ with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' star_target &(',' | ')' | ':')")); @@ -6993,7 +6944,7 @@ try_stmt_rule(Parser *p) && (b = block_rule(p)) // block && - (ex = (asdl_excepthandler_seq*)_loop1_61_rule(p)) // except_block+ + (ex = (asdl_excepthandler_seq*)_loop1_60_rule(p)) // except_block+ && (el = else_block_rule(p), !p->error_indicator) // else_block? && @@ -7041,7 +6992,7 @@ try_stmt_rule(Parser *p) && (b = block_rule(p)) // block && - (ex = (asdl_excepthandler_seq*)_loop1_62_rule(p)) // except_star_block+ + (ex = (asdl_excepthandler_seq*)_loop1_61_rule(p)) // except_star_block+ && (el = else_block_rule(p), !p->error_indicator) // else_block? && @@ -7137,7 +7088,7 @@ except_block_rule(Parser *p) && (e = expression_rule(p)) // expression && - (t = _tmp_63_rule(p), !p->error_indicator) // ['as' NAME] + (t = _tmp_62_rule(p), !p->error_indicator) // ['as' NAME] && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -7293,7 +7244,7 @@ except_star_block_rule(Parser *p) && (e = expression_rule(p)) // expression && - (t = _tmp_64_rule(p), !p->error_indicator) // ['as' NAME] + (t = _tmp_63_rule(p), !p->error_indicator) // ['as' NAME] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -7463,7 +7414,7 @@ match_stmt_rule(Parser *p) && (indent_var = _PyPegen_expect_token(p, INDENT)) // token='INDENT' && - (cases = (asdl_match_case_seq*)_loop1_65_rule(p)) // case_block+ + (cases = (asdl_match_case_seq*)_loop1_64_rule(p)) // case_block+ && (dedent_var = _PyPegen_expect_token(p, DEDENT)) // token='DEDENT' ) @@ -7974,7 +7925,7 @@ or_pattern_rule(Parser *p) D(fprintf(stderr, "%*c> or_pattern[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'|'.closed_pattern+")); asdl_pattern_seq* patterns; if ( - (patterns = (asdl_pattern_seq*)_gather_66_rule(p)) // '|'.closed_pattern+ + (patterns = (asdl_pattern_seq*)_gather_65_rule(p)) // '|'.closed_pattern+ ) { D(fprintf(stderr, "%*c+ or_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'|'.closed_pattern+")); @@ -8227,7 +8178,7 @@ literal_pattern_rule(Parser *p) if ( (value = signed_number_rule(p)) // signed_number && - _PyPegen_lookahead(0, _tmp_68_rule, p) + _PyPegen_lookahead(0, _tmp_67_rule, p) ) { D(fprintf(stderr, "%*c+ literal_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "signed_number !('+' | '-')")); @@ -8461,7 +8412,7 @@ literal_expr_rule(Parser *p) if ( (signed_number_var = signed_number_rule(p)) // signed_number && - _PyPegen_lookahead(0, _tmp_69_rule, p) + _PyPegen_lookahead(0, _tmp_68_rule, p) ) { D(fprintf(stderr, "%*c+ literal_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "signed_number !('+' | '-')")); @@ -9061,7 +9012,7 @@ pattern_capture_target_rule(Parser *p) && (name = _PyPegen_name_token(p)) // NAME && - _PyPegen_lookahead(0, _tmp_70_rule, p) + _PyPegen_lookahead(0, _tmp_69_rule, p) ) { D(fprintf(stderr, "%*c+ pattern_capture_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!\"_\" NAME !('.' | '(' | '=')")); @@ -9176,7 +9127,7 @@ value_pattern_rule(Parser *p) if ( (attr = attr_rule(p)) // attr && - _PyPegen_lookahead(0, _tmp_71_rule, p) + _PyPegen_lookahead(0, _tmp_70_rule, p) ) { D(fprintf(stderr, "%*c+ value_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "attr !('.' | '(' | '=')")); @@ -9595,7 +9546,7 @@ maybe_sequence_pattern_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_seq * patterns; if ( - (patterns = _gather_72_rule(p)) // ','.maybe_star_pattern+ + (patterns = _gather_71_rule(p)) // ','.maybe_star_pattern+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -10003,13 +9954,13 @@ items_pattern_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> items_pattern[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.key_value_pattern+")); - asdl_seq * _gather_74_var; + asdl_seq * _gather_73_var; if ( - (_gather_74_var = _gather_74_rule(p)) // ','.key_value_pattern+ + (_gather_73_var = _gather_73_rule(p)) // ','.key_value_pattern+ ) { D(fprintf(stderr, "%*c+ items_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.key_value_pattern+")); - _res = _gather_74_var; + _res = _gather_73_var; goto done; } p->mark = _mark; @@ -10045,7 +9996,7 @@ key_value_pattern_rule(Parser *p) void *key; pattern_ty pattern; if ( - (key = _tmp_76_rule(p)) // literal_expr | attr + (key = _tmp_75_rule(p)) // literal_expr | attr && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -10373,7 +10324,7 @@ positional_patterns_rule(Parser *p) D(fprintf(stderr, "%*c> positional_patterns[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.pattern+")); asdl_pattern_seq* args; if ( - (args = (asdl_pattern_seq*)_gather_77_rule(p)) // ','.pattern+ + (args = (asdl_pattern_seq*)_gather_76_rule(p)) // ','.pattern+ ) { D(fprintf(stderr, "%*c+ positional_patterns[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.pattern+")); @@ -10414,13 +10365,13 @@ keyword_patterns_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> keyword_patterns[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.keyword_pattern+")); - asdl_seq * _gather_79_var; + asdl_seq * _gather_78_var; if ( - (_gather_79_var = _gather_79_rule(p)) // ','.keyword_pattern+ + (_gather_78_var = _gather_78_rule(p)) // ','.keyword_pattern+ ) { D(fprintf(stderr, "%*c+ keyword_patterns[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.keyword_pattern+")); - _res = _gather_79_var; + _res = _gather_78_var; goto done; } p->mark = _mark; @@ -10627,7 +10578,7 @@ type_param_seq_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_type_param_seq* a; if ( - (a = (asdl_type_param_seq*)_gather_81_rule(p)) // ','.type_param+ + (a = (asdl_type_param_seq*)_gather_80_rule(p)) // ','.type_param+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -10653,9 +10604,9 @@ type_param_seq_rule(Parser *p) // type_param: // | NAME type_param_bound? -// | '*' NAME ":" expression +// | '*' NAME ':' expression // | '*' NAME -// | '**' NAME ":" expression +// | '**' NAME ':' expression // | '**' NAME static type_param_ty type_param_rule(Parser *p) @@ -10718,12 +10669,12 @@ type_param_rule(Parser *p) D(fprintf(stderr, "%*c%s type_param[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME type_param_bound?")); } - { // '*' NAME ":" expression + { // '*' NAME ':' expression if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> type_param[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' NAME \":\" expression")); + D(fprintf(stderr, "%*c> type_param[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' NAME ':' expression")); Token * _literal; expr_ty a; Token * colon; @@ -10738,7 +10689,7 @@ type_param_rule(Parser *p) (e = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ type_param[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' NAME \":\" expression")); + D(fprintf(stderr, "%*c+ type_param[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' NAME ':' expression")); _res = RAISE_SYNTAX_ERROR_STARTING_FROM ( colon , e -> kind == Tuple_kind ? "cannot use constraints with TypeVarTuple" : "cannot use bound with TypeVarTuple" ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -10749,7 +10700,7 @@ type_param_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s type_param[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' NAME \":\" expression")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' NAME ':' expression")); } { // '*' NAME if (p->error_indicator) { @@ -10787,12 +10738,12 @@ type_param_rule(Parser *p) D(fprintf(stderr, "%*c%s type_param[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' NAME")); } - { // '**' NAME ":" expression + { // '**' NAME ':' expression if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> type_param[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**' NAME \":\" expression")); + D(fprintf(stderr, "%*c> type_param[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**' NAME ':' expression")); Token * _literal; expr_ty a; Token * colon; @@ -10807,7 +10758,7 @@ type_param_rule(Parser *p) (e = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ type_param[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' NAME \":\" expression")); + D(fprintf(stderr, "%*c+ type_param[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' NAME ':' expression")); _res = RAISE_SYNTAX_ERROR_STARTING_FROM ( colon , e -> kind == Tuple_kind ? "cannot use constraints with ParamSpec" : "cannot use bound with ParamSpec" ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -10818,7 +10769,7 @@ type_param_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s type_param[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**' NAME \":\" expression")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**' NAME ':' expression")); } { // '**' NAME if (p->error_indicator) { @@ -10863,7 +10814,7 @@ type_param_rule(Parser *p) return _res; } -// type_param_bound: ":" expression +// type_param_bound: ':' expression static expr_ty type_param_bound_rule(Parser *p) { @@ -10876,12 +10827,12 @@ type_param_bound_rule(Parser *p) } expr_ty _res = NULL; int _mark = p->mark; - { // ":" expression + { // ':' expression if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> type_param_bound[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "\":\" expression")); + D(fprintf(stderr, "%*c> type_param_bound[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' expression")); Token * _literal; expr_ty e; if ( @@ -10890,7 +10841,7 @@ type_param_bound_rule(Parser *p) (e = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ type_param_bound[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "\":\" expression")); + D(fprintf(stderr, "%*c+ type_param_bound[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' expression")); _res = e; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -10901,7 +10852,7 @@ type_param_bound_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s type_param_bound[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "\":\" expression")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':' expression")); } _res = NULL; done: @@ -10944,7 +10895,7 @@ expressions_rule(Parser *p) if ( (a = expression_rule(p)) // expression && - (b = _loop1_83_rule(p)) // ((',' expression))+ + (b = _loop1_82_rule(p)) // ((',' expression))+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -11332,7 +11283,7 @@ star_expressions_rule(Parser *p) if ( (a = star_expression_rule(p)) // star_expression && - (b = _loop1_84_rule(p)) // ((',' star_expression))+ + (b = _loop1_83_rule(p)) // ((',' star_expression))+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -11531,7 +11482,7 @@ star_named_expressions_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_85_rule(p)) // ','.star_named_expression+ + (a = (asdl_expr_seq*)_gather_84_rule(p)) // ','.star_named_expression+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -11827,7 +11778,7 @@ disjunction_rule(Parser *p) if ( (a = conjunction_rule(p)) // conjunction && - (b = _loop1_87_rule(p)) // (('or' conjunction))+ + (b = _loop1_86_rule(p)) // (('or' conjunction))+ ) { D(fprintf(stderr, "%*c+ disjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "conjunction (('or' conjunction))+")); @@ -11915,7 +11866,7 @@ conjunction_rule(Parser *p) if ( (a = inversion_rule(p)) // inversion && - (b = _loop1_88_rule(p)) // (('and' inversion))+ + (b = _loop1_87_rule(p)) // (('and' inversion))+ ) { D(fprintf(stderr, "%*c+ conjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "inversion (('and' inversion))+")); @@ -12087,7 +12038,7 @@ comparison_rule(Parser *p) if ( (a = bitwise_or_rule(p)) // bitwise_or && - (b = _loop1_89_rule(p)) // compare_op_bitwise_or_pair+ + (b = _loop1_88_rule(p)) // compare_op_bitwise_or_pair+ ) { D(fprintf(stderr, "%*c+ comparison[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_or compare_op_bitwise_or_pair+")); @@ -12421,10 +12372,10 @@ noteq_bitwise_or_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> noteq_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('!=') bitwise_or")); - void *_tmp_90_var; + void *_tmp_89_var; expr_ty a; if ( - (_tmp_90_var = _tmp_90_rule(p)) // '!=' + (_tmp_89_var = _tmp_89_rule(p)) // '!=' && (a = bitwise_or_rule(p)) // bitwise_or ) @@ -14433,7 +14384,7 @@ slices_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_91_rule(p)) // ','.(slice | starred_expression)+ + (a = (asdl_expr_seq*)_gather_90_rule(p)) // ','.(slice | starred_expression)+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -14505,7 +14456,7 @@ slice_rule(Parser *p) && (b = expression_rule(p), !p->error_indicator) // expression? && - (c = _tmp_93_rule(p), !p->error_indicator) // [':' expression?] + (c = _tmp_92_rule(p), !p->error_indicator) // [':' expression?] ) { D(fprintf(stderr, "%*c+ slice[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression? ':' expression? [':' expression?]")); @@ -14718,7 +14669,7 @@ atom_rule(Parser *p) D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&(STRING | FSTRING_START) strings")); expr_ty strings_var; if ( - _PyPegen_lookahead(1, _tmp_94_rule, p) + _PyPegen_lookahead(1, _tmp_93_rule, p) && (strings_var = strings_rule(p)) // strings ) @@ -14756,15 +14707,15 @@ atom_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'(' (tuple | group | genexp)")); - void *_tmp_95_var; + void *_tmp_94_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 7) // token='(' && - (_tmp_95_var = _tmp_95_rule(p)) // tuple | group | genexp + (_tmp_94_var = _tmp_94_rule(p)) // tuple | group | genexp ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'(' (tuple | group | genexp)")); - _res = _tmp_95_var; + _res = _tmp_94_var; goto done; } p->mark = _mark; @@ -14777,15 +14728,15 @@ atom_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'[' (list | listcomp)")); - void *_tmp_96_var; + void *_tmp_95_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 9) // token='[' && - (_tmp_96_var = _tmp_96_rule(p)) // list | listcomp + (_tmp_95_var = _tmp_95_rule(p)) // list | listcomp ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'[' (list | listcomp)")); - _res = _tmp_96_var; + _res = _tmp_95_var; goto done; } p->mark = _mark; @@ -14798,15 +14749,15 @@ atom_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'{' (dict | set | dictcomp | setcomp)")); - void *_tmp_97_var; + void *_tmp_96_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 25) // token='{' && - (_tmp_97_var = _tmp_97_rule(p)) // dict | set | dictcomp | setcomp + (_tmp_96_var = _tmp_96_rule(p)) // dict | set | dictcomp | setcomp ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'{' (dict | set | dictcomp | setcomp)")); - _res = _tmp_97_var; + _res = _tmp_96_var; goto done; } p->mark = _mark; @@ -14877,7 +14828,7 @@ group_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = _tmp_98_rule(p)) // yield_expr | named_expression + (a = _tmp_97_rule(p)) // yield_expr | named_expression && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) @@ -15078,9 +15029,9 @@ lambda_parameters_rule(Parser *p) if ( (a = lambda_slash_no_default_rule(p)) // lambda_slash_no_default && - (b = (asdl_arg_seq*)_loop0_99_rule(p)) // lambda_param_no_default* + (b = (asdl_arg_seq*)_loop0_98_rule(p)) // lambda_param_no_default* && - (c = _loop0_100_rule(p)) // lambda_param_with_default* + (c = _loop0_99_rule(p)) // lambda_param_with_default* && (d = lambda_star_etc_rule(p), !p->error_indicator) // lambda_star_etc? ) @@ -15110,7 +15061,7 @@ lambda_parameters_rule(Parser *p) if ( (a = lambda_slash_with_default_rule(p)) // lambda_slash_with_default && - (b = _loop0_101_rule(p)) // lambda_param_with_default* + (b = _loop0_100_rule(p)) // lambda_param_with_default* && (c = lambda_star_etc_rule(p), !p->error_indicator) // lambda_star_etc? ) @@ -15138,9 +15089,9 @@ lambda_parameters_rule(Parser *p) asdl_seq * b; void *c; if ( - (a = (asdl_arg_seq*)_loop1_102_rule(p)) // lambda_param_no_default+ + (a = (asdl_arg_seq*)_loop1_101_rule(p)) // lambda_param_no_default+ && - (b = _loop0_103_rule(p)) // lambda_param_with_default* + (b = _loop0_102_rule(p)) // lambda_param_with_default* && (c = lambda_star_etc_rule(p), !p->error_indicator) // lambda_star_etc? ) @@ -15167,7 +15118,7 @@ lambda_parameters_rule(Parser *p) asdl_seq * a; void *b; if ( - (a = _loop1_104_rule(p)) // lambda_param_with_default+ + (a = _loop1_103_rule(p)) // lambda_param_with_default+ && (b = lambda_star_etc_rule(p), !p->error_indicator) // lambda_star_etc? ) @@ -15240,7 +15191,7 @@ lambda_slash_no_default_rule(Parser *p) Token * _literal_1; asdl_arg_seq* a; if ( - (a = (asdl_arg_seq*)_loop1_105_rule(p)) // lambda_param_no_default+ + (a = (asdl_arg_seq*)_loop1_104_rule(p)) // lambda_param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -15269,7 +15220,7 @@ lambda_slash_no_default_rule(Parser *p) Token * _literal; asdl_arg_seq* a; if ( - (a = (asdl_arg_seq*)_loop1_106_rule(p)) // lambda_param_no_default+ + (a = (asdl_arg_seq*)_loop1_105_rule(p)) // lambda_param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -15321,9 +15272,9 @@ lambda_slash_with_default_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _loop0_107_rule(p)) // lambda_param_no_default* + (a = _loop0_106_rule(p)) // lambda_param_no_default* && - (b = _loop1_108_rule(p)) // lambda_param_with_default+ + (b = _loop1_107_rule(p)) // lambda_param_with_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -15353,9 +15304,9 @@ lambda_slash_with_default_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _loop0_109_rule(p)) // lambda_param_no_default* + (a = _loop0_108_rule(p)) // lambda_param_no_default* && - (b = _loop1_110_rule(p)) // lambda_param_with_default+ + (b = _loop1_109_rule(p)) // lambda_param_with_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -15432,7 +15383,7 @@ lambda_star_etc_rule(Parser *p) && (a = lambda_param_no_default_rule(p)) // lambda_param_no_default && - (b = _loop0_111_rule(p)) // lambda_param_maybe_default* + (b = _loop0_110_rule(p)) // lambda_param_maybe_default* && (c = lambda_kwds_rule(p), !p->error_indicator) // lambda_kwds? ) @@ -15465,7 +15416,7 @@ lambda_star_etc_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' && - (b = _loop1_112_rule(p)) // lambda_param_maybe_default+ + (b = _loop1_111_rule(p)) // lambda_param_maybe_default+ && (c = lambda_kwds_rule(p), !p->error_indicator) // lambda_kwds? ) @@ -15930,7 +15881,7 @@ fstring_middle_rule(Parser *p) } // fstring_replacement_field: -// | '{' (yield_expr | star_expressions) "="? fstring_conversion? fstring_full_format_spec? '}' +// | '{' (yield_expr | star_expressions) '='? fstring_conversion? fstring_full_format_spec? '}' // | invalid_replacement_field static expr_ty fstring_replacement_field_rule(Parser *p) @@ -15953,12 +15904,12 @@ fstring_replacement_field_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // '{' (yield_expr | star_expressions) "="? fstring_conversion? fstring_full_format_spec? '}' + { // '{' (yield_expr | star_expressions) '='? fstring_conversion? fstring_full_format_spec? '}' if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> fstring_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) \"=\"? fstring_conversion? fstring_full_format_spec? '}'")); + D(fprintf(stderr, "%*c> fstring_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? fstring_conversion? fstring_full_format_spec? '}'")); Token * _literal; void *a; void *conversion; @@ -15968,9 +15919,9 @@ fstring_replacement_field_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' && - (a = _tmp_113_rule(p)) // yield_expr | star_expressions + (a = _tmp_112_rule(p)) // yield_expr | star_expressions && - (debug_expr = _PyPegen_expect_token(p, 22), !p->error_indicator) // "="? + (debug_expr = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? && (conversion = fstring_conversion_rule(p), !p->error_indicator) // fstring_conversion? && @@ -15979,7 +15930,7 @@ fstring_replacement_field_rule(Parser *p) (rbrace = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ fstring_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) \"=\"? fstring_conversion? fstring_full_format_spec? '}'")); + D(fprintf(stderr, "%*c+ fstring_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? fstring_conversion? fstring_full_format_spec? '}'")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { p->level--; @@ -15999,7 +15950,7 @@ fstring_replacement_field_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s fstring_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) \"=\"? fstring_conversion? fstring_full_format_spec? '}'")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) '='? fstring_conversion? fstring_full_format_spec? '}'")); } if (p->call_invalid_rules) { // invalid_replacement_field if (p->error_indicator) { @@ -16105,7 +16056,7 @@ fstring_full_format_spec_rule(Parser *p) if ( (colon = _PyPegen_expect_token(p, 11)) // token=':' && - (spec = _loop0_114_rule(p)) // fstring_format_spec* + (spec = _loop0_113_rule(p)) // fstring_format_spec* ) { D(fprintf(stderr, "%*c+ fstring_full_format_spec[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' fstring_format_spec*")); @@ -16198,6 +16149,55 @@ fstring_format_spec_rule(Parser *p) return _res; } +// fstring: FSTRING_START fstring_middle* FSTRING_END +static expr_ty +fstring_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + _Pypegen_stack_overflow(p); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // FSTRING_START fstring_middle* FSTRING_END + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "FSTRING_START fstring_middle* FSTRING_END")); + Token * a; + asdl_seq * b; + Token * c; + if ( + (a = _PyPegen_expect_token(p, FSTRING_START)) // token='FSTRING_START' + && + (b = _loop0_114_rule(p)) // fstring_middle* + && + (c = _PyPegen_expect_token(p, FSTRING_END)) // token='FSTRING_END' + ) + { + D(fprintf(stderr, "%*c+ fstring[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "FSTRING_START fstring_middle* FSTRING_END")); + _res = _PyPegen_joined_str ( p , a , ( asdl_expr_seq* ) b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_START fstring_middle* FSTRING_END")); + } + _res = NULL; + done: + p->level--; + return _res; +} + // string: STRING static expr_ty string_rule(Parser *p) @@ -25072,76 +25072,9 @@ _loop0_2_rule(Parser *p) return _seq; } -// _loop0_3: fstring_middle -static asdl_seq * -_loop0_3_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - _Pypegen_stack_overflow(p); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - void *_res = NULL; - int _mark = p->mark; - void **_children = PyMem_Malloc(sizeof(void *)); - if (!_children) { - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - Py_ssize_t _children_capacity = 1; - Py_ssize_t _n = 0; - { // fstring_middle - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _loop0_3[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_middle")); - expr_ty fstring_middle_var; - while ( - (fstring_middle_var = fstring_middle_rule(p)) // fstring_middle - ) - { - _res = fstring_middle_var; - if (_n == _children_capacity) { - _children_capacity *= 2; - void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); - if (!_new_children) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - _children = _new_children; - } - _children[_n++] = _res; - _mark = p->mark; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_3[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_middle")); - } - asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); - if (!_seq) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); - PyMem_Free(_children); - p->level--; - return _seq; -} - -// _loop1_4: statement +// _loop1_3: statement static asdl_seq * -_loop1_4_rule(Parser *p) +_loop1_3_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -25166,7 +25099,7 @@ _loop1_4_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_4[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement")); + D(fprintf(stderr, "%*c> _loop1_3[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement")); asdl_stmt_seq* statement_var; while ( (statement_var = statement_rule(p)) // statement @@ -25189,7 +25122,7 @@ _loop1_4_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_4[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_3[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "statement")); } if (_n == 0 || p->error_indicator) { @@ -25211,9 +25144,9 @@ _loop1_4_rule(Parser *p) return _seq; } -// _loop0_6: ';' simple_stmt +// _loop0_5: ';' simple_stmt static asdl_seq * -_loop0_6_rule(Parser *p) +_loop0_5_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -25238,7 +25171,7 @@ _loop0_6_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_6[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';' simple_stmt")); + D(fprintf(stderr, "%*c> _loop0_5[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';' simple_stmt")); Token * _literal; stmt_ty elem; while ( @@ -25270,7 +25203,7 @@ _loop0_6_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_6[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_5[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';' simple_stmt")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -25287,9 +25220,9 @@ _loop0_6_rule(Parser *p) return _seq; } -// _gather_5: simple_stmt _loop0_6 +// _gather_4: simple_stmt _loop0_5 static asdl_seq * -_gather_5_rule(Parser *p) +_gather_4_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -25300,27 +25233,27 @@ _gather_5_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // simple_stmt _loop0_6 + { // simple_stmt _loop0_5 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_5[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt _loop0_6")); + D(fprintf(stderr, "%*c> _gather_4[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt _loop0_5")); stmt_ty elem; asdl_seq * seq; if ( (elem = simple_stmt_rule(p)) // simple_stmt && - (seq = _loop0_6_rule(p)) // _loop0_6 + (seq = _loop0_5_rule(p)) // _loop0_5 ) { - D(fprintf(stderr, "%*c+ _gather_5[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt _loop0_6")); + D(fprintf(stderr, "%*c+ _gather_4[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt _loop0_5")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_5[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt _loop0_6")); + D(fprintf(stderr, "%*c%s _gather_4[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt _loop0_5")); } _res = NULL; done: @@ -25328,9 +25261,9 @@ _gather_5_rule(Parser *p) return _res; } -// _tmp_7: 'import' | 'from' +// _tmp_6: 'import' | 'from' static void * -_tmp_7_rule(Parser *p) +_tmp_6_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -25346,18 +25279,18 @@ _tmp_7_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import'")); + D(fprintf(stderr, "%*c> _tmp_6[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 617)) // token='import' ) { - D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'import'")); + D(fprintf(stderr, "%*c+ _tmp_6[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'import'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_7[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_6[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'import'")); } { // 'from' @@ -25365,18 +25298,18 @@ _tmp_7_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from'")); + D(fprintf(stderr, "%*c> _tmp_6[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 618)) // token='from' ) { - D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from'")); + D(fprintf(stderr, "%*c+ _tmp_6[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_7[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_6[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'from'")); } _res = NULL; @@ -25385,9 +25318,9 @@ _tmp_7_rule(Parser *p) return _res; } -// _tmp_8: 'def' | '@' | 'async' +// _tmp_7: 'def' | '@' | 'async' static void * -_tmp_8_rule(Parser *p) +_tmp_7_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -25403,18 +25336,18 @@ _tmp_8_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'def'")); + D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'def'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 669)) // token='def' ) { - D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'def'")); + D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'def'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_8[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_7[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'def'")); } { // '@' @@ -25422,18 +25355,18 @@ _tmp_8_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); + D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 49)) // token='@' ) { - D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); + D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_8[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_7[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@'")); } { // 'async' @@ -25441,18 +25374,18 @@ _tmp_8_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'")); + D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 668)) // token='async' ) { - D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'async'")); + D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'async'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_8[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_7[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'async'")); } _res = NULL; @@ -25461,9 +25394,9 @@ _tmp_8_rule(Parser *p) return _res; } -// _tmp_9: 'class' | '@' +// _tmp_8: 'class' | '@' static void * -_tmp_9_rule(Parser *p) +_tmp_8_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -25479,18 +25412,18 @@ _tmp_9_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'class'")); + D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'class'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 671)) // token='class' ) { - D(fprintf(stderr, "%*c+ _tmp_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'class'")); + D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'class'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_9[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_8[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'class'")); } { // '@' @@ -25498,18 +25431,18 @@ _tmp_9_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); + D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 49)) // token='@' ) { - D(fprintf(stderr, "%*c+ _tmp_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); + D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_9[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_8[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@'")); } _res = NULL; @@ -25518,9 +25451,9 @@ _tmp_9_rule(Parser *p) return _res; } -// _tmp_10: 'with' | 'async' +// _tmp_9: 'with' | 'async' static void * -_tmp_10_rule(Parser *p) +_tmp_9_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -25536,18 +25469,18 @@ _tmp_10_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with'")); + D(fprintf(stderr, "%*c> _tmp_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 629)) // token='with' ) { - D(fprintf(stderr, "%*c+ _tmp_10[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'with'")); + D(fprintf(stderr, "%*c+ _tmp_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'with'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_10[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_9[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'with'")); } { // 'async' @@ -25555,18 +25488,18 @@ _tmp_10_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'")); + D(fprintf(stderr, "%*c> _tmp_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 668)) // token='async' ) { - D(fprintf(stderr, "%*c+ _tmp_10[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'async'")); + D(fprintf(stderr, "%*c+ _tmp_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'async'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_10[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_9[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'async'")); } _res = NULL; @@ -25575,9 +25508,9 @@ _tmp_10_rule(Parser *p) return _res; } -// _tmp_11: 'for' | 'async' +// _tmp_10: 'for' | 'async' static void * -_tmp_11_rule(Parser *p) +_tmp_10_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -25593,18 +25526,18 @@ _tmp_11_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_11[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'for'")); + D(fprintf(stderr, "%*c> _tmp_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'for'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 666)) // token='for' ) { - D(fprintf(stderr, "%*c+ _tmp_11[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for'")); + D(fprintf(stderr, "%*c+ _tmp_10[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_11[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_10[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'for'")); } { // 'async' @@ -25612,18 +25545,18 @@ _tmp_11_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_11[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'")); + D(fprintf(stderr, "%*c> _tmp_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 668)) // token='async' ) { - D(fprintf(stderr, "%*c+ _tmp_11[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'async'")); + D(fprintf(stderr, "%*c+ _tmp_10[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'async'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_11[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_10[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'async'")); } _res = NULL; @@ -25632,9 +25565,9 @@ _tmp_11_rule(Parser *p) return _res; } -// _tmp_12: '=' annotated_rhs +// _tmp_11: '=' annotated_rhs static void * -_tmp_12_rule(Parser *p) +_tmp_11_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -25650,7 +25583,7 @@ _tmp_12_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_12[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + D(fprintf(stderr, "%*c> _tmp_11[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); Token * _literal; expr_ty d; if ( @@ -25659,7 +25592,7 @@ _tmp_12_rule(Parser *p) (d = annotated_rhs_rule(p)) // annotated_rhs ) { - D(fprintf(stderr, "%*c+ _tmp_12[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + D(fprintf(stderr, "%*c+ _tmp_11[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); _res = d; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25669,7 +25602,7 @@ _tmp_12_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_12[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_11[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'=' annotated_rhs")); } _res = NULL; @@ -25678,9 +25611,9 @@ _tmp_12_rule(Parser *p) return _res; } -// _tmp_13: '(' single_target ')' | single_subscript_attribute_target +// _tmp_12: '(' single_target ')' | single_subscript_attribute_target static void * -_tmp_13_rule(Parser *p) +_tmp_12_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -25696,7 +25629,7 @@ _tmp_13_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_13[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); + D(fprintf(stderr, "%*c> _tmp_12[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); Token * _literal; Token * _literal_1; expr_ty b; @@ -25708,7 +25641,7 @@ _tmp_13_rule(Parser *p) (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_13[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); + D(fprintf(stderr, "%*c+ _tmp_12[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); _res = b; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25718,7 +25651,7 @@ _tmp_13_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_13[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_12[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' single_target ')'")); } { // single_subscript_attribute_target @@ -25726,18 +25659,18 @@ _tmp_13_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_13[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); + D(fprintf(stderr, "%*c> _tmp_12[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); expr_ty single_subscript_attribute_target_var; if ( (single_subscript_attribute_target_var = single_subscript_attribute_target_rule(p)) // single_subscript_attribute_target ) { - D(fprintf(stderr, "%*c+ _tmp_13[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); + D(fprintf(stderr, "%*c+ _tmp_12[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); _res = single_subscript_attribute_target_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_13[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_12[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "single_subscript_attribute_target")); } _res = NULL; @@ -25746,9 +25679,9 @@ _tmp_13_rule(Parser *p) return _res; } -// _tmp_14: '=' annotated_rhs +// _tmp_13: '=' annotated_rhs static void * -_tmp_14_rule(Parser *p) +_tmp_13_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -25764,7 +25697,7 @@ _tmp_14_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_14[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + D(fprintf(stderr, "%*c> _tmp_13[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); Token * _literal; expr_ty d; if ( @@ -25773,7 +25706,7 @@ _tmp_14_rule(Parser *p) (d = annotated_rhs_rule(p)) // annotated_rhs ) { - D(fprintf(stderr, "%*c+ _tmp_14[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + D(fprintf(stderr, "%*c+ _tmp_13[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); _res = d; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25783,7 +25716,7 @@ _tmp_14_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_14[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_13[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'=' annotated_rhs")); } _res = NULL; @@ -25792,9 +25725,9 @@ _tmp_14_rule(Parser *p) return _res; } -// _loop1_15: (star_targets '=') +// _loop1_14: (star_targets '=') static asdl_seq * -_loop1_15_rule(Parser *p) +_loop1_14_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -25819,7 +25752,7 @@ _loop1_15_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + D(fprintf(stderr, "%*c> _loop1_14[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); void *_tmp_247_var; while ( (_tmp_247_var = _tmp_247_rule(p)) // star_targets '=' @@ -25842,7 +25775,7 @@ _loop1_15_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_15[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_14[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } if (_n == 0 || p->error_indicator) { @@ -25864,9 +25797,9 @@ _loop1_15_rule(Parser *p) return _seq; } -// _tmp_16: yield_expr | star_expressions +// _tmp_15: yield_expr | star_expressions static void * -_tmp_16_rule(Parser *p) +_tmp_15_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -25882,18 +25815,18 @@ _tmp_16_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_15[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_15[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -25901,18 +25834,18 @@ _tmp_16_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_15[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_15[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -25921,9 +25854,9 @@ _tmp_16_rule(Parser *p) return _res; } -// _tmp_17: yield_expr | star_expressions +// _tmp_16: yield_expr | star_expressions static void * -_tmp_17_rule(Parser *p) +_tmp_16_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -25939,18 +25872,18 @@ _tmp_17_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_17[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_17[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_17[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -25958,18 +25891,18 @@ _tmp_17_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_17[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_17[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_17[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -25978,9 +25911,9 @@ _tmp_17_rule(Parser *p) return _res; } -// _tmp_18: 'from' expression +// _tmp_17: 'from' expression static void * -_tmp_18_rule(Parser *p) +_tmp_17_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -25996,7 +25929,7 @@ _tmp_18_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_18[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from' expression")); + D(fprintf(stderr, "%*c> _tmp_17[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from' expression")); Token * _keyword; expr_ty z; if ( @@ -26005,7 +25938,7 @@ _tmp_18_rule(Parser *p) (z = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_18[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from' expression")); + D(fprintf(stderr, "%*c+ _tmp_17[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from' expression")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -26015,7 +25948,7 @@ _tmp_18_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_18[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_17[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'from' expression")); } _res = NULL; @@ -26024,9 +25957,9 @@ _tmp_18_rule(Parser *p) return _res; } -// _loop0_20: ',' NAME +// _loop0_19: ',' NAME static asdl_seq * -_loop0_20_rule(Parser *p) +_loop0_19_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26051,7 +25984,7 @@ _loop0_20_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_20[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); + D(fprintf(stderr, "%*c> _loop0_19[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); Token * _literal; expr_ty elem; while ( @@ -26083,7 +26016,7 @@ _loop0_20_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_20[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_19[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' NAME")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26100,9 +26033,9 @@ _loop0_20_rule(Parser *p) return _seq; } -// _gather_19: NAME _loop0_20 +// _gather_18: NAME _loop0_19 static asdl_seq * -_gather_19_rule(Parser *p) +_gather_18_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26113,27 +26046,27 @@ _gather_19_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // NAME _loop0_20 + { // NAME _loop0_19 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_19[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_20")); + D(fprintf(stderr, "%*c> _gather_18[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_19")); expr_ty elem; asdl_seq * seq; if ( (elem = _PyPegen_name_token(p)) // NAME && - (seq = _loop0_20_rule(p)) // _loop0_20 + (seq = _loop0_19_rule(p)) // _loop0_19 ) { - D(fprintf(stderr, "%*c+ _gather_19[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_20")); + D(fprintf(stderr, "%*c+ _gather_18[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_19")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_19[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_20")); + D(fprintf(stderr, "%*c%s _gather_18[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_19")); } _res = NULL; done: @@ -26141,9 +26074,9 @@ _gather_19_rule(Parser *p) return _res; } -// _loop0_22: ',' NAME +// _loop0_21: ',' NAME static asdl_seq * -_loop0_22_rule(Parser *p) +_loop0_21_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26168,7 +26101,7 @@ _loop0_22_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); + D(fprintf(stderr, "%*c> _loop0_21[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); Token * _literal; expr_ty elem; while ( @@ -26200,7 +26133,7 @@ _loop0_22_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_22[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_21[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' NAME")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26217,9 +26150,9 @@ _loop0_22_rule(Parser *p) return _seq; } -// _gather_21: NAME _loop0_22 +// _gather_20: NAME _loop0_21 static asdl_seq * -_gather_21_rule(Parser *p) +_gather_20_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26230,27 +26163,27 @@ _gather_21_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // NAME _loop0_22 + { // NAME _loop0_21 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_21[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_22")); + D(fprintf(stderr, "%*c> _gather_20[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_21")); expr_ty elem; asdl_seq * seq; if ( (elem = _PyPegen_name_token(p)) // NAME && - (seq = _loop0_22_rule(p)) // _loop0_22 + (seq = _loop0_21_rule(p)) // _loop0_21 ) { - D(fprintf(stderr, "%*c+ _gather_21[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_22")); + D(fprintf(stderr, "%*c+ _gather_20[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_21")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_21[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_22")); + D(fprintf(stderr, "%*c%s _gather_20[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_21")); } _res = NULL; done: @@ -26258,9 +26191,9 @@ _gather_21_rule(Parser *p) return _res; } -// _tmp_23: ';' | NEWLINE +// _tmp_22: ';' | NEWLINE static void * -_tmp_23_rule(Parser *p) +_tmp_22_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26276,18 +26209,18 @@ _tmp_23_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_23[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';'")); + D(fprintf(stderr, "%*c> _tmp_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 13)) // token=';' ) { - D(fprintf(stderr, "%*c+ _tmp_23[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "';'")); + D(fprintf(stderr, "%*c+ _tmp_22[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "';'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_23[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_22[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';'")); } { // NEWLINE @@ -26295,18 +26228,18 @@ _tmp_23_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_23[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); Token * newline_var; if ( (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_23[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_22[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); _res = newline_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_23[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_22[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); } _res = NULL; @@ -26315,9 +26248,9 @@ _tmp_23_rule(Parser *p) return _res; } -// _tmp_24: ',' expression +// _tmp_23: ',' expression static void * -_tmp_24_rule(Parser *p) +_tmp_23_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26333,7 +26266,7 @@ _tmp_24_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_24[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _tmp_23[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty z; if ( @@ -26342,7 +26275,7 @@ _tmp_24_rule(Parser *p) (z = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_24[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c+ _tmp_23[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -26352,7 +26285,7 @@ _tmp_24_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_24[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_23[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } _res = NULL; @@ -26361,9 +26294,9 @@ _tmp_24_rule(Parser *p) return _res; } -// _loop0_25: ('.' | '...') +// _loop0_24: ('.' | '...') static asdl_seq * -_loop0_25_rule(Parser *p) +_loop0_24_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26388,7 +26321,7 @@ _loop0_25_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_25[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); + D(fprintf(stderr, "%*c> _loop0_24[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); void *_tmp_248_var; while ( (_tmp_248_var = _tmp_248_rule(p)) // '.' | '...' @@ -26411,7 +26344,7 @@ _loop0_25_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_25[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_24[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26428,9 +26361,9 @@ _loop0_25_rule(Parser *p) return _seq; } -// _loop1_26: ('.' | '...') +// _loop1_25: ('.' | '...') static asdl_seq * -_loop1_26_rule(Parser *p) +_loop1_25_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26455,7 +26388,7 @@ _loop1_26_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_26[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); + D(fprintf(stderr, "%*c> _loop1_25[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); void *_tmp_249_var; while ( (_tmp_249_var = _tmp_249_rule(p)) // '.' | '...' @@ -26478,7 +26411,7 @@ _loop1_26_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_26[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_25[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')")); } if (_n == 0 || p->error_indicator) { @@ -26500,9 +26433,9 @@ _loop1_26_rule(Parser *p) return _seq; } -// _loop0_28: ',' import_from_as_name +// _loop0_27: ',' import_from_as_name static asdl_seq * -_loop0_28_rule(Parser *p) +_loop0_27_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26527,7 +26460,7 @@ _loop0_28_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_28[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' import_from_as_name")); + D(fprintf(stderr, "%*c> _loop0_27[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' import_from_as_name")); Token * _literal; alias_ty elem; while ( @@ -26559,7 +26492,7 @@ _loop0_28_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_28[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_27[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' import_from_as_name")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26576,9 +26509,9 @@ _loop0_28_rule(Parser *p) return _seq; } -// _gather_27: import_from_as_name _loop0_28 +// _gather_26: import_from_as_name _loop0_27 static asdl_seq * -_gather_27_rule(Parser *p) +_gather_26_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26589,27 +26522,27 @@ _gather_27_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // import_from_as_name _loop0_28 + { // import_from_as_name _loop0_27 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_27[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_28")); + D(fprintf(stderr, "%*c> _gather_26[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_27")); alias_ty elem; asdl_seq * seq; if ( (elem = import_from_as_name_rule(p)) // import_from_as_name && - (seq = _loop0_28_rule(p)) // _loop0_28 + (seq = _loop0_27_rule(p)) // _loop0_27 ) { - D(fprintf(stderr, "%*c+ _gather_27[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_28")); + D(fprintf(stderr, "%*c+ _gather_26[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_27")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_27[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_from_as_name _loop0_28")); + D(fprintf(stderr, "%*c%s _gather_26[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_from_as_name _loop0_27")); } _res = NULL; done: @@ -26617,9 +26550,9 @@ _gather_27_rule(Parser *p) return _res; } -// _tmp_29: 'as' NAME +// _tmp_28: 'as' NAME static void * -_tmp_29_rule(Parser *p) +_tmp_28_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26635,7 +26568,7 @@ _tmp_29_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_29[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_28[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty z; if ( @@ -26644,7 +26577,7 @@ _tmp_29_rule(Parser *p) (z = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_29[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_28[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -26654,7 +26587,7 @@ _tmp_29_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_29[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_28[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -26663,9 +26596,9 @@ _tmp_29_rule(Parser *p) return _res; } -// _loop0_31: ',' dotted_as_name +// _loop0_30: ',' dotted_as_name static asdl_seq * -_loop0_31_rule(Parser *p) +_loop0_30_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26690,7 +26623,7 @@ _loop0_31_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_31[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' dotted_as_name")); + D(fprintf(stderr, "%*c> _loop0_30[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' dotted_as_name")); Token * _literal; alias_ty elem; while ( @@ -26722,7 +26655,7 @@ _loop0_31_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_31[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_30[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' dotted_as_name")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26739,9 +26672,9 @@ _loop0_31_rule(Parser *p) return _seq; } -// _gather_30: dotted_as_name _loop0_31 +// _gather_29: dotted_as_name _loop0_30 static asdl_seq * -_gather_30_rule(Parser *p) +_gather_29_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26752,27 +26685,27 @@ _gather_30_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // dotted_as_name _loop0_31 + { // dotted_as_name _loop0_30 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_30[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_31")); + D(fprintf(stderr, "%*c> _gather_29[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_30")); alias_ty elem; asdl_seq * seq; if ( (elem = dotted_as_name_rule(p)) // dotted_as_name && - (seq = _loop0_31_rule(p)) // _loop0_31 + (seq = _loop0_30_rule(p)) // _loop0_30 ) { - D(fprintf(stderr, "%*c+ _gather_30[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_31")); + D(fprintf(stderr, "%*c+ _gather_29[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_30")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_30[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_as_name _loop0_31")); + D(fprintf(stderr, "%*c%s _gather_29[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_as_name _loop0_30")); } _res = NULL; done: @@ -26780,9 +26713,9 @@ _gather_30_rule(Parser *p) return _res; } -// _tmp_32: 'as' NAME +// _tmp_31: 'as' NAME static void * -_tmp_32_rule(Parser *p) +_tmp_31_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26798,7 +26731,7 @@ _tmp_32_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_32[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_31[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty z; if ( @@ -26807,7 +26740,7 @@ _tmp_32_rule(Parser *p) (z = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_32[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_31[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -26817,7 +26750,7 @@ _tmp_32_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_32[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_31[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -26826,9 +26759,9 @@ _tmp_32_rule(Parser *p) return _res; } -// _loop1_33: ('@' named_expression NEWLINE) +// _loop1_32: ('@' named_expression NEWLINE) static asdl_seq * -_loop1_33_rule(Parser *p) +_loop1_32_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26853,7 +26786,7 @@ _loop1_33_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_33[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); + D(fprintf(stderr, "%*c> _loop1_32[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); void *_tmp_250_var; while ( (_tmp_250_var = _tmp_250_rule(p)) // '@' named_expression NEWLINE @@ -26876,7 +26809,7 @@ _loop1_33_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_33[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_32[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('@' named_expression NEWLINE)")); } if (_n == 0 || p->error_indicator) { @@ -26898,9 +26831,9 @@ _loop1_33_rule(Parser *p) return _seq; } -// _tmp_34: '(' arguments? ')' +// _tmp_33: '(' arguments? ')' static void * -_tmp_34_rule(Parser *p) +_tmp_33_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26916,7 +26849,7 @@ _tmp_34_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_34[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c> _tmp_33[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); Token * _literal; Token * _literal_1; void *z; @@ -26928,7 +26861,7 @@ _tmp_34_rule(Parser *p) (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_34[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c+ _tmp_33[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -26938,7 +26871,7 @@ _tmp_34_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_34[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_33[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' arguments? ')'")); } _res = NULL; @@ -26947,9 +26880,9 @@ _tmp_34_rule(Parser *p) return _res; } -// _tmp_35: '->' expression +// _tmp_34: '->' expression static void * -_tmp_35_rule(Parser *p) +_tmp_34_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -26965,7 +26898,7 @@ _tmp_35_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_35[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c> _tmp_34[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); Token * _literal; expr_ty z; if ( @@ -26974,7 +26907,7 @@ _tmp_35_rule(Parser *p) (z = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_35[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c+ _tmp_34[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -26984,7 +26917,7 @@ _tmp_35_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_35[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_34[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'->' expression")); } _res = NULL; @@ -26993,9 +26926,9 @@ _tmp_35_rule(Parser *p) return _res; } -// _tmp_36: '->' expression +// _tmp_35: '->' expression static void * -_tmp_36_rule(Parser *p) +_tmp_35_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -27011,7 +26944,7 @@ _tmp_36_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_36[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c> _tmp_35[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); Token * _literal; expr_ty z; if ( @@ -27020,7 +26953,7 @@ _tmp_36_rule(Parser *p) (z = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_36[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c+ _tmp_35[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -27030,7 +26963,7 @@ _tmp_36_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_36[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_35[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'->' expression")); } _res = NULL; @@ -27039,9 +26972,9 @@ _tmp_36_rule(Parser *p) return _res; } -// _loop0_37: param_no_default +// _loop0_36: param_no_default static asdl_seq * -_loop0_37_rule(Parser *p) +_loop0_36_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -27066,7 +26999,7 @@ _loop0_37_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_37[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_36[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -27089,7 +27022,7 @@ _loop0_37_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_37[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_36[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -27106,9 +27039,9 @@ _loop0_37_rule(Parser *p) return _seq; } -// _loop0_38: param_with_default +// _loop0_37: param_with_default static asdl_seq * -_loop0_38_rule(Parser *p) +_loop0_37_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -27133,7 +27066,7 @@ _loop0_38_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_38[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop0_37[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -27156,7 +27089,7 @@ _loop0_38_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_38[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_37[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -27173,9 +27106,9 @@ _loop0_38_rule(Parser *p) return _seq; } -// _loop0_39: param_with_default +// _loop0_38: param_with_default static asdl_seq * -_loop0_39_rule(Parser *p) +_loop0_38_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -27200,7 +27133,7 @@ _loop0_39_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_39[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop0_38[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -27223,7 +27156,7 @@ _loop0_39_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_39[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_38[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -27240,9 +27173,9 @@ _loop0_39_rule(Parser *p) return _seq; } -// _loop1_40: param_no_default +// _loop1_39: param_no_default static asdl_seq * -_loop1_40_rule(Parser *p) +_loop1_39_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -27267,7 +27200,7 @@ _loop1_40_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_40[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop1_39[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -27290,7 +27223,7 @@ _loop1_40_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_40[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_39[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -27312,9 +27245,9 @@ _loop1_40_rule(Parser *p) return _seq; } -// _loop0_41: param_with_default +// _loop0_40: param_with_default static asdl_seq * -_loop0_41_rule(Parser *p) +_loop0_40_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -27339,7 +27272,7 @@ _loop0_41_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_41[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop0_40[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -27362,7 +27295,7 @@ _loop0_41_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_41[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_40[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -27379,9 +27312,9 @@ _loop0_41_rule(Parser *p) return _seq; } -// _loop1_42: param_with_default +// _loop1_41: param_with_default static asdl_seq * -_loop1_42_rule(Parser *p) +_loop1_41_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -27406,7 +27339,7 @@ _loop1_42_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_42[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop1_41[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -27429,7 +27362,7 @@ _loop1_42_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_42[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_41[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -27451,9 +27384,9 @@ _loop1_42_rule(Parser *p) return _seq; } -// _loop1_43: param_no_default +// _loop1_42: param_no_default static asdl_seq * -_loop1_43_rule(Parser *p) +_loop1_42_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -27478,7 +27411,7 @@ _loop1_43_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_43[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop1_42[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -27501,7 +27434,7 @@ _loop1_43_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_43[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_42[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -27523,9 +27456,9 @@ _loop1_43_rule(Parser *p) return _seq; } -// _loop1_44: param_no_default +// _loop1_43: param_no_default static asdl_seq * -_loop1_44_rule(Parser *p) +_loop1_43_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -27550,7 +27483,7 @@ _loop1_44_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_44[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop1_43[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -27573,7 +27506,7 @@ _loop1_44_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_44[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_43[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -27595,9 +27528,9 @@ _loop1_44_rule(Parser *p) return _seq; } -// _loop0_45: param_no_default +// _loop0_44: param_no_default static asdl_seq * -_loop0_45_rule(Parser *p) +_loop0_44_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -27622,7 +27555,7 @@ _loop0_45_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_45[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_44[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -27645,7 +27578,7 @@ _loop0_45_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_45[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_44[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -27662,9 +27595,9 @@ _loop0_45_rule(Parser *p) return _seq; } -// _loop1_46: param_with_default +// _loop1_45: param_with_default static asdl_seq * -_loop1_46_rule(Parser *p) +_loop1_45_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -27689,7 +27622,7 @@ _loop1_46_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_46[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop1_45[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -27712,7 +27645,7 @@ _loop1_46_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_46[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_45[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -27734,9 +27667,9 @@ _loop1_46_rule(Parser *p) return _seq; } -// _loop0_47: param_no_default +// _loop0_46: param_no_default static asdl_seq * -_loop0_47_rule(Parser *p) +_loop0_46_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -27761,7 +27694,7 @@ _loop0_47_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_47[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_46[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -27784,7 +27717,7 @@ _loop0_47_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_47[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_46[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -27801,9 +27734,9 @@ _loop0_47_rule(Parser *p) return _seq; } -// _loop1_48: param_with_default +// _loop1_47: param_with_default static asdl_seq * -_loop1_48_rule(Parser *p) +_loop1_47_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -27828,7 +27761,7 @@ _loop1_48_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_48[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop1_47[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -27851,7 +27784,7 @@ _loop1_48_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_48[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_47[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -27873,9 +27806,9 @@ _loop1_48_rule(Parser *p) return _seq; } -// _loop0_49: param_maybe_default +// _loop0_48: param_maybe_default static asdl_seq * -_loop0_49_rule(Parser *p) +_loop0_48_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -27900,7 +27833,7 @@ _loop0_49_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_49[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_48[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -27923,7 +27856,7 @@ _loop0_49_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_49[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_48[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -27940,9 +27873,9 @@ _loop0_49_rule(Parser *p) return _seq; } -// _loop0_50: param_maybe_default +// _loop0_49: param_maybe_default static asdl_seq * -_loop0_50_rule(Parser *p) +_loop0_49_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -27967,7 +27900,7 @@ _loop0_50_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_50[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_49[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -27990,7 +27923,7 @@ _loop0_50_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_50[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_49[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -28007,9 +27940,9 @@ _loop0_50_rule(Parser *p) return _seq; } -// _loop1_51: param_maybe_default +// _loop1_50: param_maybe_default static asdl_seq * -_loop1_51_rule(Parser *p) +_loop1_50_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28034,7 +27967,7 @@ _loop1_51_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_51[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop1_50[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -28057,7 +27990,7 @@ _loop1_51_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_51[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_50[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } if (_n == 0 || p->error_indicator) { @@ -28079,9 +28012,9 @@ _loop1_51_rule(Parser *p) return _seq; } -// _loop0_53: ',' with_item +// _loop0_52: ',' with_item static asdl_seq * -_loop0_53_rule(Parser *p) +_loop0_52_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28106,7 +28039,7 @@ _loop0_53_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_53[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + D(fprintf(stderr, "%*c> _loop0_52[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); Token * _literal; withitem_ty elem; while ( @@ -28138,7 +28071,7 @@ _loop0_53_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_53[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_52[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -28155,9 +28088,9 @@ _loop0_53_rule(Parser *p) return _seq; } -// _gather_52: with_item _loop0_53 +// _gather_51: with_item _loop0_52 static asdl_seq * -_gather_52_rule(Parser *p) +_gather_51_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28168,27 +28101,27 @@ _gather_52_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // with_item _loop0_53 + { // with_item _loop0_52 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_52[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_53")); + D(fprintf(stderr, "%*c> _gather_51[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_52")); withitem_ty elem; asdl_seq * seq; if ( (elem = with_item_rule(p)) // with_item && - (seq = _loop0_53_rule(p)) // _loop0_53 + (seq = _loop0_52_rule(p)) // _loop0_52 ) { - D(fprintf(stderr, "%*c+ _gather_52[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_53")); + D(fprintf(stderr, "%*c+ _gather_51[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_52")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_52[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_53")); + D(fprintf(stderr, "%*c%s _gather_51[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_52")); } _res = NULL; done: @@ -28196,9 +28129,9 @@ _gather_52_rule(Parser *p) return _res; } -// _loop0_55: ',' with_item +// _loop0_54: ',' with_item static asdl_seq * -_loop0_55_rule(Parser *p) +_loop0_54_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28223,7 +28156,7 @@ _loop0_55_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_55[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + D(fprintf(stderr, "%*c> _loop0_54[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); Token * _literal; withitem_ty elem; while ( @@ -28255,7 +28188,7 @@ _loop0_55_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_55[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_54[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -28272,9 +28205,9 @@ _loop0_55_rule(Parser *p) return _seq; } -// _gather_54: with_item _loop0_55 +// _gather_53: with_item _loop0_54 static asdl_seq * -_gather_54_rule(Parser *p) +_gather_53_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28285,27 +28218,27 @@ _gather_54_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // with_item _loop0_55 + { // with_item _loop0_54 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_54[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_55")); + D(fprintf(stderr, "%*c> _gather_53[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_54")); withitem_ty elem; asdl_seq * seq; if ( (elem = with_item_rule(p)) // with_item && - (seq = _loop0_55_rule(p)) // _loop0_55 + (seq = _loop0_54_rule(p)) // _loop0_54 ) { - D(fprintf(stderr, "%*c+ _gather_54[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_55")); + D(fprintf(stderr, "%*c+ _gather_53[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_54")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_54[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_55")); + D(fprintf(stderr, "%*c%s _gather_53[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_54")); } _res = NULL; done: @@ -28313,9 +28246,9 @@ _gather_54_rule(Parser *p) return _res; } -// _loop0_57: ',' with_item +// _loop0_56: ',' with_item static asdl_seq * -_loop0_57_rule(Parser *p) +_loop0_56_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28340,7 +28273,7 @@ _loop0_57_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_57[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + D(fprintf(stderr, "%*c> _loop0_56[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); Token * _literal; withitem_ty elem; while ( @@ -28372,7 +28305,7 @@ _loop0_57_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_57[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_56[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -28389,9 +28322,9 @@ _loop0_57_rule(Parser *p) return _seq; } -// _gather_56: with_item _loop0_57 +// _gather_55: with_item _loop0_56 static asdl_seq * -_gather_56_rule(Parser *p) +_gather_55_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28402,27 +28335,27 @@ _gather_56_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // with_item _loop0_57 + { // with_item _loop0_56 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_56[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_57")); + D(fprintf(stderr, "%*c> _gather_55[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_56")); withitem_ty elem; asdl_seq * seq; if ( (elem = with_item_rule(p)) // with_item && - (seq = _loop0_57_rule(p)) // _loop0_57 + (seq = _loop0_56_rule(p)) // _loop0_56 ) { - D(fprintf(stderr, "%*c+ _gather_56[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_57")); + D(fprintf(stderr, "%*c+ _gather_55[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_56")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_56[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_57")); + D(fprintf(stderr, "%*c%s _gather_55[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_56")); } _res = NULL; done: @@ -28430,9 +28363,9 @@ _gather_56_rule(Parser *p) return _res; } -// _loop0_59: ',' with_item +// _loop0_58: ',' with_item static asdl_seq * -_loop0_59_rule(Parser *p) +_loop0_58_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28457,7 +28390,7 @@ _loop0_59_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + D(fprintf(stderr, "%*c> _loop0_58[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); Token * _literal; withitem_ty elem; while ( @@ -28489,7 +28422,7 @@ _loop0_59_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_59[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_58[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -28506,9 +28439,9 @@ _loop0_59_rule(Parser *p) return _seq; } -// _gather_58: with_item _loop0_59 +// _gather_57: with_item _loop0_58 static asdl_seq * -_gather_58_rule(Parser *p) +_gather_57_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28519,27 +28452,27 @@ _gather_58_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // with_item _loop0_59 + { // with_item _loop0_58 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_58[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_59")); + D(fprintf(stderr, "%*c> _gather_57[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_58")); withitem_ty elem; asdl_seq * seq; if ( (elem = with_item_rule(p)) // with_item && - (seq = _loop0_59_rule(p)) // _loop0_59 + (seq = _loop0_58_rule(p)) // _loop0_58 ) { - D(fprintf(stderr, "%*c+ _gather_58[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_59")); + D(fprintf(stderr, "%*c+ _gather_57[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_58")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_58[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_59")); + D(fprintf(stderr, "%*c%s _gather_57[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_58")); } _res = NULL; done: @@ -28547,9 +28480,9 @@ _gather_58_rule(Parser *p) return _res; } -// _tmp_60: ',' | ')' | ':' +// _tmp_59: ',' | ')' | ':' static void * -_tmp_60_rule(Parser *p) +_tmp_59_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28565,18 +28498,18 @@ _tmp_60_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_60[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_59[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_60[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_59[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // ')' @@ -28584,18 +28517,18 @@ _tmp_60_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_60[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_59[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_60[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_59[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ':' @@ -28603,18 +28536,18 @@ _tmp_60_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_60[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_59[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_60[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_59[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } _res = NULL; @@ -28623,9 +28556,9 @@ _tmp_60_rule(Parser *p) return _res; } -// _loop1_61: except_block +// _loop1_60: except_block static asdl_seq * -_loop1_61_rule(Parser *p) +_loop1_60_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28650,7 +28583,7 @@ _loop1_61_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_61[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_block")); + D(fprintf(stderr, "%*c> _loop1_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_block")); excepthandler_ty except_block_var; while ( (except_block_var = except_block_rule(p)) // except_block @@ -28673,7 +28606,7 @@ _loop1_61_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_61[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_60[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_block")); } if (_n == 0 || p->error_indicator) { @@ -28695,9 +28628,9 @@ _loop1_61_rule(Parser *p) return _seq; } -// _loop1_62: except_star_block +// _loop1_61: except_star_block static asdl_seq * -_loop1_62_rule(Parser *p) +_loop1_61_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28722,7 +28655,7 @@ _loop1_62_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_62[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_star_block")); + D(fprintf(stderr, "%*c> _loop1_61[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_star_block")); excepthandler_ty except_star_block_var; while ( (except_star_block_var = except_star_block_rule(p)) // except_star_block @@ -28745,7 +28678,7 @@ _loop1_62_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_62[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_61[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_star_block")); } if (_n == 0 || p->error_indicator) { @@ -28767,9 +28700,9 @@ _loop1_62_rule(Parser *p) return _seq; } -// _tmp_63: 'as' NAME +// _tmp_62: 'as' NAME static void * -_tmp_63_rule(Parser *p) +_tmp_62_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28785,7 +28718,7 @@ _tmp_63_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_63[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_62[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty z; if ( @@ -28794,7 +28727,7 @@ _tmp_63_rule(Parser *p) (z = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_63[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_62[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -28804,7 +28737,7 @@ _tmp_63_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_63[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_62[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -28813,9 +28746,9 @@ _tmp_63_rule(Parser *p) return _res; } -// _tmp_64: 'as' NAME +// _tmp_63: 'as' NAME static void * -_tmp_64_rule(Parser *p) +_tmp_63_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28831,7 +28764,7 @@ _tmp_64_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_64[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_63[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty z; if ( @@ -28840,7 +28773,7 @@ _tmp_64_rule(Parser *p) (z = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_64[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_63[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -28850,7 +28783,7 @@ _tmp_64_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_64[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_63[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -28859,9 +28792,9 @@ _tmp_64_rule(Parser *p) return _res; } -// _loop1_65: case_block +// _loop1_64: case_block static asdl_seq * -_loop1_65_rule(Parser *p) +_loop1_64_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28886,7 +28819,7 @@ _loop1_65_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_65[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "case_block")); + D(fprintf(stderr, "%*c> _loop1_64[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "case_block")); match_case_ty case_block_var; while ( (case_block_var = case_block_rule(p)) // case_block @@ -28909,7 +28842,7 @@ _loop1_65_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_65[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_64[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "case_block")); } if (_n == 0 || p->error_indicator) { @@ -28931,9 +28864,9 @@ _loop1_65_rule(Parser *p) return _seq; } -// _loop0_67: '|' closed_pattern +// _loop0_66: '|' closed_pattern static asdl_seq * -_loop0_67_rule(Parser *p) +_loop0_66_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -28958,7 +28891,7 @@ _loop0_67_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_67[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'|' closed_pattern")); + D(fprintf(stderr, "%*c> _loop0_66[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'|' closed_pattern")); Token * _literal; pattern_ty elem; while ( @@ -28990,7 +28923,7 @@ _loop0_67_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_67[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_66[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'|' closed_pattern")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -29007,9 +28940,9 @@ _loop0_67_rule(Parser *p) return _seq; } -// _gather_66: closed_pattern _loop0_67 +// _gather_65: closed_pattern _loop0_66 static asdl_seq * -_gather_66_rule(Parser *p) +_gather_65_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29020,27 +28953,27 @@ _gather_66_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // closed_pattern _loop0_67 + { // closed_pattern _loop0_66 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_66[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "closed_pattern _loop0_67")); + D(fprintf(stderr, "%*c> _gather_65[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "closed_pattern _loop0_66")); pattern_ty elem; asdl_seq * seq; if ( (elem = closed_pattern_rule(p)) // closed_pattern && - (seq = _loop0_67_rule(p)) // _loop0_67 + (seq = _loop0_66_rule(p)) // _loop0_66 ) { - D(fprintf(stderr, "%*c+ _gather_66[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "closed_pattern _loop0_67")); + D(fprintf(stderr, "%*c+ _gather_65[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "closed_pattern _loop0_66")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_66[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "closed_pattern _loop0_67")); + D(fprintf(stderr, "%*c%s _gather_65[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "closed_pattern _loop0_66")); } _res = NULL; done: @@ -29048,9 +28981,9 @@ _gather_66_rule(Parser *p) return _res; } -// _tmp_68: '+' | '-' +// _tmp_67: '+' | '-' static void * -_tmp_68_rule(Parser *p) +_tmp_67_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29066,18 +28999,18 @@ _tmp_68_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_68[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+'")); + D(fprintf(stderr, "%*c> _tmp_67[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 14)) // token='+' ) { - D(fprintf(stderr, "%*c+ _tmp_68[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+'")); + D(fprintf(stderr, "%*c+ _tmp_67[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_68[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_67[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'+'")); } { // '-' @@ -29085,18 +29018,18 @@ _tmp_68_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_68[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-'")); + D(fprintf(stderr, "%*c> _tmp_67[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 15)) // token='-' ) { - D(fprintf(stderr, "%*c+ _tmp_68[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-'")); + D(fprintf(stderr, "%*c+ _tmp_67[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_68[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_67[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'-'")); } _res = NULL; @@ -29105,9 +29038,9 @@ _tmp_68_rule(Parser *p) return _res; } -// _tmp_69: '+' | '-' +// _tmp_68: '+' | '-' static void * -_tmp_69_rule(Parser *p) +_tmp_68_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29123,18 +29056,18 @@ _tmp_69_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+'")); + D(fprintf(stderr, "%*c> _tmp_68[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 14)) // token='+' ) { - D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+'")); + D(fprintf(stderr, "%*c+ _tmp_68[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_69[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_68[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'+'")); } { // '-' @@ -29142,18 +29075,18 @@ _tmp_69_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-'")); + D(fprintf(stderr, "%*c> _tmp_68[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 15)) // token='-' ) { - D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-'")); + D(fprintf(stderr, "%*c+ _tmp_68[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_69[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_68[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'-'")); } _res = NULL; @@ -29162,9 +29095,9 @@ _tmp_69_rule(Parser *p) return _res; } -// _tmp_70: '.' | '(' | '=' +// _tmp_69: '.' | '(' | '=' static void * -_tmp_70_rule(Parser *p) +_tmp_69_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29180,18 +29113,18 @@ _tmp_70_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_70[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_70[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_70[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_69[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '(' @@ -29199,18 +29132,18 @@ _tmp_70_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_70[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' ) { - D(fprintf(stderr, "%*c+ _tmp_70[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_70[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_69[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); } { // '=' @@ -29218,18 +29151,18 @@ _tmp_70_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_70[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_70[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_70[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_69[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); } _res = NULL; @@ -29238,9 +29171,9 @@ _tmp_70_rule(Parser *p) return _res; } -// _tmp_71: '.' | '(' | '=' +// _tmp_70: '.' | '(' | '=' static void * -_tmp_71_rule(Parser *p) +_tmp_70_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29256,18 +29189,18 @@ _tmp_71_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_70[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_71[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_70[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_71[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_70[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '(' @@ -29275,18 +29208,18 @@ _tmp_71_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c> _tmp_70[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' ) { - D(fprintf(stderr, "%*c+ _tmp_71[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c+ _tmp_70[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_71[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_70[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); } { // '=' @@ -29294,18 +29227,18 @@ _tmp_71_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c> _tmp_70[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_71[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c+ _tmp_70[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_71[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_70[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); } _res = NULL; @@ -29314,9 +29247,9 @@ _tmp_71_rule(Parser *p) return _res; } -// _loop0_73: ',' maybe_star_pattern +// _loop0_72: ',' maybe_star_pattern static asdl_seq * -_loop0_73_rule(Parser *p) +_loop0_72_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29341,7 +29274,7 @@ _loop0_73_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_73[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' maybe_star_pattern")); + D(fprintf(stderr, "%*c> _loop0_72[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' maybe_star_pattern")); Token * _literal; pattern_ty elem; while ( @@ -29373,7 +29306,7 @@ _loop0_73_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_73[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_72[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' maybe_star_pattern")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -29390,9 +29323,9 @@ _loop0_73_rule(Parser *p) return _seq; } -// _gather_72: maybe_star_pattern _loop0_73 +// _gather_71: maybe_star_pattern _loop0_72 static asdl_seq * -_gather_72_rule(Parser *p) +_gather_71_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29403,27 +29336,27 @@ _gather_72_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // maybe_star_pattern _loop0_73 + { // maybe_star_pattern _loop0_72 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_72[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_73")); + D(fprintf(stderr, "%*c> _gather_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_72")); pattern_ty elem; asdl_seq * seq; if ( (elem = maybe_star_pattern_rule(p)) // maybe_star_pattern && - (seq = _loop0_73_rule(p)) // _loop0_73 + (seq = _loop0_72_rule(p)) // _loop0_72 ) { - D(fprintf(stderr, "%*c+ _gather_72[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_73")); + D(fprintf(stderr, "%*c+ _gather_71[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_72")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_72[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "maybe_star_pattern _loop0_73")); + D(fprintf(stderr, "%*c%s _gather_71[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "maybe_star_pattern _loop0_72")); } _res = NULL; done: @@ -29431,9 +29364,9 @@ _gather_72_rule(Parser *p) return _res; } -// _loop0_75: ',' key_value_pattern +// _loop0_74: ',' key_value_pattern static asdl_seq * -_loop0_75_rule(Parser *p) +_loop0_74_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29458,7 +29391,7 @@ _loop0_75_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' key_value_pattern")); + D(fprintf(stderr, "%*c> _loop0_74[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' key_value_pattern")); Token * _literal; KeyPatternPair* elem; while ( @@ -29490,7 +29423,7 @@ _loop0_75_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_75[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_74[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' key_value_pattern")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -29507,9 +29440,9 @@ _loop0_75_rule(Parser *p) return _seq; } -// _gather_74: key_value_pattern _loop0_75 +// _gather_73: key_value_pattern _loop0_74 static asdl_seq * -_gather_74_rule(Parser *p) +_gather_73_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29520,27 +29453,27 @@ _gather_74_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // key_value_pattern _loop0_75 + { // key_value_pattern _loop0_74 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_74[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_75")); + D(fprintf(stderr, "%*c> _gather_73[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_74")); KeyPatternPair* elem; asdl_seq * seq; if ( (elem = key_value_pattern_rule(p)) // key_value_pattern && - (seq = _loop0_75_rule(p)) // _loop0_75 + (seq = _loop0_74_rule(p)) // _loop0_74 ) { - D(fprintf(stderr, "%*c+ _gather_74[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_75")); + D(fprintf(stderr, "%*c+ _gather_73[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_74")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_74[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "key_value_pattern _loop0_75")); + D(fprintf(stderr, "%*c%s _gather_73[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "key_value_pattern _loop0_74")); } _res = NULL; done: @@ -29548,9 +29481,9 @@ _gather_74_rule(Parser *p) return _res; } -// _tmp_76: literal_expr | attr +// _tmp_75: literal_expr | attr static void * -_tmp_76_rule(Parser *p) +_tmp_75_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29566,18 +29499,18 @@ _tmp_76_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_76[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "literal_expr")); + D(fprintf(stderr, "%*c> _tmp_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "literal_expr")); expr_ty literal_expr_var; if ( (literal_expr_var = literal_expr_rule(p)) // literal_expr ) { - D(fprintf(stderr, "%*c+ _tmp_76[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "literal_expr")); + D(fprintf(stderr, "%*c+ _tmp_75[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "literal_expr")); _res = literal_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_76[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_75[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "literal_expr")); } { // attr @@ -29585,18 +29518,18 @@ _tmp_76_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_76[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "attr")); + D(fprintf(stderr, "%*c> _tmp_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "attr")); expr_ty attr_var; if ( (attr_var = attr_rule(p)) // attr ) { - D(fprintf(stderr, "%*c+ _tmp_76[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "attr")); + D(fprintf(stderr, "%*c+ _tmp_75[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "attr")); _res = attr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_76[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_75[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "attr")); } _res = NULL; @@ -29605,9 +29538,9 @@ _tmp_76_rule(Parser *p) return _res; } -// _loop0_78: ',' pattern +// _loop0_77: ',' pattern static asdl_seq * -_loop0_78_rule(Parser *p) +_loop0_77_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29632,7 +29565,7 @@ _loop0_78_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_78[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' pattern")); + D(fprintf(stderr, "%*c> _loop0_77[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' pattern")); Token * _literal; pattern_ty elem; while ( @@ -29664,7 +29597,7 @@ _loop0_78_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_78[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_77[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' pattern")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -29681,9 +29614,9 @@ _loop0_78_rule(Parser *p) return _seq; } -// _gather_77: pattern _loop0_78 +// _gather_76: pattern _loop0_77 static asdl_seq * -_gather_77_rule(Parser *p) +_gather_76_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29694,27 +29627,27 @@ _gather_77_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // pattern _loop0_78 + { // pattern _loop0_77 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_77[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "pattern _loop0_78")); + D(fprintf(stderr, "%*c> _gather_76[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "pattern _loop0_77")); pattern_ty elem; asdl_seq * seq; if ( (elem = pattern_rule(p)) // pattern && - (seq = _loop0_78_rule(p)) // _loop0_78 + (seq = _loop0_77_rule(p)) // _loop0_77 ) { - D(fprintf(stderr, "%*c+ _gather_77[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "pattern _loop0_78")); + D(fprintf(stderr, "%*c+ _gather_76[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "pattern _loop0_77")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_77[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "pattern _loop0_78")); + D(fprintf(stderr, "%*c%s _gather_76[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "pattern _loop0_77")); } _res = NULL; done: @@ -29722,9 +29655,9 @@ _gather_77_rule(Parser *p) return _res; } -// _loop0_80: ',' keyword_pattern +// _loop0_79: ',' keyword_pattern static asdl_seq * -_loop0_80_rule(Parser *p) +_loop0_79_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29749,7 +29682,7 @@ _loop0_80_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_80[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' keyword_pattern")); + D(fprintf(stderr, "%*c> _loop0_79[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' keyword_pattern")); Token * _literal; KeyPatternPair* elem; while ( @@ -29781,7 +29714,7 @@ _loop0_80_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_80[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_79[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' keyword_pattern")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -29798,9 +29731,9 @@ _loop0_80_rule(Parser *p) return _seq; } -// _gather_79: keyword_pattern _loop0_80 +// _gather_78: keyword_pattern _loop0_79 static asdl_seq * -_gather_79_rule(Parser *p) +_gather_78_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29811,27 +29744,27 @@ _gather_79_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // keyword_pattern _loop0_80 + { // keyword_pattern _loop0_79 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_79[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_80")); + D(fprintf(stderr, "%*c> _gather_78[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_79")); KeyPatternPair* elem; asdl_seq * seq; if ( (elem = keyword_pattern_rule(p)) // keyword_pattern && - (seq = _loop0_80_rule(p)) // _loop0_80 + (seq = _loop0_79_rule(p)) // _loop0_79 ) { - D(fprintf(stderr, "%*c+ _gather_79[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_80")); + D(fprintf(stderr, "%*c+ _gather_78[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_79")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_79[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "keyword_pattern _loop0_80")); + D(fprintf(stderr, "%*c%s _gather_78[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "keyword_pattern _loop0_79")); } _res = NULL; done: @@ -29839,9 +29772,9 @@ _gather_79_rule(Parser *p) return _res; } -// _loop0_82: ',' type_param +// _loop0_81: ',' type_param static asdl_seq * -_loop0_82_rule(Parser *p) +_loop0_81_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29866,7 +29799,7 @@ _loop0_82_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_82[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' type_param")); + D(fprintf(stderr, "%*c> _loop0_81[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' type_param")); Token * _literal; type_param_ty elem; while ( @@ -29898,7 +29831,7 @@ _loop0_82_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_82[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_81[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' type_param")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -29915,9 +29848,9 @@ _loop0_82_rule(Parser *p) return _seq; } -// _gather_81: type_param _loop0_82 +// _gather_80: type_param _loop0_81 static asdl_seq * -_gather_81_rule(Parser *p) +_gather_80_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29928,27 +29861,27 @@ _gather_81_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // type_param _loop0_82 + { // type_param _loop0_81 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_81[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "type_param _loop0_82")); + D(fprintf(stderr, "%*c> _gather_80[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "type_param _loop0_81")); type_param_ty elem; asdl_seq * seq; if ( (elem = type_param_rule(p)) // type_param && - (seq = _loop0_82_rule(p)) // _loop0_82 + (seq = _loop0_81_rule(p)) // _loop0_81 ) { - D(fprintf(stderr, "%*c+ _gather_81[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "type_param _loop0_82")); + D(fprintf(stderr, "%*c+ _gather_80[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "type_param _loop0_81")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_81[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "type_param _loop0_82")); + D(fprintf(stderr, "%*c%s _gather_80[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "type_param _loop0_81")); } _res = NULL; done: @@ -29956,9 +29889,9 @@ _gather_81_rule(Parser *p) return _res; } -// _loop1_83: (',' expression) +// _loop1_82: (',' expression) static asdl_seq * -_loop1_83_rule(Parser *p) +_loop1_82_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -29983,7 +29916,7 @@ _loop1_83_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_83[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); + D(fprintf(stderr, "%*c> _loop1_82[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); void *_tmp_251_var; while ( (_tmp_251_var = _tmp_251_rule(p)) // ',' expression @@ -30006,7 +29939,7 @@ _loop1_83_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_83[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_82[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' expression)")); } if (_n == 0 || p->error_indicator) { @@ -30028,9 +29961,9 @@ _loop1_83_rule(Parser *p) return _seq; } -// _loop1_84: (',' star_expression) +// _loop1_83: (',' star_expression) static asdl_seq * -_loop1_84_rule(Parser *p) +_loop1_83_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -30055,7 +29988,7 @@ _loop1_84_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_84[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); + D(fprintf(stderr, "%*c> _loop1_83[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); void *_tmp_252_var; while ( (_tmp_252_var = _tmp_252_rule(p)) // ',' star_expression @@ -30078,7 +30011,7 @@ _loop1_84_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_84[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_83[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_expression)")); } if (_n == 0 || p->error_indicator) { @@ -30100,9 +30033,9 @@ _loop1_84_rule(Parser *p) return _seq; } -// _loop0_86: ',' star_named_expression +// _loop0_85: ',' star_named_expression static asdl_seq * -_loop0_86_rule(Parser *p) +_loop0_85_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -30127,7 +30060,7 @@ _loop0_86_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_named_expression")); + D(fprintf(stderr, "%*c> _loop0_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_named_expression")); Token * _literal; expr_ty elem; while ( @@ -30159,7 +30092,7 @@ _loop0_86_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_86[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_85[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_named_expression")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -30176,9 +30109,9 @@ _loop0_86_rule(Parser *p) return _seq; } -// _gather_85: star_named_expression _loop0_86 +// _gather_84: star_named_expression _loop0_85 static asdl_seq * -_gather_85_rule(Parser *p) +_gather_84_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -30189,27 +30122,27 @@ _gather_85_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // star_named_expression _loop0_86 + { // star_named_expression _loop0_85 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_86")); + D(fprintf(stderr, "%*c> _gather_84[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_85")); expr_ty elem; asdl_seq * seq; if ( (elem = star_named_expression_rule(p)) // star_named_expression && - (seq = _loop0_86_rule(p)) // _loop0_86 + (seq = _loop0_85_rule(p)) // _loop0_85 ) { - D(fprintf(stderr, "%*c+ _gather_85[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_86")); + D(fprintf(stderr, "%*c+ _gather_84[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_85")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_85[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression _loop0_86")); + D(fprintf(stderr, "%*c%s _gather_84[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression _loop0_85")); } _res = NULL; done: @@ -30217,9 +30150,9 @@ _gather_85_rule(Parser *p) return _res; } -// _loop1_87: ('or' conjunction) +// _loop1_86: ('or' conjunction) static asdl_seq * -_loop1_87_rule(Parser *p) +_loop1_86_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -30244,7 +30177,7 @@ _loop1_87_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); + D(fprintf(stderr, "%*c> _loop1_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); void *_tmp_253_var; while ( (_tmp_253_var = _tmp_253_rule(p)) // 'or' conjunction @@ -30267,7 +30200,7 @@ _loop1_87_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_87[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_86[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('or' conjunction)")); } if (_n == 0 || p->error_indicator) { @@ -30289,9 +30222,9 @@ _loop1_87_rule(Parser *p) return _seq; } -// _loop1_88: ('and' inversion) +// _loop1_87: ('and' inversion) static asdl_seq * -_loop1_88_rule(Parser *p) +_loop1_87_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -30316,7 +30249,7 @@ _loop1_88_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); + D(fprintf(stderr, "%*c> _loop1_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); void *_tmp_254_var; while ( (_tmp_254_var = _tmp_254_rule(p)) // 'and' inversion @@ -30339,7 +30272,7 @@ _loop1_88_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_88[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_87[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('and' inversion)")); } if (_n == 0 || p->error_indicator) { @@ -30361,9 +30294,9 @@ _loop1_88_rule(Parser *p) return _seq; } -// _loop1_89: compare_op_bitwise_or_pair +// _loop1_88: compare_op_bitwise_or_pair static asdl_seq * -_loop1_89_rule(Parser *p) +_loop1_88_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -30388,7 +30321,7 @@ _loop1_89_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "compare_op_bitwise_or_pair")); + D(fprintf(stderr, "%*c> _loop1_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "compare_op_bitwise_or_pair")); CmpopExprPair* compare_op_bitwise_or_pair_var; while ( (compare_op_bitwise_or_pair_var = compare_op_bitwise_or_pair_rule(p)) // compare_op_bitwise_or_pair @@ -30411,7 +30344,7 @@ _loop1_89_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_89[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_88[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "compare_op_bitwise_or_pair")); } if (_n == 0 || p->error_indicator) { @@ -30433,9 +30366,9 @@ _loop1_89_rule(Parser *p) return _seq; } -// _tmp_90: '!=' +// _tmp_89: '!=' static void * -_tmp_90_rule(Parser *p) +_tmp_89_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -30451,13 +30384,13 @@ _tmp_90_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_90[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!='")); + D(fprintf(stderr, "%*c> _tmp_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!='")); Token * tok; if ( (tok = _PyPegen_expect_token(p, 28)) // token='!=' ) { - D(fprintf(stderr, "%*c+ _tmp_90[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!='")); + D(fprintf(stderr, "%*c+ _tmp_89[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!='")); _res = _PyPegen_check_barry_as_flufl ( p , tok ) ? NULL : tok; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -30467,7 +30400,7 @@ _tmp_90_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_90[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_89[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!='")); } _res = NULL; @@ -30476,9 +30409,9 @@ _tmp_90_rule(Parser *p) return _res; } -// _loop0_92: ',' (slice | starred_expression) +// _loop0_91: ',' (slice | starred_expression) static asdl_seq * -_loop0_92_rule(Parser *p) +_loop0_91_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -30503,7 +30436,7 @@ _loop0_92_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (slice | starred_expression)")); + D(fprintf(stderr, "%*c> _loop0_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (slice | starred_expression)")); Token * _literal; void *elem; while ( @@ -30535,7 +30468,7 @@ _loop0_92_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_92[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_91[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (slice | starred_expression)")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -30552,9 +30485,9 @@ _loop0_92_rule(Parser *p) return _seq; } -// _gather_91: (slice | starred_expression) _loop0_92 +// _gather_90: (slice | starred_expression) _loop0_91 static asdl_seq * -_gather_91_rule(Parser *p) +_gather_90_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -30565,27 +30498,27 @@ _gather_91_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (slice | starred_expression) _loop0_92 + { // (slice | starred_expression) _loop0_91 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_92")); + D(fprintf(stderr, "%*c> _gather_90[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_91")); void *elem; asdl_seq * seq; if ( (elem = _tmp_255_rule(p)) // slice | starred_expression && - (seq = _loop0_92_rule(p)) // _loop0_92 + (seq = _loop0_91_rule(p)) // _loop0_91 ) { - D(fprintf(stderr, "%*c+ _gather_91[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_92")); + D(fprintf(stderr, "%*c+ _gather_90[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_91")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_91[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(slice | starred_expression) _loop0_92")); + D(fprintf(stderr, "%*c%s _gather_90[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(slice | starred_expression) _loop0_91")); } _res = NULL; done: @@ -30593,9 +30526,9 @@ _gather_91_rule(Parser *p) return _res; } -// _tmp_93: ':' expression? +// _tmp_92: ':' expression? static void * -_tmp_93_rule(Parser *p) +_tmp_92_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -30611,7 +30544,7 @@ _tmp_93_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' expression?")); + D(fprintf(stderr, "%*c> _tmp_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' expression?")); Token * _literal; void *d; if ( @@ -30620,7 +30553,7 @@ _tmp_93_rule(Parser *p) (d = expression_rule(p), !p->error_indicator) // expression? ) { - D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' expression?")); + D(fprintf(stderr, "%*c+ _tmp_92[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' expression?")); _res = d; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -30630,7 +30563,7 @@ _tmp_93_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_92[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':' expression?")); } _res = NULL; @@ -30639,9 +30572,9 @@ _tmp_93_rule(Parser *p) return _res; } -// _tmp_94: STRING | FSTRING_START +// _tmp_93: STRING | FSTRING_START static void * -_tmp_94_rule(Parser *p) +_tmp_93_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -30657,18 +30590,18 @@ _tmp_94_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING")); + D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING")); expr_ty string_var; if ( (string_var = _PyPegen_string_token(p)) // STRING ) { - D(fprintf(stderr, "%*c+ _tmp_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "STRING")); + D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "STRING")); _res = string_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_94[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "STRING")); } { // FSTRING_START @@ -30676,18 +30609,18 @@ _tmp_94_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "FSTRING_START")); + D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "FSTRING_START")); Token * fstring_start_var; if ( (fstring_start_var = _PyPegen_expect_token(p, FSTRING_START)) // token='FSTRING_START' ) { - D(fprintf(stderr, "%*c+ _tmp_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "FSTRING_START")); + D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "FSTRING_START")); _res = fstring_start_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_94[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_START")); } _res = NULL; @@ -30696,9 +30629,9 @@ _tmp_94_rule(Parser *p) return _res; } -// _tmp_95: tuple | group | genexp +// _tmp_94: tuple | group | genexp static void * -_tmp_95_rule(Parser *p) +_tmp_94_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -30714,18 +30647,18 @@ _tmp_95_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c> _tmp_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); expr_ty tuple_var; if ( (tuple_var = tuple_rule(p)) // tuple ) { - D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c+ _tmp_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); _res = tuple_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_94[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tuple")); } { // group @@ -30733,18 +30666,18 @@ _tmp_95_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "group")); + D(fprintf(stderr, "%*c> _tmp_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "group")); expr_ty group_var; if ( (group_var = group_rule(p)) // group ) { - D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "group")); + D(fprintf(stderr, "%*c+ _tmp_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "group")); _res = group_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_94[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "group")); } { // genexp @@ -30752,18 +30685,18 @@ _tmp_95_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c> _tmp_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); expr_ty genexp_var; if ( (genexp_var = genexp_rule(p)) // genexp ) { - D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c+ _tmp_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); _res = genexp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_94[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "genexp")); } _res = NULL; @@ -30772,9 +30705,9 @@ _tmp_95_rule(Parser *p) return _res; } -// _tmp_96: list | listcomp +// _tmp_95: list | listcomp static void * -_tmp_96_rule(Parser *p) +_tmp_95_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -30790,18 +30723,18 @@ _tmp_96_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); expr_ty list_var; if ( (list_var = list_rule(p)) // list ) { - D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); _res = list_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "list")); } { // listcomp @@ -30809,18 +30742,18 @@ _tmp_96_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "listcomp")); + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "listcomp")); expr_ty listcomp_var; if ( (listcomp_var = listcomp_rule(p)) // listcomp ) { - D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "listcomp")); + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "listcomp")); _res = listcomp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "listcomp")); } _res = NULL; @@ -30829,9 +30762,9 @@ _tmp_96_rule(Parser *p) return _res; } -// _tmp_97: dict | set | dictcomp | setcomp +// _tmp_96: dict | set | dictcomp | setcomp static void * -_tmp_97_rule(Parser *p) +_tmp_96_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -30847,18 +30780,18 @@ _tmp_97_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dict")); + D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dict")); expr_ty dict_var; if ( (dict_var = dict_rule(p)) // dict ) { - D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dict")); + D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dict")); _res = dict_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dict")); } { // set @@ -30866,18 +30799,18 @@ _tmp_97_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "set")); + D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "set")); expr_ty set_var; if ( (set_var = set_rule(p)) // set ) { - D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "set")); + D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "set")); _res = set_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "set")); } { // dictcomp @@ -30885,18 +30818,18 @@ _tmp_97_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dictcomp")); + D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dictcomp")); expr_ty dictcomp_var; if ( (dictcomp_var = dictcomp_rule(p)) // dictcomp ) { - D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dictcomp")); + D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dictcomp")); _res = dictcomp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dictcomp")); } { // setcomp @@ -30904,18 +30837,18 @@ _tmp_97_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "setcomp")); + D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "setcomp")); expr_ty setcomp_var; if ( (setcomp_var = setcomp_rule(p)) // setcomp ) { - D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "setcomp")); + D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "setcomp")); _res = setcomp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "setcomp")); } _res = NULL; @@ -30924,9 +30857,9 @@ _tmp_97_rule(Parser *p) return _res; } -// _tmp_98: yield_expr | named_expression +// _tmp_97: yield_expr | named_expression static void * -_tmp_98_rule(Parser *p) +_tmp_97_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -30942,18 +30875,18 @@ _tmp_98_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_98[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_98[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // named_expression @@ -30961,18 +30894,18 @@ _tmp_98_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression")); + D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression")); expr_ty named_expression_var; if ( (named_expression_var = named_expression_rule(p)) // named_expression ) { - D(fprintf(stderr, "%*c+ _tmp_98[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression")); + D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression")); _res = named_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_98[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression")); } _res = NULL; @@ -30981,9 +30914,9 @@ _tmp_98_rule(Parser *p) return _res; } -// _loop0_99: lambda_param_no_default +// _loop0_98: lambda_param_no_default static asdl_seq * -_loop0_99_rule(Parser *p) +_loop0_98_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -31008,7 +30941,7 @@ _loop0_99_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop0_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -31031,7 +30964,7 @@ _loop0_99_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_99[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_98[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -31048,9 +30981,9 @@ _loop0_99_rule(Parser *p) return _seq; } -// _loop0_100: lambda_param_with_default +// _loop0_99: lambda_param_with_default static asdl_seq * -_loop0_100_rule(Parser *p) +_loop0_99_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -31075,7 +31008,7 @@ _loop0_100_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop0_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -31098,7 +31031,7 @@ _loop0_100_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_100[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_99[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -31115,9 +31048,9 @@ _loop0_100_rule(Parser *p) return _seq; } -// _loop0_101: lambda_param_with_default +// _loop0_100: lambda_param_with_default static asdl_seq * -_loop0_101_rule(Parser *p) +_loop0_100_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -31142,7 +31075,7 @@ _loop0_101_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_101[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop0_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -31165,7 +31098,7 @@ _loop0_101_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_101[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_100[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -31182,9 +31115,9 @@ _loop0_101_rule(Parser *p) return _seq; } -// _loop1_102: lambda_param_no_default +// _loop1_101: lambda_param_no_default static asdl_seq * -_loop1_102_rule(Parser *p) +_loop1_101_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -31209,7 +31142,7 @@ _loop1_102_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop1_101[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -31232,7 +31165,7 @@ _loop1_102_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_102[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_101[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -31254,9 +31187,9 @@ _loop1_102_rule(Parser *p) return _seq; } -// _loop0_103: lambda_param_with_default +// _loop0_102: lambda_param_with_default static asdl_seq * -_loop0_103_rule(Parser *p) +_loop0_102_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -31281,7 +31214,7 @@ _loop0_103_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_103[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop0_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -31304,7 +31237,7 @@ _loop0_103_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_103[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_102[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -31321,9 +31254,9 @@ _loop0_103_rule(Parser *p) return _seq; } -// _loop1_104: lambda_param_with_default +// _loop1_103: lambda_param_with_default static asdl_seq * -_loop1_104_rule(Parser *p) +_loop1_103_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -31348,7 +31281,7 @@ _loop1_104_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop1_103[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -31371,7 +31304,7 @@ _loop1_104_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_104[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_103[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -31393,9 +31326,9 @@ _loop1_104_rule(Parser *p) return _seq; } -// _loop1_105: lambda_param_no_default +// _loop1_104: lambda_param_no_default static asdl_seq * -_loop1_105_rule(Parser *p) +_loop1_104_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -31420,7 +31353,7 @@ _loop1_105_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop1_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -31443,7 +31376,7 @@ _loop1_105_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_105[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_104[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -31465,9 +31398,9 @@ _loop1_105_rule(Parser *p) return _seq; } -// _loop1_106: lambda_param_no_default +// _loop1_105: lambda_param_no_default static asdl_seq * -_loop1_106_rule(Parser *p) +_loop1_105_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -31492,7 +31425,7 @@ _loop1_106_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_106[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop1_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -31515,7 +31448,7 @@ _loop1_106_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_106[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_105[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -31537,9 +31470,9 @@ _loop1_106_rule(Parser *p) return _seq; } -// _loop0_107: lambda_param_no_default +// _loop0_106: lambda_param_no_default static asdl_seq * -_loop0_107_rule(Parser *p) +_loop0_106_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -31564,7 +31497,7 @@ _loop0_107_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_107[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop0_106[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -31587,7 +31520,7 @@ _loop0_107_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_107[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_106[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -31604,9 +31537,9 @@ _loop0_107_rule(Parser *p) return _seq; } -// _loop1_108: lambda_param_with_default +// _loop1_107: lambda_param_with_default static asdl_seq * -_loop1_108_rule(Parser *p) +_loop1_107_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -31631,7 +31564,7 @@ _loop1_108_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop1_107[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -31654,7 +31587,7 @@ _loop1_108_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_108[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_107[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -31676,9 +31609,9 @@ _loop1_108_rule(Parser *p) return _seq; } -// _loop0_109: lambda_param_no_default +// _loop0_108: lambda_param_no_default static asdl_seq * -_loop0_109_rule(Parser *p) +_loop0_108_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -31703,7 +31636,7 @@ _loop0_109_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop0_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -31726,7 +31659,7 @@ _loop0_109_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_109[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_108[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -31743,9 +31676,9 @@ _loop0_109_rule(Parser *p) return _seq; } -// _loop1_110: lambda_param_with_default +// _loop1_109: lambda_param_with_default static asdl_seq * -_loop1_110_rule(Parser *p) +_loop1_109_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -31770,7 +31703,7 @@ _loop1_110_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop1_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -31793,7 +31726,7 @@ _loop1_110_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_110[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_109[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -31815,9 +31748,9 @@ _loop1_110_rule(Parser *p) return _seq; } -// _loop0_111: lambda_param_maybe_default +// _loop0_110: lambda_param_maybe_default static asdl_seq * -_loop0_111_rule(Parser *p) +_loop0_110_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -31842,7 +31775,7 @@ _loop0_111_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -31865,7 +31798,7 @@ _loop0_111_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_111[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_110[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -31882,9 +31815,9 @@ _loop0_111_rule(Parser *p) return _seq; } -// _loop1_112: lambda_param_maybe_default +// _loop1_111: lambda_param_maybe_default static asdl_seq * -_loop1_112_rule(Parser *p) +_loop1_111_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -31909,7 +31842,7 @@ _loop1_112_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop1_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -31932,7 +31865,7 @@ _loop1_112_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_112[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_111[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } if (_n == 0 || p->error_indicator) { @@ -31954,9 +31887,9 @@ _loop1_112_rule(Parser *p) return _seq; } -// _tmp_113: yield_expr | star_expressions +// _tmp_112: yield_expr | star_expressions static void * -_tmp_113_rule(Parser *p) +_tmp_112_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -31972,18 +31905,18 @@ _tmp_113_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_113[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_112[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_113[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_112[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -31991,18 +31924,18 @@ _tmp_113_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_113[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_112[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_113[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_112[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -32011,9 +31944,9 @@ _tmp_113_rule(Parser *p) return _res; } -// _loop0_114: fstring_format_spec +// _loop0_113: fstring_format_spec static asdl_seq * -_loop0_114_rule(Parser *p) +_loop0_113_rule(Parser *p) { if (p->level++ == MAXSTACK) { _Pypegen_stack_overflow(p); @@ -32038,7 +31971,7 @@ _loop0_114_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_format_spec")); + D(fprintf(stderr, "%*c> _loop0_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_format_spec")); expr_ty fstring_format_spec_var; while ( (fstring_format_spec_var = fstring_format_spec_rule(p)) // fstring_format_spec @@ -32061,7 +31994,7 @@ _loop0_114_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_114[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_113[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_format_spec")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32078,6 +32011,73 @@ _loop0_114_rule(Parser *p) return _seq; } +// _loop0_114: fstring_middle +static asdl_seq * +_loop0_114_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + _Pypegen_stack_overflow(p); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // fstring_middle + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_middle")); + expr_ty fstring_middle_var; + while ( + (fstring_middle_var = fstring_middle_rule(p)) // fstring_middle + ) + { + _res = fstring_middle_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_114[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_middle")); + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + p->level--; + return _seq; +} + // _loop1_115: (fstring | string) static asdl_seq * _loop1_115_rule(Parser *p) @@ -41375,8 +41375,6 @@ _PyPegen_parse(Parser *p) result = eval_rule(p); } else if (p->start_rule == Py_func_type_input) { result = func_type_rule(p); - } else if (p->start_rule == Py_fstring_input) { - result = fstring_rule(p); } return result; diff --git a/Parser/pegen_errors.c b/Parser/pegen_errors.c index f4009367673793..b11b0442fe96ff 100644 --- a/Parser/pegen_errors.c +++ b/Parser/pegen_errors.c @@ -310,21 +310,6 @@ _PyPegen_raise_error_known_location(Parser *p, PyObject *errtype, end_col_offset = p->tok->cur - p->tok->line_start; } - if (p->start_rule == Py_fstring_input) { - const char *fstring_msg = "f-string: "; - Py_ssize_t len = strlen(fstring_msg) + strlen(errmsg); - - char *new_errmsg = PyMem_Malloc(len + 1); // Lengths of both strings plus NULL character - if (!new_errmsg) { - return (void *) PyErr_NoMemory(); - } - - // Copy both strings into new buffer - memcpy(new_errmsg, fstring_msg, strlen(fstring_msg)); - memcpy(new_errmsg + strlen(fstring_msg), errmsg, strlen(errmsg)); - new_errmsg[len] = 0; - errmsg = new_errmsg; - } errstr = PyUnicode_FromFormatV(errmsg, va); if (!errstr) { goto error; @@ -363,11 +348,6 @@ _PyPegen_raise_error_known_location(Parser *p, PyObject *errtype, } } - if (p->start_rule == Py_fstring_input) { - col_offset -= p->starting_col_offset; - end_col_offset -= p->starting_col_offset; - } - Py_ssize_t col_number = col_offset; Py_ssize_t end_col_number = end_col_offset; @@ -398,17 +378,11 @@ _PyPegen_raise_error_known_location(Parser *p, PyObject *errtype, Py_DECREF(errstr); Py_DECREF(value); - if (p->start_rule == Py_fstring_input) { - PyMem_Free((void *)errmsg); - } return NULL; error: Py_XDECREF(errstr); Py_XDECREF(error_line); - if (p->start_rule == Py_fstring_input) { - PyMem_Free((void *)errmsg); - } return NULL; } diff --git a/Tools/peg_generator/pegen/grammar.py b/Tools/peg_generator/pegen/grammar.py index 065894e7fe66ab..1ee9d100b61f49 100644 --- a/Tools/peg_generator/pegen/grammar.py +++ b/Tools/peg_generator/pegen/grammar.py @@ -35,7 +35,13 @@ def generic_visit(self, node: Iterable[Any], *args: Any, **kwargs: Any) -> Any: class Grammar: def __init__(self, rules: Iterable[Rule], metas: Iterable[Tuple[str, Optional[str]]]): - self.rules = {rule.name: rule for rule in rules} + # Check if there are repeated rules in "rules" + all_rules = {} + for rule in rules: + if rule.name in all_rules: + raise GrammarError(f"Repeated rule {rule.name!r}") + all_rules[rule.name] = rule + self.rules = all_rules self.metas = dict(metas) def __str__(self) -> str: From 8a82bff12c8e6c6c204c8a48ee4993d908ec4b73 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Fri, 22 Sep 2023 12:52:57 -0600 Subject: [PATCH 306/357] Docs: Update Donghee Na's name (#109743) --- Doc/whatsnew/3.10.rst | 8 ++--- Doc/whatsnew/3.11.rst | 18 +++++------ Doc/whatsnew/3.12.rst | 8 ++--- Doc/whatsnew/3.13.rst | 2 +- Doc/whatsnew/3.8.rst | 4 +-- Doc/whatsnew/3.9.rst | 32 +++++++++---------- Misc/ACKS | 2 +- Misc/NEWS.d/3.10.0a1.rst | 12 +++---- Misc/NEWS.d/3.10.0a2.rst | 4 +-- Misc/NEWS.d/3.10.0a3.rst | 2 +- Misc/NEWS.d/3.10.0a4.rst | 4 +-- Misc/NEWS.d/3.10.0a6.rst | 2 +- Misc/NEWS.d/3.10.0a7.rst | 4 +-- Misc/NEWS.d/3.10.0b1.rst | 2 +- Misc/NEWS.d/3.11.0a1.rst | 24 +++++++------- Misc/NEWS.d/3.11.0a2.rst | 10 +++--- Misc/NEWS.d/3.11.0a3.rst | 2 +- Misc/NEWS.d/3.11.0a5.rst | 2 +- Misc/NEWS.d/3.11.0a6.rst | 6 ++-- Misc/NEWS.d/3.11.0a7.rst | 4 +-- Misc/NEWS.d/3.11.0b1.rst | 2 +- Misc/NEWS.d/3.12.0a1.rst | 14 ++++---- Misc/NEWS.d/3.12.0a2.rst | 2 +- Misc/NEWS.d/3.12.0a3.rst | 2 +- Misc/NEWS.d/3.12.0a4.rst | 2 +- Misc/NEWS.d/3.12.0a5.rst | 6 ++-- Misc/NEWS.d/3.12.0a6.rst | 2 +- Misc/NEWS.d/3.12.0b1.rst | 8 ++--- Misc/NEWS.d/3.5.4.rst | 2 +- Misc/NEWS.d/3.5.4rc1.rst | 2 +- Misc/NEWS.d/3.6.2rc1.rst | 6 ++-- Misc/NEWS.d/3.6.3rc1.rst | 2 +- Misc/NEWS.d/3.6.6rc1.rst | 2 +- Misc/NEWS.d/3.7.0a1.rst | 8 ++--- Misc/NEWS.d/3.7.0a3.rst | 4 +-- Misc/NEWS.d/3.7.0b5.rst | 2 +- Misc/NEWS.d/3.8.0a1.rst | 4 +-- Misc/NEWS.d/3.9.0a1.rst | 20 ++++++------ Misc/NEWS.d/3.9.0a3.rst | 16 +++++----- Misc/NEWS.d/3.9.0a4.rst | 6 ++-- Misc/NEWS.d/3.9.0a5.rst | 14 ++++---- Misc/NEWS.d/3.9.0b1.rst | 6 ++-- ...-06-05-23-38-43.gh-issue-104635.VYZhVh.rst | 2 +- ...3-07-06-00-35-44.gh-issue-96844.kwvoS-.rst | 2 +- ...-07-23-13-07-34.gh-issue-107122.9HFUyb.rst | 2 +- ...-07-23-21-16-54.gh-issue-107122.VNuNcq.rst | 2 +- ...-07-18-23-05-12.gh-issue-106751.tVvzN_.rst | 2 +- ...-07-19-10-45-24.gh-issue-106751.3HJ1of.rst | 2 +- ...-08-15-18-20-00.gh-issue-107963.20g5BG.rst | 2 +- 49 files changed, 149 insertions(+), 149 deletions(-) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 1e6e0befa9819a..20cabbd25cc686 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -878,7 +878,7 @@ Other Language Changes (Contributed by Raymond Hettinger in :issue:`43475`.) * A :exc:`SyntaxError` (instead of a :exc:`NameError`) will be raised when deleting - the :const:`__debug__` constant. (Contributed by Dong-hee Na in :issue:`45000`.) + the :const:`__debug__` constant. (Contributed by Donghee Na in :issue:`45000`.) * :exc:`SyntaxError` exceptions now have ``end_lineno`` and ``end_offset`` attributes. They will be ``None`` if not determined. @@ -1255,7 +1255,7 @@ pipe. (Contributed by Pablo Galindo in :issue:`41625`.) Add :const:`~os.O_EVTONLY`, :const:`~os.O_FSYNC`, :const:`~os.O_SYMLINK` and :const:`~os.O_NOFOLLOW_ANY` for macOS. -(Contributed by Dong-hee Na in :issue:`43106`.) +(Contributed by Donghee Na in :issue:`43106`.) os.path ------- @@ -1582,7 +1582,7 @@ Optimizations * The following built-in functions now support the faster :pep:`590` vectorcall calling convention: :func:`map`, :func:`filter`, :func:`reversed`, :func:`bool` and :func:`float`. - (Contributed by Dong-hee Na and Jeroen Demeyer in :issue:`43575`, :issue:`43287`, :issue:`41922`, :issue:`41873` and :issue:`41870`.) + (Contributed by Donghee Na and Jeroen Demeyer in :issue:`43575`, :issue:`43287`, :issue:`41922`, :issue:`41873` and :issue:`41870`.) * :class:`BZ2File` performance is improved by removing internal ``RLock``. This makes :class:`BZ2File` thread unsafe in the face of multiple simultaneous @@ -1817,7 +1817,7 @@ Removed scheduled to be removed in Python 3.6, but such removals were delayed until after Python 2.7 EOL. Existing users should copy whatever classes they use into their code. - (Contributed by Dong-hee Na and Terry J. Reedy in :issue:`42299`.) + (Contributed by Donghee Na and Terry J. Reedy in :issue:`42299`.) * Removed the :c:func:`!PyModule_GetWarningsModule` function that was useless now due to the :mod:`!_warnings` module was converted to a builtin module in 2.6. diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index cc5cfee08d2b32..51f21532cdecb8 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -499,7 +499,7 @@ Other CPython Implementation Changes * The special methods :meth:`~object.__complex__` for :class:`complex` and :meth:`~object.__bytes__` for :class:`bytes` are implemented to support the :class:`typing.SupportsComplex` and :class:`typing.SupportsBytes` protocols. - (Contributed by Mark Dickinson and Dong-hee Na in :issue:`24234`.) + (Contributed by Mark Dickinson and Donghee Na in :issue:`24234`.) * ``siphash13`` is added as a new internal hashing algorithm. It has similar security properties as ``siphash24``, @@ -897,7 +897,7 @@ os * On Windows, :func:`os.urandom` now uses ``BCryptGenRandom()``, instead of ``CryptGenRandom()`` which is deprecated. - (Contributed by Dong-hee Na in :issue:`44611`.) + (Contributed by Donghee Na in :issue:`44611`.) .. _whatsnew311-pathlib: @@ -1089,7 +1089,7 @@ time `_ which has a resolution of 100 nanoseconds (10\ :sup:`-7` seconds). Previously, it had a resolution of 1 millisecond (10\ :sup:`-3` seconds). - (Contributed by Benjamin Szőke, Dong-hee Na, Eryk Sun and Victor Stinner in :issue:`21302` and :issue:`45429`.) + (Contributed by Benjamin Szőke, Donghee Na, Eryk Sun and Victor Stinner in :issue:`21302` and :issue:`45429`.) .. _whatsnew311-tkinter: @@ -1305,7 +1305,7 @@ This section covers specific optimizations independent of the * :func:`unicodedata.normalize` now normalizes pure-ASCII strings in constant time. - (Contributed by Dong-hee Na in :issue:`44987`.) + (Contributed by Donghee Na in :issue:`44987`.) .. _whatsnew311-faster-cpython: @@ -1452,7 +1452,7 @@ Bucher, with additional help from Irit Katriel and Dennis Sweeney.) | | | | (up to) | | +===============+====================+=======================================================+===================+===================+ | Binary | ``x + x`` | Binary add, multiply and subtract for common types | 10% | Mark Shannon, | -| operations | | such as :class:`int`, :class:`float` and :class:`str` | | Dong-hee Na, | +| operations | | such as :class:`int`, :class:`float` and :class:`str` | | Donghee Na, | | | ``x - x`` | take custom fast paths for their underlying types. | | Brandt Bucher, | | | | | | Dennis Sweeney | | | ``x * x`` | | | | @@ -1839,7 +1839,7 @@ Standard Library * :class:`!webbrowser.MacOSX` is deprecated and will be removed in Python 3.13. It is untested, undocumented, and not used by :mod:`webbrowser` itself. - (Contributed by Dong-hee Na in :issue:`42255`.) + (Contributed by Donghee Na in :issue:`42255`.) * The behavior of returning a value from a :class:`~unittest.TestCase` and :class:`~unittest.IsolatedAsyncioTestCase` test methods (other than the @@ -1984,7 +1984,7 @@ Removed C APIs are :ref:`listed separately `. :meth:`!NullTranslations.set_output_charset` methods, and the *codeset* parameter of :func:`!translation` and :func:`!install`, since they are only used for the :func:`!l*gettext` functions. - (Contributed by Dong-hee Na and Serhiy Storchaka in :issue:`44235`.) + (Contributed by Donghee Na and Serhiy Storchaka in :issue:`44235`.) * Removed from the :mod:`inspect` module: @@ -2009,7 +2009,7 @@ Removed C APIs are :ref:`listed separately `. * Removed the :class:`!MailmanProxy` class in the :mod:`smtpd` module, as it is unusable without the external :mod:`!mailman` package. - (Contributed by Dong-hee Na in :issue:`35800`.) + (Contributed by Donghee Na in :issue:`35800`.) * Removed the deprecated :meth:`!split` method of :class:`!_tkinter.TkappType`. (Contributed by Erlend E. Aasland in :issue:`38371`.) @@ -2151,7 +2151,7 @@ Build Changes * CPython can now be built with the `ThinLTO `_ option via passing ``thin`` to :option:`--with-lto`, i.e. ``--with-lto=thin``. - (Contributed by Dong-hee Na and Brett Holman in :issue:`44340`.) + (Contributed by Donghee Na and Brett Holman in :issue:`44340`.) * Freelists for object structs can now be disabled. A new :program:`configure` option :option:`--without-freelists` can be used to disable all freelists diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 1223f859265ed9..4ee87974a98d16 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -484,7 +484,7 @@ Other Language Changes (Contributed by Serhiy Storchaka in :gh:`87995`.) * :class:`memoryview` now supports the half-float type (the "e" format code). - (Contributed by Dong-hee Na and Antoine Pitrou in :gh:`90751`.) + (Contributed by Donghee Na and Antoine Pitrou in :gh:`90751`.) * The parser now raises :exc:`SyntaxError` when parsing source code containing null bytes. (Contributed by Pablo Galindo in :gh:`96670`.) @@ -979,7 +979,7 @@ Optimizations * Added experimental support for using the BOLT binary optimizer in the build process, which improves performance by 1-5%. - (Contributed by Kevin Modzelewski in :gh:`90536` and tuned by Dong-hee Na in :gh:`101525`) + (Contributed by Kevin Modzelewski in :gh:`90536` and tuned by Donghee Na in :gh:`101525`) * Speed up the regular expression substitution (functions :func:`re.sub` and :func:`re.subn` and corresponding :class:`!re.Pattern` methods) for @@ -1637,7 +1637,7 @@ Changes in the Python API so only a very small set of users might be affected. This change helps with interpreter isolation. Furthermore, :mod:`syslog` is a wrapper around process-global resources, which are best managed from the main interpreter. - (Contributed by Dong-hee Na in :gh:`99127`.) + (Contributed by Donghee Na in :gh:`99127`.) * The undocumented locking behavior of :func:`~functools.cached_property` is removed, because it locked across all instances of the class, leading to high @@ -1711,7 +1711,7 @@ Build Changes * CPython now uses the ThinLTO option as the default link time optimization policy if the Clang compiler accepts the flag. - (Contributed by Dong-hee Na in :gh:`89536`.) + (Contributed by Donghee Na in :gh:`89536`.) * Add ``COMPILEALL_OPTS`` variable in Makefile to override :mod:`compileall` options (default: ``-j0``) in ``make install``. Also merged the 3 diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index b4411a587c8bc7..ce799ccd1fdcdf 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -132,7 +132,7 @@ dbm * Add :meth:`dbm.gnu.gdbm.clear` and :meth:`dbm.ndbm.ndbm.clear` methods that remove all items from the database. - (Contributed by Dong-hee Na in :gh:`107122`.) + (Contributed by Donghee Na in :gh:`107122`.) doctest ------- diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 7946bf910af2c4..6d1104938dafa8 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -947,7 +947,7 @@ This made it difficult to update, experiment with, or teach the various logging configuration options using the interactive prompt or a Jupyter notebook. -(Suggested by Raymond Hettinger, implemented by Dong-hee Na, and +(Suggested by Raymond Hettinger, implemented by Donghee Na, and reviewed by Vinay Sajip in :issue:`33897`.) @@ -1714,7 +1714,7 @@ Deprecated * The :meth:`~threading.Thread.isAlive()` method of :class:`threading.Thread` has been deprecated. - (Contributed by Dong-hee Na in :issue:`35283`.) + (Contributed by Donghee Na in :issue:`35283`.) * Many builtin and extension functions that take integer arguments will now emit a deprecation warning for :class:`~decimal.Decimal`\ s, diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 8e2df19419bfc2..ce7ae510577220 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -415,7 +415,7 @@ datetime The :meth:`~datetime.date.isocalendar()` of :class:`datetime.date` and :meth:`~datetime.datetime.isocalendar()` of :class:`datetime.datetime` methods now returns a :func:`~collections.namedtuple` instead of a :class:`tuple`. -(Contributed by Dong-hee Na in :issue:`24416`.) +(Contributed by Donghee Na in :issue:`24416`.) distutils --------- @@ -429,14 +429,14 @@ fcntl Added constants :const:`~fcntl.F_OFD_GETLK`, :const:`~fcntl.F_OFD_SETLK` and :const:`~fcntl.F_OFD_SETLKW`. -(Contributed by Dong-hee Na in :issue:`38602`.) +(Contributed by Donghee Na in :issue:`38602`.) ftplib ------- :class:`~ftplib.FTP` and :class:`~ftplib.FTP_TLS` now raise a :class:`ValueError` if the given timeout for their constructor is zero to prevent the creation of -a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) +a non-blocking socket. (Contributed by Donghee Na in :issue:`39259`.) gc -- @@ -468,7 +468,7 @@ http ---- HTTP status codes ``103 EARLY_HINTS``, ``418 IM_A_TEAPOT`` and ``425 TOO_EARLY`` are added to -:class:`http.HTTPStatus`. (Contributed by Dong-hee Na in :issue:`39509` and Ross Rhodes in :issue:`39507`.) +:class:`http.HTTPStatus`. (Contributed by Donghee Na in :issue:`39509` and Ross Rhodes in :issue:`39507`.) IDLE and idlelib ---------------- @@ -509,14 +509,14 @@ an optional *timeout* parameter for their constructors. Also, the :meth:`~imaplib.IMAP4.open` method now has an optional *timeout* parameter with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and :class:`~imaplib.IMAP4_stream` were applied to this change. -(Contributed by Dong-hee Na in :issue:`38615`.) +(Contributed by Donghee Na in :issue:`38615`.) :meth:`imaplib.IMAP4.unselect` is added. :meth:`imaplib.IMAP4.unselect` frees server's resources associated with the selected mailbox and returns the server to the authenticated state. This command performs the same actions as :meth:`imaplib.IMAP4.close`, except that no messages are permanently removed from the currently -selected mailbox. (Contributed by Dong-hee Na in :issue:`40375`.) +selected mailbox. (Contributed by Donghee Na in :issue:`40375`.) importlib --------- @@ -588,13 +588,13 @@ nntplib :class:`~!nntplib.NNTP` and :class:`~!nntplib.NNTP_SSL` now raise a :class:`ValueError` if the given timeout for their constructor is zero to prevent the creation of -a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) +a non-blocking socket. (Contributed by Donghee Na in :issue:`39259`.) os -- Added :const:`~os.CLD_KILLED` and :const:`~os.CLD_STOPPED` for :attr:`si_code`. -(Contributed by Dong-hee Na in :issue:`38493`.) +(Contributed by Donghee Na in :issue:`38493`.) Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and :const:`os.P_PIDFD` (:issue:`38713`) for process management with file @@ -629,7 +629,7 @@ poplib :class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a :class:`ValueError` if the given timeout for their constructor is zero to prevent the creation of -a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) +a non-blocking socket. (Contributed by Donghee Na in :issue:`39259`.) pprint ------ @@ -661,10 +661,10 @@ smtplib :class:`~smtplib.SMTP` and :class:`~smtplib.SMTP_SSL` now raise a :class:`ValueError` if the given timeout for their constructor is zero to prevent the creation of -a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) +a non-blocking socket. (Contributed by Donghee Na in :issue:`39259`.) :class:`~smtplib.LMTP` constructor now has an optional *timeout* parameter. -(Contributed by Dong-hee Na in :issue:`39329`.) +(Contributed by Donghee Na in :issue:`39329`.) socket ------ @@ -777,7 +777,7 @@ Optimizations * A number of Python builtins (:class:`range`, :class:`tuple`, :class:`set`, :class:`frozenset`, :class:`list`, :class:`dict`) are now sped up by using :pep:`590` vectorcall protocol. - (Contributed by Dong-hee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in :issue:`37207`.) + (Contributed by Donghee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in :issue:`37207`.) * Optimized :func:`~set.difference_update` for the case when the other set is much larger than the base set. @@ -791,7 +791,7 @@ Optimizations * :term:`floor division` of float operation now has a better performance. Also the message of :exc:`ZeroDivisionError` for this operation is updated. - (Contributed by Dong-hee Na in :issue:`39434`.) + (Contributed by Donghee Na in :issue:`39434`.) * Decoding short ASCII strings with UTF-8 and ascii codecs is now about 15% faster. (Contributed by Inada Naoki in :issue:`37348`.) @@ -961,7 +961,7 @@ Removed are not supported or not enabled by NNTP server administrators. For ``xgtitle()``, please use :meth:`!nntplib.NNTP.descriptions` or :meth:`!nntplib.NNTP.description` instead. - (Contributed by Dong-hee Na in :issue:`39366`.) + (Contributed by Donghee Na in :issue:`39366`.) * :class:`array.array`: ``tostring()`` and ``fromstring()`` methods have been removed. They were aliases to ``tobytes()`` and ``frombytes()``, deprecated @@ -994,7 +994,7 @@ Removed * The :meth:`~threading.Thread.isAlive()` method of :class:`threading.Thread` has been removed. It was deprecated since Python 3.8. Use :meth:`~threading.Thread.is_alive()` instead. - (Contributed by Dong-hee Na in :issue:`37804`.) + (Contributed by Donghee Na in :issue:`37804`.) * Methods ``getchildren()`` and ``getiterator()`` of classes :class:`~xml.etree.ElementTree.ElementTree` and @@ -1315,7 +1315,7 @@ New Features * The :c:func:`PyModule_AddType` function is added to help adding a type to a module. - (Contributed by Dong-hee Na in :issue:`40024`.) + (Contributed by Donghee Na in :issue:`40024`.) * Added the functions :c:func:`PyObject_GC_IsTracked` and :c:func:`PyObject_GC_IsFinalized` to the public API to allow to query if diff --git a/Misc/ACKS b/Misc/ACKS index b8a4f10347d74e..aaa178fc3b5d08 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1271,7 +1271,7 @@ R. David Murray Matti Mäki Jörg Müller Kaushik N -Dong-hee Na +Donghee Na Dale Nagata John Nagle Takahiro Nakayama diff --git a/Misc/NEWS.d/3.10.0a1.rst b/Misc/NEWS.d/3.10.0a1.rst index 79d85a40df8bbe..a9f25b482508ba 100644 --- a/Misc/NEWS.d/3.10.0a1.rst +++ b/Misc/NEWS.d/3.10.0a1.rst @@ -68,7 +68,7 @@ getting the ``__bases__`` attribute leads to infinite recursion. .. section: Core and Builtins Speed up calls to ``reversed()`` by using the :pep:`590` ``vectorcall`` -calling convention. Patch by Dong-hee Na. +calling convention. Patch by Donghee Na. .. @@ -88,7 +88,7 @@ convention. Patch by Dennis Sweeney. .. section: Core and Builtins Speed up calls to ``bool()`` by using the :pep:`590` ``vectorcall`` calling -convention. Patch by Dong-hee Na. +convention. Patch by Donghee Na. .. @@ -715,7 +715,7 @@ Fix refleak in _Py_fopen_obj() when PySys_Audit() fails .. section: Core and Builtins Add a state to the :mod:`!nis` module (:pep:`3121`) and apply the multiphase -initialization. Patch by Dong-hee Na. +initialization. Patch by Donghee Na. .. @@ -936,7 +936,7 @@ class. Patch by Pablo Galindo. .. section: Core and Builtins :c:func:`Py_TYPE()` is changed to the inline static function. Patch by -Dong-hee Na. +Donghee Na. .. @@ -2596,7 +2596,7 @@ remove multiple items from a list". .. section: Documentation Fix RemovedInSphinx40Warning when building the documentation. Patch by -Dong-hee Na. +Donghee Na. .. @@ -2862,7 +2862,7 @@ Make test_gdb properly run on HP-UX. Patch by Michael Osipov. .. section: Build Update :c:macro:`Py_UNREACHABLE` to use __builtin_unreachable() if only the -compiler is able to use it. Patch by Dong-hee Na. +compiler is able to use it. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.10.0a2.rst b/Misc/NEWS.d/3.10.0a2.rst index 78b25779802d6e..78f4377656b0cc 100644 --- a/Misc/NEWS.d/3.10.0a2.rst +++ b/Misc/NEWS.d/3.10.0a2.rst @@ -185,7 +185,7 @@ Removed special methods ``__int__``, ``__float__``, ``__floordiv__``, Micro optimization when compute :c:member:`~PySequenceMethods.sq_item` and :c:member:`~PyMappingMethods.mp_subscript` of :class:`range`. Patch by -Dong-hee Na. +Donghee Na. .. @@ -205,7 +205,7 @@ error message using the current locale's encoding. .. nonce: iLoMVF .. section: Core and Builtins -Micro optimization for range.index if step is 1. Patch by Dong-hee Na. +Micro optimization for range.index if step is 1. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.10.0a3.rst b/Misc/NEWS.d/3.10.0a3.rst index 70d5ce1319c99f..7112819c1b4118 100644 --- a/Misc/NEWS.d/3.10.0a3.rst +++ b/Misc/NEWS.d/3.10.0a3.rst @@ -394,7 +394,7 @@ Removed the ``formatter`` module, which was deprecated in Python 3.4. It is somewhat obsolete, little used, and not tested. It was originally scheduled to be removed in Python 3.6, but such removals were delayed until after Python 2.7 EOL. Existing users should copy whatever classes they use into -their code. Patch by Dong-hee Na and and Terry J. Reedy. +their code. Patch by Donghee Na and and Terry J. Reedy. .. diff --git a/Misc/NEWS.d/3.10.0a4.rst b/Misc/NEWS.d/3.10.0a4.rst index 95f9319668db45..414823f162d85c 100644 --- a/Misc/NEWS.d/3.10.0a4.rst +++ b/Misc/NEWS.d/3.10.0a4.rst @@ -105,7 +105,7 @@ blocks .. section: Core and Builtins Make the :mod:`atexit` module state per-interpreter. It is now safe have -more than one :mod:`atexit` module instance. Patch by Dong-hee Na and Victor +more than one :mod:`atexit` module instance. Patch by Donghee Na and Victor Stinner. .. @@ -768,7 +768,7 @@ results. Patch by Ammar Askar. .. section: Tests Update test_nntplib to use official group name of news.aioe.org for testing. -Patch by Dong-hee Na. +Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.10.0a6.rst b/Misc/NEWS.d/3.10.0a6.rst index 313aa689254040..c379b968c9885b 100644 --- a/Misc/NEWS.d/3.10.0a6.rst +++ b/Misc/NEWS.d/3.10.0a6.rst @@ -295,7 +295,7 @@ actual dictionary. This created problems for introspection tools. .. section: Library Added :const:`~os.O_EVTONLY`, :const:`~os.O_FSYNC`, :const:`~os.O_SYMLINK` and -:const:`~os.O_NOFOLLOW_ANY` for macOS. Patch by Dong-hee Na. +:const:`~os.O_NOFOLLOW_ANY` for macOS. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.10.0a7.rst b/Misc/NEWS.d/3.10.0a7.rst index 7933f71b01c14d..3a1694f444616a 100644 --- a/Misc/NEWS.d/3.10.0a7.rst +++ b/Misc/NEWS.d/3.10.0a7.rst @@ -113,7 +113,7 @@ in f-strings. Patch by Pablo Galindo. .. section: Core and Builtins Speed up calls to ``map()`` by using the :pep:`590` ``vectorcall`` calling -convention. Patch by Dong-hee Na. +convention. Patch by Donghee Na. .. @@ -240,7 +240,7 @@ of processes that don't use sigaltstack. .. section: Core and Builtins Speed up calls to ``filter()`` by using the :pep:`590` ``vectorcall`` -calling convention. Patch by Dong-hee Na. +calling convention. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.10.0b1.rst b/Misc/NEWS.d/3.10.0b1.rst index 3c71bc73b812a1..e7b6b93d0b6df3 100644 --- a/Misc/NEWS.d/3.10.0b1.rst +++ b/Misc/NEWS.d/3.10.0b1.rst @@ -516,7 +516,7 @@ encoding. .. section: Library Removed an unnecessary list comprehension before looping from -:func:`urllib.parse.parse_qsl`. Patch by Christoph Zwerschke and Dong-hee +:func:`urllib.parse.parse_qsl`. Patch by Christoph Zwerschke and Donghee Na. .. diff --git a/Misc/NEWS.d/3.11.0a1.rst b/Misc/NEWS.d/3.11.0a1.rst index e1d0adc478029f..7c991e7667b01a 100644 --- a/Misc/NEWS.d/3.11.0a1.rst +++ b/Misc/NEWS.d/3.11.0a1.rst @@ -292,7 +292,7 @@ Fixed pickling of range iterators that iterated for over ``2**32`` times. .. section: Core and Builtins A :exc:`SyntaxError` is now raised when trying to delete :const:`__debug__`. -Patch by Dong-hee Na. +Patch by Donghee Na. .. @@ -415,7 +415,7 @@ type :class:`float` or :class:`complex`. .. section: Core and Builtins A debug variable :envvar:`PYTHONDUMPREFSFILE` is added for creating a dump -file which is generated by :option:`--with-trace-refs`. Patch by Dong-hee +file which is generated by :option:`--with-trace-refs`. Patch by Donghee Na. .. @@ -670,7 +670,7 @@ Parameter substitution of the union type with wrong types now raises .. section: Core and Builtins Update ``property_descr_set`` to use vectorcall if possible. Patch by -Dong-hee Na. +Donghee Na. .. @@ -732,7 +732,7 @@ Collapse union of equal types. E.g. the result of ``int | int`` is now On Windows, :func:`os.urandom`: uses BCryptGenRandom API instead of CryptGenRandom API which is deprecated from Microsoft Windows API. Patch by -Dong-hee Na. +Donghee Na. .. @@ -1657,7 +1657,7 @@ Patch by Hugo van Kemenade. .. section: Library Pure ASCII strings are now normalized in constant time by -:func:`unicodedata.normalize`. Patch by Dong-hee Na. +:func:`unicodedata.normalize`. Patch by Donghee Na. .. @@ -1968,7 +1968,7 @@ A new function ``operator.call`` has been added, such that :class:`!webbrowser.MacOSX` is deprecated and will be removed in Python 3.13. It is untested and undocumented and also not used by :mod:`webbrowser` itself. -Patch by Dong-hee Na. +Patch by Donghee Na. .. @@ -2465,7 +2465,7 @@ generator .. section: Library Make the implementation consistency of :func:`~operator.indexOf` between C -and Python versions. Patch by Dong-hee Na. +and Python versions. Patch by Donghee Na. .. @@ -2752,7 +2752,7 @@ of reserved filenames, including those with trailing spaces or colons. .. section: Library Fix :meth:`~email.message.MIMEPart.as_string` to pass unixfrom properly. -Patch by Dong-hee Na. +Patch by Donghee Na. .. @@ -2809,7 +2809,7 @@ behaves differently than the similar implementation in :mod:`sysconfig`. .. section: Library :class:`smtpd.MailmanProxy` is now removed as it is unusable without an -external module, ``mailman``. Patch by Dong-hee Na. +external module, ``mailman``. Patch by Donghee Na. .. @@ -2916,7 +2916,7 @@ Support PEP 515 for Fraction's initialization from string. .. nonce: qFBYpp .. section: Library -Remove deprecated functions in the :mod:`gettext`. Patch by Dong-hee Na. +Remove deprecated functions in the :mod:`gettext`. Patch by Donghee Na. .. @@ -4471,7 +4471,7 @@ and modify the frozen modules. .. section: Build Add support for building with clang thin lto via --with-lto=thin/full. Patch -by Dong-hee Na and Brett Holman. +by Donghee Na and Brett Holman. .. @@ -4798,7 +4798,7 @@ Allow the Argument Clinic tool to handle ``__complex__`` special methods. Removed the 'test2to3' demo project that demonstrated using lib2to3 to support Python 2.x and Python 3.x from a single source in a distutils -package. Patch by Dong-hee Na +package. Patch by Donghee Na .. diff --git a/Misc/NEWS.d/3.11.0a2.rst b/Misc/NEWS.d/3.11.0a2.rst index cf26137dff19ef..503e489b658e4d 100644 --- a/Misc/NEWS.d/3.11.0a2.rst +++ b/Misc/NEWS.d/3.11.0a2.rst @@ -142,7 +142,7 @@ Add SipHash13 for string hash algorithm and use it by default. .. nonce: CTUT8s .. section: Core and Builtins -Fix reference leak from descr_check. Patch by Dong-hee Na. +Fix reference leak from descr_check. Patch by Donghee Na. .. @@ -263,7 +263,7 @@ Improve the generated bytecode for class and mapping patterns. .. section: Core and Builtins Speed up calls to ``enumerate()`` by using the :pep:`590` ``vectorcall`` -calling convention. Patch by Dong-hee Na. +calling convention. Patch by Donghee Na. .. @@ -396,7 +396,7 @@ Patch by Inada Naoki. .. section: Library Update :class:`~typing.ForwardRef` to support ``|`` operator. Patch by -Dong-hee Na. +Donghee Na. .. @@ -486,7 +486,7 @@ Patch by Joongi Kim. .. section: Library Empty escapechar/quotechar is not allowed when initializing -:class:`csv.Dialect`. Patch by Vajrasky Kok and Dong-hee Na. +:class:`csv.Dialect`. Patch by Vajrasky Kok and Donghee Na. .. @@ -569,7 +569,7 @@ formatting options. .. section: Library Improve error message of :class:`csv.Dialect` when initializing. Patch by -Vajrasky Kok and Dong-hee Na. +Vajrasky Kok and Donghee Na. .. diff --git a/Misc/NEWS.d/3.11.0a3.rst b/Misc/NEWS.d/3.11.0a3.rst index 7fdc191c244849..a96a59115797ee 100644 --- a/Misc/NEWS.d/3.11.0a3.rst +++ b/Misc/NEWS.d/3.11.0a3.rst @@ -615,7 +615,7 @@ Launch GNOME web browsers via gio tool instead of obsolete gvfs-open .. section: Library On Windows, :func:`time.sleep` now uses a waitable timer which supports -high-resolution timers. Patch by Dong-hee Na and Eryk Sun. +high-resolution timers. Patch by Donghee Na and Eryk Sun. .. diff --git a/Misc/NEWS.d/3.11.0a5.rst b/Misc/NEWS.d/3.11.0a5.rst index c28078da8d8339..08d94e82ed8ccf 100644 --- a/Misc/NEWS.d/3.11.0a5.rst +++ b/Misc/NEWS.d/3.11.0a5.rst @@ -127,7 +127,7 @@ Aditya. .. section: Core and Builtins Speed up calls to :meth:`weakref.ref.__call__` by using the :pep:`590` -``vectorcall`` calling convention. Patch by Dong-hee Na. +``vectorcall`` calling convention. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.11.0a6.rst b/Misc/NEWS.d/3.11.0a6.rst index fcec71c6f59da2..52055b3fafd485 100644 --- a/Misc/NEWS.d/3.11.0a6.rst +++ b/Misc/NEWS.d/3.11.0a6.rst @@ -382,7 +382,7 @@ involving lots of brackets. Patch by Pablo Galindo. .. section: Core and Builtins :mod:`ctypes` now allocates memory on the stack instead of on the heap to -pass arguments while calling a Python callback function. Patch by Dong-hee +pass arguments while calling a Python callback function. Patch by Donghee Na. .. @@ -441,7 +441,7 @@ Add a missing call to ``va_end()`` in ``Modules/_hashopenssl.c``. .. section: Core and Builtins Use :c:func:`PyObject_Vectorcall` while calling ctypes callback function. -Patch by Dong-hee Na. +Patch by Donghee Na. .. @@ -514,7 +514,7 @@ For performance, use the optimized string-searching implementations from .. section: Library :class:`~http.server.SimpleHTTPRequestHandler` now uses HTML5 grammar. Patch -by Dong-hee Na. +by Donghee Na. .. diff --git a/Misc/NEWS.d/3.11.0a7.rst b/Misc/NEWS.d/3.11.0a7.rst index 94c15f1c1f5237..6e41f9cbd933b5 100644 --- a/Misc/NEWS.d/3.11.0a7.rst +++ b/Misc/NEWS.d/3.11.0a7.rst @@ -89,7 +89,7 @@ problem. Define :c:macro:`PY_CALL_TRAMPOLINE` to enable call trampolines. .. section: Core and Builtins Some Windows system error codes(>= 10000) are now mapped into the correct -errno and may now raise a subclass of :exc:`OSError`. Patch by Dong-hee Na. +errno and may now raise a subclass of :exc:`OSError`. Patch by Donghee Na. .. @@ -1599,7 +1599,7 @@ Call the public :func:`sys.get_asyncgen_hooks` and .. section: C API Remove private functions ``_PySys_GetObjectId()`` and -``_PySys_SetObjectId()``. Patch by Dong-hee Na. +``_PySys_SetObjectId()``. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.11.0b1.rst b/Misc/NEWS.d/3.11.0b1.rst index 2bcccc7dae3734..a4cdda2cafdb43 100644 --- a/Misc/NEWS.d/3.11.0b1.rst +++ b/Misc/NEWS.d/3.11.0b1.rst @@ -185,7 +185,7 @@ functions leave the current exception unchanged. Patch by Victor Stinner. .. section: Core and Builtins Fix a minor memory leak at exit: release the memory of the -:class:`generic_alias_iterator` type. Patch by Dong-hee Na. +:class:`generic_alias_iterator` type. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.12.0a1.rst b/Misc/NEWS.d/3.12.0a1.rst index 5178f4055e7b8e..ebfe51ee61f34c 100644 --- a/Misc/NEWS.d/3.12.0a1.rst +++ b/Misc/NEWS.d/3.12.0a1.rst @@ -82,7 +82,7 @@ the test failed). .. nonce: eOBh8M .. section: Core and Builtins -Suppress ImportError for invalid query for help() command. Patch by Dong-hee +Suppress ImportError for invalid query for help() command. Patch by Donghee Na. .. @@ -164,7 +164,7 @@ to calculate those doing pointer arithmetic. .. section: Core and Builtins :func:`os.sched_yield` now release the GIL while calling sched_yield(2). -Patch by Dong-hee Na. +Patch by Donghee Na. .. @@ -465,7 +465,7 @@ Remove dead code from ``CALL_FUNCTION_EX`` opcode. .. nonce: VE8-zf .. section: Core and Builtins -:class:`memoryview` now supports half-floats. Patch by Dong-hee Na and +:class:`memoryview` now supports half-floats. Patch by Donghee Na and Antoine Pitrou. .. @@ -857,7 +857,7 @@ code objects could be "deduplicated" during compilation. .. section: Core and Builtins Reduce allocation size of :class:`list` from :meth:`str.split` and -:meth:`str.rsplit`. Patch by Dong-hee Na and Inada Naoki. +:meth:`str.rsplit`. Patch by Donghee Na and Inada Naoki. .. @@ -3742,7 +3742,7 @@ Fix :func:`ast.unparse` when ``ImportFrom.level`` is None Now :func:`~dis.dis` and :func:`~dis.get_instructions` handle operand values for instructions prefixed by ``EXTENDED_ARG_QUICK``. Patch by Sam Gross and -Dong-hee Na. +Donghee Na. .. @@ -5004,7 +5004,7 @@ Patch by Illia Volochii and Adam Turner. .. section: Build Fix the build process of clang compiler for :program:`_bootstrap_python` if -LTO optimization is applied. Patch by Matthias Görgens and Dong-hee Na. +LTO optimization is applied. Patch by Matthias Görgens and Donghee Na. .. @@ -5024,7 +5024,7 @@ LTO optimization is applied. Patch by Matthias Görgens and Dong-hee Na. .. section: Build CPython now uses the ThinLTO option as the default policy if the Clang -compiler accepts the flag. Patch by Dong-hee Na. +compiler accepts the flag. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.12.0a2.rst b/Misc/NEWS.d/3.12.0a2.rst index f781e38665a8ea..41f5f67df01d91 100644 --- a/Misc/NEWS.d/3.12.0a2.rst +++ b/Misc/NEWS.d/3.12.0a2.rst @@ -111,7 +111,7 @@ back to alternative names ("python", "python."). .. section: Core and Builtins Update :mod:`faulthandler` to emit an error message with the proper -unexpected signal number. Patch by Dong-hee Na. +unexpected signal number. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.12.0a3.rst b/Misc/NEWS.d/3.12.0a3.rst index 3e6f8de5d911f2..27bd456f3f05d9 100644 --- a/Misc/NEWS.d/3.12.0a3.rst +++ b/Misc/NEWS.d/3.12.0a3.rst @@ -153,7 +153,7 @@ to specialize attribute accesses on types that haven't had .. section: Core and Builtins Allow some features of :mod:`syslog` to the main interpreter only. Patch by -Dong-hee Na. +Donghee Na. .. diff --git a/Misc/NEWS.d/3.12.0a4.rst b/Misc/NEWS.d/3.12.0a4.rst index 8951490f41b94c..b3b39024056ccc 100644 --- a/Misc/NEWS.d/3.12.0a4.rst +++ b/Misc/NEWS.d/3.12.0a4.rst @@ -676,7 +676,7 @@ parameter names in the C implementation. Patch by Alex Waygood. .. section: Library Update :exc:`~urllib.error.HTTPError` to be initialized properly, even if -the ``fp`` is ``None``. Patch by Dong-hee Na. +the ``fp`` is ``None``. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.12.0a5.rst b/Misc/NEWS.d/3.12.0a5.rst index f6f8de46cf70d9..8cf90b0e9cde46 100644 --- a/Misc/NEWS.d/3.12.0a5.rst +++ b/Misc/NEWS.d/3.12.0a5.rst @@ -38,7 +38,7 @@ would get out of sync, causing inconsistent behavior and crashes. .. section: Core and Builtins Fix wrong lineno in exception message on :keyword:`continue` or -:keyword:`break` which are not in a loop. Patch by Dong-hee Na. +:keyword:`break` which are not in a loop. Patch by Donghee Na. .. @@ -48,7 +48,7 @@ Fix wrong lineno in exception message on :keyword:`continue` or .. section: Core and Builtins Fix :func:`~unicodedata.is_normalized` to properly handle the UCD 3.2.0 -cases. Patch by Dong-hee Na. +cases. Patch by Donghee Na. .. @@ -507,7 +507,7 @@ inheritance. .. section: Build Update BOLT configration not to use depreacted usage of ``--split -functions``. Patch by Dong-hee Na. +functions``. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.12.0a6.rst b/Misc/NEWS.d/3.12.0a6.rst index 07967028bdee70..5bd600cd8b6fc0 100644 --- a/Misc/NEWS.d/3.12.0a6.rst +++ b/Misc/NEWS.d/3.12.0a6.rst @@ -220,7 +220,7 @@ access of ``builtins.__dict__`` keys mutates the iter object. .. section: Core and Builtins Update :mod:`tracemalloc` to handle presize of object properly. Patch by -Dong-hee Na. +Donghee Na. .. diff --git a/Misc/NEWS.d/3.12.0b1.rst b/Misc/NEWS.d/3.12.0b1.rst index 652b706880fb92..0944dfd0e90ab9 100644 --- a/Misc/NEWS.d/3.12.0b1.rst +++ b/Misc/NEWS.d/3.12.0b1.rst @@ -213,7 +213,7 @@ attribute. .. section: Core and Builtins Reduce object creation while calling callback function from gc. Patch by -Dong-hee Na. +Donghee Na. .. @@ -464,7 +464,7 @@ unpickled. .. section: Core and Builtins Migrate :meth:`~ssl.SSLContext.set_ecdh_curve` method not to use deprecated -OpenSSL APIs. Patch by Dong-hee Na. +OpenSSL APIs. Patch by Donghee Na. .. @@ -2073,7 +2073,7 @@ Define ``.PHONY`` / virtual make targets consistently and properly. .. nonce: -W9BJS .. section: Build -Add gcc fallback of mkfifoat/mknodat for macOS. Patch by Dong-hee Na. +Add gcc fallback of mkfifoat/mknodat for macOS. Patch by Donghee Na. .. @@ -2372,7 +2372,7 @@ Add a new C-API function to eagerly assign a version tag to a PyTypeObject: .. section: C API :c:func:`PyObject_GC_Resize` should calculate preheader size if needed. -Patch by Dong-hee Na. +Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.5.4.rst b/Misc/NEWS.d/3.5.4.rst index cd0ca4872f1ab0..7839fa2709ecf2 100644 --- a/Misc/NEWS.d/3.5.4.rst +++ b/Misc/NEWS.d/3.5.4.rst @@ -5,4 +5,4 @@ .. section: Library ftplib.FTP.putline() now throws ValueError on commands that contains CR or -LF. Patch by Dong-hee Na. +LF. Patch by Donghee Na. diff --git a/Misc/NEWS.d/3.5.4rc1.rst b/Misc/NEWS.d/3.5.4rc1.rst index 04a035a41e7461..d65d5d14ee78bb 100644 --- a/Misc/NEWS.d/3.5.4rc1.rst +++ b/Misc/NEWS.d/3.5.4rc1.rst @@ -340,7 +340,7 @@ not keep objects alive longer than expected. .. section: Library inspect.signature() now supports callables with variable-argument parameters -wrapped with partialmethod. Patch by Dong-hee Na. +wrapped with partialmethod. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.6.2rc1.rst b/Misc/NEWS.d/3.6.2rc1.rst index cdf4c3d541c4ca..28eb88f79130c5 100644 --- a/Misc/NEWS.d/3.6.2rc1.rst +++ b/Misc/NEWS.d/3.6.2rc1.rst @@ -77,7 +77,7 @@ delivered to the innermost frame. .. section: Core and Builtins sys.getsizeof() on a code object now returns the sizes which includes the -code struct and sizes of objects which it references. Patch by Dong-hee Na. +code struct and sizes of objects which it references. Patch by Donghee Na. .. @@ -163,7 +163,7 @@ no longer ignored. Patch by Mircea Cosbuc. .. nonce: I2mDTz .. section: Library -Functional API of enum allows to create empty enums. Patched by Dong-hee Na +Functional API of enum allows to create empty enums. Patched by Donghee Na .. @@ -202,7 +202,7 @@ not keep objects alive longer than expected. .. section: Library inspect.signature() now supports callables with variable-argument parameters -wrapped with partialmethod. Patch by Dong-hee Na. +wrapped with partialmethod. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.6.3rc1.rst b/Misc/NEWS.d/3.6.3rc1.rst index 4dc2eef5d3b61b..4b2aae9dc88441 100644 --- a/Misc/NEWS.d/3.6.3rc1.rst +++ b/Misc/NEWS.d/3.6.3rc1.rst @@ -506,7 +506,7 @@ Fix handling of long oids in ssl. Based on patch by Christian Heimes. .. section: Library ftplib.FTP.putline() now throws ValueError on commands that contains CR or -LF. Patch by Dong-hee Na. +LF. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.6.6rc1.rst b/Misc/NEWS.d/3.6.6rc1.rst index 71a5c3ec595ba2..9624195c79043b 100644 --- a/Misc/NEWS.d/3.6.6rc1.rst +++ b/Misc/NEWS.d/3.6.6rc1.rst @@ -289,7 +289,7 @@ literals on pydoc. Patch by Andrés Delfino. .. section: Library Update error message when constructing invalid inspect.Parameters Patch by -Dong-hee Na. +Donghee Na. .. diff --git a/Misc/NEWS.d/3.7.0a1.rst b/Misc/NEWS.d/3.7.0a1.rst index 712558bf98d018..bee424241fd712 100644 --- a/Misc/NEWS.d/3.7.0a1.rst +++ b/Misc/NEWS.d/3.7.0a1.rst @@ -529,7 +529,7 @@ name are now supported. .. section: Core and Builtins sys.getsizeof() on a code object now returns the sizes which includes the -code struct and sizes of objects which it references. Patch by Dong-hee Na. +code struct and sizes of objects which it references. Patch by Donghee Na. .. @@ -2260,7 +2260,7 @@ Update zlib to 1.2.11. .. section: Library ftplib.FTP.putline() now throws ValueError on commands that contains CR or -LF. Patch by Dong-hee Na. +LF. Patch by Donghee Na. .. @@ -2329,7 +2329,7 @@ always return bytes. .. nonce: I2mDTz .. section: Library -Functional API of enum allows to create empty enums. Patched by Dong-hee Na +Functional API of enum allows to create empty enums. Patched by Donghee Na .. @@ -2612,7 +2612,7 @@ Fix handling escape characters in HZ codec. Based on patch by Ma Lin. .. section: Library inspect.signature() now supports callables with variable-argument parameters -wrapped with partialmethod. Patch by Dong-hee Na. +wrapped with partialmethod. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.7.0a3.rst b/Misc/NEWS.d/3.7.0a3.rst index 52df0e7e82b080..a968616f55be68 100644 --- a/Misc/NEWS.d/3.7.0a3.rst +++ b/Misc/NEWS.d/3.7.0a3.rst @@ -539,7 +539,7 @@ optional .. section: Library Updates 2to3 to convert from operator.isCallable(obj) to callable(obj). -Patch by Dong-hee Na. +Patch by Donghee Na. .. @@ -549,7 +549,7 @@ Patch by Dong-hee Na. .. section: Library inspect.signature should follow :pep:`8`, if the parameter has an annotation -and a default value. Patch by Dong-hee Na. +and a default value. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.7.0b5.rst b/Misc/NEWS.d/3.7.0b5.rst index 20476993b9652a..fb29109869188b 100644 --- a/Misc/NEWS.d/3.7.0b5.rst +++ b/Misc/NEWS.d/3.7.0b5.rst @@ -418,7 +418,7 @@ trigger a ``DeprecationWarning`` and have been marked for removal in Python .. section: Library Update error message when constructing invalid inspect.Parameters Patch by -Dong-hee Na. +Donghee Na. .. diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst index dbbfb6e8b0d68e..ac9eefd2d90714 100644 --- a/Misc/NEWS.d/3.8.0a1.rst +++ b/Misc/NEWS.d/3.8.0a1.rst @@ -1965,7 +1965,7 @@ result of an internal future if it's already done. .. section: Library Add a deprecated warning for the :meth:`threading.Thread.isAlive` method. -Patch by Dong-hee Na. +Patch by Donghee Na. .. @@ -4974,7 +4974,7 @@ Enum members. .. section: Library Update error message when constructing invalid inspect.Parameters Patch by -Dong-hee Na. +Donghee Na. .. diff --git a/Misc/NEWS.d/3.9.0a1.rst b/Misc/NEWS.d/3.9.0a1.rst index 5a4431b0fcf1c6..3f9512096b03cb 100644 --- a/Misc/NEWS.d/3.9.0a1.rst +++ b/Misc/NEWS.d/3.9.0a1.rst @@ -33,7 +33,7 @@ Fixes audit event for :func:`os.system` to be named ``os.system``. .. section: Security Escape the server title of :class:`xmlrpc.server.DocXMLRPCServer` when -rendering the document page as HTML. (Contributed by Dong-hee Na in +rendering the document page as HTML. (Contributed by Donghee Na in :issue:`38243`.) .. @@ -203,7 +203,7 @@ arguments in decorators. .. section: Core and Builtins Fix a segmentation fault when using reverse iterators of empty ``dict`` -objects. Patch by Dong-hee Na and Inada Naoki. +objects. Patch by Donghee Na and Inada Naoki. .. @@ -280,7 +280,7 @@ visited by ``tp_traverse()`` are valid. .. section: Core and Builtins Remove unnecessary intersection and update set operation in dictview with -empty set. (Contributed by Dong-hee Na in :issue:`38210`.) +empty set. (Contributed by Donghee Na in :issue:`38210`.) .. @@ -1194,7 +1194,7 @@ Expose the Linux ``pidfd_open`` syscall as :func:`os.pidfd_open`. .. section: Library Added constants :const:`~fcntl.F_OFD_GETLK`, :const:`~fcntl.F_OFD_SETLK` and -:const:`~fcntl.F_OFD_SETLKW` to the :mod:`fcntl` module. Patch by Dong-hee +:const:`~fcntl.F_OFD_SETLKW` to the :mod:`fcntl` module. Patch by Donghee Na. .. @@ -1284,7 +1284,7 @@ Fixed erroneous equality comparison in statistics.NormalDist(). .. section: Library Added :const:`~os.CLD_KILLED` and :const:`~os.CLD_STOPPED` for -:attr:`si_code`. Patch by Dong-hee Na. +:attr:`si_code`. Patch by Donghee Na. .. @@ -1882,7 +1882,7 @@ avoid dynamic lookup. .. section: Library Update :class:`importlib.machinery.BuiltinImporter` to use -``loader._ORIGIN`` instead of a hardcoded value. Patch by Dong-hee Na. +``loader._ORIGIN`` instead of a hardcoded value. Patch by Donghee Na. .. @@ -2080,7 +2080,7 @@ method which emits a deprecation warning and calls corresponding methody .. section: Library Update test_statistics.py to verify that the statistics module works well -for both C and Python implementations. Patch by Dong-hee Na +for both C and Python implementations. Patch by Donghee Na .. @@ -2201,7 +2201,7 @@ uses more than ``SIGSTKSZ`` bytes of stack memory on some platforms. .. nonce: AmXrik .. section: Library -Add C fastpath for statistics.NormalDist.inv_cdf() Patch by Dong-hee Na +Add C fastpath for statistics.NormalDist.inv_cdf() Patch by Donghee Na .. @@ -2210,7 +2210,7 @@ Add C fastpath for statistics.NormalDist.inv_cdf() Patch by Dong-hee Na .. nonce: Ene6L- .. section: Library -Remove the deprecated method `threading.Thread.isAlive()`. Patch by Dong-hee +Remove the deprecated method `threading.Thread.isAlive()`. Patch by Donghee Na. .. @@ -4089,7 +4089,7 @@ Increase code coverage for multiprocessing.shared_memory. .. nonce: Kl1sti .. section: Tests -Add tests for json.dump(..., skipkeys=True). Patch by Dong-hee Na. +Add tests for json.dump(..., skipkeys=True). Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.9.0a3.rst b/Misc/NEWS.d/3.9.0a3.rst index 8b7ff49668e1c0..8a94848427382b 100644 --- a/Misc/NEWS.d/3.9.0a3.rst +++ b/Misc/NEWS.d/3.9.0a3.rst @@ -149,7 +149,7 @@ argument - by Anthony Sottile. .. section: Core and Builtins Correct the error message when calling the :func:`min` or :func:`max` with -no arguments. Patch by Dong-hee Na. +no arguments. Patch by Donghee Na. .. @@ -392,7 +392,7 @@ Remove ``fractions.gcd()`` function, deprecated since Python 3.5 .. section: Library :class:`~smtplib.LMTP` constructor now has an optional *timeout* parameter. -Patch by Dong-hee Na. +Patch by Donghee Na. .. @@ -414,7 +414,7 @@ Taskaya. :class:`~ftplib.FTP_TLS` and :class:`~ftplib.FTP_TLS` now raise a :class:`ValueError` if the given timeout for their constructor is zero to -prevent the creation of a non-blocking socket. Patch by Dong-hee Na. +prevent the creation of a non-blocking socket. Patch by Donghee Na. .. @@ -425,7 +425,7 @@ prevent the creation of a non-blocking socket. Patch by Dong-hee Na. :class:`~smtplib.SMTP` and :class:`~smtplib.SMTP_SSL` now raise a :class:`ValueError` if the given timeout for their constructor is zero to -prevent the creation of a non-blocking socket. Patch by Dong-hee Na. +prevent the creation of a non-blocking socket. Patch by Donghee Na. .. @@ -456,7 +456,7 @@ resilients to inaccessible sys.path entries (importlib_metadata v1.4.0). :class:`~!nntplib.NNTP` and :class:`~!nntplib.NNTP_SSL` now raise a :class:`ValueError` if the given timeout for their constructor is zero to -prevent the creation of a non-blocking socket. Patch by Dong-hee Na. +prevent the creation of a non-blocking socket. Patch by Donghee Na. .. @@ -488,7 +488,7 @@ towards *y*. :class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a :class:`ValueError` if the given timeout for their constructor is zero to -prevent the creation of a non-blocking socket. Patch by Dong-hee Na. +prevent the creation of a non-blocking socket. Patch by Donghee Na. .. @@ -571,7 +571,7 @@ new task spawning before exception raising. .. section: Library Correctly parenthesize filter-based statements that contain lambda -expressions in mod:`!lib2to3`. Patch by Dong-hee Na. +expressions in mod:`!lib2to3`. Patch by Donghee Na. .. @@ -699,7 +699,7 @@ upon inheritance. Patch by Bar Harel. :meth:`~imaplib.IMAP4.open` method now has an optional *timeout* parameter with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and :class:`~imaplib.IMAP4_stream` were applied to this change. Patch by -Dong-hee Na. +Donghee Na. .. diff --git a/Misc/NEWS.d/3.9.0a4.rst b/Misc/NEWS.d/3.9.0a4.rst index 019b34c4082d10..e59435b5509acf 100644 --- a/Misc/NEWS.d/3.9.0a4.rst +++ b/Misc/NEWS.d/3.9.0a4.rst @@ -43,7 +43,7 @@ first item. Patch by Yonatan Goldschmidt. .. nonce: BIIX2M .. section: Core and Builtins -Update clinic tool to use :c:func:`Py_IS_TYPE`. Patch by Dong-hee Na. +Update clinic tool to use :c:func:`Py_IS_TYPE`. Patch by Donghee Na. .. @@ -141,7 +141,7 @@ collection of deleted, pickled objects. .. section: Core and Builtins Fixed a possible crash in :meth:`list.__contains__` when a list is changed -during comparing items. Patch by Dong-hee Na. +during comparing items. Patch by Donghee Na. .. @@ -152,7 +152,7 @@ during comparing items. Patch by Dong-hee Na. :term:`floor division` of float operation now has a better performance. Also the message of :exc:`ZeroDivisionError` for this operation is updated. Patch -by Dong-hee Na. +by Donghee Na. .. diff --git a/Misc/NEWS.d/3.9.0a5.rst b/Misc/NEWS.d/3.9.0a5.rst index 19ad20ad3db042..6ff05788214723 100644 --- a/Misc/NEWS.d/3.9.0a5.rst +++ b/Misc/NEWS.d/3.9.0a5.rst @@ -96,7 +96,7 @@ Port itertools module to multiphase initialization (:pep:`489`). .. section: Core and Builtins Speed up calls to ``frozenset()`` by using the :pep:`590` ``vectorcall`` -calling convention. Patch by Dong-hee Na. +calling convention. Patch by Donghee Na. .. @@ -117,7 +117,7 @@ own variable. .. section: Core and Builtins Speed up calls to ``set()`` by using the :pep:`590` ``vectorcall`` calling -convention. Patch by Dong-hee Na. +convention. Patch by Donghee Na. .. @@ -166,7 +166,7 @@ Allow executing asynchronous comprehensions on the top level when the .. section: Core and Builtins Speed up calls to ``tuple()`` by using the :pep:`590` ``vectorcall`` calling -convention. Patch by Dong-hee Na. +convention. Patch by Donghee Na. .. @@ -571,7 +571,7 @@ Fixed :func:`ast.unparse` for extended slices containing a single element .. nonce: yWq9NJ .. section: Library -Fix :mod:`json.tool` to catch :exc:`BrokenPipeError`. Patch by Dong-hee Na. +Fix :mod:`json.tool` to catch :exc:`BrokenPipeError`. Patch by Donghee Na. .. @@ -783,7 +783,7 @@ when the optional ``qop`` parameter is not present. .. section: Library HTTP status codes ``103 EARLY_HINTS`` and ``425 TOO_EARLY`` are added to -:class:`http.HTTPStatus`. Patch by Dong-hee Na. +:class:`http.HTTPStatus`. Patch by Donghee Na. .. @@ -1133,7 +1133,7 @@ module. Patch by José Roberto Meza Cabrera. .. section: C API Add :c:func:`PyModule_AddType` helper function: add a type to a module. -Patch by Dong-hee Na. +Patch by Donghee Na. .. @@ -1163,7 +1163,7 @@ Python thread state. .. nonce: R3jaTy .. section: C API -Add _PyArg_NoKwnames helper function. Patch by Dong-hee Na. +Add _PyArg_NoKwnames helper function. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/3.9.0b1.rst b/Misc/NEWS.d/3.9.0b1.rst index 15790bc425c13f..ee87315ad334e9 100644 --- a/Misc/NEWS.d/3.9.0b1.rst +++ b/Misc/NEWS.d/3.9.0b1.rst @@ -490,7 +490,7 @@ The first argument of :func:`pickle.loads` is now positional-only. .. section: Library Update :mod:`!nntplib` to merge :class:`!nntplib.NNTP` and -:class:`!nntplib._NNTPBase`. Patch by Dong-hee Na. +:class:`!nntplib._NNTPBase`. Patch by Donghee Na. .. @@ -500,7 +500,7 @@ Update :mod:`!nntplib` to merge :class:`!nntplib.NNTP` and .. section: Library Update :mod:`dbm.gnu` to use gdbm_count if possible when calling -:func:`len`. Patch by Dong-hee Na. +:func:`len`. Patch by Donghee Na. .. @@ -592,7 +592,7 @@ subdirectories in package data, matching backport in importlib_resources .. nonce: 5GuK2A .. section: Library -:meth:`imaplib.IMAP4.unselect` is added. Patch by Dong-hee Na. +:meth:`imaplib.IMAP4.unselect` is added. Patch by Donghee Na. .. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-06-05-23-38-43.gh-issue-104635.VYZhVh.rst b/Misc/NEWS.d/next/Core and Builtins/2023-06-05-23-38-43.gh-issue-104635.VYZhVh.rst index f20ddb56d171c3..417e45a6655db6 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2023-06-05-23-38-43.gh-issue-104635.VYZhVh.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2023-06-05-23-38-43.gh-issue-104635.VYZhVh.rst @@ -1,2 +1,2 @@ Eliminate redundant :opcode:`STORE_FAST` instructions in the compiler. Patch -by Dong-hee Na and Carl Meyer. +by Donghee Na and Carl Meyer. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-07-06-00-35-44.gh-issue-96844.kwvoS-.rst b/Misc/NEWS.d/next/Core and Builtins/2023-07-06-00-35-44.gh-issue-96844.kwvoS-.rst index 55334173bc002d..cc9c6e39a77fd2 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2023-07-06-00-35-44.gh-issue-96844.kwvoS-.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2023-07-06-00-35-44.gh-issue-96844.kwvoS-.rst @@ -1 +1 @@ -Improve error message of :meth:`list.remove`. Patch by Dong-hee Na. +Improve error message of :meth:`list.remove`. Patch by Donghee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-07-23-13-07-34.gh-issue-107122.9HFUyb.rst b/Misc/NEWS.d/next/Core and Builtins/2023-07-23-13-07-34.gh-issue-107122.9HFUyb.rst index 64ac8ac6df09b8..08decfd89b7cf0 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2023-07-23-13-07-34.gh-issue-107122.9HFUyb.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2023-07-23-13-07-34.gh-issue-107122.9HFUyb.rst @@ -1 +1 @@ -Add :meth:`dbm.gnu.gdbm.clear` to :mod:`dbm.gnu`. Patch By Dong-hee Na. +Add :meth:`dbm.gnu.gdbm.clear` to :mod:`dbm.gnu`. Patch By Donghee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-07-23-21-16-54.gh-issue-107122.VNuNcq.rst b/Misc/NEWS.d/next/Core and Builtins/2023-07-23-21-16-54.gh-issue-107122.VNuNcq.rst index 5b7cc98ddc6414..f68036cef34365 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2023-07-23-21-16-54.gh-issue-107122.VNuNcq.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2023-07-23-21-16-54.gh-issue-107122.VNuNcq.rst @@ -1 +1 @@ -Add :meth:`dbm.ndbm.ndbm.clear` to :mod:`dbm.ndbm`. Patch By Dong-hee Na. +Add :meth:`dbm.ndbm.ndbm.clear` to :mod:`dbm.ndbm`. Patch By Donghee Na. diff --git a/Misc/NEWS.d/next/Library/2023-07-18-23-05-12.gh-issue-106751.tVvzN_.rst b/Misc/NEWS.d/next/Library/2023-07-18-23-05-12.gh-issue-106751.tVvzN_.rst index 1cb8424b6221ee..d26ac90d3978d4 100644 --- a/Misc/NEWS.d/next/Library/2023-07-18-23-05-12.gh-issue-106751.tVvzN_.rst +++ b/Misc/NEWS.d/next/Library/2023-07-18-23-05-12.gh-issue-106751.tVvzN_.rst @@ -1,2 +1,2 @@ Optimize :meth:`KqueueSelector.select` for many iteration case. Patch By -Dong-hee Na. +Donghee Na. diff --git a/Misc/NEWS.d/next/Library/2023-07-19-10-45-24.gh-issue-106751.3HJ1of.rst b/Misc/NEWS.d/next/Library/2023-07-19-10-45-24.gh-issue-106751.3HJ1of.rst index 2696b560371d13..1b3ffdc95120a2 100644 --- a/Misc/NEWS.d/next/Library/2023-07-19-10-45-24.gh-issue-106751.3HJ1of.rst +++ b/Misc/NEWS.d/next/Library/2023-07-19-10-45-24.gh-issue-106751.3HJ1of.rst @@ -1,2 +1,2 @@ Optimize :meth:`SelectSelector.select` for many iteration case. Patch By -Dong-hee Na. +Donghee Na. diff --git a/Misc/NEWS.d/next/Library/2023-08-15-18-20-00.gh-issue-107963.20g5BG.rst b/Misc/NEWS.d/next/Library/2023-08-15-18-20-00.gh-issue-107963.20g5BG.rst index 3a73b2da0c4334..ea968367d0bdee 100644 --- a/Misc/NEWS.d/next/Library/2023-08-15-18-20-00.gh-issue-107963.20g5BG.rst +++ b/Misc/NEWS.d/next/Library/2023-08-15-18-20-00.gh-issue-107963.20g5BG.rst @@ -1,2 +1,2 @@ Fix :func:`multiprocessing.set_forkserver_preload` to check the given list -of modules names. Patch by Dong-hee Na. +of modules names. Patch by Donghee Na. From 8ded34a1ff2d355e95213ab72493908f2ca25dd9 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Fri, 22 Sep 2023 23:51:58 +0300 Subject: [PATCH 307/357] gh-109721: Guard `_testinternalcapi` imports in tests (GH-109722) --- Lib/test/test_cmd_line.py | 1 + Lib/test/test_import/__init__.py | 5 ++++- Lib/test/test_opcache.py | 8 ++++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index e88b7c8572d9e8..f4754dbf735a1d 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -799,6 +799,7 @@ def check_pythonmalloc(self, env_var, name): self.assertEqual(proc.stdout.rstrip(), name) self.assertEqual(proc.returncode, 0) + @support.cpython_only def test_pythonmalloc(self): # Test the PYTHONMALLOC environment variable pymalloc = support.with_pymalloc() diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index a302a6075eca0a..48553f9d48b010 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -22,7 +22,6 @@ import types import unittest from unittest import mock -import _testinternalcapi import _imp from test.support import os_helper @@ -50,6 +49,10 @@ import _xxsubinterpreters as _interpreters except ModuleNotFoundError: _interpreters = None +try: + import _testinternalcapi +except ImportError: + _testinternalcapi = None skip_if_dont_write_bytecode = unittest.skipIf( diff --git a/Lib/test/test_opcache.py b/Lib/test/test_opcache.py index 692e03fbb5e084..2b2783d57be8f4 100644 --- a/Lib/test/test_opcache.py +++ b/Lib/test/test_opcache.py @@ -4,13 +4,17 @@ import threading import types import unittest -from test.support import threading_helper +from test.support import threading_helper, check_impl_detail + +# Skip this module on other interpreters, it is cpython specific: +if check_impl_detail(cpython=False): + raise unittest.SkipTest('implementation detail specific to cpython') + import _testinternalcapi def disabling_optimizer(func): def wrapper(*args, **kwargs): - import _testinternalcapi old_opt = _testinternalcapi.get_optimizer() _testinternalcapi.set_optimizer(None) try: From d5611f280403d19befe4a3e505b037d286cf798e Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Fri, 22 Sep 2023 14:13:31 -0700 Subject: [PATCH 308/357] GH-107265: Add missing deoptimizations for ENTER_EXECUTOR's original opcode (GH-109420) --- .../2023-09-14-20-15-57.gh-issue-107265.qHZL_6.rst | 1 + Objects/codeobject.c | 2 +- Python/instrumentation.c | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-14-20-15-57.gh-issue-107265.qHZL_6.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-14-20-15-57.gh-issue-107265.qHZL_6.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-14-20-15-57.gh-issue-107265.qHZL_6.rst new file mode 100644 index 00000000000000..c30c21f034a1bc --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-14-20-15-57.gh-issue-107265.qHZL_6.rst @@ -0,0 +1 @@ +Deopt opcodes hidden by the executor when base opcode is needed diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 20e5dedb22826f..f662b8e354bb1e 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1505,7 +1505,7 @@ deopt_code(PyCodeObject *code, _Py_CODEUNIT *instructions) int opcode = _Py_GetBaseOpcode(code, i); if (opcode == ENTER_EXECUTOR) { _PyExecutorObject *exec = code->co_executors->executors[instructions[i].op.arg]; - opcode = exec->vm_data.opcode; + opcode = _PyOpcode_Deopt[exec->vm_data.opcode]; instructions[i].op.arg = exec->vm_data.oparg; } assert(opcode != ENTER_EXECUTOR); diff --git a/Python/instrumentation.c b/Python/instrumentation.c index df8943b1f9a721..0b974f6133ce7d 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -306,7 +306,7 @@ _PyInstruction_GetLength(PyCodeObject *code, int offset) if (opcode == ENTER_EXECUTOR) { int exec_index = _PyCode_CODE(code)[offset].op.arg; _PyExecutorObject *exec = code->co_executors->executors[exec_index]; - opcode = exec->vm_data.opcode; + opcode = _PyOpcode_Deopt[exec->vm_data.opcode]; } assert(opcode != ENTER_EXECUTOR); From b03a791497ff4b3c42805e06c73d08ac34087402 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Sep 2023 23:49:32 +0200 Subject: [PATCH 309/357] gh-109706: Fix multiprocessing test_nested_startmethod() (#109707) Don't check order, queue items can be written in any order. --- Lib/test/_test_multiprocessing.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 2636a9cf7f5bee..730b887dd4bcac 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -5472,7 +5472,9 @@ def test_nested_startmethod(self): while not queue.empty(): results.append(queue.get()) - self.assertEqual(results, [2, 1]) + # gh-109706: queue.put(1) can write into the queue before queue.put(2), + # there is no synchronization in the test. + self.assertSetEqual(set(results), set([2, 1])) @unittest.skipIf(sys.platform == "win32", From 612400d4463b86201da407ae65ea45f426b8a4cb Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Fri, 22 Sep 2023 20:45:26 -0700 Subject: [PATCH 310/357] Fix indentation in 3.13 What's New (#109769) The previous layout made it look like the other three deprecations are part of the first one, when in fact they are independent. The new layout is consistent with that used for sqlite3 in 3.12 (https://docs.python.org/3.13/whatsnew/3.12.html#deprecated). --- Doc/whatsnew/3.13.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index ce799ccd1fdcdf..c9e6ca8bf88866 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -265,10 +265,12 @@ Deprecated security and functionality bugs. This includes removal of the ``--cgi`` flag to the ``python -m http.server`` command line in 3.15. -* :mod:`typing`: Creating a :class:`typing.NamedTuple` class using keyword arguments to denote - the fields (``NT = NamedTuple("NT", x=int, y=int)``) is deprecated, and will - be disallowed in Python 3.15. Use the class-based syntax or the functional - syntax instead. (Contributed by Alex Waygood in :gh:`105566`.) +* :mod:`typing`: + + * Creating a :class:`typing.NamedTuple` class using keyword arguments to denote + the fields (``NT = NamedTuple("NT", x=int, y=int)``) is deprecated, and will + be disallowed in Python 3.15. Use the class-based syntax or the functional + syntax instead. (Contributed by Alex Waygood in :gh:`105566`.) * When using the functional syntax to create a :class:`typing.NamedTuple` class or a :class:`typing.TypedDict` class, failing to pass a value to the From b10de68c6ceae1076cdc98c890b9802dc81a7f44 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Sat, 23 Sep 2023 05:07:06 +0100 Subject: [PATCH 311/357] GH-95913: Add the release date for Python 3.11 (#109750) --- Doc/whatsnew/3.11.rst | 2 +- Doc/whatsnew/3.9.rst | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 51f21532cdecb8..e2d2902c3754b6 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -45,7 +45,7 @@ when researching a change. This article explains the new features in Python 3.11, compared to 3.10. - +Python 3.11 was released on October 24, 2022. For full details, see the :ref:`changelog `. diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index ce7ae510577220..cb2482ee48d7fa 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -44,7 +44,6 @@ This article explains the new features in Python 3.9, compared to 3.8. Python 3.9 was released on October 5, 2020. - For full details, see the :ref:`changelog `. .. seealso:: From 0d20fc7477a21328dd353071eaa06384bb818f7b Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Sat, 23 Sep 2023 07:14:15 +0300 Subject: [PATCH 312/357] gh-109505: Remove unnecessary `hasattr` checks from `test_asyncio` (#109506) --- Lib/test/test_asyncio/test_events.py | 3 --- Lib/test/test_asyncio/utils.py | 7 +++---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 1647d2308c4e35..f22cb5e58bba62 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -1,6 +1,5 @@ """Tests for events.py.""" -import collections.abc import concurrent.futures import functools import io @@ -2335,8 +2334,6 @@ def check_source_traceback(h): h = loop.call_later(0, noop) check_source_traceback(h) - @unittest.skipUnless(hasattr(collections.abc, 'Coroutine'), - 'No collections.abc.Coroutine') def test_coroutine_like_object_debug_formatting(self): # Test that asyncio can format coroutines that are instances of # collections.abc.Coroutine, but lack cr_core or gi_code attributes diff --git a/Lib/test/test_asyncio/utils.py b/Lib/test/test_asyncio/utils.py index 64eb4410bfb5dc..1e5ab6eb935ef1 100644 --- a/Lib/test/test_asyncio/utils.py +++ b/Lib/test/test_asyncio/utils.py @@ -37,10 +37,9 @@ def data_file(*filename): - if hasattr(support, 'TEST_HOME_DIR'): - fullname = os.path.join(support.TEST_HOME_DIR, *filename) - if os.path.isfile(fullname): - return fullname + fullname = os.path.join(support.TEST_HOME_DIR, *filename) + if os.path.isfile(fullname): + return fullname fullname = os.path.join(os.path.dirname(__file__), '..', *filename) if os.path.isfile(fullname): return fullname From 5e7ea95d9d5c3b80a67ffbeebd76ce4fc327dd8e Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Fri, 22 Sep 2023 22:04:20 -0700 Subject: [PATCH 313/357] gh-100228: Document the os.fork threads DeprecationWarning. (#109767) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Document the `os.fork` posix threads detected `DeprecationWarning` in 3.12 What's New, os, multiprocessing, and concurrent.futures docs. Many reviews and doc cleanup edits by Adam & Hugo. 🥳 Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Hugo van Kemenade --- Doc/library/concurrent.futures.rst | 8 +++++++ Doc/library/multiprocessing.rst | 6 +++++ Doc/library/os.rst | 36 ++++++++++++++++++++++++++---- Doc/whatsnew/3.12.rst | 12 ++++++++++ 4 files changed, 58 insertions(+), 4 deletions(-) diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 09c9fc4e6e227a..6503d1fcf70a32 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -293,6 +293,14 @@ to a :class:`ProcessPoolExecutor` will result in deadlock. The *max_tasks_per_child* argument was added to allow users to control the lifetime of workers in the pool. + .. versionchanged:: 3.12 + On POSIX systems, if your application has multiple threads and the + :mod:`multiprocessing` context uses the ``"fork"`` start method: + The :func:`os.fork` function called internally to spawn workers may raise a + :exc:`DeprecationWarning`. Pass a *mp_context* configured to use a + different start method. See the :func:`os.fork` documentation for + further explanation. + .. _processpoolexecutor-example: ProcessPoolExecutor Example diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 38d24a86072970..2f0f1f800fdc94 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -131,6 +131,12 @@ to start a process. These *start methods* are Code that requires *fork* should explicitly specify that via :func:`get_context` or :func:`set_start_method`. + .. versionchanged:: 3.12 + If Python is able to detect that your process has multiple threads, the + :func:`os.fork` function that this start method calls internally will + raise a :exc:`DeprecationWarning`. Use a different start method. + See the :func:`os.fork` documentation for further explanation. + *forkserver* When the program starts and selects the *forkserver* start method, a server process is spawned. From then on, whenever a new process diff --git a/Doc/library/os.rst b/Doc/library/os.rst index c67b966f777db8..74897a76b1d20a 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -4157,15 +4157,38 @@ written in Python, such as a mail server's external command delivery program. .. audit-event:: os.fork "" os.fork + .. warning:: + + If you use TLS sockets in an application calling ``fork()``, see + the warning in the :mod:`ssl` documentation. + .. versionchanged:: 3.8 Calling ``fork()`` in a subinterpreter is no longer supported (:exc:`RuntimeError` is raised). - .. warning:: - - See :mod:`ssl` for applications that use the SSL module with fork(). + .. versionchanged:: 3.12 + If Python is able to detect that your process has multiple + threads, :func:`os.fork` now raises a :exc:`DeprecationWarning`. + + We chose to surface this as a warning, when detectable, to better + inform developers of a design problem that the POSIX platform + specifically notes as not supported. Even in code that + *appears* to work, it has never been safe to mix threading with + :func:`os.fork` on POSIX platforms. The CPython runtime itself has + always made API calls that are not safe for use in the child + process when threads existed in the parent (such as ``malloc`` and + ``free``). + + Users of macOS or users of libc or malloc implementations other + than those typically found in glibc to date are among those + already more likely to experience deadlocks running such code. + + See `this discussion on fork being incompatible with threads + `_ + for technical details of why we're surfacing this longstanding + platform compatibility problem to developers. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: POSIX, not Emscripten, not WASI. .. function:: forkpty() @@ -4178,6 +4201,11 @@ written in Python, such as a mail server's external command delivery program. .. audit-event:: os.forkpty "" os.forkpty + .. versionchanged:: 3.12 + If Python is able to detect that your process has multiple + threads, this now raises a :exc:`DeprecationWarning`. See the + longer explanation on :func:`os.fork`. + .. versionchanged:: 3.8 Calling ``forkpty()`` in a subinterpreter is no longer supported (:exc:`RuntimeError` is raised). diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 4ee87974a98d16..22538a476d31b4 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -1065,6 +1065,18 @@ Deprecated contain the creation time, which is also available in the new ``st_birthtime`` field. (Contributed by Steve Dower in :gh:`99726`.) +* :mod:`os`: On POSIX platforms, :func:`os.fork` can now raise a + :exc:`DeprecationWarning` when it can detect being called from a + multithreaded process. There has always been a fundamental incompatibility + with the POSIX platform when doing so. Even if such code *appeared* to work. + We added the warning to to raise awareness as issues encounted by code doing + this are becoming more frequent. See the :func:`os.fork` documentation for + more details. + + When this warning appears due to usage of :mod:`multiprocessing` or + :mod:`concurrent.futures` the fix is to use a different + :mod:`multiprocessing` start method such as ``"spawn"`` or ``"forkserver"``. + * :mod:`shutil`: The *onerror* argument of :func:`shutil.rmtree` is deprecated as will be removed in Python 3.14. Use *onexc* instead. (Contributed by Irit Katriel in :gh:`102828`.) From 92af0cc580051fd1129c7a86af2cbadeb2aa36dc Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 23 Sep 2023 09:31:20 +0300 Subject: [PATCH 314/357] gh-109634: Use :samp: role (GH-109635) --- Doc/extending/windows.rst | 2 +- Doc/howto/logging-cookbook.rst | 4 +- Doc/howto/logging.rst | 2 +- Doc/library/codecs.rst | 26 +++++---- Doc/library/compileall.rst | 2 +- Doc/library/ensurepip.rst | 2 +- Doc/library/functions.rst | 2 +- Doc/library/html.parser.rst | 2 +- Doc/library/http.server.rst | 2 +- Doc/library/os.rst | 4 +- Doc/library/re.rst | 2 +- Doc/library/sys.rst | 4 +- Doc/library/urllib.parse.rst | 6 +-- Doc/reference/lexical_analysis.rst | 84 +++++++++++++++--------------- Doc/using/configure.rst | 10 ++-- Doc/using/windows.rst | 4 +- Doc/whatsnew/2.0.rst | 4 +- Doc/whatsnew/2.6.rst | 2 +- Doc/whatsnew/3.11.rst | 6 +-- Doc/whatsnew/3.3.rst | 2 +- Doc/whatsnew/3.4.rst | 2 +- Doc/whatsnew/3.8.rst | 2 +- Misc/NEWS.d/3.12.0a1.rst | 2 +- Misc/NEWS.d/3.12.0a2.rst | 2 +- Misc/NEWS.d/3.12.0a3.rst | 2 +- Misc/NEWS.d/3.5.0rc1.rst | 2 +- Misc/NEWS.d/3.5.1rc1.rst | 2 +- Misc/NEWS.d/3.8.0a1.rst | 2 +- Misc/NEWS.d/3.8.0a4.rst | 2 +- Misc/NEWS.d/3.9.0a1.rst | 4 +- 30 files changed, 99 insertions(+), 95 deletions(-) diff --git a/Doc/extending/windows.rst b/Doc/extending/windows.rst index 1129b0968bc4e6..e366d6cb9f79e3 100644 --- a/Doc/extending/windows.rst +++ b/Doc/extending/windows.rst @@ -132,4 +132,4 @@ modules (including Python) to be able to see your identifiers, you have to say Developer Studio will throw in a lot of import libraries that you do not really need, adding about 100K to your executable. To get rid of them, use the Project Settings dialog, Link tab, to specify *ignore default libraries*. Add the -correct :file:`msvcrtxx.lib` to the list of libraries. +correct :file:`msvcrt{xx}.lib` to the list of libraries. diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst index 772973edadd9d8..588f5a0a53ded0 100644 --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -1728,7 +1728,7 @@ when (and if) the logged message is actually about to be output to a log by a handler. So the only slightly unusual thing which might trip you up is that the parentheses go around the format string and the arguments, not just the format string. That's because the __ notation is just syntax sugar for a constructor -call to one of the XXXMessage classes. +call to one of the :samp:`{XXX}Message` classes. If you prefer, you can use a :class:`LoggerAdapter` to achieve a similar effect to the above, as in the following example:: @@ -2644,7 +2644,7 @@ when (and if) the logged message is actually about to be output to a log by a handler. So the only slightly unusual thing which might trip you up is that the parentheses go around the format string and the arguments, not just the format string. That’s because the __ notation is just syntax sugar for a constructor -call to one of the ``XXXMessage`` classes shown above. +call to one of the :samp:`{XXX}Message` classes shown above. .. _filters-dictconfig: diff --git a/Doc/howto/logging.rst b/Doc/howto/logging.rst index a72e9a820ef347..7330cf675baa36 100644 --- a/Doc/howto/logging.rst +++ b/Doc/howto/logging.rst @@ -979,7 +979,7 @@ provided: #. :class:`NullHandler` instances do nothing with error messages. They are used by library developers who want to use logging, but want to avoid the 'No - handlers could be found for logger XXX' message which can be displayed if + handlers could be found for logger *XXX*' message which can be displayed if the library user has not configured logging. See :ref:`library-config` for more information. diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 8225236350d22e..053bf64addb821 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -345,9 +345,10 @@ The following error handlers can be used with all Python +-------------------------+-----------------------------------------------+ | ``'backslashreplace'`` | Replace with backslashed escape sequences. | | | On encoding, use hexadecimal form of Unicode | -| | code point with formats ``\xhh`` ``\uxxxx`` | -| | ``\Uxxxxxxxx``. On decoding, use hexadecimal | -| | form of byte value with format ``\xhh``. | +| | code point with formats :samp:`\\x{hh}` | +| | :samp:`\\u{xxxx}` :samp:`\\U{xxxxxxxx}`. | +| | On decoding, use hexadecimal form of byte | +| | value with format :samp:`\\x{hh}`. | | | Implemented in | | | :func:`backslashreplace_errors`. | +-------------------------+-----------------------------------------------+ @@ -373,8 +374,9 @@ The following error handlers are only applicable to encoding (within +=========================+===============================================+ | ``'xmlcharrefreplace'`` | Replace with XML/HTML numeric character | | | reference, which is a decimal form of Unicode | -| | code point with format ``&#num;`` Implemented | -| | in :func:`xmlcharrefreplace_errors`. | +| | code point with format :samp:`&#{num};`. | +| | Implemented in | +| | :func:`xmlcharrefreplace_errors`. | +-------------------------+-----------------------------------------------+ | ``'namereplace'`` | Replace with ``\N{...}`` escape sequences, | | | what appears in the braces is the Name | @@ -478,8 +480,9 @@ functions: Malformed data is replaced by a backslashed escape sequence. On encoding, use the hexadecimal form of Unicode code point with formats - ``\xhh`` ``\uxxxx`` ``\Uxxxxxxxx``. On decoding, use the hexadecimal form of - byte value with format ``\xhh``. + :samp:`\\x{hh}` :samp:`\\u{xxxx}` :samp:`\\U{xxxxxxxx}`. + On decoding, use the hexadecimal form of + byte value with format :samp:`\\x{hh}`. .. versionchanged:: 3.5 Works with decoding and translating. @@ -492,7 +495,7 @@ functions: The unencodable character is replaced by an appropriate XML/HTML numeric character reference, which is a decimal form of Unicode code point with - format ``&#num;`` . + format :samp:`&#{num};` . .. function:: namereplace_errors(exception) @@ -1346,9 +1349,10 @@ encodings. | | | supported. | +--------------------+---------+---------------------------+ | raw_unicode_escape | | Latin-1 encoding with | -| | | ``\uXXXX`` and | -| | | ``\UXXXXXXXX`` for other | -| | | code points. Existing | +| | | :samp:`\\u{XXXX}` and | +| | | :samp:`\\U{XXXXXXXX}`` | +| | | for other code points. | +| | | Existing | | | | backslashes are not | | | | escaped in any way. | | | | It is used in the Python | diff --git a/Doc/library/compileall.rst b/Doc/library/compileall.rst index 80d96eca71f275..a7455aeb0ec1cd 100644 --- a/Doc/library/compileall.rst +++ b/Doc/library/compileall.rst @@ -31,7 +31,7 @@ compile Python sources. Positional arguments are files to compile or directories that contain source files, traversed recursively. If no argument is given, behave as if - the command line was ``-l ``. + the command line was :samp:`-l {}`. .. cmdoption:: -l diff --git a/Doc/library/ensurepip.rst b/Doc/library/ensurepip.rst index d7f89cf96368b5..de3b93f5e61073 100644 --- a/Doc/library/ensurepip.rst +++ b/Doc/library/ensurepip.rst @@ -61,7 +61,7 @@ By default, ``pip`` is installed into the current virtual environment active virtual environment). The installation location can be controlled through two additional command line options: -* ``--root ``: Installs ``pip`` relative to the given root directory +* :samp:`--root {dir}`: Installs ``pip`` relative to the given root directory rather than the root of the currently active virtual environment (if any) or the default root for the current Python installation. * ``--user``: Installs ``pip`` into the user site packages directory rather diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index d9974c6350fed1..35206097064284 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1271,7 +1271,7 @@ are always available. They are listed here in alphabetical order. * ``'xmlcharrefreplace'`` is only supported when writing to a file. Characters not supported by the encoding are replaced with the - appropriate XML character reference ``&#nnn;``. + appropriate XML character reference :samp:`&#{nnn};`. * ``'backslashreplace'`` replaces malformed data by Python's backslashed escape sequences. diff --git a/Doc/library/html.parser.rst b/Doc/library/html.parser.rst index 03aff25ce6117a..d35090111e0822 100644 --- a/Doc/library/html.parser.rst +++ b/Doc/library/html.parser.rst @@ -173,7 +173,7 @@ implementations do nothing (except for :meth:`~HTMLParser.handle_startendtag`): .. method:: HTMLParser.handle_charref(name) This method is called to process decimal and hexadecimal numeric character - references of the form ``&#NNN;`` and ``&#xNNN;``. For example, the decimal + references of the form :samp:`&#{NNN};` and :samp:`&#x{NNN};`. For example, the decimal equivalent for ``>`` is ``>``, whereas the hexadecimal is ``>``; in this case the method will receive ``'62'`` or ``'x3E'``. This method is never called if *convert_charrefs* is ``True``. diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index efe87497b371d0..6f79b222790094 100644 --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -217,7 +217,7 @@ provides three different variants: attribute holds the default values for *message* and *explain* that will be used if no value is provided; for unknown codes the default value for both is the string ``???``. The body will be empty if the method is - HEAD or the response code is one of the following: ``1xx``, + HEAD or the response code is one of the following: :samp:`1{xx}`, ``204 No Content``, ``205 Reset Content``, ``304 Not Modified``. .. versionchanged:: 3.4 diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 74897a76b1d20a..4ffd520f9ecd8b 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -88,8 +88,8 @@ startup by the :c:func:`PyConfig_Read` function: see On some systems, conversion using the file system encoding may fail. In this case, Python uses the :ref:`surrogateescape encoding error handler `, which means that undecodable bytes are replaced by a - Unicode character U+DCxx on decoding, and these are again translated to the - original byte on encoding. + Unicode character U+DC\ *xx* on decoding, and these are again + translated to the original byte on encoding. The :term:`file system encoding ` must diff --git a/Doc/library/re.rst b/Doc/library/re.rst index e506b346ec379d..60696007f4abc8 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -660,7 +660,7 @@ three digits in length. Unknown escapes consisting of ``'\'`` and an ASCII letter now are errors. .. versionchanged:: 3.8 - The ``'\N{name}'`` escape sequence has been added. As in string literals, + The :samp:`'\\N\\{{name}\\}'` escape sequence has been added. As in string literals, it expands to the named Unicode character (e.g. ``'\N{EM DASH}'``). diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index c116f4b9b00825..ef818a7da016de 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -753,7 +753,7 @@ always available. Return the current value of the flags that are used for :c:func:`dlopen` calls. Symbolic names for the flag values can be - found in the :mod:`os` module (``RTLD_xxx`` constants, e.g. + found in the :mod:`os` module (:samp:`RTLD_{xxx}` constants, e.g. :const:`os.RTLD_LAZY`). .. availability:: Unix. @@ -1441,7 +1441,7 @@ always available. lazy resolving of symbols when importing a module, if called as ``sys.setdlopenflags(0)``. To share symbols across extension modules, call as ``sys.setdlopenflags(os.RTLD_GLOBAL)``. Symbolic names for the flag values - can be found in the :mod:`os` module (``RTLD_xxx`` constants, e.g. + can be found in the :mod:`os` module (:samp:`RTLD_{xxx}` constants, e.g. :const:`os.RTLD_LAZY`). .. availability:: Unix. diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index e1aa4ebb0964dd..53e5f0395715d7 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -598,7 +598,7 @@ task isn't already covered by the URL parsing functions above. .. function:: quote(string, safe='/', encoding=None, errors=None) - Replace special characters in *string* using the ``%xx`` escape. Letters, + Replace special characters in *string* using the :samp:`%{xx}` escape. Letters, digits, and the characters ``'_.-~'`` are never quoted. By default, this function is intended for quoting the path section of a URL. The optional *safe* parameter specifies additional ASCII characters that should not be @@ -645,7 +645,7 @@ task isn't already covered by the URL parsing functions above. .. function:: unquote(string, encoding='utf-8', errors='replace') - Replace ``%xx`` escapes with their single-character equivalent. + Replace :samp:`%{xx}` escapes with their single-character equivalent. The optional *encoding* and *errors* parameters specify how to decode percent-encoded sequences into Unicode characters, as accepted by the :meth:`bytes.decode` method. @@ -676,7 +676,7 @@ task isn't already covered by the URL parsing functions above. .. function:: unquote_to_bytes(string) - Replace ``%xx`` escapes with their single-octet equivalent, and return a + Replace :samp:`%{xx}` escapes with their single-octet equivalent, and return a :class:`bytes` object. *string* may be either a :class:`str` or a :class:`bytes` object. diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index 41f12fd57fbd57..9fd80b1cb7f84c 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -557,51 +557,51 @@ Unless an ``'r'`` or ``'R'`` prefix is present, escape sequences in string and bytes literals are interpreted according to rules similar to those used by Standard C. The recognized escape sequences are: -+-----------------+---------------------------------+-------+ -| Escape Sequence | Meaning | Notes | -+=================+=================================+=======+ -| ``\``\ | Backslash and newline ignored | \(1) | -+-----------------+---------------------------------+-------+ -| ``\\`` | Backslash (``\``) | | -+-----------------+---------------------------------+-------+ -| ``\'`` | Single quote (``'``) | | -+-----------------+---------------------------------+-------+ -| ``\"`` | Double quote (``"``) | | -+-----------------+---------------------------------+-------+ -| ``\a`` | ASCII Bell (BEL) | | -+-----------------+---------------------------------+-------+ -| ``\b`` | ASCII Backspace (BS) | | -+-----------------+---------------------------------+-------+ -| ``\f`` | ASCII Formfeed (FF) | | -+-----------------+---------------------------------+-------+ -| ``\n`` | ASCII Linefeed (LF) | | -+-----------------+---------------------------------+-------+ -| ``\r`` | ASCII Carriage Return (CR) | | -+-----------------+---------------------------------+-------+ -| ``\t`` | ASCII Horizontal Tab (TAB) | | -+-----------------+---------------------------------+-------+ -| ``\v`` | ASCII Vertical Tab (VT) | | -+-----------------+---------------------------------+-------+ -| ``\ooo`` | Character with octal value | (2,4) | -| | *ooo* | | -+-----------------+---------------------------------+-------+ -| ``\xhh`` | Character with hex value *hh* | (3,4) | -+-----------------+---------------------------------+-------+ ++-------------------------+---------------------------------+-------+ +| Escape Sequence | Meaning | Notes | ++=========================+=================================+=======+ +| ``\``\ | Backslash and newline ignored | \(1) | ++-------------------------+---------------------------------+-------+ +| ``\\`` | Backslash (``\``) | | ++-------------------------+---------------------------------+-------+ +| ``\'`` | Single quote (``'``) | | ++-------------------------+---------------------------------+-------+ +| ``\"`` | Double quote (``"``) | | ++-------------------------+---------------------------------+-------+ +| ``\a`` | ASCII Bell (BEL) | | ++-------------------------+---------------------------------+-------+ +| ``\b`` | ASCII Backspace (BS) | | ++-------------------------+---------------------------------+-------+ +| ``\f`` | ASCII Formfeed (FF) | | ++-------------------------+---------------------------------+-------+ +| ``\n`` | ASCII Linefeed (LF) | | ++-------------------------+---------------------------------+-------+ +| ``\r`` | ASCII Carriage Return (CR) | | ++-------------------------+---------------------------------+-------+ +| ``\t`` | ASCII Horizontal Tab (TAB) | | ++-------------------------+---------------------------------+-------+ +| ``\v`` | ASCII Vertical Tab (VT) | | ++-------------------------+---------------------------------+-------+ +| :samp:`\\{ooo}` | Character with octal value | (2,4) | +| | *ooo* | | ++-------------------------+---------------------------------+-------+ +| :samp:`\\x{hh}` | Character with hex value *hh* | (3,4) | ++-------------------------+---------------------------------+-------+ Escape sequences only recognized in string literals are: -+-----------------+---------------------------------+-------+ -| Escape Sequence | Meaning | Notes | -+=================+=================================+=======+ -| ``\N{name}`` | Character named *name* in the | \(5) | -| | Unicode database | | -+-----------------+---------------------------------+-------+ -| ``\uxxxx`` | Character with 16-bit hex value | \(6) | -| | *xxxx* | | -+-----------------+---------------------------------+-------+ -| ``\Uxxxxxxxx`` | Character with 32-bit hex value | \(7) | -| | *xxxxxxxx* | | -+-----------------+---------------------------------+-------+ ++-------------------------+---------------------------------+-------+ +| Escape Sequence | Meaning | Notes | ++=========================+=================================+=======+ +| :samp:`\\N\\{{name}\\}` | Character named *name* in the | \(5) | +| | Unicode database | | ++-------------------------+---------------------------------+-------+ +| :samp:`\\u{xxxx}` | Character with 16-bit hex value | \(6) | +| | *xxxx* | | ++-------------------------+---------------------------------+-------+ +| :samp:`\\U{xxxxxxxx}` | Character with 32-bit hex value | \(7) | +| | *xxxxxxxx* | | ++-------------------------+---------------------------------+-------+ Notes: diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index 16ed33dbcced15..763f9778776990 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -1012,7 +1012,7 @@ differently depending if the ``Py_BUILD_CORE_MODULE`` macro is defined: * Use ``Py_IMPORTED_SYMBOL`` otherwise. If the ``Py_BUILD_CORE_BUILTIN`` macro is used by mistake on a C extension -built as a shared library, its ``PyInit_xxx()`` function is not exported, +built as a shared library, its :samp:`PyInit_{xxx}()` function is not exported, causing an :exc:`ImportError` on import. @@ -1033,8 +1033,8 @@ Preprocessor flags .. envvar:: CPPFLAGS - (Objective) C/C++ preprocessor flags, e.g. ``-I`` if you have - headers in a nonstandard directory ````. + (Objective) C/C++ preprocessor flags, e.g. :samp:`-I{include_dir}` if you have + headers in a nonstandard directory *include_dir*. Both :envvar:`CPPFLAGS` and :envvar:`LDFLAGS` need to contain the shell's value to be able to build extension modules using the @@ -1223,8 +1223,8 @@ Linker flags .. envvar:: LDFLAGS - Linker flags, e.g. ``-L`` if you have libraries in a nonstandard - directory ````. + Linker flags, e.g. :samp:`-L{lib_dir}` if you have libraries in a nonstandard + directory *lib_dir*. Both :envvar:`CPPFLAGS` and :envvar:`LDFLAGS` need to contain the shell's value to be able to build extension modules using the diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index ca79c9d3a9d3a8..2476e60a26d485 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -889,7 +889,7 @@ minor version. I.e. ``/usr/bin/python3.7-32`` will request usage of the The "-64" suffix is deprecated, and now implies "any architecture that is not provably i386/32-bit". To request a specific environment, use the new - ``-V:`` argument with the complete tag. + :samp:`-V:{TAG}` argument with the complete tag. The ``/usr/bin/env`` form of shebang line has one further special property. Before looking for installed Python interpreters, this form will search the @@ -1192,7 +1192,7 @@ non-standard paths in the registry and user site-packages. * Adds ``._pth`` file support and removes ``applocal`` option from ``pyvenv.cfg``. - * Adds ``pythonXX.zip`` as a potential landmark when directly adjacent + * Adds :file:`python{XX}.zip` as a potential landmark when directly adjacent to the executable. .. deprecated:: diff --git a/Doc/whatsnew/2.0.rst b/Doc/whatsnew/2.0.rst index 71f681881f446f..c2b0ae8c76302a 100644 --- a/Doc/whatsnew/2.0.rst +++ b/Doc/whatsnew/2.0.rst @@ -153,9 +153,9 @@ Lundh. A detailed explanation of the interface was written up as :pep:`100`, significant points about the Unicode interfaces. In Python source code, Unicode strings are written as ``u"string"``. Arbitrary -Unicode characters can be written using a new escape sequence, ``\uHHHH``, where +Unicode characters can be written using a new escape sequence, :samp:`\\u{HHHH}`, where *HHHH* is a 4-digit hexadecimal number from 0000 to FFFF. The existing -``\xHHHH`` escape sequence can also be used, and octal escapes can be used for +:samp:`\\x{HH}` escape sequence can also be used, and octal escapes can be used for characters up to U+01FF, which is represented by ``\777``. Unicode strings, just like regular strings, are an immutable sequence type. diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index beba4428e67c3f..f3912d42180bfd 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -125,7 +125,7 @@ and to C extension code as :c:data:`!Py_Py3kWarningFlag`. .. seealso:: - The 3xxx series of PEPs, which contains proposals for Python 3.0. + The 3\ *xxx* series of PEPs, which contains proposals for Python 3.0. :pep:`3000` describes the development process for Python 3.0. Start with :pep:`3100` that describes the general goals for Python 3.0, and then explore the higher-numbered PEPS that propose diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index e2d2902c3754b6..257025da91a7ed 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -218,7 +218,7 @@ Windows ``py.exe`` launcher improvements The copy of the :ref:`launcher` included with Python 3.11 has been significantly updated. It now supports company/tag syntax as defined in :pep:`514` using the -``-V:/`` argument instead of the limited ``-.``. +:samp:`-V:{}/{}` argument instead of the limited :samp:`-{}.{}`. This allows launching distributions other than ``PythonCore``, the one hosted on `python.org `_. @@ -227,8 +227,8 @@ installs will be searched. For example, ``-V:OtherPython/`` will select the "best" tag registered for ``OtherPython``, while ``-V:3.11`` or ``-V:/3.11`` will select the "best" distribution with tag ``3.11``. -When using the legacy ``-``, ``-.``, -``--`` or ``-.-`` arguments, +When using the legacy :samp:`-{}`, :samp:`-{}.{}`, +:samp:`-{}-{}` or :samp:`-{}.{}-{}` arguments, all existing behaviour should be preserved from past versions, and only releases from ``PythonCore`` will be selected. However, the ``-64`` suffix now implies "not 32-bit" (not necessarily x86-64), diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst index 3f98c82c2fa556..e440193d6f3d29 100644 --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -2067,7 +2067,7 @@ The :pep:`418` added new functions to the :mod:`time` module: Other new functions: * :func:`~time.clock_getres`, :func:`~time.clock_gettime` and - :func:`~time.clock_settime` functions with ``CLOCK_xxx`` constants. + :func:`~time.clock_settime` functions with :samp:`CLOCK_{xxx}` constants. (Contributed by Victor Stinner in :issue:`10278`.) To improve cross platform consistency, :func:`~time.sleep` now raises a diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst index a36e9fa852723a..2ddab76814369e 100644 --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -2085,7 +2085,7 @@ Deprecations in the Python API :meth:`importlib.abc.MetaPathFinder.find_spec`; :meth:`!importlib.abc.PathEntryFinder.find_loader` and :meth:`!find_module` are replaced by - :meth:`importlib.abc.PathEntryFinder.find_spec`; all of the ``xxxLoader`` ABC + :meth:`importlib.abc.PathEntryFinder.find_spec`; all of the :samp:`{xxx}Loader` ABC ``load_module`` methods (:meth:`!importlib.abc.Loader.load_module`, :meth:`!importlib.abc.InspectLoader.load_module`, :meth:`!importlib.abc.FileLoader.load_module`, diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 6d1104938dafa8..e15180c89f594c 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -404,7 +404,7 @@ Other Language Changes or :meth:`~object.__complex__` is not available. (Contributed by Serhiy Storchaka in :issue:`20092`.) -* Added support of ``\N{name}`` escapes in :mod:`regular expressions `:: +* Added support of :samp:`\\N\\{{name}\\}` escapes in :mod:`regular expressions `:: >>> notice = 'Copyright © 2019' >>> copyright_year_pattern = re.compile(r'\N{copyright sign}\s*(\d{4})') diff --git a/Misc/NEWS.d/3.12.0a1.rst b/Misc/NEWS.d/3.12.0a1.rst index ebfe51ee61f34c..633738de92bef7 100644 --- a/Misc/NEWS.d/3.12.0a1.rst +++ b/Misc/NEWS.d/3.12.0a1.rst @@ -5350,7 +5350,7 @@ in a virtual environment. .. nonce: FbHZuS .. section: Windows -Fix :file:`py.exe` launcher handling of ``-V:/`` option when +Fix :file:`py.exe` launcher handling of :samp:`-V:{}/` option when default preferences have been set in environment variables or configuration files. diff --git a/Misc/NEWS.d/3.12.0a2.rst b/Misc/NEWS.d/3.12.0a2.rst index 41f5f67df01d91..1a04ed473f329d 100644 --- a/Misc/NEWS.d/3.12.0a2.rst +++ b/Misc/NEWS.d/3.12.0a2.rst @@ -8,7 +8,7 @@ The IDNA codec decoder used on DNS hostnames by :mod:`socket` or :mod:`asyncio` related name resolution functions no longer involves a quadratic algorithm. This prevents a potential CPU denial of service if an out-of-spec excessive length hostname involving bidirectional characters -were decoded. Some protocols such as :mod:`urllib` http ``3xx`` redirects +were decoded. Some protocols such as :mod:`urllib` http :samp:`3{xx}` redirects potentially allow for an attacker to supply such a name. Individual labels within an IDNA encoded DNS name will now raise an error diff --git a/Misc/NEWS.d/3.12.0a3.rst b/Misc/NEWS.d/3.12.0a3.rst index 27bd456f3f05d9..ce128fd5f80c77 100644 --- a/Misc/NEWS.d/3.12.0a3.rst +++ b/Misc/NEWS.d/3.12.0a3.rst @@ -9,7 +9,7 @@ within a garbage request to be printed to the stderr server log. This is done by changing the :mod:`http.server` :class:`BaseHTTPRequestHandler` ``.log_message`` method to replace control -characters with a ``\xHH`` hex escape before printing. +characters with a :samp:`\\x{HH}` hex escape before printing. .. diff --git a/Misc/NEWS.d/3.5.0rc1.rst b/Misc/NEWS.d/3.5.0rc1.rst index 1fb9bc6c04da38..64e9435b252acb 100644 --- a/Misc/NEWS.d/3.5.0rc1.rst +++ b/Misc/NEWS.d/3.5.0rc1.rst @@ -168,7 +168,7 @@ Sanad Zaki Rizvi. Idle editor default font. Switch from Courier to platform-sensitive TkFixedFont. This should not affect current customized font selections. If -there is a problem, edit $HOME/.idlerc/config-main.cfg and remove 'fontxxx' +there is a problem, edit $HOME/.idlerc/config-main.cfg and remove ':samp:`font{xxx}`' entries from [Editor Window]. Patch by Mark Roseman. .. diff --git a/Misc/NEWS.d/3.5.1rc1.rst b/Misc/NEWS.d/3.5.1rc1.rst index dc247ce2096a7d..05e1ecfaf6bc79 100644 --- a/Misc/NEWS.d/3.5.1rc1.rst +++ b/Misc/NEWS.d/3.5.1rc1.rst @@ -189,7 +189,7 @@ comprehensions correspond to the opening brace. .. nonce: 0Gh-Ty .. section: Core and Builtins -Hide the private _Py_atomic_xxx symbols from the public Python.h header to +Hide the private :samp:`_Py_atomic_{xxx}` symbols from the public Python.h header to fix a compilation error with OpenMP. PyThreadState_GET() becomes an alias to PyThreadState_Get() to avoid ABI incompatibilities. diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst index ac9eefd2d90714..57f72e95b029fc 100644 --- a/Misc/NEWS.d/3.8.0a1.rst +++ b/Misc/NEWS.d/3.8.0a1.rst @@ -8253,7 +8253,7 @@ Explain how IDLE's Shell displays output. Improve the doc about IDLE running user code. The section is renamed from "IDLE -- console differences" is renamed "Running user code". It mostly -covers the implications of using custom sys.stdxxx objects. +covers the implications of using custom :samp:sys.std{xxx}` objects. .. diff --git a/Misc/NEWS.d/3.8.0a4.rst b/Misc/NEWS.d/3.8.0a4.rst index da03d93eae3965..7e8bfa5c4364a9 100644 --- a/Misc/NEWS.d/3.8.0a4.rst +++ b/Misc/NEWS.d/3.8.0a4.rst @@ -1087,7 +1087,7 @@ on the ABI. 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() +as a dynamic library accessing Python internals: export the :samp:`PyInit_{xxx}()` function in DLL exports on Windows. .. diff --git a/Misc/NEWS.d/3.9.0a1.rst b/Misc/NEWS.d/3.9.0a1.rst index 3f9512096b03cb..9818c17705074b 100644 --- a/Misc/NEWS.d/3.9.0a1.rst +++ b/Misc/NEWS.d/3.9.0a1.rst @@ -4118,7 +4118,7 @@ Add tests for ROT-13 codec. .. nonce: Zoe9ek .. section: Tests -Added tests for PyDateTime_xxx_GET_xxx() macros of the C API of the +Added tests for :samp:`PyDateTime_{xxx}_GET_{xxx}()` macros of the C API of the :mod:`datetime` module. Patch by Joannah Nanjekye. .. @@ -4576,7 +4576,7 @@ distutils bdist_wininst: bdist_wininst only works on Windows. .. nonce: j5ebdT .. section: Build -Many ``PyRun_XXX()`` functions like :c:func:`PyRun_String` were no longer +Many :samp:`PyRun_{XXX}()` functions like :c:func:`PyRun_String` were no longer exported in ``libpython38.dll`` by mistake. Export them again to fix the ABI compatibility. From b8d1744e7ba87a4057350fdfd788b5621095fc59 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 23 Sep 2023 09:35:30 +0300 Subject: [PATCH 315/357] gh-109611: Add convenient C API function _PyFile_Flush() (GH-109612) --- Include/internal/pycore_fileutils.h | 2 ++ Modules/_io/bufferedio.c | 14 ++++----- Modules/_io/iobase.c | 15 ++++------ Modules/_io/textio.c | 44 ++++++++++------------------- Modules/_threadmodule.c | 4 +-- Modules/faulthandler.c | 5 +--- Objects/fileobject.c | 12 ++++++++ Python/bltinmodule.c | 22 +++++---------- Python/errors.c | 4 +-- Python/pylifecycle.c | 17 ++--------- Python/pythonrun.c | 12 ++------ 11 files changed, 54 insertions(+), 97 deletions(-) diff --git a/Include/internal/pycore_fileutils.h b/Include/internal/pycore_fileutils.h index 9236e5907a48d5..2f89da2c6ecd91 100644 --- a/Include/internal/pycore_fileutils.h +++ b/Include/internal/pycore_fileutils.h @@ -318,6 +318,8 @@ PyAPI_FUNC(int) _PyLong_FileDescriptor_Converter(PyObject *, void *); // Export for test_peg_generator PyAPI_FUNC(char*) _Py_UniversalNewlineFgetsWithSize(char *, int, FILE*, PyObject *, size_t*); +extern int _PyFile_Flush(PyObject *); + #ifdef __cplusplus } #endif diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index 0983a7bd151f40..e8caf9f0df6dbf 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -553,17 +553,14 @@ _io__Buffered_close_impl(buffered *self) } /* flush() will most probably re-take the lock, so drop it first */ LEAVE_BUFFERED(self) - res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush)); + r = _PyFile_Flush((PyObject *)self); if (!ENTER_BUFFERED(self)) { return NULL; } PyObject *exc = NULL; - if (res == NULL) { + if (r < 0) { exc = PyErr_GetRaisedException(); } - else { - Py_DECREF(res); - } res = PyObject_CallMethodNoArgs(self->raw, &_Py_ID(close)); @@ -593,12 +590,11 @@ static PyObject * _io__Buffered_detach_impl(buffered *self) /*[clinic end generated code: output=dd0fc057b8b779f7 input=482762a345cc9f44]*/ { - PyObject *raw, *res; + PyObject *raw; CHECK_INITIALIZED(self) - res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush)); - if (res == NULL) + if (_PyFile_Flush((PyObject *)self) < 0) { return NULL; - Py_DECREF(res); + } raw = self->raw; self->raw = NULL; self->detached = 1; diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 78f0f949b68c06..4da8e5bd572d74 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -265,7 +265,7 @@ static PyObject * _io__IOBase_close_impl(PyObject *self) /*[clinic end generated code: output=63c6a6f57d783d6d input=f4494d5c31dbc6b7]*/ { - int rc, closed = iobase_is_closed(self); + int rc1, rc2, closed = iobase_is_closed(self); if (closed < 0) { return NULL; @@ -274,19 +274,14 @@ _io__IOBase_close_impl(PyObject *self) Py_RETURN_NONE; } - PyObject *res = PyObject_CallMethodNoArgs(self, &_Py_ID(flush)); - + rc1 = _PyFile_Flush(self); PyObject *exc = PyErr_GetRaisedException(); - rc = PyObject_SetAttr(self, &_Py_ID(__IOBase_closed), Py_True); + rc2 = PyObject_SetAttr(self, &_Py_ID(__IOBase_closed), Py_True); _PyErr_ChainExceptions1(exc); - if (rc < 0) { - Py_CLEAR(res); - } - - if (res == NULL) + if (rc1 < 0 || rc2 < 0) { return NULL; + } - Py_DECREF(res); Py_RETURN_NONE; } diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 91b677bde77dde..10ef8a803c50fd 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -1368,11 +1368,9 @@ _io_TextIOWrapper_reconfigure_impl(textio *self, PyObject *encoding, return NULL; } - PyObject *res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush)); - if (res == NULL) { + if (_PyFile_Flush((PyObject *)self) < 0) { return NULL; } - Py_DECREF(res); self->b2cratio = 0; if (newline_obj != NULL && set_newline(self, newline) < 0) { @@ -1508,12 +1506,11 @@ static PyObject * _io_TextIOWrapper_detach_impl(textio *self) /*[clinic end generated code: output=7ba3715cd032d5f2 input=e5a71fbda9e1d9f9]*/ { - PyObject *buffer, *res; + PyObject *buffer; CHECK_ATTACHED(self); - res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush)); - if (res == NULL) + if (_PyFile_Flush((PyObject *)self) < 0) { return NULL; - Py_DECREF(res); + } buffer = self->buffer; self->buffer = NULL; self->detached = 1; @@ -1713,10 +1710,9 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text) } if (needflush) { - ret = PyObject_CallMethodNoArgs(self->buffer, &_Py_ID(flush)); - if (ret == NULL) + if (_PyFile_Flush(self->buffer) < 0) { return NULL; - Py_DECREF(ret); + } } textiowrapper_set_decoded_chars(self, NULL); @@ -2502,10 +2498,9 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) goto fail; } - res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush)); - if (res == NULL) + if (_PyFile_Flush((PyObject *)self) < 0) { goto fail; - Py_DECREF(res); + } textiowrapper_set_decoded_chars(self, NULL); Py_CLEAR(self->snapshot); @@ -2550,10 +2545,9 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) goto fail; } - res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush)); - if (res == NULL) + if (_PyFile_Flush((PyObject *)self) < 0) { goto fail; - Py_DECREF(res); + } /* The strategy of seek() is to go back to the safe start point * and replay the effect of read(chars_to_skip) from there. @@ -2677,10 +2671,9 @@ _io_TextIOWrapper_tell_impl(textio *self) if (_textiowrapper_writeflush(self) < 0) return NULL; - res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush)); - if (res == NULL) + if (_PyFile_Flush((PyObject *)self) < 0) { goto fail; - Py_DECREF(res); + } posobj = PyObject_CallMethodNoArgs(self->buffer, &_Py_ID(tell)); if (posobj == NULL) @@ -2885,14 +2878,11 @@ static PyObject * _io_TextIOWrapper_truncate_impl(textio *self, PyObject *pos) /*[clinic end generated code: output=90ec2afb9bb7745f input=56ec8baa65aea377]*/ { - PyObject *res; - CHECK_ATTACHED(self) - res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush)); - if (res == NULL) + if (_PyFile_Flush((PyObject *)self) < 0) { return NULL; - Py_DECREF(res); + } return PyObject_CallMethodOneArg(self->buffer, &_Py_ID(truncate), pos); } @@ -3076,13 +3066,9 @@ _io_TextIOWrapper_close_impl(textio *self) PyErr_Clear(); } } - res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush)); - if (res == NULL) { + if (_PyFile_Flush((PyObject *)self) < 0) { exc = PyErr_GetRaisedException(); } - else { - Py_DECREF(res); - } res = PyObject_CallMethodNoArgs(self->buffer, &_Py_ID(close)); if (exc != NULL) { diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 7692bacccc4909..9c915488f6e0de 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -1497,11 +1497,9 @@ thread_excepthook_file(PyObject *file, PyObject *exc_type, PyObject *exc_value, _PyErr_Display(file, exc_type, exc_value, exc_traceback); /* Call file.flush() */ - PyObject *res = PyObject_CallMethodNoArgs(file, &_Py_ID(flush)); - if (!res) { + if (_PyFile_Flush(file) < 0) { return -1; } - Py_DECREF(res); return 0; } diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index f05cdd9a37f8a4..b051c71b3ade9b 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -146,10 +146,7 @@ faulthandler_get_fileno(PyObject **file_ptr) return -1; } - result = PyObject_CallMethodNoArgs(file, &_Py_ID(flush)); - if (result != NULL) - Py_DECREF(result); - else { + if (_PyFile_Flush(file) < 0) { /* ignore flush() error */ PyErr_Clear(); } diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 9c240250218838..0cf2b47c3b3ae7 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -529,6 +529,18 @@ PyFile_OpenCode(const char *utf8path) } +int +_PyFile_Flush(PyObject *file) +{ + PyObject *tmp = PyObject_CallMethodNoArgs(file, &_Py_ID(flush)); + if (tmp == NULL) { + return -1; + } + Py_DECREF(tmp); + return 0; +} + + #ifdef __cplusplus } #endif diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 8e234e085f16c9..69056bf23f4058 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -2083,11 +2083,9 @@ builtin_print_impl(PyObject *module, PyObject *args, PyObject *sep, } if (flush) { - PyObject *tmp = PyObject_CallMethodNoArgs(file, &_Py_ID(flush)); - if (tmp == NULL) { + if (_PyFile_Flush(file) < 0) { return NULL; } - Py_DECREF(tmp); } Py_RETURN_NONE; @@ -2146,11 +2144,9 @@ builtin_input_impl(PyObject *module, PyObject *prompt) } /* First of all, flush stderr */ - tmp = PyObject_CallMethodNoArgs(ferr, &_Py_ID(flush)); - if (tmp == NULL) + if (_PyFile_Flush(ferr) < 0) { PyErr_Clear(); - else - Py_DECREF(tmp); + } /* We should only use (GNU) readline if Python's sys.stdin and sys.stdout are the same as C's stdin and stdout, because we @@ -2218,11 +2214,9 @@ builtin_input_impl(PyObject *module, PyObject *prompt) if (stdin_errors_str == NULL) { goto _readline_errors; } - tmp = PyObject_CallMethodNoArgs(fout, &_Py_ID(flush)); - if (tmp == NULL) + if (_PyFile_Flush(fout) < 0) { PyErr_Clear(); - else - Py_DECREF(tmp); + } if (prompt != NULL) { /* We have a prompt, encode it as stdout would */ const char *stdout_encoding_str, *stdout_errors_str; @@ -2325,11 +2319,9 @@ builtin_input_impl(PyObject *module, PyObject *prompt) if (PyFile_WriteObject(prompt, fout, Py_PRINT_RAW) != 0) return NULL; } - tmp = PyObject_CallMethodNoArgs(fout, &_Py_ID(flush)); - if (tmp == NULL) + if (_PyFile_Flush(fout) < 0) { PyErr_Clear(); - else - Py_DECREF(tmp); + } return PyFile_GetLine(fin, -1); } diff --git a/Python/errors.c b/Python/errors.c index e6fa15f92b5315..b05b3ef1dda8fe 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -1513,11 +1513,9 @@ write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, } /* Explicitly call file.flush() */ - PyObject *res = PyObject_CallMethodNoArgs(file, &_Py_ID(flush)); - if (!res) { + if (_PyFile_Flush(file) < 0) { return -1; } - Py_DECREF(res); return 0; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 480001538540bb..aec8da10249d21 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1639,27 +1639,20 @@ flush_std_files(void) PyThreadState *tstate = _PyThreadState_GET(); PyObject *fout = _PySys_GetAttr(tstate, &_Py_ID(stdout)); PyObject *ferr = _PySys_GetAttr(tstate, &_Py_ID(stderr)); - PyObject *tmp; int status = 0; if (fout != NULL && fout != Py_None && !file_is_closed(fout)) { - tmp = PyObject_CallMethodNoArgs(fout, &_Py_ID(flush)); - if (tmp == NULL) { + if (_PyFile_Flush(fout) < 0) { PyErr_WriteUnraisable(fout); status = -1; } - else - Py_DECREF(tmp); } if (ferr != NULL && ferr != Py_None && !file_is_closed(ferr)) { - tmp = PyObject_CallMethodNoArgs(ferr, &_Py_ID(flush)); - if (tmp == NULL) { + if (_PyFile_Flush(ferr) < 0) { PyErr_Clear(); status = -1; } - else - Py_DECREF(tmp); } return status; @@ -2632,13 +2625,9 @@ _Py_FatalError_PrintExc(PyThreadState *tstate) Py_DECREF(exc); /* sys.stderr may be buffered: call sys.stderr.flush() */ - PyObject *res = PyObject_CallMethodNoArgs(ferr, &_Py_ID(flush)); - if (res == NULL) { + if (_PyFile_Flush(ferr) < 0) { _PyErr_Clear(tstate); } - else { - Py_DECREF(res); - } return has_tb; } diff --git a/Python/pythonrun.c b/Python/pythonrun.c index e3d03a8c95d767..81ab78e95ab68c 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1562,14 +1562,10 @@ _PyErr_Display(PyObject *file, PyObject *unused, PyObject *value, PyObject *tb) Py_XDECREF(ctx.seen); /* Call file.flush() */ - PyObject *res = PyObject_CallMethodNoArgs(file, &_Py_ID(flush)); - if (!res) { + if (_PyFile_Flush(file) < 0) { /* Silently ignore file.flush() error */ PyErr_Clear(); } - else { - Py_DECREF(res); - } } void @@ -1674,11 +1670,7 @@ flush_io_stream(PyThreadState *tstate, PyObject *name) { PyObject *f = _PySys_GetAttr(tstate, name); if (f != NULL) { - PyObject *r = PyObject_CallMethodNoArgs(f, &_Py_ID(flush)); - if (r) { - Py_DECREF(r); - } - else { + if (_PyFile_Flush(f) < 0) { PyErr_Clear(); } } From 62c7015e89cbdedb5218d4fedd45f971885f67a8 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 23 Sep 2023 09:39:24 +0300 Subject: [PATCH 316/357] gh-109521: Fix obscure cases handling in PyImport_GetImporter() (GH-109522) PyImport_GetImporter() now sets RuntimeError if it fails to get sys.path_hooks or sys.path_importer_cache or they are not list and dict correspondingly. Previously it could return NULL without setting error in obscure cases, crash or raise SystemError if these attributes have wrong type. --- ...-09-17-21-47-31.gh-issue-109521.JDF6i9.rst | 5 ++++ Python/import.c | 26 +++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2023-09-17-21-47-31.gh-issue-109521.JDF6i9.rst diff --git a/Misc/NEWS.d/next/C API/2023-09-17-21-47-31.gh-issue-109521.JDF6i9.rst b/Misc/NEWS.d/next/C API/2023-09-17-21-47-31.gh-issue-109521.JDF6i9.rst new file mode 100644 index 00000000000000..338650c9246686 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2023-09-17-21-47-31.gh-issue-109521.JDF6i9.rst @@ -0,0 +1,5 @@ +:c:func:`PyImport_GetImporter` now sets RuntimeError if it fails to get +:data:`sys.path_hooks` or :data:`sys.path_importer_cache` or they are not +list and dict correspondingly. Previously it could return NULL without +setting error in obscure cases, crash or raise SystemError if these +attributes have wrong type. diff --git a/Python/import.c b/Python/import.c index 9b0be026f36bc3..5a06cb367e828b 100644 --- a/Python/import.c +++ b/Python/import.c @@ -2363,9 +2363,14 @@ get_path_importer(PyThreadState *tstate, PyObject *path_importer_cache, PyObject *importer; Py_ssize_t j, nhooks; - /* These conditions are the caller's responsibility: */ - assert(PyList_Check(path_hooks)); - assert(PyDict_Check(path_importer_cache)); + if (!PyList_Check(path_hooks)) { + PyErr_SetString(PyExc_RuntimeError, "sys.path_hooks is not a list"); + return NULL; + } + if (!PyDict_Check(path_importer_cache)) { + PyErr_SetString(PyExc_RuntimeError, "sys.path_importer_cache is not a dict"); + return NULL; + } nhooks = PyList_Size(path_hooks); if (nhooks < 0) @@ -2408,11 +2413,22 @@ PyImport_GetImporter(PyObject *path) { PyThreadState *tstate = _PyThreadState_GET(); PyObject *path_importer_cache = PySys_GetObject("path_importer_cache"); + if (path_importer_cache == NULL) { + PyErr_SetString(PyExc_RuntimeError, "lost sys.path_importer_cache"); + return NULL; + } + Py_INCREF(path_importer_cache); PyObject *path_hooks = PySys_GetObject("path_hooks"); - if (path_importer_cache == NULL || path_hooks == NULL) { + if (path_hooks == NULL) { + PyErr_SetString(PyExc_RuntimeError, "lost sys.path_hooks"); + Py_DECREF(path_importer_cache); return NULL; } - return get_path_importer(tstate, path_importer_cache, path_hooks, path); + Py_INCREF(path_hooks); + PyObject *importer = get_path_importer(tstate, path_importer_cache, path_hooks, path); + Py_DECREF(path_hooks); + Py_DECREF(path_importer_cache); + return importer; } From e8be0c9c5a7c2327b3dd64009f45ee0682322dcb Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Sat, 23 Sep 2023 08:46:35 +0100 Subject: [PATCH 317/357] gh-109653: `typing.py`: improve import time by creating soft-deprecated members on demand (#109651) Co-authored-by: Thomas Grainger --- Lib/test/test_typing.py | 4 +++ Lib/typing.py | 26 +++++++++++++------ ...-09-21-19-42-22.gh-issue-109653.bL3iLH.rst | 2 ++ 3 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-21-19-42-22.gh-issue-109653.bL3iLH.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 4d1c0f2c724b86..9e891f113840be 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -9373,6 +9373,10 @@ def test_all(self): self.assertIn('SupportsComplex', a) def test_all_exported_names(self): + # ensure all dynamically created objects are actualised + for name in typing.__all__: + getattr(typing, name) + actual_all = set(typing.__all__) computed_all = { k for k, v in vars(typing).items() diff --git a/Lib/typing.py b/Lib/typing.py index 183d5b29a23362..639be75747dae0 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -23,10 +23,8 @@ from collections import defaultdict import collections.abc import copyreg -import contextlib import functools import operator -import re as stdlib_re # Avoid confusion with the typing.re namespace on <=3.11 import sys import types from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType, GenericAlias @@ -2580,8 +2578,6 @@ class Other(Leaf): # Error reported by type checker KeysView = _alias(collections.abc.KeysView, 1) ItemsView = _alias(collections.abc.ItemsView, 2) ValuesView = _alias(collections.abc.ValuesView, 1) -ContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager') -AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager') Dict = _alias(dict, 2, inst=False, name='Dict') DefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict') OrderedDict = _alias(collections.OrderedDict, 2) @@ -3238,10 +3234,6 @@ def __enter__(self) -> 'TextIO': pass -Pattern = _alias(stdlib_re.Pattern, 1) -Match = _alias(stdlib_re.Match, 1) - - def reveal_type[T](obj: T, /) -> T: """Reveal the inferred type of a variable. @@ -3426,3 +3418,21 @@ def get_protocol_members(tp: type, /) -> frozenset[str]: if not is_protocol(tp): raise TypeError(f'{tp!r} is not a Protocol') return frozenset(tp.__protocol_attrs__) + + +def __getattr__(attr): + """Improve the import time of the typing module. + + Soft-deprecated objects which are costly to create + are only created on-demand here. + """ + if attr in {"Pattern", "Match"}: + import re + obj = _alias(getattr(re, attr), 1) + elif attr in {"ContextManager", "AsyncContextManager"}: + import contextlib + obj = _alias(getattr(contextlib, f"Abstract{attr}"), 1, name=attr) + else: + raise AttributeError(f"module {__name__!r} has no attribute {attr!r}") + globals()[attr] = obj + return obj diff --git a/Misc/NEWS.d/next/Library/2023-09-21-19-42-22.gh-issue-109653.bL3iLH.rst b/Misc/NEWS.d/next/Library/2023-09-21-19-42-22.gh-issue-109653.bL3iLH.rst new file mode 100644 index 00000000000000..9f794bb58ba63b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-21-19-42-22.gh-issue-109653.bL3iLH.rst @@ -0,0 +1,2 @@ +Reduce the import time of :mod:`typing` by around a third. +Patch by Alex Waygood. From 51863b7d6ea183167da09fc6b3f2745a1aaa4ef5 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Sat, 23 Sep 2023 19:31:17 +0100 Subject: [PATCH 318/357] gh-109653: Improve `enum` import time by avoiding import of `functools` (GH-109789) --- Lib/enum.py | 5 ++--- .../Library/2023-09-23-12-47-45.gh-issue-109653.9wZBfs.rst | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-23-12-47-45.gh-issue-109653.9wZBfs.rst diff --git a/Lib/enum.py b/Lib/enum.py index 994a7b9c73f9a7..f5448a1788e4d2 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -1,8 +1,6 @@ import sys import builtins as bltns from types import MappingProxyType, DynamicClassAttribute -from operator import or_ as _or_ -from functools import reduce __all__ = [ @@ -1884,7 +1882,8 @@ def __call__(self, enumeration): missed = [v for v in values if v not in member_values] if missed: missing_names.append(name) - missing_value |= reduce(_or_, missed) + for val in missed: + missing_value |= val if missing_names: if len(missing_names) == 1: alias = 'alias %s is missing' % missing_names[0] diff --git a/Misc/NEWS.d/next/Library/2023-09-23-12-47-45.gh-issue-109653.9wZBfs.rst b/Misc/NEWS.d/next/Library/2023-09-23-12-47-45.gh-issue-109653.9wZBfs.rst new file mode 100644 index 00000000000000..1d0f0e4f83b5e1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-23-12-47-45.gh-issue-109653.9wZBfs.rst @@ -0,0 +1 @@ +Reduce the import time of :mod:`enum` by over 50%. Patch by Alex Waygood. From 649768fb6781ba810df44017fee1975a11d65e2f Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Sun, 24 Sep 2023 12:49:02 +0300 Subject: [PATCH 319/357] gh-101100: Fix sphinx warnings in `Doc/library/xml.etree.elementtree.rst` (#109799) gh-101100: Fix shpinx warnings in `Doc/library/xml.etree.elementtree.rst` --- Doc/library/xml.etree.elementtree.rst | 7 ++++++- Doc/tools/.nitignore | 1 - 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index f9290f528e5555..54c93008503c02 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -17,7 +17,7 @@ for parsing and creating XML data. This module will use a fast implementation whenever available. .. deprecated:: 3.3 - The :mod:`xml.etree.cElementTree` module is deprecated. + The :mod:`!xml.etree.cElementTree` module is deprecated. .. warning:: @@ -825,6 +825,8 @@ Reference Functions ^^^^^^^^^ +.. module:: xml.etree.ElementInclude + .. function:: xml.etree.ElementInclude.default_loader( href, parse, encoding=None) :module: @@ -862,6 +864,9 @@ Functions Element Objects ^^^^^^^^^^^^^^^ +.. module:: xml.etree.ElementTree + :noindex: + .. class:: Element(tag, attrib={}, **extra) Element class. This class defines the Element interface, and provides a diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 39a10992193ffc..487652f4b51d4b 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -139,7 +139,6 @@ Doc/library/wsgiref.rst Doc/library/xml.dom.minidom.rst Doc/library/xml.dom.pulldom.rst Doc/library/xml.dom.rst -Doc/library/xml.etree.elementtree.rst Doc/library/xml.rst Doc/library/xml.sax.handler.rst Doc/library/xml.sax.reader.rst From 19601efa364fe3c294d8010effe11e025cbc230e Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Sun, 24 Sep 2023 15:07:23 +0100 Subject: [PATCH 320/357] gh-109653: Remove unused imports in the `Lib/` directory (#109803) --- Lib/asyncio/tasks.py | 1 - Lib/test/mapping_tests.py | 1 - Lib/test/support/interpreters.py | 2 +- Lib/test/test_asyncio/test_eager_task_factory.py | 1 - Lib/test/test_capi/test_abstract.py | 3 --- Lib/test/test_capi/test_dict.py | 3 --- Lib/test/test_capi/test_misc.py | 2 +- Lib/test/test_csv.py | 2 +- Lib/test/test_decimal.py | 1 - Lib/test/test_dictviews.py | 1 - Lib/test/test_gdb.py | 1 - Lib/test/test_importlib/import_/test_packages.py | 1 - Lib/test/test_peg_generator/__init__.py | 1 - Lib/test/test_pyexpat.py | 3 +-- Lib/test/test_sqlite3/test_dump.py | 1 - Lib/test/test_sqlite3/test_userfunctions.py | 2 +- Lib/test/test_sqlite3/util.py | 1 - Lib/test/test_tkinter/support.py | 1 - Lib/test/test_unittest/testmock/testthreadingmock.py | 2 +- Lib/test/test_zlib.py | 1 - 20 files changed, 6 insertions(+), 25 deletions(-) diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index edc64fda2a6ad6..21a1b24194bcd8 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -17,7 +17,6 @@ import itertools import math import types -import warnings import weakref from types import GenericAlias diff --git a/Lib/test/mapping_tests.py b/Lib/test/mapping_tests.py index b3e4192e65d957..b4cfce19a7174e 100644 --- a/Lib/test/mapping_tests.py +++ b/Lib/test/mapping_tests.py @@ -1,7 +1,6 @@ # tests common to dict and UserDict import unittest import collections -import sys from test.support import Py_C_RECURSION_LIMIT diff --git a/Lib/test/support/interpreters.py b/Lib/test/support/interpreters.py index 5c484d1170d1d9..eeff3abe0324e5 100644 --- a/Lib/test/support/interpreters.py +++ b/Lib/test/support/interpreters.py @@ -5,7 +5,7 @@ import _xxinterpchannels as _channels # aliases: -from _xxsubinterpreters import is_shareable, RunFailedError +from _xxsubinterpreters import is_shareable from _xxinterpchannels import ( ChannelError, ChannelNotFoundError, ChannelEmptyError, ) diff --git a/Lib/test/test_asyncio/test_eager_task_factory.py b/Lib/test/test_asyncio/test_eager_task_factory.py index fc9ad8eb43bb1b..0f8212dbec47be 100644 --- a/Lib/test/test_asyncio/test_eager_task_factory.py +++ b/Lib/test/test_asyncio/test_eager_task_factory.py @@ -7,7 +7,6 @@ from unittest import mock from asyncio import tasks from test.test_asyncio import utils as test_utils -import test.support from test.support.script_helper import assert_python_ok MOCK_ANY = mock.ANY diff --git a/Lib/test/test_capi/test_abstract.py b/Lib/test/test_capi/test_abstract.py index 7fad853ff54fe3..eeaef60a8b47b5 100644 --- a/Lib/test/test_capi/test_abstract.py +++ b/Lib/test/test_capi/test_abstract.py @@ -1,8 +1,5 @@ import unittest -import sys from collections import OrderedDict -from test import support -from test.support import import_helper import _testcapi diff --git a/Lib/test/test_capi/test_dict.py b/Lib/test/test_capi/test_dict.py index b22fa20e14dfea..11b2ca910707df 100644 --- a/Lib/test/test_capi/test_dict.py +++ b/Lib/test/test_capi/test_dict.py @@ -1,9 +1,6 @@ import unittest -import sys from collections import OrderedDict, UserDict from types import MappingProxyType -from test import support -from test.support import import_helper import _testcapi diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py index cf1cba3e693ef6..5ece213e7b2363 100644 --- a/Lib/test/test_capi/test_misc.py +++ b/Lib/test/test_capi/test_misc.py @@ -2,7 +2,7 @@ # these are all functions _testcapi exports whose name begins with 'test_'. import _thread -from collections import OrderedDict, deque +from collections import deque import contextlib import importlib.machinery import importlib.util diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index 27f4978ca66a88..97b9bba24bcbca 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -10,7 +10,7 @@ import gc import pickle from test import support -from test.support import warnings_helper, import_helper, check_disallow_instantiation +from test.support import import_helper, check_disallow_instantiation from itertools import permutations from textwrap import dedent from collections import OrderedDict diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py index d806eeac25fb2f..bd299483e7b0bd 100644 --- a/Lib/test/test_decimal.py +++ b/Lib/test/test_decimal.py @@ -41,7 +41,6 @@ darwin_malloc_err_warning, is_emscripten) from test.support.import_helper import import_fresh_module from test.support import threading_helper -from test.support import warnings_helper import random import inspect import threading diff --git a/Lib/test/test_dictviews.py b/Lib/test/test_dictviews.py index 34918585513846..cad568b6ac4c2d 100644 --- a/Lib/test/test_dictviews.py +++ b/Lib/test/test_dictviews.py @@ -1,7 +1,6 @@ import collections.abc import copy import pickle -import sys import unittest from test.support import Py_C_RECURSION_LIMIT diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index 914ef942feab12..5a4394a0993c8d 100644 --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -4,7 +4,6 @@ # Lib/test/test_jit_gdb.py import os -import platform import re import subprocess import sys diff --git a/Lib/test/test_importlib/import_/test_packages.py b/Lib/test/test_importlib/import_/test_packages.py index eb0831f7d6d54b..0c29d6083265fa 100644 --- a/Lib/test/test_importlib/import_/test_packages.py +++ b/Lib/test/test_importlib/import_/test_packages.py @@ -1,7 +1,6 @@ from test.test_importlib import util import sys import unittest -from test import support from test.support import import_helper diff --git a/Lib/test/test_peg_generator/__init__.py b/Lib/test/test_peg_generator/__init__.py index c23542e254c99f..b32db4426f251d 100644 --- a/Lib/test/test_peg_generator/__init__.py +++ b/Lib/test/test_peg_generator/__init__.py @@ -1,5 +1,4 @@ import os.path -import unittest from test import support from test.support import load_package_tests diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py index 41f4d172f8d057..a542abaf1f35aa 100644 --- a/Lib/test/test_pyexpat.py +++ b/Lib/test/test_pyexpat.py @@ -2,7 +2,6 @@ # handler, are obscure and unhelpful. import os -import platform import sys import sysconfig import unittest @@ -14,7 +13,7 @@ from xml.parsers import expat from xml.parsers.expat import errors -from test.support import sortdict, is_emscripten, is_wasi +from test.support import sortdict class SetAttributeTest(unittest.TestCase): diff --git a/Lib/test/test_sqlite3/test_dump.py b/Lib/test/test_sqlite3/test_dump.py index 3107e1b165d950..14a18c1ad37102 100644 --- a/Lib/test/test_sqlite3/test_dump.py +++ b/Lib/test/test_sqlite3/test_dump.py @@ -1,7 +1,6 @@ # Author: Paul Kippes import unittest -import sqlite3 as sqlite from .util import memory_database from .util import MemoryDatabaseMixin diff --git a/Lib/test/test_sqlite3/test_userfunctions.py b/Lib/test/test_sqlite3/test_userfunctions.py index 09019498fd5682..c6c3db159add64 100644 --- a/Lib/test/test_sqlite3/test_userfunctions.py +++ b/Lib/test/test_sqlite3/test_userfunctions.py @@ -29,7 +29,7 @@ from test.support import bigmemtest, gc_collect from .util import cx_limit, memory_database -from .util import with_tracebacks, check_tracebacks +from .util import with_tracebacks def func_returntext(): diff --git a/Lib/test/test_sqlite3/util.py b/Lib/test/test_sqlite3/util.py index 505406c437b632..5599823838beea 100644 --- a/Lib/test/test_sqlite3/util.py +++ b/Lib/test/test_sqlite3/util.py @@ -4,7 +4,6 @@ import re import sqlite3 import test.support -import unittest # Helper for temporary memory databases diff --git a/Lib/test/test_tkinter/support.py b/Lib/test/test_tkinter/support.py index 10e64bf40a4afa..a37705f0ae6feb 100644 --- a/Lib/test/test_tkinter/support.py +++ b/Lib/test/test_tkinter/support.py @@ -1,6 +1,5 @@ import functools import tkinter -import unittest class AbstractTkTest: diff --git a/Lib/test/test_unittest/testmock/testthreadingmock.py b/Lib/test/test_unittest/testmock/testthreadingmock.py index 94e71921d9bc03..a02b532ed447cd 100644 --- a/Lib/test/test_unittest/testmock/testthreadingmock.py +++ b/Lib/test/test_unittest/testmock/testthreadingmock.py @@ -3,7 +3,7 @@ import concurrent.futures from test.support import threading_helper -from unittest.mock import patch, ThreadingMock, call +from unittest.mock import patch, ThreadingMock threading_helper.requires_working_threading(module=True) diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py index 55306c63cd4e16..9a099adc74f4b4 100644 --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -3,7 +3,6 @@ from test.support import import_helper import binascii import copy -import os import pickle import random import sys From 8d365b60bacf0a7edda24eba2d45aba1c2626fbc Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Sun, 24 Sep 2023 17:05:57 +0100 Subject: [PATCH 321/357] GH-109190: Copyedit 3.12 What's New: Use the ``:file:`` role (#109756) Co-authored-by: Hugo van Kemenade --- Doc/whatsnew/3.12.rst | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 22538a476d31b4..2a186e8c8484ec 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -1583,7 +1583,7 @@ zipimport Others ------ -* Removed the ``suspicious`` rule from the documentation Makefile, and +* Removed the ``suspicious`` rule from the documentation :file:`Makefile`, and removed ``Doc/tools/rstlint.py``, both in favor of `sphinx-lint `_. (Contributed by Julien Palard in :gh:`98179`.) @@ -1710,9 +1710,9 @@ Changes in the Python API Build Changes ============= -* Python no longer uses ``setup.py`` to build shared C extension modules. +* Python no longer uses :file:`setup.py` to build shared C extension modules. Build parameters like headers and libraries are detected in ``configure`` - script. Extensions are built by ``Makefile``. Most extensions use + script. Extensions are built by :file:`Makefile`. Most extensions use ``pkg-config`` and fall back to manual detection. (Contributed by Christian Heimes in :gh:`93939`.) @@ -1725,7 +1725,7 @@ Build Changes if the Clang compiler accepts the flag. (Contributed by Donghee Na in :gh:`89536`.) -* Add ``COMPILEALL_OPTS`` variable in Makefile to override :mod:`compileall` +* Add ``COMPILEALL_OPTS`` variable in :file:`Makefile` to override :mod:`compileall` options (default: ``-j0``) in ``make install``. Also merged the 3 ``compileall`` commands into a single command to build .pyc files for all optimization levels (0, 1, 2) at once. @@ -1892,7 +1892,7 @@ New Features - ``SSTATE_INTERNED_IMMORTAL_STATIC`` An identifier for interned unicode objects that are immortal and static - ``sys.getunicodeinternedsize`` This returns the total number of unicode - objects that have been interned. This is now needed for refleak.py to + objects that have been interned. This is now needed for :file:`refleak.py` to correctly track reference counts and allocated blocks (Contributed by Eddie Elizondo in :gh:`84436`.) @@ -2083,10 +2083,10 @@ Deprecated * Creating immutable types (:c:macro:`Py_TPFLAGS_IMMUTABLETYPE`) with mutable bases is deprecated and will be disabled in Python 3.14. -* The ``structmember.h`` header is deprecated, though it continues to be +* The :file:`structmember.h` header is deprecated, though it continues to be available and there are no plans to remove it. - Its contents are now available just by including ``Python.h``, + Its contents are now available just by including :file:`Python.h`, with a ``Py`` prefix added if it was missing: - :c:struct:`PyMemberDef`, :c:func:`PyMember_GetOne` and @@ -2096,14 +2096,14 @@ Deprecated - The flags :c:macro:`Py_READONLY` (previously ``READONLY``) and :c:macro:`Py_AUDIT_READ` (previously all uppercase) - Several items are not exposed from ``Python.h``: + Several items are not exposed from :file:`Python.h`: - :c:macro:`T_OBJECT` (use :c:macro:`Py_T_OBJECT_EX`) - :c:macro:`T_NONE` (previously undocumented, and pretty quirky) - The macro ``WRITE_RESTRICTED`` which does nothing. - The macros ``RESTRICTED`` and ``READ_RESTRICTED``, equivalents of :c:macro:`Py_AUDIT_READ`. - - In some configurations, ```` is not included from ``Python.h``. + - In some configurations, ```` is not included from :file:`Python.h`. It should be included manually when using ``offsetof()``. The deprecated header continues to provide its original @@ -2133,8 +2133,8 @@ Deprecated Removed ------- -* Remove the ``token.h`` header file. There was never any public tokenizer C - API. The ``token.h`` header file was only designed to be used by Python +* Remove the :file:`token.h` header file. There was never any public tokenizer C + API. The :file:`token.h` header file was only designed to be used by Python internals. (Contributed by Victor Stinner in :gh:`92651`.) From 40d1de758100368bce36ad7674bd937acca153bd Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Sun, 24 Sep 2023 17:18:27 +0100 Subject: [PATCH 322/357] gh-109653: Avoid a top-level import of `types` in `functools` (#109804) --- Lib/functools.py | 3 ++- .../Library/2023-09-24-13-28-35.gh-issue-109653.9IFU0B.rst | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-24-13-28-35.gh-issue-109653.9IFU0B.rst diff --git a/Lib/functools.py b/Lib/functools.py index 6cb532323b1d67..55990e742bf23f 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -19,8 +19,9 @@ # import types, weakref # Deferred to single_dispatch() from reprlib import recursive_repr from _thread import RLock -from types import GenericAlias +# Avoid importing types, so we can speedup import time +GenericAlias = type(list[int]) ################################################################################ ### update_wrapper() and wraps() decorator diff --git a/Misc/NEWS.d/next/Library/2023-09-24-13-28-35.gh-issue-109653.9IFU0B.rst b/Misc/NEWS.d/next/Library/2023-09-24-13-28-35.gh-issue-109653.9IFU0B.rst new file mode 100644 index 00000000000000..c4f5a62433a2c1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-24-13-28-35.gh-issue-109653.9IFU0B.rst @@ -0,0 +1,2 @@ +Improve import time of :mod:`functools` by around 13%. Patch by Alex +Waygood. From e81bd3fa16b05e2f359105eb77da976390488d81 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Sun, 24 Sep 2023 10:27:24 -0700 Subject: [PATCH 323/357] Sync whatsnew with the edit I made in the 3.12 backport PR. (#109807) A post main merge edit to the text was added in the 3.12 backport PR. https://github.com/python/cpython/pull/109773/commits/e38d7104b8f245e5db6d487932c44edf0d2c4762 This includes that in main. It's a minor edit over #109767 to resolve the comment there. --- Doc/whatsnew/3.12.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 2a186e8c8484ec..700daea75f12db 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -1071,7 +1071,9 @@ Deprecated with the POSIX platform when doing so. Even if such code *appeared* to work. We added the warning to to raise awareness as issues encounted by code doing this are becoming more frequent. See the :func:`os.fork` documentation for - more details. + more details along with `this discussion on fork being incompatible with threads + `_ for *why* we're now surfacing this + longstanding platform compatibility problem to developers. When this warning appears due to usage of :mod:`multiprocessing` or :mod:`concurrent.futures` the fix is to use a different From 09a73d50f687b9b388b0386f400d9ba5a7c5f2a5 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Mon, 25 Sep 2023 07:22:00 +0100 Subject: [PATCH 324/357] GH-109190: Copyedit 3.12 What's New: Increase the prominence of the setuptools removal (#109768) --- Doc/whatsnew/3.12.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 700daea75f12db..33ddd539b3b1f7 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -93,6 +93,13 @@ Important deprecations, removals or restrictions: `the migration guide `_ for advice on its replacement. +* :gh:`95299`: Do not pre-install ``setuptools`` in virtual environments + created with :mod:`venv`. + This means that ``distutils``, ``setuptools``, ``pkg_resources``, + and ``easy_install`` will no longer available by default; to access these + run ``pip install setuptools`` in the :ref:`activated ` + virtual environment. + Improved Error Messages ======================= From 7b8bfe1644c3d008c1b5c19a537ee7d19bc32c59 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Mon, 25 Sep 2023 07:24:02 +0100 Subject: [PATCH 325/357] GH-109190: Copyedit 3.12 What's New: Update the ``imp`` porting guidance (#109755) --- Doc/whatsnew/3.12.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 33ddd539b3b1f7..09d74fbc5c2845 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -1411,7 +1411,7 @@ imp * The :mod:`!imp` module has been removed. (Contributed by Barry Warsaw in :gh:`98040`.) -* Replace removed :mod:`!imp` functions with :mod:`importlib` functions: + To migrate, consult the following correspondence table: ================================= ======================================= imp importlib @@ -1426,9 +1426,10 @@ imp ``imp.new_module(name)`` ``types.ModuleType(name)`` ``imp.reload()`` :func:`importlib.reload` ``imp.source_from_cache()`` :func:`importlib.util.source_from_cache` + ``imp.load_source()`` *See below* ================================= ======================================= -* Replace ``imp.load_source()`` with:: + Replace ``imp.load_source()`` with:: import importlib.util import importlib.machinery From f2eaa92b0cc5a37a9e6010c7c6f5ad1a230ea49b Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Mon, 25 Sep 2023 09:31:56 +0300 Subject: [PATCH 326/357] gh-101100: Fix sphinx warnings in `Doc/library/__future__.rst` (#109814) --- Doc/library/__future__.rst | 58 +++++++++++++++++++++----------------- Doc/tools/.nitignore | 1 - 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/Doc/library/__future__.rst b/Doc/library/__future__.rst index 8bd23daee73977..d261e4a4f338a5 100644 --- a/Doc/library/__future__.rst +++ b/Doc/library/__future__.rst @@ -22,42 +22,48 @@ can be inspected programmatically via importing :mod:`__future__` and examining its contents. -Each statement in :file:`__future__.py` is of the form:: +.. _future-classes: - FeatureName = _Feature(OptionalRelease, MandatoryRelease, - CompilerFlag) +.. class:: _Feature + Each statement in :file:`__future__.py` is of the form:: -where, normally, *OptionalRelease* is less than *MandatoryRelease*, and both are -5-tuples of the same form as :data:`sys.version_info`:: + FeatureName = _Feature(OptionalRelease, MandatoryRelease, + CompilerFlag) - (PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int - PY_MINOR_VERSION, # the 1; an int - PY_MICRO_VERSION, # the 0; an int - PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string - PY_RELEASE_SERIAL # the 3; an int - ) + where, normally, *OptionalRelease* is less than *MandatoryRelease*, and both are + 5-tuples of the same form as :data:`sys.version_info`:: -*OptionalRelease* records the first release in which the feature was accepted. + (PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int + PY_MINOR_VERSION, # the 1; an int + PY_MICRO_VERSION, # the 0; an int + PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string + PY_RELEASE_SERIAL # the 3; an int + ) -In the case of a *MandatoryRelease* that has not yet occurred, -*MandatoryRelease* predicts the release in which the feature will become part of -the language. +.. method:: _Feature.getOptionalRelease() -Else *MandatoryRelease* records when the feature became part of the language; in -releases at or after that, modules no longer need a future statement to use the -feature in question, but may continue to use such imports. + *OptionalRelease* records the first release in which the feature was accepted. -*MandatoryRelease* may also be ``None``, meaning that a planned feature got -dropped. +.. method:: _Feature.getMandatoryRelease() -Instances of class :class:`_Feature` have two corresponding methods, -:meth:`getOptionalRelease` and :meth:`getMandatoryRelease`. + In the case of a *MandatoryRelease* that has not yet occurred, + *MandatoryRelease* predicts the release in which the feature will become part of + the language. -*CompilerFlag* is the (bitfield) flag that should be passed in the fourth -argument to the built-in function :func:`compile` to enable the feature in -dynamically compiled code. This flag is stored in the :attr:`compiler_flag` -attribute on :class:`_Feature` instances. + Else *MandatoryRelease* records when the feature became part of the language; in + releases at or after that, modules no longer need a future statement to use the + feature in question, but may continue to use such imports. + + *MandatoryRelease* may also be ``None``, meaning that a planned feature got + dropped or that it is not yet decided. + +.. attribute:: _Feature.compiler_flag + + *CompilerFlag* is the (bitfield) flag that should be passed in the fourth + argument to the built-in function :func:`compile` to enable the feature in + dynamically compiled code. This flag is stored in the :attr:`_Feature.compiler_flag` + attribute on :class:`_Feature` instances. No feature description will ever be deleted from :mod:`__future__`. Since its introduction in Python 2.1 the following features have found their way into the diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 487652f4b51d4b..4188edc18f9036 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -28,7 +28,6 @@ Doc/howto/enum.rst Doc/howto/isolating-extensions.rst Doc/howto/logging.rst Doc/howto/urllib2.rst -Doc/library/__future__.rst Doc/library/abc.rst Doc/library/ast.rst Doc/library/asyncio-dev.rst From 8c521f090eb58cd9e141fa3b13babe59a1c19519 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 25 Sep 2023 13:24:19 +0200 Subject: [PATCH 327/357] gh-104469: Convert _testcapi/vectorcall_limited.c to use AC (#109691) Co-authored-by: nahyeon <55136494+nahyeon-an@users.noreply.github.com> --- .../_testcapi/clinic/vectorcall_limited.c.h | 20 ++++++++++++ Modules/_testcapi/vectorcall_limited.c | 32 ++++++++++++++++--- 2 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 Modules/_testcapi/clinic/vectorcall_limited.c.h diff --git a/Modules/_testcapi/clinic/vectorcall_limited.c.h b/Modules/_testcapi/clinic/vectorcall_limited.c.h new file mode 100644 index 00000000000000..a233aefec79ecd --- /dev/null +++ b/Modules/_testcapi/clinic/vectorcall_limited.c.h @@ -0,0 +1,20 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(_testcapi_call_vectorcall__doc__, +"call_vectorcall($module, callable, /)\n" +"--\n" +"\n"); + +#define _TESTCAPI_CALL_VECTORCALL_METHODDEF \ + {"call_vectorcall", (PyCFunction)_testcapi_call_vectorcall, METH_O, _testcapi_call_vectorcall__doc__}, + +PyDoc_STRVAR(_testcapi_call_vectorcall_method__doc__, +"call_vectorcall_method($module, callable, /)\n" +"--\n" +"\n"); + +#define _TESTCAPI_CALL_VECTORCALL_METHOD_METHODDEF \ + {"call_vectorcall_method", (PyCFunction)_testcapi_call_vectorcall_method, METH_O, _testcapi_call_vectorcall_method__doc__}, +/*[clinic end generated code: output=e980906a39602528 input=a9049054013a1b77]*/ diff --git a/Modules/_testcapi/vectorcall_limited.c b/Modules/_testcapi/vectorcall_limited.c index e981c8625c2fb2..3e81903098f954 100644 --- a/Modules/_testcapi/vectorcall_limited.c +++ b/Modules/_testcapi/vectorcall_limited.c @@ -1,7 +1,13 @@ +/* Test Vectorcall in the limited API */ + #define Py_LIMITED_API 0x030c0000 // 3.12 #include "parts.h" +#include "clinic/vectorcall_limited.c.h" -/* Test Vectorcall in the limited API */ +/*[clinic input] +module _testcapi +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=6361033e795369fc]*/ static PyObject * LimitedVectorCallClass_tpcall(PyObject *self, PyObject *args, PyObject *kwargs) { @@ -28,8 +34,16 @@ LimitedVectorCallClass_new(PyTypeObject *tp, PyTypeObject *a, PyTypeObject *kw) return self; } +/*[clinic input] +_testcapi.call_vectorcall + + callable: object + / +[clinic start generated code]*/ + static PyObject * -call_vectorcall(PyObject* self, PyObject *callable) +_testcapi_call_vectorcall(PyObject *module, PyObject *callable) +/*[clinic end generated code: output=bae81eec97fcaad7 input=55d88f92240957ee]*/ { PyObject *args[3] = { NULL, NULL, NULL }; PyObject *kwname = NULL, *kwnames = NULL, *result = NULL; @@ -73,8 +87,16 @@ call_vectorcall(PyObject* self, PyObject *callable) return result; } +/*[clinic input] +_testcapi.call_vectorcall_method + + callable: object + / +[clinic start generated code]*/ + static PyObject * -call_vectorcall_method(PyObject* self, PyObject *callable) +_testcapi_call_vectorcall_method(PyObject *module, PyObject *callable) +/*[clinic end generated code: output=e661f48dda08b6fb input=5ba81c27511395b6]*/ { PyObject *args[3] = { NULL, NULL, NULL }; PyObject *name = NULL, *kwname = NULL, @@ -149,8 +171,8 @@ static PyType_Spec LimitedVectorCallClass_spec = { }; static PyMethodDef TestMethods[] = { - {"call_vectorcall", call_vectorcall, METH_O}, - {"call_vectorcall_method", call_vectorcall_method, METH_O}, + _TESTCAPI_CALL_VECTORCALL_METHODDEF + _TESTCAPI_CALL_VECTORCALL_METHOD_METHODDEF {NULL}, }; From 7495a93e0f843c40ebc5925c6a35225d41e52654 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Mon, 25 Sep 2023 13:11:06 +0100 Subject: [PATCH 328/357] GH-109190: Copyedit 3.12 What's New: Prefer GitHub issues links (#109753) --- Doc/whatsnew/3.12.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 09d74fbc5c2845..e452fae6581f57 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -659,7 +659,7 @@ inspect * Add :func:`inspect.getasyncgenstate` and :func:`inspect.getasyncgenlocals` for determining the current state of asynchronous generators. - (Contributed by Thomas Krennwallner in :issue:`35759`.) + (Contributed by Thomas Krennwallner in :gh:`79940`.) * The performance of :func:`inspect.getattr_static` has been considerably improved. Most calls to the function should be at least 2x faster than they @@ -732,7 +732,7 @@ pathlib * Add *walk_up* optional parameter to :meth:`pathlib.PurePath.relative_to` to allow the insertion of ``..`` entries in the result; this behavior is more consistent with :func:`os.path.relpath`. - (Contributed by Domenico Ragusa in :issue:`40358`.) + (Contributed by Domenico Ragusa in :gh:`84538`.) * Add :meth:`pathlib.Path.is_junction` as a proxy to :func:`os.path.isjunction`. (Contributed by Charles Machalow in :gh:`99547`.) @@ -968,7 +968,7 @@ Added ``--durations`` command line option, showing the N slowest test cases:: OK (skipped=3) -(Contributed by Giampaolo Rodola in :issue:`4080`) +(Contributed by Giampaolo Rodola in :gh:`48330`) uuid ---- @@ -1564,7 +1564,7 @@ unittest * An alias of the :class:`~unittest.TextTestResult` class: ``_TextTestResult`` (deprecated in Python 3.2). - (Contributed by Serhiy Storchaka in :issue:`45162`.) + (Contributed by Serhiy Storchaka in :gh:`89325`.) webbrowser ---------- From f08772cfd8f6602077e0989c1daa8bf74a8c15f1 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Mon, 25 Sep 2023 13:11:37 +0100 Subject: [PATCH 329/357] GH-109190: Copyedit 3.12 What's New: Trivia (#109760) --- Doc/whatsnew/3.12.rst | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index e452fae6581f57..60800cb06ae672 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -3,7 +3,7 @@ What's New In Python 3.12 **************************** -:Editor: TBD +:Editor: Adam Turner .. Rules for maintenance: @@ -46,15 +46,12 @@ researching a change. This article explains the new features in Python 3.12, compared to 3.11. - +Python 3.12 will be released on October 2, 2023. For full details, see the :ref:`changelog `. -.. note:: - - Prerelease users should be aware that this document is currently in draft - form. It will be updated substantially as Python 3.12 moves towards release, - so it's worth checking back even after reading earlier versions. +.. seealso:: + :pep:`693` -- Python 3.12 Release Schedule Summary -- Release highlights ============================= From 4e478534d73e46aea5d10fb4e0ddf2c34440d0f6 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Mon, 25 Sep 2023 13:18:22 +0100 Subject: [PATCH 330/357] GH-109190: Copyedit 3.12 What's New: Use the present tense (#109754) --- Doc/whatsnew/3.12.rst | 60 +++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 60800cb06ae672..9397627ecc866b 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -570,7 +570,7 @@ asyncio writing to sockets and uses :meth:`~socket.socket.sendmsg` if the platform supports it. (Contributed by Kumar Aditya in :gh:`91166`.) -* Added :func:`asyncio.eager_task_factory` and :func:`asyncio.create_eager_task_factory` +* Add :func:`asyncio.eager_task_factory` and :func:`asyncio.create_eager_task_factory` functions to allow opting an event loop in to eager task execution, making some use-cases 2x to 5x faster. (Contributed by Jacob Bower & Itamar Oren in :gh:`102853`, :gh:`104140`, and :gh:`104138`) @@ -666,17 +666,17 @@ inspect itertools --------- -* Added :class:`itertools.batched()` for collecting into even-sized +* Add :class:`itertools.batched()` for collecting into even-sized tuples where the last batch may be shorter than the rest. (Contributed by Raymond Hettinger in :gh:`98363`.) math ---- -* Added :func:`math.sumprod` for computing a sum of products. +* Add :func:`math.sumprod` for computing a sum of products. (Contributed by Raymond Hettinger in :gh:`100485`.) -* Extended :func:`math.nextafter` to include a *steps* argument +* Extend :func:`math.nextafter` to include a *steps* argument for moving up or down multiple steps at a time. (By Matthias Goergens, Mark Dickinson, and Raymond Hettinger in :gh:`94906`.) @@ -749,10 +749,10 @@ pdb random ------ -* Added :func:`random.binomialvariate`. +* Add :func:`random.binomialvariate`. (Contributed by Raymond Hettinger in :gh:`81620`.) -* Added a default of ``lamb=1.0`` to :func:`random.expovariate`. +* Add a default of ``lamb=1.0`` to :func:`random.expovariate`. (Contributed by Raymond Hettinger in :gh:`100234`.) shutil @@ -811,7 +811,7 @@ sqlite3 statistics ---------- -* Extended :func:`statistics.correlation` to include as a ``ranked`` method +* Extend :func:`statistics.correlation` to include as a ``ranked`` method for computing the Spearman correlation of ranked data. (Contributed by Raymond Hettinger in :gh:`95861`.) @@ -949,7 +949,7 @@ unicodedata unittest -------- -Added ``--durations`` command line option, showing the N slowest test cases:: +Add a ``--durations`` command line option, showing the N slowest test cases:: python3 -m unittest --durations=3 lib.tests.test_threading ..... @@ -977,11 +977,11 @@ uuid Optimizations ============= -* Removed ``wstr`` and ``wstr_length`` members from Unicode objects. +* Remove ``wstr`` and ``wstr_length`` members from Unicode objects. It reduces object size by 8 or 16 bytes on 64bit platform. (:pep:`623`) (Contributed by Inada Naoki in :gh:`92536`.) -* Added experimental support for using the BOLT binary optimizer in the build +* Add experimental support for using the BOLT binary optimizer in the build process, which improves performance by 1-5%. (Contributed by Kevin Modzelewski in :gh:`90536` and tuned by Donghee Na in :gh:`101525`) @@ -1014,7 +1014,7 @@ CPython bytecode changes * Remove the :opcode:`!JUMP_IF_FALSE_OR_POP` and :opcode:`!JUMP_IF_TRUE_OR_POP` instructions. (Contributed by Irit Katriel in :gh:`102859`.) -* Removed the :opcode:`!PRECALL` instruction. (Contributed by Mark Shannon in +* Remove the :opcode:`!PRECALL` instruction. (Contributed by Mark Shannon in :gh:`92925`.) * Add the :opcode:`LOAD_FAST_AND_CLEAR` instruction as part of the @@ -1441,9 +1441,9 @@ imp loader.exec_module(module) return module -* Removed :mod:`!imp` functions and attributes with no replacements: +* Remove :mod:`!imp` functions and attributes with no replacements: - * undocumented functions: + * Undocumented functions: * ``imp.init_builtin()`` * ``imp.load_compiled()`` @@ -1524,7 +1524,7 @@ ssl unittest -------- -* Removed many old deprecated :mod:`unittest` features: +* Remove many long-deprecated :mod:`unittest` features: * A number of :class:`~unittest.TestCase` method aliases: @@ -1567,7 +1567,7 @@ webbrowser ---------- * Remove support for obsolete browsers from :mod:`webbrowser`. - Removed browsers include: Grail, Mosaic, Netscape, Galeon, Skipstone, + The removed browsers include: Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird, and Firefox versions 35 and below (:gh:`102871`). xml.etree.ElementTree @@ -1590,8 +1590,8 @@ zipimport Others ------ -* Removed the ``suspicious`` rule from the documentation :file:`Makefile`, and - removed ``Doc/tools/rstlint.py``, both in favor of `sphinx-lint +* Remove the ``suspicious`` rule from the documentation :file:`Makefile` and + :file:`Doc/tools/rstlint.py`, both in favor of `sphinx-lint `_. (Contributed by Julien Palard in :gh:`98179`.) @@ -1621,7 +1621,7 @@ Changes in the Python API contain ASCII letters and digits and underscore. (Contributed by Serhiy Storchaka in :gh:`91760`.) -* Removed ``randrange()`` functionality deprecated since Python 3.10. Formerly, +* Remove ``randrange()`` functionality deprecated since Python 3.10. Formerly, ``randrange(10.0)`` losslessly converted to ``randrange(10)``. Now, it raises a :exc:`TypeError`. Also, the exception raised for non-integer values such as ``randrange(10.5)`` or ``randrange('10')`` has been changed from :exc:`ValueError` to @@ -1635,7 +1635,7 @@ Changes in the Python API to :term:`filesystem encoding and error handler`. Argument files should be encoded in UTF-8 instead of ANSI Codepage on Windows. -* Removed the ``asyncore``-based ``smtpd`` module deprecated in Python 3.4.7 +* Remove the ``asyncore``-based ``smtpd`` module deprecated in Python 3.4.7 and 3.5.4. A recommended replacement is the :mod:`asyncio`-based aiosmtpd_ PyPI module. @@ -1760,7 +1760,7 @@ New Features ------------ -* :pep:`697`: Introduced the :ref:`Unstable C API tier `, +* :pep:`697`: Introduce the :ref:`Unstable C API tier `, intended for low-level tools like debuggers and JIT compilers. This API may change in each minor release of CPython without deprecation warnings. @@ -1782,7 +1782,7 @@ New Features (Contributed by Petr Viktorin in :gh:`101101`.) -* :pep:`697`: Added API for extending types whose instance memory layout is +* :pep:`697`: Add an API for extending types whose instance memory layout is opaque: - :c:member:`PyType_Spec.basicsize` can be zero or negative to specify @@ -1797,7 +1797,7 @@ New Features (Contributed by Petr Viktorin in :gh:`103509`.) -* Added the new :ref:`limited C API ` function :c:func:`PyType_FromMetaclass`, +* Add the new :ref:`limited C API ` function :c:func:`PyType_FromMetaclass`, which generalizes the existing :c:func:`PyType_FromModuleAndSpec` using an additional metaclass argument. (Contributed by Wenzel Jakob in :gh:`93012`.) @@ -1836,13 +1836,13 @@ New Features protocol are now available in the :ref:`Limited API `. (Contributed by Wenzel Jakob in :gh:`98586`.) -* Added two new public functions, +* Add two new public functions, :c:func:`PyEval_SetProfileAllThreads` and :c:func:`PyEval_SetTraceAllThreads`, that allow to set tracing and profiling functions in all running threads in addition to the calling one. (Contributed by Pablo Galindo in :gh:`93503`.) -* Added new function :c:func:`PyFunction_SetVectorcall` to the C API +* Add new function :c:func:`PyFunction_SetVectorcall` to the C API which sets the vectorcall field of a given :c:type:`PyFunctionObject`. (Contributed by Andrew Frost in :gh:`92257`.) @@ -1852,11 +1852,11 @@ New Features compilers, or debuggers. (Contributed by Carl Meyer in :gh:`91052`.) -* Added :c:func:`PyType_AddWatcher` and :c:func:`PyType_Watch` API to register +* Add :c:func:`PyType_AddWatcher` and :c:func:`PyType_Watch` API to register callbacks to receive notification on changes to a type. (Contributed by Carl Meyer in :gh:`91051`.) -* Added :c:func:`PyCode_AddWatcher` and :c:func:`PyCode_ClearWatcher` +* Add :c:func:`PyCode_AddWatcher` and :c:func:`PyCode_ClearWatcher` APIs to register callbacks to receive notification on creation and destruction of code objects. (Contributed by Itamar Oren in :gh:`91054`.) @@ -1886,8 +1886,8 @@ New Features to replace the legacy-api :c:func:`!PyErr_Display`. (Contributed by Irit Katriel in :gh:`102755`). -* :pep:`683`: Introduced Immortal Objects to Python which allows objects - to bypass reference counts and introduced changes to the C-API: +* :pep:`683`: Introduce *Immortal Objects*, which allows objects + to bypass reference counts, and related changes to the C-API: - ``_Py_IMMORTAL_REFCNT``: The reference count that defines an object as immortal. @@ -1904,7 +1904,7 @@ New Features (Contributed by Eddie Elizondo in :gh:`84436`.) -* :pep:`684`: Added the new :c:func:`Py_NewInterpreterFromConfig` +* :pep:`684`: Add the new :c:func:`Py_NewInterpreterFromConfig` function and :c:type:`PyInterpreterConfig`, which may be used to create sub-interpreters with their own GILs. (See :ref:`whatsnew312-pep684` for more info.) @@ -1953,7 +1953,7 @@ Porting to Python 3.12 copied as-is to the result string, and any extra arguments discarded. (Contributed by Serhiy Storchaka in :gh:`95781`.) -* Fixed wrong sign placement in :c:func:`PyUnicode_FromFormat` and +* Fix wrong sign placement in :c:func:`PyUnicode_FromFormat` and :c:func:`PyUnicode_FromFormatV`. (Contributed by Philip Georgi in :gh:`95504`.) From 2302fa17cf3075bc8881ea3249ef4e4351fb0f99 Mon Sep 17 00:00:00 2001 From: DongWoo Son <99868561+dnd-qodqks@users.noreply.github.com> Date: Mon, 25 Sep 2023 21:37:40 +0900 Subject: [PATCH 331/357] no-issue: Capitalise 'PhotoImage' (gh-108958) --- Lib/turtle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/turtle.py b/Lib/turtle.py index 6119b7a447e7bf..7bfe81351b0b34 100644 --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -874,7 +874,7 @@ def __init__(self, type_, data=None): if isinstance(data, str): if data.lower().endswith(".gif") and isfile(data): data = TurtleScreen._image(data) - # else data assumed to be Photoimage + # else data assumed to be PhotoImage elif type_ == "compound": data = [] else: From bccc1b78002c924e8f4121fea5de7df5eb127548 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Mon, 25 Sep 2023 13:38:07 +0100 Subject: [PATCH 332/357] GH-109190: Copyedit 3.12 What's New: Improve the C-API deprecations section (#109751) Co-authored-by: Serhiy Storchaka --- Doc/whatsnew/3.12.rst | 109 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 96 insertions(+), 13 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 9397627ecc866b..527b312d05d91d 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -1126,11 +1126,6 @@ Deprecated :exc:`ImportWarning`). (Contributed by Brett Cannon in :gh:`65961`.) -* In accordance with :pep:`699`, the ``ma_version_tag`` field in :c:type:`PyDictObject` - is deprecated for extension modules. Accessing this field will generate a compiler - warning at compile time. This field will be removed in Python 3.14. - (Contributed by Ramvikrams and Kumar Aditya in :gh:`101193`. PEP by Ken Jin.) - * The bitwise inversion operator (``~``) on bool is deprecated. It will throw an error in Python 3.14. Use ``not`` for logical negation of bools instead. In the rare case that you really need the bitwise inversion of the underlying @@ -1261,9 +1256,6 @@ Pending Removal in Python 3.14 * :mod:`xml.etree.ElementTree`: Testing the truth value of an :class:`xml.etree.ElementTree.Element` is deprecated and will raise an exception in Python 3.14. -* Creating immutable types (:c:macro:`Py_TPFLAGS_IMMUTABLETYPE`) with mutable - bases using the C API (:gh:`95388`). - * ``__package__`` and ``__cached__`` will cease to be set or taken into consideration by the import system (:gh:`97879`). @@ -1273,9 +1265,6 @@ Pending Removal in Python 3.14 May be removed in 3.14. (Contributed by Nikita Sobolev in :gh:`101866`.) -* Creating :c:data:`immutable types ` with mutable - bases using the C API (:gh:`95388`) - Pending Removal in Future Versions ---------------------------------- @@ -2058,6 +2047,11 @@ Porting to Python 3.12 Deprecated ---------- +* In accordance with :pep:`699`, the ``ma_version_tag`` field in :c:type:`PyDictObject` + is deprecated for extension modules. Accessing this field will generate a compiler + warning at compile time. This field will be removed in Python 3.14. + (Contributed by Ramvikrams and Kumar Aditya in :gh:`101193`. PEP by Ken Jin.) + * Deprecate global configuration variable: * :c:var:`Py_DebugFlag`: use :c:member:`PyConfig.parser_debug` @@ -2087,8 +2081,8 @@ Deprecated :c:type:`PyConfig` instead. (Contributed by Victor Stinner in :gh:`77782`.) -* Creating immutable types (:c:macro:`Py_TPFLAGS_IMMUTABLETYPE`) with mutable - bases is deprecated and will be disabled in Python 3.14. +* Creating :c:data:`immutable types ` with mutable + bases is deprecated and will be disabled in Python 3.14. (:gh:`95388`) * The :file:`structmember.h` header is deprecated, though it continues to be available and there are no plans to remove it. @@ -2137,6 +2131,95 @@ Deprecated overrides :c:member:`~PyTypeObject.tp_new` is deprecated. Call the metaclass instead. +Pending Removal in Python 3.14 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* The ``ma_version_tag`` field in :c:type:`PyDictObject` for extension modules + (:pep:`699`; :gh:`101193`). + +* Global configuration variables: + + * :c:var:`Py_DebugFlag`: use :c:member:`PyConfig.parser_debug` + * :c:var:`Py_VerboseFlag`: use :c:member:`PyConfig.verbose` + * :c:var:`Py_QuietFlag`: use :c:member:`PyConfig.quiet` + * :c:var:`Py_InteractiveFlag`: use :c:member:`PyConfig.interactive` + * :c:var:`Py_InspectFlag`: use :c:member:`PyConfig.inspect` + * :c:var:`Py_OptimizeFlag`: use :c:member:`PyConfig.optimization_level` + * :c:var:`Py_NoSiteFlag`: use :c:member:`PyConfig.site_import` + * :c:var:`Py_BytesWarningFlag`: use :c:member:`PyConfig.bytes_warning` + * :c:var:`Py_FrozenFlag`: use :c:member:`PyConfig.pathconfig_warnings` + * :c:var:`Py_IgnoreEnvironmentFlag`: use :c:member:`PyConfig.use_environment` + * :c:var:`Py_DontWriteBytecodeFlag`: use :c:member:`PyConfig.write_bytecode` + * :c:var:`Py_NoUserSiteDirectory`: use :c:member:`PyConfig.user_site_directory` + * :c:var:`Py_UnbufferedStdioFlag`: use :c:member:`PyConfig.buffered_stdio` + * :c:var:`Py_HashRandomizationFlag`: use :c:member:`PyConfig.use_hash_seed` + and :c:member:`PyConfig.hash_seed` + * :c:var:`Py_IsolatedFlag`: use :c:member:`PyConfig.isolated` + * :c:var:`Py_LegacyWindowsFSEncodingFlag`: use :c:member:`PyPreConfig.legacy_windows_fs_encoding` + * :c:var:`Py_LegacyWindowsStdioFlag`: use :c:member:`PyConfig.legacy_windows_stdio` + * :c:var:`!Py_FileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding` + * :c:var:`!Py_HasFileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding` + * :c:var:`!Py_FileSystemDefaultEncodeErrors`: use :c:member:`PyConfig.filesystem_errors` + * :c:var:`!Py_UTF8Mode`: use :c:member:`PyPreConfig.utf8_mode` (see :c:func:`Py_PreInitialize`) + + The :c:func:`Py_InitializeFromConfig` API should be used with + :c:type:`PyConfig` instead. + +* Creating :c:data:`immutable types ` with mutable + bases (:gh:`95388`). + +Pending Removal in Python 3.15 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* :c:func:`PyImport_ImportModuleNoBlock`: use :c:func:`PyImport_ImportModule` +* :c:func:`PyWeakref_GET_OBJECT`: use :c:func:`PyWeakref_GetRef` +* :c:func:`PyWeakref_GetObject`: use :c:func:`PyWeakref_GetRef` +* :c:type:`!Py_UNICODE_WIDE` type: use :c:type:`wchar_t` +* :c:type:`Py_UNICODE` type: use :c:type:`wchar_t` +* Python initialization functions: + + * :c:func:`PySys_ResetWarnOptions`: clear :data:`sys.warnoptions` and + :data:`!warnings.filters` + * :c:func:`Py_GetExecPrefix`: get :data:`sys.exec_prefix` + * :c:func:`Py_GetPath`: get :data:`sys.path` + * :c:func:`Py_GetPrefix`: get :data:`sys.prefix` + * :c:func:`Py_GetProgramFullPath`: get :data:`sys.executable` + * :c:func:`Py_GetProgramName`: get :data:`sys.executable` + * :c:func:`Py_GetPythonHome`: get :c:member:`PyConfig.home` or + the :envvar:`PYTHONHOME` environment variable + +Pending Removal in Future Versions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following APIs are deprecated and will be removed, +although there is currently no date scheduled for their removal. + +* :c:macro:`Py_TPFLAGS_HAVE_FINALIZE`: unneeded since Python 3.8 +* :c:func:`PyErr_Fetch`: use :c:func:`PyErr_GetRaisedException` +* :c:func:`PyErr_NormalizeException`: use :c:func:`PyErr_GetRaisedException` +* :c:func:`PyErr_Restore`: use :c:func:`PyErr_SetRaisedException` +* :c:func:`PyModule_GetFilename`: use :c:func:`PyModule_GetFilenameObject` +* :c:func:`PyOS_AfterFork`: use :c:func:`PyOS_AfterFork_Child` +* :c:func:`PySlice_GetIndicesEx`: use :c:func:`PySlice_Unpack` and :c:func:`PySlice_AdjustIndices` +* :c:func:`!PyUnicode_AsDecodedObject`: use :c:func:`PyCodec_Decode` +* :c:func:`!PyUnicode_AsDecodedUnicode`: use :c:func:`PyCodec_Decode` +* :c:func:`!PyUnicode_AsEncodedObject`: use :c:func:`PyCodec_Encode` +* :c:func:`!PyUnicode_AsEncodedUnicode`: use :c:func:`PyCodec_Encode` +* :c:func:`PyUnicode_READY`: unneeded since Python 3.12 +* :c:func:`!PyErr_Display`: use :c:func:`PyErr_DisplayException` +* :c:func:`!_PyErr_ChainExceptions`: use ``_PyErr_ChainExceptions1`` +* :c:member:`!PyBytesObject.ob_shash` member: + call :c:func:`PyObject_Hash` instead +* :c:member:`!PyDictObject.ma_version_tag` member +* Thread Local Storage (TLS) API: + + * :c:func:`PyThread_create_key`: use :c:func:`PyThread_tss_alloc` + * :c:func:`PyThread_delete_key`: use :c:func:`PyThread_tss_free` + * :c:func:`PyThread_set_key_value`: use :c:func:`PyThread_tss_set` + * :c:func:`PyThread_get_key_value`: use :c:func:`PyThread_tss_get` + * :c:func:`PyThread_delete_key_value`: use :c:func:`PyThread_tss_delete` + * :c:func:`PyThread_ReInitTLS`: unneeded since Python 3.7 + Removed ------- From f29bc9c9a0a6794c6b8a9e84a7ba9237b427a10a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 25 Sep 2023 15:27:36 +0200 Subject: [PATCH 333/357] gh-109833: Fix asyncio test_wait_for() (#109834) Expect the test to be "short" but don't measure the exact performance of the CI. SHORT_TIMEOUT is about 30 seconds whereas the cancelled coroutine takes around 1 hour. --- Lib/test/test_asyncio/test_waitfor.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_asyncio/test_waitfor.py b/Lib/test/test_asyncio/test_waitfor.py index d5c02ba4a01df9..e714b154c5cadf 100644 --- a/Lib/test/test_asyncio/test_waitfor.py +++ b/Lib/test/test_asyncio/test_waitfor.py @@ -1,6 +1,7 @@ import asyncio import unittest import time +from test import support def tearDownModule(): @@ -130,7 +131,7 @@ async def foo(): nonlocal foo_running foo_running = True try: - await asyncio.sleep(10) + await asyncio.sleep(support.LONG_TIMEOUT) finally: foo_running = False return 'done' @@ -144,7 +145,7 @@ async def foo(): self.assertTrue(fut.done()) # it should have been cancelled due to the timeout self.assertTrue(fut.cancelled()) - self.assertLess(t1 - t0, 0.5) + self.assertLess(t1 - t0, support.SHORT_TIMEOUT) self.assertEqual(foo_running, False) async def test_wait_for_blocking(self): From faebed4a67073a9206c3535d2699d783451ea251 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 25 Sep 2023 15:50:15 +0200 Subject: [PATCH 334/357] gh-109276: Enhance libregrtest results (#109828) * Factorize code listing "bad / env changed / ..." tests. * Add TestResults.is_all_good() method. * Move "All 400 tests OK." to the end * Move "Test suite interrupted by signal SIGINT." to the end. --- Lib/test/libregrtest/results.py | 67 ++++++++++++++------------------- Lib/test/test_regrtest.py | 3 +- 2 files changed, 31 insertions(+), 39 deletions(-) diff --git a/Lib/test/libregrtest/results.py b/Lib/test/libregrtest/results.py index 6e7d65880f7347..fc4c547b34ac75 100644 --- a/Lib/test/libregrtest/results.py +++ b/Lib/test/libregrtest/results.py @@ -33,6 +33,11 @@ def __init__(self): # used by --junit-xml self.testsuite_xml: list[str] = [] + def is_all_good(self): + return (not self.bad + and not self.skipped + and not self.interrupted) + def get_executed(self): return (set(self.good) | set(self.bad) | set(self.skipped) | set(self.resource_denied) | set(self.env_changed) @@ -164,24 +169,12 @@ def write_junit(self, filename: StrPath): f.write(s) def display_result(self, tests: TestTuple, quiet: bool, print_slowest: bool): - if self.interrupted: - print("Test suite interrupted by signal SIGINT.") - omitted = set(tests) - self.get_executed() if omitted: print() print(count(len(omitted), "test"), "omitted:") printlist(omitted) - if self.good and not quiet: - print() - if (not self.bad - and not self.skipped - and not self.interrupted - and len(self.good) > 1): - print("All", end=' ') - print(count(len(self.good), "test"), "OK.") - if print_slowest: self.test_times.sort(reverse=True) print() @@ -189,36 +182,34 @@ def display_result(self, tests: TestTuple, quiet: bool, print_slowest: bool): for test_time, test in self.test_times[:10]: print("- %s: %s" % (test, format_duration(test_time))) - if self.bad: - print() - print(count(len(self.bad), "test"), "failed:") - printlist(self.bad) - - if self.env_changed: - print() - print("{} altered the execution environment:".format( - count(len(self.env_changed), "test"))) - printlist(self.env_changed) - - if self.skipped and not quiet: - print() - print(count(len(self.skipped), "test"), "skipped:") - printlist(self.skipped) - - if self.resource_denied and not quiet: - print() - print(count(len(self.resource_denied), "test"), "skipped (resource denied):") - printlist(self.resource_denied) + all_tests = [ + (self.bad, "test", "{} failed:"), + (self.env_changed, "test", "{} altered the execution environment (env changed):"), + ] + if not quiet: + all_tests.append((self.skipped, "test", "{} skipped:")) + all_tests.append((self.resource_denied, "test", "{} skipped (resource denied):")) + all_tests.append((self.rerun, "re-run test", "{}:")) + all_tests.append((self.run_no_tests, "test", "{} run no tests:")) + + for tests_list, count_text, title_format in all_tests: + if tests_list: + print() + count_text = count(len(tests_list), count_text) + print(title_format.format(count_text)) + printlist(tests_list) - if self.rerun: + if self.good and not quiet: print() - print("%s:" % count(len(self.rerun), "re-run test")) - printlist(self.rerun) + text = count(len(self.good), "test") + text = f"{text} OK." + if (self.is_all_good() and len(self.good) > 1): + text = f"All {text}" + print(text) - if self.run_no_tests: + if self.interrupted: print() - print(count(len(self.run_no_tests), "test"), "run no tests:") - printlist(self.run_no_tests) + print("Test suite interrupted by signal SIGINT.") def display_summary(self, first_runtests: RunTests, filtered: bool): # Total tests diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 408e667fffa0f0..4100c98839b55f 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -500,7 +500,8 @@ def list_regex(line_format, tests): self.check_line(output, regex) if env_changed: - regex = list_regex('%s test%s altered the execution environment', + regex = list_regex(r'%s test%s altered the execution environment ' + r'\(env changed\)', env_changed) self.check_line(output, regex) From 64ab9f7d5c7cbe5ef997c7d841151e0e71e7f582 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Mon, 25 Sep 2023 15:04:36 +0100 Subject: [PATCH 335/357] GH-109190: Copyedit 3.12 What's New: Synchronise C API deprecations with the 3.12 branch (#109844) --- Doc/whatsnew/3.12.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 527b312d05d91d..cf0a3f276fd021 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -2172,8 +2172,6 @@ Pending Removal in Python 3.15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * :c:func:`PyImport_ImportModuleNoBlock`: use :c:func:`PyImport_ImportModule` -* :c:func:`PyWeakref_GET_OBJECT`: use :c:func:`PyWeakref_GetRef` -* :c:func:`PyWeakref_GetObject`: use :c:func:`PyWeakref_GetRef` * :c:type:`!Py_UNICODE_WIDE` type: use :c:type:`wchar_t` * :c:type:`Py_UNICODE` type: use :c:type:`wchar_t` * Python initialization functions: From 72fb39c9656f72d942c2fe8720fb9a183e438a8a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 25 Sep 2023 16:21:01 +0200 Subject: [PATCH 336/357] gh-109276: regrtest re-runs "env changed" tests (#109831) When a test fails with "env changed" and --rerun option is used, the test is now re-run in verbose mode in a fresh process. --- Lib/test/libregrtest/results.py | 12 +++++++----- Lib/test/test_regrtest.py | 13 +++++++++++-- .../2023-09-25-14-41-18.gh-issue-109276.uC_cWo.rst | 3 +++ 3 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-25-14-41-18.gh-issue-109276.uC_cWo.rst diff --git a/Lib/test/libregrtest/results.py b/Lib/test/libregrtest/results.py index fc4c547b34ac75..1a8619fb62be2a 100644 --- a/Lib/test/libregrtest/results.py +++ b/Lib/test/libregrtest/results.py @@ -25,7 +25,7 @@ def __init__(self): self.env_changed: TestList = [] self.run_no_tests: TestList = [] self.rerun: TestList = [] - self.bad_results: list[TestResult] = [] + self.rerun_results: list[TestResult] = [] self.interrupted: bool = False self.test_times: list[tuple[float, TestName]] = [] @@ -87,6 +87,7 @@ def accumulate_result(self, result: TestResult, runtests: RunTests): self.good.append(test_name) case State.ENV_CHANGED: self.env_changed.append(test_name) + self.rerun_results.append(result) case State.SKIPPED: self.skipped.append(test_name) case State.RESOURCE_DENIED: @@ -98,7 +99,7 @@ def accumulate_result(self, result: TestResult, runtests: RunTests): case _: if result.is_failed(fail_env_changed): self.bad.append(test_name) - self.bad_results.append(result) + self.rerun_results.append(result) else: raise ValueError(f"invalid test state: {result.state!r}") @@ -114,12 +115,12 @@ def accumulate_result(self, result: TestResult, runtests: RunTests): self.add_junit(xml_data) def need_rerun(self): - return bool(self.bad_results) + return bool(self.rerun_results) def prepare_rerun(self) -> tuple[TestTuple, FilterDict]: tests: TestList = [] match_tests_dict = {} - for result in self.bad_results: + for result in self.rerun_results: tests.append(result.test_name) match_tests = result.get_rerun_match_tests() @@ -130,7 +131,8 @@ def prepare_rerun(self) -> tuple[TestTuple, FilterDict]: # Clear previously failed tests self.rerun_bad.extend(self.bad) self.bad.clear() - self.bad_results.clear() + self.env_changed.clear() + self.rerun_results.clear() return (tuple(tests), match_tests_dict) diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 4100c98839b55f..4b819cbbb8dfc3 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -463,7 +463,7 @@ def check_executed_tests(self, output, tests, *, stats, randomize = True rerun_failed = [] - if rerun is not None: + if rerun is not None and not env_changed: failed = [rerun.name] if not rerun.success: rerun_failed.append(rerun.name) @@ -591,7 +591,7 @@ def list_regex(line_format, tests): state = ', '.join(state) if rerun is not None: new_state = 'SUCCESS' if rerun.success else 'FAILURE' - state = 'FAILURE then ' + new_state + state = f'{state} then {new_state}' self.check_line(output, f'Result: {state}', full=True) def parse_random_seed(self, output): @@ -1229,6 +1229,15 @@ def test_env_changed(self): self.check_executed_tests(output, [testname], env_changed=testname, fail_env_changed=True, stats=1) + # rerun + output = self.run_tests("--rerun", testname) + self.check_executed_tests(output, [testname], + env_changed=testname, + rerun=Rerun(testname, + match=None, + success=True), + stats=2) + def test_rerun_fail(self): # FAILURE then FAILURE code = textwrap.dedent(""" diff --git a/Misc/NEWS.d/next/Tests/2023-09-25-14-41-18.gh-issue-109276.uC_cWo.rst b/Misc/NEWS.d/next/Tests/2023-09-25-14-41-18.gh-issue-109276.uC_cWo.rst new file mode 100644 index 00000000000000..66651cf6f4b966 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-25-14-41-18.gh-issue-109276.uC_cWo.rst @@ -0,0 +1,3 @@ +regrtest: When a test fails with "env changed" and the --rerun option is +used, the test is now re-run in verbose mode in a fresh process. Patch by +Victor Stinner. From 86e7c611ac5bf067a697afbee6f9162704fd22db Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Mon, 25 Sep 2023 15:42:03 +0100 Subject: [PATCH 337/357] GH-109190: Copyedit 3.12 What's New: Sort Other Language Changes (#109836) --- Doc/whatsnew/3.12.rst | 94 +++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index cf0a3f276fd021..76f1f00dbd34dd 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -465,45 +465,9 @@ and others in :gh:`103764`.) Other Language Changes ====================== -* Add :ref:`support for the perf profiler ` through the new - environment variable :envvar:`PYTHONPERFSUPPORT` - and command-line option :option:`-X perf <-X>`, - as well as the new :func:`sys.activate_stack_trampoline`, - :func:`sys.deactivate_stack_trampoline`, - and :func:`sys.is_stack_trampoline_active` functions. - (Design by Pablo Galindo. Contributed by Pablo Galindo and Christian Heimes - with contributions from Gregory P. Smith [Google] and Mark Shannon - in :gh:`96123`.) - -* The extraction methods in :mod:`tarfile`, and :func:`shutil.unpack_archive`, - have a new a *filter* argument that allows limiting tar features than may be - surprising or dangerous, such as creating files outside the destination - directory. - See :ref:`tarfile extraction filters ` for details. - In Python 3.14, the default will switch to ``'data'``. - (Contributed by Petr Viktorin in :pep:`706`.) - -* :class:`types.MappingProxyType` instances are now hashable if the underlying - mapping is hashable. - (Contributed by Serhiy Storchaka in :gh:`87995`.) - -* :class:`memoryview` now supports the half-float type (the "e" format code). - (Contributed by Donghee Na and Antoine Pitrou in :gh:`90751`.) - * The parser now raises :exc:`SyntaxError` when parsing source code containing null bytes. (Contributed by Pablo Galindo in :gh:`96670`.) -* :func:`ast.parse` now raises :exc:`SyntaxError` instead of :exc:`ValueError` - when parsing source code containing null bytes. (Contributed by Pablo Galindo - in :gh:`96670`.) - -* The Garbage Collector now runs only on the eval breaker mechanism of the - Python bytecode evaluation loop instead of object allocations. The GC can - also run when :c:func:`PyErr_CheckSignals` is called so C extensions that - need to run for a long time without executing any Python code also have a - chance to execute the GC periodically. (Contributed by Pablo Galindo in - :gh:`97922`.) - * A backslash-character pair that is not a valid escape sequence now generates a :exc:`SyntaxWarning`, instead of :exc:`DeprecationWarning`. For example, ``re.compile("\d+\.\d+")`` now emits a :exc:`SyntaxWarning` @@ -519,10 +483,6 @@ Other Language Changes In a future Python version they will be eventually a :exc:`SyntaxError`. (Contributed by Victor Stinner in :gh:`98401`.) -* All builtin and extension callables expecting boolean parameters now accept - arguments of any type instead of just :class:`bool` and :class:`int`. - (Contributed by Serhiy Storchaka in :gh:`60203`.) - * Variables used in the target part of comprehensions that are not stored to can now be used in assignment expressions (``:=``). For example, in ``[(b := 1) for a, b.prop in some_iter]``, the assignment to @@ -530,13 +490,6 @@ Other Language Changes part of comprehensions (like ``a``) is still disallowed, as per :pep:`572`. (Contributed by Nikita Sobolev in :gh:`100581`.) -* :class:`slice` objects are now hashable, allowing them to be used as dict keys and - set items. (Contributed by Will Bradshaw, Furkan Onder, and Raymond Hettinger in :gh:`101264`.) - -* :func:`sum` now uses Neumaier summation to improve accuracy and commutativity - when summing floats or mixed ints and floats. - (Contributed by Raymond Hettinger in :gh:`100425`.) - * Exceptions raised in a class or type's ``__set_name__`` method are no longer wrapped by a :exc:`RuntimeError`. Context information is added to the exception as a :pep:`678` note. (Contributed by Irit Katriel in :gh:`77757`.) @@ -546,6 +499,53 @@ Other Language Changes :exc:`ExceptionGroup`. Also changed in version 3.11.4. (Contributed by Irit Katriel in :gh:`103590`.) +* The Garbage Collector now runs only on the eval breaker mechanism of the + Python bytecode evaluation loop instead of object allocations. The GC can + also run when :c:func:`PyErr_CheckSignals` is called so C extensions that + need to run for a long time without executing any Python code also have a + chance to execute the GC periodically. (Contributed by Pablo Galindo in + :gh:`97922`.) + +* All builtin and extension callables expecting boolean parameters now accept + arguments of any type instead of just :class:`bool` and :class:`int`. + (Contributed by Serhiy Storchaka in :gh:`60203`.) + +* :class:`memoryview` now supports the half-float type (the "e" format code). + (Contributed by Donghee Na and Antoine Pitrou in :gh:`90751`.) + +* :class:`slice` objects are now hashable, allowing them to be used as dict keys and + set items. (Contributed by Will Bradshaw, Furkan Onder, and Raymond Hettinger in :gh:`101264`.) + +* :func:`sum` now uses Neumaier summation to improve accuracy and commutativity + when summing floats or mixed ints and floats. + (Contributed by Raymond Hettinger in :gh:`100425`.) + +* :func:`ast.parse` now raises :exc:`SyntaxError` instead of :exc:`ValueError` + when parsing source code containing null bytes. (Contributed by Pablo Galindo + in :gh:`96670`.) + +* The extraction methods in :mod:`tarfile`, and :func:`shutil.unpack_archive`, + have a new a *filter* argument that allows limiting tar features than may be + surprising or dangerous, such as creating files outside the destination + directory. + See :ref:`tarfile extraction filters ` for details. + In Python 3.14, the default will switch to ``'data'``. + (Contributed by Petr Viktorin in :pep:`706`.) + +* :class:`types.MappingProxyType` instances are now hashable if the underlying + mapping is hashable. + (Contributed by Serhiy Storchaka in :gh:`87995`.) + +* Add :ref:`support for the perf profiler ` through the new + environment variable :envvar:`PYTHONPERFSUPPORT` + and command-line option :option:`-X perf <-X>`, + as well as the new :func:`sys.activate_stack_trampoline`, + :func:`sys.deactivate_stack_trampoline`, + and :func:`sys.is_stack_trampoline_active` functions. + (Design by Pablo Galindo. Contributed by Pablo Galindo and Christian Heimes + with contributions from Gregory P. Smith [Google] and Mark Shannon + in :gh:`96123`.) + New Modules =========== From eeb90704375e4a69332c0d4d308d619922524a12 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 25 Sep 2023 16:43:54 +0200 Subject: [PATCH 338/357] gh-109723: Fix build of _testclinic_limited on WASM (#109842) Make sure that the Py_BUILD_CORE macro is not defined. --- Modules/_testclinic_limited.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Modules/_testclinic_limited.c b/Modules/_testclinic_limited.c index 0b606c9857fc40..4273383816a0dd 100644 --- a/Modules/_testclinic_limited.c +++ b/Modules/_testclinic_limited.c @@ -1,3 +1,9 @@ +// _testclinic_limited can built with the Py_BUILD_CORE_BUILTIN macro defined +// if one of the Modules/Setup files asks to build it as "static" (gh-109723). +#undef Py_BUILD_CORE +#undef Py_BUILD_CORE_MODULE +#undef Py_BUILD_CORE_BUILTIN + // For now, only limited C API 3.13 is supported #define Py_LIMITED_API 0x030d0000 From f19416534a546460fdf6a0739b70e44d1950a073 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 25 Sep 2023 09:17:34 -0600 Subject: [PATCH 339/357] Code: Update Donghee Na's name (#109744) --- Tools/unicode/genmap_japanese.py | 2 +- Tools/unicode/genmap_korean.py | 2 +- Tools/unicode/genmap_schinese.py | 2 +- Tools/unicode/genmap_support.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Tools/unicode/genmap_japanese.py b/Tools/unicode/genmap_japanese.py index 21de37b62bced0..838317fa54175e 100644 --- a/Tools/unicode/genmap_japanese.py +++ b/Tools/unicode/genmap_japanese.py @@ -2,7 +2,7 @@ # genmap_ja_codecs.py: Japanese Codecs Map Generator # # Original Author: Hye-Shik Chang -# Modified Author: Dong-hee Na +# Modified Author: Donghee Na # import os diff --git a/Tools/unicode/genmap_korean.py b/Tools/unicode/genmap_korean.py index 4b94a6c43e5382..4432a3601b7e3b 100644 --- a/Tools/unicode/genmap_korean.py +++ b/Tools/unicode/genmap_korean.py @@ -2,7 +2,7 @@ # genmap_korean.py: Korean Codecs Map Generator # # Original Author: Hye-Shik Chang -# Modified Author: Dong-hee Na +# Modified Author: Donghee Na # import os diff --git a/Tools/unicode/genmap_schinese.py b/Tools/unicode/genmap_schinese.py index 647c0333ed2728..862f1def71d122 100644 --- a/Tools/unicode/genmap_schinese.py +++ b/Tools/unicode/genmap_schinese.py @@ -2,7 +2,7 @@ # genmap_schinese.py: Simplified Chinese Codecs Map Generator # # Original Author: Hye-Shik Chang -# Modified Author: Dong-hee Na +# Modified Author: Donghee Na # import os import re diff --git a/Tools/unicode/genmap_support.py b/Tools/unicode/genmap_support.py index 5e1d9ee77b0002..4649bc3b7125fe 100644 --- a/Tools/unicode/genmap_support.py +++ b/Tools/unicode/genmap_support.py @@ -2,7 +2,7 @@ # genmap_support.py: Multibyte Codec Map Generator # # Original Author: Hye-Shik Chang -# Modified Author: Dong-hee Na +# Modified Author: Donghee Na # From 1b8f2366b38c87b0450d9c15bdfdd4c4a2fc3a01 Mon Sep 17 00:00:00 2001 From: Radislav Chugunov <52372310+chgnrdv@users.noreply.github.com> Date: Mon, 25 Sep 2023 18:38:06 +0300 Subject: [PATCH 340/357] gh-109795: `_thread.start_new_thread`: allocate thread bootstate using raw memory allocator (#109808) --- Modules/_threadmodule.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 9c915488f6e0de..fa98df516b8b10 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -1066,7 +1066,7 @@ thread_bootstate_free(struct bootstate *boot, int decref) Py_DECREF(boot->args); Py_XDECREF(boot->kwargs); } - PyMem_Free(boot); + PyMem_RawFree(boot); } @@ -1184,13 +1184,16 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) return NULL; } - struct bootstate *boot = PyMem_NEW(struct bootstate, 1); + // gh-109795: Use PyMem_RawMalloc() instead of PyMem_Malloc(), + // because it should be possible to call thread_bootstate_free() + // without holding the GIL. + struct bootstate *boot = PyMem_RawMalloc(sizeof(struct bootstate)); if (boot == NULL) { return PyErr_NoMemory(); } boot->tstate = _PyThreadState_New(interp); if (boot->tstate == NULL) { - PyMem_Free(boot); + PyMem_RawFree(boot); if (!PyErr_Occurred()) { return PyErr_NoMemory(); } From bc06743533b5fea2d5ecdad6dd3caa372c67439f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 25 Sep 2023 18:02:04 +0200 Subject: [PATCH 341/357] gh-89363: Skip threading test_is_alive_after_fork() if ASAN (#109835) Skip test_is_alive_after_fork() of test_threading if Python is built with Address Sanitizer (ASAN). --- Lib/test/_test_multiprocessing.py | 2 +- Lib/test/test_threading.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 730b887dd4bcac..756d6808518fc4 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -79,7 +79,7 @@ if support.check_sanitizer(address=True): - # bpo-45200: Skip multiprocessing tests if Python is built with ASAN to + # gh-89363: Skip multiprocessing tests if Python is built with ASAN to # work around a libasan race condition: dead lock in pthread_create(). raise unittest.SkipTest("libasan has a pthread_create() dead lock") diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 6465a446565844..9c16c4044f66a8 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -572,6 +572,10 @@ def background_thread(evt): self.assertEqual(err, b'') @support.requires_fork() + # gh-89363: Skip multiprocessing tests if Python is built with ASAN to + # work around a libasan race condition: dead lock in pthread_create(). + @support.skip_if_sanitizer("libasan has a pthread_create() dead lock", + address=True) def test_is_alive_after_fork(self): # Try hard to trigger #18418: is_alive() could sometimes be True on # threads that vanished after a fork. From 88a6137cdb81c80440d9d1ee7dee17ea0b820f11 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Mon, 25 Sep 2023 19:50:39 +0200 Subject: [PATCH 342/357] gh-109599: Add types.CapsuleType (#109600) --------- Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> --- Doc/library/types.rst | 6 ++++++ Lib/test/test_sys.py | 3 ++- Lib/test/test_types.py | 4 ++++ Lib/types.py | 8 ++++++++ .../2023-09-20-07-38-14.gh-issue-109599.IaSLJz.rst | 1 + 5 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-20-07-38-14.gh-issue-109599.IaSLJz.rst diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 875916be1049a3..54c3907dec98cc 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -472,6 +472,12 @@ Standard names are defined for the following types: .. versionadded:: 3.12 +.. class:: CapsuleType + + The type of :ref:`capsule objects `. + + .. versionadded:: 3.13 + Additional Utility Classes and Functions ---------------------------------------- diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index f4948ceec66226..c616a27364b494 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -1,5 +1,6 @@ import builtins import codecs +import _datetime import gc import locale import operator @@ -1581,7 +1582,7 @@ def delx(self): del self.__x x = property(getx, setx, delx, "") check(x, size('5Pi')) # PyCapsule - # XXX + check(_datetime.datetime_CAPI, size('6P')) # rangeiterator check(iter(range(1)), size('3l')) check(iter(range(2**65)), size('3P')) diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index c6bff79f903828..da32c4ea6477ce 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -4,6 +4,7 @@ import collections.abc from collections import namedtuple import copy +import _datetime import gc import inspect import pickle @@ -636,6 +637,9 @@ def test_traceback_and_frame_types(self): self.assertIsInstance(exc.__traceback__, types.TracebackType) self.assertIsInstance(exc.__traceback__.tb_frame, types.FrameType) + def test_capsule_type(self): + self.assertIsInstance(_datetime.datetime_CAPI, types.CapsuleType) + class UnionTests(unittest.TestCase): diff --git a/Lib/types.py b/Lib/types.py index b4aa19cec40c89..1484c22ee9dffa 100644 --- a/Lib/types.py +++ b/Lib/types.py @@ -1,6 +1,7 @@ """ Define names for built-in types that aren't directly accessible as a builtin. """ + import sys # Iterators in Python aren't a matter of type but of protocol. A large @@ -330,4 +331,11 @@ def wrapped(*args, **kwargs): NoneType = type(None) NotImplementedType = type(NotImplemented) +def __getattr__(name): + if name == 'CapsuleType': + import _socket + return type(_socket.CAPI) + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + __all__ = [n for n in globals() if n[:1] != '_'] +__all__ += ['CapsuleType'] diff --git a/Misc/NEWS.d/next/Library/2023-09-20-07-38-14.gh-issue-109599.IaSLJz.rst b/Misc/NEWS.d/next/Library/2023-09-20-07-38-14.gh-issue-109599.IaSLJz.rst new file mode 100644 index 00000000000000..8a15e765545f88 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-20-07-38-14.gh-issue-109599.IaSLJz.rst @@ -0,0 +1 @@ +Expose the type of PyCapsule objects as ``types.CapsuleType``. From d73c12b88c2275fd44e27c91c24f3ac85419d2b8 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Mon, 25 Sep 2023 19:25:05 +0100 Subject: [PATCH 343/357] gh-109823: Adjust labels in compiler when removing an empty basic block which is a jump target (#109839) --- Lib/test/test_compile.py | 5 +++++ .../2023-09-25-14-28-14.gh-issue-109823.kbVTKF.rst | 2 ++ Python/flowgraph.c | 9 ++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-09-25-14-28-14.gh-issue-109823.kbVTKF.rst diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index d3a5517963c540..53e3e8f75aa766 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -1272,6 +1272,11 @@ def f(): else: 1 if 1 else 1 + def test_remove_empty_basic_block_with_jump_target_label(self): + # See gh-109823 + def f(x): + while x: + 0 if 1 else 0 @requires_debug_ranges() class TestSourcePositions(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-25-14-28-14.gh-issue-109823.kbVTKF.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-25-14-28-14.gh-issue-109823.kbVTKF.rst new file mode 100644 index 00000000000000..793c89f4445f54 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-25-14-28-14.gh-issue-109823.kbVTKF.rst @@ -0,0 +1,2 @@ +Fix bug where compiler does not adjust labels when removing an empty basic +block which is a jump target. diff --git a/Python/flowgraph.c b/Python/flowgraph.c index adfcef33895a53..9c24264cfbb459 100644 --- a/Python/flowgraph.c +++ b/Python/flowgraph.c @@ -960,6 +960,7 @@ eliminate_empty_basic_blocks(cfg_builder *g) { while(g->g_entryblock && g->g_entryblock->b_iused == 0) { g->g_entryblock = g->g_entryblock->b_next; } + int next_lbl = get_max_label(g->g_entryblock) + 1; for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { assert(b->b_iused > 0); for (int i = 0; i < b->b_iused; i++) { @@ -969,7 +970,13 @@ eliminate_empty_basic_blocks(cfg_builder *g) { while (target->b_iused == 0) { target = target->b_next; } - instr->i_target = target; + if (instr->i_target != target) { + if (!IS_LABEL(target->b_label)) { + target->b_label.id = next_lbl++; + } + instr->i_target = target; + instr->i_oparg = target->b_label.id; + } assert(instr->i_target && instr->i_target->b_iused > 0); } } From 25bb266fc876b344e31e0b5634a4db94912c1aba Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 26 Sep 2023 01:16:30 +0200 Subject: [PATCH 344/357] gh-109748: Fix venv test_zippath_from_non_installed_posix() (#109872) Fix test_zippath_from_non_installed_posix() of test_venv: don't copy __pycache__/ sub-directories, because they can be modified by other Python tests running in parallel. --- Lib/test/test_venv.py | 10 +++++++++- .../2023-09-26-00-49-18.gh-issue-109748.nxlT1i.rst | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-26-00-49-18.gh-issue-109748.nxlT1i.rst diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index a894bb10bd04da..eb83aa39425515 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -559,6 +559,13 @@ def test_zippath_from_non_installed_posix(self): platlibdir, stdlib_zip) additional_pythonpath_for_non_installed = [] + + # gh-109748: Don't copy __pycache__/ sub-directories, because they can + # be modified by other Python tests running in parallel. + ignored_names = {'__pycache__'} + def ignore_pycache(src, names): + return ignored_names + # Copy stdlib files to the non-installed python so venv can # correctly calculate the prefix. for eachpath in sys.path: @@ -575,7 +582,8 @@ def test_zippath_from_non_installed_posix(self): if os.path.isfile(fn): shutil.copy(fn, libdir) elif os.path.isdir(fn): - shutil.copytree(fn, os.path.join(libdir, name)) + shutil.copytree(fn, os.path.join(libdir, name), + ignore=ignore_pycache) else: additional_pythonpath_for_non_installed.append( eachpath) diff --git a/Misc/NEWS.d/next/Tests/2023-09-26-00-49-18.gh-issue-109748.nxlT1i.rst b/Misc/NEWS.d/next/Tests/2023-09-26-00-49-18.gh-issue-109748.nxlT1i.rst new file mode 100644 index 00000000000000..840366ba8d1611 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-26-00-49-18.gh-issue-109748.nxlT1i.rst @@ -0,0 +1,3 @@ +Fix ``test_zippath_from_non_installed_posix()`` of test_venv: don't copy +``__pycache__/`` sub-directories, because they can be modified by other Python +tests running in parallel. Patch by Victor Stinner. From e9791ba35175171170ff09094ea46b91fc18c654 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Mon, 25 Sep 2023 19:46:58 -0400 Subject: [PATCH 345/357] gh-88233: zipfile: refactor _strip_extra (#102084) * Refactor zipfile._strip_extra to use higher level abstractions for extras instead of a heavy-state loop. * Add blurb * Remove _strip_extra and use _Extra.strip directly. * Use memoryview to avoid unnecessary copies while splitting Extras. --- Lib/test/test_zipfile/test_core.py | 46 +++++++------- Lib/zipfile/__init__.py | 60 ++++++++++++------- ...3-02-20-12-00-11.gh-issue-88233.o5Zb0t.rst | 2 + 3 files changed, 62 insertions(+), 46 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-02-20-12-00-11.gh-issue-88233.o5Zb0t.rst diff --git a/Lib/test/test_zipfile/test_core.py b/Lib/test/test_zipfile/test_core.py index 9960259c4cde0c..0f6c0f2107ce6b 100644 --- a/Lib/test/test_zipfile/test_core.py +++ b/Lib/test/test_zipfile/test_core.py @@ -3203,14 +3203,14 @@ def test_no_data(self): b = s.pack(2, 0) c = s.pack(3, 0) - self.assertEqual(b'', zipfile._strip_extra(a, (self.ZIP64_EXTRA,))) - self.assertEqual(b, zipfile._strip_extra(b, (self.ZIP64_EXTRA,))) + self.assertEqual(b'', zipfile._Extra.strip(a, (self.ZIP64_EXTRA,))) + self.assertEqual(b, zipfile._Extra.strip(b, (self.ZIP64_EXTRA,))) self.assertEqual( - b+b"z", zipfile._strip_extra(b+b"z", (self.ZIP64_EXTRA,))) + b+b"z", zipfile._Extra.strip(b+b"z", (self.ZIP64_EXTRA,))) - self.assertEqual(b+c, zipfile._strip_extra(a+b+c, (self.ZIP64_EXTRA,))) - self.assertEqual(b+c, zipfile._strip_extra(b+a+c, (self.ZIP64_EXTRA,))) - self.assertEqual(b+c, zipfile._strip_extra(b+c+a, (self.ZIP64_EXTRA,))) + self.assertEqual(b+c, zipfile._Extra.strip(a+b+c, (self.ZIP64_EXTRA,))) + self.assertEqual(b+c, zipfile._Extra.strip(b+a+c, (self.ZIP64_EXTRA,))) + self.assertEqual(b+c, zipfile._Extra.strip(b+c+a, (self.ZIP64_EXTRA,))) def test_with_data(self): s = struct.Struct(" Date: Tue, 26 Sep 2023 02:07:12 +0200 Subject: [PATCH 346/357] gh-109401: Fix threading barrier test_default_timeout() (#109875) Increase timeouts. Barrier default timeout should be long enough to spawn 4 threads on a slow CI. --- Lib/test/lock_tests.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py index a4f52cb20ad301..0890ec87afd1c6 100644 --- a/Lib/test/lock_tests.py +++ b/Lib/test/lock_tests.py @@ -1014,13 +1014,15 @@ def test_default_timeout(self): """ Test the barrier's default timeout """ - # create a barrier with a low default timeout - barrier = self.barriertype(self.N, timeout=0.3) + # gh-109401: Barrier timeout should be long enough + # to create 4 threads on a slow CI. + timeout = 1.0 + barrier = self.barriertype(self.N, timeout=timeout) def f(): i = barrier.wait() if i == self.N // 2: - # One thread is later than the default timeout of 0.3s. - time.sleep(1.0) + # One thread is later than the default timeout. + time.sleep(timeout * 2) self.assertRaises(threading.BrokenBarrierError, barrier.wait) self.run_threads(f) From 4091deba88946841044b0a54090492a2fd903d42 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 26 Sep 2023 03:05:07 +0200 Subject: [PATCH 347/357] gh-109739: regrtest disables load tracker if refleak (#109871) regrtest: Fix reference leak check on Windows. Disable the load tracker on Windows in the reference leak check mode (-R option). --- Lib/test/libregrtest/main.py | 16 +++++++++++++--- ...023-09-25-23-59-37.gh-issue-109739.MUn7K5.rst | 3 +++ 2 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-25-23-59-37.gh-issue-109739.MUn7K5.rst diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index a9dd08702deb59..0ec25a06b6e175 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -20,7 +20,8 @@ StrPath, StrJSON, TestName, TestList, TestTuple, FilterTuple, strip_py_suffix, count, format_duration, printlist, get_temp_dir, get_work_dir, exit_timeout, - display_header, cleanup_temp_dir) + display_header, cleanup_temp_dir, + MS_WINDOWS) class Regrtest: @@ -435,7 +436,15 @@ def _run_tests(self, selected: TestTuple, tests: TestList | None) -> int: setup_process() - self.logger.start_load_tracker() + if self.hunt_refleak and not self.num_workers: + # gh-109739: WindowsLoadTracker thread interfers with refleak check + use_load_tracker = False + else: + # WindowsLoadTracker is only needed on Windows + use_load_tracker = MS_WINDOWS + + if use_load_tracker: + self.logger.start_load_tracker() try: if self.num_workers: self._run_tests_mp(runtests, self.num_workers) @@ -448,7 +457,8 @@ def _run_tests(self, selected: TestTuple, tests: TestList | None) -> int: if self.want_rerun and self.results.need_rerun(): self.rerun_failed_tests(runtests) finally: - self.logger.stop_load_tracker() + if use_load_tracker: + self.logger.stop_load_tracker() self.display_summary() self.finalize_tests(tracer) diff --git a/Misc/NEWS.d/next/Tests/2023-09-25-23-59-37.gh-issue-109739.MUn7K5.rst b/Misc/NEWS.d/next/Tests/2023-09-25-23-59-37.gh-issue-109739.MUn7K5.rst new file mode 100644 index 00000000000000..291524c758ca68 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-25-23-59-37.gh-issue-109739.MUn7K5.rst @@ -0,0 +1,3 @@ +regrtest: Fix reference leak check on Windows. Disable the load tracker on +Windows in the reference leak check mode (-R option). Patch by Victor +Stinner. From 0b4e090422db5f959184353d53552d1675f74212 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 26 Sep 2023 10:06:07 +0300 Subject: [PATCH 348/357] gh-109370: Fix unexpected traceback output in test_concurrent_futures (GH-109780) Follow-up of gh-107219. * Only close the connection writer on Windows. * Also use existing constant _winapi.ERROR_OPERATION_ABORTED instead of WSA_OPERATION_ABORTED. --- Lib/concurrent/futures/process.py | 3 ++- Lib/multiprocessing/connection.py | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 48d8db3ed423a5..011e79a5e73d5a 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -521,7 +521,8 @@ def terminate_broken(self, cause): # gh-107219: Close the connection writer which can unblock # Queue._feed() if it was stuck in send_bytes(). - self.call_queue._writer.close() + if sys.platform == 'win32': + self.call_queue._writer.close() # clean up resources self.join_executor_internals() diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py index 7c425a2d8e7034..dbbf106f680964 100644 --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -42,7 +42,6 @@ BUFSIZE = 8192 # A very generous timeout when it comes to local connections... CONNECTION_TIMEOUT = 20. -WSA_OPERATION_ABORTED = 995 _mmap_counter = itertools.count() @@ -300,7 +299,7 @@ def _send_bytes(self, buf): finally: self._send_ov = None nwritten, err = ov.GetOverlappedResult(True) - if err == WSA_OPERATION_ABORTED: + if err == _winapi.ERROR_OPERATION_ABORTED: # close() was called by another thread while # WaitForMultipleObjects() was waiting for the overlapped # operation. From 7c61a361fc2e93375e22849fffbc20b60e94dbde Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Tue, 26 Sep 2023 10:46:09 +0300 Subject: [PATCH 349/357] gh-101100: Fix Sphinx warnings in `Doc/library/weakref.rst` (#109881) --- Doc/library/weakref.rst | 19 +++++++++---------- Doc/tools/.nitignore | 1 - 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index 1406b663c6a8e2..d6e062df945c64 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -111,7 +111,7 @@ See :ref:`__slots__ documentation ` for details. Exceptions raised by the callback will be noted on the standard error output, but cannot be propagated; they are handled in exactly the same way as exceptions - raised from an object's :meth:`__del__` method. + raised from an object's :meth:`~object.__del__` method. Weak references are :term:`hashable` if the *object* is hashable. They will maintain their hash value even after the *object* was deleted. If @@ -221,8 +221,7 @@ than needed. Added support for ``|`` and ``|=`` operators, as specified in :pep:`584`. :class:`WeakValueDictionary` objects have an additional method that has the -same issues as the :meth:`keyrefs` method of :class:`WeakKeyDictionary` -objects. +same issues as the :meth:`WeakKeyDictionary.keyrefs` method. .. method:: WeakValueDictionary.valuerefs() @@ -281,7 +280,7 @@ objects. Exceptions raised by finalizer callbacks during garbage collection will be shown on the standard error output, but cannot be propagated. They are handled in the same way as exceptions raised - from an object's :meth:`__del__` method or a weak reference's + from an object's :meth:`~object.__del__` method or a weak reference's callback. When the program exits, each remaining live finalizer is called @@ -523,18 +522,18 @@ is still alive. For instance obj dead or exiting -Comparing finalizers with :meth:`__del__` methods -------------------------------------------------- +Comparing finalizers with :meth:`~object.__del__` methods +--------------------------------------------------------- Suppose we want to create a class whose instances represent temporary directories. The directories should be deleted with their contents when the first of the following events occurs: * the object is garbage collected, -* the object's :meth:`remove` method is called, or +* the object's :meth:`!remove` method is called, or * the program exits. -We might try to implement the class using a :meth:`__del__` method as +We might try to implement the class using a :meth:`~object.__del__` method as follows:: class TempDir: @@ -553,12 +552,12 @@ follows:: def __del__(self): self.remove() -Starting with Python 3.4, :meth:`__del__` methods no longer prevent +Starting with Python 3.4, :meth:`~object.__del__` methods no longer prevent reference cycles from being garbage collected, and module globals are no longer forced to :const:`None` during :term:`interpreter shutdown`. So this code should work without any issues on CPython. -However, handling of :meth:`__del__` methods is notoriously implementation +However, handling of :meth:`~object.__del__` methods is notoriously implementation specific, since it depends on internal details of the interpreter's garbage collector implementation. diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 4188edc18f9036..f260a571661b76 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -133,7 +133,6 @@ Doc/library/unittest.mock.rst Doc/library/unittest.rst Doc/library/urllib.parse.rst Doc/library/urllib.request.rst -Doc/library/weakref.rst Doc/library/wsgiref.rst Doc/library/xml.dom.minidom.rst Doc/library/xml.dom.pulldom.rst From 8ac2085b80eca4d9b2a1093d0a7da020fd12e11a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 26 Sep 2023 10:56:33 +0300 Subject: [PATCH 350/357] gh-109631: Allow interruption of short repeated regex matches (GH-109867) Counting for signal checking now continues in new match from the point where it ended in the previous match instead of starting from 0. --- .../Library/2023-09-25-23-00-37.gh-issue-109631.eWSqpO.rst | 3 +++ Modules/_sre/sre.h | 1 + Modules/_sre/sre_lib.h | 6 ++++-- 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-25-23-00-37.gh-issue-109631.eWSqpO.rst diff --git a/Misc/NEWS.d/next/Library/2023-09-25-23-00-37.gh-issue-109631.eWSqpO.rst b/Misc/NEWS.d/next/Library/2023-09-25-23-00-37.gh-issue-109631.eWSqpO.rst new file mode 100644 index 00000000000000..58af2e57068267 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-25-23-00-37.gh-issue-109631.eWSqpO.rst @@ -0,0 +1,3 @@ +:mod:`re` functions such as :func:`re.findall`, :func:`re.split`, +:func:`re.search` and :func:`re.sub` which perform short repeated matches +can now be interrupted by user. diff --git a/Modules/_sre/sre.h b/Modules/_sre/sre.h index f60078d6bb999b..83d89d57b11199 100644 --- a/Modules/_sre/sre.h +++ b/Modules/_sre/sre.h @@ -95,6 +95,7 @@ typedef struct { size_t data_stack_base; /* current repeat context */ SRE_REPEAT *repeat; + unsigned int sigcount; } SRE_STATE; typedef struct { diff --git a/Modules/_sre/sre_lib.h b/Modules/_sre/sre_lib.h index ae80009fd63bbe..3c805aeeca0974 100644 --- a/Modules/_sre/sre_lib.h +++ b/Modules/_sre/sre_lib.h @@ -564,7 +564,7 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel) Py_ssize_t alloc_pos, ctx_pos = -1; Py_ssize_t ret = 0; int jump; - unsigned int sigcount=0; + unsigned int sigcount = state->sigcount; SRE(match_context)* ctx; SRE(match_context)* nextctx; @@ -1567,8 +1567,10 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel) ctx_pos = ctx->last_ctx_pos; jump = ctx->jump; DATA_POP_DISCARD(ctx); - if (ctx_pos == -1) + if (ctx_pos == -1) { + state->sigcount = sigcount; return ret; + } DATA_LOOKUP_AT(SRE(match_context), ctx, ctx_pos); switch (jump) { From 2897142d2ec0930a8991af964c798b68fb6dcadd Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 26 Sep 2023 12:43:45 +0200 Subject: [PATCH 351/357] gh-109832: concurrent.futures test_deadlock restores sys.stderr (#109887) test_error_at_task_unpickle() and test_error_during_result_unpickle_in_result_handler() now restore sys.stderr which is overriden by _raise_error_ignore_stderr(). --- Lib/test/test_concurrent_futures/test_deadlock.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Lib/test/test_concurrent_futures/test_deadlock.py b/Lib/test/test_concurrent_futures/test_deadlock.py index a76e075c3be180..af702542081ad9 100644 --- a/Lib/test/test_concurrent_futures/test_deadlock.py +++ b/Lib/test/test_concurrent_futures/test_deadlock.py @@ -145,6 +145,9 @@ def test_exit_at_task_unpickle(self): self._check_crash(BrokenProcessPool, id, ExitAtUnpickle()) def test_error_at_task_unpickle(self): + # gh-109832: Restore stderr overriden by _raise_error_ignore_stderr() + self.addCleanup(setattr, sys, 'stderr', sys.stderr) + # Check problem occurring while unpickling a task on workers self._check_crash(BrokenProcessPool, id, ErrorAtUnpickle()) @@ -180,6 +183,9 @@ def test_error_during_result_pickle_on_worker(self): self._check_crash(PicklingError, _return_instance, ErrorAtPickle) def test_error_during_result_unpickle_in_result_handler(self): + # gh-109832: Restore stderr overriden by _raise_error_ignore_stderr() + self.addCleanup(setattr, sys, 'stderr', sys.stderr) + # Check problem occurring while unpickling a task in # the result_handler thread self._check_crash(BrokenProcessPool, From 0eb98837b60bc58e57ad3e2b35c6b0e9ab634678 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Tue, 26 Sep 2023 13:57:25 +0200 Subject: [PATCH 352/357] gh-109593: Fix reentrancy issue in multiprocessing resource_tracker (#109629) --------- Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> --- Lib/multiprocessing/resource_tracker.py | 34 ++++++++++++++++-- Lib/test/lock_tests.py | 36 +++++++++++++++++++ Lib/test/test_importlib/test_locks.py | 2 ++ Lib/test/test_threading.py | 3 ++ Lib/threading.py | 7 ++++ ...-09-22-20-16-44.gh-issue-109593.LboaNM.rst | 1 + Modules/_threadmodule.c | 14 ++++++++ 7 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-22-20-16-44.gh-issue-109593.LboaNM.rst diff --git a/Lib/multiprocessing/resource_tracker.py b/Lib/multiprocessing/resource_tracker.py index 3783c1ffc6e4a9..8e41f461cc934e 100644 --- a/Lib/multiprocessing/resource_tracker.py +++ b/Lib/multiprocessing/resource_tracker.py @@ -51,15 +51,31 @@ }) +class ReentrantCallError(RuntimeError): + pass + + class ResourceTracker(object): def __init__(self): - self._lock = threading.Lock() + self._lock = threading.RLock() self._fd = None self._pid = None + def _reentrant_call_error(self): + # gh-109629: this happens if an explicit call to the ResourceTracker + # gets interrupted by a garbage collection, invoking a finalizer (*) + # that itself calls back into ResourceTracker. + # (*) for example the SemLock finalizer + raise ReentrantCallError( + "Reentrant call into the multiprocessing resource tracker") + def _stop(self): with self._lock: + # This should not happen (_stop() isn't called by a finalizer) + # but we check for it anyway. + if self._lock._recursion_count() > 1: + return self._reentrant_call_error() if self._fd is None: # not running return @@ -81,6 +97,9 @@ def ensure_running(self): This can be run from any process. Usually a child process will use the resource created by its parent.''' with self._lock: + if self._lock._recursion_count() > 1: + # The code below is certainly not reentrant-safe, so bail out + return self._reentrant_call_error() if self._fd is not None: # resource tracker was launched before, is it still running? if self._check_alive(): @@ -159,7 +178,17 @@ def unregister(self, name, rtype): self._send('UNREGISTER', name, rtype) def _send(self, cmd, name, rtype): - self.ensure_running() + try: + self.ensure_running() + except ReentrantCallError: + # The code below might or might not work, depending on whether + # the resource tracker was already running and still alive. + # Better warn the user. + # (XXX is warnings.warn itself reentrant-safe? :-) + warnings.warn( + f"ResourceTracker called reentrantly for resource cleanup, " + f"which is unsupported. " + f"The {rtype} object {name!r} might leak.") msg = '{0}:{1}:{2}\n'.format(cmd, name, rtype).encode('ascii') if len(msg) > 512: # posix guarantees that writes to a pipe of less than PIPE_BUF @@ -176,6 +205,7 @@ def _send(self, cmd, name, rtype): unregister = _resource_tracker.unregister getfd = _resource_tracker.getfd + def main(fd): '''Run resource tracker.''' # protect the process from ^C and "killall python" etc diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py index 0890ec87afd1c6..e53e24b18f2760 100644 --- a/Lib/test/lock_tests.py +++ b/Lib/test/lock_tests.py @@ -330,6 +330,42 @@ def test_release_save_unacquired(self): lock.release() self.assertRaises(RuntimeError, lock._release_save) + def test_recursion_count(self): + lock = self.locktype() + self.assertEqual(0, lock._recursion_count()) + lock.acquire() + self.assertEqual(1, lock._recursion_count()) + lock.acquire() + lock.acquire() + self.assertEqual(3, lock._recursion_count()) + lock.release() + self.assertEqual(2, lock._recursion_count()) + lock.release() + lock.release() + self.assertEqual(0, lock._recursion_count()) + + phase = [] + + def f(): + lock.acquire() + phase.append(None) + while len(phase) == 1: + _wait() + lock.release() + phase.append(None) + + with threading_helper.wait_threads_exit(): + start_new_thread(f, ()) + while len(phase) == 0: + _wait() + self.assertEqual(len(phase), 1) + self.assertEqual(0, lock._recursion_count()) + phase.append(None) + while len(phase) == 2: + _wait() + self.assertEqual(len(phase), 3) + self.assertEqual(0, lock._recursion_count()) + def test_different_thread(self): # Cannot release from a different thread lock = self.locktype() diff --git a/Lib/test/test_importlib/test_locks.py b/Lib/test/test_importlib/test_locks.py index ba9cf51c261d52..7091c36aaaf761 100644 --- a/Lib/test/test_importlib/test_locks.py +++ b/Lib/test/test_importlib/test_locks.py @@ -29,6 +29,8 @@ class ModuleLockAsRLockTests: test_timeout = None # _release_save() unsupported test_release_save_unacquired = None + # _recursion_count() unsupported + test_recursion_count = None # lock status in repr unsupported test_repr = None test_locked_repr = None diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 9c16c4044f66a8..71fcad268b8036 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -1783,6 +1783,9 @@ class ConditionAsRLockTests(lock_tests.RLockTests): # Condition uses an RLock by default and exports its API. locktype = staticmethod(threading.Condition) + def test_recursion_count(self): + self.skipTest("Condition does not expose _recursion_count()") + class ConditionTests(lock_tests.ConditionTests): condtype = staticmethod(threading.Condition) diff --git a/Lib/threading.py b/Lib/threading.py index f6bbdb0d0c80ee..31cefd2143a8c4 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -245,6 +245,13 @@ def _release_save(self): def _is_owned(self): return self._owner == get_ident() + # Internal method used for reentrancy checks + + def _recursion_count(self): + if self._owner != get_ident(): + return 0 + return self._count + _PyRLock = _RLock diff --git a/Misc/NEWS.d/next/Library/2023-09-22-20-16-44.gh-issue-109593.LboaNM.rst b/Misc/NEWS.d/next/Library/2023-09-22-20-16-44.gh-issue-109593.LboaNM.rst new file mode 100644 index 00000000000000..292aea0be24dfb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-22-20-16-44.gh-issue-109593.LboaNM.rst @@ -0,0 +1 @@ +Avoid deadlocking on a reentrant call to the multiprocessing resource tracker. Such a reentrant call, though unlikely, can happen if a GC pass invokes the finalizer for a multiprocessing object such as SemLock. diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index fa98df516b8b10..e77e30dfe5e821 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -490,6 +490,18 @@ PyDoc_STRVAR(rlock_release_save_doc, \n\ For internal use by `threading.Condition`."); +static PyObject * +rlock_recursion_count(rlockobject *self, PyObject *Py_UNUSED(ignored)) +{ + unsigned long tid = PyThread_get_thread_ident(); + return PyLong_FromUnsignedLong( + self->rlock_owner == tid ? self->rlock_count : 0UL); +} + +PyDoc_STRVAR(rlock_recursion_count_doc, +"_recursion_count() -> int\n\ +\n\ +For internal use by reentrancy checks."); static PyObject * rlock_is_owned(rlockobject *self, PyObject *Py_UNUSED(ignored)) @@ -565,6 +577,8 @@ static PyMethodDef rlock_methods[] = { METH_VARARGS, rlock_acquire_restore_doc}, {"_release_save", (PyCFunction)rlock_release_save, METH_NOARGS, rlock_release_save_doc}, + {"_recursion_count", (PyCFunction)rlock_recursion_count, + METH_NOARGS, rlock_recursion_count_doc}, {"__enter__", _PyCFunction_CAST(rlock_acquire), METH_VARARGS | METH_KEYWORDS, rlock_acquire_doc}, {"__exit__", (PyCFunction)rlock_release, From 8100612bac2df1cbbb3a4cf646c4b82febf7807f Mon Sep 17 00:00:00 2001 From: lohaswinner Date: Tue, 26 Sep 2023 22:12:32 +0900 Subject: [PATCH 353/357] no-issue: Fix a typo in the parameter name of random.expovariate. (gh-109902) --- Doc/whatsnew/3.12.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 76f1f00dbd34dd..4874a6c77faa99 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -752,7 +752,7 @@ random * Add :func:`random.binomialvariate`. (Contributed by Raymond Hettinger in :gh:`81620`.) -* Add a default of ``lamb=1.0`` to :func:`random.expovariate`. +* Add a default of ``lambd=1.0`` to :func:`random.expovariate`. (Contributed by Raymond Hettinger in :gh:`100234`.) shutil From 19bf3986958fc8269a1eb6d741bb60c91d6b5e58 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 26 Sep 2023 08:20:17 -0500 Subject: [PATCH 354/357] More informative docstrings in the random module (gh-109745) --- Lib/random.py | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/Lib/random.py b/Lib/random.py index 84bbfc5df1bf23..1d789b107904fb 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -492,7 +492,14 @@ def choices(self, population, weights=None, *, cum_weights=None, k=1): ## -------------------- real-valued distributions ------------------- def uniform(self, a, b): - "Get a random number in the range [a, b) or [a, b] depending on rounding." + """Get a random number in the range [a, b) or [a, b] depending on rounding. + + The mean (expected value) and variance of the random variable are: + + E[X] = (a + b) / 2 + Var[X] = (b - a) ** 2 / 12 + + """ return a + (b - a) * self.random() def triangular(self, low=0.0, high=1.0, mode=None): @@ -503,6 +510,11 @@ def triangular(self, low=0.0, high=1.0, mode=None): http://en.wikipedia.org/wiki/Triangular_distribution + The mean (expected value) and variance of the random variable are: + + E[X] = (low + high + mode) / 3 + Var[X] = (low**2 + high**2 + mode**2 - low*high - low*mode - high*mode) / 18 + """ u = self.random() try: @@ -593,12 +605,15 @@ def expovariate(self, lambd=1.0): positive infinity if lambd is positive, and from negative infinity to 0 if lambd is negative. - """ - # lambd: rate lambd = 1/mean - # ('lambda' is a Python reserved word) + The mean (expected value) and variance of the random variable are: + + E[X] = 1 / lambd + Var[X] = 1 / lambd ** 2 + """ # we use 1-random() instead of random() to preclude the # possibility of taking the log of zero. + return -_log(1.0 - self.random()) / lambd def vonmisesvariate(self, mu, kappa): @@ -654,8 +669,12 @@ def gammavariate(self, alpha, beta): pdf(x) = -------------------------------------- math.gamma(alpha) * beta ** alpha + The mean (expected value) and variance of the random variable are: + + E[X] = alpha * beta + Var[X] = alpha * beta ** 2 + """ - # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2 # Warning: a few older sources define the gamma distribution in terms # of alpha > -1.0 @@ -714,6 +733,11 @@ def betavariate(self, alpha, beta): Conditions on the parameters are alpha > 0 and beta > 0. Returned values range between 0 and 1. + The mean (expected value) and variance of the random variable are: + + E[X] = alpha / (alpha + beta) + Var[X] = alpha * beta / ((alpha + beta)**2 * (alpha + beta + 1)) + """ ## See ## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html @@ -766,6 +790,11 @@ def binomialvariate(self, n=1, p=0.5): Returns an integer in the range: 0 <= X <= n + The mean (expected value) and variance of the random variable are: + + E[X] = n * p + Var[x] = n * p * (1 - p) + """ # Error check inputs and handle edge cases if n < 0: From 859618c8cd5de86a975e68d7e5d20c04bc5db2e5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 26 Sep 2023 17:22:50 +0200 Subject: [PATCH 355/357] gh-109566, regrtest: Add --fast-ci and --slow-ci options (#109570) * Add --fast-ci and --slow-ci options to libregrtest: * --fast-ci uses a default timeout of 10 minutes and "-u all,-cpu" (skip slowest tests). * --slow-ci uses a default timeout of 20 minues and "-u all" (run all tests). * regrtest header now lists test resources. * Makefile changes: * "make test", "make hostrunnertest" and "make coverage-report" now use --fast-ci option and TESTTIMEOUT variable. * "make buildbottest" now uses "--slow-ci". Remove options which became redundant with "--slow-ci". * "make testall" and "make testuniversal" now use --slow-ci option and TESTTIMEOUT variable. * "make testall" now uses "find -exec rm ..." instead of "find ... -print|xargs rm ...", same as "make clean". * GitHub Actions workflow: * Ubuntu and Address Sanitizer jobs now use "make test". Remove options which became redundant with "--fast-ci". * Windows jobs now use --fast-ci option. * Use -j0 to detect the number of CPUs. * Set Makefile TESTTIMEOUT default to an empty string, since --slow-ci and --fast-ci use different default timeout. It's now accepted to pass "--timeout=" to regrtest: treated as not timeout. * Tools/scripts/run_tests.py now uses --fast-ci option. * Tools/buildbot/test.bat now uses --slow-ci option. Remove --timeout=1200 option, redundant with --slow-ci. --- .github/workflows/build.yml | 10 ++-- Doc/using/configure.rst | 15 ++++- Lib/test/libregrtest/cmdline.py | 55 ++++++++++++++++++- Lib/test/libregrtest/main.py | 2 +- Lib/test/libregrtest/results.py | 4 +- Lib/test/libregrtest/utils.py | 9 ++- Lib/test/test_regrtest.py | 50 ++++++++++++++++- Makefile.pre.in | 45 +++++++-------- ...-09-19-13-33-20.gh-issue-109566.aX0g9o.rst | 4 ++ Tools/buildbot/test.bat | 6 +- Tools/scripts/run_tests.py | 12 +--- 11 files changed, 161 insertions(+), 51 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-19-13-33-20.gh-issue-109566.aX0g9o.rst diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7f9d0f4da09be7..28ebc1643bd694 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -182,7 +182,7 @@ jobs: - name: Display build info run: .\python.bat -m test.pythoninfo - name: Tests - run: .\PCbuild\rt.bat -p Win32 -d -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0 + run: .\PCbuild\rt.bat -p Win32 -d -q --fast-ci build_win_amd64: name: 'Windows (x64)' @@ -201,7 +201,7 @@ jobs: - name: Display build info run: .\python.bat -m test.pythoninfo - name: Tests - run: .\PCbuild\rt.bat -p x64 -d -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0 + run: .\PCbuild\rt.bat -p x64 -d -q --fast-ci build_win_arm64: name: 'Windows (arm64)' @@ -252,7 +252,7 @@ jobs: - name: Display build info run: make pythoninfo - name: Tests - run: make buildbottest TESTOPTS="-j4 -uall,-cpu" + run: make test build_ubuntu: name: 'Ubuntu' @@ -319,7 +319,7 @@ jobs: run: sudo mount $CPYTHON_RO_SRCDIR -oremount,rw - name: Tests working-directory: ${{ env.CPYTHON_BUILDDIR }} - run: xvfb-run make buildbottest TESTOPTS="-j4 -uall,-cpu" + run: xvfb-run make test build_ubuntu_ssltests: name: 'Ubuntu SSL tests with OpenSSL' @@ -535,7 +535,7 @@ jobs: - name: Display build info run: make pythoninfo - name: Tests - run: xvfb-run make buildbottest TESTOPTS="-j4 -uall,-cpu" + run: xvfb-run make test all-required-green: # This job does nothing and is only used for the branch protection name: All required checks pass diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index 763f9778776990..82074750ec59a8 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -964,9 +964,18 @@ Main Makefile targets You can use the configure :option:`--enable-optimizations` option to make this the default target of the ``make`` command (``make all`` or just ``make``). -* ``make buildbottest``: Build Python and run the Python test suite, the same - way than buildbots test Python. Set ``TESTTIMEOUT`` variable (in seconds) - to change the test timeout (1200 by default: 20 minutes). + +* ``make test``: Build Python and run the Python test suite with ``--slow-ci`` + option. Variables: + + * ``TESTOPTS``: additional regrtest command line options. + * ``TESTPYTHONOPTS``: additional Python command line options. + * ``TESTTIMEOUT``: timeout in seconds (default: 20 minutes). + +* ``make buildbottest``: Similar to ``make test``, but use ``--slow-ci`` + option and default timeout of 20 minutes, instead of ``--fast-ci`` option + and a default timeout of 10 minutes. + * ``make install``: Build and install Python. * ``make regen-all``: Regenerate (almost) all generated files; ``make regen-stdlib-module-names`` and ``autoconf`` must be run separately diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index 99f28152f1a1c7..a0a8504fe8f606 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -4,6 +4,8 @@ import sys from test.support import os_helper +from .utils import MS_WINDOWS + USAGE = """\ python -m test [options] [test_name1 [test_name2 ...]] @@ -145,6 +147,7 @@ class Namespace(argparse.Namespace): def __init__(self, **kwargs) -> None: + self.ci = False self.testdir = None self.verbose = 0 self.quiet = False @@ -209,7 +212,13 @@ def _create_parser(): # We add help explicitly to control what argument group it renders under. group.add_argument('-h', '--help', action='help', help='show this help message and exit') - group.add_argument('--timeout', metavar='TIMEOUT', type=float, + group.add_argument('--fast-ci', action='store_true', + help='Fast Continuous Integration (CI) mode used by ' + 'GitHub Actions') + group.add_argument('--slow-ci', action='store_true', + help='Slow Continuous Integration (CI) mode used by ' + 'buildbot workers') + group.add_argument('--timeout', metavar='TIMEOUT', help='dump the traceback and exit if a test takes ' 'more than TIMEOUT seconds; disabled if TIMEOUT ' 'is negative or equals to zero') @@ -384,7 +393,49 @@ def _parse_args(args, **kwargs): for arg in ns.args: if arg.startswith('-'): parser.error("unrecognized arguments: %s" % arg) - sys.exit(1) + + if ns.timeout is not None: + # Support "--timeout=" (no value) so Makefile.pre.pre TESTTIMEOUT + # can be used by "make buildbottest" and "make test". + if ns.timeout != "": + try: + ns.timeout = float(ns.timeout) + except ValueError: + parser.error(f"invalid timeout value: {ns.timeout!r}") + else: + ns.timeout = None + + # Continuous Integration (CI): common options for fast/slow CI modes + if ns.slow_ci or ns.fast_ci: + # Similar to options: + # + # -j0 --randomize --fail-env-changed --fail-rerun --rerun + # --slowest --verbose3 --nowindows + if ns.use_mp is None: + ns.use_mp = 0 + ns.randomize = True + ns.fail_env_changed = True + ns.fail_rerun = True + ns.rerun = True + ns.print_slow = True + ns.verbose3 = True + if MS_WINDOWS: + ns.nowindows = True # Silence alerts under Windows + + # When both --slow-ci and --fast-ci options are present, + # --slow-ci has the priority + if ns.slow_ci: + # Similar to: -u "all" --timeout=1200 + if not ns.use: + ns.use = [['all']] + if ns.timeout is None: + ns.timeout = 1200 # 20 minutes + elif ns.fast_ci: + # Similar to: -u "all,-cpu" --timeout=600 + if not ns.use: + ns.use = [['all', '-cpu']] + if ns.timeout is None: + ns.timeout = 600 # 10 minutes if ns.single and ns.fromfile: parser.error("-s and -f don't go together!") diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 0ec25a06b6e175..2cd79a1eae5c91 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -425,7 +425,7 @@ def _run_tests(self, selected: TestTuple, tests: TestList | None) -> int: if (self.want_header or not(self.pgo or self.quiet or self.single_test_run or tests or self.cmdline_args)): - display_header() + display_header(self.use_resources) if self.randomize: print("Using random seed", self.random_seed) diff --git a/Lib/test/libregrtest/results.py b/Lib/test/libregrtest/results.py index 1a8619fb62be2a..35df50d581ff6a 100644 --- a/Lib/test/libregrtest/results.py +++ b/Lib/test/libregrtest/results.py @@ -8,11 +8,13 @@ printlist, count, format_duration) +# Python uses exit code 1 when an exception is not catched +# argparse.ArgumentParser.error() uses exit code 2 EXITCODE_BAD_TEST = 2 EXITCODE_ENV_CHANGED = 3 EXITCODE_NO_TESTS_RAN = 4 EXITCODE_RERUN_FAIL = 5 -EXITCODE_INTERRUPTED = 130 +EXITCODE_INTERRUPTED = 130 # 128 + signal.SIGINT=2 class TestResults: diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 6af949cea9c926..f3f0eb53b32100 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -547,7 +547,7 @@ def adjust_rlimit_nofile(): f"{new_fd_limit}: {err}.") -def display_header(): +def display_header(use_resources: tuple[str, ...]): encoding = sys.stdout.encoding # Print basic platform information @@ -569,6 +569,13 @@ def display_header(): print("== encodings: locale=%s, FS=%s" % (locale.getencoding(), sys.getfilesystemencoding())) + + if use_resources: + print(f"== resources ({len(use_resources)}): " + f"{', '.join(sorted(use_resources))}") + else: + print(f"== resources: (all disabled, use -u option)") + # This makes it easier to remember what to set in your local # environment when trying to reproduce a sanitizer failure. asan = support.check_sanitizer(address=True) diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 4b819cbbb8dfc3..15aab609ed1ba7 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -23,8 +23,9 @@ from test import support from test.support import os_helper, TestStats, without_optimizer from test.libregrtest import cmdline -from test.libregrtest import utils +from test.libregrtest import main from test.libregrtest import setup +from test.libregrtest import utils from test.libregrtest.utils import normalize_test_name if not support.has_subprocess_support: @@ -75,8 +76,15 @@ def test_help(self): def test_timeout(self): ns = self.parse_args(['--timeout', '4.2']) self.assertEqual(ns.timeout, 4.2) + + # negative, zero and empty string are treated as "no timeout" + for value in ('-1', '0', ''): + with self.subTest(value=value): + ns = self.parse_args([f'--timeout={value}']) + self.assertEqual(ns.timeout, None) + self.checkError(['--timeout'], 'expected one argument') - self.checkError(['--timeout', 'foo'], 'invalid float value') + self.checkError(['--timeout', 'foo'], 'invalid timeout value:') def test_wait(self): ns = self.parse_args(['--wait']) @@ -366,6 +374,44 @@ def test_unknown_option(self): self.checkError(['--unknown-option'], 'unrecognized arguments: --unknown-option') + def check_ci_mode(self, args, use_resources): + ns = cmdline._parse_args(args) + if utils.MS_WINDOWS: + self.assertTrue(ns.nowindows) + + # Check Regrtest attributes which are more reliable than Namespace + # which has an unclear API + regrtest = main.Regrtest(ns) + self.assertNotEqual(regrtest.num_workers, 0) + self.assertTrue(regrtest.want_rerun) + self.assertTrue(regrtest.randomize) + self.assertIsNone(regrtest.random_seed) + self.assertTrue(regrtest.fail_env_changed) + self.assertTrue(regrtest.fail_rerun) + self.assertTrue(regrtest.print_slowest) + self.assertTrue(regrtest.output_on_failure) + self.assertEqual(sorted(regrtest.use_resources), sorted(use_resources)) + return regrtest + + def test_fast_ci(self): + args = ['--fast-ci'] + use_resources = sorted(cmdline.ALL_RESOURCES) + use_resources.remove('cpu') + regrtest = self.check_ci_mode(args, use_resources) + self.assertEqual(regrtest.timeout, 10 * 60) + + def test_fast_ci_resource(self): + # it should be possible to override resources + args = ['--fast-ci', '-u', 'network'] + use_resources = ['network'] + self.check_ci_mode(args, use_resources) + + def test_slow_ci(self): + args = ['--slow-ci'] + use_resources = sorted(cmdline.ALL_RESOURCES) + regrtest = self.check_ci_mode(args, use_resources) + self.assertEqual(regrtest.timeout, 20 * 60) + @dataclasses.dataclass(slots=True) class Rerun: diff --git a/Makefile.pre.in b/Makefile.pre.in index d123fa3e6f4a47..ccbacfc8571851 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -771,7 +771,7 @@ coverage-report: regen-token regen-frozen @ # build with coverage info $(MAKE) coverage @ # run tests, ignore failures - $(TESTRUNNER) $(TESTOPTS) || true + $(TESTRUNNER) --fast-ci --timeout=$(TESTTIMEOUT) $(TESTOPTS) || true @ # build lcov report $(MAKE) coverage-lcov @@ -1844,7 +1844,7 @@ $(LIBRARY_OBJS) $(MODOBJS) Programs/python.o: $(PYTHON_HEADERS) TESTOPTS= $(EXTRATESTOPTS) TESTPYTHON= $(RUNSHARED) $(PYTHON_FOR_BUILD) $(TESTPYTHONOPTS) TESTRUNNER= $(TESTPYTHON) $(srcdir)/Tools/scripts/run_tests.py -TESTTIMEOUT= 1200 +TESTTIMEOUT= # Remove "test_python_*" directories of previous failed test jobs. # Pass TESTOPTS options because it can contain --tempdir option. @@ -1854,9 +1854,10 @@ cleantest: all # Run a basic set of regression tests. # This excludes some tests that are particularly resource-intensive. +# Similar to buildbottest, but use --fast-ci option, instead of --slow-ci. .PHONY: test test: all - $(TESTRUNNER) $(TESTOPTS) + $(TESTRUNNER) --fast-ci --timeout=$(TESTTIMEOUT) $(TESTOPTS) # Run the full test suite twice - once without .pyc files, and once with. # In the past, we've had problems where bugs in the marshalling or @@ -1867,43 +1868,43 @@ test: all # sample data. .PHONY: testall testall: all - -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f - $(TESTPYTHON) -E $(srcdir)/Lib/compileall.py - -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f - -$(TESTRUNNER) -u all $(TESTOPTS) - $(TESTRUNNER) -u all $(TESTOPTS) + -find $(srcdir)/Lib -name '*.py[co]' -exec rm -f {} ';' || true + $(TESTPYTHON) -E $(srcdir)/Lib/compileall.py + -find $(srcdir)/Lib -name '*.py[co]' -exec rm -f {} ';' || true + $(TESTRUNNER) --slow-ci --timeout=$(TESTTIMEOUT) $(TESTOPTS) + $(TESTRUNNER) --slow-ci --timeout=$(TESTTIMEOUT) $(TESTOPTS) # Run the test suite for both architectures in a Universal build on OSX. # Must be run on an Intel box. .PHONY: testuniversal testuniversal: all - @if [ `arch` != 'i386' ]; then \ - echo "This can only be used on OSX/i386" ;\ - exit 1 ;\ - fi - $(TESTRUNNER) -u all $(TESTOPTS) - $(RUNSHARED) /usr/libexec/oah/translate \ - ./$(BUILDPYTHON) -E -m test -j 0 -u all $(TESTOPTS) + @if [ `arch` != 'i386' ]; then \ + echo "This can only be used on OSX/i386" ;\ + exit 1 ;\ + fi + $(TESTRUNNER) --slow-ci --timeout=$(TESTTIMEOUT) $(TESTOPTS) + $(RUNSHARED) /usr/libexec/oah/translate \ + ./$(BUILDPYTHON) -E -m test -j 0 -u all $(TESTOPTS) # Like testall, but with only one pass and without multiple processes. # Run an optional script to include information about the build environment. .PHONY: buildbottest buildbottest: all - -@if which pybuildbot.identify >/dev/null 2>&1; then \ - pybuildbot.identify "CC='$(CC)'" "CXX='$(CXX)'"; \ - fi - $(TESTRUNNER) -j 1 -u all -W --slowest --fail-env-changed --fail-rerun --timeout=$(TESTTIMEOUT) $(TESTOPTS) + -@if which pybuildbot.identify >/dev/null 2>&1; then \ + pybuildbot.identify "CC='$(CC)'" "CXX='$(CXX)'"; \ + fi + $(TESTRUNNER) --slow-ci --timeout=$(TESTTIMEOUT) $(TESTOPTS) # Like testall, but run Python tests with HOSTRUNNER directly. .PHONY: hostrunnertest hostrunnertest: all - $(RUNSHARED) $(HOSTRUNNER) ./$(BUILDPYTHON) -m test -u all $(TESTOPTS) + $(RUNSHARED) $(HOSTRUNNER) ./$(BUILDPYTHON) -m test --slow-ci --timeout=$(TESTTIMEOUT) $(TESTOPTS) .PHONY: pythoninfo pythoninfo: all $(RUNSHARED) $(HOSTRUNNER) ./$(BUILDPYTHON) -m test.pythoninfo -QUICKTESTOPTS= $(TESTOPTS) -x test_subprocess test_io \ +QUICKTESTOPTS= -x test_subprocess test_io \ test_multibytecodec test_urllib2_localnet test_itertools \ test_multiprocessing_fork test_multiprocessing_spawn \ test_multiprocessing_forkserver \ @@ -1912,7 +1913,7 @@ QUICKTESTOPTS= $(TESTOPTS) -x test_subprocess test_io \ .PHONY: quicktest quicktest: all - $(TESTRUNNER) $(QUICKTESTOPTS) + $(TESTRUNNER) --fast-ci --timeout=$(TESTTIMEOUT) $(TESTOPTS) $(QUICKTESTOPTS) # SSL tests .PHONY: multisslcompile diff --git a/Misc/NEWS.d/next/Tests/2023-09-19-13-33-20.gh-issue-109566.aX0g9o.rst b/Misc/NEWS.d/next/Tests/2023-09-19-13-33-20.gh-issue-109566.aX0g9o.rst new file mode 100644 index 00000000000000..10f90132c37ec9 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-19-13-33-20.gh-issue-109566.aX0g9o.rst @@ -0,0 +1,4 @@ +regrtest: Add ``--fast-ci`` and ``--slow-ci`` options. ``--fast-ci`` uses a +default timeout of 10 minutes and ``-u all,-cpu`` (skip slowest tests). +``--slow-ci`` uses a default timeout of 20 minues and ``-u all`` (run all +tests). Patch by Victor Stinner. diff --git a/Tools/buildbot/test.bat b/Tools/buildbot/test.bat index c1b2605a4b2c7e..781f9a4c8206c8 100644 --- a/Tools/buildbot/test.bat +++ b/Tools/buildbot/test.bat @@ -5,7 +5,7 @@ setlocal set PATH=%PATH%;%SystemRoot%\SysNative\OpenSSH;%SystemRoot%\System32\OpenSSH set here=%~dp0 set rt_opts=-q -d -set regrtest_args=-j1 +set regrtest_args= set arm32_ssh= :CheckOpts @@ -23,7 +23,7 @@ if "%PROCESSOR_ARCHITECTURE%"=="ARM" if "%arm32_ssh%"=="true" goto NativeExecuti if "%arm32_ssh%"=="true" goto :Arm32Ssh :NativeExecution -call "%here%..\..\PCbuild\rt.bat" %rt_opts% -uall -rwW --slowest --timeout=1200 %regrtest_args% +call "%here%..\..\PCbuild\rt.bat" %rt_opts% --slow-ci %regrtest_args% exit /b %ERRORLEVEL% :Arm32Ssh @@ -35,7 +35,7 @@ if NOT "%REMOTE_PYTHON_DIR:~-1,1%"=="\" (set REMOTE_PYTHON_DIR=%REMOTE_PYTHON_DI set TEMP_ARGS=--temp %REMOTE_PYTHON_DIR%temp -set rt_args=%rt_opts% %dashU% -rwW --slowest --timeout=1200 %regrtest_args% %TEMP_ARGS% +set rt_args=%rt_opts% --slow-ci %dashU% %regrtest_args% %TEMP_ARGS% ssh %SSH_SERVER% "set TEMP=%REMOTE_PYTHON_DIR%temp& cd %REMOTE_PYTHON_DIR% & %REMOTE_PYTHON_DIR%PCbuild\rt.bat" %rt_args% set ERR=%ERRORLEVEL% scp %SSH_SERVER%:"%REMOTE_PYTHON_DIR%test-results.xml" "%PYTHON_SOURCE%\test-results.xml" diff --git a/Tools/scripts/run_tests.py b/Tools/scripts/run_tests.py index 445a34ae3e8eee..c62ae82dd788d5 100644 --- a/Tools/scripts/run_tests.py +++ b/Tools/scripts/run_tests.py @@ -18,9 +18,6 @@ def is_multiprocess_flag(arg): return arg.startswith('-j') or arg.startswith('--multiprocess') -def is_resource_use_flag(arg): - return arg.startswith('-u') or arg.startswith('--use') - def is_python_flag(arg): return arg.startswith('-p') or arg.startswith('--python') @@ -56,20 +53,13 @@ def main(regrtest_args): args.extend(test.support.args_from_interpreter_flags()) args.extend(['-m', 'test', # Run the test suite - '-r', # Randomize test order - '-w', # Re-run failed tests in verbose mode + '--fast-ci', # Fast Continuous Integration mode ]) - if sys.platform == 'win32': - args.append('-n') # Silence alerts under Windows if not any(is_multiprocess_flag(arg) for arg in regrtest_args): if cross_compile and hostrunner: # For now use only two cores for cross-compiled builds; # hostrunner can be expensive. args.extend(['-j', '2']) - else: - args.extend(['-j', '0']) # Use all CPU cores - if not any(is_resource_use_flag(arg) for arg in regrtest_args): - args.extend(['-u', 'all,-largefile,-audio,-gui']) if cross_compile and hostrunner: # If HOSTRUNNER is set and -p/--python option is not given, then From ecd813f054e0dee890d484b8210e202175abd632 Mon Sep 17 00:00:00 2001 From: Barney Gale Date: Tue, 26 Sep 2023 17:57:17 +0100 Subject: [PATCH 356/357] GH-109187: Improve symlink loop handling in `pathlib.Path.resolve()` (GH-109192) Treat symlink loops like other errors: in strict mode, raise `OSError`, and in non-strict mode, do not raise any exception. --- Doc/library/pathlib.rst | 14 ++++++++----- Lib/pathlib.py | 21 +------------------ Lib/test/test_pathlib.py | 13 +++++++----- ...-09-09-17-09-54.gh-issue-109187.dIayNW.rst | 3 +++ 4 files changed, 21 insertions(+), 30 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-09-09-17-09-54.gh-issue-109187.dIayNW.rst diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 22360b22fd924b..48d6176d26bb8f 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -1381,15 +1381,19 @@ call fails (for example because the path doesn't exist). >>> p.resolve() PosixPath('/home/antoine/pathlib/setup.py') - If the path doesn't exist and *strict* is ``True``, :exc:`FileNotFoundError` - is raised. If *strict* is ``False``, the path is resolved as far as possible - and any remainder is appended without checking whether it exists. If an - infinite loop is encountered along the resolution path, :exc:`RuntimeError` - is raised. + If a path doesn't exist or a symlink loop is encountered, and *strict* is + ``True``, :exc:`OSError` is raised. If *strict* is ``False``, the path is + resolved as far as possible and any remainder is appended without checking + whether it exists. .. versionchanged:: 3.6 The *strict* parameter was added (pre-3.6 behavior is strict). + .. versionchanged:: 3.13 + Symlink loops are treated like other errors: :exc:`OSError` is raised in + strict mode, and no exception is raised in non-strict mode. In previous + versions, :exc:`RuntimeError` is raised no matter the value of *strict*. + .. method:: Path.rglob(pattern, *, case_sensitive=None, follow_symlinks=None) Glob the given relative *pattern* recursively. This is like calling diff --git a/Lib/pathlib.py b/Lib/pathlib.py index f4ec315da6b4fa..bd5f61b0b7c878 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -1230,26 +1230,7 @@ def resolve(self, strict=False): normalizing it. """ - def check_eloop(e): - winerror = getattr(e, 'winerror', 0) - if e.errno == ELOOP or winerror == _WINERROR_CANT_RESOLVE_FILENAME: - raise RuntimeError("Symlink loop from %r" % e.filename) - - try: - s = os.path.realpath(self, strict=strict) - except OSError as e: - check_eloop(e) - raise - p = self.with_segments(s) - - # In non-strict mode, realpath() doesn't raise on symlink loops. - # Ensure we get an exception by calling stat() - if not strict: - try: - p.stat() - except OSError as e: - check_eloop(e) - return p + return self.with_segments(os.path.realpath(self, strict=strict)) def owner(self): """ diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 09df3fe471fc3e..484a5e6c3bd64d 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -3178,10 +3178,11 @@ def test_absolute(self): self.assertEqual(str(P('//a').absolute()), '//a') self.assertEqual(str(P('//a/b').absolute()), '//a/b') - def _check_symlink_loop(self, *args, strict=True): + def _check_symlink_loop(self, *args): path = self.cls(*args) - with self.assertRaises(RuntimeError): - print(path.resolve(strict)) + with self.assertRaises(OSError) as cm: + path.resolve(strict=True) + self.assertEqual(cm.exception.errno, errno.ELOOP) @unittest.skipIf( is_emscripten or is_wasi, @@ -3240,7 +3241,8 @@ def test_resolve_loop(self): os.symlink('linkZ/../linkZ', join('linkZ')) self._check_symlink_loop(BASE, 'linkZ') # Non-strict - self._check_symlink_loop(BASE, 'linkZ', 'foo', strict=False) + p = self.cls(BASE, 'linkZ', 'foo') + self.assertEqual(p.resolve(strict=False), p) # Loops with absolute symlinks. os.symlink(join('linkU/inside'), join('linkU')) self._check_symlink_loop(BASE, 'linkU') @@ -3249,7 +3251,8 @@ def test_resolve_loop(self): os.symlink(join('linkW/../linkW'), join('linkW')) self._check_symlink_loop(BASE, 'linkW') # Non-strict - self._check_symlink_loop(BASE, 'linkW', 'foo', strict=False) + q = self.cls(BASE, 'linkW', 'foo') + self.assertEqual(q.resolve(strict=False), q) def test_glob(self): P = self.cls diff --git a/Misc/NEWS.d/next/Library/2023-09-09-17-09-54.gh-issue-109187.dIayNW.rst b/Misc/NEWS.d/next/Library/2023-09-09-17-09-54.gh-issue-109187.dIayNW.rst new file mode 100644 index 00000000000000..31b3ef77807cde --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-09-17-09-54.gh-issue-109187.dIayNW.rst @@ -0,0 +1,3 @@ +:meth:`pathlib.Path.resolve` now treats symlink loops like other errors: in +strict mode, :exc:`OSError` is raised, and in non-strict mode, no exception +is raised. From fbfec5642edd9d7690bbff088ee43c08e8067044 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 26 Sep 2023 20:46:52 +0200 Subject: [PATCH 357/357] gh-109566: regrtest reexecutes the process (#109909) When --fast-ci or --slow-ci option is used, regrtest now replaces the current process with a new process to add "-u -W default -bb -E" options to Python. Changes: * PCbuild/rt.bat and Tools/scripts/run_tests.py no longer need to add "-u -W default -bb -E" options to Python: it's now done by regrtest. * Fix Tools/scripts/run_tests.py: flush stdout before replacing the process. Previously, buffered messages were lost. --- Lib/test/__main__.py | 2 +- Lib/test/libregrtest/cmdline.py | 5 ++ Lib/test/libregrtest/main.py | 41 +++++++++++-- Lib/test/test_regrtest.py | 58 ++++++++++++++++++- ...-09-26-18-12-01.gh-issue-109566.CP0Vhf.rst | 3 + PCbuild/rt.bat | 2 +- Tools/scripts/run_tests.py | 10 +--- 7 files changed, 107 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2023-09-26-18-12-01.gh-issue-109566.CP0Vhf.rst diff --git a/Lib/test/__main__.py b/Lib/test/__main__.py index e5780b784b4b05..42553fa32867d3 100644 --- a/Lib/test/__main__.py +++ b/Lib/test/__main__.py @@ -1,2 +1,2 @@ from test.libregrtest.main import main -main() +main(reexec=True) diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index a0a8504fe8f606..bc969969e068eb 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -184,6 +184,7 @@ def __init__(self, **kwargs) -> None: self.threshold = None self.fail_rerun = False self.tempdir = None + self.no_reexec = False super().__init__(**kwargs) @@ -343,6 +344,8 @@ def _create_parser(): help='override the working directory for the test run') group.add_argument('--cleanup', action='store_true', help='remove old test_python_* directories') + group.add_argument('--no-reexec', action='store_true', + help="internal option, don't use it") return parser @@ -421,6 +424,8 @@ def _parse_args(args, **kwargs): ns.verbose3 = True if MS_WINDOWS: ns.nowindows = True # Silence alerts under Windows + else: + ns.no_reexec = True # When both --slow-ci and --fast-ci options are present, # --slow-ci has the priority diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 2cd79a1eae5c91..a93f532e9cb586 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -1,6 +1,7 @@ import os import random import re +import shlex import sys import time @@ -20,7 +21,7 @@ StrPath, StrJSON, TestName, TestList, TestTuple, FilterTuple, strip_py_suffix, count, format_duration, printlist, get_temp_dir, get_work_dir, exit_timeout, - display_header, cleanup_temp_dir, + display_header, cleanup_temp_dir, print_warning, MS_WINDOWS) @@ -47,7 +48,7 @@ class Regrtest: directly to set the values that would normally be set by flags on the command line. """ - def __init__(self, ns: Namespace): + def __init__(self, ns: Namespace, reexec: bool = False): # Log verbosity self.verbose: int = int(ns.verbose) self.quiet: bool = ns.quiet @@ -69,6 +70,7 @@ def __init__(self, ns: Namespace): self.want_cleanup: bool = ns.cleanup self.want_rerun: bool = ns.rerun self.want_run_leaks: bool = ns.runleaks + self.want_reexec: bool = (reexec and not ns.no_reexec) # Select tests if ns.match_tests: @@ -95,6 +97,7 @@ def __init__(self, ns: Namespace): self.worker_json: StrJSON | None = ns.worker_json # Options to run tests + self.ci_mode: bool = (ns.fast_ci or ns.slow_ci) self.fail_fast: bool = ns.failfast self.fail_env_changed: bool = ns.fail_env_changed self.fail_rerun: bool = ns.fail_rerun @@ -483,7 +486,37 @@ def run_tests(self, selected: TestTuple, tests: TestList | None) -> int: # processes. return self._run_tests(selected, tests) + def _reexecute_python(self): + if self.python_cmd: + # Do nothing if --python=cmd option is used + return + + python_opts = [ + '-u', # Unbuffered stdout and stderr + '-W', 'default', # Add warnings filter 'default' + '-bb', # Error on bytes/str comparison + '-E', # Ignore PYTHON* environment variables + ] + + cmd = [*sys.orig_argv, "--no-reexec"] + cmd[1:1] = python_opts + + # Make sure that messages before execv() are logged + sys.stdout.flush() + sys.stderr.flush() + + try: + os.execv(cmd[0], cmd) + # execv() do no return and so we don't get to this line on success + except OSError as exc: + cmd_text = shlex.join(cmd) + print_warning(f"Failed to reexecute Python: {exc!r}\n" + f"Command: {cmd_text}") + def main(self, tests: TestList | None = None): + if self.want_reexec and self.ci_mode: + self._reexecute_python() + if self.junit_filename and not os.path.isabs(self.junit_filename): self.junit_filename = os.path.abspath(self.junit_filename) @@ -515,7 +548,7 @@ def main(self, tests: TestList | None = None): sys.exit(exitcode) -def main(tests=None, **kwargs): +def main(tests=None, reexec=False, **kwargs): """Run the Python suite.""" ns = _parse_args(sys.argv[1:], **kwargs) - Regrtest(ns).main(tests=tests) + Regrtest(ns, reexec=reexec).main(tests=tests) diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 15aab609ed1ba7..2b77300c079c05 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -382,7 +382,8 @@ def check_ci_mode(self, args, use_resources): # Check Regrtest attributes which are more reliable than Namespace # which has an unclear API regrtest = main.Regrtest(ns) - self.assertNotEqual(regrtest.num_workers, 0) + self.assertTrue(regrtest.ci_mode) + self.assertEqual(regrtest.num_workers, -1) self.assertTrue(regrtest.want_rerun) self.assertTrue(regrtest.randomize) self.assertIsNone(regrtest.random_seed) @@ -1960,6 +1961,61 @@ def test_dev_mode(self): self.check_executed_tests(output, tests, stats=len(tests), parallel=True) + def check_reexec(self, option): + # --fast-ci and --slow-ci add "-u -W default -bb -E" options to Python + code = textwrap.dedent(r""" + import sys + import unittest + try: + from _testinternalcapi import get_config + except ImportError: + get_config = None + + class WorkerTests(unittest.TestCase): + @unittest.skipUnless(get_config is None, 'need get_config()') + def test_config(self): + config = get_config()['config'] + # -u option + self.assertEqual(config['buffered_stdio'], 0) + # -W default option + self.assertTrue(config['warnoptions'], ['default']) + # -bb option + self.assertTrue(config['bytes_warning'], 2) + # -E option + self.assertTrue(config['use_environment'], 0) + + # test if get_config() is not available + def test_unbuffered(self): + # -u option + self.assertFalse(sys.stdout.line_buffering) + self.assertFalse(sys.stderr.line_buffering) + + def test_python_opts(self): + # -W default option + self.assertTrue(sys.warnoptions, ['default']) + # -bb option + self.assertEqual(sys.flags.bytes_warning, 2) + # -E option + self.assertTrue(sys.flags.ignore_environment) + """) + testname = self.create_test(code=code) + + cmd = [sys.executable, + "-m", "test", option, + f'--testdir={self.tmptestdir}', + testname] + proc = subprocess.run(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True) + self.assertEqual(proc.returncode, 0, proc) + + def test_reexec_fast_ci(self): + self.check_reexec("--fast-ci") + + def test_reexec_slow_ci(self): + self.check_reexec("--slow-ci") + class TestUtils(unittest.TestCase): def test_format_duration(self): diff --git a/Misc/NEWS.d/next/Tests/2023-09-26-18-12-01.gh-issue-109566.CP0Vhf.rst b/Misc/NEWS.d/next/Tests/2023-09-26-18-12-01.gh-issue-109566.CP0Vhf.rst new file mode 100644 index 00000000000000..d865f629fdb05b --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2023-09-26-18-12-01.gh-issue-109566.CP0Vhf.rst @@ -0,0 +1,3 @@ +regrtest: When ``--fast-ci`` or ``--slow-ci`` option is used, regrtest now +replaces the current process with a new process to add ``-u -W default -bb -E`` +options to Python. Patch by Victor Stinner. diff --git a/PCbuild/rt.bat b/PCbuild/rt.bat index 33f4212e14567d..7ae7141bfc4eaa 100644 --- a/PCbuild/rt.bat +++ b/PCbuild/rt.bat @@ -48,7 +48,7 @@ if NOT "%1"=="" (set regrtestargs=%regrtestargs% %1) & shift & goto CheckOpts if not defined prefix set prefix=%pcbuild%amd64 set exe=%prefix%\python%suffix%.exe -set cmd="%exe%" %dashO% -u -Wd -E -bb -m test %regrtestargs% +set cmd="%exe%" %dashO% -m test %regrtestargs% if defined qmode goto Qmode echo Deleting .pyc files ... diff --git a/Tools/scripts/run_tests.py b/Tools/scripts/run_tests.py index c62ae82dd788d5..3e3d15d3b0da5c 100644 --- a/Tools/scripts/run_tests.py +++ b/Tools/scripts/run_tests.py @@ -23,11 +23,7 @@ def is_python_flag(arg): def main(regrtest_args): - args = [sys.executable, - '-u', # Unbuffered stdout and stderr - '-W', 'default', # Warnings set to 'default' - '-bb', # Warnings about bytes/bytearray - ] + args = [sys.executable] cross_compile = '_PYTHON_HOST_PLATFORM' in os.environ if (hostrunner := os.environ.get("_PYTHON_HOSTRUNNER")) is None: @@ -47,7 +43,6 @@ def main(regrtest_args): } else: environ = os.environ.copy() - args.append("-E") # Allow user-specified interpreter options to override our defaults. args.extend(test.support.args_from_interpreter_flags()) @@ -70,7 +65,8 @@ def main(regrtest_args): args.extend(regrtest_args) - print(shlex.join(args)) + print(shlex.join(args), flush=True) + if sys.platform == 'win32': from subprocess import call sys.exit(call(args))