From 622515104bc4840068f697cf3e74200e91ecf528 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 5 Nov 2020 02:49:54 +0100 Subject: [PATCH 1/2] [WIP] bpo-42260: Rewrite getpath.c in Python * Add _getpath Python module and _cgetpath C module * Py_SetPath() no longer computes the path configuration. * _PyErr_SetFromPyStatus() now raises SystemExit if the status is an exit code. --- Doc/c-api/intro.rst | 2 +- Include/internal/pycore_pathconfig.h | 3 + Lib/_getpath.py | 687 +++++++++++ Lib/ctypes/test/test_values.py | 1 + Lib/sysconfig.py | 2 +- Lib/test/test_embed.py | 1 + Makefile.pre.in | 17 +- Modules/_cgetpath.c | 226 ++++ Modules/clinic/_cgetpath.c.h | 105 ++ Modules/config.c.in | 4 + Modules/getpath.c | 1619 -------------------------- PC/getpathp.c | 2 +- Programs/_testembed.c | 2 +- Python/frozen.c | 2 + Python/frozenmain.c | 2 +- Python/getpath.h | 770 ++++++++++++ Python/initconfig.c | 23 +- Python/pathconfig.c | 2 + Python/pylifecycle.c | 35 + Tools/c-analyzer/cpython/_parser.py | 11 +- 20 files changed, 1872 insertions(+), 1644 deletions(-) create mode 100644 Lib/_getpath.py create mode 100644 Modules/_cgetpath.c create mode 100644 Modules/clinic/_cgetpath.c.h delete mode 100644 Modules/getpath.c create mode 100644 Python/getpath.h diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index bae5ce11b73c4cb..032aaed0506cf18 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -711,7 +711,7 @@ The embedding application can steer the search by calling inserted in front of the standard path. An application that requires total control has to provide its own implementation of :c:func:`Py_GetPath`, :c:func:`Py_GetPrefix`, :c:func:`Py_GetExecPrefix`, and -:c:func:`Py_GetProgramFullPath` (all defined in :file:`Modules/getpath.c`). +:c:func:`Py_GetProgramFullPath` (all defined in :file:`Python/pathconfig.c`). .. index:: single: Py_IsInitialized() diff --git a/Include/internal/pycore_pathconfig.h b/Include/internal/pycore_pathconfig.h index 15447f54490fb42..0b4270d620139bf 100644 --- a/Include/internal/pycore_pathconfig.h +++ b/Include/internal/pycore_pathconfig.h @@ -48,9 +48,12 @@ PyAPI_DATA(wchar_t*) _Py_dll_path; extern void _PyPathConfig_ClearGlobal(void); +#ifdef MS_WINDOWS extern PyStatus _PyPathConfig_Calculate( _PyPathConfig *pathconfig, const PyConfig *config); +#endif + extern int _PyPathConfig_ComputeSysPath0( const PyWideStringList *argv, PyObject **path0); diff --git a/Lib/_getpath.py b/Lib/_getpath.py new file mode 100644 index 000000000000000..0c8b5b17e7e2c3f --- /dev/null +++ b/Lib/_getpath.py @@ -0,0 +1,687 @@ +# Compute the Python Path Configuration on Unix. + +import posix +from _stat import S_ISREG, S_ISDIR +import _cgetpath +import sys + +ENV_CFG = "pyvenv.cfg" +LANDMARK = "os.py" +BUILD_LANDMARK = "Modules/Setup.local" + +PY_MAJOR_VERSION = sys.version_info.major +PY_MINOR_VERSION = sys.version_info.minor + +SEP = _cgetpath.SEP +DELIM = _cgetpath.DELIM +WITH_NEXT_FRAMEWORK = _cgetpath.WITH_NEXT_FRAMEWORK +__APPLE__ = (sys.platform == 'darwin') +MS_WINDOWS = (sys.platform == 'win32') +# FIXME: Export these constants in _cgetpath +__CYGWIN__ = False +__MINGW32__ = False + + +# Py_DecodeLocale() function: decode a byte string from the filesystem encoding +# and error handler. +decode_locale = _cgetpath.decode_locale + + +PYTHONPATH = decode_locale(_cgetpath.PYTHONPATH) +PREFIX = decode_locale(_cgetpath.PREFIX) +EXEC_PREFIX = decode_locale(_cgetpath.EXEC_PREFIX) +VPATH = decode_locale(_cgetpath.VPATH) +VERSION = decode_locale(_cgetpath.VERSION) + + +def isabs(path): + # an empty path is not considered as absolute + return (path and path.startswith(SEP)) + + +def dirname(path): + # FIXME: use str methods + i = len(path) - 1 + while i > 0 and path[i] != SEP: + i -= 1 + return path[:i] + + +# FIXME: support more than 2 arguments +def joinpath(path, path2): + if isabs(path2): + return path2 + + if not path: + return path2 + + if not path.endswith(SEP): + return f"{path}{SEP}{path2}" + else: + return path + path2 + + +# Is a file, not a directory? +def isfile(filename): + try: + st = posix.stat(filename) + except OSError: + return False + if not S_ISREG(st.st_mode): + return False + return True + + +# Is executable file? +def isxfile(filename): + try: + st = posix.stat(filename) + except OSError: + return False + if not S_ISREG(st.st_mode): + return False + return ((st.st_mode & 0o111) != 0) + + +# Is a directory? +def isdir(filename): + try: + st = posix.stat(filename) + except OSError: + return False + return S_ISDIR(st.st_mode) + + +# Is a module? Check for .pyc too. +def ismodule(path): + filename = joinpath(path, LANDMARK) + if isfile(filename): + return True + + # Check for the compiled version of prefix. + return isfile(filename + 'c') + +def abspath(path): + if isabs(path): + return path + + try: + cwd = posix.getcwd() + except OSError: + return path + + # ./foo => foo + path = path.removeprefix(f'.{SEP}') + return joinpath(cwd, path) + + +if __CYGWIN__ or __MINGW32__: + EXE_SUFFIX = ".exe" + + def add_exe_suffix(progpath): + # Check for already have an executable suffix + if progpath[-len(EXE_SUFFIX):].lower() == EXE_SUFFIX: + return progpath + + progpath_exe = progpath + EXE_SUFFIX + if isxfile(progpath_exe): + return progpath_exe + + return progpath + + +# Similar to realpath() but without the normalization. +def resolve_symlinks(path): + nlink = 0 + while True: + try: + new_path = posix.readlink(path) + except OSError: + # Not a symbolic link: we are done. + break + + if isabs(new_path): + path = new_path + else: + # new_path is relative to path + path = joinpath(dirname(path), new_path) + + nlink += 1 + # 40 is the Linux kernel 4.2 limit + if nlink >= 40: + raise Exception("maximum number of symbolic links reached") + + return path + + +class PathConfig: + def __init__(self): + self.module_search_path = None + self.program_full_path = None + self.prefix = None + self.exec_prefix = None + self.program_name = None + self.home = None + if MS_WINDOWS: + self.base_executable = None + + def _get_config(self, config, attr, config_key=None): + if config_key is None: + config_key = attr + setattr(self, attr, config[config_key]) + + def set_from_config(self, config): + if config['module_search_paths_set']: + self.module_search_path = config['module_search_paths'] + self._get_config(config, 'program_full_path', 'executable') + self._get_config(config, 'prefix') + self._get_config(config, 'exec_prefix') + self._get_config(config, 'program_name') + self._get_config(config, 'home') + if MS_WINDOWS: + self._get_config(config, 'base_executable') + + def _set_config(self, config, attr, config_key=None): + if config_key is None: + config_key = attr + if config[config_key] is not None: + return + config[config_key] = getattr(self, attr) + + def set_to_config(self, config): + if not config['module_search_paths_set']: + config['module_search_paths'] = self.module_search_path + config['module_search_paths_set'] = 1 + + if MS_WINDOWS: + if config['executable'] is not None and config['base_executable'] is None: + # If executable is set explicitly in the configuration, + # ignore calculated base_executable: _PyConfig_InitPathConfig() + # will copy executable to base_executable + pass + else: + self._set_config(config, 'base_executable') + + self._set_config(config, 'program_full_path', 'executable') + self._set_config(config, 'prefix') + self._set_config(config, 'exec_prefix') + + if MS_WINDOWS: + # If a ._pth file is found: isolated and site_import are overriden + if self.isolated != -1: + config['isolated'] = self.isolated + if self.site_import != -1: + config['site_import'] = self.site_import + + +def readline(fd): + # FIXME: write better code + # FIXME: support '\r' newline (macOS) + nl = b'\n' + buf = bytearray() + while True: + chunk = posix.read(fd, 4096) + if not chunk: + break + if nl in chunk: + chunk = chunk.split(nl, 1)[0] + buf += chunk + break + buf += chunk + return bytes(buf) + + +# Search for a prefix value in an environment file (pyvenv.cfg). +def find_env_config_value(fd, key): + while True: + line = readline(fd) + if not line: + break + if line.startswith(b'#'): + # Comment - skip + continue + + line = line.decode('utf-8', 'surrogateescape') + + # FIXME: rewrite this code + tok = line.split() # FIXME: only split at " \t\r\n" + if tok[0] == key and tok[1] == '=': + value = tok[2] + return value + + +class CalculatePath: + def __init__(self, pathconfig, config): + self.pathconfig = pathconfig + + self.prefix_found = 0 + self.exec_prefix_found = 0 + + self.warnings = config['pathconfig_warnings'] + self.pythonpath_env = config['pythonpath_env'] + self.platlibdir = config['platlibdir'] + path = posix.environ.get(b'PATH', None) + if path is not None: + self.path_env = decode_locale(path) + else: + self.path_env = None + self.pythonpath_macro = PYTHONPATH + self.prefix_macro = PREFIX + self.exec_prefix_macro = EXEC_PREFIX + self.vpath_macro = VPATH + + self.lib_python = joinpath(self.platlibdir, f"python{VERSION}") + + def calculate_program_macos(self): + # On Mac OS X, if a script uses an interpreter of the form + # "#!/opt/python2.3/bin/python", the kernel only passes "python" + # as argv[0], which falls through to the $PATH search below. + # If /opt/python2.3/bin isn't in your path, or is near the end, + # this algorithm may incorrectly find /usr/bin/python. To work + # around this, we can use _NSGetExecutablePath to get a better + # hint of what the intended interpreter was, although this + # will fail if a relative path was used. but in that case, + # abspath() should help us out below + exec_path = _cgetpath._NSGetExecutablePath() + if not isabs(exec_path): + return + + return exec_path + + def calculate_argv0_path_framework(self): + mod_path = _cgetpath.NSLibraryName() + if mod_path is None: + return + + # We're in a framework. + # See if we might be in the build directory. The framework in the + # build directory is incomplete, it only has the .dylib and a few + # needed symlinks, it doesn't have the Lib directories and such. + # If we're running with the framework from the build directory we must + # be running the interpreter in the build directory, so we use the + # build-directory-specific logic to find Lib and such. + + lib_python = joinpath(dirname(mod_path), self.lib_python) + if not ismodule(lib_python): + # We are in the build directory so use the name of the + # executable - we know that the absolute path is passed + self.argv0_path = self.pathconfig.program_full_path + return + + # Use the location of the library as argv0_path + self.argv0_path = mod_path + + # Similar to shutil.which(). + @staticmethod + def calculate_which(path_env, program_name): + for path in path_env.split(DELIM): + abs_path = joinpath(path, program_name) + if isxfile(abs_path): + return abs_path + + # not found + return None + + def calculate_program_impl(self): + pathconfig = self.pathconfig + assert pathconfig.program_full_path is None + + # If there is no slash in the argv0 path, then we have to + # assume python is on the user's $PATH, since there's no + # other way to find a directory to start the search from. If + # $PATH isn't exported, you lose. + if SEP in pathconfig.program_name: + pathconfig.program_full_path = pathconfig.program_name + return + + if __APPLE__: + abs_path = self.calculate_program_macos() + if abs_path is not None: + pathconfig.program_full_path = abs_path + return + + if self.path_env: + abs_path = self.calculate_which(self.path_env, pathconfig.program_name) + if abs_path is not None: + pathconfig.program_full_path = abs_path + return + + # In the last resort, use an empty string + pathconfig.program_full_path = "" + + def calculate_program(self): + pathconfig = self.pathconfig + self.calculate_program_impl() + + if not pathconfig.program_full_path: + return + # program_full_path is not empty + + # Make sure that program_full_path is an absolute path + pathconfig.program_full_path = abspath(pathconfig.program_full_path) + + if __CYGWIN__ or __MINGW32__: + # For these platforms it is necessary to ensure that the .exe + # suffix is appended to the filename, otherwise there is potential + # for sys.executable to return the name of a directory under the + # same path (bpo-28441). + pathconfig.program_full_path = add_exe_suffix(pathconfig.program_full_path) + + def calculate_argv0_path(self): + self.argv0_path = self.pathconfig.program_full_path + + if WITH_NEXT_FRAMEWORK: + self.calculate_argv0_path_framework() + + self.argv0_path = resolve_symlinks(self.argv0_path) + self.argv0_path = dirname(self.argv0_path) + + def calculate_open_pyenv(self): + # Filename: / "pyvenv.cfg" + filename = joinpath(self.argv0_path, ENV_CFG) + try: + return posix.open(filename, posix.O_RDONLY) + except OSError: + pass + + # Path: / "pyvenv.cfg" + filename = joinpath(dirname(self.argv0_path), ENV_CFG) + try: + return posix.open(filename, posix.O_RDONLY) + except OSError: + return None + + # Search for an "pyvenv.cfg" environment configuration file, first in the + # executable's directory and then in the parent directory. + # If found, open it for use when searching for prefixes. + # + # Write the 'home' variable of pyvenv.cfg into self.argv0_path. + def calculate_read_pyenv(self): + env_file = self.calculate_open_pyenv() + if env_file is None: + # pyvenv.cfg not found + return + + # Look for a 'home' variable and set argv0_path to it, if found + try: + home = find_env_config_value(env_file, "home") + if home is not None: + self.argv0_path = home + finally: + posix.close(env_file) + + def search_for_prefix(self): + # If PYTHONHOME is set, we believe it unconditionally + home = self.pathconfig.home + if home is not None: + # Path: / + prefix = home.partition(DELIM)[0] + prefix = joinpath(prefix, self.lib_python) + self.prefix_found = 1 + return prefix + + # Check to see if argv0_path is in the build directory + path = joinpath(self.argv0_path, BUILD_LANDMARK) + if isfile(path): + # argv0_path is the build directory (BUILD_LANDMARK exists), + # now also check LANDMARK using ismodule(). + + # Path: / / Lib + # or if VPATH is empty: / Lib + prefix = joinpath(self.argv0_path, self.vpath_macro) + prefix = joinpath(prefix, "Lib") + if ismodule(prefix): + # BUILD_LANDMARK and LANDMARK found + self.prefix_found = -1 + return prefix + + # Search from argv0_path, until root is found + prefix = abspath(self.argv0_path) + while prefix: + # Path: / / LANDMARK + new_prefix = joinpath(prefix, self.lib_python) + if ismodule(new_prefix): + self.prefix_found = 1 + return new_prefix + + prefix = dirname(prefix) + + # Look at configure's PREFIX. + # Path: / / LANDMARK + prefix = joinpath(self.prefix_macro, self.lib_python) + if ismodule(prefix): + self.prefix_found = 1 + return prefix + + # Fail + self.prefix_found = 0 + return None + + def calculate_prefix(self): + prefix = self.search_for_prefix() + if self.prefix_found == 0: + if self.warnings: + print("Could not find platform independent libraries ", + file=sys.stderr) + self.prefix = joinpath(self.prefix_macro, self.lib_python) + else: + self.prefix = prefix + + def calculate_zip_path(self): + path = joinpath(self.platlibdir, + f"python{PY_MAJOR_VERSION}{PY_MINOR_VERSION}.zip") + if self.prefix_found > 0: + # Use the reduced prefix returned by Py_GetPrefix() + self.zip_path = joinpath(dirname(dirname(self.prefix)), path) + else: + self.zip_path = joinpath(self.prefix_macro, path) + + def calculate_pybuilddir(self): + # Check to see if argv[0] is in the build directory. "pybuilddir.txt" + # is written by setup.py and contains the relative path to the location + # of shared library modules. + # + # Filename: / "pybuilddir.txt" + filename = joinpath(self.argv0_path, "pybuilddir.txt") + try: + fd = posix.open(filename, posix.O_RDONLY) + except OSError: + return + + try: + line = readline(fd) + finally: + posix.close(fd) + pybuilddir = line.decode('utf-8', 'surrogateescape') + + exec_prefix = joinpath(self.argv0_path, pybuilddir) + self.exec_prefix_found = -1 + return exec_prefix + + def search_for_exec_prefix(self): + # If PYTHONHOME is set, we believe it unconditionally + home = self.pathconfig.home + if home: + # Path: / / "lib-dynload" + paths = home.split(DELIM) + if len(paths) >= 2: + exec_prefix = paths[1] + else: + exec_prefix = home + + exec_prefix = joinpath(exec_prefix, self.lib_python) + exec_prefix = joinpath(exec_prefix, "lib-dynload") + self.exec_prefix_found = 1 + return exec_prefix + + # Check for pybuilddir.txt + assert self.exec_prefix_found == 0 + exec_prefix = self.calculate_pybuilddir() + if self.exec_prefix_found != 0: + return exec_prefix + + # Search from argv0_path, until root is found + exec_prefix = abspath(self.argv0_path) + while exec_prefix: + # Path: / / "lib-dynload" + new_exec_prefix = joinpath(exec_prefix, self.lib_python) + new_exec_prefix = joinpath(new_exec_prefix, "lib-dynload") + if isdir(new_exec_prefix): + self.exec_prefix_found = 1 + return new_exec_prefix + + exec_prefix = dirname(exec_prefix) + + # Look at configure's EXEC_PREFIX. + exec_prefix = joinpath(self.exec_prefix_macro, self.lib_python) + exec_prefix = joinpath(exec_prefix, "lib-dynload") + if isdir(exec_prefix): + self.exec_prefix_found = 1 + return exec_prefix + + # Fail + self.exec_prefix_found = 0 + + def calculate_exec_prefix(self): + exec_prefix = self.search_for_exec_prefix() + + if self.exec_prefix_found == 0: + if self.warnings: + print("Could not find platform dependent libraries \n", + file=sys.stderr) + + lib_dynload = joinpath(self.platlibdir, "lib-dynload") + self.exec_prefix = joinpath(self.exec_prefix_macro, lib_dynload) + else: + # If we found EXEC_PREFIX do *not* reduce it! (Yet.) + self.exec_prefix = exec_prefix + + def calculate_module_search_path(self): + paths = [] + + # Run-time value of $PYTHONPATH environment variable goes first + if self.pythonpath_env: + paths.extend(self.pythonpath_env.split(DELIM)) + + # Next is the default zip path + paths.append(self.zip_path) + + # Next goes merge of compile-time $PYTHONPATH with + # dynamically located prefix. + for path in self.pythonpath_macro.split(DELIM): + if path: + path = joinpath(self.prefix, path) + else: + path = self.prefix + paths.append(path) + + # Finally, on goes the directory for dynamic-load modules + paths.append(self.exec_prefix) + + self.pathconfig.module_search_path = paths + + def calculate_set_prefix(self): + # Reduce prefix and exec_prefix to their essence, + # e.g. /usr/local/lib/python1.5 is reduced to /usr/local. + # If we're loading relative to the build directory, + # return the compiled-in defaults instead. + if self.prefix_found > 0: + prefix = dirname(dirname(self.prefix)) + if not prefix: + # The prefix is the root directory, but dirname() chopped + # off the "/". + prefix = SEP + self.pathconfig.prefix = prefix + else: + self.pathconfig.prefix = self.prefix_macro + + def calculate_set_exec_prefix(self): + if self.exec_prefix_found > 0: + exec_prefix = dirname(dirname(dirname(self.exec_prefix))) + if not exec_prefix: + # The exec_prefix is the root directory, but dirname() chopped + # off the "/". + exec_prefix = SEP + self.pathconfig.exec_prefix = exec_prefix + else: + self.pathconfig.exec_prefix = self.exec_prefix_macro + + # Calculate the Python path configuration on Unix. + # + # Inputs: + # + # - PATH environment variable + # - Macros: PYTHONPATH, PREFIX, EXEC_PREFIX, VERSION (ex: "3.9"). + # PREFIX and EXEC_PREFIX are generated by the configure script. + # PYTHONPATH macro is the default search path. + # - pybuilddir.txt file + # - pyvenv.cfg configuration file + # - PyConfig fields ('config' function argument): + # + # - pathconfig_warnings + # - pythonpath_env (PYTHONPATH environment variable) + # + # - _PyPathConfig fields ('pathconfig' function argument): + # + # - program_name: see config_init_program_name() + # - home: Py_SetPythonHome() or PYTHONHOME environment variable + # + # - current working directory: see abspath() + # + # Outputs, 'pathconfig' fields: + # + # - program_full_path + # - module_search_path + # - prefix + # - exec_prefix + # + # If a field is already set (non NULL), it is left unchanged. + def calculate(self): + if self.pathconfig.program_full_path is None: + self.calculate_program() + + self.calculate_argv0_path() + + # If a pyvenv.cfg configure file is found, + # argv0_path is overriden with its 'home' variable. + self.calculate_read_pyenv() + + self.calculate_prefix() + self.calculate_zip_path() + self.calculate_exec_prefix() + + if ((self.prefix_found == 0 or self.exec_prefix_found == 0) + and self.warnings): + print("Consider setting $PYTHONHOME to [:]", + file=sys.stderr) + + if self.pathconfig.module_search_path is None: + self.calculate_module_search_path() + if self.pathconfig.prefix is None: + self.calculate_set_prefix() + if self.pathconfig.exec_prefix is None: + self.calculate_set_exec_prefix() + + +def computed(config): + return (config['module_search_paths_set'] + and config['executable'] is not None + and config['prefix'] is not None + and config['exec_prefix'] is not None) + + +def main(): + config = _cgetpath.get_config() + if computed(config): + return + + pathconfig = PathConfig() + pathconfig.set_from_config(config) + CalculatePath(pathconfig, config).calculate() + pathconfig.set_to_config(config) + + _cgetpath.set_config(config) + + +if __name__ == "__main__": + main() diff --git a/Lib/ctypes/test/test_values.py b/Lib/ctypes/test/test_values.py index 87eb9198ade0c73..b0ae426ea1fc788 100644 --- a/Lib/ctypes/test/test_values.py +++ b/Lib/ctypes/test/test_values.py @@ -64,6 +64,7 @@ class struct_frozen(Structure): bootstrap_expected = [ b'_frozen_importlib', b'_frozen_importlib_external', + b'_getpath', b'zipimport', ] for entry in ft: diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index 6c87b06634c4579..bcd2f5e9fa8ebc5 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -409,7 +409,7 @@ def _generate_posix_vars(): f.write('build_time_vars = ') pprint.pprint(vars, stream=f) - # Create file used for sys.path fixup -- see Modules/getpath.c + # Create file used for sys.path fixup -- see Lib/_getpath.py with open('pybuilddir.txt', 'w', encoding='utf8') as f: f.write(pybuilddir) diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index a7d912178a2ad4d..1d1cb1dd221a0b5 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -1008,6 +1008,7 @@ def test_init_dont_configure_locale(self): def test_init_read_set(self): config = { 'program_name': './init_read_set', + 'base_executable': 'my_executable', 'executable': 'my_executable', } def modify_path(path): diff --git a/Makefile.pre.in b/Makefile.pre.in index ee801ec46df73ee..fce70dd30d3bcc0 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -281,7 +281,7 @@ COVERAGE_REPORT_OPTIONS=--no-branch-coverage --title "CPython lcov report" # Modules MODULE_OBJS= \ Modules/config.o \ - Modules/getpath.o \ + Modules/_cgetpath.o \ Modules/main.o \ Modules/gcmodule.o @@ -584,7 +584,7 @@ platform: $(BUILDPYTHON) pybuilddir.txt # Create build directory and generate the sysconfig build-time data there. # pybuilddir.txt contains the name of the build dir and is used for -# sys.path fixup -- see Modules/getpath.c. +# sys.path fixup -- see Lib/_getpath.py. # Since this step runs before shared modules are built, try to avoid bootstrap # problems by creating a dummy pybuilddir.txt just to allow interpreter # initialization to succeed. It will be overwritten by generate-posix-vars @@ -742,6 +742,12 @@ regen-importlib: Programs/_freeze_importlib $(srcdir)/Lib/zipimport.py \ $(srcdir)/Python/importlib_zipimport.h.new $(UPDATE_FILE) $(srcdir)/Python/importlib_zipimport.h $(srcdir)/Python/importlib_zipimport.h.new + # Regenerate Python/getpath.h from Lib/_getpath.py + # using _freeze_importlib + ./Programs/_freeze_importlib getpath \ + $(srcdir)/Lib/_getpath.py \ + $(srcdir)/Python/getpath.h.new + $(UPDATE_FILE) $(srcdir)/Python/getpath.h $(srcdir)/Python/getpath.h.new ############################################################################ @@ -767,13 +773,13 @@ Modules/getbuildinfo.o: $(PARSER_OBJS) \ -DGITBRANCH="\"`LC_ALL=C $(GITBRANCH)`\"" \ -o $@ $(srcdir)/Modules/getbuildinfo.c -Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile +Modules/_cgetpath.o: $(srcdir)/Modules/_cgetpath.c Makefile $(CC) -c $(PY_CORE_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ -DPREFIX='"$(prefix)"' \ -DEXEC_PREFIX='"$(exec_prefix)"' \ -DVERSION='"$(VERSION)"' \ -DVPATH='"$(VPATH)"' \ - -o $@ $(srcdir)/Modules/getpath.c + -o $@ $(srcdir)/Modules/_cgetpath.c Programs/python.o: $(srcdir)/Programs/python.c $(MAINCC) -c $(PY_CORE_CFLAGS) -o $@ $(srcdir)/Programs/python.c @@ -950,7 +956,8 @@ regen-opcode-targets: Python/ceval.o: $(srcdir)/Python/opcode_targets.h $(srcdir)/Python/ceval_gil.h \ $(srcdir)/Python/condvar.h -Python/frozen.o: $(srcdir)/Python/importlib.h $(srcdir)/Python/importlib_external.h \ +Python/frozen.o: $(srcdir)/Python/getpath.h $(srcdir)/Python/importlib.h \ + $(srcdir)/Python/importlib_external.h \ $(srcdir)/Python/importlib_zipimport.h # Generate DTrace probe macros, then rename them (PYTHON_ -> PyDTrace_) to diff --git a/Modules/_cgetpath.c b/Modules/_cgetpath.c new file mode 100644 index 000000000000000..7df75df6bc44e07 --- /dev/null +++ b/Modules/_cgetpath.c @@ -0,0 +1,226 @@ +#include "Python.h" +#include "pycore_initconfig.h" // _PyStatus_EXCEPTION() +#include "clinic/_cgetpath.c.h" +#include "osdefs.h" // DELIM + +#if !defined(PREFIX) || !defined(EXEC_PREFIX) || !defined(VERSION) || !defined(VPATH) +# error "PREFIX, EXEC_PREFIX, VERSION and VPATH macros must be defined" +#endif + +/*[clinic input] +module _cgetpath +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=2ee51ad17253a32a]*/ + +static PyObject* +decode_locale(const char *str) +{ + size_t len; + wchar_t *wstr = Py_DecodeLocale(str, &len); + if (wstr == NULL) { + if (len == (size_t)-2) { + PyErr_SetString(PyExc_ValueError, + "Py_DecodeLocale failed to decode"); + } + else { + PyErr_NoMemory(); + } + return 0; + } + + PyObject *unicode = PyUnicode_FromWideChar(wstr, -1); + PyMem_RawFree(wstr); + return unicode; +} + +/*[clinic input] +_cgetpath.decode_locale + + str: str(accept={robuffer}) + / + +[clinic start generated code]*/ + +static PyObject * +_cgetpath_decode_locale_impl(PyObject *module, const char *str) +/*[clinic end generated code: output=53291003c8f4dc65 input=39ef5541c1823ef7]*/ +{ + return decode_locale(str); +} + + +/*[clinic input] +_cgetpath.get_config + +[clinic start generated code]*/ + +static PyObject * +_cgetpath_get_config_impl(PyObject *module) +/*[clinic end generated code: output=38e434c217fc678f input=c33d510b06e8ed50]*/ +/*[clinic end generated code]*/ +{ + PyConfig config; + PyConfig_InitIsolatedConfig(&config); + if (_PyInterpreterState_GetConfigCopy(&config) < 0) { + PyConfig_Clear(&config); + return NULL; + } + PyObject *dict = _PyConfig_AsDict(&config); + PyConfig_Clear(&config); + return dict; +} + + +/*[clinic input] +_cgetpath.set_config + + config as dict: object + / + +[clinic start generated code]*/ + +static PyObject * +_cgetpath_set_config(PyObject *module, PyObject *dict) +/*[clinic end generated code: output=73272b1a67b90ddf input=a222d368b44090f8]*/ +/*[clinic end generated code]*/ +{ + PyConfig config; + PyConfig_InitIsolatedConfig(&config); + if (_PyConfig_FromDict(&config, dict) < 0) { + PyConfig_Clear(&config); + return NULL; + } + if (_PyInterpreterState_SetConfig(&config) < 0) { + return NULL; + } + PyConfig_Clear(&config); + Py_RETURN_NONE; +} + + +#ifdef __APPLE__ +/*[clinic input] +_cgetpath._NSGetExecutablePath +[clinic start generated code]*/ + +static PyObject * +_cgetpath__NSGetExecutablePath_impl(PyObject *module) +/*[clinic end generated code: output=37ff1ed4de8a75cb input=2675b451446eca9a]*/ +{ + char execpath[MAXPATHLEN + 1]; + uint32_t nsexeclength = Py_ARRAY_LENGTH(execpath) - 1; + execpath[nsexeclength] = '\0'; + + if (_NSGetExecutablePath(execpath, &nsexeclength) != 0) { + Py_RETURN_NONE; + } + + return decode_locale(execpath); +} +#endif /* __APPLE__ */ + + +#ifdef WITH_NEXT_FRAMEWORK +/*[clinic input] +_cgetpath.NSLibraryName +[clinic start generated code]*/ + +static PyObject * +_cgetpath_NSLibraryName_impl(PyObject *module) +/*[clinic end generated code: output=2c1aade0f8e2dd09 input=3c4a291cd9952e45]*/ +{ + NSModule pythonModule; + + /* On Mac OS X we have a special case if we're running from a framework. + This is because the python home should be set relative to the library, + which is in the framework, not relative to the executable, which may + be outside of the framework. Except when we're in the build + directory... */ + pythonModule = NSModuleForSymbol(NSLookupAndBindSymbol("_Py_Initialize")); + + /* Use dylib functions to find out where the framework was loaded from */ + const char* modPath = NSLibraryNameForModule(pythonModule); + if (modPath == NULL) { + Py_RETURN_NONE; + } + + return decode_locale(modPath); +} +#endif + + +static PyMethodDef _cgetpath_methods[] = { + _CGETPATH_DECODE_LOCALE_METHODDEF + _CGETPATH_GET_CONFIG_METHODDEF + _CGETPATH_SET_CONFIG_METHODDEF + _CGETPATH__NSGETEXECUTABLEPATH_METHODDEF + _CGETPATH_NSLIBRARYNAME_METHODDEF + {NULL, NULL} /* Sentinel */ +}; + + +static int +cgetpathmodule_exec(PyObject *mod) +{ + // FIXME: fix ref leaks + if (PyModule_AddObject(mod, "PYTHONPATH", PyBytes_FromString(PYTHONPATH)) < 0) { + return -1; + } + if (PyModule_AddObject(mod, "PREFIX", PyBytes_FromString(PREFIX)) < 0) { + return -1; + } + if (PyModule_AddObject(mod, "EXEC_PREFIX", PyBytes_FromString(EXEC_PREFIX)) < 0) { + return -1; + } + if (PyModule_AddObject(mod, "VPATH", PyBytes_FromString(VPATH)) < 0) { + return -1; + } + if (PyModule_AddObject(mod, "VERSION", PyBytes_FromString(VERSION)) < 0) { + return -1; + } +#ifdef WITH_NEXT_FRAMEWORK + PyObject *flag = Py_True; +#else + PyObject *flag = Py_False; +#endif + if (PyModule_AddObjectRef(mod, "WITH_NEXT_FRAMEWORK", flag) < 0) { + return -1; + } + const wchar_t delimiter[2] = {DELIM, '\0'}; + if (PyModule_AddObject(mod, "DELIM", + PyUnicode_FromWideChar(delimiter, -1)) < 0) { + return -1; + } + const wchar_t separator[2] = {SEP, '\0'}; + if (PyModule_AddObject(mod, "SEP", + PyUnicode_FromWideChar(separator, -1)) < 0) { + return -1; + } + return 0; +} + + +static PyModuleDef_Slot cgetpathmodile_slots[] = { + {Py_mod_exec, cgetpathmodule_exec}, + {0, NULL} +}; + +static struct PyModuleDef cgetpathmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "_cgetpath", + .m_doc = NULL, + .m_size = 0, + .m_methods = _cgetpath_methods, + .m_slots = cgetpathmodile_slots, +}; + +PyMODINIT_FUNC +PyInit__cgetpath(void) +{ + return PyModuleDef_Init(&cgetpathmodule); +} + +#ifdef __cplusplus +} +#endif + diff --git a/Modules/clinic/_cgetpath.c.h b/Modules/clinic/_cgetpath.c.h new file mode 100644 index 000000000000000..ddafd8236b5d9ef --- /dev/null +++ b/Modules/clinic/_cgetpath.c.h @@ -0,0 +1,105 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(_cgetpath_decode_locale__doc__, +"decode_locale($module, str, /)\n" +"--\n" +"\n"); + +#define _CGETPATH_DECODE_LOCALE_METHODDEF \ + {"decode_locale", (PyCFunction)_cgetpath_decode_locale, METH_O, _cgetpath_decode_locale__doc__}, + +static PyObject * +_cgetpath_decode_locale_impl(PyObject *module, const char *str); + +static PyObject * +_cgetpath_decode_locale(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + const char *str; + + if (!PyArg_Parse(arg, "y:decode_locale", &str)) { + goto exit; + } + return_value = _cgetpath_decode_locale_impl(module, str); + +exit: + return return_value; +} + +PyDoc_STRVAR(_cgetpath_get_config__doc__, +"get_config($module, /)\n" +"--\n" +"\n"); + +#define _CGETPATH_GET_CONFIG_METHODDEF \ + {"get_config", (PyCFunction)_cgetpath_get_config, METH_NOARGS, _cgetpath_get_config__doc__}, + +static PyObject * +_cgetpath_get_config_impl(PyObject *module); + +static PyObject * +_cgetpath_get_config(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return _cgetpath_get_config_impl(module); +} + +PyDoc_STRVAR(_cgetpath_set_config__doc__, +"set_config($module, config, /)\n" +"--\n" +"\n"); + +#define _CGETPATH_SET_CONFIG_METHODDEF \ + {"set_config", (PyCFunction)_cgetpath_set_config, METH_O, _cgetpath_set_config__doc__}, + +#if defined(__APPLE__) + +PyDoc_STRVAR(_cgetpath__NSGetExecutablePath__doc__, +"_NSGetExecutablePath($module, /)\n" +"--\n" +"\n"); + +#define _CGETPATH__NSGETEXECUTABLEPATH_METHODDEF \ + {"_NSGetExecutablePath", (PyCFunction)_cgetpath__NSGetExecutablePath, METH_NOARGS, _cgetpath__NSGetExecutablePath__doc__}, + +static PyObject * +_cgetpath__NSGetExecutablePath_impl(PyObject *module); + +static PyObject * +_cgetpath__NSGetExecutablePath(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return _cgetpath__NSGetExecutablePath_impl(module); +} + +#endif /* defined(__APPLE__) */ + +#if defined(WITH_NEXT_FRAMEWORK) + +PyDoc_STRVAR(_cgetpath_NSLibraryName__doc__, +"NSLibraryName($module, /)\n" +"--\n" +"\n"); + +#define _CGETPATH_NSLIBRARYNAME_METHODDEF \ + {"NSLibraryName", (PyCFunction)_cgetpath_NSLibraryName, METH_NOARGS, _cgetpath_NSLibraryName__doc__}, + +static PyObject * +_cgetpath_NSLibraryName_impl(PyObject *module); + +static PyObject * +_cgetpath_NSLibraryName(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return _cgetpath_NSLibraryName_impl(module); +} + +#endif /* defined(WITH_NEXT_FRAMEWORK) */ + +#ifndef _CGETPATH__NSGETEXECUTABLEPATH_METHODDEF + #define _CGETPATH__NSGETEXECUTABLEPATH_METHODDEF +#endif /* !defined(_CGETPATH__NSGETEXECUTABLEPATH_METHODDEF) */ + +#ifndef _CGETPATH_NSLIBRARYNAME_METHODDEF + #define _CGETPATH_NSLIBRARYNAME_METHODDEF +#endif /* !defined(_CGETPATH_NSLIBRARYNAME_METHODDEF) */ +/*[clinic end generated code: output=c281e1bff9ca7d4c input=a9049054013a1b77]*/ diff --git a/Modules/config.c.in b/Modules/config.c.in index d69e8e88b0ca458..602ba6dcae890e9 100644 --- a/Modules/config.c.in +++ b/Modules/config.c.in @@ -30,6 +30,7 @@ extern PyObject* PyInit_gc(void); extern PyObject* PyInit__ast(void); extern PyObject* _PyWarnings_Init(void); extern PyObject* PyInit__string(void); +extern PyObject* PyInit__cgetpath(void); struct _inittab _PyImport_Inittab[] = { @@ -57,6 +58,9 @@ struct _inittab _PyImport_Inittab[] = { /* This lives in Objects/unicodeobject.c */ {"_string", PyInit__string}, + /* This lives in Modules/_cgetpath.c */ + {"_cgetpath", PyInit__cgetpath}, + /* Sentinel */ {0, 0} }; diff --git a/Modules/getpath.c b/Modules/getpath.c deleted file mode 100644 index 44453f29df703a4..000000000000000 --- a/Modules/getpath.c +++ /dev/null @@ -1,1619 +0,0 @@ -/* Return the initial module search path. */ - -#include "Python.h" -#include "pycore_fileutils.h" -#include "pycore_initconfig.h" -#include "pycore_pathconfig.h" -#include "osdefs.h" // DELIM - -#include -#include - -#ifdef __APPLE__ -# include -#endif - -/* Search in some common locations for the associated Python libraries. - * - * Two directories must be found, the platform independent directory - * (prefix), containing the common .py and .pyc files, and the platform - * dependent directory (exec_prefix), containing the shared library - * modules. Note that prefix and exec_prefix can be the same directory, - * but for some installations, they are different. - * - * Py_GetPath() carries out separate searches for prefix and exec_prefix. - * Each search tries a number of different locations until a ``landmark'' - * file or directory is found. If no prefix or exec_prefix is found, a - * warning message is issued and the preprocessor defined PREFIX and - * EXEC_PREFIX are used (even though they will not work); python carries on - * as best as is possible, but most imports will fail. - * - * Before any searches are done, the location of the executable is - * determined. If argv[0] has one or more slashes in it, it is used - * unchanged. Otherwise, it must have been invoked from the shell's path, - * so we search $PATH for the named executable and use that. If the - * executable was not found on $PATH (or there was no $PATH environment - * variable), the original argv[0] string is used. - * - * Next, the executable location is examined to see if it is a symbolic - * link. If so, the link is chased (correctly interpreting a relative - * pathname if one is found) and the directory of the link target is used. - * - * Finally, argv0_path is set to the directory containing the executable - * (i.e. the last component is stripped). - * - * With argv0_path in hand, we perform a number of steps. The same steps - * are performed for prefix and for exec_prefix, but with a different - * landmark. - * - * Step 1. Are we running python out of the build directory? This is - * checked by looking for a different kind of landmark relative to - * argv0_path. For prefix, the landmark's path is derived from the VPATH - * preprocessor variable (taking into account that its value is almost, but - * not quite, what we need). For exec_prefix, the landmark is - * pybuilddir.txt. If the landmark is found, we're done. - * - * For the remaining steps, the prefix landmark will always be - * lib/python$VERSION/os.py and the exec_prefix will always be - * lib/python$VERSION/lib-dynload, where $VERSION is Python's version - * number as supplied by the Makefile. Note that this means that no more - * build directory checking is performed; if the first step did not find - * the landmarks, the assumption is that python is running from an - * installed setup. - * - * Step 2. See if the $PYTHONHOME environment variable points to the - * installed location of the Python libraries. If $PYTHONHOME is set, then - * it points to prefix and exec_prefix. $PYTHONHOME can be a single - * directory, which is used for both, or the prefix and exec_prefix - * directories separated by a colon. - * - * Step 3. Try to find prefix and exec_prefix relative to argv0_path, - * backtracking up the path until it is exhausted. This is the most common - * step to succeed. Note that if prefix and exec_prefix are different, - * exec_prefix is more likely to be found; however if exec_prefix is a - * subdirectory of prefix, both will be found. - * - * Step 4. Search the directories pointed to by the preprocessor variables - * PREFIX and EXEC_PREFIX. These are supplied by the Makefile but can be - * passed in as options to the configure script. - * - * That's it! - * - * Well, almost. Once we have determined prefix and exec_prefix, the - * preprocessor variable PYTHONPATH is used to construct a path. Each - * relative path on PYTHONPATH is prefixed with prefix. Then the directory - * containing the shared library modules is appended. The environment - * variable $PYTHONPATH is inserted in front of it all. Finally, the - * prefix and exec_prefix globals are tweaked so they reflect the values - * expected by other code, by stripping the "lib/python$VERSION/..." stuff - * off. If either points to the build directory, the globals are reset to - * the corresponding preprocessor variables (so sys.prefix will reflect the - * installation location, even though sys.path points into the build - * directory). This seems to make more sense given that currently the only - * known use of sys.prefix and sys.exec_prefix is for the ILU installation - * process to find the installed Python tree. - * - * An embedding application can use Py_SetPath() to override all of - * these automatic path computations. - * - * NOTE: Windows MSVC builds use PC/getpathp.c instead! - */ - -#ifdef __cplusplus -extern "C" { -#endif - - -#if (!defined(PREFIX) || !defined(EXEC_PREFIX) \ - || !defined(VERSION) || !defined(VPATH)) -#error "PREFIX, EXEC_PREFIX, VERSION and VPATH macros must be defined" -#endif - -#ifndef LANDMARK -#define LANDMARK L"os.py" -#endif - -#define BUILD_LANDMARK L"Modules/Setup.local" - -#define DECODE_LOCALE_ERR(NAME, LEN) \ - ((LEN) == (size_t)-2) \ - ? _PyStatus_ERR("cannot decode " NAME) \ - : _PyStatus_NO_MEMORY() - -#define PATHLEN_ERR() _PyStatus_ERR("path configuration: path too long") - -typedef struct { - wchar_t *path_env; /* PATH environment variable */ - - wchar_t *pythonpath_macro; /* PYTHONPATH macro */ - wchar_t *prefix_macro; /* PREFIX macro */ - wchar_t *exec_prefix_macro; /* EXEC_PREFIX macro */ - wchar_t *vpath_macro; /* VPATH macro */ - - wchar_t *lib_python; /* / "pythonX.Y" */ - - int prefix_found; /* found platform independent libraries? */ - int exec_prefix_found; /* found the platform dependent libraries? */ - - int warnings; - const wchar_t *pythonpath_env; - const wchar_t *platlibdir; - - wchar_t *argv0_path; - wchar_t *zip_path; - wchar_t *prefix; - wchar_t *exec_prefix; -} PyCalculatePath; - -static const wchar_t delimiter[2] = {DELIM, '\0'}; -static const wchar_t separator[2] = {SEP, '\0'}; - - -/* Get file status. Encode the path to the locale encoding. */ -static int -_Py_wstat(const wchar_t* path, struct stat *buf) -{ - int err; - char *fname; - fname = _Py_EncodeLocaleRaw(path, NULL); - if (fname == NULL) { - errno = EINVAL; - return -1; - } - err = stat(fname, buf); - PyMem_RawFree(fname); - return err; -} - - -static void -reduce(wchar_t *dir) -{ - size_t i = wcslen(dir); - while (i > 0 && dir[i] != SEP) { - --i; - } - dir[i] = '\0'; -} - - -/* Is file, not directory */ -static int -isfile(const wchar_t *filename) -{ - struct stat buf; - if (_Py_wstat(filename, &buf) != 0) { - return 0; - } - if (!S_ISREG(buf.st_mode)) { - return 0; - } - return 1; -} - - -/* Is executable file */ -static int -isxfile(const wchar_t *filename) -{ - struct stat buf; - if (_Py_wstat(filename, &buf) != 0) { - return 0; - } - if (!S_ISREG(buf.st_mode)) { - return 0; - } - if ((buf.st_mode & 0111) == 0) { - return 0; - } - return 1; -} - - -/* Is directory */ -static int -isdir(const wchar_t *filename) -{ - struct stat buf; - if (_Py_wstat(filename, &buf) != 0) { - return 0; - } - if (!S_ISDIR(buf.st_mode)) { - return 0; - } - return 1; -} - - -/* Add a path component, by appending stuff to buffer. - buflen: 'buffer' length in characters including trailing NUL. - - If path2 is empty: - - - if path doesn't end with SEP and is not empty, add SEP to path - - otherwise, do nothing. */ -static PyStatus -joinpath(wchar_t *path, const wchar_t *path2, size_t path_len) -{ - size_t n; - if (!_Py_isabs(path2)) { - n = wcslen(path); - if (n >= path_len) { - return PATHLEN_ERR(); - } - - if (n > 0 && path[n-1] != SEP) { - path[n++] = SEP; - } - } - else { - n = 0; - } - - size_t k = wcslen(path2); - if (n + k >= path_len) { - return PATHLEN_ERR(); - } - wcsncpy(path + n, path2, k); - path[n + k] = '\0'; - - return _PyStatus_OK(); -} - - -static wchar_t* -substring(const wchar_t *str, size_t len) -{ - wchar_t *substr = PyMem_RawMalloc((len + 1) * sizeof(wchar_t)); - if (substr == NULL) { - return NULL; - } - - if (len) { - memcpy(substr, str, len * sizeof(wchar_t)); - } - substr[len] = L'\0'; - return substr; -} - - -static wchar_t* -joinpath2(const wchar_t *path, const wchar_t *path2) -{ - if (_Py_isabs(path2)) { - return _PyMem_RawWcsdup(path2); - } - - size_t len = wcslen(path); - int add_sep = (len > 0 && path[len - 1] != SEP); - len += add_sep; - len += wcslen(path2); - - wchar_t *new_path = PyMem_RawMalloc((len + 1) * sizeof(wchar_t)); - if (new_path == NULL) { - return NULL; - } - - wcscpy(new_path, path); - if (add_sep) { - wcscat(new_path, separator); - } - wcscat(new_path, path2); - return new_path; -} - - -static inline int -safe_wcscpy(wchar_t *dst, const wchar_t *src, size_t n) -{ - size_t srclen = wcslen(src); - if (n <= srclen) { - dst[0] = L'\0'; - return -1; - } - memcpy(dst, src, (srclen + 1) * sizeof(wchar_t)); - return 0; -} - - -/* copy_absolute requires that path be allocated at least - 'abs_path_len' characters (including trailing NUL). */ -static PyStatus -copy_absolute(wchar_t *abs_path, const wchar_t *path, size_t abs_path_len) -{ - if (_Py_isabs(path)) { - if (safe_wcscpy(abs_path, path, abs_path_len) < 0) { - return PATHLEN_ERR(); - } - } - else { - if (!_Py_wgetcwd(abs_path, abs_path_len)) { - /* unable to get the current directory */ - if (safe_wcscpy(abs_path, path, abs_path_len) < 0) { - return PATHLEN_ERR(); - } - return _PyStatus_OK(); - } - if (path[0] == '.' && path[1] == SEP) { - path += 2; - } - PyStatus status = joinpath(abs_path, path, abs_path_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - } - return _PyStatus_OK(); -} - - -/* path_len: path length in characters including trailing NUL */ -static PyStatus -absolutize(wchar_t **path_p) -{ - assert(!_Py_isabs(*path_p)); - - wchar_t abs_path[MAXPATHLEN+1]; - wchar_t *path = *path_p; - - PyStatus status = copy_absolute(abs_path, path, Py_ARRAY_LENGTH(abs_path)); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - PyMem_RawFree(*path_p); - *path_p = _PyMem_RawWcsdup(abs_path); - if (*path_p == NULL) { - return _PyStatus_NO_MEMORY(); - } - return _PyStatus_OK(); -} - - -/* Is module -- check for .pyc too */ -static PyStatus -ismodule(const wchar_t *path, int *result) -{ - wchar_t *filename = joinpath2(path, LANDMARK); - if (filename == NULL) { - return _PyStatus_NO_MEMORY(); - } - - if (isfile(filename)) { - PyMem_RawFree(filename); - *result = 1; - return _PyStatus_OK(); - } - - /* Check for the compiled version of prefix. */ - size_t len = wcslen(filename); - wchar_t *pyc = PyMem_RawMalloc((len + 2) * sizeof(wchar_t)); - if (pyc == NULL) { - PyMem_RawFree(filename); - return _PyStatus_NO_MEMORY(); - } - - memcpy(pyc, filename, len * sizeof(wchar_t)); - pyc[len] = L'c'; - pyc[len + 1] = L'\0'; - *result = isfile(pyc); - - PyMem_RawFree(filename); - PyMem_RawFree(pyc); - - return _PyStatus_OK(); -} - - -#if defined(__CYGWIN__) || defined(__MINGW32__) -#ifndef EXE_SUFFIX -#define EXE_SUFFIX L".exe" -#endif - -/* pathlen: 'path' length in characters including trailing NUL */ -static PyStatus -add_exe_suffix(wchar_t **progpath_p) -{ - wchar_t *progpath = *progpath_p; - - /* Check for already have an executable suffix */ - size_t n = wcslen(progpath); - size_t s = wcslen(EXE_SUFFIX); - if (wcsncasecmp(EXE_SUFFIX, progpath + n - s, s) == 0) { - return _PyStatus_OK(); - } - - wchar_t *progpath2 = PyMem_RawMalloc((n + s + 1) * sizeof(wchar_t)); - if (progpath2 == NULL) { - return _PyStatus_NO_MEMORY(); - } - - memcpy(progpath2, progpath, n * sizeof(wchar_t)); - memcpy(progpath2 + n, EXE_SUFFIX, s * sizeof(wchar_t)); - progpath2[n+s] = L'\0'; - - if (isxfile(progpath2)) { - PyMem_RawFree(*progpath_p); - *progpath_p = progpath2; - } - else { - PyMem_RawFree(progpath2); - } - return _PyStatus_OK(); -} -#endif - - -/* search_for_prefix requires that argv0_path be no more than MAXPATHLEN - bytes long. -*/ -static PyStatus -search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, - wchar_t *prefix, size_t prefix_len, int *found) -{ - PyStatus status; - - /* If PYTHONHOME is set, we believe it unconditionally */ - if (pathconfig->home) { - /* Path: / */ - if (safe_wcscpy(prefix, pathconfig->home, prefix_len) < 0) { - return PATHLEN_ERR(); - } - wchar_t *delim = wcschr(prefix, DELIM); - if (delim) { - *delim = L'\0'; - } - status = joinpath(prefix, calculate->lib_python, prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - *found = 1; - return _PyStatus_OK(); - } - - /* Check to see if argv0_path is in the build directory - - Path: / */ - wchar_t *path = joinpath2(calculate->argv0_path, BUILD_LANDMARK); - if (path == NULL) { - return _PyStatus_NO_MEMORY(); - } - - int is_build_dir = isfile(path); - PyMem_RawFree(path); - - if (is_build_dir) { - /* argv0_path is the build directory (BUILD_LANDMARK exists), - now also check LANDMARK using ismodule(). */ - - /* Path: / / Lib */ - /* or if VPATH is empty: / Lib */ - if (safe_wcscpy(prefix, calculate->argv0_path, prefix_len) < 0) { - return PATHLEN_ERR(); - } - - status = joinpath(prefix, calculate->vpath_macro, prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = joinpath(prefix, L"Lib", prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - int module; - status = ismodule(prefix, &module); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - if (module) { - /* BUILD_LANDMARK and LANDMARK found */ - *found = -1; - return _PyStatus_OK(); - } - } - - /* Search from argv0_path, until root is found */ - status = copy_absolute(prefix, calculate->argv0_path, prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - do { - /* Path: / / LANDMARK */ - size_t n = wcslen(prefix); - status = joinpath(prefix, calculate->lib_python, prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - int module; - status = ismodule(prefix, &module); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - if (module) { - *found = 1; - return _PyStatus_OK(); - } - prefix[n] = L'\0'; - reduce(prefix); - } while (prefix[0]); - - /* Look at configure's PREFIX. - Path: / / LANDMARK */ - if (safe_wcscpy(prefix, calculate->prefix_macro, prefix_len) < 0) { - return PATHLEN_ERR(); - } - status = joinpath(prefix, calculate->lib_python, prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - int module; - status = ismodule(prefix, &module); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - if (module) { - *found = 1; - return _PyStatus_OK(); - } - - /* Fail */ - *found = 0; - return _PyStatus_OK(); -} - - -static PyStatus -calculate_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig) -{ - wchar_t prefix[MAXPATHLEN+1]; - memset(prefix, 0, sizeof(prefix)); - size_t prefix_len = Py_ARRAY_LENGTH(prefix); - - PyStatus status; - status = search_for_prefix(calculate, pathconfig, - prefix, prefix_len, - &calculate->prefix_found); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - if (!calculate->prefix_found) { - if (calculate->warnings) { - fprintf(stderr, - "Could not find platform independent libraries \n"); - } - - calculate->prefix = joinpath2(calculate->prefix_macro, - calculate->lib_python); - } - else { - calculate->prefix = _PyMem_RawWcsdup(prefix); - } - - if (calculate->prefix == NULL) { - return _PyStatus_NO_MEMORY(); - } - return _PyStatus_OK(); -} - - -static PyStatus -calculate_set_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig) -{ - /* Reduce prefix and exec_prefix to their essence, - * e.g. /usr/local/lib/python1.5 is reduced to /usr/local. - * If we're loading relative to the build directory, - * return the compiled-in defaults instead. - */ - if (calculate->prefix_found > 0) { - wchar_t *prefix = _PyMem_RawWcsdup(calculate->prefix); - if (prefix == NULL) { - return _PyStatus_NO_MEMORY(); - } - - reduce(prefix); - reduce(prefix); - if (prefix[0]) { - pathconfig->prefix = prefix; - } - else { - PyMem_RawFree(prefix); - - /* The prefix is the root directory, but reduce() chopped - off the "/". */ - pathconfig->prefix = _PyMem_RawWcsdup(separator); - if (pathconfig->prefix == NULL) { - return _PyStatus_NO_MEMORY(); - } - } - } - else { - pathconfig->prefix = _PyMem_RawWcsdup(calculate->prefix_macro); - if (pathconfig->prefix == NULL) { - return _PyStatus_NO_MEMORY(); - } - } - return _PyStatus_OK(); -} - - -static PyStatus -calculate_pybuilddir(const wchar_t *argv0_path, - wchar_t *exec_prefix, size_t exec_prefix_len, - int *found) -{ - PyStatus status; - - /* Check to see if argv[0] is in the build directory. "pybuilddir.txt" - is written by setup.py and contains the relative path to the location - of shared library modules. - - Filename: / "pybuilddir.txt" */ - wchar_t *filename = joinpath2(argv0_path, L"pybuilddir.txt"); - if (filename == NULL) { - return _PyStatus_NO_MEMORY(); - } - - FILE *fp = _Py_wfopen(filename, L"rb"); - PyMem_RawFree(filename); - if (fp == NULL) { - errno = 0; - return _PyStatus_OK(); - } - - char buf[MAXPATHLEN + 1]; - size_t n = fread(buf, 1, Py_ARRAY_LENGTH(buf) - 1, fp); - buf[n] = '\0'; - fclose(fp); - - size_t dec_len; - wchar_t *pybuilddir = _Py_DecodeUTF8_surrogateescape(buf, n, &dec_len); - if (!pybuilddir) { - return DECODE_LOCALE_ERR("pybuilddir.txt", dec_len); - } - - /* Path: / */ - if (safe_wcscpy(exec_prefix, argv0_path, exec_prefix_len) < 0) { - PyMem_RawFree(pybuilddir); - return PATHLEN_ERR(); - } - status = joinpath(exec_prefix, pybuilddir, exec_prefix_len); - PyMem_RawFree(pybuilddir); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - *found = -1; - return _PyStatus_OK(); -} - - -/* search_for_exec_prefix requires that argv0_path be no more than - MAXPATHLEN bytes long. -*/ -static PyStatus -search_for_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, - wchar_t *exec_prefix, size_t exec_prefix_len, - int *found) -{ - PyStatus status; - - /* If PYTHONHOME is set, we believe it unconditionally */ - if (pathconfig->home) { - /* Path: / / "lib-dynload" */ - wchar_t *delim = wcschr(pathconfig->home, DELIM); - if (delim) { - if (safe_wcscpy(exec_prefix, delim+1, exec_prefix_len) < 0) { - return PATHLEN_ERR(); - } - } - else { - if (safe_wcscpy(exec_prefix, pathconfig->home, exec_prefix_len) < 0) { - return PATHLEN_ERR(); - } - } - status = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - status = joinpath(exec_prefix, L"lib-dynload", exec_prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - *found = 1; - return _PyStatus_OK(); - } - - /* Check for pybuilddir.txt */ - assert(*found == 0); - status = calculate_pybuilddir(calculate->argv0_path, - exec_prefix, exec_prefix_len, found); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - if (*found) { - return _PyStatus_OK(); - } - - /* Search from argv0_path, until root is found */ - status = copy_absolute(exec_prefix, calculate->argv0_path, exec_prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - do { - /* Path: / / "lib-dynload" */ - size_t n = wcslen(exec_prefix); - status = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - status = joinpath(exec_prefix, L"lib-dynload", exec_prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - if (isdir(exec_prefix)) { - *found = 1; - return _PyStatus_OK(); - } - exec_prefix[n] = L'\0'; - reduce(exec_prefix); - } while (exec_prefix[0]); - - /* Look at configure's EXEC_PREFIX. - - Path: / / "lib-dynload" */ - if (safe_wcscpy(exec_prefix, calculate->exec_prefix_macro, exec_prefix_len) < 0) { - return PATHLEN_ERR(); - } - status = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - status = joinpath(exec_prefix, L"lib-dynload", exec_prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - if (isdir(exec_prefix)) { - *found = 1; - return _PyStatus_OK(); - } - - /* Fail */ - *found = 0; - return _PyStatus_OK(); -} - - -static PyStatus -calculate_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig) -{ - PyStatus status; - wchar_t exec_prefix[MAXPATHLEN+1]; - memset(exec_prefix, 0, sizeof(exec_prefix)); - size_t exec_prefix_len = Py_ARRAY_LENGTH(exec_prefix); - - status = search_for_exec_prefix(calculate, pathconfig, - exec_prefix, exec_prefix_len, - &calculate->exec_prefix_found); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - if (!calculate->exec_prefix_found) { - if (calculate->warnings) { - fprintf(stderr, - "Could not find platform dependent libraries \n"); - } - - /* / "lib-dynload" */ - wchar_t *lib_dynload = joinpath2(calculate->platlibdir, - L"lib-dynload"); - if (lib_dynload == NULL) { - return _PyStatus_NO_MEMORY(); - } - - calculate->exec_prefix = joinpath2(calculate->exec_prefix_macro, - lib_dynload); - PyMem_RawFree(lib_dynload); - - if (calculate->exec_prefix == NULL) { - return _PyStatus_NO_MEMORY(); - } - } - else { - /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */ - calculate->exec_prefix = _PyMem_RawWcsdup(exec_prefix); - if (calculate->exec_prefix == NULL) { - return _PyStatus_NO_MEMORY(); - } - } - return _PyStatus_OK(); -} - - -static PyStatus -calculate_set_exec_prefix(PyCalculatePath *calculate, - _PyPathConfig *pathconfig) -{ - if (calculate->exec_prefix_found > 0) { - wchar_t *exec_prefix = _PyMem_RawWcsdup(calculate->exec_prefix); - if (exec_prefix == NULL) { - return _PyStatus_NO_MEMORY(); - } - - reduce(exec_prefix); - reduce(exec_prefix); - reduce(exec_prefix); - - if (exec_prefix[0]) { - pathconfig->exec_prefix = exec_prefix; - } - else { - /* empty string: use SEP instead */ - PyMem_RawFree(exec_prefix); - - /* The exec_prefix is the root directory, but reduce() chopped - off the "/". */ - pathconfig->exec_prefix = _PyMem_RawWcsdup(separator); - if (pathconfig->exec_prefix == NULL) { - return _PyStatus_NO_MEMORY(); - } - } - } - else { - pathconfig->exec_prefix = _PyMem_RawWcsdup(calculate->exec_prefix_macro); - if (pathconfig->exec_prefix == NULL) { - return _PyStatus_NO_MEMORY(); - } - } - return _PyStatus_OK(); -} - - -/* Similar to shutil.which(). - If found, write the path into *abs_path_p. */ -static PyStatus -calculate_which(const wchar_t *path_env, wchar_t *program_name, - wchar_t **abs_path_p) -{ - while (1) { - wchar_t *delim = wcschr(path_env, DELIM); - wchar_t *abs_path; - - if (delim) { - wchar_t *path = substring(path_env, delim - path_env); - if (path == NULL) { - return _PyStatus_NO_MEMORY(); - } - abs_path = joinpath2(path, program_name); - PyMem_RawFree(path); - } - else { - abs_path = joinpath2(path_env, program_name); - } - - if (abs_path == NULL) { - return _PyStatus_NO_MEMORY(); - } - - if (isxfile(abs_path)) { - *abs_path_p = abs_path; - return _PyStatus_OK(); - } - PyMem_RawFree(abs_path); - - if (!delim) { - break; - } - path_env = delim + 1; - } - - /* not found */ - return _PyStatus_OK(); -} - - -#ifdef __APPLE__ -static PyStatus -calculate_program_macos(wchar_t **abs_path_p) -{ - char execpath[MAXPATHLEN + 1]; - uint32_t nsexeclength = Py_ARRAY_LENGTH(execpath) - 1; - - /* On Mac OS X, if a script uses an interpreter of the form - "#!/opt/python2.3/bin/python", the kernel only passes "python" - as argv[0], which falls through to the $PATH search below. - If /opt/python2.3/bin isn't in your path, or is near the end, - this algorithm may incorrectly find /usr/bin/python. To work - around this, we can use _NSGetExecutablePath to get a better - hint of what the intended interpreter was, although this - will fail if a relative path was used. but in that case, - absolutize() should help us out below - */ - if (_NSGetExecutablePath(execpath, &nsexeclength) != 0 - || (wchar_t)execpath[0] != SEP) - { - /* _NSGetExecutablePath() failed or the path is relative */ - return _PyStatus_OK(); - } - - size_t len; - *abs_path_p = Py_DecodeLocale(execpath, &len); - if (*abs_path_p == NULL) { - return DECODE_LOCALE_ERR("executable path", len); - } - return _PyStatus_OK(); -} -#endif /* __APPLE__ */ - - -static PyStatus -calculate_program_impl(PyCalculatePath *calculate, _PyPathConfig *pathconfig) -{ - assert(pathconfig->program_full_path == NULL); - - PyStatus status; - - /* If there is no slash in the argv0 path, then we have to - * assume python is on the user's $PATH, since there's no - * other way to find a directory to start the search from. If - * $PATH isn't exported, you lose. - */ - if (wcschr(pathconfig->program_name, SEP)) { - pathconfig->program_full_path = _PyMem_RawWcsdup(pathconfig->program_name); - if (pathconfig->program_full_path == NULL) { - return _PyStatus_NO_MEMORY(); - } - return _PyStatus_OK(); - } - -#ifdef __APPLE__ - wchar_t *abs_path = NULL; - status = calculate_program_macos(&abs_path); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - if (abs_path) { - pathconfig->program_full_path = abs_path; - return _PyStatus_OK(); - } -#endif /* __APPLE__ */ - - if (calculate->path_env) { - wchar_t *abs_path = NULL; - status = calculate_which(calculate->path_env, pathconfig->program_name, - &abs_path); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - if (abs_path) { - pathconfig->program_full_path = abs_path; - return _PyStatus_OK(); - } - } - - /* In the last resort, use an empty string */ - pathconfig->program_full_path = _PyMem_RawWcsdup(L""); - if (pathconfig->program_full_path == NULL) { - return _PyStatus_NO_MEMORY(); - } - return _PyStatus_OK(); -} - - -/* Calculate pathconfig->program_full_path */ -static PyStatus -calculate_program(PyCalculatePath *calculate, _PyPathConfig *pathconfig) -{ - PyStatus status; - - status = calculate_program_impl(calculate, pathconfig); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - if (pathconfig->program_full_path[0] != '\0') { - /* program_full_path is not empty */ - - /* Make sure that program_full_path is an absolute path */ - if (!_Py_isabs(pathconfig->program_full_path)) { - status = absolutize(&pathconfig->program_full_path); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - } - -#if defined(__CYGWIN__) || defined(__MINGW32__) - /* For these platforms it is necessary to ensure that the .exe suffix - * is appended to the filename, otherwise there is potential for - * sys.executable to return the name of a directory under the same - * path (bpo-28441). - */ - status = add_exe_suffix(&pathconfig->program_full_path); - if (_PyStatus_EXCEPTION(status)) { - return status; - } -#endif - } - return _PyStatus_OK(); -} - - -#if HAVE_READLINK -static PyStatus -resolve_symlinks(wchar_t **path_p) -{ - wchar_t new_path[MAXPATHLEN + 1]; - const size_t new_path_len = Py_ARRAY_LENGTH(new_path); - unsigned int nlink = 0; - - while (1) { - int linklen = _Py_wreadlink(*path_p, new_path, new_path_len); - if (linklen == -1) { - /* not a symbolic link: we are done */ - break; - } - - if (_Py_isabs(new_path)) { - PyMem_RawFree(*path_p); - *path_p = _PyMem_RawWcsdup(new_path); - if (*path_p == NULL) { - return _PyStatus_NO_MEMORY(); - } - } - else { - /* new_path is relative to path */ - reduce(*path_p); - - wchar_t *abs_path = joinpath2(*path_p, new_path); - if (abs_path == NULL) { - return _PyStatus_NO_MEMORY(); - } - - PyMem_RawFree(*path_p); - *path_p = abs_path; - } - - nlink++; - /* 40 is the Linux kernel 4.2 limit */ - if (nlink >= 40) { - return _PyStatus_ERR("maximum number of symbolic links reached"); - } - } - return _PyStatus_OK(); -} -#endif /* HAVE_READLINK */ - - -#ifdef WITH_NEXT_FRAMEWORK -static PyStatus -calculate_argv0_path_framework(PyCalculatePath *calculate, _PyPathConfig *pathconfig) -{ - NSModule pythonModule; - - /* On Mac OS X we have a special case if we're running from a framework. - This is because the python home should be set relative to the library, - which is in the framework, not relative to the executable, which may - be outside of the framework. Except when we're in the build - directory... */ - pythonModule = NSModuleForSymbol(NSLookupAndBindSymbol("_Py_Initialize")); - - /* Use dylib functions to find out where the framework was loaded from */ - const char* modPath = NSLibraryNameForModule(pythonModule); - if (modPath == NULL) { - return _PyStatus_OK(); - } - - /* We're in a framework. - See if we might be in the build directory. The framework in the - build directory is incomplete, it only has the .dylib and a few - needed symlinks, it doesn't have the Lib directories and such. - If we're running with the framework from the build directory we must - be running the interpreter in the build directory, so we use the - build-directory-specific logic to find Lib and such. */ - size_t len; - wchar_t* wbuf = Py_DecodeLocale(modPath, &len); - if (wbuf == NULL) { - return DECODE_LOCALE_ERR("framework location", len); - } - - /* Path: reduce(modPath) / lib_python / LANDMARK */ - PyStatus status; - - wchar_t *parent = _PyMem_RawWcsdup(wbuf); - if (parent == NULL) { - status = _PyStatus_NO_MEMORY(); - goto done; - } - - reduce(parent); - wchar_t *lib_python = joinpath2(parent, calculate->lib_python); - PyMem_RawFree(parent); - - if (lib_python == NULL) { - status = _PyStatus_NO_MEMORY(); - goto done; - } - - int module; - status = ismodule(lib_python, &module); - PyMem_RawFree(lib_python); - - if (_PyStatus_EXCEPTION(status)) { - goto done; - } - if (!module) { - /* We are in the build directory so use the name of the - executable - we know that the absolute path is passed */ - PyMem_RawFree(calculate->argv0_path); - calculate->argv0_path = _PyMem_RawWcsdup(pathconfig->program_full_path); - if (calculate->argv0_path == NULL) { - status = _PyStatus_NO_MEMORY(); - goto done; - } - - status = _PyStatus_OK(); - goto done; - } - - /* Use the location of the library as argv0_path */ - PyMem_RawFree(calculate->argv0_path); - calculate->argv0_path = wbuf; - return _PyStatus_OK(); - -done: - PyMem_RawFree(wbuf); - return status; -} -#endif - - -static PyStatus -calculate_argv0_path(PyCalculatePath *calculate, - _PyPathConfig *pathconfig) -{ - PyStatus status; - - calculate->argv0_path = _PyMem_RawWcsdup(pathconfig->program_full_path); - if (calculate->argv0_path == NULL) { - return _PyStatus_NO_MEMORY(); - } - -#ifdef WITH_NEXT_FRAMEWORK - status = calculate_argv0_path_framework(calculate, pathconfig); - if (_PyStatus_EXCEPTION(status)) { - return status; - } -#endif - - status = resolve_symlinks(&calculate->argv0_path); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - reduce(calculate->argv0_path); - - return _PyStatus_OK(); -} - - -static PyStatus -calculate_open_pyenv(PyCalculatePath *calculate, FILE **env_file_p) -{ - *env_file_p = NULL; - - const wchar_t *env_cfg = L"pyvenv.cfg"; - - /* Filename: / "pyvenv.cfg" */ - wchar_t *filename = joinpath2(calculate->argv0_path, env_cfg); - if (filename == NULL) { - return _PyStatus_NO_MEMORY(); - } - - *env_file_p = _Py_wfopen(filename, L"r"); - PyMem_RawFree(filename); - - if (*env_file_p != NULL) { - return _PyStatus_OK(); - - } - - /* fopen() failed: reset errno */ - errno = 0; - - /* Path: / "pyvenv.cfg" */ - wchar_t *parent = _PyMem_RawWcsdup(calculate->argv0_path); - if (parent == NULL) { - return _PyStatus_NO_MEMORY(); - } - reduce(parent); - - filename = joinpath2(parent, env_cfg); - PyMem_RawFree(parent); - if (filename == NULL) { - return _PyStatus_NO_MEMORY(); - } - - *env_file_p = _Py_wfopen(filename, L"r"); - PyMem_RawFree(filename); - - if (*env_file_p == NULL) { - /* fopen() failed: reset errno */ - errno = 0; - } - return _PyStatus_OK(); -} - - -/* Search for an "pyvenv.cfg" environment configuration file, first in the - executable's directory and then in the parent directory. - If found, open it for use when searching for prefixes. - - Write the 'home' variable of pyvenv.cfg into calculate->argv0_path. */ -static PyStatus -calculate_read_pyenv(PyCalculatePath *calculate) -{ - PyStatus status; - FILE *env_file = NULL; - - status = calculate_open_pyenv(calculate, &env_file); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - if (env_file == NULL) { - /* pyvenv.cfg not found */ - return _PyStatus_OK(); - } - - /* Look for a 'home' variable and set argv0_path to it, if found */ - wchar_t *home = NULL; - status = _Py_FindEnvConfigValue(env_file, L"home", &home); - if (_PyStatus_EXCEPTION(status)) { - fclose(env_file); - return status; - } - - if (home) { - PyMem_RawFree(calculate->argv0_path); - calculate->argv0_path = home; - } - fclose(env_file); - return _PyStatus_OK(); -} - - -static PyStatus -calculate_zip_path(PyCalculatePath *calculate) -{ - PyStatus res; - - /* Path: / "pythonXY.zip" */ - wchar_t *path = joinpath2(calculate->platlibdir, - L"python" Py_STRINGIFY(PY_MAJOR_VERSION) Py_STRINGIFY(PY_MINOR_VERSION) - L".zip"); - if (path == NULL) { - return _PyStatus_NO_MEMORY(); - } - - if (calculate->prefix_found > 0) { - /* Use the reduced prefix returned by Py_GetPrefix() - - Path: / / "pythonXY.zip" */ - wchar_t *parent = _PyMem_RawWcsdup(calculate->prefix); - if (parent == NULL) { - res = _PyStatus_NO_MEMORY(); - goto done; - } - reduce(parent); - reduce(parent); - calculate->zip_path = joinpath2(parent, path); - PyMem_RawFree(parent); - } - else { - calculate->zip_path = joinpath2(calculate->prefix_macro, path); - } - - if (calculate->zip_path == NULL) { - res = _PyStatus_NO_MEMORY(); - goto done; - } - - res = _PyStatus_OK(); - -done: - PyMem_RawFree(path); - return res; -} - - -static PyStatus -calculate_module_search_path(PyCalculatePath *calculate, - _PyPathConfig *pathconfig) -{ - /* Calculate size of return buffer */ - size_t bufsz = 0; - if (calculate->pythonpath_env != NULL) { - bufsz += wcslen(calculate->pythonpath_env) + 1; - } - - wchar_t *defpath = calculate->pythonpath_macro; - size_t prefixsz = wcslen(calculate->prefix) + 1; - while (1) { - wchar_t *delim = wcschr(defpath, DELIM); - - if (!_Py_isabs(defpath)) { - /* Paths are relative to prefix */ - bufsz += prefixsz; - } - - if (delim) { - bufsz += delim - defpath + 1; - } - else { - bufsz += wcslen(defpath) + 1; - break; - } - defpath = delim + 1; - } - - bufsz += wcslen(calculate->zip_path) + 1; - bufsz += wcslen(calculate->exec_prefix) + 1; - - /* Allocate the buffer */ - wchar_t *buf = PyMem_RawMalloc(bufsz * sizeof(wchar_t)); - if (buf == NULL) { - return _PyStatus_NO_MEMORY(); - } - buf[0] = '\0'; - - /* Run-time value of $PYTHONPATH goes first */ - if (calculate->pythonpath_env) { - wcscpy(buf, calculate->pythonpath_env); - wcscat(buf, delimiter); - } - - /* Next is the default zip path */ - wcscat(buf, calculate->zip_path); - wcscat(buf, delimiter); - - /* Next goes merge of compile-time $PYTHONPATH with - * dynamically located prefix. - */ - defpath = calculate->pythonpath_macro; - while (1) { - wchar_t *delim = wcschr(defpath, DELIM); - - if (!_Py_isabs(defpath)) { - wcscat(buf, calculate->prefix); - if (prefixsz >= 2 && calculate->prefix[prefixsz - 2] != SEP && - defpath[0] != (delim ? DELIM : L'\0')) - { - /* not empty */ - wcscat(buf, separator); - } - } - - if (delim) { - size_t len = delim - defpath + 1; - size_t end = wcslen(buf) + len; - wcsncat(buf, defpath, len); - buf[end] = '\0'; - } - else { - wcscat(buf, defpath); - break; - } - defpath = delim + 1; - } - wcscat(buf, delimiter); - - /* Finally, on goes the directory for dynamic-load modules */ - wcscat(buf, calculate->exec_prefix); - - pathconfig->module_search_path = buf; - return _PyStatus_OK(); -} - - -static PyStatus -calculate_init(PyCalculatePath *calculate, const PyConfig *config) -{ - size_t len; - - calculate->warnings = config->pathconfig_warnings; - calculate->pythonpath_env = config->pythonpath_env; - calculate->platlibdir = config->platlibdir; - - const char *path = getenv("PATH"); - if (path) { - calculate->path_env = Py_DecodeLocale(path, &len); - if (!calculate->path_env) { - return DECODE_LOCALE_ERR("PATH environment variable", len); - } - } - - /* Decode macros */ - calculate->pythonpath_macro = Py_DecodeLocale(PYTHONPATH, &len); - if (!calculate->pythonpath_macro) { - return DECODE_LOCALE_ERR("PYTHONPATH macro", len); - } - calculate->prefix_macro = Py_DecodeLocale(PREFIX, &len); - if (!calculate->prefix_macro) { - return DECODE_LOCALE_ERR("PREFIX macro", len); - } - calculate->exec_prefix_macro = Py_DecodeLocale(EXEC_PREFIX, &len); - if (!calculate->exec_prefix_macro) { - return DECODE_LOCALE_ERR("EXEC_PREFIX macro", len); - } - calculate->vpath_macro = Py_DecodeLocale(VPATH, &len); - if (!calculate->vpath_macro) { - return DECODE_LOCALE_ERR("VPATH macro", len); - } - - // / "pythonX.Y" - wchar_t *pyversion = Py_DecodeLocale("python" VERSION, &len); - if (!pyversion) { - return DECODE_LOCALE_ERR("VERSION macro", len); - } - calculate->lib_python = joinpath2(config->platlibdir, pyversion); - PyMem_RawFree(pyversion); - if (calculate->lib_python == NULL) { - return _PyStatus_NO_MEMORY(); - } - - return _PyStatus_OK(); -} - - -static void -calculate_free(PyCalculatePath *calculate) -{ - PyMem_RawFree(calculate->pythonpath_macro); - PyMem_RawFree(calculate->prefix_macro); - PyMem_RawFree(calculate->exec_prefix_macro); - PyMem_RawFree(calculate->vpath_macro); - PyMem_RawFree(calculate->lib_python); - PyMem_RawFree(calculate->path_env); - PyMem_RawFree(calculate->zip_path); - PyMem_RawFree(calculate->argv0_path); - PyMem_RawFree(calculate->prefix); - PyMem_RawFree(calculate->exec_prefix); -} - - -static PyStatus -calculate_path(PyCalculatePath *calculate, _PyPathConfig *pathconfig) -{ - PyStatus status; - - if (pathconfig->program_full_path == NULL) { - status = calculate_program(calculate, pathconfig); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - } - - status = calculate_argv0_path(calculate, pathconfig); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - /* If a pyvenv.cfg configure file is found, - argv0_path is overriden with its 'home' variable. */ - status = calculate_read_pyenv(calculate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = calculate_prefix(calculate, pathconfig); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = calculate_zip_path(calculate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = calculate_exec_prefix(calculate, pathconfig); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - if ((!calculate->prefix_found || !calculate->exec_prefix_found) - && calculate->warnings) - { - fprintf(stderr, - "Consider setting $PYTHONHOME to [:]\n"); - } - - if (pathconfig->module_search_path == NULL) { - status = calculate_module_search_path(calculate, pathconfig); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - } - - if (pathconfig->prefix == NULL) { - status = calculate_set_prefix(calculate, pathconfig); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - } - - if (pathconfig->exec_prefix == NULL) { - status = calculate_set_exec_prefix(calculate, pathconfig); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - } - return _PyStatus_OK(); -} - - -/* Calculate the Python path configuration. - - Inputs: - - - PATH environment variable - - Macros: PYTHONPATH, PREFIX, EXEC_PREFIX, VERSION (ex: "3.9"). - PREFIX and EXEC_PREFIX are generated by the configure script. - PYTHONPATH macro is the default search path. - - pybuilddir.txt file - - pyvenv.cfg configuration file - - PyConfig fields ('config' function argument): - - - pathconfig_warnings - - pythonpath_env (PYTHONPATH environment variable) - - - _PyPathConfig fields ('pathconfig' function argument): - - - program_name: see config_init_program_name() - - home: Py_SetPythonHome() or PYTHONHOME environment variable - - - current working directory: see copy_absolute() - - Outputs, 'pathconfig' fields: - - - program_full_path - - module_search_path - - prefix - - exec_prefix - - If a field is already set (non NULL), it is left unchanged. */ -PyStatus -_PyPathConfig_Calculate(_PyPathConfig *pathconfig, const PyConfig *config) -{ - PyStatus status; - PyCalculatePath calculate; - memset(&calculate, 0, sizeof(calculate)); - - status = calculate_init(&calculate, config); - if (_PyStatus_EXCEPTION(status)) { - goto done; - } - - status = calculate_path(&calculate, pathconfig); - if (_PyStatus_EXCEPTION(status)) { - goto done; - } - - /* program_full_path must an either an empty string or an absolute path */ - assert(wcslen(pathconfig->program_full_path) == 0 - || _Py_isabs(pathconfig->program_full_path)); - - status = _PyStatus_OK(); - -done: - calculate_free(&calculate); - return status; -} - -#ifdef __cplusplus -} -#endif diff --git a/PC/getpathp.c b/PC/getpathp.c index 53da3a6d05faee9..466682a7735036b 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -108,7 +108,7 @@ * Py_GetPath() tries to return a sensible Python module search path. * * The approach is an adaptation for Windows of the strategy used in - * ../Modules/getpath.c; it uses the Windows Registry as one of its + * ../Lib/_getpath.py; it uses the Windows Registry as one of its * information sources. * * Py_SetPath() can be used to override this mechanism. Call Py_SetPath diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 748ea8a8f336011..912feba0b80d901 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -151,7 +151,7 @@ static int test_pre_initialization_api(void) /* the test doesn't support custom memory allocators */ putenv("PYTHONMALLOC="); - /* Leading "./" ensures getpath.c can still find the standard library */ + /* Leading "./" ensures _getpath can still find the standard library */ _Py_EMBED_PREINIT_CHECK("Checking Py_DecodeLocale\n"); wchar_t *program = Py_DecodeLocale("./spam", NULL); if (program == NULL) { diff --git a/Python/frozen.c b/Python/frozen.c index 228a11019cfa6a8..eb8150b5ff10f4e 100644 --- a/Python/frozen.c +++ b/Python/frozen.c @@ -2,6 +2,7 @@ /* Dummy frozen modules initializer */ #include "Python.h" +#include "getpath.h" #include "importlib.h" #include "importlib_external.h" #include "importlib_zipimport.h" @@ -36,6 +37,7 @@ static const struct _frozen _PyImport_FrozenModules[] = { (int)sizeof(_Py_M__importlib_bootstrap_external)}, {"zipimport", _Py_M__zipimport, (int)sizeof(_Py_M__zipimport)}, + {"_getpath", _Py_M__getpath, (int)sizeof(_Py_M__getpath)}, /* Test module */ {"__hello__", M___hello__, SIZE}, /* Test package (negative size indicates package-ness) */ diff --git a/Python/frozenmain.c b/Python/frozenmain.c index dd04d609d24f931..0610600c4d4b57c 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -41,7 +41,7 @@ Py_FrozenMain(int argc, char **argv) PyConfig config; PyConfig_InitPythonConfig(&config); - config.pathconfig_warnings = 0; /* Suppress errors from getpath.c */ + config.pathconfig_warnings = 0; /* Suppress errors from _getpath.py */ if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') inspect = 1; diff --git a/Python/getpath.h b/Python/getpath.h new file mode 100644 index 000000000000000..b1e0e98ad1099aa --- /dev/null +++ b/Python/getpath.h @@ -0,0 +1,770 @@ +/* Auto-generated by Programs/_freeze_importlib.c */ +const unsigned char _Py_M__getpath[] = { + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,64,0,0,0,115,86,1,0,0,100,0, + 100,1,108,0,90,0,100,0,100,2,108,1,109,2,90,2, + 109,3,90,3,1,0,100,0,100,1,108,4,90,4,100,0, + 100,1,108,5,90,5,100,3,90,6,100,4,90,7,100,5, + 90,8,101,5,106,9,106,10,90,11,101,5,106,9,106,12, + 90,13,101,4,106,14,90,14,101,4,106,15,90,15,101,4, + 106,16,90,16,101,5,106,17,100,6,107,2,90,18,101,5, + 106,17,100,7,107,2,90,19,100,8,90,20,100,8,90,21, + 101,4,106,22,90,22,101,22,101,4,106,23,131,1,90,23, + 101,22,101,4,106,24,131,1,90,24,101,22,101,4,106,25, + 131,1,90,25,101,22,101,4,106,26,131,1,90,26,101,22, + 101,4,106,27,131,1,90,27,100,9,100,10,132,0,90,28, + 100,11,100,12,132,0,90,29,100,13,100,14,132,0,90,30, + 100,15,100,16,132,0,90,31,100,17,100,18,132,0,90,32, + 100,19,100,20,132,0,90,33,100,21,100,22,132,0,90,34, + 100,23,100,24,132,0,90,35,101,20,115,242,101,21,114,254, + 100,25,90,36,100,26,100,27,132,0,90,37,100,28,100,29, + 132,0,90,38,71,0,100,30,100,31,132,0,100,31,131,2, + 90,39,100,32,100,33,132,0,90,40,100,34,100,35,132,0, + 90,41,71,0,100,36,100,37,132,0,100,37,131,2,90,42, + 100,38,100,39,132,0,90,43,100,40,100,41,132,0,90,44, + 101,45,100,42,107,2,144,1,114,82,101,44,131,0,1,0, + 100,1,83,0,41,43,233,0,0,0,0,78,41,2,218,7, + 83,95,73,83,82,69,71,218,7,83,95,73,83,68,73,82, + 122,10,112,121,118,101,110,118,46,99,102,103,122,5,111,115, + 46,112,121,122,19,77,111,100,117,108,101,115,47,83,101,116, + 117,112,46,108,111,99,97,108,90,6,100,97,114,119,105,110, + 90,5,119,105,110,51,50,70,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,14,0,0,0,124,0,111,12,124,0,160,0,116,1, + 161,1,83,0,169,1,78,41,2,218,10,115,116,97,114,116, + 115,119,105,116,104,218,3,83,69,80,41,1,218,4,112,97, + 116,104,169,0,114,7,0,0,0,250,16,60,102,114,111,122, + 101,110,32,103,101,116,112,97,116,104,62,218,5,105,115,97, + 98,115,37,0,0,0,115,4,0,0,0,14,2,255,128,114, + 9,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,67,0,0,0,115,54,0, + 0,0,116,0,124,0,131,1,100,1,24,0,125,1,124,1, + 100,2,107,4,114,42,124,0,124,1,25,0,116,1,107,3, + 114,42,124,1,100,1,56,0,125,1,113,12,124,0,100,0, + 124,1,133,2,25,0,83,0,41,3,78,233,1,0,0,0, + 114,0,0,0,0,41,2,218,3,108,101,110,114,5,0,0, + 0,41,2,114,6,0,0,0,218,1,105,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,7,100,105,114,110, + 97,109,101,42,0,0,0,115,10,0,0,0,12,2,20,1, + 10,1,12,1,255,128,114,13,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,54,0,0,0,116,0,124,1,131,1,114, + 12,124,1,83,0,124,0,115,20,124,1,83,0,124,0,160, + 1,116,2,161,1,115,46,124,0,155,0,116,2,155,0,124, + 1,155,0,157,3,83,0,124,0,124,1,23,0,83,0,114, + 3,0,0,0,41,3,114,9,0,0,0,218,8,101,110,100, + 115,119,105,116,104,114,5,0,0,0,41,2,114,6,0,0, + 0,90,5,112,97,116,104,50,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,8,106,111,105,110,112,97,116, + 104,51,0,0,0,115,16,0,0,0,8,1,4,1,4,2, + 4,1,10,2,16,1,8,2,255,128,114,15,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 8,0,0,0,67,0,0,0,115,54,0,0,0,122,14,116, + 0,160,1,124,0,161,1,125,1,87,0,110,20,4,0,116, + 2,121,34,1,0,1,0,1,0,89,0,100,1,83,0,48, + 0,116,3,124,1,106,4,131,1,115,50,100,1,83,0,100, + 2,83,0,41,3,78,70,84,169,5,218,5,112,111,115,105, + 120,218,4,115,116,97,116,218,7,79,83,69,114,114,111,114, + 114,1,0,0,0,218,7,115,116,95,109,111,100,101,169,2, + 218,8,102,105,108,101,110,97,109,101,90,2,115,116,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,6,105, + 115,102,105,108,101,65,0,0,0,115,16,0,0,0,2,1, + 14,1,12,1,8,1,10,1,4,1,4,1,255,128,114,23, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,8,0,0,0,67,0,0,0,115,64,0,0, + 0,122,14,116,0,160,1,124,0,161,1,125,1,87,0,110, + 20,4,0,116,2,121,34,1,0,1,0,1,0,89,0,100, + 1,83,0,48,0,116,3,124,1,106,4,131,1,115,50,100, + 1,83,0,124,1,106,4,100,2,64,0,100,3,107,3,83, + 0,41,4,78,70,233,73,0,0,0,114,0,0,0,0,114, + 16,0,0,0,114,21,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,7,105,115,120,102,105,108, + 101,76,0,0,0,115,16,0,0,0,2,1,14,1,12,1, + 8,1,10,1,4,1,14,1,255,128,114,25,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 8,0,0,0,67,0,0,0,115,46,0,0,0,122,14,116, + 0,160,1,124,0,161,1,125,1,87,0,110,20,4,0,116, + 2,121,34,1,0,1,0,1,0,89,0,100,1,83,0,48, + 0,116,3,124,1,106,4,131,1,83,0,41,2,78,70,41, + 5,114,17,0,0,0,114,18,0,0,0,114,19,0,0,0, + 114,2,0,0,0,114,20,0,0,0,114,21,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,5, + 105,115,100,105,114,87,0,0,0,115,12,0,0,0,2,1, + 14,1,12,1,8,1,10,1,255,128,114,26,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 3,0,0,0,67,0,0,0,115,34,0,0,0,116,0,124, + 0,116,1,131,2,125,1,116,2,124,1,131,1,114,22,100, + 1,83,0,116,2,124,1,100,2,23,0,131,1,83,0,41, + 3,78,84,218,1,99,41,3,114,15,0,0,0,218,8,76, + 65,78,68,77,65,82,75,114,23,0,0,0,41,2,114,6, + 0,0,0,114,22,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,8,105,115,109,111,100,117,108, + 101,96,0,0,0,115,10,0,0,0,10,1,8,1,4,1, + 12,3,255,128,114,29,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,8,0,0,0,67,0, + 0,0,115,74,0,0,0,116,0,124,0,131,1,114,12,124, + 0,83,0,122,12,116,1,160,2,161,0,125,1,87,0,110, + 22,4,0,116,3,121,46,1,0,1,0,1,0,124,0,6, + 0,89,0,83,0,48,0,124,0,160,4,100,1,116,5,155, + 0,157,2,161,1,125,0,116,6,124,1,124,0,131,2,83, + 0,41,2,78,218,1,46,41,7,114,9,0,0,0,114,17, + 0,0,0,90,6,103,101,116,99,119,100,114,19,0,0,0, + 218,12,114,101,109,111,118,101,112,114,101,102,105,120,114,5, + 0,0,0,114,15,0,0,0,41,2,114,6,0,0,0,90, + 3,99,119,100,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,7,97,98,115,112,97,116,104,104,0,0,0, + 115,18,0,0,0,8,1,4,1,2,2,12,1,12,1,10, + 1,16,3,10,1,255,128,114,32,0,0,0,122,4,46,101, + 120,101,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,67,0,0,0,115,54,0,0,0, + 124,0,116,0,116,1,131,1,11,0,100,0,133,2,25,0, + 160,2,161,0,116,1,107,2,114,30,124,0,83,0,124,0, + 116,1,23,0,125,1,116,3,124,1,131,1,114,50,124,1, + 83,0,124,0,83,0,114,3,0,0,0,41,4,114,11,0, + 0,0,218,10,69,88,69,95,83,85,70,70,73,88,218,5, + 108,111,119,101,114,114,25,0,0,0,41,2,90,8,112,114, + 111,103,112,97,116,104,90,12,112,114,111,103,112,97,116,104, + 95,101,120,101,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,14,97,100,100,95,101,120,101,95,115,117,102, + 102,105,120,121,0,0,0,115,14,0,0,0,26,2,4,1, + 8,2,8,1,4,1,4,2,255,128,114,35,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 8,0,0,0,67,0,0,0,115,92,0,0,0,100,1,125, + 1,122,14,116,0,160,1,124,0,161,1,125,2,87,0,110, + 20,4,0,116,2,121,38,1,0,1,0,1,0,89,0,124, + 0,83,0,48,0,116,3,124,2,131,1,114,54,124,2,125, + 0,110,14,116,4,116,5,124,0,131,1,124,2,131,2,125, + 0,124,1,100,2,55,0,125,1,124,1,100,3,107,5,114, + 4,116,6,100,4,131,1,130,1,41,5,78,114,0,0,0, + 0,114,10,0,0,0,233,40,0,0,0,122,40,109,97,120, + 105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,115, + 121,109,98,111,108,105,99,32,108,105,110,107,115,32,114,101, + 97,99,104,101,100,41,7,114,17,0,0,0,90,8,114,101, + 97,100,108,105,110,107,114,19,0,0,0,114,9,0,0,0, + 114,15,0,0,0,114,13,0,0,0,218,9,69,120,99,101, + 112,116,105,111,110,41,3,114,6,0,0,0,90,5,110,108, + 105,110,107,90,8,110,101,119,95,112,97,116,104,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,16,114,101, + 115,111,108,118,101,95,115,121,109,108,105,110,107,115,134,0, + 0,0,115,28,0,0,0,4,1,2,2,14,1,12,1,2, + 2,4,13,2,243,8,2,6,1,14,3,8,2,8,2,8, + 1,255,128,114,38,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, + 0,115,56,0,0,0,101,0,90,1,100,0,90,2,100,1, + 100,2,132,0,90,3,100,12,100,4,100,5,132,1,90,4, + 100,6,100,7,132,0,90,5,100,13,100,8,100,9,132,1, + 90,6,100,10,100,11,132,0,90,7,100,3,83,0,41,14, + 218,10,80,97,116,104,67,111,110,102,105,103,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0, + 0,67,0,0,0,115,50,0,0,0,100,0,124,0,95,0, + 100,0,124,0,95,1,100,0,124,0,95,2,100,0,124,0, + 95,3,100,0,124,0,95,4,100,0,124,0,95,5,116,6, + 114,46,100,0,124,0,95,7,100,0,83,0,114,3,0,0, + 0,41,8,218,18,109,111,100,117,108,101,95,115,101,97,114, + 99,104,95,112,97,116,104,218,17,112,114,111,103,114,97,109, + 95,102,117,108,108,95,112,97,116,104,218,6,112,114,101,102, + 105,120,218,11,101,120,101,99,95,112,114,101,102,105,120,218, + 12,112,114,111,103,114,97,109,95,110,97,109,101,218,4,104, + 111,109,101,218,10,77,83,95,87,73,78,68,79,87,83,218, + 15,98,97,115,101,95,101,120,101,99,117,116,97,98,108,101, + 169,1,218,4,115,101,108,102,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,8,95,95,105,110,105,116,95, + 95,158,0,0,0,115,20,0,0,0,6,1,6,1,6,1, + 6,1,6,1,6,1,4,1,6,1,4,128,255,128,122,19, + 80,97,116,104,67,111,110,102,105,103,46,95,95,105,110,105, + 116,95,95,78,99,4,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,5,0,0,0,67,0,0,0,115,32,0, + 0,0,124,3,100,0,117,0,114,12,124,2,125,3,116,0, + 124,0,124,2,124,1,124,3,25,0,131,3,1,0,100,0, + 83,0,114,3,0,0,0,41,1,218,7,115,101,116,97,116, + 116,114,169,4,114,49,0,0,0,218,6,99,111,110,102,105, + 103,90,4,97,116,116,114,90,10,99,111,110,102,105,103,95, + 107,101,121,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,11,95,103,101,116,95,99,111,110,102,105,103,168, + 0,0,0,115,10,0,0,0,8,1,4,1,16,1,4,128, + 255,128,122,22,80,97,116,104,67,111,110,102,105,103,46,95, + 103,101,116,95,99,111,110,102,105,103,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,5,0,0,0,67, + 0,0,0,115,100,0,0,0,124,1,100,1,25,0,114,18, + 124,1,100,2,25,0,124,0,95,0,124,0,160,1,124,1, + 100,3,100,4,161,3,1,0,124,0,160,1,124,1,100,5, + 161,2,1,0,124,0,160,1,124,1,100,6,161,2,1,0, + 124,0,160,1,124,1,100,7,161,2,1,0,124,0,160,1, + 124,1,100,8,161,2,1,0,116,2,114,96,124,0,160,1, + 124,1,100,9,161,2,1,0,100,0,83,0,41,10,78,218, + 23,109,111,100,117,108,101,95,115,101,97,114,99,104,95,112, + 97,116,104,115,95,115,101,116,218,19,109,111,100,117,108,101, + 95,115,101,97,114,99,104,95,112,97,116,104,115,114,41,0, + 0,0,218,10,101,120,101,99,117,116,97,98,108,101,114,42, + 0,0,0,114,43,0,0,0,114,44,0,0,0,114,45,0, + 0,0,114,47,0,0,0,41,3,114,40,0,0,0,114,54, + 0,0,0,114,46,0,0,0,169,2,114,49,0,0,0,114, + 53,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,15,115,101,116,95,102,114,111,109,95,99,111, + 110,102,105,103,173,0,0,0,115,22,0,0,0,8,1,10, + 1,14,1,12,1,12,1,12,1,12,1,4,1,12,1,4, + 128,255,128,122,26,80,97,116,104,67,111,110,102,105,103,46, + 115,101,116,95,102,114,111,109,95,99,111,110,102,105,103,99, + 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 3,0,0,0,67,0,0,0,115,46,0,0,0,124,3,100, + 0,117,0,114,12,124,2,125,3,124,1,124,3,25,0,100, + 0,117,1,114,28,100,0,83,0,116,0,124,0,124,2,131, + 2,124,1,124,3,60,0,100,0,83,0,114,3,0,0,0, + 41,1,218,7,103,101,116,97,116,116,114,114,52,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 11,95,115,101,116,95,99,111,110,102,105,103,184,0,0,0, + 115,14,0,0,0,8,1,4,1,12,1,4,1,14,1,4, + 128,255,128,122,22,80,97,116,104,67,111,110,102,105,103,46, + 95,115,101,116,95,99,111,110,102,105,103,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,5,0,0,0, + 67,0,0,0,115,154,0,0,0,124,1,100,1,25,0,115, + 26,124,0,106,0,124,1,100,2,60,0,100,3,124,1,100, + 1,60,0,116,1,114,68,124,1,100,4,25,0,100,0,117, + 1,114,56,124,1,100,5,25,0,100,0,117,0,114,56,110, + 12,124,0,160,2,124,1,100,5,161,2,1,0,124,0,160, + 2,124,1,100,6,100,4,161,3,1,0,124,0,160,2,124, + 1,100,7,161,2,1,0,124,0,160,2,124,1,100,8,161, + 2,1,0,116,1,114,150,124,0,106,3,100,9,107,3,114, + 130,124,0,106,3,124,1,100,10,60,0,124,0,106,4,100, + 9,107,3,114,150,124,0,106,4,124,1,100,11,60,0,100, + 0,83,0,41,12,78,114,55,0,0,0,114,56,0,0,0, + 114,10,0,0,0,114,57,0,0,0,114,47,0,0,0,114, + 41,0,0,0,114,42,0,0,0,114,43,0,0,0,233,255, + 255,255,255,218,8,105,115,111,108,97,116,101,100,218,11,115, + 105,116,101,95,105,109,112,111,114,116,41,5,114,40,0,0, + 0,114,46,0,0,0,114,61,0,0,0,114,63,0,0,0, + 114,64,0,0,0,114,58,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,13,115,101,116,95,116, + 111,95,99,111,110,102,105,103,191,0,0,0,115,34,0,0, + 0,8,1,10,1,8,1,4,2,24,1,2,4,12,2,14, + 2,12,1,12,1,4,2,10,2,10,1,10,1,10,1,4, + 128,255,128,122,24,80,97,116,104,67,111,110,102,105,103,46, + 115,101,116,95,116,111,95,99,111,110,102,105,103,41,1,78, + 41,1,78,41,8,218,8,95,95,110,97,109,101,95,95,218, + 10,95,95,109,111,100,117,108,101,95,95,218,12,95,95,113, + 117,97,108,110,97,109,101,95,95,114,50,0,0,0,114,54, + 0,0,0,114,59,0,0,0,114,61,0,0,0,114,65,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,39,0,0,0,157,0,0,0,115, + 14,0,0,0,8,0,8,1,10,10,8,5,10,11,12,7, + 255,128,114,39,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, + 115,84,0,0,0,100,1,125,1,116,0,131,0,125,2,116, + 1,160,2,124,0,100,2,161,2,125,3,124,3,115,34,116, + 4,124,2,131,1,83,0,124,1,124,3,118,0,114,74,124, + 3,160,3,124,1,100,3,161,2,100,4,25,0,125,3,124, + 2,124,3,55,0,125,2,116,4,124,2,131,1,83,0,124, + 2,124,3,55,0,125,2,113,10,41,5,78,243,1,0,0, + 0,10,105,0,16,0,0,114,10,0,0,0,114,0,0,0, + 0,41,5,218,9,98,121,116,101,97,114,114,97,121,114,17, + 0,0,0,90,4,114,101,97,100,218,5,115,112,108,105,116, + 218,5,98,121,116,101,115,41,4,218,2,102,100,90,2,110, + 108,90,3,98,117,102,90,5,99,104,117,110,107,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,8,114,101, + 97,100,108,105,110,101,217,0,0,0,115,22,0,0,0,4, + 3,6,1,12,2,4,1,8,7,8,251,16,1,8,1,8, + 3,10,255,255,128,114,74,0,0,0,99,2,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,4,0,0,0,67, + 0,0,0,115,84,0,0,0,116,0,124,0,131,1,125,2, + 124,2,115,16,100,0,83,0,124,2,160,1,100,1,161,1, + 114,28,113,0,124,2,160,2,100,2,100,3,161,2,125,2, + 124,2,160,3,161,0,125,3,124,3,100,4,25,0,124,1, + 107,2,114,0,124,3,100,5,25,0,100,6,107,2,114,0, + 124,3,100,7,25,0,125,4,124,4,83,0,41,8,78,243, + 1,0,0,0,35,250,5,117,116,102,45,56,218,15,115,117, + 114,114,111,103,97,116,101,101,115,99,97,112,101,114,0,0, + 0,0,114,10,0,0,0,250,1,61,233,2,0,0,0,41, + 4,114,74,0,0,0,114,4,0,0,0,218,6,100,101,99, + 111,100,101,114,71,0,0,0,41,5,114,73,0,0,0,90, + 3,107,101,121,218,4,108,105,110,101,90,3,116,111,107,218, + 5,118,97,108,117,101,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,21,102,105,110,100,95,101,110,118,95, + 99,111,110,102,105,103,95,118,97,108,117,101,235,0,0,0, + 115,22,0,0,0,8,2,4,1,4,128,10,2,2,2,12, + 2,8,3,24,1,8,1,4,1,255,128,114,83,0,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,64,0,0,0,115,168,0,0,0,101,0, + 90,1,100,0,90,2,100,1,100,2,132,0,90,3,100,3, + 100,4,132,0,90,4,100,5,100,6,132,0,90,5,101,6, + 100,7,100,8,132,0,131,1,90,7,100,9,100,10,132,0, + 90,8,100,11,100,12,132,0,90,9,100,13,100,14,132,0, + 90,10,100,15,100,16,132,0,90,11,100,17,100,18,132,0, + 90,12,100,19,100,20,132,0,90,13,100,21,100,22,132,0, + 90,14,100,23,100,24,132,0,90,15,100,25,100,26,132,0, + 90,16,100,27,100,28,132,0,90,17,100,29,100,30,132,0, + 90,18,100,31,100,32,132,0,90,19,100,33,100,34,132,0, + 90,20,100,35,100,36,132,0,90,21,100,37,100,38,132,0, + 90,22,100,39,83,0,41,40,218,13,67,97,108,99,117,108, + 97,116,101,80,97,116,104,99,3,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, + 115,136,0,0,0,124,1,124,0,95,0,100,1,124,0,95, + 1,100,1,124,0,95,2,124,2,100,2,25,0,124,0,95, + 3,124,2,100,3,25,0,124,0,95,4,124,2,100,4,25, + 0,124,0,95,5,116,6,106,7,160,8,100,5,100,0,161, + 2,125,3,124,3,100,0,117,1,114,82,116,9,124,3,131, + 1,124,0,95,10,110,6,100,0,124,0,95,10,116,11,124, + 0,95,12,116,13,124,0,95,14,116,15,124,0,95,16,116, + 17,124,0,95,18,116,19,124,0,106,5,100,6,116,20,155, + 0,157,2,131,2,124,0,95,21,100,0,83,0,41,7,78, + 114,0,0,0,0,90,19,112,97,116,104,99,111,110,102,105, + 103,95,119,97,114,110,105,110,103,115,218,14,112,121,116,104, + 111,110,112,97,116,104,95,101,110,118,218,10,112,108,97,116, + 108,105,98,100,105,114,115,4,0,0,0,80,65,84,72,218, + 6,112,121,116,104,111,110,41,22,218,10,112,97,116,104,99, + 111,110,102,105,103,218,12,112,114,101,102,105,120,95,102,111, + 117,110,100,218,17,101,120,101,99,95,112,114,101,102,105,120, + 95,102,111,117,110,100,218,8,119,97,114,110,105,110,103,115, + 114,85,0,0,0,114,86,0,0,0,114,17,0,0,0,90, + 7,101,110,118,105,114,111,110,218,3,103,101,116,218,13,100, + 101,99,111,100,101,95,108,111,99,97,108,101,218,8,112,97, + 116,104,95,101,110,118,218,10,80,89,84,72,79,78,80,65, + 84,72,218,16,112,121,116,104,111,110,112,97,116,104,95,109, + 97,99,114,111,218,6,80,82,69,70,73,88,218,12,112,114, + 101,102,105,120,95,109,97,99,114,111,218,11,69,88,69,67, + 95,80,82,69,70,73,88,218,17,101,120,101,99,95,112,114, + 101,102,105,120,95,109,97,99,114,111,218,5,86,80,65,84, + 72,218,11,118,112,97,116,104,95,109,97,99,114,111,114,15, + 0,0,0,218,7,86,69,82,83,73,79,78,218,10,108,105, + 98,95,112,121,116,104,111,110,41,4,114,49,0,0,0,114, + 88,0,0,0,114,53,0,0,0,114,6,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,50,0, + 0,0,254,0,0,0,115,34,0,0,0,6,1,6,2,6, + 1,10,2,10,1,10,1,14,1,8,1,12,1,6,2,6, + 1,6,1,6,1,6,1,20,2,4,128,255,128,122,22,67, + 97,108,99,117,108,97,116,101,80,97,116,104,46,95,95,105, + 110,105,116,95,95,99,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,24, + 0,0,0,116,0,160,1,161,0,125,1,116,2,124,1,131, + 1,115,20,100,0,83,0,124,1,83,0,114,3,0,0,0, + 41,3,218,9,95,99,103,101,116,112,97,116,104,90,20,95, + 78,83,71,101,116,69,120,101,99,117,116,97,98,108,101,80, + 97,116,104,114,9,0,0,0,41,2,114,49,0,0,0,90, + 9,101,120,101,99,95,112,97,116,104,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,23,99,97,108,99,117, + 108,97,116,101,95,112,114,111,103,114,97,109,95,109,97,99, + 111,115,19,1,0,0,115,10,0,0,0,8,10,8,1,4, + 1,4,2,255,128,122,37,67,97,108,99,117,108,97,116,101, + 80,97,116,104,46,99,97,108,99,117,108,97,116,101,95,112, + 114,111,103,114,97,109,95,109,97,99,111,115,99,1,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, + 0,67,0,0,0,115,68,0,0,0,116,0,160,1,161,0, + 125,1,124,1,100,0,117,0,114,20,100,0,83,0,116,2, + 116,3,124,1,131,1,124,0,106,4,131,2,125,2,116,5, + 124,2,131,1,115,58,124,0,106,6,106,7,124,0,95,8, + 100,0,83,0,124,1,124,0,95,8,100,0,83,0,114,3, + 0,0,0,41,9,114,105,0,0,0,90,13,78,83,76,105, + 98,114,97,114,121,78,97,109,101,114,15,0,0,0,114,13, + 0,0,0,114,104,0,0,0,114,29,0,0,0,114,88,0, + 0,0,114,41,0,0,0,218,10,97,114,103,118,48,95,112, + 97,116,104,41,3,114,49,0,0,0,90,8,109,111,100,95, + 112,97,116,104,114,104,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,30,99,97,108,99,117,108, + 97,116,101,95,97,114,103,118,48,95,112,97,116,104,95,102, + 114,97,109,101,119,111,114,107,35,1,0,0,115,20,0,0, + 0,8,1,8,1,4,1,16,10,8,1,10,3,4,1,6, + 3,4,128,255,128,122,44,67,97,108,99,117,108,97,116,101, + 80,97,116,104,46,99,97,108,99,117,108,97,116,101,95,97, + 114,103,118,48,95,112,97,116,104,95,102,114,97,109,101,119, + 111,114,107,99,2,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,4,0,0,0,67,0,0,0,115,44,0,0, + 0,124,0,160,0,116,1,161,1,68,0,93,28,125,2,116, + 2,124,2,124,1,131,2,125,3,116,3,124,3,131,1,114, + 10,124,3,2,0,1,0,83,0,100,0,83,0,114,3,0, + 0,0,41,4,114,71,0,0,0,218,5,68,69,76,73,77, + 114,15,0,0,0,114,25,0,0,0,41,4,114,94,0,0, + 0,114,44,0,0,0,114,6,0,0,0,218,8,97,98,115, + 95,112,97,116,104,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,15,99,97,108,99,117,108,97,116,101,95, + 119,104,105,99,104,59,1,0,0,115,12,0,0,0,14,2, + 10,1,8,1,8,1,4,3,255,128,122,29,67,97,108,99, + 117,108,97,116,101,80,97,116,104,46,99,97,108,99,117,108, + 97,116,101,95,119,104,105,99,104,99,1,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,4,0,0,0,67,0, + 0,0,115,122,0,0,0,124,0,106,0,125,1,124,1,106, + 1,100,0,117,0,115,20,74,0,130,1,116,2,124,1,106, + 3,118,0,114,42,124,1,106,3,124,1,95,1,100,0,83, + 0,116,4,114,72,124,0,160,5,161,0,125,2,124,2,100, + 0,117,1,114,72,124,2,124,1,95,1,100,0,83,0,124, + 0,106,6,114,112,124,0,160,7,124,0,106,6,124,1,106, + 3,161,2,125,2,124,2,100,0,117,1,114,112,124,2,124, + 1,95,1,100,0,83,0,100,1,124,1,95,1,100,0,83, + 0,41,2,78,218,0,41,8,114,88,0,0,0,114,41,0, + 0,0,114,5,0,0,0,114,44,0,0,0,218,9,95,95, + 65,80,80,76,69,95,95,114,106,0,0,0,114,94,0,0, + 0,114,111,0,0,0,41,3,114,49,0,0,0,114,88,0, + 0,0,114,110,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,22,99,97,108,99,117,108,97,116, + 101,95,112,114,111,103,114,97,109,95,105,109,112,108,69,1, + 0,0,115,36,0,0,0,6,1,14,1,10,6,8,1,4, + 1,4,2,8,1,8,1,6,1,4,1,6,2,16,1,8, + 1,6,1,4,1,6,3,4,128,255,128,122,36,67,97,108, + 99,117,108,97,116,101,80,97,116,104,46,99,97,108,99,117, + 108,97,116,101,95,112,114,111,103,114,97,109,95,105,109,112, + 108,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,2,0,0,0,67,0,0,0,115,60,0,0,0,124, + 0,106,0,125,1,124,0,160,1,161,0,1,0,124,1,106, + 2,115,24,100,0,83,0,116,3,124,1,106,2,131,1,124, + 1,95,2,116,4,115,44,116,5,114,56,116,6,124,1,106, + 2,131,1,124,1,95,2,100,0,83,0,114,3,0,0,0, + 41,7,114,88,0,0,0,114,114,0,0,0,114,41,0,0, + 0,114,32,0,0,0,218,10,95,95,67,89,71,87,73,78, + 95,95,218,11,95,95,77,73,78,71,87,51,50,95,95,114, + 35,0,0,0,41,2,114,49,0,0,0,114,88,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 17,99,97,108,99,117,108,97,116,101,95,112,114,111,103,114, + 97,109,96,1,0,0,115,18,0,0,0,6,1,8,1,6, + 2,4,1,12,4,8,2,12,5,4,128,255,128,122,31,67, + 97,108,99,117,108,97,116,101,80,97,116,104,46,99,97,108, + 99,117,108,97,116,101,95,112,114,111,103,114,97,109,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2, + 0,0,0,67,0,0,0,115,50,0,0,0,124,0,106,0, + 106,1,124,0,95,2,116,3,114,22,124,0,160,4,161,0, + 1,0,116,5,124,0,106,2,131,1,124,0,95,2,116,6, + 124,0,106,2,131,1,124,0,95,2,100,0,83,0,114,3, + 0,0,0,41,7,114,88,0,0,0,114,41,0,0,0,114, + 107,0,0,0,218,19,87,73,84,72,95,78,69,88,84,95, + 70,82,65,77,69,87,79,82,75,114,108,0,0,0,114,38, + 0,0,0,114,13,0,0,0,114,48,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,20,99,97, + 108,99,117,108,97,116,101,95,97,114,103,118,48,95,112,97, + 116,104,114,1,0,0,115,14,0,0,0,10,1,4,2,8, + 1,12,2,12,1,4,128,255,128,122,34,67,97,108,99,117, + 108,97,116,101,80,97,116,104,46,99,97,108,99,117,108,97, + 116,101,95,97,114,103,118,48,95,112,97,116,104,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,0, + 0,0,67,0,0,0,115,102,0,0,0,116,0,124,0,106, + 1,116,2,131,2,125,1,122,16,116,3,160,4,124,1,116, + 3,106,5,161,2,87,0,83,0,4,0,116,6,121,46,1, + 0,1,0,1,0,89,0,110,2,48,0,116,0,116,7,124, + 0,106,1,131,1,116,2,131,2,125,1,122,16,116,3,160, + 4,124,1,116,3,106,5,161,2,87,0,83,0,4,0,116, + 6,121,100,1,0,1,0,1,0,89,0,100,0,83,0,48, + 0,114,3,0,0,0,41,8,114,15,0,0,0,114,107,0, + 0,0,218,7,69,78,86,95,67,70,71,114,17,0,0,0, + 218,4,111,112,101,110,218,8,79,95,82,68,79,78,76,89, + 114,19,0,0,0,114,13,0,0,0,41,2,114,49,0,0, + 0,114,22,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,20,99,97,108,99,117,108,97,116,101, + 95,111,112,101,110,95,112,121,101,110,118,123,1,0,0,115, + 22,0,0,0,12,2,2,1,16,1,12,1,6,1,16,3, + 2,1,16,1,12,1,8,1,255,128,122,34,67,97,108,99, + 117,108,97,116,101,80,97,116,104,46,99,97,108,99,117,108, + 97,116,101,95,111,112,101,110,95,112,121,101,110,118,99,1, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,9, + 0,0,0,67,0,0,0,115,74,0,0,0,124,0,160,0, + 161,0,125,1,124,1,100,0,117,0,114,20,100,0,83,0, + 122,40,116,1,124,1,100,1,131,2,125,2,124,2,100,0, + 117,1,114,46,124,2,124,0,95,2,87,0,116,3,160,4, + 124,1,161,1,1,0,100,0,83,0,116,3,160,4,124,1, + 161,1,1,0,48,0,41,2,78,114,45,0,0,0,41,5, + 114,123,0,0,0,114,83,0,0,0,114,107,0,0,0,114, + 17,0,0,0,218,5,99,108,111,115,101,41,3,114,49,0, + 0,0,90,8,101,110,118,95,102,105,108,101,114,45,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,20,99,97,108,99,117,108,97,116,101,95,114,101,97,100, + 95,112,121,101,110,118,143,1,0,0,115,22,0,0,0,8, + 1,8,1,4,2,2,3,10,1,8,1,8,1,10,2,4, + 128,12,0,255,128,122,34,67,97,108,99,117,108,97,116,101, + 80,97,116,104,46,99,97,108,99,117,108,97,116,101,95,114, + 101,97,100,95,112,121,101,110,118,99,1,0,0,0,0,0, + 0,0,0,0,0,0,5,0,0,0,3,0,0,0,67,0, + 0,0,115,210,0,0,0,124,0,106,0,106,1,125,1,124, + 1,100,0,117,1,114,52,124,1,160,2,116,3,161,1,100, + 1,25,0,125,2,116,4,124,2,124,0,106,5,131,2,125, + 2,100,2,124,0,95,6,124,2,83,0,116,4,124,0,106, + 7,116,8,131,2,125,3,116,9,124,3,131,1,114,114,116, + 4,124,0,106,7,124,0,106,10,131,2,125,2,116,4,124, + 2,100,3,131,2,125,2,116,11,124,2,131,1,114,114,100, + 4,124,0,95,6,124,2,83,0,116,12,124,0,106,7,131, + 1,125,2,124,2,114,168,116,4,124,2,124,0,106,5,131, + 2,125,4,116,11,124,4,131,1,114,158,100,2,124,0,95, + 6,124,4,83,0,116,13,124,2,131,1,125,2,113,124,116, + 4,124,0,106,14,124,0,106,5,131,2,125,2,116,11,124, + 2,131,1,114,200,100,2,124,0,95,6,124,2,83,0,100, + 1,124,0,95,6,100,0,83,0,41,5,78,114,0,0,0, + 0,114,10,0,0,0,90,3,76,105,98,114,62,0,0,0, + 41,15,114,88,0,0,0,114,45,0,0,0,218,9,112,97, + 114,116,105,116,105,111,110,114,109,0,0,0,114,15,0,0, + 0,114,104,0,0,0,114,89,0,0,0,114,107,0,0,0, + 218,14,66,85,73,76,68,95,76,65,78,68,77,65,82,75, + 114,23,0,0,0,114,102,0,0,0,114,29,0,0,0,114, + 32,0,0,0,114,13,0,0,0,114,98,0,0,0,41,5, + 114,49,0,0,0,114,45,0,0,0,114,42,0,0,0,114, + 6,0,0,0,90,10,110,101,119,95,112,114,101,102,105,120, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 17,115,101,97,114,99,104,95,102,111,114,95,112,114,101,102, + 105,120,157,1,0,0,115,54,0,0,0,8,2,8,1,14, + 2,12,1,6,1,4,1,12,3,8,1,14,6,10,1,8, + 1,6,2,4,1,10,3,4,1,12,2,8,1,6,1,4, + 1,10,2,14,4,8,1,6,1,4,1,6,3,4,1,255, + 128,122,31,67,97,108,99,117,108,97,116,101,80,97,116,104, + 46,115,101,97,114,99,104,95,102,111,114,95,112,114,101,102, + 105,120,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,4,0,0,0,67,0,0,0,115,68,0,0,0, + 124,0,160,0,161,0,125,1,124,0,106,1,100,1,107,2, + 114,58,124,0,106,2,114,38,116,3,100,2,116,4,106,5, + 100,3,141,2,1,0,116,6,124,0,106,7,124,0,106,8, + 131,2,124,0,95,9,100,0,83,0,124,1,124,0,95,9, + 100,0,83,0,41,4,78,114,0,0,0,0,122,54,67,111, + 117,108,100,32,110,111,116,32,102,105,110,100,32,112,108,97, + 116,102,111,114,109,32,105,110,100,101,112,101,110,100,101,110, + 116,32,108,105,98,114,97,114,105,101,115,32,60,112,114,101, + 102,105,120,62,169,1,90,4,102,105,108,101,41,10,114,128, + 0,0,0,114,89,0,0,0,114,91,0,0,0,218,5,112, + 114,105,110,116,218,3,115,121,115,218,6,115,116,100,101,114, + 114,114,15,0,0,0,114,98,0,0,0,114,104,0,0,0, + 114,42,0,0,0,169,2,114,49,0,0,0,114,42,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,16,99,97,108,99,117,108,97,116,101,95,112,114,101,102, + 105,120,204,1,0,0,115,22,0,0,0,8,1,10,1,6, + 1,4,1,4,1,6,255,16,2,4,128,6,2,4,128,255, + 128,122,30,67,97,108,99,117,108,97,116,101,80,97,116,104, + 46,99,97,108,99,117,108,97,116,101,95,112,114,101,102,105, + 120,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,6,0,0,0,67,0,0,0,115,78,0,0,0,116, + 0,124,0,106,1,100,1,116,2,155,0,116,3,155,0,100, + 2,157,4,131,2,125,1,124,0,106,4,100,3,107,4,114, + 60,116,0,116,5,116,5,124,0,106,6,131,1,131,1,124, + 1,131,2,124,0,95,7,100,0,83,0,116,0,124,0,106, + 8,124,1,131,2,124,0,95,7,100,0,83,0,41,4,78, + 114,87,0,0,0,122,4,46,122,105,112,114,0,0,0,0, + 41,9,114,15,0,0,0,114,86,0,0,0,218,16,80,89, + 95,77,65,74,79,82,95,86,69,82,83,73,79,78,218,16, + 80,89,95,77,73,78,79,82,95,86,69,82,83,73,79,78, + 114,89,0,0,0,114,13,0,0,0,114,42,0,0,0,218, + 8,122,105,112,95,112,97,116,104,114,98,0,0,0,41,2, + 114,49,0,0,0,114,6,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,18,99,97,108,99,117, + 108,97,116,101,95,122,105,112,95,112,97,116,104,214,1,0, + 0,115,18,0,0,0,6,1,14,1,4,255,10,2,22,2, + 4,128,14,2,4,128,255,128,122,32,67,97,108,99,117,108, + 97,116,101,80,97,116,104,46,99,97,108,99,117,108,97,116, + 101,95,122,105,112,95,112,97,116,104,99,1,0,0,0,0, + 0,0,0,0,0,0,0,6,0,0,0,9,0,0,0,67, + 0,0,0,115,122,0,0,0,116,0,124,0,106,1,100,1, + 131,2,125,1,122,18,116,2,160,3,124,1,116,2,106,4, + 161,2,125,2,87,0,110,20,4,0,116,5,121,50,1,0, + 1,0,1,0,89,0,100,0,83,0,48,0,122,22,116,6, + 124,2,131,1,125,3,87,0,116,2,160,7,124,2,161,1, + 1,0,110,12,116,2,160,7,124,2,161,1,1,0,48,0, + 124,3,160,8,100,2,100,3,161,2,125,4,116,0,124,0, + 106,1,124,4,131,2,125,5,100,4,124,0,95,9,124,5, + 83,0,41,5,78,122,14,112,121,98,117,105,108,100,100,105, + 114,46,116,120,116,114,76,0,0,0,114,77,0,0,0,114, + 62,0,0,0,41,10,114,15,0,0,0,114,107,0,0,0, + 114,17,0,0,0,114,121,0,0,0,114,122,0,0,0,114, + 19,0,0,0,114,74,0,0,0,114,124,0,0,0,114,80, + 0,0,0,114,90,0,0,0,41,6,114,49,0,0,0,114, + 22,0,0,0,114,73,0,0,0,114,81,0,0,0,90,10, + 112,121,98,117,105,108,100,100,105,114,114,43,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,20, + 99,97,108,99,117,108,97,116,101,95,112,121,98,117,105,108, + 100,100,105,114,223,1,0,0,115,26,0,0,0,12,6,2, + 1,18,1,12,1,8,1,2,2,10,1,24,2,12,1,12, + 2,6,1,4,1,255,128,122,34,67,97,108,99,117,108,97, + 116,101,80,97,116,104,46,99,97,108,99,117,108,97,116,101, + 95,112,121,98,117,105,108,100,100,105,114,99,1,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,3,0,0,0, + 67,0,0,0,115,232,0,0,0,124,0,106,0,106,1,125, + 1,124,1,114,80,124,1,160,2,116,3,161,1,125,2,116, + 4,124,2,131,1,100,1,107,5,114,44,124,2,100,2,25, + 0,125,3,110,4,124,1,125,3,116,5,124,3,124,0,106, + 6,131,2,125,3,116,5,124,3,100,3,131,2,125,3,100, + 2,124,0,95,7,124,3,83,0,124,0,106,7,100,4,107, + 2,115,94,74,0,130,1,124,0,160,8,161,0,125,3,124, + 0,106,7,100,4,107,3,114,116,124,3,83,0,116,9,124, + 0,106,10,131,1,125,3,124,3,114,180,116,5,124,3,124, + 0,106,6,131,2,125,4,116,5,124,4,100,3,131,2,125, + 4,116,11,124,4,131,1,114,170,100,2,124,0,95,7,124, + 4,83,0,116,12,124,3,131,1,125,3,113,126,116,5,124, + 0,106,13,124,0,106,6,131,2,125,3,116,5,124,3,100, + 3,131,2,125,3,116,11,124,3,131,1,114,222,100,2,124, + 0,95,7,124,3,83,0,100,4,124,0,95,7,100,0,83, + 0,41,5,78,114,79,0,0,0,114,10,0,0,0,250,11, + 108,105,98,45,100,121,110,108,111,97,100,114,0,0,0,0, + 41,14,114,88,0,0,0,114,45,0,0,0,114,71,0,0, + 0,114,109,0,0,0,114,11,0,0,0,114,15,0,0,0, + 114,104,0,0,0,114,90,0,0,0,114,139,0,0,0,114, + 32,0,0,0,114,107,0,0,0,114,26,0,0,0,114,13, + 0,0,0,114,100,0,0,0,41,5,114,49,0,0,0,114, + 45,0,0,0,218,5,112,97,116,104,115,114,43,0,0,0, + 90,15,110,101,119,95,101,120,101,99,95,112,114,101,102,105, + 120,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,22,115,101,97,114,99,104,95,102,111,114,95,101,120,101, + 99,95,112,114,101,102,105,120,245,1,0,0,115,60,0,0, + 0,8,2,4,1,10,2,12,1,10,1,4,2,12,2,10, + 1,6,1,4,1,14,3,8,1,10,1,4,1,10,3,4, + 1,12,2,10,1,8,1,6,1,4,1,10,2,14,3,10, + 1,8,1,6,1,4,1,6,3,4,128,255,128,122,36,67, + 97,108,99,117,108,97,116,101,80,97,116,104,46,115,101,97, + 114,99,104,95,102,111,114,95,101,120,101,99,95,112,114,101, + 102,105,120,99,1,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,4,0,0,0,67,0,0,0,115,78,0,0, + 0,124,0,160,0,161,0,125,1,124,0,106,1,100,1,107, + 2,114,68,124,0,106,2,114,38,116,3,100,2,116,4,106, + 5,100,3,141,2,1,0,116,6,124,0,106,7,100,4,131, + 2,125,2,116,6,124,0,106,8,124,2,131,2,124,0,95, + 9,100,0,83,0,124,1,124,0,95,9,100,0,83,0,41, + 5,78,114,0,0,0,0,122,58,67,111,117,108,100,32,110, + 111,116,32,102,105,110,100,32,112,108,97,116,102,111,114,109, + 32,100,101,112,101,110,100,101,110,116,32,108,105,98,114,97, + 114,105,101,115,32,60,101,120,101,99,95,112,114,101,102,105, + 120,62,10,114,129,0,0,0,114,140,0,0,0,41,10,114, + 142,0,0,0,114,90,0,0,0,114,91,0,0,0,114,130, + 0,0,0,114,131,0,0,0,114,132,0,0,0,114,15,0, + 0,0,114,86,0,0,0,114,100,0,0,0,114,43,0,0, + 0,41,3,114,49,0,0,0,114,43,0,0,0,90,11,108, + 105,98,95,100,121,110,108,111,97,100,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,21,99,97,108,99,117, + 108,97,116,101,95,101,120,101,99,95,112,114,101,102,105,120, + 33,2,0,0,115,24,0,0,0,8,1,10,2,6,1,4, + 1,4,1,6,255,12,3,14,1,4,128,6,3,4,128,255, + 128,122,35,67,97,108,99,117,108,97,116,101,80,97,116,104, + 46,99,97,108,99,117,108,97,116,101,95,101,120,101,99,95, + 112,114,101,102,105,120,99,1,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115, + 116,0,0,0,103,0,125,1,124,0,106,0,114,28,124,1, + 160,1,124,0,106,0,160,2,116,3,161,1,161,1,1,0, + 124,1,160,4,124,0,106,5,161,1,1,0,124,0,106,6, + 160,2,116,3,161,1,68,0,93,38,125,2,124,2,114,74, + 116,7,124,0,106,8,124,2,131,2,125,2,110,6,124,0, + 106,8,125,2,124,1,160,4,124,2,161,1,1,0,113,52, + 124,1,160,4,124,0,106,9,161,1,1,0,124,1,124,0, + 106,10,95,11,100,0,83,0,114,3,0,0,0,41,12,114, + 85,0,0,0,218,6,101,120,116,101,110,100,114,71,0,0, + 0,114,109,0,0,0,218,6,97,112,112,101,110,100,114,137, + 0,0,0,114,96,0,0,0,114,15,0,0,0,114,42,0, + 0,0,114,43,0,0,0,114,88,0,0,0,114,40,0,0, + 0,41,3,114,49,0,0,0,114,141,0,0,0,114,6,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,28,99,97,108,99,117,108,97,116,101,95,109,111,100, + 117,108,101,95,115,101,97,114,99,104,95,112,97,116,104,47, + 2,0,0,115,26,0,0,0,4,1,6,3,18,1,12,3, + 16,4,4,1,14,1,6,2,12,1,12,3,8,2,4,128, + 255,128,122,42,67,97,108,99,117,108,97,116,101,80,97,116, + 104,46,99,97,108,99,117,108,97,116,101,95,109,111,100,117, + 108,101,95,115,101,97,114,99,104,95,112,97,116,104,99,1, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, + 0,0,0,67,0,0,0,115,58,0,0,0,124,0,106,0, + 100,1,107,4,114,44,116,1,116,1,124,0,106,2,131,1, + 131,1,125,1,124,1,115,32,116,3,125,1,124,1,124,0, + 106,4,95,2,100,0,83,0,124,0,106,5,124,0,106,4, + 95,2,100,0,83,0,169,2,78,114,0,0,0,0,41,6, + 114,89,0,0,0,114,13,0,0,0,114,42,0,0,0,114, + 5,0,0,0,114,88,0,0,0,114,98,0,0,0,114,133, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,20,99,97,108,99,117,108,97,116,101,95,115,101, + 116,95,112,114,101,102,105,120,71,2,0,0,115,18,0,0, + 0,10,5,14,1,4,1,4,3,8,1,4,128,10,2,4, + 128,255,128,122,34,67,97,108,99,117,108,97,116,101,80,97, + 116,104,46,99,97,108,99,117,108,97,116,101,95,115,101,116, + 95,112,114,101,102,105,120,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,4,0,0,0,67,0,0,0, + 115,62,0,0,0,124,0,106,0,100,1,107,4,114,48,116, + 1,116,1,116,1,124,0,106,2,131,1,131,1,131,1,125, + 1,124,1,115,36,116,3,125,1,124,1,124,0,106,4,95, + 2,100,0,83,0,124,0,106,5,124,0,106,4,95,2,100, + 0,83,0,114,147,0,0,0,41,6,114,90,0,0,0,114, + 13,0,0,0,114,43,0,0,0,114,5,0,0,0,114,88, + 0,0,0,114,100,0,0,0,41,2,114,49,0,0,0,114, + 43,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,25,99,97,108,99,117,108,97,116,101,95,115, + 101,116,95,101,120,101,99,95,112,114,101,102,105,120,86,2, + 0,0,115,18,0,0,0,10,1,18,1,4,1,4,3,8, + 1,4,128,10,2,4,128,255,128,122,39,67,97,108,99,117, + 108,97,116,101,80,97,116,104,46,99,97,108,99,117,108,97, + 116,101,95,115,101,116,95,101,120,101,99,95,112,114,101,102, + 105,120,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,4,0,0,0,67,0,0,0,115,164,0,0,0, + 124,0,106,0,106,1,100,0,117,0,114,20,124,0,160,2, + 161,0,1,0,124,0,160,3,161,0,1,0,124,0,160,4, + 161,0,1,0,124,0,160,5,161,0,1,0,124,0,160,6, + 161,0,1,0,124,0,160,7,161,0,1,0,124,0,106,8, + 100,1,107,2,115,80,124,0,106,9,100,1,107,2,114,100, + 124,0,106,10,114,100,116,11,100,2,116,12,106,13,100,3, + 141,2,1,0,124,0,106,0,106,14,100,0,117,0,114,120, + 124,0,160,15,161,0,1,0,124,0,106,0,106,16,100,0, + 117,0,114,140,124,0,160,17,161,0,1,0,124,0,106,0, + 106,18,100,0,117,0,114,160,124,0,160,19,161,0,1,0, + 100,0,83,0,41,4,78,114,0,0,0,0,122,56,67,111, + 110,115,105,100,101,114,32,115,101,116,116,105,110,103,32,36, + 80,89,84,72,79,78,72,79,77,69,32,116,111,32,60,112, + 114,101,102,105,120,62,91,58,60,101,120,101,99,95,112,114, + 101,102,105,120,62,93,114,129,0,0,0,41,20,114,88,0, + 0,0,114,41,0,0,0,114,117,0,0,0,114,119,0,0, + 0,114,125,0,0,0,114,134,0,0,0,114,138,0,0,0, + 114,143,0,0,0,114,89,0,0,0,114,90,0,0,0,114, + 91,0,0,0,114,130,0,0,0,114,131,0,0,0,114,132, + 0,0,0,114,40,0,0,0,114,146,0,0,0,114,42,0, + 0,0,114,148,0,0,0,114,43,0,0,0,114,149,0,0, + 0,114,48,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,9,99,97,108,99,117,108,97,116,101, + 127,2,0,0,115,42,0,0,0,12,1,8,1,8,2,8, + 4,8,2,8,1,8,1,20,2,4,1,2,255,4,2,4, + 1,6,255,12,3,8,1,12,1,8,1,12,1,8,1,4, + 128,255,128,122,23,67,97,108,99,117,108,97,116,101,80,97, + 116,104,46,99,97,108,99,117,108,97,116,101,78,41,23,114, + 66,0,0,0,114,67,0,0,0,114,68,0,0,0,114,50, + 0,0,0,114,106,0,0,0,114,108,0,0,0,218,12,115, + 116,97,116,105,99,109,101,116,104,111,100,114,111,0,0,0, + 114,114,0,0,0,114,117,0,0,0,114,119,0,0,0,114, + 123,0,0,0,114,125,0,0,0,114,128,0,0,0,114,134, + 0,0,0,114,138,0,0,0,114,139,0,0,0,114,142,0, + 0,0,114,143,0,0,0,114,146,0,0,0,114,148,0,0, + 0,114,149,0,0,0,114,150,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 84,0,0,0,253,0,0,0,115,44,0,0,0,8,0,8, + 1,8,21,8,16,2,24,10,1,8,9,8,27,8,18,8, + 9,8,20,8,14,8,47,8,10,8,9,8,22,8,44,8, + 14,8,24,8,15,12,41,255,128,114,84,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2, + 0,0,0,67,0,0,0,115,44,0,0,0,124,0,100,1, + 25,0,111,42,124,0,100,2,25,0,100,0,117,1,111,42, + 124,0,100,3,25,0,100,0,117,1,111,42,124,0,100,4, + 25,0,100,0,117,1,83,0,41,5,78,114,55,0,0,0, + 114,57,0,0,0,114,42,0,0,0,114,43,0,0,0,114, + 7,0,0,0,41,1,114,53,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,8,99,111,109,112, + 117,116,101,100,154,2,0,0,115,16,0,0,0,8,1,10, + 1,2,255,10,2,2,254,10,3,2,253,255,128,114,152,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,67,0,0,0,115,74,0,0,0, + 116,0,160,1,161,0,125,0,116,2,124,0,131,1,114,20, + 100,0,83,0,116,3,131,0,125,1,124,1,160,4,124,0, + 161,1,1,0,116,5,124,1,124,0,131,2,160,6,161,0, + 1,0,124,1,160,7,124,0,161,1,1,0,116,0,160,8, + 124,0,161,1,1,0,100,0,83,0,114,3,0,0,0,41, + 9,114,105,0,0,0,90,10,103,101,116,95,99,111,110,102, + 105,103,114,152,0,0,0,114,39,0,0,0,114,59,0,0, + 0,114,84,0,0,0,114,150,0,0,0,114,65,0,0,0, + 90,10,115,101,116,95,99,111,110,102,105,103,41,2,114,53, + 0,0,0,114,88,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,4,109,97,105,110,161,2,0, + 0,115,20,0,0,0,8,1,8,1,4,1,6,2,10,1, + 14,1,10,1,10,2,4,128,255,128,114,153,0,0,0,90, + 8,95,95,109,97,105,110,95,95,41,46,114,17,0,0,0, + 90,5,95,115,116,97,116,114,1,0,0,0,114,2,0,0, + 0,114,105,0,0,0,114,131,0,0,0,114,120,0,0,0, + 114,28,0,0,0,114,127,0,0,0,218,12,118,101,114,115, + 105,111,110,95,105,110,102,111,218,5,109,97,106,111,114,114, + 135,0,0,0,218,5,109,105,110,111,114,114,136,0,0,0, + 114,5,0,0,0,114,109,0,0,0,114,118,0,0,0,218, + 8,112,108,97,116,102,111,114,109,114,113,0,0,0,114,46, + 0,0,0,114,115,0,0,0,114,116,0,0,0,114,93,0, + 0,0,114,95,0,0,0,114,97,0,0,0,114,99,0,0, + 0,114,101,0,0,0,114,103,0,0,0,114,9,0,0,0, + 114,13,0,0,0,114,15,0,0,0,114,23,0,0,0,114, + 25,0,0,0,114,26,0,0,0,114,29,0,0,0,114,32, + 0,0,0,114,33,0,0,0,114,35,0,0,0,114,38,0, + 0,0,114,39,0,0,0,114,74,0,0,0,114,83,0,0, + 0,114,84,0,0,0,114,152,0,0,0,114,153,0,0,0, + 114,66,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,8,60,109,111,100,117, + 108,101,62,1,0,0,0,115,94,0,0,0,8,2,16,1, + 8,1,8,1,4,2,4,1,4,1,8,2,8,1,6,2, + 6,1,6,1,10,1,10,1,4,2,4,1,6,5,10,3, + 10,1,10,1,10,1,10,1,8,3,8,5,8,9,8,14, + 8,11,8,11,8,9,8,8,8,14,4,1,8,2,8,13, + 14,23,8,60,8,18,14,18,0,127,0,127,0,127,8,32, + 8,7,10,13,6,1,4,128,255,128, +}; diff --git a/Python/initconfig.c b/Python/initconfig.c index 4d95ac5d8859b1b..5c232db4e5f4275 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -150,7 +150,7 @@ int Py_InspectFlag = 0; /* Needed to determine whether to exit at SystemExit */ int Py_OptimizeFlag = 0; /* Needed by compile.c */ int Py_NoSiteFlag = 0; /* Suppress 'import site' */ int Py_BytesWarningFlag = 0; /* Warn on str(bytes) and str(buffer) */ -int Py_FrozenFlag = 0; /* Needed by getpath.c */ +int Py_FrozenFlag = 0; /* Needed by _getpath.py */ int Py_IgnoreEnvironmentFlag = 0; /* e.g. PYTHONPATH, PYTHONHOME */ int Py_DontWriteBytecodeFlag = 0; /* Suppress writing bytecode files (*.pyc) */ int Py_NoUserSiteDirectory = 0; /* for -s and site.py */ @@ -266,16 +266,21 @@ int PyStatus_Exception(PyStatus status) PyObject* _PyErr_SetFromPyStatus(PyStatus status) { - if (!_PyStatus_IS_ERROR(status)) { - PyErr_Format(PyExc_SystemError, - "%s() expects an error PyStatus", - _PyStatus_GET_FUNC()); - } - else if (status.func) { - PyErr_Format(PyExc_ValueError, "%s: %s", status.func, status.err_msg); + if (_PyStatus_IS_EXIT(status)) { + PyObject *arg = PyLong_FromLong(status.exitcode); + if (arg == NULL) { + return NULL; + } + PyErr_SetObject(PyExc_SystemExit, arg); } else { - PyErr_Format(PyExc_ValueError, "%s", status.err_msg); + assert(_PyStatus_IS_ERROR(status)); + if (status.func) { + PyErr_Format(PyExc_ValueError, "%s: %s", status.func, status.err_msg); + } + else { + PyErr_Format(PyExc_ValueError, "%s", status.err_msg); + } } return NULL; } diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 470aba75bea9690..4f8809a83262617 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -350,9 +350,11 @@ pathconfig_init(_PyPathConfig *pathconfig, const PyConfig *config, goto done; } +#ifdef MS_WINDOWS if (compute_path_config) { status = _PyPathConfig_Calculate(pathconfig, config); } +#endif done: PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 428c887ef41c500..29144896b79c683 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -997,6 +997,35 @@ pyinit_main_reconfigure(PyThreadState *tstate) } +#ifndef MS_WINDOWS +// Run _getpath.main() to compute the Python path configuration. +static int +pyinit_run__getpath(void) +{ + PyObject *mod = PyImport_ImportModule("_getpath"); + if (mod == NULL) { + return -1; + } + + PyObject *func = PyObject_GetAttrString(mod, "main"); + if (func == NULL) { + Py_DECREF(mod); + return -1; + } + + PyObject *res = PyObject_CallNoArgs(func); + Py_DECREF(func); + if (res == NULL) { + Py_DECREF(mod); + return -1; + } + + Py_DECREF(mod); + return 0; +} +#endif // !MS_WINDOWS + + static PyStatus init_interp_main(PyThreadState *tstate) { @@ -1019,11 +1048,17 @@ init_interp_main(PyThreadState *tstate) return _PyStatus_OK(); } +#ifdef MS_WINDOWS // Compute the path configuration status = _PyConfig_InitPathConfig(&interp->config, 1); if (_PyStatus_EXCEPTION(status)) { return status; } +#else + if (pyinit_run__getpath() < 0) { + return _PyStatus_ERR("_getpath failed"); + } +#endif if (interpreter_update_config(tstate, 1) < 0) { return _PyStatus_ERR("failed to update the Python config"); diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py index eef758495386c4f..1330f5c2802de56 100644 --- a/Tools/c-analyzer/cpython/_parser.py +++ b/Tools/c-analyzer/cpython/_parser.py @@ -143,7 +143,6 @@ def clean_lines(text): Modules/faulthandler.c Py_BUILD_CORE 1 Modules/_functoolsmodule.c Py_BUILD_CORE 1 Modules/gcmodule.c Py_BUILD_CORE 1 -Modules/getpath.c Py_BUILD_CORE 1 Modules/_io/*.c Py_BUILD_CORE 1 Modules/itertoolsmodule.c Py_BUILD_CORE 1 Modules/_localemodule.c Py_BUILD_CORE 1 @@ -235,11 +234,11 @@ def clean_lines(text): Include/**/*.h _POSIX_THREADS 1 # from Makefile -Modules/getpath.c PYTHONPATH 1 -Modules/getpath.c PREFIX ... -Modules/getpath.c EXEC_PREFIX ... -Modules/getpath.c VERSION ... -Modules/getpath.c VPATH ... +Modules/_cgetpath.c PYTHONPATH 1 +Modules/_cgetpath.c PREFIX ... +Modules/_cgetpath.c EXEC_PREFIX ... +Modules/_cgetpath.c VERSION ... +Modules/_cgetpath.c VPATH ... # from Modules/_sha3/sha3module.c Modules/_sha3/kcp/KeccakP-1600-inplace32BI.c PLATFORM_BYTE_ORDER 4321 # force big-endian From 49b150d0788095437f204ce550035cdf6d1c9284 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 25 Nov 2020 00:45:38 +0100 Subject: [PATCH 2/2] Avoid hardcoded constants Also move PathConfig class --- Lib/_getpath.py | 113 ++-- Python/getpath.h | 1515 +++++++++++++++++++++++----------------------- 2 files changed, 820 insertions(+), 808 deletions(-) diff --git a/Lib/_getpath.py b/Lib/_getpath.py index 0c8b5b17e7e2c3f..0ba1c8f3055ee58 100644 --- a/Lib/_getpath.py +++ b/Lib/_getpath.py @@ -1,10 +1,20 @@ # Compute the Python Path Configuration on Unix. +# This module is imported during the Python initialization. +# Only builtin and frozen modules can be imported. import posix -from _stat import S_ISREG, S_ISDIR +from _stat import S_ISREG, S_ISDIR, S_IXUSR, S_IXGRP, S_IXOTH import _cgetpath import sys + +# Use 'os' module name to make the code look more regular +os = posix + +# Py_DecodeLocale() function: decode a byte string from the filesystem encoding +# and error handler. +decode_locale = _cgetpath.decode_locale + ENV_CFG = "pyvenv.cfg" LANDMARK = "os.py" BUILD_LANDMARK = "Modules/Setup.local" @@ -22,11 +32,6 @@ __MINGW32__ = False -# Py_DecodeLocale() function: decode a byte string from the filesystem encoding -# and error handler. -decode_locale = _cgetpath.decode_locale - - PYTHONPATH = decode_locale(_cgetpath.PYTHONPATH) PREFIX = decode_locale(_cgetpath.PREFIX) EXEC_PREFIX = decode_locale(_cgetpath.EXEC_PREFIX) @@ -35,7 +40,7 @@ def isabs(path): - # an empty path is not considered as absolute + # An empty path is considered as a relative path. return (path and path.startswith(SEP)) @@ -64,7 +69,7 @@ def joinpath(path, path2): # Is a file, not a directory? def isfile(filename): try: - st = posix.stat(filename) + st = os.stat(filename) except OSError: return False if not S_ISREG(st.st_mode): @@ -75,18 +80,18 @@ def isfile(filename): # Is executable file? def isxfile(filename): try: - st = posix.stat(filename) + st = os.stat(filename) except OSError: return False if not S_ISREG(st.st_mode): return False - return ((st.st_mode & 0o111) != 0) + return ((st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) != 0) # Is a directory? def isdir(filename): try: - st = posix.stat(filename) + st = os.stat(filename) except OSError: return False return S_ISDIR(st.st_mode) @@ -106,7 +111,7 @@ def abspath(path): return path try: - cwd = posix.getcwd() + cwd = os.getcwd() except OSError: return path @@ -135,7 +140,7 @@ def resolve_symlinks(path): nlink = 0 while True: try: - new_path = posix.readlink(path) + new_path = os.readlink(path) except OSError: # Not a symbolic link: we are done. break @@ -154,6 +159,42 @@ def resolve_symlinks(path): return path +def readline(fd): + # FIXME: write better code + # FIXME: support '\r' newline (macOS) + nl = b'\n' + buf = bytearray() + while True: + chunk = os.read(fd, 4096) + if not chunk: + break + if nl in chunk: + chunk = chunk.split(nl, 1)[0] + buf += chunk + break + buf += chunk + return bytes(buf) + + +# Search for a prefix value in an environment file (pyvenv.cfg). +def find_env_config_value(fd, key): + while True: + line = readline(fd) + if not line: + break + if line.startswith(b'#'): + # Comment - skip + continue + + line = line.decode('utf-8', 'surrogateescape') + + # FIXME: rewrite this code + tok = line.split() # FIXME: only split at " \t\r\n" + if tok[0] == key and tok[1] == '=': + value = tok[2] + return value + + class PathConfig: def __init__(self): self.module_search_path = None @@ -214,42 +255,6 @@ def set_to_config(self, config): config['site_import'] = self.site_import -def readline(fd): - # FIXME: write better code - # FIXME: support '\r' newline (macOS) - nl = b'\n' - buf = bytearray() - while True: - chunk = posix.read(fd, 4096) - if not chunk: - break - if nl in chunk: - chunk = chunk.split(nl, 1)[0] - buf += chunk - break - buf += chunk - return bytes(buf) - - -# Search for a prefix value in an environment file (pyvenv.cfg). -def find_env_config_value(fd, key): - while True: - line = readline(fd) - if not line: - break - if line.startswith(b'#'): - # Comment - skip - continue - - line = line.decode('utf-8', 'surrogateescape') - - # FIXME: rewrite this code - tok = line.split() # FIXME: only split at " \t\r\n" - if tok[0] == key and tok[1] == '=': - value = tok[2] - return value - - class CalculatePath: def __init__(self, pathconfig, config): self.pathconfig = pathconfig @@ -380,14 +385,14 @@ def calculate_open_pyenv(self): # Filename: / "pyvenv.cfg" filename = joinpath(self.argv0_path, ENV_CFG) try: - return posix.open(filename, posix.O_RDONLY) + return os.open(filename, os.O_RDONLY) except OSError: pass # Path: / "pyvenv.cfg" filename = joinpath(dirname(self.argv0_path), ENV_CFG) try: - return posix.open(filename, posix.O_RDONLY) + return os.open(filename, os.O_RDONLY) except OSError: return None @@ -408,7 +413,7 @@ def calculate_read_pyenv(self): if home is not None: self.argv0_path = home finally: - posix.close(env_file) + os.close(env_file) def search_for_prefix(self): # If PYTHONHOME is set, we believe it unconditionally @@ -484,14 +489,14 @@ def calculate_pybuilddir(self): # Filename: / "pybuilddir.txt" filename = joinpath(self.argv0_path, "pybuilddir.txt") try: - fd = posix.open(filename, posix.O_RDONLY) + fd = os.open(filename, os.O_RDONLY) except OSError: return try: line = readline(fd) finally: - posix.close(fd) + os.close(fd) pybuilddir = line.decode('utf-8', 'surrogateescape') exec_prefix = joinpath(self.argv0_path, pybuilddir) diff --git a/Python/getpath.h b/Python/getpath.h index b1e0e98ad1099aa..17ca1994b4479b0 100644 --- a/Python/getpath.h +++ b/Python/getpath.h @@ -1,770 +1,777 @@ /* Auto-generated by Programs/_freeze_importlib.c */ const unsigned char _Py_M__getpath[] = { 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,64,0,0,0,115,86,1,0,0,100,0, + 0,3,0,0,0,64,0,0,0,115,106,1,0,0,100,0, 100,1,108,0,90,0,100,0,100,2,108,1,109,2,90,2, - 109,3,90,3,1,0,100,0,100,1,108,4,90,4,100,0, - 100,1,108,5,90,5,100,3,90,6,100,4,90,7,100,5, - 90,8,101,5,106,9,106,10,90,11,101,5,106,9,106,12, - 90,13,101,4,106,14,90,14,101,4,106,15,90,15,101,4, - 106,16,90,16,101,5,106,17,100,6,107,2,90,18,101,5, - 106,17,100,7,107,2,90,19,100,8,90,20,100,8,90,21, - 101,4,106,22,90,22,101,22,101,4,106,23,131,1,90,23, - 101,22,101,4,106,24,131,1,90,24,101,22,101,4,106,25, - 131,1,90,25,101,22,101,4,106,26,131,1,90,26,101,22, - 101,4,106,27,131,1,90,27,100,9,100,10,132,0,90,28, - 100,11,100,12,132,0,90,29,100,13,100,14,132,0,90,30, - 100,15,100,16,132,0,90,31,100,17,100,18,132,0,90,32, - 100,19,100,20,132,0,90,33,100,21,100,22,132,0,90,34, - 100,23,100,24,132,0,90,35,101,20,115,242,101,21,114,254, - 100,25,90,36,100,26,100,27,132,0,90,37,100,28,100,29, - 132,0,90,38,71,0,100,30,100,31,132,0,100,31,131,2, - 90,39,100,32,100,33,132,0,90,40,100,34,100,35,132,0, - 90,41,71,0,100,36,100,37,132,0,100,37,131,2,90,42, - 100,38,100,39,132,0,90,43,100,40,100,41,132,0,90,44, - 101,45,100,42,107,2,144,1,114,82,101,44,131,0,1,0, - 100,1,83,0,41,43,233,0,0,0,0,78,41,2,218,7, - 83,95,73,83,82,69,71,218,7,83,95,73,83,68,73,82, - 122,10,112,121,118,101,110,118,46,99,102,103,122,5,111,115, - 46,112,121,122,19,77,111,100,117,108,101,115,47,83,101,116, - 117,112,46,108,111,99,97,108,90,6,100,97,114,119,105,110, - 90,5,119,105,110,51,50,70,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,14,0,0,0,124,0,111,12,124,0,160,0,116,1, - 161,1,83,0,169,1,78,41,2,218,10,115,116,97,114,116, - 115,119,105,116,104,218,3,83,69,80,41,1,218,4,112,97, - 116,104,169,0,114,7,0,0,0,250,16,60,102,114,111,122, - 101,110,32,103,101,116,112,97,116,104,62,218,5,105,115,97, - 98,115,37,0,0,0,115,4,0,0,0,14,2,255,128,114, - 9,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,67,0,0,0,115,54,0, - 0,0,116,0,124,0,131,1,100,1,24,0,125,1,124,1, - 100,2,107,4,114,42,124,0,124,1,25,0,116,1,107,3, - 114,42,124,1,100,1,56,0,125,1,113,12,124,0,100,0, - 124,1,133,2,25,0,83,0,41,3,78,233,1,0,0,0, - 114,0,0,0,0,41,2,218,3,108,101,110,114,5,0,0, - 0,41,2,114,6,0,0,0,218,1,105,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,7,100,105,114,110, - 97,109,101,42,0,0,0,115,10,0,0,0,12,2,20,1, - 10,1,12,1,255,128,114,13,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,54,0,0,0,116,0,124,1,131,1,114, - 12,124,1,83,0,124,0,115,20,124,1,83,0,124,0,160, - 1,116,2,161,1,115,46,124,0,155,0,116,2,155,0,124, - 1,155,0,157,3,83,0,124,0,124,1,23,0,83,0,114, - 3,0,0,0,41,3,114,9,0,0,0,218,8,101,110,100, - 115,119,105,116,104,114,5,0,0,0,41,2,114,6,0,0, - 0,90,5,112,97,116,104,50,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,8,106,111,105,110,112,97,116, - 104,51,0,0,0,115,16,0,0,0,8,1,4,1,4,2, - 4,1,10,2,16,1,8,2,255,128,114,15,0,0,0,99, + 109,3,90,3,109,4,90,4,109,5,90,5,109,6,90,6, + 1,0,100,0,100,1,108,7,90,7,100,0,100,1,108,8, + 90,8,101,0,90,9,101,7,106,10,90,10,100,3,90,11, + 100,4,90,12,100,5,90,13,101,8,106,14,106,15,90,16, + 101,8,106,14,106,17,90,18,101,7,106,19,90,19,101,7, + 106,20,90,20,101,7,106,21,90,21,101,8,106,22,100,6, + 107,2,90,23,101,8,106,22,100,7,107,2,90,24,100,8, + 90,25,100,8,90,26,101,10,101,7,106,27,131,1,90,27, + 101,10,101,7,106,28,131,1,90,28,101,10,101,7,106,29, + 131,1,90,29,101,10,101,7,106,30,131,1,90,30,101,10, + 101,7,106,31,131,1,90,31,100,9,100,10,132,0,90,32, + 100,11,100,12,132,0,90,33,100,13,100,14,132,0,90,34, + 100,15,100,16,132,0,90,35,100,17,100,18,132,0,90,36, + 100,19,100,20,132,0,90,37,100,21,100,22,132,0,90,38, + 100,23,100,24,132,0,90,39,101,25,144,1,115,6,101,26, + 144,1,114,18,100,25,90,40,100,26,100,27,132,0,90,41, + 100,28,100,29,132,0,90,42,100,30,100,31,132,0,90,43, + 100,32,100,33,132,0,90,44,71,0,100,34,100,35,132,0, + 100,35,131,2,90,45,71,0,100,36,100,37,132,0,100,37, + 131,2,90,46,100,38,100,39,132,0,90,47,100,40,100,41, + 132,0,90,48,101,49,100,42,107,2,144,1,114,102,101,48, + 131,0,1,0,100,1,83,0,41,43,233,0,0,0,0,78, + 41,5,218,7,83,95,73,83,82,69,71,218,7,83,95,73, + 83,68,73,82,218,7,83,95,73,88,85,83,82,218,7,83, + 95,73,88,71,82,80,218,7,83,95,73,88,79,84,72,122, + 10,112,121,118,101,110,118,46,99,102,103,122,5,111,115,46, + 112,121,122,19,77,111,100,117,108,101,115,47,83,101,116,117, + 112,46,108,111,99,97,108,90,6,100,97,114,119,105,110,90, + 5,119,105,110,51,50,70,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, + 115,14,0,0,0,124,0,111,12,124,0,160,0,116,1,161, + 1,83,0,169,1,78,41,2,218,10,115,116,97,114,116,115, + 119,105,116,104,218,3,83,69,80,41,1,218,4,112,97,116, + 104,169,0,114,10,0,0,0,250,16,60,102,114,111,122,101, + 110,32,103,101,116,112,97,116,104,62,218,5,105,115,97,98, + 115,42,0,0,0,115,4,0,0,0,14,2,255,128,114,12, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,54,0,0, + 0,116,0,124,0,131,1,100,1,24,0,125,1,124,1,100, + 2,107,4,114,42,124,0,124,1,25,0,116,1,107,3,114, + 42,124,1,100,1,56,0,125,1,113,12,124,0,100,0,124, + 1,133,2,25,0,83,0,41,3,78,233,1,0,0,0,114, + 0,0,0,0,41,2,218,3,108,101,110,114,8,0,0,0, + 41,2,114,9,0,0,0,218,1,105,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,7,100,105,114,110,97, + 109,101,47,0,0,0,115,10,0,0,0,12,2,20,1,10, + 1,12,1,255,128,114,16,0,0,0,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, + 0,0,0,115,54,0,0,0,116,0,124,1,131,1,114,12, + 124,1,83,0,124,0,115,20,124,1,83,0,124,0,160,1, + 116,2,161,1,115,46,124,0,155,0,116,2,155,0,124,1, + 155,0,157,3,83,0,124,0,124,1,23,0,83,0,114,6, + 0,0,0,41,3,114,12,0,0,0,218,8,101,110,100,115, + 119,105,116,104,114,8,0,0,0,41,2,114,9,0,0,0, + 90,5,112,97,116,104,50,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,8,106,111,105,110,112,97,116,104, + 56,0,0,0,115,16,0,0,0,8,1,4,1,4,2,4, + 1,10,2,16,1,8,2,255,128,114,18,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,8, + 0,0,0,67,0,0,0,115,54,0,0,0,122,14,116,0, + 160,1,124,0,161,1,125,1,87,0,110,20,4,0,116,2, + 121,34,1,0,1,0,1,0,89,0,100,1,83,0,48,0, + 116,3,124,1,106,4,131,1,115,50,100,1,83,0,100,2, + 83,0,41,3,78,70,84,41,5,218,2,111,115,218,4,115, + 116,97,116,218,7,79,83,69,114,114,111,114,114,1,0,0, + 0,218,7,115,116,95,109,111,100,101,169,2,218,8,102,105, + 108,101,110,97,109,101,90,2,115,116,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,6,105,115,102,105,108, + 101,70,0,0,0,115,16,0,0,0,2,1,14,1,12,1, + 8,1,10,1,4,1,4,1,255,128,114,25,0,0,0,99, 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 8,0,0,0,67,0,0,0,115,54,0,0,0,122,14,116, + 8,0,0,0,67,0,0,0,115,72,0,0,0,122,14,116, 0,160,1,124,0,161,1,125,1,87,0,110,20,4,0,116, 2,121,34,1,0,1,0,1,0,89,0,100,1,83,0,48, - 0,116,3,124,1,106,4,131,1,115,50,100,1,83,0,100, - 2,83,0,41,3,78,70,84,169,5,218,5,112,111,115,105, - 120,218,4,115,116,97,116,218,7,79,83,69,114,114,111,114, - 114,1,0,0,0,218,7,115,116,95,109,111,100,101,169,2, - 218,8,102,105,108,101,110,97,109,101,90,2,115,116,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,6,105, - 115,102,105,108,101,65,0,0,0,115,16,0,0,0,2,1, - 14,1,12,1,8,1,10,1,4,1,4,1,255,128,114,23, + 0,116,3,124,1,106,4,131,1,115,50,100,1,83,0,124, + 1,106,4,116,5,116,6,66,0,116,7,66,0,64,0,100, + 2,107,3,83,0,41,3,78,70,114,0,0,0,0,41,8, + 114,19,0,0,0,114,20,0,0,0,114,21,0,0,0,114, + 1,0,0,0,114,22,0,0,0,114,3,0,0,0,114,4, + 0,0,0,114,5,0,0,0,114,23,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,7,105,115, + 120,102,105,108,101,81,0,0,0,115,16,0,0,0,2,1, + 14,1,12,1,8,1,10,1,4,1,22,1,255,128,114,26, 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,8,0,0,0,67,0,0,0,115,64,0,0, + 2,0,0,0,8,0,0,0,67,0,0,0,115,46,0,0, 0,122,14,116,0,160,1,124,0,161,1,125,1,87,0,110, 20,4,0,116,2,121,34,1,0,1,0,1,0,89,0,100, - 1,83,0,48,0,116,3,124,1,106,4,131,1,115,50,100, - 1,83,0,124,1,106,4,100,2,64,0,100,3,107,3,83, - 0,41,4,78,70,233,73,0,0,0,114,0,0,0,0,114, - 16,0,0,0,114,21,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,7,105,115,120,102,105,108, - 101,76,0,0,0,115,16,0,0,0,2,1,14,1,12,1, - 8,1,10,1,4,1,14,1,255,128,114,25,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 8,0,0,0,67,0,0,0,115,46,0,0,0,122,14,116, - 0,160,1,124,0,161,1,125,1,87,0,110,20,4,0,116, - 2,121,34,1,0,1,0,1,0,89,0,100,1,83,0,48, - 0,116,3,124,1,106,4,131,1,83,0,41,2,78,70,41, - 5,114,17,0,0,0,114,18,0,0,0,114,19,0,0,0, - 114,2,0,0,0,114,20,0,0,0,114,21,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,5, - 105,115,100,105,114,87,0,0,0,115,12,0,0,0,2,1, - 14,1,12,1,8,1,10,1,255,128,114,26,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 3,0,0,0,67,0,0,0,115,34,0,0,0,116,0,124, - 0,116,1,131,2,125,1,116,2,124,1,131,1,114,22,100, - 1,83,0,116,2,124,1,100,2,23,0,131,1,83,0,41, - 3,78,84,218,1,99,41,3,114,15,0,0,0,218,8,76, - 65,78,68,77,65,82,75,114,23,0,0,0,41,2,114,6, - 0,0,0,114,22,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,8,105,115,109,111,100,117,108, - 101,96,0,0,0,115,10,0,0,0,10,1,8,1,4,1, - 12,3,255,128,114,29,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,8,0,0,0,67,0, - 0,0,115,74,0,0,0,116,0,124,0,131,1,114,12,124, - 0,83,0,122,12,116,1,160,2,161,0,125,1,87,0,110, - 22,4,0,116,3,121,46,1,0,1,0,1,0,124,0,6, - 0,89,0,83,0,48,0,124,0,160,4,100,1,116,5,155, - 0,157,2,161,1,125,0,116,6,124,1,124,0,131,2,83, - 0,41,2,78,218,1,46,41,7,114,9,0,0,0,114,17, - 0,0,0,90,6,103,101,116,99,119,100,114,19,0,0,0, - 218,12,114,101,109,111,118,101,112,114,101,102,105,120,114,5, - 0,0,0,114,15,0,0,0,41,2,114,6,0,0,0,90, - 3,99,119,100,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,7,97,98,115,112,97,116,104,104,0,0,0, - 115,18,0,0,0,8,1,4,1,2,2,12,1,12,1,10, - 1,16,3,10,1,255,128,114,32,0,0,0,122,4,46,101, - 120,101,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,54,0,0,0, - 124,0,116,0,116,1,131,1,11,0,100,0,133,2,25,0, - 160,2,161,0,116,1,107,2,114,30,124,0,83,0,124,0, - 116,1,23,0,125,1,116,3,124,1,131,1,114,50,124,1, - 83,0,124,0,83,0,114,3,0,0,0,41,4,114,11,0, - 0,0,218,10,69,88,69,95,83,85,70,70,73,88,218,5, - 108,111,119,101,114,114,25,0,0,0,41,2,90,8,112,114, - 111,103,112,97,116,104,90,12,112,114,111,103,112,97,116,104, - 95,101,120,101,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,14,97,100,100,95,101,120,101,95,115,117,102, - 102,105,120,121,0,0,0,115,14,0,0,0,26,2,4,1, - 8,2,8,1,4,1,4,2,255,128,114,35,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 8,0,0,0,67,0,0,0,115,92,0,0,0,100,1,125, - 1,122,14,116,0,160,1,124,0,161,1,125,2,87,0,110, - 20,4,0,116,2,121,38,1,0,1,0,1,0,89,0,124, - 0,83,0,48,0,116,3,124,2,131,1,114,54,124,2,125, - 0,110,14,116,4,116,5,124,0,131,1,124,2,131,2,125, - 0,124,1,100,2,55,0,125,1,124,1,100,3,107,5,114, - 4,116,6,100,4,131,1,130,1,41,5,78,114,0,0,0, - 0,114,10,0,0,0,233,40,0,0,0,122,40,109,97,120, - 105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,115, - 121,109,98,111,108,105,99,32,108,105,110,107,115,32,114,101, - 97,99,104,101,100,41,7,114,17,0,0,0,90,8,114,101, - 97,100,108,105,110,107,114,19,0,0,0,114,9,0,0,0, - 114,15,0,0,0,114,13,0,0,0,218,9,69,120,99,101, - 112,116,105,111,110,41,3,114,6,0,0,0,90,5,110,108, - 105,110,107,90,8,110,101,119,95,112,97,116,104,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,16,114,101, - 115,111,108,118,101,95,115,121,109,108,105,110,107,115,134,0, - 0,0,115,28,0,0,0,4,1,2,2,14,1,12,1,2, - 2,4,13,2,243,8,2,6,1,14,3,8,2,8,2,8, - 1,255,128,114,38,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, - 0,115,56,0,0,0,101,0,90,1,100,0,90,2,100,1, - 100,2,132,0,90,3,100,12,100,4,100,5,132,1,90,4, - 100,6,100,7,132,0,90,5,100,13,100,8,100,9,132,1, - 90,6,100,10,100,11,132,0,90,7,100,3,83,0,41,14, - 218,10,80,97,116,104,67,111,110,102,105,103,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0, - 0,67,0,0,0,115,50,0,0,0,100,0,124,0,95,0, - 100,0,124,0,95,1,100,0,124,0,95,2,100,0,124,0, - 95,3,100,0,124,0,95,4,100,0,124,0,95,5,116,6, - 114,46,100,0,124,0,95,7,100,0,83,0,114,3,0,0, - 0,41,8,218,18,109,111,100,117,108,101,95,115,101,97,114, - 99,104,95,112,97,116,104,218,17,112,114,111,103,114,97,109, - 95,102,117,108,108,95,112,97,116,104,218,6,112,114,101,102, - 105,120,218,11,101,120,101,99,95,112,114,101,102,105,120,218, - 12,112,114,111,103,114,97,109,95,110,97,109,101,218,4,104, - 111,109,101,218,10,77,83,95,87,73,78,68,79,87,83,218, - 15,98,97,115,101,95,101,120,101,99,117,116,97,98,108,101, - 169,1,218,4,115,101,108,102,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,8,95,95,105,110,105,116,95, - 95,158,0,0,0,115,20,0,0,0,6,1,6,1,6,1, - 6,1,6,1,6,1,4,1,6,1,4,128,255,128,122,19, - 80,97,116,104,67,111,110,102,105,103,46,95,95,105,110,105, - 116,95,95,78,99,4,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,5,0,0,0,67,0,0,0,115,32,0, - 0,0,124,3,100,0,117,0,114,12,124,2,125,3,116,0, - 124,0,124,2,124,1,124,3,25,0,131,3,1,0,100,0, - 83,0,114,3,0,0,0,41,1,218,7,115,101,116,97,116, - 116,114,169,4,114,49,0,0,0,218,6,99,111,110,102,105, - 103,90,4,97,116,116,114,90,10,99,111,110,102,105,103,95, - 107,101,121,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,11,95,103,101,116,95,99,111,110,102,105,103,168, - 0,0,0,115,10,0,0,0,8,1,4,1,16,1,4,128, - 255,128,122,22,80,97,116,104,67,111,110,102,105,103,46,95, - 103,101,116,95,99,111,110,102,105,103,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,5,0,0,0,67, - 0,0,0,115,100,0,0,0,124,1,100,1,25,0,114,18, - 124,1,100,2,25,0,124,0,95,0,124,0,160,1,124,1, - 100,3,100,4,161,3,1,0,124,0,160,1,124,1,100,5, - 161,2,1,0,124,0,160,1,124,1,100,6,161,2,1,0, - 124,0,160,1,124,1,100,7,161,2,1,0,124,0,160,1, - 124,1,100,8,161,2,1,0,116,2,114,96,124,0,160,1, - 124,1,100,9,161,2,1,0,100,0,83,0,41,10,78,218, - 23,109,111,100,117,108,101,95,115,101,97,114,99,104,95,112, - 97,116,104,115,95,115,101,116,218,19,109,111,100,117,108,101, - 95,115,101,97,114,99,104,95,112,97,116,104,115,114,41,0, - 0,0,218,10,101,120,101,99,117,116,97,98,108,101,114,42, - 0,0,0,114,43,0,0,0,114,44,0,0,0,114,45,0, - 0,0,114,47,0,0,0,41,3,114,40,0,0,0,114,54, - 0,0,0,114,46,0,0,0,169,2,114,49,0,0,0,114, - 53,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,15,115,101,116,95,102,114,111,109,95,99,111, - 110,102,105,103,173,0,0,0,115,22,0,0,0,8,1,10, - 1,14,1,12,1,12,1,12,1,12,1,4,1,12,1,4, - 128,255,128,122,26,80,97,116,104,67,111,110,102,105,103,46, - 115,101,116,95,102,114,111,109,95,99,111,110,102,105,103,99, - 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 3,0,0,0,67,0,0,0,115,46,0,0,0,124,3,100, - 0,117,0,114,12,124,2,125,3,124,1,124,3,25,0,100, - 0,117,1,114,28,100,0,83,0,116,0,124,0,124,2,131, - 2,124,1,124,3,60,0,100,0,83,0,114,3,0,0,0, - 41,1,218,7,103,101,116,97,116,116,114,114,52,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 11,95,115,101,116,95,99,111,110,102,105,103,184,0,0,0, - 115,14,0,0,0,8,1,4,1,12,1,4,1,14,1,4, - 128,255,128,122,22,80,97,116,104,67,111,110,102,105,103,46, - 95,115,101,116,95,99,111,110,102,105,103,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,5,0,0,0, - 67,0,0,0,115,154,0,0,0,124,1,100,1,25,0,115, - 26,124,0,106,0,124,1,100,2,60,0,100,3,124,1,100, - 1,60,0,116,1,114,68,124,1,100,4,25,0,100,0,117, - 1,114,56,124,1,100,5,25,0,100,0,117,0,114,56,110, - 12,124,0,160,2,124,1,100,5,161,2,1,0,124,0,160, - 2,124,1,100,6,100,4,161,3,1,0,124,0,160,2,124, - 1,100,7,161,2,1,0,124,0,160,2,124,1,100,8,161, - 2,1,0,116,1,114,150,124,0,106,3,100,9,107,3,114, - 130,124,0,106,3,124,1,100,10,60,0,124,0,106,4,100, - 9,107,3,114,150,124,0,106,4,124,1,100,11,60,0,100, - 0,83,0,41,12,78,114,55,0,0,0,114,56,0,0,0, - 114,10,0,0,0,114,57,0,0,0,114,47,0,0,0,114, - 41,0,0,0,114,42,0,0,0,114,43,0,0,0,233,255, - 255,255,255,218,8,105,115,111,108,97,116,101,100,218,11,115, - 105,116,101,95,105,109,112,111,114,116,41,5,114,40,0,0, - 0,114,46,0,0,0,114,61,0,0,0,114,63,0,0,0, - 114,64,0,0,0,114,58,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,13,115,101,116,95,116, - 111,95,99,111,110,102,105,103,191,0,0,0,115,34,0,0, - 0,8,1,10,1,8,1,4,2,24,1,2,4,12,2,14, - 2,12,1,12,1,4,2,10,2,10,1,10,1,10,1,4, - 128,255,128,122,24,80,97,116,104,67,111,110,102,105,103,46, - 115,101,116,95,116,111,95,99,111,110,102,105,103,41,1,78, - 41,1,78,41,8,218,8,95,95,110,97,109,101,95,95,218, - 10,95,95,109,111,100,117,108,101,95,95,218,12,95,95,113, - 117,97,108,110,97,109,101,95,95,114,50,0,0,0,114,54, - 0,0,0,114,59,0,0,0,114,61,0,0,0,114,65,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,39,0,0,0,157,0,0,0,115, - 14,0,0,0,8,0,8,1,10,10,8,5,10,11,12,7, - 255,128,114,39,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, - 115,84,0,0,0,100,1,125,1,116,0,131,0,125,2,116, - 1,160,2,124,0,100,2,161,2,125,3,124,3,115,34,116, - 4,124,2,131,1,83,0,124,1,124,3,118,0,114,74,124, - 3,160,3,124,1,100,3,161,2,100,4,25,0,125,3,124, - 2,124,3,55,0,125,2,116,4,124,2,131,1,83,0,124, - 2,124,3,55,0,125,2,113,10,41,5,78,243,1,0,0, - 0,10,105,0,16,0,0,114,10,0,0,0,114,0,0,0, - 0,41,5,218,9,98,121,116,101,97,114,114,97,121,114,17, - 0,0,0,90,4,114,101,97,100,218,5,115,112,108,105,116, - 218,5,98,121,116,101,115,41,4,218,2,102,100,90,2,110, - 108,90,3,98,117,102,90,5,99,104,117,110,107,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,8,114,101, - 97,100,108,105,110,101,217,0,0,0,115,22,0,0,0,4, - 3,6,1,12,2,4,1,8,7,8,251,16,1,8,1,8, - 3,10,255,255,128,114,74,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,4,0,0,0,67, - 0,0,0,115,84,0,0,0,116,0,124,0,131,1,125,2, - 124,2,115,16,100,0,83,0,124,2,160,1,100,1,161,1, - 114,28,113,0,124,2,160,2,100,2,100,3,161,2,125,2, - 124,2,160,3,161,0,125,3,124,3,100,4,25,0,124,1, - 107,2,114,0,124,3,100,5,25,0,100,6,107,2,114,0, - 124,3,100,7,25,0,125,4,124,4,83,0,41,8,78,243, - 1,0,0,0,35,250,5,117,116,102,45,56,218,15,115,117, - 114,114,111,103,97,116,101,101,115,99,97,112,101,114,0,0, - 0,0,114,10,0,0,0,250,1,61,233,2,0,0,0,41, - 4,114,74,0,0,0,114,4,0,0,0,218,6,100,101,99, - 111,100,101,114,71,0,0,0,41,5,114,73,0,0,0,90, - 3,107,101,121,218,4,108,105,110,101,90,3,116,111,107,218, - 5,118,97,108,117,101,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,21,102,105,110,100,95,101,110,118,95, - 99,111,110,102,105,103,95,118,97,108,117,101,235,0,0,0, - 115,22,0,0,0,8,2,4,1,4,128,10,2,2,2,12, - 2,8,3,24,1,8,1,4,1,255,128,114,83,0,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,64,0,0,0,115,168,0,0,0,101,0, - 90,1,100,0,90,2,100,1,100,2,132,0,90,3,100,3, - 100,4,132,0,90,4,100,5,100,6,132,0,90,5,101,6, - 100,7,100,8,132,0,131,1,90,7,100,9,100,10,132,0, - 90,8,100,11,100,12,132,0,90,9,100,13,100,14,132,0, - 90,10,100,15,100,16,132,0,90,11,100,17,100,18,132,0, - 90,12,100,19,100,20,132,0,90,13,100,21,100,22,132,0, - 90,14,100,23,100,24,132,0,90,15,100,25,100,26,132,0, - 90,16,100,27,100,28,132,0,90,17,100,29,100,30,132,0, - 90,18,100,31,100,32,132,0,90,19,100,33,100,34,132,0, - 90,20,100,35,100,36,132,0,90,21,100,37,100,38,132,0, - 90,22,100,39,83,0,41,40,218,13,67,97,108,99,117,108, - 97,116,101,80,97,116,104,99,3,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, - 115,136,0,0,0,124,1,124,0,95,0,100,1,124,0,95, - 1,100,1,124,0,95,2,124,2,100,2,25,0,124,0,95, - 3,124,2,100,3,25,0,124,0,95,4,124,2,100,4,25, - 0,124,0,95,5,116,6,106,7,160,8,100,5,100,0,161, - 2,125,3,124,3,100,0,117,1,114,82,116,9,124,3,131, - 1,124,0,95,10,110,6,100,0,124,0,95,10,116,11,124, - 0,95,12,116,13,124,0,95,14,116,15,124,0,95,16,116, - 17,124,0,95,18,116,19,124,0,106,5,100,6,116,20,155, - 0,157,2,131,2,124,0,95,21,100,0,83,0,41,7,78, - 114,0,0,0,0,90,19,112,97,116,104,99,111,110,102,105, - 103,95,119,97,114,110,105,110,103,115,218,14,112,121,116,104, - 111,110,112,97,116,104,95,101,110,118,218,10,112,108,97,116, - 108,105,98,100,105,114,115,4,0,0,0,80,65,84,72,218, - 6,112,121,116,104,111,110,41,22,218,10,112,97,116,104,99, - 111,110,102,105,103,218,12,112,114,101,102,105,120,95,102,111, - 117,110,100,218,17,101,120,101,99,95,112,114,101,102,105,120, - 95,102,111,117,110,100,218,8,119,97,114,110,105,110,103,115, - 114,85,0,0,0,114,86,0,0,0,114,17,0,0,0,90, - 7,101,110,118,105,114,111,110,218,3,103,101,116,218,13,100, - 101,99,111,100,101,95,108,111,99,97,108,101,218,8,112,97, - 116,104,95,101,110,118,218,10,80,89,84,72,79,78,80,65, - 84,72,218,16,112,121,116,104,111,110,112,97,116,104,95,109, - 97,99,114,111,218,6,80,82,69,70,73,88,218,12,112,114, - 101,102,105,120,95,109,97,99,114,111,218,11,69,88,69,67, - 95,80,82,69,70,73,88,218,17,101,120,101,99,95,112,114, - 101,102,105,120,95,109,97,99,114,111,218,5,86,80,65,84, - 72,218,11,118,112,97,116,104,95,109,97,99,114,111,114,15, - 0,0,0,218,7,86,69,82,83,73,79,78,218,10,108,105, - 98,95,112,121,116,104,111,110,41,4,114,49,0,0,0,114, - 88,0,0,0,114,53,0,0,0,114,6,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,50,0, - 0,0,254,0,0,0,115,34,0,0,0,6,1,6,2,6, - 1,10,2,10,1,10,1,14,1,8,1,12,1,6,2,6, - 1,6,1,6,1,6,1,20,2,4,128,255,128,122,22,67, - 97,108,99,117,108,97,116,101,80,97,116,104,46,95,95,105, - 110,105,116,95,95,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,24, - 0,0,0,116,0,160,1,161,0,125,1,116,2,124,1,131, - 1,115,20,100,0,83,0,124,1,83,0,114,3,0,0,0, - 41,3,218,9,95,99,103,101,116,112,97,116,104,90,20,95, - 78,83,71,101,116,69,120,101,99,117,116,97,98,108,101,80, - 97,116,104,114,9,0,0,0,41,2,114,49,0,0,0,90, - 9,101,120,101,99,95,112,97,116,104,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,23,99,97,108,99,117, + 1,83,0,48,0,116,3,124,1,106,4,131,1,83,0,41, + 2,78,70,41,5,114,19,0,0,0,114,20,0,0,0,114, + 21,0,0,0,114,2,0,0,0,114,22,0,0,0,114,23, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,5,105,115,100,105,114,92,0,0,0,115,12,0, + 0,0,2,1,14,1,12,1,8,1,10,1,255,128,114,27, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,34,0,0, + 0,116,0,124,0,116,1,131,2,125,1,116,2,124,1,131, + 1,114,22,100,1,83,0,116,2,124,1,100,2,23,0,131, + 1,83,0,41,3,78,84,218,1,99,41,3,114,18,0,0, + 0,218,8,76,65,78,68,77,65,82,75,114,25,0,0,0, + 41,2,114,9,0,0,0,114,24,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,8,105,115,109, + 111,100,117,108,101,101,0,0,0,115,10,0,0,0,10,1, + 8,1,4,1,12,3,255,128,114,30,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,0, + 0,0,67,0,0,0,115,74,0,0,0,116,0,124,0,131, + 1,114,12,124,0,83,0,122,12,116,1,160,2,161,0,125, + 1,87,0,110,22,4,0,116,3,121,46,1,0,1,0,1, + 0,124,0,6,0,89,0,83,0,48,0,124,0,160,4,100, + 1,116,5,155,0,157,2,161,1,125,0,116,6,124,1,124, + 0,131,2,83,0,41,2,78,218,1,46,41,7,114,12,0, + 0,0,114,19,0,0,0,90,6,103,101,116,99,119,100,114, + 21,0,0,0,218,12,114,101,109,111,118,101,112,114,101,102, + 105,120,114,8,0,0,0,114,18,0,0,0,41,2,114,9, + 0,0,0,90,3,99,119,100,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,7,97,98,115,112,97,116,104, + 109,0,0,0,115,18,0,0,0,8,1,4,1,2,2,12, + 1,12,1,10,1,16,3,10,1,255,128,114,33,0,0,0, + 122,4,46,101,120,101,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, + 54,0,0,0,124,0,116,0,116,1,131,1,11,0,100,0, + 133,2,25,0,160,2,161,0,116,1,107,2,114,30,124,0, + 83,0,124,0,116,1,23,0,125,1,116,3,124,1,131,1, + 114,50,124,1,83,0,124,0,83,0,114,6,0,0,0,41, + 4,114,14,0,0,0,218,10,69,88,69,95,83,85,70,70, + 73,88,218,5,108,111,119,101,114,114,26,0,0,0,41,2, + 90,8,112,114,111,103,112,97,116,104,90,12,112,114,111,103, + 112,97,116,104,95,101,120,101,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,14,97,100,100,95,101,120,101, + 95,115,117,102,102,105,120,126,0,0,0,115,14,0,0,0, + 26,2,4,1,8,2,8,1,4,1,4,2,255,128,114,36, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,8,0,0,0,67,0,0,0,115,92,0,0, + 0,100,1,125,1,122,14,116,0,160,1,124,0,161,1,125, + 2,87,0,110,20,4,0,116,2,121,38,1,0,1,0,1, + 0,89,0,124,0,83,0,48,0,116,3,124,2,131,1,114, + 54,124,2,125,0,110,14,116,4,116,5,124,0,131,1,124, + 2,131,2,125,0,124,1,100,2,55,0,125,1,124,1,100, + 3,107,5,114,4,116,6,100,4,131,1,130,1,41,5,78, + 114,0,0,0,0,114,13,0,0,0,233,40,0,0,0,122, + 40,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32, + 111,102,32,115,121,109,98,111,108,105,99,32,108,105,110,107, + 115,32,114,101,97,99,104,101,100,41,7,114,19,0,0,0, + 90,8,114,101,97,100,108,105,110,107,114,21,0,0,0,114, + 12,0,0,0,114,18,0,0,0,114,16,0,0,0,218,9, + 69,120,99,101,112,116,105,111,110,41,3,114,9,0,0,0, + 90,5,110,108,105,110,107,90,8,110,101,119,95,112,97,116, + 104,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,16,114,101,115,111,108,118,101,95,115,121,109,108,105,110, + 107,115,139,0,0,0,115,28,0,0,0,4,1,2,2,14, + 1,12,1,2,2,4,13,2,243,8,2,6,1,14,3,8, + 2,8,2,8,1,255,128,114,39,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, + 0,67,0,0,0,115,84,0,0,0,100,1,125,1,116,0, + 131,0,125,2,116,1,160,2,124,0,100,2,161,2,125,3, + 124,3,115,34,116,4,124,2,131,1,83,0,124,1,124,3, + 118,0,114,74,124,3,160,3,124,1,100,3,161,2,100,4, + 25,0,125,3,124,2,124,3,55,0,125,2,116,4,124,2, + 131,1,83,0,124,2,124,3,55,0,125,2,113,10,41,5, + 78,243,1,0,0,0,10,105,0,16,0,0,114,13,0,0, + 0,114,0,0,0,0,41,5,218,9,98,121,116,101,97,114, + 114,97,121,114,19,0,0,0,90,4,114,101,97,100,218,5, + 115,112,108,105,116,218,5,98,121,116,101,115,41,4,218,2, + 102,100,90,2,110,108,90,3,98,117,102,90,5,99,104,117, + 110,107,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,218,8,114,101,97,100,108,105,110,101,162,0,0,0,115, + 22,0,0,0,4,3,6,1,12,2,4,1,8,7,8,251, + 16,1,8,1,8,3,10,255,255,128,114,45,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 4,0,0,0,67,0,0,0,115,84,0,0,0,116,0,124, + 0,131,1,125,2,124,2,115,16,100,0,83,0,124,2,160, + 1,100,1,161,1,114,28,113,0,124,2,160,2,100,2,100, + 3,161,2,125,2,124,2,160,3,161,0,125,3,124,3,100, + 4,25,0,124,1,107,2,114,0,124,3,100,5,25,0,100, + 6,107,2,114,0,124,3,100,7,25,0,125,4,124,4,83, + 0,41,8,78,243,1,0,0,0,35,250,5,117,116,102,45, + 56,218,15,115,117,114,114,111,103,97,116,101,101,115,99,97, + 112,101,114,0,0,0,0,114,13,0,0,0,250,1,61,233, + 2,0,0,0,41,4,114,45,0,0,0,114,7,0,0,0, + 218,6,100,101,99,111,100,101,114,42,0,0,0,41,5,114, + 44,0,0,0,90,3,107,101,121,218,4,108,105,110,101,90, + 3,116,111,107,218,5,118,97,108,117,101,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,21,102,105,110,100, + 95,101,110,118,95,99,111,110,102,105,103,95,118,97,108,117, + 101,180,0,0,0,115,22,0,0,0,8,2,4,1,4,128, + 10,2,2,2,12,2,8,3,24,1,8,1,4,1,255,128, + 114,54,0,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,64,0,0,0,115,56, + 0,0,0,101,0,90,1,100,0,90,2,100,1,100,2,132, + 0,90,3,100,12,100,4,100,5,132,1,90,4,100,6,100, + 7,132,0,90,5,100,13,100,8,100,9,132,1,90,6,100, + 10,100,11,132,0,90,7,100,3,83,0,41,14,218,10,80, + 97,116,104,67,111,110,102,105,103,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,2,0,0,0,67,0, + 0,0,115,50,0,0,0,100,0,124,0,95,0,100,0,124, + 0,95,1,100,0,124,0,95,2,100,0,124,0,95,3,100, + 0,124,0,95,4,100,0,124,0,95,5,116,6,114,46,100, + 0,124,0,95,7,100,0,83,0,114,6,0,0,0,41,8, + 218,18,109,111,100,117,108,101,95,115,101,97,114,99,104,95, + 112,97,116,104,218,17,112,114,111,103,114,97,109,95,102,117, + 108,108,95,112,97,116,104,218,6,112,114,101,102,105,120,218, + 11,101,120,101,99,95,112,114,101,102,105,120,218,12,112,114, + 111,103,114,97,109,95,110,97,109,101,218,4,104,111,109,101, + 218,10,77,83,95,87,73,78,68,79,87,83,218,15,98,97, + 115,101,95,101,120,101,99,117,116,97,98,108,101,169,1,218, + 4,115,101,108,102,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,8,95,95,105,110,105,116,95,95,199,0, + 0,0,115,20,0,0,0,6,1,6,1,6,1,6,1,6, + 1,6,1,4,1,6,1,4,128,255,128,122,19,80,97,116, + 104,67,111,110,102,105,103,46,95,95,105,110,105,116,95,95, + 78,99,4,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,5,0,0,0,67,0,0,0,115,32,0,0,0,124, + 3,100,0,117,0,114,12,124,2,125,3,116,0,124,0,124, + 2,124,1,124,3,25,0,131,3,1,0,100,0,83,0,114, + 6,0,0,0,41,1,218,7,115,101,116,97,116,116,114,169, + 4,114,65,0,0,0,218,6,99,111,110,102,105,103,90,4, + 97,116,116,114,90,10,99,111,110,102,105,103,95,107,101,121, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 11,95,103,101,116,95,99,111,110,102,105,103,209,0,0,0, + 115,10,0,0,0,8,1,4,1,16,1,4,128,255,128,122, + 22,80,97,116,104,67,111,110,102,105,103,46,95,103,101,116, + 95,99,111,110,102,105,103,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,5,0,0,0,67,0,0,0, + 115,100,0,0,0,124,1,100,1,25,0,114,18,124,1,100, + 2,25,0,124,0,95,0,124,0,160,1,124,1,100,3,100, + 4,161,3,1,0,124,0,160,1,124,1,100,5,161,2,1, + 0,124,0,160,1,124,1,100,6,161,2,1,0,124,0,160, + 1,124,1,100,7,161,2,1,0,124,0,160,1,124,1,100, + 8,161,2,1,0,116,2,114,96,124,0,160,1,124,1,100, + 9,161,2,1,0,100,0,83,0,41,10,78,218,23,109,111, + 100,117,108,101,95,115,101,97,114,99,104,95,112,97,116,104, + 115,95,115,101,116,218,19,109,111,100,117,108,101,95,115,101, + 97,114,99,104,95,112,97,116,104,115,114,57,0,0,0,218, + 10,101,120,101,99,117,116,97,98,108,101,114,58,0,0,0, + 114,59,0,0,0,114,60,0,0,0,114,61,0,0,0,114, + 63,0,0,0,41,3,114,56,0,0,0,114,70,0,0,0, + 114,62,0,0,0,169,2,114,65,0,0,0,114,69,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,15,115,101,116,95,102,114,111,109,95,99,111,110,102,105, + 103,214,0,0,0,115,22,0,0,0,8,1,10,1,14,1, + 12,1,12,1,12,1,12,1,4,1,12,1,4,128,255,128, + 122,26,80,97,116,104,67,111,110,102,105,103,46,115,101,116, + 95,102,114,111,109,95,99,111,110,102,105,103,99,4,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0, + 0,67,0,0,0,115,46,0,0,0,124,3,100,0,117,0, + 114,12,124,2,125,3,124,1,124,3,25,0,100,0,117,1, + 114,28,100,0,83,0,116,0,124,0,124,2,131,2,124,1, + 124,3,60,0,100,0,83,0,114,6,0,0,0,41,1,218, + 7,103,101,116,97,116,116,114,114,68,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,11,95,115, + 101,116,95,99,111,110,102,105,103,225,0,0,0,115,14,0, + 0,0,8,1,4,1,12,1,4,1,14,1,4,128,255,128, + 122,22,80,97,116,104,67,111,110,102,105,103,46,95,115,101, + 116,95,99,111,110,102,105,103,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,5,0,0,0,67,0,0, + 0,115,154,0,0,0,124,1,100,1,25,0,115,26,124,0, + 106,0,124,1,100,2,60,0,100,3,124,1,100,1,60,0, + 116,1,114,68,124,1,100,4,25,0,100,0,117,1,114,56, + 124,1,100,5,25,0,100,0,117,0,114,56,110,12,124,0, + 160,2,124,1,100,5,161,2,1,0,124,0,160,2,124,1, + 100,6,100,4,161,3,1,0,124,0,160,2,124,1,100,7, + 161,2,1,0,124,0,160,2,124,1,100,8,161,2,1,0, + 116,1,114,150,124,0,106,3,100,9,107,3,114,130,124,0, + 106,3,124,1,100,10,60,0,124,0,106,4,100,9,107,3, + 114,150,124,0,106,4,124,1,100,11,60,0,100,0,83,0, + 41,12,78,114,71,0,0,0,114,72,0,0,0,114,13,0, + 0,0,114,73,0,0,0,114,63,0,0,0,114,57,0,0, + 0,114,58,0,0,0,114,59,0,0,0,233,255,255,255,255, + 218,8,105,115,111,108,97,116,101,100,218,11,115,105,116,101, + 95,105,109,112,111,114,116,41,5,114,56,0,0,0,114,62, + 0,0,0,114,77,0,0,0,114,79,0,0,0,114,80,0, + 0,0,114,74,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,13,115,101,116,95,116,111,95,99, + 111,110,102,105,103,232,0,0,0,115,34,0,0,0,8,1, + 10,1,8,1,4,2,24,1,2,4,12,2,14,2,12,1, + 12,1,4,2,10,2,10,1,10,1,10,1,4,128,255,128, + 122,24,80,97,116,104,67,111,110,102,105,103,46,115,101,116, + 95,116,111,95,99,111,110,102,105,103,41,1,78,41,1,78, + 41,8,218,8,95,95,110,97,109,101,95,95,218,10,95,95, + 109,111,100,117,108,101,95,95,218,12,95,95,113,117,97,108, + 110,97,109,101,95,95,114,66,0,0,0,114,70,0,0,0, + 114,75,0,0,0,114,77,0,0,0,114,81,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,55,0,0,0,198,0,0,0,115,14,0,0, + 0,8,0,8,1,10,10,8,5,10,11,12,7,255,128,114, + 55,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,64,0,0,0,115,168,0, + 0,0,101,0,90,1,100,0,90,2,100,1,100,2,132,0, + 90,3,100,3,100,4,132,0,90,4,100,5,100,6,132,0, + 90,5,101,6,100,7,100,8,132,0,131,1,90,7,100,9, + 100,10,132,0,90,8,100,11,100,12,132,0,90,9,100,13, + 100,14,132,0,90,10,100,15,100,16,132,0,90,11,100,17, + 100,18,132,0,90,12,100,19,100,20,132,0,90,13,100,21, + 100,22,132,0,90,14,100,23,100,24,132,0,90,15,100,25, + 100,26,132,0,90,16,100,27,100,28,132,0,90,17,100,29, + 100,30,132,0,90,18,100,31,100,32,132,0,90,19,100,33, + 100,34,132,0,90,20,100,35,100,36,132,0,90,21,100,37, + 100,38,132,0,90,22,100,39,83,0,41,40,218,13,67,97, + 108,99,117,108,97,116,101,80,97,116,104,99,3,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0, + 67,0,0,0,115,136,0,0,0,124,1,124,0,95,0,100, + 1,124,0,95,1,100,1,124,0,95,2,124,2,100,2,25, + 0,124,0,95,3,124,2,100,3,25,0,124,0,95,4,124, + 2,100,4,25,0,124,0,95,5,116,6,106,7,160,8,100, + 5,100,0,161,2,125,3,124,3,100,0,117,1,114,82,116, + 9,124,3,131,1,124,0,95,10,110,6,100,0,124,0,95, + 10,116,11,124,0,95,12,116,13,124,0,95,14,116,15,124, + 0,95,16,116,17,124,0,95,18,116,19,124,0,106,5,100, + 6,116,20,155,0,157,2,131,2,124,0,95,21,100,0,83, + 0,41,7,78,114,0,0,0,0,90,19,112,97,116,104,99, + 111,110,102,105,103,95,119,97,114,110,105,110,103,115,218,14, + 112,121,116,104,111,110,112,97,116,104,95,101,110,118,218,10, + 112,108,97,116,108,105,98,100,105,114,115,4,0,0,0,80, + 65,84,72,218,6,112,121,116,104,111,110,41,22,218,10,112, + 97,116,104,99,111,110,102,105,103,218,12,112,114,101,102,105, + 120,95,102,111,117,110,100,218,17,101,120,101,99,95,112,114, + 101,102,105,120,95,102,111,117,110,100,218,8,119,97,114,110, + 105,110,103,115,114,86,0,0,0,114,87,0,0,0,218,5, + 112,111,115,105,120,90,7,101,110,118,105,114,111,110,218,3, + 103,101,116,218,13,100,101,99,111,100,101,95,108,111,99,97, + 108,101,218,8,112,97,116,104,95,101,110,118,218,10,80,89, + 84,72,79,78,80,65,84,72,218,16,112,121,116,104,111,110, + 112,97,116,104,95,109,97,99,114,111,218,6,80,82,69,70, + 73,88,218,12,112,114,101,102,105,120,95,109,97,99,114,111, + 218,11,69,88,69,67,95,80,82,69,70,73,88,218,17,101, + 120,101,99,95,112,114,101,102,105,120,95,109,97,99,114,111, + 218,5,86,80,65,84,72,218,11,118,112,97,116,104,95,109, + 97,99,114,111,114,18,0,0,0,218,7,86,69,82,83,73, + 79,78,218,10,108,105,98,95,112,121,116,104,111,110,41,4, + 114,65,0,0,0,114,89,0,0,0,114,69,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,66,0,0,0,3,1,0,0,115,34,0,0, + 0,6,1,6,2,6,1,10,2,10,1,10,1,14,1,8, + 1,12,1,6,2,6,1,6,1,6,1,6,1,20,2,4, + 128,255,128,122,22,67,97,108,99,117,108,97,116,101,80,97, + 116,104,46,95,95,105,110,105,116,95,95,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0, + 67,0,0,0,115,24,0,0,0,116,0,160,1,161,0,125, + 1,116,2,124,1,131,1,115,20,100,0,83,0,124,1,83, + 0,114,6,0,0,0,41,3,218,9,95,99,103,101,116,112, + 97,116,104,90,20,95,78,83,71,101,116,69,120,101,99,117, + 116,97,98,108,101,80,97,116,104,114,12,0,0,0,41,2, + 114,65,0,0,0,90,9,101,120,101,99,95,112,97,116,104, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 23,99,97,108,99,117,108,97,116,101,95,112,114,111,103,114, + 97,109,95,109,97,99,111,115,24,1,0,0,115,10,0,0, + 0,8,10,8,1,4,1,4,2,255,128,122,37,67,97,108, + 99,117,108,97,116,101,80,97,116,104,46,99,97,108,99,117, 108,97,116,101,95,112,114,111,103,114,97,109,95,109,97,99, - 111,115,19,1,0,0,115,10,0,0,0,8,10,8,1,4, - 1,4,2,255,128,122,37,67,97,108,99,117,108,97,116,101, - 80,97,116,104,46,99,97,108,99,117,108,97,116,101,95,112, - 114,111,103,114,97,109,95,109,97,99,111,115,99,1,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, - 0,67,0,0,0,115,68,0,0,0,116,0,160,1,161,0, - 125,1,124,1,100,0,117,0,114,20,100,0,83,0,116,2, - 116,3,124,1,131,1,124,0,106,4,131,2,125,2,116,5, - 124,2,131,1,115,58,124,0,106,6,106,7,124,0,95,8, - 100,0,83,0,124,1,124,0,95,8,100,0,83,0,114,3, - 0,0,0,41,9,114,105,0,0,0,90,13,78,83,76,105, - 98,114,97,114,121,78,97,109,101,114,15,0,0,0,114,13, - 0,0,0,114,104,0,0,0,114,29,0,0,0,114,88,0, - 0,0,114,41,0,0,0,218,10,97,114,103,118,48,95,112, - 97,116,104,41,3,114,49,0,0,0,90,8,109,111,100,95, - 112,97,116,104,114,104,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,30,99,97,108,99,117,108, - 97,116,101,95,97,114,103,118,48,95,112,97,116,104,95,102, - 114,97,109,101,119,111,114,107,35,1,0,0,115,20,0,0, - 0,8,1,8,1,4,1,16,10,8,1,10,3,4,1,6, - 3,4,128,255,128,122,44,67,97,108,99,117,108,97,116,101, - 80,97,116,104,46,99,97,108,99,117,108,97,116,101,95,97, - 114,103,118,48,95,112,97,116,104,95,102,114,97,109,101,119, - 111,114,107,99,2,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,4,0,0,0,67,0,0,0,115,44,0,0, - 0,124,0,160,0,116,1,161,1,68,0,93,28,125,2,116, - 2,124,2,124,1,131,2,125,3,116,3,124,3,131,1,114, - 10,124,3,2,0,1,0,83,0,100,0,83,0,114,3,0, - 0,0,41,4,114,71,0,0,0,218,5,68,69,76,73,77, - 114,15,0,0,0,114,25,0,0,0,41,4,114,94,0,0, - 0,114,44,0,0,0,114,6,0,0,0,218,8,97,98,115, - 95,112,97,116,104,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,15,99,97,108,99,117,108,97,116,101,95, - 119,104,105,99,104,59,1,0,0,115,12,0,0,0,14,2, - 10,1,8,1,8,1,4,3,255,128,122,29,67,97,108,99, - 117,108,97,116,101,80,97,116,104,46,99,97,108,99,117,108, - 97,116,101,95,119,104,105,99,104,99,1,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,4,0,0,0,67,0, - 0,0,115,122,0,0,0,124,0,106,0,125,1,124,1,106, - 1,100,0,117,0,115,20,74,0,130,1,116,2,124,1,106, - 3,118,0,114,42,124,1,106,3,124,1,95,1,100,0,83, - 0,116,4,114,72,124,0,160,5,161,0,125,2,124,2,100, - 0,117,1,114,72,124,2,124,1,95,1,100,0,83,0,124, - 0,106,6,114,112,124,0,160,7,124,0,106,6,124,1,106, - 3,161,2,125,2,124,2,100,0,117,1,114,112,124,2,124, - 1,95,1,100,0,83,0,100,1,124,1,95,1,100,0,83, - 0,41,2,78,218,0,41,8,114,88,0,0,0,114,41,0, - 0,0,114,5,0,0,0,114,44,0,0,0,218,9,95,95, - 65,80,80,76,69,95,95,114,106,0,0,0,114,94,0,0, - 0,114,111,0,0,0,41,3,114,49,0,0,0,114,88,0, - 0,0,114,110,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,22,99,97,108,99,117,108,97,116, - 101,95,112,114,111,103,114,97,109,95,105,109,112,108,69,1, - 0,0,115,36,0,0,0,6,1,14,1,10,6,8,1,4, - 1,4,2,8,1,8,1,6,1,4,1,6,2,16,1,8, - 1,6,1,4,1,6,3,4,128,255,128,122,36,67,97,108, + 111,115,99,1,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,3,0,0,0,67,0,0,0,115,68,0,0,0, + 116,0,160,1,161,0,125,1,124,1,100,0,117,0,114,20, + 100,0,83,0,116,2,116,3,124,1,131,1,124,0,106,4, + 131,2,125,2,116,5,124,2,131,1,115,58,124,0,106,6, + 106,7,124,0,95,8,100,0,83,0,124,1,124,0,95,8, + 100,0,83,0,114,6,0,0,0,41,9,114,107,0,0,0, + 90,13,78,83,76,105,98,114,97,114,121,78,97,109,101,114, + 18,0,0,0,114,16,0,0,0,114,106,0,0,0,114,30, + 0,0,0,114,89,0,0,0,114,57,0,0,0,218,10,97, + 114,103,118,48,95,112,97,116,104,41,3,114,65,0,0,0, + 90,8,109,111,100,95,112,97,116,104,114,106,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,30, + 99,97,108,99,117,108,97,116,101,95,97,114,103,118,48,95, + 112,97,116,104,95,102,114,97,109,101,119,111,114,107,40,1, + 0,0,115,20,0,0,0,8,1,8,1,4,1,16,10,8, + 1,10,3,4,1,6,3,4,128,255,128,122,44,67,97,108, 99,117,108,97,116,101,80,97,116,104,46,99,97,108,99,117, - 108,97,116,101,95,112,114,111,103,114,97,109,95,105,109,112, - 108,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,2,0,0,0,67,0,0,0,115,60,0,0,0,124, - 0,106,0,125,1,124,0,160,1,161,0,1,0,124,1,106, - 2,115,24,100,0,83,0,116,3,124,1,106,2,131,1,124, - 1,95,2,116,4,115,44,116,5,114,56,116,6,124,1,106, - 2,131,1,124,1,95,2,100,0,83,0,114,3,0,0,0, - 41,7,114,88,0,0,0,114,114,0,0,0,114,41,0,0, - 0,114,32,0,0,0,218,10,95,95,67,89,71,87,73,78, - 95,95,218,11,95,95,77,73,78,71,87,51,50,95,95,114, - 35,0,0,0,41,2,114,49,0,0,0,114,88,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 17,99,97,108,99,117,108,97,116,101,95,112,114,111,103,114, - 97,109,96,1,0,0,115,18,0,0,0,6,1,8,1,6, - 2,4,1,12,4,8,2,12,5,4,128,255,128,122,31,67, - 97,108,99,117,108,97,116,101,80,97,116,104,46,99,97,108, - 99,117,108,97,116,101,95,112,114,111,103,114,97,109,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2, - 0,0,0,67,0,0,0,115,50,0,0,0,124,0,106,0, - 106,1,124,0,95,2,116,3,114,22,124,0,160,4,161,0, - 1,0,116,5,124,0,106,2,131,1,124,0,95,2,116,6, - 124,0,106,2,131,1,124,0,95,2,100,0,83,0,114,3, - 0,0,0,41,7,114,88,0,0,0,114,41,0,0,0,114, - 107,0,0,0,218,19,87,73,84,72,95,78,69,88,84,95, - 70,82,65,77,69,87,79,82,75,114,108,0,0,0,114,38, - 0,0,0,114,13,0,0,0,114,48,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,20,99,97, - 108,99,117,108,97,116,101,95,97,114,103,118,48,95,112,97, - 116,104,114,1,0,0,115,14,0,0,0,10,1,4,2,8, - 1,12,2,12,1,4,128,255,128,122,34,67,97,108,99,117, - 108,97,116,101,80,97,116,104,46,99,97,108,99,117,108,97, - 116,101,95,97,114,103,118,48,95,112,97,116,104,99,1,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,0, - 0,0,67,0,0,0,115,102,0,0,0,116,0,124,0,106, - 1,116,2,131,2,125,1,122,16,116,3,160,4,124,1,116, - 3,106,5,161,2,87,0,83,0,4,0,116,6,121,46,1, - 0,1,0,1,0,89,0,110,2,48,0,116,0,116,7,124, - 0,106,1,131,1,116,2,131,2,125,1,122,16,116,3,160, - 4,124,1,116,3,106,5,161,2,87,0,83,0,4,0,116, - 6,121,100,1,0,1,0,1,0,89,0,100,0,83,0,48, - 0,114,3,0,0,0,41,8,114,15,0,0,0,114,107,0, - 0,0,218,7,69,78,86,95,67,70,71,114,17,0,0,0, - 218,4,111,112,101,110,218,8,79,95,82,68,79,78,76,89, - 114,19,0,0,0,114,13,0,0,0,41,2,114,49,0,0, - 0,114,22,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,20,99,97,108,99,117,108,97,116,101, - 95,111,112,101,110,95,112,121,101,110,118,123,1,0,0,115, - 22,0,0,0,12,2,2,1,16,1,12,1,6,1,16,3, - 2,1,16,1,12,1,8,1,255,128,122,34,67,97,108,99, - 117,108,97,116,101,80,97,116,104,46,99,97,108,99,117,108, - 97,116,101,95,111,112,101,110,95,112,121,101,110,118,99,1, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,9, - 0,0,0,67,0,0,0,115,74,0,0,0,124,0,160,0, - 161,0,125,1,124,1,100,0,117,0,114,20,100,0,83,0, - 122,40,116,1,124,1,100,1,131,2,125,2,124,2,100,0, - 117,1,114,46,124,2,124,0,95,2,87,0,116,3,160,4, - 124,1,161,1,1,0,100,0,83,0,116,3,160,4,124,1, - 161,1,1,0,48,0,41,2,78,114,45,0,0,0,41,5, - 114,123,0,0,0,114,83,0,0,0,114,107,0,0,0,114, - 17,0,0,0,218,5,99,108,111,115,101,41,3,114,49,0, - 0,0,90,8,101,110,118,95,102,105,108,101,114,45,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,20,99,97,108,99,117,108,97,116,101,95,114,101,97,100, - 95,112,121,101,110,118,143,1,0,0,115,22,0,0,0,8, - 1,8,1,4,2,2,3,10,1,8,1,8,1,10,2,4, - 128,12,0,255,128,122,34,67,97,108,99,117,108,97,116,101, - 80,97,116,104,46,99,97,108,99,117,108,97,116,101,95,114, - 101,97,100,95,112,121,101,110,118,99,1,0,0,0,0,0, - 0,0,0,0,0,0,5,0,0,0,3,0,0,0,67,0, - 0,0,115,210,0,0,0,124,0,106,0,106,1,125,1,124, - 1,100,0,117,1,114,52,124,1,160,2,116,3,161,1,100, - 1,25,0,125,2,116,4,124,2,124,0,106,5,131,2,125, - 2,100,2,124,0,95,6,124,2,83,0,116,4,124,0,106, - 7,116,8,131,2,125,3,116,9,124,3,131,1,114,114,116, - 4,124,0,106,7,124,0,106,10,131,2,125,2,116,4,124, - 2,100,3,131,2,125,2,116,11,124,2,131,1,114,114,100, - 4,124,0,95,6,124,2,83,0,116,12,124,0,106,7,131, - 1,125,2,124,2,114,168,116,4,124,2,124,0,106,5,131, - 2,125,4,116,11,124,4,131,1,114,158,100,2,124,0,95, - 6,124,4,83,0,116,13,124,2,131,1,125,2,113,124,116, - 4,124,0,106,14,124,0,106,5,131,2,125,2,116,11,124, - 2,131,1,114,200,100,2,124,0,95,6,124,2,83,0,100, - 1,124,0,95,6,100,0,83,0,41,5,78,114,0,0,0, - 0,114,10,0,0,0,90,3,76,105,98,114,62,0,0,0, - 41,15,114,88,0,0,0,114,45,0,0,0,218,9,112,97, - 114,116,105,116,105,111,110,114,109,0,0,0,114,15,0,0, - 0,114,104,0,0,0,114,89,0,0,0,114,107,0,0,0, - 218,14,66,85,73,76,68,95,76,65,78,68,77,65,82,75, - 114,23,0,0,0,114,102,0,0,0,114,29,0,0,0,114, - 32,0,0,0,114,13,0,0,0,114,98,0,0,0,41,5, - 114,49,0,0,0,114,45,0,0,0,114,42,0,0,0,114, - 6,0,0,0,90,10,110,101,119,95,112,114,101,102,105,120, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 17,115,101,97,114,99,104,95,102,111,114,95,112,114,101,102, - 105,120,157,1,0,0,115,54,0,0,0,8,2,8,1,14, - 2,12,1,6,1,4,1,12,3,8,1,14,6,10,1,8, - 1,6,2,4,1,10,3,4,1,12,2,8,1,6,1,4, - 1,10,2,14,4,8,1,6,1,4,1,6,3,4,1,255, - 128,122,31,67,97,108,99,117,108,97,116,101,80,97,116,104, - 46,115,101,97,114,99,104,95,102,111,114,95,112,114,101,102, - 105,120,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,4,0,0,0,67,0,0,0,115,68,0,0,0, - 124,0,160,0,161,0,125,1,124,0,106,1,100,1,107,2, - 114,58,124,0,106,2,114,38,116,3,100,2,116,4,106,5, - 100,3,141,2,1,0,116,6,124,0,106,7,124,0,106,8, - 131,2,124,0,95,9,100,0,83,0,124,1,124,0,95,9, - 100,0,83,0,41,4,78,114,0,0,0,0,122,54,67,111, - 117,108,100,32,110,111,116,32,102,105,110,100,32,112,108,97, - 116,102,111,114,109,32,105,110,100,101,112,101,110,100,101,110, - 116,32,108,105,98,114,97,114,105,101,115,32,60,112,114,101, - 102,105,120,62,169,1,90,4,102,105,108,101,41,10,114,128, - 0,0,0,114,89,0,0,0,114,91,0,0,0,218,5,112, - 114,105,110,116,218,3,115,121,115,218,6,115,116,100,101,114, - 114,114,15,0,0,0,114,98,0,0,0,114,104,0,0,0, - 114,42,0,0,0,169,2,114,49,0,0,0,114,42,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,16,99,97,108,99,117,108,97,116,101,95,112,114,101,102, - 105,120,204,1,0,0,115,22,0,0,0,8,1,10,1,6, - 1,4,1,4,1,6,255,16,2,4,128,6,2,4,128,255, - 128,122,30,67,97,108,99,117,108,97,116,101,80,97,116,104, - 46,99,97,108,99,117,108,97,116,101,95,112,114,101,102,105, - 120,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,6,0,0,0,67,0,0,0,115,78,0,0,0,116, - 0,124,0,106,1,100,1,116,2,155,0,116,3,155,0,100, - 2,157,4,131,2,125,1,124,0,106,4,100,3,107,4,114, - 60,116,0,116,5,116,5,124,0,106,6,131,1,131,1,124, - 1,131,2,124,0,95,7,100,0,83,0,116,0,124,0,106, - 8,124,1,131,2,124,0,95,7,100,0,83,0,41,4,78, - 114,87,0,0,0,122,4,46,122,105,112,114,0,0,0,0, - 41,9,114,15,0,0,0,114,86,0,0,0,218,16,80,89, - 95,77,65,74,79,82,95,86,69,82,83,73,79,78,218,16, - 80,89,95,77,73,78,79,82,95,86,69,82,83,73,79,78, - 114,89,0,0,0,114,13,0,0,0,114,42,0,0,0,218, - 8,122,105,112,95,112,97,116,104,114,98,0,0,0,41,2, - 114,49,0,0,0,114,6,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,18,99,97,108,99,117, - 108,97,116,101,95,122,105,112,95,112,97,116,104,214,1,0, - 0,115,18,0,0,0,6,1,14,1,4,255,10,2,22,2, - 4,128,14,2,4,128,255,128,122,32,67,97,108,99,117,108, - 97,116,101,80,97,116,104,46,99,97,108,99,117,108,97,116, - 101,95,122,105,112,95,112,97,116,104,99,1,0,0,0,0, - 0,0,0,0,0,0,0,6,0,0,0,9,0,0,0,67, - 0,0,0,115,122,0,0,0,116,0,124,0,106,1,100,1, - 131,2,125,1,122,18,116,2,160,3,124,1,116,2,106,4, - 161,2,125,2,87,0,110,20,4,0,116,5,121,50,1,0, - 1,0,1,0,89,0,100,0,83,0,48,0,122,22,116,6, - 124,2,131,1,125,3,87,0,116,2,160,7,124,2,161,1, - 1,0,110,12,116,2,160,7,124,2,161,1,1,0,48,0, - 124,3,160,8,100,2,100,3,161,2,125,4,116,0,124,0, - 106,1,124,4,131,2,125,5,100,4,124,0,95,9,124,5, - 83,0,41,5,78,122,14,112,121,98,117,105,108,100,100,105, - 114,46,116,120,116,114,76,0,0,0,114,77,0,0,0,114, - 62,0,0,0,41,10,114,15,0,0,0,114,107,0,0,0, - 114,17,0,0,0,114,121,0,0,0,114,122,0,0,0,114, - 19,0,0,0,114,74,0,0,0,114,124,0,0,0,114,80, - 0,0,0,114,90,0,0,0,41,6,114,49,0,0,0,114, - 22,0,0,0,114,73,0,0,0,114,81,0,0,0,90,10, - 112,121,98,117,105,108,100,100,105,114,114,43,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,20, - 99,97,108,99,117,108,97,116,101,95,112,121,98,117,105,108, - 100,100,105,114,223,1,0,0,115,26,0,0,0,12,6,2, - 1,18,1,12,1,8,1,2,2,10,1,24,2,12,1,12, - 2,6,1,4,1,255,128,122,34,67,97,108,99,117,108,97, + 108,97,116,101,95,97,114,103,118,48,95,112,97,116,104,95, + 102,114,97,109,101,119,111,114,107,99,2,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,0, + 0,0,115,44,0,0,0,124,0,160,0,116,1,161,1,68, + 0,93,28,125,2,116,2,124,2,124,1,131,2,125,3,116, + 3,124,3,131,1,114,10,124,3,2,0,1,0,83,0,100, + 0,83,0,114,6,0,0,0,41,4,114,42,0,0,0,218, + 5,68,69,76,73,77,114,18,0,0,0,114,26,0,0,0, + 41,4,114,96,0,0,0,114,60,0,0,0,114,9,0,0, + 0,218,8,97,98,115,95,112,97,116,104,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,15,99,97,108,99, + 117,108,97,116,101,95,119,104,105,99,104,64,1,0,0,115, + 12,0,0,0,14,2,10,1,8,1,8,1,4,3,255,128, + 122,29,67,97,108,99,117,108,97,116,101,80,97,116,104,46, + 99,97,108,99,117,108,97,116,101,95,119,104,105,99,104,99, + 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 4,0,0,0,67,0,0,0,115,122,0,0,0,124,0,106, + 0,125,1,124,1,106,1,100,0,117,0,115,20,74,0,130, + 1,116,2,124,1,106,3,118,0,114,42,124,1,106,3,124, + 1,95,1,100,0,83,0,116,4,114,72,124,0,160,5,161, + 0,125,2,124,2,100,0,117,1,114,72,124,2,124,1,95, + 1,100,0,83,0,124,0,106,6,114,112,124,0,160,7,124, + 0,106,6,124,1,106,3,161,2,125,2,124,2,100,0,117, + 1,114,112,124,2,124,1,95,1,100,0,83,0,100,1,124, + 1,95,1,100,0,83,0,41,2,78,218,0,41,8,114,89, + 0,0,0,114,57,0,0,0,114,8,0,0,0,114,60,0, + 0,0,218,9,95,95,65,80,80,76,69,95,95,114,108,0, + 0,0,114,96,0,0,0,114,113,0,0,0,41,3,114,65, + 0,0,0,114,89,0,0,0,114,112,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,22,99,97, + 108,99,117,108,97,116,101,95,112,114,111,103,114,97,109,95, + 105,109,112,108,74,1,0,0,115,36,0,0,0,6,1,14, + 1,10,6,8,1,4,1,4,2,8,1,8,1,6,1,4, + 1,6,2,16,1,8,1,6,1,4,1,6,3,4,128,255, + 128,122,36,67,97,108,99,117,108,97,116,101,80,97,116,104, + 46,99,97,108,99,117,108,97,116,101,95,112,114,111,103,114, + 97,109,95,105,109,112,108,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, + 115,60,0,0,0,124,0,106,0,125,1,124,0,160,1,161, + 0,1,0,124,1,106,2,115,24,100,0,83,0,116,3,124, + 1,106,2,131,1,124,1,95,2,116,4,115,44,116,5,114, + 56,116,6,124,1,106,2,131,1,124,1,95,2,100,0,83, + 0,114,6,0,0,0,41,7,114,89,0,0,0,114,116,0, + 0,0,114,57,0,0,0,114,33,0,0,0,218,10,95,95, + 67,89,71,87,73,78,95,95,218,11,95,95,77,73,78,71, + 87,51,50,95,95,114,36,0,0,0,41,2,114,65,0,0, + 0,114,89,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,17,99,97,108,99,117,108,97,116,101, + 95,112,114,111,103,114,97,109,101,1,0,0,115,18,0,0, + 0,6,1,8,1,6,2,4,1,12,4,8,2,12,5,4, + 128,255,128,122,31,67,97,108,99,117,108,97,116,101,80,97, + 116,104,46,99,97,108,99,117,108,97,116,101,95,112,114,111, + 103,114,97,109,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,2,0,0,0,67,0,0,0,115,50,0, + 0,0,124,0,106,0,106,1,124,0,95,2,116,3,114,22, + 124,0,160,4,161,0,1,0,116,5,124,0,106,2,131,1, + 124,0,95,2,116,6,124,0,106,2,131,1,124,0,95,2, + 100,0,83,0,114,6,0,0,0,41,7,114,89,0,0,0, + 114,57,0,0,0,114,109,0,0,0,218,19,87,73,84,72, + 95,78,69,88,84,95,70,82,65,77,69,87,79,82,75,114, + 110,0,0,0,114,39,0,0,0,114,16,0,0,0,114,64, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,20,99,97,108,99,117,108,97,116,101,95,97,114, + 103,118,48,95,112,97,116,104,119,1,0,0,115,14,0,0, + 0,10,1,4,2,8,1,12,2,12,1,4,128,255,128,122, + 34,67,97,108,99,117,108,97,116,101,80,97,116,104,46,99, + 97,108,99,117,108,97,116,101,95,97,114,103,118,48,95,112, + 97,116,104,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,8,0,0,0,67,0,0,0,115,102,0,0, + 0,116,0,124,0,106,1,116,2,131,2,125,1,122,16,116, + 3,160,4,124,1,116,3,106,5,161,2,87,0,83,0,4, + 0,116,6,121,46,1,0,1,0,1,0,89,0,110,2,48, + 0,116,0,116,7,124,0,106,1,131,1,116,2,131,2,125, + 1,122,16,116,3,160,4,124,1,116,3,106,5,161,2,87, + 0,83,0,4,0,116,6,121,100,1,0,1,0,1,0,89, + 0,100,0,83,0,48,0,114,6,0,0,0,41,8,114,18, + 0,0,0,114,109,0,0,0,218,7,69,78,86,95,67,70, + 71,114,19,0,0,0,218,4,111,112,101,110,218,8,79,95, + 82,68,79,78,76,89,114,21,0,0,0,114,16,0,0,0, + 41,2,114,65,0,0,0,114,24,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,20,99,97,108, + 99,117,108,97,116,101,95,111,112,101,110,95,112,121,101,110, + 118,128,1,0,0,115,22,0,0,0,12,2,2,1,16,1, + 12,1,6,1,16,3,2,1,16,1,12,1,8,1,255,128, + 122,34,67,97,108,99,117,108,97,116,101,80,97,116,104,46, + 99,97,108,99,117,108,97,116,101,95,111,112,101,110,95,112, + 121,101,110,118,99,1,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,9,0,0,0,67,0,0,0,115,74,0, + 0,0,124,0,160,0,161,0,125,1,124,1,100,0,117,0, + 114,20,100,0,83,0,122,40,116,1,124,1,100,1,131,2, + 125,2,124,2,100,0,117,1,114,46,124,2,124,0,95,2, + 87,0,116,3,160,4,124,1,161,1,1,0,100,0,83,0, + 116,3,160,4,124,1,161,1,1,0,48,0,41,2,78,114, + 61,0,0,0,41,5,114,125,0,0,0,114,54,0,0,0, + 114,109,0,0,0,114,19,0,0,0,218,5,99,108,111,115, + 101,41,3,114,65,0,0,0,90,8,101,110,118,95,102,105, + 108,101,114,61,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,20,99,97,108,99,117,108,97,116, + 101,95,114,101,97,100,95,112,121,101,110,118,148,1,0,0, + 115,22,0,0,0,8,1,8,1,4,2,2,3,10,1,8, + 1,8,1,10,2,4,128,12,0,255,128,122,34,67,97,108, + 99,117,108,97,116,101,80,97,116,104,46,99,97,108,99,117, + 108,97,116,101,95,114,101,97,100,95,112,121,101,110,118,99, + 1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 3,0,0,0,67,0,0,0,115,210,0,0,0,124,0,106, + 0,106,1,125,1,124,1,100,0,117,1,114,52,124,1,160, + 2,116,3,161,1,100,1,25,0,125,2,116,4,124,2,124, + 0,106,5,131,2,125,2,100,2,124,0,95,6,124,2,83, + 0,116,4,124,0,106,7,116,8,131,2,125,3,116,9,124, + 3,131,1,114,114,116,4,124,0,106,7,124,0,106,10,131, + 2,125,2,116,4,124,2,100,3,131,2,125,2,116,11,124, + 2,131,1,114,114,100,4,124,0,95,6,124,2,83,0,116, + 12,124,0,106,7,131,1,125,2,124,2,114,168,116,4,124, + 2,124,0,106,5,131,2,125,4,116,11,124,4,131,1,114, + 158,100,2,124,0,95,6,124,4,83,0,116,13,124,2,131, + 1,125,2,113,124,116,4,124,0,106,14,124,0,106,5,131, + 2,125,2,116,11,124,2,131,1,114,200,100,2,124,0,95, + 6,124,2,83,0,100,1,124,0,95,6,100,0,83,0,41, + 5,78,114,0,0,0,0,114,13,0,0,0,90,3,76,105, + 98,114,78,0,0,0,41,15,114,89,0,0,0,114,61,0, + 0,0,218,9,112,97,114,116,105,116,105,111,110,114,111,0, + 0,0,114,18,0,0,0,114,106,0,0,0,114,90,0,0, + 0,114,109,0,0,0,218,14,66,85,73,76,68,95,76,65, + 78,68,77,65,82,75,114,25,0,0,0,114,104,0,0,0, + 114,30,0,0,0,114,33,0,0,0,114,16,0,0,0,114, + 100,0,0,0,41,5,114,65,0,0,0,114,61,0,0,0, + 114,58,0,0,0,114,9,0,0,0,90,10,110,101,119,95, + 112,114,101,102,105,120,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,17,115,101,97,114,99,104,95,102,111, + 114,95,112,114,101,102,105,120,162,1,0,0,115,54,0,0, + 0,8,2,8,1,14,2,12,1,6,1,4,1,12,3,8, + 1,14,6,10,1,8,1,6,2,4,1,10,3,4,1,12, + 2,8,1,6,1,4,1,10,2,14,4,8,1,6,1,4, + 1,6,3,4,1,255,128,122,31,67,97,108,99,117,108,97, + 116,101,80,97,116,104,46,115,101,97,114,99,104,95,102,111, + 114,95,112,114,101,102,105,120,99,1,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,4,0,0,0,67,0,0, + 0,115,68,0,0,0,124,0,160,0,161,0,125,1,124,0, + 106,1,100,1,107,2,114,58,124,0,106,2,114,38,116,3, + 100,2,116,4,106,5,100,3,141,2,1,0,116,6,124,0, + 106,7,124,0,106,8,131,2,124,0,95,9,100,0,83,0, + 124,1,124,0,95,9,100,0,83,0,41,4,78,114,0,0, + 0,0,122,54,67,111,117,108,100,32,110,111,116,32,102,105, + 110,100,32,112,108,97,116,102,111,114,109,32,105,110,100,101, + 112,101,110,100,101,110,116,32,108,105,98,114,97,114,105,101, + 115,32,60,112,114,101,102,105,120,62,169,1,90,4,102,105, + 108,101,41,10,114,130,0,0,0,114,90,0,0,0,114,92, + 0,0,0,218,5,112,114,105,110,116,218,3,115,121,115,218, + 6,115,116,100,101,114,114,114,18,0,0,0,114,100,0,0, + 0,114,106,0,0,0,114,58,0,0,0,169,2,114,65,0, + 0,0,114,58,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,16,99,97,108,99,117,108,97,116, + 101,95,112,114,101,102,105,120,209,1,0,0,115,22,0,0, + 0,8,1,10,1,6,1,4,1,4,1,6,255,16,2,4, + 128,6,2,4,128,255,128,122,30,67,97,108,99,117,108,97, 116,101,80,97,116,104,46,99,97,108,99,117,108,97,116,101, - 95,112,121,98,117,105,108,100,100,105,114,99,1,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,3,0,0,0, - 67,0,0,0,115,232,0,0,0,124,0,106,0,106,1,125, - 1,124,1,114,80,124,1,160,2,116,3,161,1,125,2,116, - 4,124,2,131,1,100,1,107,5,114,44,124,2,100,2,25, - 0,125,3,110,4,124,1,125,3,116,5,124,3,124,0,106, - 6,131,2,125,3,116,5,124,3,100,3,131,2,125,3,100, - 2,124,0,95,7,124,3,83,0,124,0,106,7,100,4,107, - 2,115,94,74,0,130,1,124,0,160,8,161,0,125,3,124, - 0,106,7,100,4,107,3,114,116,124,3,83,0,116,9,124, - 0,106,10,131,1,125,3,124,3,114,180,116,5,124,3,124, - 0,106,6,131,2,125,4,116,5,124,4,100,3,131,2,125, - 4,116,11,124,4,131,1,114,170,100,2,124,0,95,7,124, - 4,83,0,116,12,124,3,131,1,125,3,113,126,116,5,124, - 0,106,13,124,0,106,6,131,2,125,3,116,5,124,3,100, - 3,131,2,125,3,116,11,124,3,131,1,114,222,100,2,124, - 0,95,7,124,3,83,0,100,4,124,0,95,7,100,0,83, - 0,41,5,78,114,79,0,0,0,114,10,0,0,0,250,11, - 108,105,98,45,100,121,110,108,111,97,100,114,0,0,0,0, - 41,14,114,88,0,0,0,114,45,0,0,0,114,71,0,0, - 0,114,109,0,0,0,114,11,0,0,0,114,15,0,0,0, - 114,104,0,0,0,114,90,0,0,0,114,139,0,0,0,114, - 32,0,0,0,114,107,0,0,0,114,26,0,0,0,114,13, - 0,0,0,114,100,0,0,0,41,5,114,49,0,0,0,114, - 45,0,0,0,218,5,112,97,116,104,115,114,43,0,0,0, - 90,15,110,101,119,95,101,120,101,99,95,112,114,101,102,105, - 120,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,22,115,101,97,114,99,104,95,102,111,114,95,101,120,101, - 99,95,112,114,101,102,105,120,245,1,0,0,115,60,0,0, - 0,8,2,4,1,10,2,12,1,10,1,4,2,12,2,10, - 1,6,1,4,1,14,3,8,1,10,1,4,1,10,3,4, - 1,12,2,10,1,8,1,6,1,4,1,10,2,14,3,10, - 1,8,1,6,1,4,1,6,3,4,128,255,128,122,36,67, - 97,108,99,117,108,97,116,101,80,97,116,104,46,115,101,97, - 114,99,104,95,102,111,114,95,101,120,101,99,95,112,114,101, - 102,105,120,99,1,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,4,0,0,0,67,0,0,0,115,78,0,0, - 0,124,0,160,0,161,0,125,1,124,0,106,1,100,1,107, - 2,114,68,124,0,106,2,114,38,116,3,100,2,116,4,106, - 5,100,3,141,2,1,0,116,6,124,0,106,7,100,4,131, - 2,125,2,116,6,124,0,106,8,124,2,131,2,124,0,95, - 9,100,0,83,0,124,1,124,0,95,9,100,0,83,0,41, - 5,78,114,0,0,0,0,122,58,67,111,117,108,100,32,110, - 111,116,32,102,105,110,100,32,112,108,97,116,102,111,114,109, - 32,100,101,112,101,110,100,101,110,116,32,108,105,98,114,97, - 114,105,101,115,32,60,101,120,101,99,95,112,114,101,102,105, - 120,62,10,114,129,0,0,0,114,140,0,0,0,41,10,114, - 142,0,0,0,114,90,0,0,0,114,91,0,0,0,114,130, - 0,0,0,114,131,0,0,0,114,132,0,0,0,114,15,0, - 0,0,114,86,0,0,0,114,100,0,0,0,114,43,0,0, - 0,41,3,114,49,0,0,0,114,43,0,0,0,90,11,108, - 105,98,95,100,121,110,108,111,97,100,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,21,99,97,108,99,117, - 108,97,116,101,95,101,120,101,99,95,112,114,101,102,105,120, - 33,2,0,0,115,24,0,0,0,8,1,10,2,6,1,4, - 1,4,1,6,255,12,3,14,1,4,128,6,3,4,128,255, - 128,122,35,67,97,108,99,117,108,97,116,101,80,97,116,104, - 46,99,97,108,99,117,108,97,116,101,95,101,120,101,99,95, - 112,114,101,102,105,120,99,1,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115, - 116,0,0,0,103,0,125,1,124,0,106,0,114,28,124,1, - 160,1,124,0,106,0,160,2,116,3,161,1,161,1,1,0, - 124,1,160,4,124,0,106,5,161,1,1,0,124,0,106,6, - 160,2,116,3,161,1,68,0,93,38,125,2,124,2,114,74, - 116,7,124,0,106,8,124,2,131,2,125,2,110,6,124,0, - 106,8,125,2,124,1,160,4,124,2,161,1,1,0,113,52, - 124,1,160,4,124,0,106,9,161,1,1,0,124,1,124,0, - 106,10,95,11,100,0,83,0,114,3,0,0,0,41,12,114, - 85,0,0,0,218,6,101,120,116,101,110,100,114,71,0,0, - 0,114,109,0,0,0,218,6,97,112,112,101,110,100,114,137, - 0,0,0,114,96,0,0,0,114,15,0,0,0,114,42,0, - 0,0,114,43,0,0,0,114,88,0,0,0,114,40,0,0, - 0,41,3,114,49,0,0,0,114,141,0,0,0,114,6,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,28,99,97,108,99,117,108,97,116,101,95,109,111,100, - 117,108,101,95,115,101,97,114,99,104,95,112,97,116,104,47, - 2,0,0,115,26,0,0,0,4,1,6,3,18,1,12,3, - 16,4,4,1,14,1,6,2,12,1,12,3,8,2,4,128, - 255,128,122,42,67,97,108,99,117,108,97,116,101,80,97,116, - 104,46,99,97,108,99,117,108,97,116,101,95,109,111,100,117, - 108,101,95,115,101,97,114,99,104,95,112,97,116,104,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, - 0,0,0,67,0,0,0,115,58,0,0,0,124,0,106,0, - 100,1,107,4,114,44,116,1,116,1,124,0,106,2,131,1, - 131,1,125,1,124,1,115,32,116,3,125,1,124,1,124,0, - 106,4,95,2,100,0,83,0,124,0,106,5,124,0,106,4, - 95,2,100,0,83,0,169,2,78,114,0,0,0,0,41,6, - 114,89,0,0,0,114,13,0,0,0,114,42,0,0,0,114, - 5,0,0,0,114,88,0,0,0,114,98,0,0,0,114,133, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,20,99,97,108,99,117,108,97,116,101,95,115,101, - 116,95,112,114,101,102,105,120,71,2,0,0,115,18,0,0, - 0,10,5,14,1,4,1,4,3,8,1,4,128,10,2,4, - 128,255,128,122,34,67,97,108,99,117,108,97,116,101,80,97, - 116,104,46,99,97,108,99,117,108,97,116,101,95,115,101,116, 95,112,114,101,102,105,120,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,4,0,0,0,67,0,0,0, - 115,62,0,0,0,124,0,106,0,100,1,107,4,114,48,116, - 1,116,1,116,1,124,0,106,2,131,1,131,1,131,1,125, - 1,124,1,115,36,116,3,125,1,124,1,124,0,106,4,95, - 2,100,0,83,0,124,0,106,5,124,0,106,4,95,2,100, - 0,83,0,114,147,0,0,0,41,6,114,90,0,0,0,114, - 13,0,0,0,114,43,0,0,0,114,5,0,0,0,114,88, - 0,0,0,114,100,0,0,0,41,2,114,49,0,0,0,114, - 43,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,25,99,97,108,99,117,108,97,116,101,95,115, - 101,116,95,101,120,101,99,95,112,114,101,102,105,120,86,2, - 0,0,115,18,0,0,0,10,1,18,1,4,1,4,3,8, - 1,4,128,10,2,4,128,255,128,122,39,67,97,108,99,117, + 0,0,0,0,2,0,0,0,6,0,0,0,67,0,0,0, + 115,78,0,0,0,116,0,124,0,106,1,100,1,116,2,155, + 0,116,3,155,0,100,2,157,4,131,2,125,1,124,0,106, + 4,100,3,107,4,114,60,116,0,116,5,116,5,124,0,106, + 6,131,1,131,1,124,1,131,2,124,0,95,7,100,0,83, + 0,116,0,124,0,106,8,124,1,131,2,124,0,95,7,100, + 0,83,0,41,4,78,114,88,0,0,0,122,4,46,122,105, + 112,114,0,0,0,0,41,9,114,18,0,0,0,114,87,0, + 0,0,218,16,80,89,95,77,65,74,79,82,95,86,69,82, + 83,73,79,78,218,16,80,89,95,77,73,78,79,82,95,86, + 69,82,83,73,79,78,114,90,0,0,0,114,16,0,0,0, + 114,58,0,0,0,218,8,122,105,112,95,112,97,116,104,114, + 100,0,0,0,41,2,114,65,0,0,0,114,9,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 18,99,97,108,99,117,108,97,116,101,95,122,105,112,95,112, + 97,116,104,219,1,0,0,115,18,0,0,0,6,1,14,1, + 4,255,10,2,22,2,4,128,14,2,4,128,255,128,122,32, + 67,97,108,99,117,108,97,116,101,80,97,116,104,46,99,97, + 108,99,117,108,97,116,101,95,122,105,112,95,112,97,116,104, + 99,1,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,9,0,0,0,67,0,0,0,115,122,0,0,0,116,0, + 124,0,106,1,100,1,131,2,125,1,122,18,116,2,160,3, + 124,1,116,2,106,4,161,2,125,2,87,0,110,20,4,0, + 116,5,121,50,1,0,1,0,1,0,89,0,100,0,83,0, + 48,0,122,22,116,6,124,2,131,1,125,3,87,0,116,2, + 160,7,124,2,161,1,1,0,110,12,116,2,160,7,124,2, + 161,1,1,0,48,0,124,3,160,8,100,2,100,3,161,2, + 125,4,116,0,124,0,106,1,124,4,131,2,125,5,100,4, + 124,0,95,9,124,5,83,0,41,5,78,122,14,112,121,98, + 117,105,108,100,100,105,114,46,116,120,116,114,47,0,0,0, + 114,48,0,0,0,114,78,0,0,0,41,10,114,18,0,0, + 0,114,109,0,0,0,114,19,0,0,0,114,123,0,0,0, + 114,124,0,0,0,114,21,0,0,0,114,45,0,0,0,114, + 126,0,0,0,114,51,0,0,0,114,91,0,0,0,41,6, + 114,65,0,0,0,114,24,0,0,0,114,44,0,0,0,114, + 52,0,0,0,90,10,112,121,98,117,105,108,100,100,105,114, + 114,59,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,20,99,97,108,99,117,108,97,116,101,95, + 112,121,98,117,105,108,100,100,105,114,228,1,0,0,115,26, + 0,0,0,12,6,2,1,18,1,12,1,8,1,2,2,10, + 1,24,2,12,1,12,2,6,1,4,1,255,128,122,34,67, + 97,108,99,117,108,97,116,101,80,97,116,104,46,99,97,108, + 99,117,108,97,116,101,95,112,121,98,117,105,108,100,100,105, + 114,99,1,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,3,0,0,0,67,0,0,0,115,232,0,0,0,124, + 0,106,0,106,1,125,1,124,1,114,80,124,1,160,2,116, + 3,161,1,125,2,116,4,124,2,131,1,100,1,107,5,114, + 44,124,2,100,2,25,0,125,3,110,4,124,1,125,3,116, + 5,124,3,124,0,106,6,131,2,125,3,116,5,124,3,100, + 3,131,2,125,3,100,2,124,0,95,7,124,3,83,0,124, + 0,106,7,100,4,107,2,115,94,74,0,130,1,124,0,160, + 8,161,0,125,3,124,0,106,7,100,4,107,3,114,116,124, + 3,83,0,116,9,124,0,106,10,131,1,125,3,124,3,114, + 180,116,5,124,3,124,0,106,6,131,2,125,4,116,5,124, + 4,100,3,131,2,125,4,116,11,124,4,131,1,114,170,100, + 2,124,0,95,7,124,4,83,0,116,12,124,3,131,1,125, + 3,113,126,116,5,124,0,106,13,124,0,106,6,131,2,125, + 3,116,5,124,3,100,3,131,2,125,3,116,11,124,3,131, + 1,114,222,100,2,124,0,95,7,124,3,83,0,100,4,124, + 0,95,7,100,0,83,0,41,5,78,114,50,0,0,0,114, + 13,0,0,0,250,11,108,105,98,45,100,121,110,108,111,97, + 100,114,0,0,0,0,41,14,114,89,0,0,0,114,61,0, + 0,0,114,42,0,0,0,114,111,0,0,0,114,14,0,0, + 0,114,18,0,0,0,114,106,0,0,0,114,91,0,0,0, + 114,141,0,0,0,114,33,0,0,0,114,109,0,0,0,114, + 27,0,0,0,114,16,0,0,0,114,102,0,0,0,41,5, + 114,65,0,0,0,114,61,0,0,0,218,5,112,97,116,104, + 115,114,59,0,0,0,90,15,110,101,119,95,101,120,101,99, + 95,112,114,101,102,105,120,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,22,115,101,97,114,99,104,95,102, + 111,114,95,101,120,101,99,95,112,114,101,102,105,120,250,1, + 0,0,115,60,0,0,0,8,2,4,1,10,2,12,1,10, + 1,4,2,12,2,10,1,6,1,4,1,14,3,8,1,10, + 1,4,1,10,3,4,1,12,2,10,1,8,1,6,1,4, + 1,10,2,14,3,10,1,8,1,6,1,4,1,6,3,4, + 128,255,128,122,36,67,97,108,99,117,108,97,116,101,80,97, + 116,104,46,115,101,97,114,99,104,95,102,111,114,95,101,120, + 101,99,95,112,114,101,102,105,120,99,1,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,4,0,0,0,67,0, + 0,0,115,78,0,0,0,124,0,160,0,161,0,125,1,124, + 0,106,1,100,1,107,2,114,68,124,0,106,2,114,38,116, + 3,100,2,116,4,106,5,100,3,141,2,1,0,116,6,124, + 0,106,7,100,4,131,2,125,2,116,6,124,0,106,8,124, + 2,131,2,124,0,95,9,100,0,83,0,124,1,124,0,95, + 9,100,0,83,0,41,5,78,114,0,0,0,0,122,58,67, + 111,117,108,100,32,110,111,116,32,102,105,110,100,32,112,108, + 97,116,102,111,114,109,32,100,101,112,101,110,100,101,110,116, + 32,108,105,98,114,97,114,105,101,115,32,60,101,120,101,99, + 95,112,114,101,102,105,120,62,10,114,131,0,0,0,114,142, + 0,0,0,41,10,114,144,0,0,0,114,91,0,0,0,114, + 92,0,0,0,114,132,0,0,0,114,133,0,0,0,114,134, + 0,0,0,114,18,0,0,0,114,87,0,0,0,114,102,0, + 0,0,114,59,0,0,0,41,3,114,65,0,0,0,114,59, + 0,0,0,90,11,108,105,98,95,100,121,110,108,111,97,100, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 21,99,97,108,99,117,108,97,116,101,95,101,120,101,99,95, + 112,114,101,102,105,120,38,2,0,0,115,24,0,0,0,8, + 1,10,2,6,1,4,1,4,1,6,255,12,3,14,1,4, + 128,6,3,4,128,255,128,122,35,67,97,108,99,117,108,97, + 116,101,80,97,116,104,46,99,97,108,99,117,108,97,116,101, + 95,101,120,101,99,95,112,114,101,102,105,120,99,1,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0, + 0,67,0,0,0,115,116,0,0,0,103,0,125,1,124,0, + 106,0,114,28,124,1,160,1,124,0,106,0,160,2,116,3, + 161,1,161,1,1,0,124,1,160,4,124,0,106,5,161,1, + 1,0,124,0,106,6,160,2,116,3,161,1,68,0,93,38, + 125,2,124,2,114,74,116,7,124,0,106,8,124,2,131,2, + 125,2,110,6,124,0,106,8,125,2,124,1,160,4,124,2, + 161,1,1,0,113,52,124,1,160,4,124,0,106,9,161,1, + 1,0,124,1,124,0,106,10,95,11,100,0,83,0,114,6, + 0,0,0,41,12,114,86,0,0,0,218,6,101,120,116,101, + 110,100,114,42,0,0,0,114,111,0,0,0,218,6,97,112, + 112,101,110,100,114,139,0,0,0,114,98,0,0,0,114,18, + 0,0,0,114,58,0,0,0,114,59,0,0,0,114,89,0, + 0,0,114,56,0,0,0,41,3,114,65,0,0,0,114,143, + 0,0,0,114,9,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,28,99,97,108,99,117,108,97, + 116,101,95,109,111,100,117,108,101,95,115,101,97,114,99,104, + 95,112,97,116,104,52,2,0,0,115,26,0,0,0,4,1, + 6,3,18,1,12,3,16,4,4,1,14,1,6,2,12,1, + 12,3,8,2,4,128,255,128,122,42,67,97,108,99,117,108, + 97,116,101,80,97,116,104,46,99,97,108,99,117,108,97,116, + 101,95,109,111,100,117,108,101,95,115,101,97,114,99,104,95, + 112,97,116,104,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,67,0,0,0,115,58,0, + 0,0,124,0,106,0,100,1,107,4,114,44,116,1,116,1, + 124,0,106,2,131,1,131,1,125,1,124,1,115,32,116,3, + 125,1,124,1,124,0,106,4,95,2,100,0,83,0,124,0, + 106,5,124,0,106,4,95,2,100,0,83,0,169,2,78,114, + 0,0,0,0,41,6,114,90,0,0,0,114,16,0,0,0, + 114,58,0,0,0,114,8,0,0,0,114,89,0,0,0,114, + 100,0,0,0,114,135,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,20,99,97,108,99,117,108, + 97,116,101,95,115,101,116,95,112,114,101,102,105,120,76,2, + 0,0,115,18,0,0,0,10,5,14,1,4,1,4,3,8, + 1,4,128,10,2,4,128,255,128,122,34,67,97,108,99,117, + 108,97,116,101,80,97,116,104,46,99,97,108,99,117,108,97, + 116,101,95,115,101,116,95,112,114,101,102,105,120,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0, + 0,0,67,0,0,0,115,62,0,0,0,124,0,106,0,100, + 1,107,4,114,48,116,1,116,1,116,1,124,0,106,2,131, + 1,131,1,131,1,125,1,124,1,115,36,116,3,125,1,124, + 1,124,0,106,4,95,2,100,0,83,0,124,0,106,5,124, + 0,106,4,95,2,100,0,83,0,114,149,0,0,0,41,6, + 114,91,0,0,0,114,16,0,0,0,114,59,0,0,0,114, + 8,0,0,0,114,89,0,0,0,114,102,0,0,0,41,2, + 114,65,0,0,0,114,59,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,25,99,97,108,99,117, + 108,97,116,101,95,115,101,116,95,101,120,101,99,95,112,114, + 101,102,105,120,91,2,0,0,115,18,0,0,0,10,1,18, + 1,4,1,4,3,8,1,4,128,10,2,4,128,255,128,122, + 39,67,97,108,99,117,108,97,116,101,80,97,116,104,46,99, + 97,108,99,117,108,97,116,101,95,115,101,116,95,101,120,101, + 99,95,112,114,101,102,105,120,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, + 0,115,164,0,0,0,124,0,106,0,106,1,100,0,117,0, + 114,20,124,0,160,2,161,0,1,0,124,0,160,3,161,0, + 1,0,124,0,160,4,161,0,1,0,124,0,160,5,161,0, + 1,0,124,0,160,6,161,0,1,0,124,0,160,7,161,0, + 1,0,124,0,106,8,100,1,107,2,115,80,124,0,106,9, + 100,1,107,2,114,100,124,0,106,10,114,100,116,11,100,2, + 116,12,106,13,100,3,141,2,1,0,124,0,106,0,106,14, + 100,0,117,0,114,120,124,0,160,15,161,0,1,0,124,0, + 106,0,106,16,100,0,117,0,114,140,124,0,160,17,161,0, + 1,0,124,0,106,0,106,18,100,0,117,0,114,160,124,0, + 160,19,161,0,1,0,100,0,83,0,41,4,78,114,0,0, + 0,0,122,56,67,111,110,115,105,100,101,114,32,115,101,116, + 116,105,110,103,32,36,80,89,84,72,79,78,72,79,77,69, + 32,116,111,32,60,112,114,101,102,105,120,62,91,58,60,101, + 120,101,99,95,112,114,101,102,105,120,62,93,114,131,0,0, + 0,41,20,114,89,0,0,0,114,57,0,0,0,114,119,0, + 0,0,114,121,0,0,0,114,127,0,0,0,114,136,0,0, + 0,114,140,0,0,0,114,145,0,0,0,114,90,0,0,0, + 114,91,0,0,0,114,92,0,0,0,114,132,0,0,0,114, + 133,0,0,0,114,134,0,0,0,114,56,0,0,0,114,148, + 0,0,0,114,58,0,0,0,114,150,0,0,0,114,59,0, + 0,0,114,151,0,0,0,114,64,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,9,99,97,108, + 99,117,108,97,116,101,132,2,0,0,115,42,0,0,0,12, + 1,8,1,8,2,8,4,8,2,8,1,8,1,20,2,4, + 1,2,255,4,2,4,1,6,255,12,3,8,1,12,1,8, + 1,12,1,8,1,4,128,255,128,122,23,67,97,108,99,117, 108,97,116,101,80,97,116,104,46,99,97,108,99,117,108,97, - 116,101,95,115,101,116,95,101,120,101,99,95,112,114,101,102, - 105,120,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,4,0,0,0,67,0,0,0,115,164,0,0,0, - 124,0,106,0,106,1,100,0,117,0,114,20,124,0,160,2, - 161,0,1,0,124,0,160,3,161,0,1,0,124,0,160,4, - 161,0,1,0,124,0,160,5,161,0,1,0,124,0,160,6, - 161,0,1,0,124,0,160,7,161,0,1,0,124,0,106,8, - 100,1,107,2,115,80,124,0,106,9,100,1,107,2,114,100, - 124,0,106,10,114,100,116,11,100,2,116,12,106,13,100,3, - 141,2,1,0,124,0,106,0,106,14,100,0,117,0,114,120, - 124,0,160,15,161,0,1,0,124,0,106,0,106,16,100,0, - 117,0,114,140,124,0,160,17,161,0,1,0,124,0,106,0, - 106,18,100,0,117,0,114,160,124,0,160,19,161,0,1,0, - 100,0,83,0,41,4,78,114,0,0,0,0,122,56,67,111, - 110,115,105,100,101,114,32,115,101,116,116,105,110,103,32,36, - 80,89,84,72,79,78,72,79,77,69,32,116,111,32,60,112, - 114,101,102,105,120,62,91,58,60,101,120,101,99,95,112,114, - 101,102,105,120,62,93,114,129,0,0,0,41,20,114,88,0, - 0,0,114,41,0,0,0,114,117,0,0,0,114,119,0,0, - 0,114,125,0,0,0,114,134,0,0,0,114,138,0,0,0, - 114,143,0,0,0,114,89,0,0,0,114,90,0,0,0,114, - 91,0,0,0,114,130,0,0,0,114,131,0,0,0,114,132, - 0,0,0,114,40,0,0,0,114,146,0,0,0,114,42,0, - 0,0,114,148,0,0,0,114,43,0,0,0,114,149,0,0, - 0,114,48,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,9,99,97,108,99,117,108,97,116,101, - 127,2,0,0,115,42,0,0,0,12,1,8,1,8,2,8, - 4,8,2,8,1,8,1,20,2,4,1,2,255,4,2,4, - 1,6,255,12,3,8,1,12,1,8,1,12,1,8,1,4, - 128,255,128,122,23,67,97,108,99,117,108,97,116,101,80,97, - 116,104,46,99,97,108,99,117,108,97,116,101,78,41,23,114, - 66,0,0,0,114,67,0,0,0,114,68,0,0,0,114,50, - 0,0,0,114,106,0,0,0,114,108,0,0,0,218,12,115, - 116,97,116,105,99,109,101,116,104,111,100,114,111,0,0,0, - 114,114,0,0,0,114,117,0,0,0,114,119,0,0,0,114, - 123,0,0,0,114,125,0,0,0,114,128,0,0,0,114,134, - 0,0,0,114,138,0,0,0,114,139,0,0,0,114,142,0, - 0,0,114,143,0,0,0,114,146,0,0,0,114,148,0,0, - 0,114,149,0,0,0,114,150,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 84,0,0,0,253,0,0,0,115,44,0,0,0,8,0,8, - 1,8,21,8,16,2,24,10,1,8,9,8,27,8,18,8, - 9,8,20,8,14,8,47,8,10,8,9,8,22,8,44,8, - 14,8,24,8,15,12,41,255,128,114,84,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2, - 0,0,0,67,0,0,0,115,44,0,0,0,124,0,100,1, - 25,0,111,42,124,0,100,2,25,0,100,0,117,1,111,42, - 124,0,100,3,25,0,100,0,117,1,111,42,124,0,100,4, - 25,0,100,0,117,1,83,0,41,5,78,114,55,0,0,0, - 114,57,0,0,0,114,42,0,0,0,114,43,0,0,0,114, - 7,0,0,0,41,1,114,53,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,8,99,111,109,112, - 117,116,101,100,154,2,0,0,115,16,0,0,0,8,1,10, - 1,2,255,10,2,2,254,10,3,2,253,255,128,114,152,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,74,0,0,0, - 116,0,160,1,161,0,125,0,116,2,124,0,131,1,114,20, - 100,0,83,0,116,3,131,0,125,1,124,1,160,4,124,0, - 161,1,1,0,116,5,124,1,124,0,131,2,160,6,161,0, - 1,0,124,1,160,7,124,0,161,1,1,0,116,0,160,8, - 124,0,161,1,1,0,100,0,83,0,114,3,0,0,0,41, - 9,114,105,0,0,0,90,10,103,101,116,95,99,111,110,102, - 105,103,114,152,0,0,0,114,39,0,0,0,114,59,0,0, - 0,114,84,0,0,0,114,150,0,0,0,114,65,0,0,0, - 90,10,115,101,116,95,99,111,110,102,105,103,41,2,114,53, - 0,0,0,114,88,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,4,109,97,105,110,161,2,0, - 0,115,20,0,0,0,8,1,8,1,4,1,6,2,10,1, - 14,1,10,1,10,2,4,128,255,128,114,153,0,0,0,90, - 8,95,95,109,97,105,110,95,95,41,46,114,17,0,0,0, - 90,5,95,115,116,97,116,114,1,0,0,0,114,2,0,0, - 0,114,105,0,0,0,114,131,0,0,0,114,120,0,0,0, - 114,28,0,0,0,114,127,0,0,0,218,12,118,101,114,115, - 105,111,110,95,105,110,102,111,218,5,109,97,106,111,114,114, - 135,0,0,0,218,5,109,105,110,111,114,114,136,0,0,0, - 114,5,0,0,0,114,109,0,0,0,114,118,0,0,0,218, - 8,112,108,97,116,102,111,114,109,114,113,0,0,0,114,46, - 0,0,0,114,115,0,0,0,114,116,0,0,0,114,93,0, - 0,0,114,95,0,0,0,114,97,0,0,0,114,99,0,0, - 0,114,101,0,0,0,114,103,0,0,0,114,9,0,0,0, - 114,13,0,0,0,114,15,0,0,0,114,23,0,0,0,114, - 25,0,0,0,114,26,0,0,0,114,29,0,0,0,114,32, - 0,0,0,114,33,0,0,0,114,35,0,0,0,114,38,0, - 0,0,114,39,0,0,0,114,74,0,0,0,114,83,0,0, - 0,114,84,0,0,0,114,152,0,0,0,114,153,0,0,0, - 114,66,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,8,60,109,111,100,117, - 108,101,62,1,0,0,0,115,94,0,0,0,8,2,16,1, - 8,1,8,1,4,2,4,1,4,1,8,2,8,1,6,2, - 6,1,6,1,10,1,10,1,4,2,4,1,6,5,10,3, - 10,1,10,1,10,1,10,1,8,3,8,5,8,9,8,14, - 8,11,8,11,8,9,8,8,8,14,4,1,8,2,8,13, - 14,23,8,60,8,18,14,18,0,127,0,127,0,127,8,32, - 8,7,10,13,6,1,4,128,255,128, + 116,101,78,41,23,114,82,0,0,0,114,83,0,0,0,114, + 84,0,0,0,114,66,0,0,0,114,108,0,0,0,114,110, + 0,0,0,218,12,115,116,97,116,105,99,109,101,116,104,111, + 100,114,113,0,0,0,114,116,0,0,0,114,119,0,0,0, + 114,121,0,0,0,114,125,0,0,0,114,127,0,0,0,114, + 130,0,0,0,114,136,0,0,0,114,140,0,0,0,114,141, + 0,0,0,114,144,0,0,0,114,145,0,0,0,114,148,0, + 0,0,114,150,0,0,0,114,151,0,0,0,114,152,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,85,0,0,0,2,1,0,0,115,44, + 0,0,0,8,0,8,1,8,21,8,16,2,24,10,1,8, + 9,8,27,8,18,8,9,8,20,8,14,8,47,8,10,8, + 9,8,22,8,44,8,14,8,24,8,15,12,41,255,128,114, + 85,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,2,0,0,0,67,0,0,0,115,44,0, + 0,0,124,0,100,1,25,0,111,42,124,0,100,2,25,0, + 100,0,117,1,111,42,124,0,100,3,25,0,100,0,117,1, + 111,42,124,0,100,4,25,0,100,0,117,1,83,0,41,5, + 78,114,71,0,0,0,114,73,0,0,0,114,58,0,0,0, + 114,59,0,0,0,114,10,0,0,0,41,1,114,69,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,8,99,111,109,112,117,116,101,100,159,2,0,0,115,16, + 0,0,0,8,1,10,1,2,255,10,2,2,254,10,3,2, + 253,255,128,114,154,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, + 0,115,74,0,0,0,116,0,160,1,161,0,125,0,116,2, + 124,0,131,1,114,20,100,0,83,0,116,3,131,0,125,1, + 124,1,160,4,124,0,161,1,1,0,116,5,124,1,124,0, + 131,2,160,6,161,0,1,0,124,1,160,7,124,0,161,1, + 1,0,116,0,160,8,124,0,161,1,1,0,100,0,83,0, + 114,6,0,0,0,41,9,114,107,0,0,0,90,10,103,101, + 116,95,99,111,110,102,105,103,114,154,0,0,0,114,55,0, + 0,0,114,75,0,0,0,114,85,0,0,0,114,152,0,0, + 0,114,81,0,0,0,90,10,115,101,116,95,99,111,110,102, + 105,103,41,2,114,69,0,0,0,114,89,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,218,4,109, + 97,105,110,166,2,0,0,115,20,0,0,0,8,1,8,1, + 4,1,6,2,10,1,14,1,10,1,10,2,4,128,255,128, + 114,155,0,0,0,90,8,95,95,109,97,105,110,95,95,41, + 50,114,93,0,0,0,90,5,95,115,116,97,116,114,1,0, + 0,0,114,2,0,0,0,114,3,0,0,0,114,4,0,0, + 0,114,5,0,0,0,114,107,0,0,0,114,133,0,0,0, + 114,19,0,0,0,114,95,0,0,0,114,122,0,0,0,114, + 29,0,0,0,114,129,0,0,0,218,12,118,101,114,115,105, + 111,110,95,105,110,102,111,218,5,109,97,106,111,114,114,137, + 0,0,0,218,5,109,105,110,111,114,114,138,0,0,0,114, + 8,0,0,0,114,111,0,0,0,114,120,0,0,0,218,8, + 112,108,97,116,102,111,114,109,114,115,0,0,0,114,62,0, + 0,0,114,117,0,0,0,114,118,0,0,0,114,97,0,0, + 0,114,99,0,0,0,114,101,0,0,0,114,103,0,0,0, + 114,105,0,0,0,114,12,0,0,0,114,16,0,0,0,114, + 18,0,0,0,114,25,0,0,0,114,26,0,0,0,114,27, + 0,0,0,114,30,0,0,0,114,33,0,0,0,114,34,0, + 0,0,114,36,0,0,0,114,39,0,0,0,114,45,0,0, + 0,114,54,0,0,0,114,55,0,0,0,114,85,0,0,0, + 114,154,0,0,0,114,155,0,0,0,114,82,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,8,60,109,111,100,117,108,101,62,1,0,0, + 0,115,96,0,0,0,8,4,28,1,8,1,8,1,4,4, + 6,4,4,2,4,1,4,1,8,2,8,1,6,2,6,1, + 6,1,10,1,10,1,4,2,4,1,10,3,10,1,10,1, + 10,1,10,1,8,3,8,5,8,9,8,14,8,11,8,11, + 8,9,8,8,12,14,4,1,8,2,8,13,8,23,8,18, + 14,18,14,60,0,127,0,127,0,127,8,32,8,7,10,13, + 6,1,4,128,255,128, };