From 54d13e9018ebac5a6cf1f82627cddf47c85b1a1a Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 9 Feb 2025 21:35:37 +0100 Subject: [PATCH] Merging upstream version 2.21.0. Signed-off-by: Daniel Baumann --- .github/ISSUE_TEMPLATE/bug.yaml | 2 +- .pre-commit-config.yaml | 16 +- CHANGELOG.md | 40 +++++ CONTRIBUTING.md | 5 +- azure-pipelines.yml | 2 + pre_commit/clientlib.py | 10 +- pre_commit/commands/run.py | 12 +- pre_commit/commands/sample_config.py | 4 - pre_commit/error_handler.py | 2 +- pre_commit/git.py | 26 ++-- pre_commit/languages/dotnet.py | 67 +++++++-- pre_commit/languages/node.py | 2 +- pre_commit/languages/r.py | 5 +- pre_commit/languages/rust.py | 140 +++++++++++++----- pre_commit/main.py | 8 + pre_commit/resources/ruby-build.tar.gz | Bin 72569 -> 74032 bytes pre_commit/staged_files_only.py | 2 +- pre_commit/util.py | 15 +- pre_commit/xargs.py | 2 +- setup.cfg | 10 +- testing/get-swift.sh | 6 +- testing/make-archives | 2 +- .../proj1/proj1.csproj | 2 +- .../proj2/proj2.csproj | 2 +- .../.gitignore | 3 + .../.pre-commit-hooks.yaml | 5 + .../Program.cs | 12 ++ .../dotnet_hooks_csproj_prefix_repo.csproj} | 7 +- .../dotnet_hooks_csproj_repo.csproj | 2 +- .../dotnet_hooks_sln_repo.csproj | 2 +- .../python3_hooks_repo/.pre-commit-hooks.yaml | 1 + .../.pre-commit-hooks.yaml | 2 +- tests/clientlib_test.py | 39 +++++ tests/commands/init_templatedir_test.py | 2 +- tests/commands/install_uninstall_test.py | 6 +- tests/commands/run_test.py | 37 ++++- tests/conftest.py | 2 +- tests/error_handler_test.py | 5 +- tests/git_test.py | 2 +- tests/languages/docker_test.py | 2 +- tests/languages/r_test.py | 3 +- tests/languages/ruby_test.py | 4 +- tests/languages/rust_test.py | 90 +++++++++++ tests/main_test.py | 53 ++++--- tests/repository_test.py | 66 +++------ tests/store_test.py | 2 +- tests/util_test.py | 12 +- tox.ini | 3 +- 48 files changed, 534 insertions(+), 210 deletions(-) create mode 100644 testing/resources/dotnet_hooks_csproj_prefix_repo/.gitignore create mode 100644 testing/resources/dotnet_hooks_csproj_prefix_repo/.pre-commit-hooks.yaml create mode 100644 testing/resources/dotnet_hooks_csproj_prefix_repo/Program.cs copy testing/resources/{dotnet_hooks_combo_repo/proj1/proj1.csproj => dotnet_hooks_csproj_prefix_repo/dotnet_hooks_csproj_prefix_repo.csproj} (66%) create mode 100644 tests/languages/rust_test.py diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml index bfced0f..96cd6c7 100644 --- a/.github/ISSUE_TEMPLATE/bug.yaml +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -12,7 +12,7 @@ body: - type: input id: search attributes: - label: search tried in the issue tracker + label: search you tried in the issue tracker placeholder: ... validations: required: true diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 94a35a7..7e58bdd 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.3.0 + rev: v4.4.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -10,35 +10,35 @@ repos: - id: name-tests-test - id: requirements-txt-fixer - repo: https://github.com/asottile/setup-cfg-fmt - rev: v1.20.1 + rev: v2.2.0 hooks: - id: setup-cfg-fmt - repo: https://github.com/asottile/reorder_python_imports - rev: v3.3.0 + rev: v3.9.0 hooks: - id: reorder-python-imports exclude: ^(pre_commit/resources/|testing/resources/python3_hooks_repo/) args: [--py37-plus, --add-import, 'from __future__ import annotations'] - repo: https://github.com/asottile/add-trailing-comma - rev: v2.2.3 + rev: v2.4.0 hooks: - id: add-trailing-comma args: [--py36-plus] - repo: https://github.com/asottile/pyupgrade - rev: v2.34.0 + rev: v3.3.1 hooks: - id: pyupgrade args: [--py37-plus] - repo: https://github.com/pre-commit/mirrors-autopep8 - rev: v1.6.0 + rev: v2.0.1 hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 - rev: 4.0.1 + rev: 6.0.0 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v0.961 + rev: v0.991 hooks: - id: mypy additional_dependencies: [types-all] diff --git a/CHANGELOG.md b/CHANGELOG.md index 03a7c80..cd0de5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,43 @@ +2.21.0 - 2022-12-25 +=================== + +### Features +- Require new-enough virtualenv to prevent 3.10 breakage + - #2467 PR by @asottile. +- Respect aliases with `SKIP` for environment install. + - #2480 PR by @kmARC. + - #2478 issue by @kmARC. +- Allow `pre-commit run --files` against unmerged paths. + - #2484 PR by @asottile. +- Also apply regex warnings to `repo: local` hooks. + - #2524 PR by @chrisRedwine. + - #2521 issue by @asottile. +- `rust` is now a "first class" language -- supporting `language_version` and + installation when not present. + - #2534 PR by @Holzhaus. +- `r` now uses more-reliable binary installation. + - #2460 PR by @lorenzwalthert. +- `GIT_ALLOW_PROTOCOL` is now passed through for git operations. + - #2555 PR by @asottile. +- `GIT_ASKPASS` is now passed through for git operations. + - #2564 PR by @mattp-. +- Remove `toml` dependency by using `cargo add` directly. + - #2568 PR by @m-rsha. +- Support `dotnet` hooks which have dotted prefixes. + - #2641 PR by @rkm. + - #2629 issue by @rkm. + +### Fixes +- Properly adjust `--commit-msg-filename` if run from a sub directory. + - #2459 PR by @asottile. +- Simplify `--intent-to-add` detection by using `git diff`. + - #2580 PR by @m-rsha. +- Fix `R.exe` selection on windows. + - #2605 PR by @lorenzwalthert. + - #2599 issue by @SInginc. +- Skip default `nuget` source when installing `dotnet` packages. + - #2642 PR by @rkm. + 2.20.0 - 2022-07-10 =================== diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 310c17e..a9bcb79 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,6 @@ - The complete test suite depends on having at least the following installed (possibly not a complete list) - git (Version 2.24.0 or above is required to run pre-merge-commit tests) - - python2 (Required by a test which checks different python versions) - python3 (Required by a test which checks different python versions) - tox (or virtualenv) - ruby + gem @@ -65,9 +64,9 @@ to implement. The current implemented languages are at varying levels: - 0th class - pre-commit does not require any dependencies for these languages as they're not actually languages (current examples: fail, pygrep) - 1st class - pre-commit will bootstrap a full interpreter requiring nothing to - be installed globally (current examples: node, ruby) + be installed globally (current examples: node, ruby, rust) - 2nd class - pre-commit requires the user to install the language globally but - will install tools in an isolated fashion (current examples: python, go, rust, + will install tools in an isolated fashion (current examples: python, go, swift, docker). - 3rd class - pre-commit requires the user to install both the tool and the language globally (current examples: script, system) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 454f6f1..34c94f5 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -17,6 +17,8 @@ jobs: parameters: toxenvs: [py37] os: windows + additional_variables: + TEMP: C:\Temp pre_test: - task: UseRubyVersion@0 - powershell: Write-Host "##vso[task.prependpath]$env:CONDA\Scripts" diff --git a/pre_commit/clientlib.py b/pre_commit/clientlib.py index 9b53e81..da6ca2b 100644 --- a/pre_commit/clientlib.py +++ b/pre_commit/clientlib.py @@ -298,6 +298,14 @@ CONFIG_HOOK_DICT = cfgv.Map( OptionalSensibleRegexAtHook('files', cfgv.check_string), OptionalSensibleRegexAtHook('exclude', cfgv.check_string), ) +LOCAL_HOOK_DICT = cfgv.Map( + 'Hook', 'id', + + *MANIFEST_HOOK_DICT.items, + + OptionalSensibleRegexAtHook('files', cfgv.check_string), + OptionalSensibleRegexAtHook('exclude', cfgv.check_string), +) CONFIG_REPO_DICT = cfgv.Map( 'Repository', 'repo', @@ -308,7 +316,7 @@ CONFIG_REPO_DICT = cfgv.Map( 'repo', cfgv.NotIn(LOCAL, META), ), cfgv.ConditionalRecurse( - 'hooks', cfgv.Array(MANIFEST_HOOK_DICT), + 'hooks', cfgv.Array(LOCAL_HOOK_DICT), 'repo', LOCAL, ), cfgv.ConditionalRecurse( diff --git a/pre_commit/commands/run.py b/pre_commit/commands/run.py index ad3d766..429e04c 100644 --- a/pre_commit/commands/run.py +++ b/pre_commit/commands/run.py @@ -263,7 +263,7 @@ def _all_filenames(args: argparse.Namespace) -> Collection[str]: def _get_diff() -> bytes: _, out, _ = cmd_output_b( - 'git', 'diff', '--no-ext-diff', '--ignore-submodules', retcode=None, + 'git', 'diff', '--no-ext-diff', '--ignore-submodules', check=False, ) return out @@ -318,7 +318,7 @@ def _has_unmerged_paths() -> bool: def _has_unstaged_config(config_file: str) -> bool: retcode, _, _ = cmd_output_b( 'git', 'diff', '--no-ext-diff', '--exit-code', config_file, - retcode=None, + check=False, ) # be explicit, other git errors don't mean it has an unstaged config. return retcode == 1 @@ -333,7 +333,7 @@ def run( stash = not args.all_files and not args.files # Check if we have unresolved merge conflict files and fail fast. - if _has_unmerged_paths(): + if stash and _has_unmerged_paths(): logger.error('Unmerged files. Resolve before committing.') return 1 if bool(args.from_ref) != bool(args.to_ref): @@ -420,7 +420,11 @@ def run( return 1 skips = _get_skips(environ) - to_install = [hook for hook in hooks if hook.id not in skips] + to_install = [ + hook + for hook in hooks + if hook.id not in skips and hook.alias not in skips + ] install_hook_envs(to_install, store) return _run_hooks(config, hooks, skips, args) diff --git a/pre_commit/commands/sample_config.py b/pre_commit/commands/sample_config.py index 82a1617..ce22f65 100644 --- a/pre_commit/commands/sample_config.py +++ b/pre_commit/commands/sample_config.py @@ -1,7 +1,3 @@ -# TODO: maybe `git ls-remote git://github.com/pre-commit/pre-commit-hooks` to -# determine the latest revision? This adds ~200ms from my tests (and is -# significantly faster than https:// or http://). For now, periodically -# manually updating the revision is fine. from __future__ import annotations SAMPLE_CONFIG = '''\ # See https://pre-commit.com for more information diff --git a/pre_commit/error_handler.py b/pre_commit/error_handler.py index 992f5cd..d740ee3 100644 --- a/pre_commit/error_handler.py +++ b/pre_commit/error_handler.py @@ -25,7 +25,7 @@ def _log_and_exit( error_msg = f'{msg}: {type(exc).__name__}: '.encode() + force_bytes(exc) output.write_line_b(error_msg) - _, git_version_b, _ = cmd_output_b('git', '--version', retcode=None) + _, git_version_b, _ = cmd_output_b('git', '--version', check=False) git_version = git_version_b.decode(errors='backslashreplace').rstrip() storedir = Store().directory diff --git a/pre_commit/git.py b/pre_commit/git.py index 35392b3..a76118f 100644 --- a/pre_commit/git.py +++ b/pre_commit/git.py @@ -3,7 +3,7 @@ from __future__ import annotations import logging import os.path import sys -from typing import MutableMapping +from typing import Mapping from pre_commit.errors import FatalError from pre_commit.util import CalledProcessError @@ -24,9 +24,7 @@ def zsplit(s: str) -> list[str]: return [] -def no_git_env( - _env: MutableMapping[str, str] | None = None, -) -> dict[str, str]: +def no_git_env(_env: Mapping[str, str] | None = None) -> dict[str, str]: # Too many bugs dealing with environment variables and GIT: # https://github.com/pre-commit/pre-commit/issues/300 # In git 2.6.3 (maybe others), git exports GIT_WORK_TREE while running @@ -44,6 +42,8 @@ def no_git_env( 'GIT_EXEC_PATH', 'GIT_SSH', 'GIT_SSH_COMMAND', 'GIT_SSL_CAINFO', 'GIT_SSL_NO_VERIFY', 'GIT_CONFIG_COUNT', 'GIT_HTTP_PROXY_AUTHMETHOD', + 'GIT_ALLOW_PROTOCOL', + 'GIT_ASKPASS', } } @@ -150,18 +150,10 @@ def get_staged_files(cwd: str | None = None) -> list[str]: def intent_to_add_files() -> list[str]: _, stdout, _ = cmd_output( - 'git', 'status', '--ignore-submodules', '--porcelain', '-z', + 'git', 'diff', '--no-ext-diff', '--ignore-submodules', + '--diff-filter=A', '--name-only', '-z', ) - parts = list(reversed(zsplit(stdout))) - intent_to_add = [] - while parts: - line = parts.pop() - status, filename = line[:3], line[3:] - if status[0] in {'C', 'R'}: # renames / moves have an additional arg - parts.pop() - if status[1] == 'A': - intent_to_add.append(filename) - return intent_to_add + return zsplit(stdout) def get_all_files() -> list[str]: @@ -187,11 +179,11 @@ def head_rev(remote: str) -> str: def has_diff(*args: str, repo: str = '.') -> bool: cmd = ('git', 'diff', '--quiet', '--no-ext-diff', *args) - return cmd_output_b(*cmd, cwd=repo, retcode=None)[0] == 1 + return cmd_output_b(*cmd, cwd=repo, check=False)[0] == 1 def has_core_hookpaths_set() -> bool: - _, out, _ = cmd_output_b('git', 'config', 'core.hooksPath', retcode=None) + _, out, _ = cmd_output_b('git', 'config', 'core.hooksPath', check=False) return bool(out.strip()) diff --git a/pre_commit/languages/dotnet.py b/pre_commit/languages/dotnet.py index 3983c6f..e26b45c 100644 --- a/pre_commit/languages/dotnet.py +++ b/pre_commit/languages/dotnet.py @@ -2,6 +2,10 @@ from __future__ import annotations import contextlib import os.path +import re +import tempfile +import xml.etree.ElementTree +import zipfile from typing import Generator from typing import Sequence @@ -35,6 +39,22 @@ def in_env(prefix: Prefix) -> Generator[None, None, None]: yield +@contextlib.contextmanager +def _nuget_config_no_sources() -> Generator[str, None, None]: + with tempfile.TemporaryDirectory() as tmpdir: + nuget_config = os.path.join(tmpdir, 'nuget.config') + with open(nuget_config, 'w') as f: + f.write( + '' + '' + ' ' + ' ' + ' ' + '', + ) + yield nuget_config + + def install_environment( prefix: Prefix, version: str, @@ -57,21 +77,42 @@ def install_environment( ), ) - # Determine tool from the packaged file ..nupkg - build_outputs = os.listdir(os.path.join(prefix.prefix_dir, build_dir)) - for output in build_outputs: - tool_name = output.split('.')[0] + nupkg_dir = prefix.path(build_dir) + nupkgs = [x for x in os.listdir(nupkg_dir) if x.endswith('.nupkg')] + + if not nupkgs: + raise AssertionError('could not find any build outputs to install') + + for nupkg in nupkgs: + with zipfile.ZipFile(os.path.join(nupkg_dir, nupkg)) as f: + nuspec, = (x for x in f.namelist() if x.endswith('.nuspec')) + with f.open(nuspec) as spec: + tree = xml.etree.ElementTree.parse(spec) + + namespace = re.match(r'{.*}', tree.getroot().tag) + if not namespace: + raise AssertionError('could not parse namespace from nuspec') + + tool_id_element = tree.find(f'.//{namespace[0]}id') + if tool_id_element is None: + raise AssertionError('expected to find an "id" element') + + tool_id = tool_id_element.text + if not tool_id: + raise AssertionError('"id" element missing tool name') # Install to bin dir - helpers.run_setup_cmd( - prefix, - ( - 'dotnet', 'tool', 'install', - '--tool-path', os.path.join(envdir, BIN_DIR), - '--add-source', build_dir, - tool_name, - ), - ) + with _nuget_config_no_sources() as nuget_config: + helpers.run_setup_cmd( + prefix, + ( + 'dotnet', 'tool', 'install', + '--configfile', nuget_config, + '--tool-path', os.path.join(envdir, BIN_DIR), + '--add-source', build_dir, + tool_id, + ), + ) # Clean the git dir, ignoring the environment dir clean_cmd = ('git', 'clean', '-ffxd', '-e', f'{ENVIRONMENT_DIR}-*') diff --git a/pre_commit/languages/node.py b/pre_commit/languages/node.py index 39f3000..37a5b63 100644 --- a/pre_commit/languages/node.py +++ b/pre_commit/languages/node.py @@ -75,7 +75,7 @@ def in_env( def health_check(prefix: Prefix, language_version: str) -> str | None: with in_env(prefix, language_version): - retcode, _, _ = cmd_output_b('node', '--version', retcode=None) + retcode, _, _ = cmd_output_b('node', '--version', check=False) if retcode != 0: # pragma: win32 no cover return f'`node --version` returned {retcode}' else: diff --git a/pre_commit/languages/r.py b/pre_commit/languages/r.py index 40a001d..d281102 100644 --- a/pre_commit/languages/r.py +++ b/pre_commit/languages/r.py @@ -15,6 +15,7 @@ from pre_commit.languages import helpers from pre_commit.prefix import Prefix from pre_commit.util import clean_path_on_failure from pre_commit.util import cmd_output_b +from pre_commit.util import win_exe ENVIRONMENT_DIR = 'renv' RSCRIPT_OPTS = ('--no-save', '--no-restore', '--no-site-file', '--no-environ') @@ -63,7 +64,7 @@ def _rscript_exec() -> str: if r_home is None: return 'Rscript' else: - return os.path.join(r_home, 'bin', 'Rscript') + return os.path.join(r_home, 'bin', win_exe('Rscript')) def _entry_validate(entry: Sequence[str]) -> None: @@ -158,7 +159,7 @@ def _inline_r_setup(code: str) -> str: only be configured via R options once R has started. These are set here. """ with_option = f"""\ - options(install.packages.compile.from.source = "never") + options(install.packages.compile.from.source = "never", pkgType = "binary") {code} """ return with_option diff --git a/pre_commit/languages/rust.py b/pre_commit/languages/rust.py index 01c3730..204f2aa 100644 --- a/pre_commit/languages/rust.py +++ b/pre_commit/languages/rust.py @@ -1,13 +1,17 @@ from __future__ import annotations import contextlib +import functools import os.path +import shutil +import sys +import tempfile +import urllib.request from typing import Generator from typing import Sequence -import toml - import pre_commit.constants as C +from pre_commit import parse_shebang from pre_commit.envcontext import envcontext from pre_commit.envcontext import PatchesT from pre_commit.envcontext import Var @@ -16,40 +20,105 @@ from pre_commit.languages import helpers from pre_commit.prefix import Prefix from pre_commit.util import clean_path_on_failure from pre_commit.util import cmd_output_b +from pre_commit.util import make_executable +from pre_commit.util import win_exe ENVIRONMENT_DIR = 'rustenv' -get_default_version = helpers.basic_get_default_version health_check = helpers.basic_health_check -def get_env_patch(target_dir: str) -> PatchesT: +@functools.lru_cache(maxsize=1) +def get_default_version() -> str: + # If rust is already installed, we can save a bunch of setup time by + # using the installed version. + # + # Just detecting the executable does not suffice, because if rustup is + # installed but no toolchain is available, then `cargo` exists but + # cannot be used without installing a toolchain first. + if cmd_output_b('cargo', '--version', check=False)[0] == 0: + return 'system' + else: + return C.DEFAULT + + +def _rust_toolchain(language_version: str) -> str: + """Transform the language version into a rust toolchain version.""" + if language_version == C.DEFAULT: + return 'stable' + else: + return language_version + + +def _envdir(prefix: Prefix, version: str) -> str: + directory = helpers.environment_dir(ENVIRONMENT_DIR, version) + return prefix.path(directory) + + +def get_env_patch(target_dir: str, version: str) -> PatchesT: return ( + ('CARGO_HOME', target_dir), ('PATH', (os.path.join(target_dir, 'bin'), os.pathsep, Var('PATH'))), + # Only set RUSTUP_TOOLCHAIN if we don't want use the system's default + # toolchain + *( + (('RUSTUP_TOOLCHAIN', _rust_toolchain(version)),) + if version != 'system' else () + ), ) @contextlib.contextmanager -def in_env(prefix: Prefix) -> Generator[None, None, None]: - target_dir = prefix.path( - helpers.environment_dir(ENVIRONMENT_DIR, C.DEFAULT), - ) - with envcontext(get_env_patch(target_dir)): +def in_env( + prefix: Prefix, + language_version: str, +) -> Generator[None, None, None]: + with envcontext( + get_env_patch(_envdir(prefix, language_version), language_version), + ): yield def _add_dependencies( - cargo_toml_path: str, + prefix: Prefix, additional_dependencies: set[str], ) -> None: - with open(cargo_toml_path, 'r+') as f: - cargo_toml = toml.load(f) - cargo_toml.setdefault('dependencies', {}) - for dep in additional_dependencies: - name, _, spec = dep.partition(':') - cargo_toml['dependencies'][name] = spec or '*' - f.seek(0) - toml.dump(cargo_toml, f) - f.truncate() + crates = [] + for dep in additional_dependencies: + name, _, spec = dep.partition(':') + crate = f'{name}@{spec or "*"}' + crates.append(crate) + + helpers.run_setup_cmd(prefix, ('cargo', 'add', *crates)) + + +def install_rust_with_toolchain(toolchain: str) -> None: + with tempfile.TemporaryDirectory() as rustup_dir: + with envcontext((('RUSTUP_HOME', rustup_dir),)): + # acquire `rustup` if not present + if parse_shebang.find_executable('rustup') is None: + # We did not detect rustup and need to download it first. + if sys.platform == 'win32': # pragma: win32 cover + url = 'https://win.rustup.rs/x86_64' + else: # pragma: win32 no cover + url = 'https://sh.rustup.rs' + + resp = urllib.request.urlopen(url) + + rustup_init = os.path.join(rustup_dir, win_exe('rustup-init')) + with open(rustup_init, 'wb') as f: + shutil.copyfileobj(resp, f) + make_executable(rustup_init) + + # install rustup into `$CARGO_HOME/bin` + cmd_output_b( + rustup_init, '-y', '--quiet', '--no-modify-path', + '--default-toolchain', 'none', + ) + + cmd_output_b( + 'rustup', 'toolchain', 'install', '--no-self-update', + toolchain, + ) def install_environment( @@ -57,10 +126,7 @@ def install_environment( version: str, additional_dependencies: Sequence[str], ) -> None: - helpers.assert_version_default('rust', version) - directory = prefix.path( - helpers.environment_dir(ENVIRONMENT_DIR, C.DEFAULT), - ) + directory = _envdir(prefix, version) # There are two cases where we might want to specify more dependencies: # as dependencies for the library being built, and as binary packages @@ -77,24 +143,28 @@ def install_environment( } lib_deps = set(additional_dependencies) - cli_deps - if len(lib_deps) > 0: - _add_dependencies(prefix.path('Cargo.toml'), lib_deps) - with clean_path_on_failure(directory): packages_to_install: set[tuple[str, ...]] = {('--path', '.')} for cli_dep in cli_deps: cli_dep = cli_dep[len('cli:'):] - package, _, version = cli_dep.partition(':') - if version != '': - packages_to_install.add((package, '--version', version)) + package, _, crate_version = cli_dep.partition(':') + if crate_version != '': + packages_to_install.add((package, '--version', crate_version)) else: packages_to_install.add((package,)) - for args in packages_to_install: - cmd_output_b( - 'cargo', 'install', '--bins', '--root', directory, *args, - cwd=prefix.prefix_dir, - ) + with in_env(prefix, version): + if version != 'system': + install_rust_with_toolchain(_rust_toolchain(version)) + + if len(lib_deps) > 0: + _add_dependencies(prefix, lib_deps) + + for args in packages_to_install: + cmd_output_b( + 'cargo', 'install', '--bins', '--root', directory, *args, + cwd=prefix.prefix_dir, + ) def run_hook( @@ -102,5 +172,5 @@ def run_hook( file_args: Sequence[str], color: bool, ) -> tuple[int, bytes]: - with in_env(hook.prefix): + with in_env(hook.prefix, hook.language_version): return helpers.run_xargs(hook, hook.cmd, file_args, color=color) diff --git a/pre_commit/main.py b/pre_commit/main.py index b4fa966..3915993 100644 --- a/pre_commit/main.py +++ b/pre_commit/main.py @@ -155,6 +155,10 @@ def _adjust_args_and_chdir(args: argparse.Namespace) -> None: args.config = os.path.abspath(args.config) if args.command in {'run', 'try-repo'}: args.files = [os.path.abspath(filename) for filename in args.files] + if args.commit_msg_filename is not None: + args.commit_msg_filename = os.path.abspath( + args.commit_msg_filename, + ) if args.command == 'try-repo' and os.path.exists(args.repo): args.repo = os.path.abspath(args.repo) @@ -164,6 +168,10 @@ def _adjust_args_and_chdir(args: argparse.Namespace) -> None: args.config = os.path.relpath(args.config) if args.command in {'run', 'try-repo'}: args.files = [os.path.relpath(filename) for filename in args.files] + if args.commit_msg_filename is not None: + args.commit_msg_filename = os.path.relpath( + args.commit_msg_filename, + ) if args.command == 'try-repo' and os.path.exists(args.repo): args.repo = os.path.relpath(args.repo) diff --git a/pre_commit/resources/ruby-build.tar.gz b/pre_commit/resources/ruby-build.tar.gz index 8edb3caa3c27f1ccff9f0e0dc36e9863845c4efa..35419f63aebe33b6710851aef70937cd9ef163ba 100644 GIT binary patch literal 74032 zcmV(wK4RJbYXG;?7i(;;Q z1~Qq~)z#fq)m7Ei)$ycrV|6BB-!FajSAELxY1ZrX7e4vF)8CzHxmo>+ z)xY`-pGh)yV`x5(qVav@9(tee+`q^tPUqjg2*^3(kP+FzzGM51*uxp?ZmJ*H4UPUo8U%uPf z-Da;gcXnIbCQH0v=*D4`tgs{qSSRR5*Ty&;_o0=A1*7l6lVlyi8E%q<7sDV(=#7Ec z7;|%T>}VW}5;l$ympJk#UckmZ1l4n|!YJm2TJJ}JHx7JumDtSn#uK-nE3q40B!=qjtnZo;nPa14;JZ!YVG{a^)P zk8Y@-Xe40~0&~aoo|ha3*X(tez%&ef)(?l5EF8055C=B1tZ$9KkpBUxZg^qe4Elc= z|5s{R{;!l9&J+KCmQSbe4lmnbl1zf64Q$)#2mU&c_arco8iA|YNNvfw!I;Ikq|mt? z9y2Bc#a1uyE{Tx0!^E2aYe&NbM1VJjFRTlKf=d>nZy-X>v5_41lnS zEdyZhI0Rk{*y5-^Nsxt-B^Gw^HS^rzFhULievn|3a1i$07&!(ZBsO6;iTmrUHy)3Y z^-_t`xa~!QQrroKS0#-B{1j`gw?~|nK?YDM5Dr&i91RD+sCwrQgR2mD6nh^I6Bt11 zb;4iM<774<8XW3$1bueLI4sExlpXxRE?kF~q48lbz1kCk)AZ%Q)6+sm&`5G-1 zE&X3Tef|de|8*2!c0pxJK9winBkaFgv;1WLeewDC!at+-Jy!lZPSeTTe~ohEN&bJ1 z510MNAkqyZ8m_aG(In}uuo0LnZ6W*54CB|RLmJ>1ey)>70ve7x4lZu^FGk9o)dgE= z9lrLHKs+9}U@5(qg&2!K+Mi51li_$`^<4zF0%g1?5x>r;WIP!r7Gg7hdn-WLQNr%- zMAKj!a*!6AB)EXMT-hplsDZ*d_5D>vG>P_F+I%+{dp*k!M(~i81qeO_JD{|=V5fE5 zaU#kC8tV+0f`K(S48YE!ip(j}#1h1+7YvhVSV9oUOd0rxlOYXX2Kd3|@tY0PrW&PA zI9#8{Cul)~eK{^+`3#UBK_TwmFh9B;_9NG4?+$kv^*NagB;c@1NF!pw6)d!Etjabv z*n&Q(3pyHhNi;YJ;}|s2E8dJbzqSAN?ap!gaC7f<%M>+0<4gxsFTkfuZ`#&dv^!v0 z+ey!bd9>}PwfTc4A!(!yHuJ~@p~_2y!_j1%Nb%4Kz^n}pgKjD>{D4cE5T*NT6s^$!4URbI z1~HlXU_#)G(3_DPqa}=E@HC+ zcEZb>^S3Wsul5gH?Zeh95Q>E&HZ4&gVEGV(M4fuWr@~fqAXiWPY`)$6kNv&&QMLW@ z-PRAS<8{qyvog3t*`JQun_FA0qoei@t)JUF+v{xehn>xT|6%jp|M>CEyT(6jTl?GF z|07fWsI_(2I@YRj%#*;21HkF+&f($yVf)>|?*8VsD4anLKpeJS@9giv3?^0pL}xiq z3&!V{|8YS6@ISi%JmmkW*Q-dtypRgoUNi_gad6E` z2#@e&Fk)}S3v^}yF zVEdC810?(lu)21JVy6?#LEH|4qTL8>L$uf2A#P(1DOBM)=z}4LPqppN6?n|tgm#!k z(+QOxz$%U_c>uph)D+r-1NRaEfHgP{y%5Yz+)fUm5kP1ZN52Lhg+&c&B!Zz$t_E7(c#O*9Nvz^1%#W4|9Hd}sOs9(5xB#z?~7;VYQ9ZYS&m z%oP@ldqcnhzg`4GKZsfA1AJ-^@P`&)IB*Afh4le`AK|6Vt{6i?-sQmHae_aXI~oNp zn%anqOaBJ_@PfbqqDk-`LtFHgj0ho)37V~D=V%PCpeKo8wBEY|7(wcgjEUhfC2G(E z3a|lnh3_}JY!oG+0bB){E$(pW^(TI?ZWzn#U4jMEDa9_+`vhzC-QmRq1`i6p4DdA! z1qSGJCo~Lx*zI!qz>V@z6k?!@7&I|H2~>TJ1Aq}T&`-|;V;gG#&SFa)+5t-%=^ztYDnMq>tlM0z!-~TwtRc>ITLTtq@d2V$j+s>f^w1(5`ohzz!yz ze(2HLIJ`oiM9MVsb<(2&#z9IJRJm}7`Z5vV3QHzl4;UJ0sCSc48^~aNn0=t5&;za6 z^?hWG6;it~Bm$Xp3Bf0=`Y5QB0>~opn^<8w0 zm4mgo>QwMru2o!i6*zks; zONbU`Ql(woA9%?_+T!q{#{c6ui#>RD!~7r^Wa(uEkU|L<42h*8kWoXFX4E|J!T>}O7qCYj zENX^vT!1UiW*_JXR*i8_h6u`)DH*vqSzK0vZA}cv9~##^S|;IzA6|t%N%@3g9)kp# zUyzvug(3rljFMC~(om=M~P#RCgyrf(>Ag+*b^g|?e1 zpG5R$08{TG=|__xpEIOfgpFOsfk8nZ_$hWSr|&UA8-gSwQ3!D9D|cRE%&97k60oav zXyBp*FuIeN=GhOrA<_{JFlWyYL#%GJ@`?xeOtw&Ti6|6fM`tIuGvSlZr64B>K~UEr z@L=&OATZ)#XuNR|Jja)&fCqF2MJO>4uv7=5WNo(D?;Gg(?z^-;UWd3PiE;=RP0`D6 zcm+#b2m)U`pi(eiuo{s3W2wvl(l>ylkno}KFo2FGu2^z(8AMzNVl|At$v}*VO-q=> zc^tUFJBbki0rRFwHRBy&6eUUu3Mn@tPMGv630n+LOaqNH?@ zZ_^H-GI0chf26jU*^3w2hV%Cq$g;Q%{q46<^ews206-jpvikr0Z%~+f)$9R(-u)mtkW|39<;_l^&DUcNit*?axzjQ>aY|0+yhHOPUB37xX2Q0iP)a_Roxz|8QfC>?#_e_|o-21?y4k|KS#?VOBO{5ZMXr%^y_)N^!c7K-II5xR zsGJ3O_yiqhYK}n#22?o;I032aMZQXUF1I*@rAS7rOGXKHhuo2q4jKq!vKm37C$%@% zO%VIXZ(8hV|JCtNn};p7bHok~_kY~kZf!Gj^9X*ME9|G8<2U>7jv16V+}u0%*xT0O)*JY_`EqA>=lJIpRRJf5Tv(Gi+bc-sH_O#6RY zpo@`yCo`TLhp<>!bXojPzYVKsmSEN~NY9ET!){wj>|AU1c+8q%zXf1MBaroqukW zCP`fCN4TkD>t{{Hkk~MMFo^uX{ksvg=hI$`9M~U2R}HHiO%eb4kAKLYSSxtU;9@_l ztw#(89bu7(!R+G3B%%1yO+rsTkVqD`l_4-@S?H-{`Oh3Va1+##G(r}1pGd-=f>yCB zc9|7G69p1(Me}07UjJFL`7BAu_fNMr4tQ*(3+gx5(>@OM6dFh9KRG?{;TB!F2laem zJ}nwlKLVyk|18B|6YKNi&!FLtaG!lheqRyoEW@nD7PNsor31cEj2qg~U_@yXKt>QE zLfWLs9TGaWic;)^SQ;bBlW-gu{jh_(OhIyX!egOP_|S$`Iy@j4=%BVdo=r5h$+u^H zjn3xS7A!3w>|Rn2x6?TQvB!_FUxQ-Lt(dEzAB}`>pVNoSa-x$X9P(kh2{6UPh;KI- z@G>3C6#|VuYwkn85m_w8J)TIy<5>OI|NKA1&@05q(E6|c`G2B8HR_|oo3>qaZw?zy z(2Z?#{|$L|p}vdz4tZ!WhWZaKl5w6e0yI7E&e1WnqIS{nZBY`6N$g6;b08W7lE*C# zxh3Foazdo+GRCxEsm!p(GK7MM4f0Q*yn#`)p9mp`{D;e_}X56GQQp}~2a zH!sD5*c?MT8QW}en-l6fl3_RqfXxOY+&!9fV7Uf!8iOZ*;AO{`W}&gQx%H+s0}T{E zF32z)hmq@DV!Q{9kB-N=lIc|E95Y*l!>i~L5l=FU(b6;;Z;p=-+FM{2?;W3~XzX)m z?K#qN#XDbN=iVglpOaE_eti*)$yJL{Dae7EAk`7;hB1b84YAOKZ(Cz`mx@LM%+JkA zd;j40NFNP!Df2)l7LEAAgDwv@p}!KlX&gS9Hn!d!?&h#~7!4YlKY_$F8b7^m9sgl8 z__TaVG~@xB!(Dw+gg_NXknrdzDo^&O6<-Bt9Bgj=u=%>h(NSp7CU*c!frigwU_-~n z4xBiA81M)O(o+R1S&m(X|AF0RU;MsgKa9xH4?70}8;w_9-tZ~tOg5jl9=i*%z5 z2dhm@(D9=vxB( zyv!&hWdC_I#6Xnzugs`qM}wpC zsfJ++jh(%tTM0FOOm?C47j`pbKxkU`EhF)htC?z*xpIy8OG z7SF8_i12RTCEFEIyfIuxZ>1O{JQqvlA~Rz7hHs6JJj1*$}}{Hv#_}2N1mvwt!P@;BnT~_@*WPSaRK^cFTmYs+k+s38zz}WVz`(E>hU^2U2F@B7 z5DwHTLhiWnfye$abXIJRN~ox$fi-}QY9>2HE$X@f5Z};;j^(q3s_;{lvqT#E2ciL< zhya-CI6{N~#AKwpmt+Qt^fMsq0`1I|dR&i32*NaN4&2|NGh6*=;=hU`j4?gN#AQRk zdMtIi5L(c>n*cE-W8IH}G1>xkjd6sEx-Lh%Em1Os%d276O=e2RD?P+x02EJ_7O}?{ zzt6qE8UEIs@{m!8CpXN-F^Mm(pYm;7IRwPm^M#f`i9`jhx;T_u zT4C2@%btr0s*t2Qd9(rt+-5stgX6}N=U@WJDC42i=|=?wD$N;PgFMo`yKY#S!k8_U z$84ezDkzap>^GvQm}U%cg%;&grOk&4h15?*;}sU#fUHD&AxXP~zQ^GL?r6YxB8Xum z_*37RAj`h*O~`wt563qck#5a4Hvo!As|mFJbIvuV+;O5KxFGSf3bX7vn*@#`aCBR$ z9-s~o#RIu+@Xdc@S$6uC3pELC-Dn6bmkv^viRS@|JZ8ZJpDSzQPZ%7~=rF;#$98hOktI zTG1E9m+@(YFcKSy8Ro7NV1NpqsS=4$hXD@`L8s37h2IgV4uS!mfjQ?g7}W$Aiz7`> zkfG(5*aeCjM>`JIqrNsaV+`y`9aX~3c8(%qXz)V>s>jsOJv(zYL-J30becyeK_vrZ zm|+G>33P@hP(Q0C9lC@bD?(47QobAbTG0EOpg%GUu}6SutI4~ak-(SX*$Ms2Hz=b1 zL^*S?ixHjqfaYmg+fiw17etm?JPt8Tt}y_f%QA$uB9BV)!!z>L3I8>YK^6w_*~yu0 zyu=K$+{Y-FQI%YpV~8oHQ(GM~vO#&o#b9zL^}Z~!_%D{!-S&^mI*U|N;<B=_f;f2Y=*%KzD@HlE^tKTrJ6GYap(xyLmdv?s7=z@|Bxz?vQ3q4XYluObalpF2ngRod70Af-ty^kWTEOlv!2!ez(X`<7O>>G zhB+!?^-KAfj$Qo4QxsubMJ61AQU;*4O+gU^U{?UJ5PS;2?Q^@PuPXE6T`0~Eoym_J zTs-xN`W!Cka)fzOfJEfiR?Y%|j!qnbK>{E#!I2fb5BWLGBTRSnM?n!VP1g}VvvoOA zmnE)6r6Yw3wN%tdNdygY{_tgM??-L3qe!)$D|W9f3hkee6o3$fR5_P8BBPRY(Wqo` z==jOHmy$6Uo_RkQuYXk{D(K+t9{ls8_%#4+a~)5&565ELf$OAz`gp>3L&knI;nbx_ zDeV9z7tmuia;$;Zr10~N6jH6u&NDjXt(-JEk0qqC8grT8jx>(lrTrH20TsnG5WTwo zuM;8*fTDGZ?qzwD{xdhBfR;G}%tB@b#tE~A%oOvp-Fo@%waLyfj*H&Er=TR?pWdb_ zoohw~O%kz^zQ--iR?#bf#P^}NH)3l4i5yt{h<3{-BijJG0_+$oVM9=eFZxl(zyaW( z+Z6s1rkEpTr9orMQ%dVM7;4X0@ut~^Ie%OH=5BrdR%`LjH2i277{Pn;{1(@dh)+_) z4LSvik&a@3gt1JL1X%k7`r(*tgPE2k?P!>WZ*cgAfOg>ZA`z~Z{e^NWeL|ur{h1LX z>0@O3^cQ#Rs-J?DG7m_?!h`pLH!}>)=!V$KT{P`!>~Zt3!^22KkWFF)S0F(#&`$>f z#gUP*w=}x$+mat#m2gB+@n_cWe8|q&hYx@m#Zx+_acAg(M*{m^P1h_64k4qxsc$--|o zkI*>YdSe)1(kDS%Zh@Hd-sJTGQqKp10Y4|)Lq z!Z@33iC;^CvmjETe)A2M=~Ee`HCZM%dm{JWt;}=^WTSm$=00xDWLIFBxG%c`vk(bC zJtaheM<9cTX%DSt;4&j!w9di z(>mQ3K?Tu~!J9LRPARc@Hpm0os4Wl56Al8R!X>?i}5&x0&CEmTs0BdRQCXwzYG-sokJ zxE`0u1`5&Jxy{4Z@9>Zhr+!cgu?h`>UO(lsBjA+w-samDimzkxCZkKgwAit>GzQJ%% zq<5R^B)lV;JBdQ{AQQkW4D_}uIJS|lQb+;mP?ce*q$ZG-5yX?J#Dlagj=Lt5r6^pQ z4JR}Hb3A@FVCP(`YiIXaNzF{3sU?KR%(@u+iRuJbGkTyih^yr;F!e@EG1Qcp3QsVi z(~$%XkQ({-q#_x`IAx^J%1fT4QY)iSZCFk)1qrMNuBg`L&2bFryJ2MekXd%Hgj{uW z04GSSnFmO(XHXP>(MpyXgqc7!Lcc@BJI@m#FE z)JHk~O9rpRYx4z%*ANSisIC?qX-Amz{0%)s9z{De$9G(L)W~Ip!X{N@v@mH*D-A9vL>9w&7& zgAw`ybZwHCKn04HC4sPblv#Q7T5|a%0$FGC9Jrbu-UCxfXNpU}BQq#K!{J0Y{`Jm( z#};o&drQnTsD@Bc4qFGiKMM_ov72RBT7HHlfQx%t4YIS3SF=%6d748QDYl>pfDGatKp9XNfSvahP#pD&^nNIVleXyjNf$c! z94ITfNNN}eXcq<^}h6!#@Pcamg8 zEUuFgK)`({dr29=dUsL{fp=(zih#q>qUE?i0id@=K=7)j4$;^A^mo2>dStRYH?)m2hSMtDo=hzHDyyYQO7rS)_iyCc=o(a!6g zy<=if3i_YkZU*v=VotEc)xs5pp0=ao&Et1Rw!!~yl=V=NdE_59FSKtquaxVYnx#;~ zp%#G5`R`1kzAzc}UG%FBQ1?Nj4@YBw*~3tq?B*3*SXOAG6Js@O>7?L5O}u=_tms^E zizMTRcnB~-BG7H>43bOS7(mHK<-(Y5GlD@cKQArc$@i&vO5tV&d4Z{UoH-bzoNhve zXQ$^HA`3X`*kwu%pS3VEZGK?fw5Jl?(8#pR%O3^7tRr`{=$)PynX3!J6wLy|KJR3m zy(%UkZ&gg>*-TBcYr_Y80i$fPXB#-Y_9vYf1^?aYw1?|4@74n5d{vXF(-!bvKy=V9V+>U3a9Da2c$GPR_t6mN|J< z`W}&kmw^f0ISzVm(mNNHh0A8jo&ugK>tmvWGekFqtfB4*x0k4I+_(QX8Gh0ozz6n! zt4^(w-~VemwWs~Rzs3IFyJ31HRb^$&WC@$v`BUV>_wu;?k=gmxD59gw zox&-q(lJbkXwK{`q;3Hu;Rj7YWqhGYFYJy9D%P1ZVOW1Fbl7FQP|youE$ZqIn2aW_ z*B18}X8na=ERv!4ha5U;Y(K3_=V7pap;JdS{wdu$pWdr7?WD;1FP?FALMps7{S;DU zfbyp|u|VQOad+ys;JyWJZ5x^!Lx2+^O|<(RJGt3AW2RB)y~z14@}3JKM{MPzEuB=W znjVHJYbB>o6g2!;b>}I^(!Wytm-_j+;{TjVx#>*he{IyC?*IIv`kz$jQn$i%Jl41D z1vd=!n5HAxZt1~KnX`zHQ9^9Ac^`{ z+;>2QcMjmC$gnRCB=VXKUbAsu%|>C(e3GABAXoFo#5{;+ zjEN|RjYYmatadZy1F^pvU!=hie(;{}HITLsZ)oBBUIs~Mo|9X6yIx**?zk44cU5G| zIro%Pc%Fb7C%-PA-Ju3Yl`D5T@P_T;*U-dWxs31FUzAqrYI_(!fPR!*xl0xUg`L#0I4FHa;P4%Q}cA*IW@mA^+*nA`3~ui8%ze? z*n(W!?uWxmL4R795bB8dhN&-FxR5lt+)mOK&d!Y1?_K-o2OVAeRCGV+5_}J2hcqf!_@{w`Si+Yy;1eP{654{+6WWH-W@j>kXuGAOL z9ff1M{YWyXaJ)TFOg=jZhq<7>Z(9F>H4+zP)qUkLWXeoRC%-@qs93hvZ0oGlE?s=X zl2W_9j9+=yP;RH_95DB!2T$@66JJb}Lh(Tq7?F%3?RskfCsqbWC{q^*T= zrcKDX?kAnLkfJQLwl&Jr3s^}QL(kp=Nhi|FORi7}ExB%^ge`_72z5~wvPN-)*D>tD zOf9kL=Ra~;y<}>8p)o53W3Ln?mc&Wt60!Q`is+4V&QgZc&bFcPGAFZ$-2HeUo8a7f z!EhWUD{Df8b>+0ejbc;2F1aPSisNgKa!EVA<%6M9b0 zjI5KVY2Bp zg_JStVvKyHOAU?nIO7f{gSI!C032A7G980AsbfWFXY#Iah6Yiw{PJj9v=23~w;*o3 zF%5R_+8zS%8NF3egh!L%{!tdj1&F9<*kyYMhx>Tx{r=%mdw*|t?;%jjSunRu0%}h| z`tTv6Sn)_>%VWQY;4@%>5`HZ~50Lx50n*Sn>`bkpTlh0qzB6-?k*Vl}_v;qwniQ*? z$!Z{%x$M(6=W!E^=?(?LIy~A~tA7!W@2^Xne3hws$<^@wdQhOKUZzxrROB06S+jhg zziAI~Dc%q(e)hfKpsFdI(rAMy7Q@U8ZK}LTN?2M4mxtT$!33C}Zt0FkxpEko!)6wU zv=ka8eUKtp65G!hD$ovz{OOiJ@H-&zH4{K+$`Y1v#)sX!g~By%ZBZ=iTejluvl*3D zpU6p_{*o?grOXTYCb3ChDJ^r7^iai2g*v)qYZOjRgO7@A+Uq+S_HLa+qLEL4)jCK^j@aW#8^L+G<7Wgw zOpMl}OkpfY%lnM?Y<^koB|HpD4Gk&T6kyrL3^$n`MUyeS(3E1H8;AX)a8c)_NhI@P zp!rnl4Q6$g%$y#kDS1@sIpgL`sxXV(J2RRR=r9rA zfAbn?+B3A0sf@||iv$lWQC6U=q<)~YV4tyEZ&hxg#|*6~`Iuo%$92|%Ea!gU*YBTt zC@=##d}ICg2WBtrjVuQsK4#dU+GEB{6#Fy-2Bh7V$z$3gD_GXXmoEiPW>=_8^(!~t zFfqPs>rHFxhog6I+ehyX4)za^K>+5#+-dq6g{?iygZf%rrI`!u5h^TkM!pIP)pFvZmP6yd|w51#!>y|{O%9?){-ExZcYhQuBhdG3Zd*|h%S zjGegF?`K@YRgu_fP=bW6GVh4M0?`){!ozpfgNz=1mRUMeef4&33b#96!dTuHs1j-i_j)y>8#p%V1Q zAmcQd*DPw8#%P6IL}2_+WArewr1E+^9%Y2iAQ<-|C6!O4S8&Q##O(qavEsblxr4;o z8}wV@EwbLYjm@{ceu(G9Dq!k!FP1!qU0Azd$|(69ED9X=yY{Sx?@VPzO}C#Fz4S=f z90EVgB1Nga8D(w6#MZinK}#;s2NgDFth#AbEiWb>^3J5zfpGH+3c#qXbrmpsN}0V+ z&sX3Z;&93nFrJFM0D05)AS*|;N0?@+6U6H z)XO}7KDR7As;M)uFbQDZAArS$GMdeeu=#HHSk$9MQ|}LUXPFQXv%HY10ho4 zn~$c1=bhgxIZ_~3yxel?{2q=f>|Qy2?Z$Yu=ej7X5_W!rF}VrxoR;6@^qh);2o_kF zYT*^5eqSf$v**ysI~#E47Yuq*PB&wKsFh zYar_B7%pPgNpUhoAMwnF)V7usl@QH9xwCCMjVnY!#C-_nd`eERX8uELa&u5xAM{cW z^hmmr3!r4ki{cklHiqeKn{?fo)hDrrpo)dTu6k!f3Y zIw&MeI&_!w75o9#*4){gCL~s)IJgRwdfs!|L=Yo_K$KfH zBl(ICpq2_qFZDLe05{$G^k~hjs!I<^xcR;eG5gZJFs7ds!b0OCCz=ZBi!ZRc6_ycS zQ%2BC>Z}w}XO#w(vx)UB%L1oU21Jo0s!>OLg!Gi%)d=qolI*O}S28DK5%G=ujJZ>Y zRi(i6HD>5@8G4>t96t#yb2kA=@xsBFL19APeGDO{PJp7p z!#L>X$ZM+~4Y^t%Dy74l7hdbBl3~(CmVp%uh!D6Ws2wQ9hLY2~jSoRv$n!Q1DPuUDS;*kOPRLs*(zhy{ z_?Y%VBBRUzGc!22>nAt+3Je}n{O>R+Ab-x|wI50G0&sg;Ws=EMcx0!H^_`-W6gfdT zOXNyxZyp|Q{%mR?EwPJ<7bVn_@6Xa8n~K(Ge-cn^%tttBtOVb`U+}xy!~xa!UAV^Kfrx@AW#%3_7E`S&}ge$9M~fk0&F57XyCN zFP=%hrfef(YsuEV1v_KBhy;Y^1!ZpWf)H=o=uFT&dXGmxfHLBct_WgD;7ww@nw@7@ zNbIS=lj@A#YOR0LUJnB|=9dm-I-c(#UB#t3H?u!0I25YukLsP|=r%omxNq`+hP-xe z#$LF(2@NXBqIwAR?-EA)aX_qJ+5BQArg6#COwc2-nfUYO+uht{a4W3fhPV|5>zF;& zQ(y$8zRl*)=g%#fQH58Rj!M;r?u(N!@6y-PHML-<;<{Rad)k#FeqZBlITiQ8;KJrH zka$TUe6k>Q8YqCHUf)ymK0I=T3Q^!!QqJfHy({to%Q6(*ht!kTDABXiiv|IPKefg2 zlz^YD2U{r)f=&V)c6kAhgjY`#F-ndTpGD`mTSr+*jyrD8?sV?#_Yzn|#CRQ+I zzpX8?!15S>X5q2^vQsW>WNX92{R176-jF1TbxXTp@lHjCZRp+7NO|3w&x8T8Qx!g0 z09>1F+@H%nXESTu<&0EK4JTR61(ca-Ge=w4oO;BH%H2)5DrbnGP$EIM77ST!^DVl9wGk2eorw~p84{Tg@Eb2AN8&5{0!-B<6A&RH9C ztF*P1vX(FIG9-9^t18Z5j=h8;ppE!!D;j_*9CpG! zF8-8YLex?@U1#(~V0@nrz#DutTG?WFAtMR^H8S`B^Ro@R%nBbEaMbZ1qg_eY!OotE znFuE%JMKILI#6N1L0mWph-iE4^~aYf`-ro#8zu!4a4`u2Q$42efw4Eh*aFYY*AsS0 znnPT;_GT=gcWl1kwX$GTqw_NLq~$T~D5(tjo?|~n@gy8J4%HcuWOk`C!6 zJ)TF+vY_r*GMmMVN>UwM;$b69)uD^(5&)tc2qi35a_m+5BId^~rKt@q3kNn^+q|bq zrn;9C@DELJ=lx?yhc?qdaJ~)(=+l&kcZsKY+Wy|g6)56ST;dNu#%-v^j6=$~TW5d} zt-^wd9UEsnU5cu-UzW?%N{be1qE28(D$~rpB15*!xru*7Q_r> zLc_(T<1Ij#Ti(!|Wmz2YY;x|&_jEv6Gznxy%^@HK_YSG;V9_GHilA)v0F9LOH=VCbSEk1p&QB&cMa0-N6@= zPLkurOt~=bOuxR5?FO36M#dk6!w|7BGJH_bqBmkz_mIor5?()BT2|Nf6%>DLxBH01Oa+l2mr?=%xeP5 z|G@!bLdgYQ9(AU8%rCXTZ}LcNGDb(dNPEIh&MhEX3+PH(fCd%{^qz4va(|yavc&`Y zk>f>e$&t#=H@#}RvDXVRC>6wp3=*7i+*2OlUJ@uo$@@ml6jyeH!^wMibE2R79`JMD z?^hdbC5Mr;^f^v3-gK3v)r!g>F88jLc47? zS~%*n$6So%uR7Ivy+P!&uiwkxQhB06?Y;}Db&n31^E^9X55SUrozU)RVsI(S%O<^` z1Lks~AG6Ftk@GSWK@>cM9LR39C-AF?9wI7JYrC91z}$_5P; zMkF2}kX(GuG$+QBZWlDqlrreRdz-JYbl;R-Msp6#e>YPs77NAvNTO0KK$k`!{gvT} zY2H9=n)hPczKC77e>M0tShq>(&f+H;FpGPXz9u5z=8hiwigxF491O=v=}j~U@;Gp1 z6-nV@q6l^xS*4*w_8}o~D-9tTnfv1u>>}-)5w7$-jo)eRgi+Q%N#BH9p zsQEyXK%l`g$S<<+<8O85_t zmYbHSx`@o_PCT*@CuP|V-Us5Fk2gHiw~jleZzNDqVZj5K_c2r^?M=Qxa+4Y&^%J)r zr_?VE)>L`)wl4O;VBchVy`|~=n%WB4!Wigv%>S;X)MUrJ8Oke+$EY=M;u7^Vi!WaK z$NC{o0B!?@ex|nIpmee2x!$!BwCN#$?p@;#(O#&s36ZN4i)lP(AYSVK3rvuV5e?1^n$D_a8}FLuKGcu1w}NsWGBK zzV|1TWuPCh(8}1%BuZ!s6O-5=${cyT ztp%%S3BuB7Xi-`|mgy4ao~5-@voB3xa>W*YnR~X7(~Us?n+B=$*xVbHMNZMJ=#7#3 zr$8`w^p2*HKdFo0o@vg`8X2Wp62yOG5(5Yid8PuiYG#y&q;H|?96gCJ0{{6ftJviQ zer_xFBTsw_i$KdeB*k?u?O#DT$e=D>Uo8djl~>tMM<^Jn0c;FwZ5IC@xJRKrJXy*BZ|&*?B2z5r6to@jdTWc1ot6OCiza=4xG>Iw z!_y#i6G+Gtv7Vj-cBkj!N|K<@1=WQ zt`NL};lNwily`~i96H3)^FA1W7FAoJJB|G8?Gn%)BF7a?p2;I&ySqQWWu2RGfJoX| zn7Ib?cxby5^Dne2^-V_8UOY9((H*^Pl) z&3s*4f<%DgI@8}ORBOy6G$fb7kbYmY*JdW<&7(A%8Mr$Z-X}pJUh<6kY{UwTh|6F& z492}U2*tk|b(OiHzh8%r!4tDo{#tg_JmSh7{iYi?;UFPzOApVyK zon@VVfJ(E7f7{}+`lV@=COsmC5O`!2>7bdXdg`pq0*l{nm8pTRxR(}N&2Q9ZAktdQ zZwYfR)vf9I-doVN%Y4FPyEdXgx#0P-+@tKXpZm z)Ti)3Q?#82S&|18m_@tQbi{tyvPd*c#TJOoD!oBCgBy-+?7Fo8+G7 zf=#Oz<+y*SbJQEvx(;mCQY-I760xhI0X{C@XA#zF-DVfIdo}&+k}jPxVhM~$-zQZR z7CEutiB(;$RYyB^S} zh!E~osUA|Q?oq4e^V4{5pVGBfKkd$(>1zcvsu$UA)6^U3;`u1~kcq|8ndRQ4f|rKH z;GFtP*KcI=n3Ie%e?frexmqQ1%qa7GWs_8@FmH2-JWd)9nafkxq-GhEe1)_-ntP)} zJKq+~GSZZM6NnY?YkG@>o`GO`Il~0cK

Q#vRC5;yit2Sd`xrHX$e_C?P2bQUVfE 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

@UO6IsN-Ld{vdH%#= zYXiMu;4w_bs9J8Me~NZ)ShDkucWYqQ3h}Km^4KYLcJdf@(vgbyZJO8Lzw{`aG)CyO zv}>LlX>yWR^JistrIk)LZf@M7)j2C$9v+6D1bcTFC+yvRxdBne z0u=HOv`Ibv8>l;pLqorTn!ljZha|g_0G&@s9Iw+AB3puBIkwLxed1}=XO!41 zCEy4Rh^);r&r_6yxz+p72(OoodDI{ zIkl#AWz}$3e_G$u8FY9u#*_a}GVghOiO>@&!Ij6DT3!ZjD{^LH)~)$hS>OF1>|8B) zaOh$4^2SVL9wYW^D%Fg3FKP}Gh9*egj~tP5q{xm}2Yh`cHA*KY$%k4I?6=S=asNX0 zhqnY1QP@^VlE+IC{Md->K=rlMxEhB)OW1nQCvOFJN*m|?jy$N^H-xDXwm1DEvmflf zIt1eOBa_G&K^~xRGDh@WbmsoeI}=LulA+CePwQ#=a)~~C_n;{+($BRJm>ljm)>3(L zoD-a`C2;A<5|m<6wH$oqC+c2FtsFpMA>!>41CM!4IO^c|gK&J0{bj}q<_2NhRx_M; zvBQWU92~q0^Jn%aT0yF~)=_mKKF}O{Lz5fnQ$pnL2qzUCXeq0FQhrG=yg5+h%%7p< zfOy1o?U?t)8mG^=y&W&?Q{NsJL($q|_=oLiOqL4wTXCV7T|d1z(Mc`^9e37OUk{I7 zQJC^6Omo_6TW9>t%8#1bK3y^TV=dQ~KIl97Q>=RFVG!|i>um&L|A@faEr8`ap||Bl z$c5|^{a3n{V!VveD$EW7FZ+lKq9vW%a1?Yh&Q=HeR@yB-nVF@Ix?IqoqoIHQp3r#* z&O5lbq%RmuUkpZBH*M?cN~@Mn79&ed@~fK{wnYc0?Q0BNzB3_yrN9=9`Mh*z8IPvz zmUcI9-%+APHJ#)-THLmC3OcwP7%UgcB9{^5y{=U8Q?y9)4_?GYU6cD&_EoS4(xRN= zl*P2bW&kQ6{l`=QFi~*x0luR>J8;+!-p2qXHItNMf+pEAvH-70rcL$yL3&CNImTrU38fcq~1CvP|`vyGcUN*2MBVNgqMyho(8iXD@%|*sk8oAqelq5-^m>oXMh6v5flc#8<-Q(Cdy0f-;ck}YMkc2_CT%(b z(toGFthdn4n!aajH$7gOKCvG|3`QsariuN{mABURr6ow0+rWGL)#T9Svu&bmS&vC} zLFX93z|7K$3eTAV=P_KhdReh8THaZ8-f+J$N|maN$hqdWC}tr=mx58X$q2{i96hU# zD0!2$UA`L6W-9~uPNDl`M_>{Q;8DPVbrgv8fQ}<=2|Ws_x&pYJPV?}zbK$o5Y;$nU zLYYU4e1nc>>fbtp28ObP;ILLzFQ@X23T^v%gJDxYoPX;82;5H%n+anAvycq1`vsJy z`xZ9U6YIPy|6NSfp?Cxa49YjeQXJTBqur*rwI1Np2T{0C+*c@U-Fdv+3_tR(Y_3QB z1exi8PkYl216)Rd91-gvc%yv`E!=4=4J_OXVJoWerCou}9?t{~F1tP2n%Z^tC^vEN z47kJpv0Arcy5+C6N8Q2q^g2b4VcfJvM*w0#7b*;9QznmLINEwpehD){>YZ2W(p*Rn zXU!bTV_e+Z>UQjN#~o)v6uV1jnU=HKcO?HBG#ns}3)S&m-;^dS*O`^i->{DoyG~z; z{)x#<1x%TJz)uk97Op|e^Kg8ghut75W)1Uc?aFP|p~LrP1PsO)#2Awj*i$aC^kw(4 zNxng4na;9(?vlH7`m}Yf!6(w!z1vzXrSj7kscQb9=aO}};ly+ZD4@V3auh}lsA>Jv zsIp3wZbaNdEsRO#ZCYI$hwgiuKbTPxtUjq)BI z<-5V+bH#~FSVpuf#vs?wN!;F{GY*%hok_r&{iofoU!tbZLd=L75o(SIMT=hb&DeNt4{gqTsco|84HHU^ajt z0Wd*RY8_RfDYa>V#K1HcKhmmjSGy(f(Uz1+`TX|OlJc;N`0PxpGDp!0ac2o!@6_Mh z$TOgl@RxkU!BmC}zG(>1Wy;J14pBHpe!pX2zn+VPiXpC{N+sd(b#9N}rAfUDTnSl& zZQurJTfj5S(kPwQ;j?NukY;Jv(;0X@TkL!H08dm$8pk5ec?m-j;eI~>^byu2PzFfQ zf|d+TuV6?DJ&MWOA!C+&tZGx#s8FZ8Qe3Lt)J0V4w|(w`nAGsE6hlRd?1kbAZ6=fd zt*{j8NqLle4l?%u><-X{_#!I{N?|QC`VLYE0+(6>FQG&%qfmV7GZ~hu7O`Wy<|btqPROty0bdQg&Kmh z1M#0GjfuGIXC9O~#9L1i_Q2GMK6Kd47{QHqbq1|q1YA$&%e7@jFIo#vAvkf(%0j?w z<~ab)XxRBN8dh)#TeK^~fA6KUT+KSg=g~`|;}F$>XpYt_*XB$2&7W}BWg5=fk(cjv znMxg&BECkfS{H6Zm2nB)pMsq`lEBb!0sw0?096+cpL}B;%z&327P8&6#<8AH3@_b1 zcr>O*;S) z7IKKrjEMrLSg1qH3ABXV_L|2%UKN+YH$GYkb`IfT`DC$y9qK%oMPP3LX`nxd1UDcEEG$HLBrx|8amr1k7Z=|I=?eD>MI zT;tqt0QJF=RQ7?zW6;|J{Y_+p9DQbbIw~9&H*R@pMql3;^GTzw?&$9CSKd+nq^UzA zlBfI6?o-(`Ow4WoE95ME)hn$8EF+<;x4@5|n>PA2;6$5N0oW{nh+}ts@Ei9*X_zK! zpyRIC$C)MDp-!Em@9&}*M0B>boe+g{GC)R-(?}+4%8Ej z#zaEx3yFf9kq{3HC)JFHfeuQ&z}Fp7quyw4YBu%2o%G2PmaVL@Bwp@awN4CC#OnP8<{g?WAi;->$Gj-|}t&pBn zkhqD{Iwx#Q%Zez7IRST5uJX+VYgdYhWKft2F&xDlF`7W<+9P^7sRDwt(AEN1A{pP0 zCyuG$&L)JT68H86xazyCBpNx%4Erq-yphJzVnK{7dC|k5iSMYd-0>kh{l3t^xR6;To>3>nqyzj0VD7T_6b;wGo2=5jAU@EmW4Jl$4d?!B^P}>;B3?c) z^;_^WTM3qWl2xleArb2YaE9^?3-iMqa;(ELMnGu{3TO;c!J_#s;|Rj!ixemF}aIh8mN9EGfJKu$6yz+lKuiCT7>J?IgNGnYcB@;z=|{gx)3Eg)aUR=IrS%6lIIm{VS_1Cdp_U^g>|9 zic`ImuX$now%Lr-cj4$;!8LXR&+LOK^wiByq4?m=Kas#du451;XUlzy*5qDSDNvo$DnYhjhk@jsBmz}j%Yehdu+hw7NatfIX9r_=eC zQ3ZBOyphqqrX@~auGk-NbZ%<uzCbE}_nsuq){D2MmN2 z3;BY5^4&n5lQH07W{Ks<0|w&z(3*F`3G+&{;r-b&yut4b- z*gj)zvjTdC4Cf7!DSm3SoaqA1pQMFGP^%h0wjbt zN@wI%NUt$}cse-e5hOSaX%_;xoux~<&;js&b6;7kVVaupPg#lOiwNk1tyViK2Q zU8g*xFLPg=Ol354E%tNg6R~cl)SHfrSlA7Ki8w)?y8MN&na0D70N;;OXyqn=>joPQz#lQ(APz%s?7GSz|L$Wb)3`;YUN?7TS+<8EEaxd-XSuPc zen#|N2?{TB4*QcoO58|Kye&GF`*&qC6WS*0M=J~iJD10>2RJ(FovTt!aB}S0aF&+= zlj)8nf9g*@j!!4*9odwW$1m`?qb;5*BE$es5ZB9PPL0&}?J5+GJ8D3NIb6b#uvAcZ zLdlJU38)nGjF?7zpOM~H=SrD8earWD3!m&&wDa@#LrGdf&@dH&YKz)=k7?I1^tu@O z5CMjPChig%8e*@8=dq?&GnEx7k{~ywU+npoiIQ;Omz(TF{OdN7p*MuQmt);~n=e%_ zx}a^JKpPf@ggyX>`=G(9zu&ohjrlni1mB0m?IRHuj1M2zpn-T6OgN#a)7P;L!qaTZ&c?U-M-siq~kHjkV+ZUm5 z&dhXGS($@aX#4;Fp8q#!dmT3wK~_Ojc~r71BzJwM4M&=B(~@0Xk*J6~P2N7SwNaLl z)4Im1NgBI)3QM3I1%^mi@6h-#*Z{m})`lHke94=w3V5zV_iKI#hvDly_>%-iKhsos zokk)Jr8naIOlgCa2*W>#p8h~%sWpQxR#=a^M?n8%smnB2Jpgq`s0awclo9;NZV<`O zt}D}+?^2n1+dlSF>NrW)aprH5G7Vu+p+X74C{@K!#O+2o%%9dE%w?|Z?`Poa4iO55 zft3Tb8PKXdx&yuI>!2~;Ch;(;V=zsow07DGS52SJru;}hSH_l5y^w{6yR8x*ea~qZ z1TKBW>c%I|f+xUb7fd2xC27+@=1iTA?M7%U@r>|PosfI9#`hMh4?M4(E(cexYAE=_G0+BD5a1)W;S>dR&=8!`)Y{buHSvXbdMev38#H58zjCor zG4_4?w5t7Ny8d;E`1P0mA^K)lRS2Mq$gI!7Xf&3Zj)2_ zism)H_Pn07eR#dN>>l}h+riIxeNUX^w?8Wl`cC9;Oy=6Xia#hFZJz}f>lJ6L|5kv7 z{aZn|4+g45M6S5TKyb-#;&di!q)zz4d!Z=4Xw9hkm-++S_Eu4~MLeq9#>*LiX=KHK zF^uUd&v{@j(40;OO$gAB0)M#bAPx8~;>GDESL2yw8~sfp^?E$@266^OkKJGn3~Ob} zM3VeyTceIQkDjv8Eqa?*;R*{pw8m43FEHNV?|hfL{Eo?>{1rf+qm^*5JOc`MpubDF^C2;< zR-gvS=vM2VT0?lDrzChoxA@_lic;pMubWLbVtHu*{GARR98NL_`#!em2 zpj1fM#eDbo#-y}dgWwNY1#HX(WD6P_JSZvqNJ{a~{FZ3u4*;bA>Jt0gBcP!|r%qe|Ss8+ zqX3pUtHT!BN0a04FpihiZcnhBN}ZIYs%#}Wi5Wj@*-n#E$Y*7`mi_dF+99Y%Kq0aw zn98yLr;Gil%!VC(%;+;#io$c=9^4<)^g~ds!478?wb2DsLTq^!M0CONhemBhmL~Dh z6Gz*cX8)w2R0h0zP@@%K83o)iy^~lR80>%8p2_uuWb=dN3uLBf9T zSnc@u6*3ij@|i_4euIC2;6H={<`>Y2r}LOhoI$+?Fwk2nQ3uBLH%eV@0I%a&7bw-Z zV6WHt1A+g=6o|^`TJ;>6Ql$YWC|GR31r{Fg+gMp#DIX1c0xVB~JE+XK0Cy4Kn|`sK zUJaM{pvZ7#quY4Bjz`^1=K#cA2U==Af#*gO7lumPCkt43;8F~@Ai$Vj?xS#qiGvoL zQKex8FFipbJH?3!x#AF8D4$!u9xQT4wO6H-I`1`)^3toqF+8h+d#ARC#0lmT@gW3)>AOj2E!1JuWVNudZOz-nq_pm}#p8J=ZL2)Z}9ioEa-uHgyv}}2N z)4u9|TYS{b_I5NS^CZ&E^k3G{=XoyW!O8R4Ja7Z0V?y3Pb=puI9ALg0AM7FAN?gm zUvU_tHX#7n6C)`5V)6ox#Yo2pLb2FPcSv+UL-kCS$tHh}g3SZ2F?x4Voz9tGW8b;U z`4#j~j-`py&3_VO&o_EAuk--af2VZfFCWjP-FztoifK@)-@z|cVs&muxj

FB_o9 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%0Da>5o|PaFgyRW zNxCr&zXav-^60jeD17>@klVMH(Om6(R^{V?Xp0BW_7!I7F`FKDEe&V!Z-z4|rLw4%W{5lthKc`*dmUr*t4r`A*M4de>YK>D(d+>)B z2qIrgM%)fXB93^Ket(RJTblrHDTtSf25e+wytsO$k5k^JcL>$Maq-OD*>ogQ8u2+D(`c{$;V+*}E>_5)HhBw3`5j-T{S7 zYgm=vY~t$S2WUT6ou1Zbk|GW9)oE&Krn?tBO8$4j7)5GAaoq=kgN?<7I75pMzS-hE zc_W7Oc}}wtqWX)}mf(l;p|hvxvRZ`TDbS9j(P4z~mB4%lEa@&QUUKUN+t}iD!tyUa zv7iR0Eu(~(DcV^xF=q9W9|I#b%xBDH|FI!T^`E}~kA3ys54{)<)H|5oGuQe9?V+3% zW)j(ZM{7yr<*nAa!=`_gF3EgbQd&utl zo}u1XMxNrW5$a;hl{{Df*4@?nxEi(lp-73r|FIPGZX+)h1uA!6>&bV>qk$%_{un>x zW!sSVirF{ALu$B&2MN_9jH6<||9^B3cNf$*EEg`1uMJcFy3exfS92!&l^>Hr2Hl(< z-?Y&U3Q=c63qlQsYI8~869uV+L$0wC_ht&10cO9#FK569|1(?FS623gKa(zxEaFns zI44zkaJBQh$P-(;P0H#ifbijeWZjS|VhG`RmnFl5wDC^!s_T8HpAKm$(?cDHo}Bk+ z;J&u`+UcP|O5bMKS0h85AiU_b36i#9(Ao;Y1aLVLOw&;tsLK3rmxg*cA7k88kHpXZ zlH<9h_d+ap=;i~_=UcgPKjq8_pHCdDda}vGTF(@Mp2fU*0rb)1@n1Leonqy)C}&n& z$mV8w3S-(gtz{KuOT!Cq-Z*kSMk408?@-sVJQB7PG)s%%znk;C>rA-99h?k`HW6We z1$Jh@0~nR{1LS7`un(4P1Bib;3Q&un{{s!Q#y23$mVMg#gM*9=UybtBmQ)?qw-1i7 z1{ju>_=g5++fmd{-)6km+90=txeLqMrtj93oCDqS5|~z$+7kP-nGR;>{%>!LdQO;0 zh6)Jn2o78nrP<>`ioM=R5aifBWHwm|$@94SQ@~`Kf}aCq+AxyUZD%izlyT%292nQV z#I;jgclJ5stq8v`Z=s$t`kIuQIwd$wyZn+*u~+}2E#lF8yttNh@qPDrf&xyL%3M$rAlY%7~-O9I=I3WqKz{SoPY zXaZ9Gw6}3~&EWHYTEKd{revGH-Mgb)ywEh^&zn;19W3v4Zga!gTtd3^Rhi7;YsbQ^ zwb(g(%w=|(P`1s8Z@#Ku%9gCJFZiPu zgmt63A91WkLDkV93rR#F()D^*x<+-;LaW_dq?2d9D+l?ZZKP`=EDZ~KMn&&T8ANek zvGlA^`xqC7=$)7W;4ntJ4@258@gSh||E8u`lxCbfdg588fOu5(b}ITty^Uu|b6RM_ zz@ZXGKG}QjgPJUAVl*fjJWis|BUg$n`k!o`ce{9iqB3wovR32G^3@M*&&D|mnh$Ax z@{c+9MYQ}I#YSN>Ch#jhfxc$Gfg?b>)@&`Gw3a}DCX>3;ZyWnFMLrV!%`kS+G+XIV z7A2bTCoVOr4LT*`Z+*LU=r&FSCV!0EB={xl-XX%du>2+8EfjYphv`dF`&azm za;kCFW>zX8*S!qJeR0OWT8bul6O=K!d|s#$?aIy;9{m6&Xf4TuzxrNzPj2 ziOPyVjoDz*?rN?7M4*4ygFtnvTd)v1KAI^kMsh`eld6liuOrulyk#O=wl;BMEUe3tZm6B=LsRDP6o?Mu>H{`#fJ`i<|0a^(e! z#JS7OK-L(P6A&__JojNVL|*)B@78hjtQDsKCgi;`MrZXjYl!?97Wr#RhSiJv~W z;zgHck{@h-sJ#p!UeaG0^8f$5B#BNCK3nI;`pUZQP@NCW2q$EEzVu8!VJ4coY=jjb+= z8aZw>?-M@I-aY`-#|S87n<8K{g(5*lSQ!D*mhT-M>{}Ep_UsMuQlSL6*~Jbt8rfVq zia+P>T1<9Zso;25p14UUYo)Js0^I>%^84R!=+YBj7l0%beX=e1O#|Q@03r34f%~qy z?j8kvL{x%UXw@>b$dG)}FJU23dH)Fb=UmDVN4-i6BSpGgNU#XsFmBfgepjz7q1 zx!M&T5Q#)9f(78FGt>?K(7+oS>I1yvynreNVh6``E6lQ!uXeY8v{xPjLoWqQ!xju( zOh5SfDLm3MZG54j9`{W`ny5c5ft`SMU2^A*gnTm2kDl9Q6dr#OWpLb2Lb6v@Xtn=s z=^e-G!6iaOY~Ex63$tOh1^4{sA^{vF0$c^C`cEUFoT(Be+c`Va9UBXzd>`||4OWq^6T~(#t?icb;FE#(UIxT44UIDk4D|5#7sara zeiuFP_+Y-|hW^qIW5K8s?zbjl1r8lIP;?>vuUYE)&n&%O11^;k1|FGbnT&XT#C$Z{ zSA#Ws-6E`fB;jelReO!;{=KnFpAMBUBia*-XwTiy3h^-0==Y20-a4L+yaKD*_hmC8 zJyL%bx6WX12pvet5#w-VJ-Or1`sE`RUx+{peO(_R{7)kD5s9QgXTrS%#p>qM`8f^N z@Okxla1N%?mbR%L#1PdzjVZFTOMf+m1 zbWcev2MUcR*h_gzVdaRfbpyR4y=Nyf_GJjV?lj?Snh^-^H(~|RNObiI)aZy5*17Ot zT&dR2ju;b0N@lMm#kl7#PJU9#ByRC$Ds`;m1ga$gT6PN4j$pG;8ic5X5)dUNqTiP@ zn5(tk``4Rj7uESev*6HNcV|y_*-*4X)b-|;I1TordI1^&Ci%MTB-kMSZX7x;ykUVVg) zkB)k@1AO-YS$UBDgpSx7Xm(*T@=hKbHu8_ z(|S>^5(k7@B(WN;E)%(@_ouOG`xs<}D6)q9Igxpb%d@fGDv&}$4*|zva1XgQsB0T# zwbGwE=&ab=lfnH!C-H^_&(S+}FXp>W?ZhcTIVTYNMcq~SYZUxHnBh14 zYE1BR?27cj^Q*}tk75T)M$a^O-&L1wk7q!yv$Gj|efi>cdyHwk-@h;%w+#IU1^#_v zy;9VxyWTteYOYN-CqTw6_uURptHH;3J1s_!BaRu*w|f2cj<$1pPX9Bahy?92ramG; zgFwPtH8XO@wbD^<*)z0Uy|-fL00*DONxm;3XVVK@sf4$Jk?(O{|1G%d=>Lxq1^HZW zb8D&|9JG8hiIcI=_Q8e#o%OEb!ueQpd!m6m*lg)!#xT5G9(!fg|ljAO_2E64W$V$3FDLP-L^=byN50I%VC zSwNmc*qZ)mn@#z|JK~-wf!vtPi^v$H_rGQ$<(N8N7Mj03Wo$MR{?m+;7V!rlJoJ_# z@oO2;#3zSAEs|z40LD0}8hBoehBg7^yT-wf3T7x6j4IRpVQ{d(@#~#zjD2Xw7JIx? z=y>}(CV5LurfMIdG`KP1<&(gt9ECBKbEIPg0Bsuv_E0275TQY_{4-1W%ZrN0Fgbz8 zq6X1j`&vq_+Fd#L+CuQE_4r(&|CxhKB2st%82EO=8|PT)o-q0-kifTr$bW^9Y(W19 zfSBo+O+b)hGH5T9k)g=5crf%yX~kz7y6f>3>i!H3^glPFyPA%z3pyL;e6{SidD3`urr(zq_FS$d>8LZ_-y;uQ2q1j*@)avnLWinO z?ZzPgnTcJ$t^PCk)AzQ?u(8JCtANMXwoDm$bK!Ew$)SUU=L(^OFs;;=>#`r?=bn7u z4MG0Htr2zKukVbxlsvcS_H{?;lD`$C`ORuXIHF|OlKHvW$|4V!e)aVma$e1a&!+E@ zqLw$I$4H_In8F)HR&Cf#9{ryn^gq=mZS&*!d!Ee2y%DiX@;pc$p zHr5q=L}O$x557)9lp_E zm#1_h;`j*427oVB~G+|2{MT&Jsz{)5P@7`hz4u=Y8W^~Ld zjF%;NQPtF_-Jl(h{*9h0@5TXHOb~qu4JTmHbUGfi;{vyTTR$6HeP)gZWIVjx3DG{4 z1<^mtLV=^{_~!FTxJ9Zgt_;__15qCaQ@hRaf$j-wWfFJ_8F!wnvp~S%C~Mfwn;6LZ zb;mpuOx%&Mr}aByd44J)*@_i3{DiuSLE}_z?aU8vrboGx&){Lfoaxz^($>GKpsMyT zbs3Gj@j|?7TM#=t>83{g8?}sEkAP^*$W%=ji+WuMQ9G;fL3GrVBI&O_7%o}^@Gw$j zKZZ9Nk1qn0`;!or`eXww0es*suU}7+WNRs0_fWF+=fR{bbv+qcnSZYr>hv@aMKPnN-vet$!CJ2bJ?V2G z8ut+PYNb;m-6dy79MIe}M(m>TK)CUurc&b;jBv$t$G$^z>o6B3{-ME_= z^I)|9BKxP!SCL551sO6E|AnNpB!cME6xqLI>@We8D;4gThsaLIaQoIJ8=a5}53OeW zu(5Eq)n@h)N5+B$31t%;GW~qg#(K-;mtngH!}wERuA{C1B?x+&n>`@RYR`)-CDaWVe3b;)v-aHet{_hje@pls5RtdRpu zLq25f`0$GVTR%o(;up zfaN*x5QfsU=rG4RYkeMLRmW0pPMFY>6&4L{Q!dANjVqsRtZqQJZ^*ho@{Bm-h1^4H zH2+6Ba3|fDy$>D`knY93}D4glW#L ze8&+h@j*6rasHH7v>4K`^W)Hql`w7|W!sK}i=VdzY-0A%W1%{tNvJEos_>#sm%4%0 z=_P4RhE-eV94(VGT5gOFKlm^jB*v!2GrEl-w+G4#)r0#%>v;k$bonz#CxB+z6vJBF z{#rGP%r)QgTBZ!^m1AE5E968Rcsd0(-`{Xj-}$1vTqv(nv@qhESCH)3Mn2{B`VKg?lSZNm4wQXDl!K5#mf zSaE7jJAUq)1DXWz`m`Lb4n{`JLsMg5!yg9S&}CN&p`ogvd){t1O5v%G%;Ho`-mC6A zONBSc`#THNeYIY!25(tAM=6mz37yx}&9~|VyjTJ06JiuWLMU{p9R)K1EH^A_;$IOz zvVLl>i_(c(-tM{BoZcdZY}pd#kXH_$Gs04TG^%$!uS*6$=mN)99mF{c}4v!ae z-%Ig-EH0~Jz)nk`Un9}=lZzlf4DwY(Dk$wyDx!n1w{MarXWvIbnTn@+PX_Ddt}3cs zzqr22Zo9m6KslFNJ1N+yO7uj3Q7jUGU{nUq!~N2X49ZYXRely{`iGT z+L6ns6F%^M8E+zTa4k12_19*o5W_J@_Jja^EwRPpJ<+HxVA7XD(F{ofP3)PN1?S51llELIo1%jKPdCzNLpc|A7 zMIgO~^Wd@(Lp|v@tFJ1j`n~52aTo8R7Y37R2Kxkms<-~$%X%Sm-@1zLt>k@j6_0go zdlH8P);#d;q*lQ>1Z__UfiC?-)pvqrTZYF&rA{s>KlZDud|*v1IF1+RX_|T@uzEac zP4SR!Yvj_O#y<03yFGE`!VFoPNOdc&9m&0IEx-DUyT^EN@AdU@dhC^Gh@?Cl4EwswjJ2m9iNLm$gS@XcQ3xPD|w7f;LWa~pEy zx_FLWcg8YE;E927g~!)()1TN3rDqb`dRpB$tAEZ^lX1~t{$?ni0IA)8_47cT5E-|R z%18R#!Kqt*vF5h_wn1KiOcK80(;vmN7oLV>KR7vGEAw$kMb+J(Qv^nI{l;$61-cAo zW9hBum!WkZI*;XA&c2@0%Gn2~>k+DyOc`5xs%)G3LaEcQg2w(F+51WM>hDf??EMlC z(#L@`!Y~L@PlZ|^+;?wSrsE<4^iF5qsyCktRqSIRU9mb)ad7cE*|vEobCv(8ba~j< z1iNQDhd)Y_ATkAK3%oCa`2{G3Zp|6Of5tw0P+&uT|5dM-*M6w<2((#;igenq{;&vr zRN0r??Ka^V#W1`9Hi-}tVjyz70#92@GgM_k?_DE5Dv2fQz4~gVvBB0ZmHdP!#BtyL z^k`kh&68;9+6{+XPcn8I%r1k+^zK<2l3B%Bf+(UHkhKbl@?tJxDQr*Rt`F<`dz~{( zpiUjbHWoO?>2#I(?%Adjh#66U(e*Hr6S3<;Wle!j3M$YRocHZzNjsY&j;pk~oJ-lS zk*9MmHd_BZ^3LalI3zWFKuo(RMENrvhnx}?j3RL;0YOxta+n7_3{u@r&GjNrC)v8C zY~!?Ex?f4EX39V7R%%nbFQe4t`c=2}+m*H;Kn%#Dcfl&zc?44dcj*%KrNG_zD0cvb z*2J8nJ+tT9^e^^6i|K@m-!p1>x~pzQ->a+aYqRjVuu8)%BL_@FypLVYvk5jjX;5Gm zSR>dc=Ie`SC&_j?c9>W0b$1h5J?4>G7eic%w7gREejYn!HY+KH^lWm2ZYx+d9aOD= zK^n#l5a*Wg%grdyJU(45%Jbk?@xqPAZPwRU4F$tFu}hcIyDl0F9;~^;CFeenMGH6$ zwl)!)v#YE}AUgP4XYFmH{bIhln|Ru#k|1~4{Y4{oQr^?iz2+Q`yJNZF=x@KXG3)CE zQ^m*JZs;hFVS?!f2l$Q+lpOF1xmw6ncr>(w#rNog;NZO=iaK8dNt_1`i?Meo3(Mw6 ztx2InUZRz?(4j|XbN)mLZvX7@k$F~sm=IR|_1*?vnVdd9D}ka_l5uAN53&*RD!#Q7 zC*UZciT2F1zCT!`)dCFL3OtSWMxQHA;|StbJciPOB)mhMZZwb4sF}270s%*akY;v` z6`UHLPW?jOGm>hXl3kMV{lOy=acj*>Z%1Ib(TMsimgM?*F@o%{vtP71{K;s7JJJ`4 zK|rmVbAWh+2Gvt{9uTmpDssG4EMuqd>YZ)+B5kR~5F7z3-@FRTvj_4TqrIPYmN}GE zI|th(Ljl2X6}&b=8`UI%T56PSG^iEeKAn9{MK7i;viR|H@g5iA_@hBfH+d1OvRk6{ zJ;Gg0w>)6%kN>5tidqMLI|&J$s9NzC<8yHz<%=6bS(05J48E23a%ufARJ`ZreV@7H z3kh5~A(Pu+cnTL}84unhLSX@j=kXW@mvDdt>LL0$cneSAse>ocAK6f2OgPhh>-|+@ zW$dWSn-2~@dsf(?A;jZre@&vU^5@ZrpzB#J*_r|cH<$Ac#R_>2j29SB|2j8GCV|bG zDn|Y9xQ2Ne(jv_{1Da&KTG?yk*2Wvs@mms8qdYSZi3_KqMqdv?jj0oeH9P1rI`0#4 zFrzJTV#>K+ovl2%(y*{x{9;J)j|54bkoPl=UtLAZHNEt#4B8FR3{PZI??iFxe?zHB zf*KecCAYQ`5&#qMO^1k|-+weeq**Pvz3?kt=~JmPB_!jfx~_Gv!rdOBySm!%c}9*P z_zM9HNsO?}n3LxNHgHp=0Cx!{2>2d@$$Y`j;Xu+^nx<&$i=WK$TIbiIr5SYBjJc!a z)26)+-*z4t$riK~kbVJb`?oc6@+T!Q$%yI4U4=J#Y16U<@SK3YTG{=;W8dfKG09}e zuJTrUM97^B*skX_RRW!Vikv-qY}?*yMOaJwo&)PNDx&7VCsI_@3iwt>M}7GVl6LHS zPnJ3y*CJG_ryFlf_DHF^&L6v+9D0M@SS3#0I!_NN(_nr@aGt`v!5}%<083hb6DdD{ z)*lHbrmme##>(g4vFVOtI4n`lreznSc%VBzlhGa}%;r=pA$j@oCu%$a69WYY!$^xq zdNT?Y3)Q!x&?Iy{S7-G}D)&pBllM3qrSiB7#E$9kz0QuZJX~2TV-sSQviI|2&7S!w z^#575y@`|_Kx>Z#0xv&KXPmfcy)hK$aoYT}%`-kYLd^W~iEysMdwE2*`ijOEzlYWM zwl2|{l($ew;`auvsc8%4r4N{&5K+qu+fKZ;_G!Fv?^C~Cb)1vDYV`K_qKs$bl<5(( zyo@UkV)u02w%=j#)q-&u8%=y02?lF}yC{HcJdlOk!3K_o2D1nr_Xj$pP+;K@pTDRJKq3_FZdIK$i(Ob;GhC3t-F0nLL5m(zX7;%ux6xt7dEXZ zTjbDKGl_J5)TWO2J#e#tRdsaJKC7mxgI9sfllMs^3?%{*bQpqDp@_?1xtRbOSQu8F z8N5!ix*ROkyhBtto=kIT54ml+(y#lJHsW;zE5`#v_ksuL!=Fm0$W;!mf2x1VAIM0(`+?iELh94!v3)a(NYphCwF22# zC`c4gIBCoIG>LKXJvTTT?I>2#Y3G_2Z9cFhRM#f_7R|h-DvUh2U1hRRUiR}IFX<6& zmv$JS4*}u>+Aw+o7u<$>{N1$m(~P+Pdtl;EFyr=rWm27wlW_blmHeJ{+jQuFM3R1o z@)MbfpQP3xcx^2U?70WFcTzP+Gn_4Bhswb4~ z2~!gRwcUVTN9g96#;k2X^E7NXgS++sHrJ4{bvHFEv~9Cv+12T(>?J>C=R`Hf$=5Bv z4*Eo_P66)?D3XA)2Gmca^r#Kl9TLtP7L@TdOi*U?E;@VmffAGUkd^0t{?MbhUaq=l zavUf|?)ve~}{DRkh3zzQu;T`N>42`8`mIKZ&^SHj&$t2uIk zk;eSh#Lr*3?iF2qS^90{l4o;@nbe%_zm+eec6IqDQdQK({T))3>IQT%b33eRsEB9t zxRRsPlPG&fmlVUa_*;L-zVB+PIHr8fVA1I%kHSyZ&^QqmE(n>7hEyK@~sJSIOw^?;>R4d(Z=46i zx;=Npx*fAz?I=TRSy<=7r`l9W)*deAH0r01r}wIzD;P+joN1~a`XF^C6Eh>@L~HG& zdvAaUIxcvUh8`o}(1!u$JcBCNwWTUwkb7x;8D6DB^$2#a(7k?1 z&)AN|3}ucjpL%-E4HF&Hvrm5F90P)xds7kTCCHD4I|O);3MN^gKMHsrBbn?85Gump z1?`zgW((=DlBs0+DqKCWfuV*7O*Or3J0M)ipMIn=T;_P^*2l=H>H!pWh=_PnFl-3jkPfl~~Kh@F6eNDQjw@*5LDA=x0K`3=(S&IA7>49b^A13j^ zzb+ypcPMkbPI~g(n%nrX17G@d4?foZ zm(NYrS{%<2RVjw@;re(+24v#HJO-16*kH(&Mqnn-BOAWRtam7tExJK!{~4J}vF67` z)zVTO9TT-8bG!#H-ZeZr`Hjy#PT}$IHA@mS0%Hu2nJ^g0?=X0X0s40toEuTn7pEhB z=MzWXEkAN|6fX;r>Gs8#4W5$vmZzNG!K?T2$0^hX?nbZ?O#Dqp2D}jZNW*(Ju{&g( zH=Bk3ZQBMJTlg)1mZ1C%g8Y*Fn)cmSGAruMM_zLHs`^95$s<;A8ctN?tak;y1|X^& zrIk!!kGJA*l9l3OtG&UnMeg0JJ$uC{ zr2xeVR;tNJBx@%MRzhi2{|=0+=+nzbuPeSz zIq#RUv6WT84_Ao#Tkn`=O1*S{bjgf_IR5T z-W6$S)r}oZ%_j8YZB>@Pj+FPkmkPby>kvG3VydUO_JlJPpMQwrF(dF?}s^1E`bn zK}5XR2Hqo{&u#P7w@W+qVL7*LkN+|gyizi$$ib6ope1qdaSD6>VctbH_$6t6ejcfX z5NrX=v(U~U^yE7vS$+Qeqhwc4*IyU9nD!Noh}~#$k*_Z0+T&_a&tW$Ce!L~6gJF9T z<2)_#=GCs3h=^npDJp;lU82noaWQ`EXyaURJKp=)!3XQeWcEroDXob^rq}gZ`kR@2 z=#=sH9A0rlwtEdJ-9a3cJ#Elh5w!LU8kX-LEo zBG8+7+GndV&rg^s^VeIJPNdXieK(*Af)N+te`(kLA`hTzOS39eNCe#!ALrcbFn#JX zQ*EU45Z?AMm-+R$)2@oob|&%8Q+UKX{eNf+&c1)ipk&oJmS1VPwHvOq+pV0mte2adhvFNt2mSSi9O6utHd}j9RcPUpllksY}BP_ z=u0IdD3j_QRiO)jQT%N$N)W6 z7_z5L=aO2fv}tD;tsE36d*LW$Nvl=VOD7;?%BZG-BX{)29fmtXQTv30a+I{@u36JS z1g#$lfRUu09K2{q>kon#jbYcvngm`KVg}vSXo*RCzJgshh?hsOk83;s@k`e;9|uC^ zMl#P@bCM!xgx%nI*DVV^2m&z>oC4+OE%+hs9PtqQy?c>@>^`rBrm(cP4e}=$0w-QC z#7Uh!C!_F)08;)Z?%wt24kBs@qNjkiN?ByqQYmqP{dSCQ3yb&RE-PE-c`a?b+sCb> zHPQt*Bt*;rbnO3294&NWIhv$7+u`mgZ3)-PS!Pogw)#i$7XR7FQ^V8zW zh)Yj^U~)RlcV4?1mE?PQx*gSep1cWmT19qR8$rU8pXN_+YYL;`oL4zLv#u+q>aUe_ z);XkD3N|a1WQg1L{CuaqC$_oRLz}urnl8d^SK;B)(DDWkwBL$J$(bLhhgBq_vx}&=oxlZiw+^voW`T5wi`Ud6VNhL z+K!@~gY5~RW>x}|0Ui6=jTk&1TX>^t19E=*BuR~jQTzTaE(dphbaLwL4dKgkIh#UH z_1tDpO%GSjxx^PU4?QS=L=pv?QMTa-N(R}&iwJ4{hm!}*o%W`myYo`N9Sy}qmuycm zU5cO{oiyUjnMmyIJFws9jOUqg8cq%-bI^vz!2DMl;r=wZWvu^bmE~OPDOVP$m?DCQ z)1j2>T{o>ll^xUvkk=i;tgZVL94>@~eIi4Mwnb!O2VgsQw}3iF?6^=b78+>qbUW*U zQ2wIW(;c%{X9iz}1`}1Tw7=H&))zMFaemKggSZ1RP~aw_M`Cw-doyX%_eYUoUxk># z>gUR@nABf#Dt+z?eVbZ+N9E2oPhIC@mc8!^hDvUf2fn*)Z;d2TT6d?fA%LI{JXy5? zdI9#-*}Pn?H+GeinM9WrZ(qvkbN+e9D;&Dcn)V{S_Or`@KHZ|o5jT>e>Hxws$mb%H z7c%|bju*z(4eUQ6_&2xFrdg}kF{L|^!_<>YHlBY}xX6G49nw6}GY6VCkXd;Dcb^m> z|Iw(3w^KV#vT44OrB+txCA(6lj*1)V40GlCmV39f!oMj>EbM+KN)5nxB#UqkkVZ+Z z330XW(`o!{i!6J?7f;+Qz=qns)Vj;Y|L&pFt6aSpAwM49VtIdFVT2O7OlN@9YYfj| zf=6MAu`%GT;HHTBO3*mtk=((gEmSb5txsqeX_R_voF&?Rl;!u+DkH_Kzjm+Fei?#c zQWU-gWYN&SbGP1CX8SB~yY$)IOBU#D;9_0)#hcChb>Qvd8Qr2Ya@fuqq{!qT(8q&m zm+c2gT5A<-6w`n&yf%*}VPAmXWjOA?Ye`_uj`~W`C-VZUcp)&8UC~2)23<$aPGSQoQWQQ^~G}uXmZv6XMVH!>h z(0{S}Z`IL?=(q_xnttsxm?zW009aebLZmtVpwm054Df*ca#PZ68XT`dT1ErPtiFD* z3nOW@bLal$dde0NH5#^VX)`SR$EEAVPmQcQ%)VT2=APYk9JumGkMXS3$omqrH04fx z4M1AT$55AIWbLr#c&&~nsPlkg>`FO#$`_0f?grCWme=q>U*gst%hJdjm{&nT8yiU# z_tE1b_qKj^lRv)O=q91W={Jh5uPEIN32TkYJRZ*P`<@V#7e88pX( zfag*f2&iI`_y{~xs(7}%%sUtL$7zpG>;@Gw0o81XB7}P8VwTX7_{h-9?9J5}T z?fSm^%1sx&Z&L=thdj5&_g~_3S?_q4&iFnr5pi(Ez(a%<8L3Q8*WQ%HY|2WI=cl*O z7O(bh+t|MS!jn^4DL$$0+CC_MyI^PfyH~<{Q|*N_XMFC#m_!IUNCYl8KpxiK#9}tF z667kiUh3a#{uGMU-(T0UZ}Unm{}^N*f)R|r6KG>aT)L4Lsbu7OJ)QsagWhZ{NOPw z?1w-yN5S@Wc*PiAkp%r48B|MkNljX2j#}rZ6VW=3s1u>$&BV|WOM;P=b=d*hdL&c3 zCo&|7R^`5qBjRL}c8N#xX;tko{#1{9qYYPuR^E{e$m>~z)WW77i&g56iiTf)??azC zDJio5=&+v$`Yph*213cfcp5q!BAb(eU_cm%qs{L?#Ki>a56Jz>t)Lr9o@Z?ItY*?* z>f9sZPCS&lAhK;&NvJLq^G*9Lh5oK5F6O#JGrfISyx~2y@fiuh2%RLBF z?6bre?1Fg32w_rA z+ua;T+Ry*{<}RdfAFn%uk@$&%+K{ZZeg{Wnf@htIn61`+_v_g2+zk~C6^2@iCX&e! zscN{9zwF^di1%T<3B?gm)?nx8{|E+j5ri9%FJctk}SmasQ&^ z!Ix1!F4_qnjS!|lHrzs%7^h&;e?URU0MQthorgRg#YipAYR(^Z%*oSCZ_D6&wapvq zZArLYZm{zRzBbbH<6y&`UFJp+$r7y9-AJ1gZa)m2q@!k&%XJf67^I%)%Pigw=`iz` zedJ+vwnFcwMW4-$%#$H$MV5I^47mmT`6idQ6&kIs2QV78V+q&<_#RkR?~!c)PVP!R}gW+=tjxtO7o6)j!7Dxve9YeDjX zmwiZh7$QI?08tc{6^c2l?zNNjW5=?g;BZ3Z;&z?%(A^8)4$zD)^YLRF#bVvnW7JOm z;R3f^$RK|jZGgf6<2(P#)HgxDXW$DV(qcZ{gZtiN>f|uFN*jpqY$DpHhKx!E$)AAk zD*jYotMe}ml%^0Pck|WYKG(NPx0M!`6Xm*xqA%WH&lT9y_UOn+EkD4QHX(d`57`qg zs|l*{cKAst+s||FQdz@ajTgf@7o2x$!<~i5{GobPsWJEdmOL?C|B;Gk0|{&J#`$$< zo`4|_XYHQJH0bX-&NBz@wZ2g1bFLgoXZx(hy-(jv<-nQj6Z^}hh-N*1z8Bs|x~6_& z@MSGBc<>Gft_x)o1;qZHs6^K!c<7L{U?9%L`FZH3IUA#WPnx&#ER&H6Pr>3=<$R;$ zux(E1Z=ZKBGaf6_P;?qTY-b*<(s7;O0}XSK;g68Tuj7hfI%P@^cdx5qA=%7F>?L>4 zDWB^{imsSk&2`T*^>1N`@n>VE9XQi~Z-o3F!en??m~d=>_@o24vQ69?K47W$H+R4G z@k;`hPQF4Vd()5n$?I0`ALV&fcWcqDZX*7>ku^-#a>H4Dwn&vWW;I(54f)iqPCEUqVh|D-wdP=wa6Ov3M$iF%Xs z%SpILGQ3X`BQ6_?-;Sc`XXQ`n&A)Ngzyw7SBR#j8>lNTVQR}e>hoZE!s=lGnyKXy< zj7o>pVu0@Oi{@0%$Rj?latngH0p2Mct`HI}grMu}Gaa`2arCNbPb#xm?)i>O~ z4I*)PJMMKe$aCK-beGcYR2lN{8SRV!(gsv)?cQOM=3K15NH8A>nP?Iy9%sr;Ik#|* zG>ll4-AO6l!FO1l!u9w@9#d-EIj_{JK#fSEd@9CKzaM5R%i zwd^q;4Q0hZI!y1L1Hv>APeeJVg0q7tE)mX%kPO{BEC%ey?iigca(wB>$0%*1lV|C9 zoLKjcb)iiC!JlXF9_%-q$1bf2+${xc3!&)=s*7=~Vv|1)Th++CL*tc8?=-l=Yg4V0 zPD{LHzUUw3GRK-)JH`$k@gtTC=}VLX{}#l>w}vojcYVi7!E4W`Ux$P_Aa= z@6kItSWLSYU)Qnh2f`c!B9mw&gdN&#$e0DioA^A6^HR<&lfGryg<6%v1KBE_nXD1WRf&=X((H8l&T$vS1*Qj zugCMdpU&vkmuL=p$r$*f%yBFjwo}7ySq--&(yMvJ&9s&_qFT-J9)7g5d&i$uq#rpw-B3t;D; zGJUVV8ro#&wiBBCK{{#E=H3x+FCvnL?43pGQ^3e>WwjoxF9pzrp!e;p=h(+oqictp z90>9zZKpI?SiOSF#?@Z z$nVH+IVhYSOCP>&u0PkOaLUDie^Rp_)2m&om}}dy{`q^{4DdxD*P-3M2jmu6CSEXB zD2zO)xNovv`QBUByO3D#;5$d+OzR#IjdFjk#1rmUJ@3|b>}jwh4XurgyhX&yn2fps zVg%`H&z?`!sl1OtJ!&wOd0Mz#9e8KIoX=?;3$=mb2*WtF;~}x03vpYZd3gas=4B&W~{ua24ow(zH58`$9lFc@Bi#ihYSmi4yJ-t6TBV;7HB$qRrKO^^x-iPyzz-J4G z%*Wd0faERU+Y5$&?8gfW=e)yKg}UxXO3*v@IBZ!K4CbcFd{$y{I>;Fjc=*p<34cin zsx}^e@~=x{6M6v)t}Q^EV%ouqpSow%%m+)zpC)zvMJ3faiwwPfS};g8&OA?b;T>{I zvu}!9hyL&R978bbMVL>!3iRb;)!gEG z?Vjs@`~wg=yDePhUS{{J?-@iRVrJGVHps+z#5!+%i_j7{fps$uPrKx| z7&Iqnc8cXn^N=r_4v>EVmj4HO5bkIwUJs-*x7v2=JIpfX7_MF^{x#g#{ayg2^!Aij zuflZXz1cfbSLO$kmT0i|AyD1Z2@ZJKPDO%e=bq7+7<yUe#2@SP#nq%IruJOs zPLBnw3o~CKQ1mb4?TuZH*NI$Rm%cS@K9?)SXr3?>chG=W`eexCP_0|$MCW?z4*7xe1`0AnvOVn+cI~Z{|UNu z)(4YWLyapD0}49r9@V(>J>-0D1c}!2Wz157cx6r#irg zsT;uRHh((v5_{@g{KnwD<%;N!Slt<73gmo@55aW$nnGhpw#-)Hn$SsBO@)xheGonX zR>2U12O+NuX~1An!%kX^vlW3kHuLb37_kutC$)O+tCfcu=iASz-JQRROtP9fwMv{BcT!T6wJNmcC%L|R9 zvptx2l<)6U1dozA^^R5|B+WOF(pcZD*Hgr%szWVHdWnmp6;v5S6FY;_0p^Uwt z+NHk*LD$#KShu70U{%an5KgG~eqC&v8AX-B5&PO`svg#5T1@g57@7YsX8&*HFt3zO zPYzc!lQ#n2`WCTT$rDtv?Rozk*hcV*K~n3}myBeZHVp>rfWX75(aX=(pMd;>Nk}8oCE{{AGd{hwx>Ihq(~8 zCCv66fEKz;STVC|5zUUi(k{4!IqFR~7jwr=_0L~zgZG9;M^Fq!qDuvOF zs?MFN>OK3NRfKBaCWFPMMrg{C$Gt$EMTFRB7FIrp*^c!r`eH`@hwVm=$DV3XwpQisBFlv9np{zw^VW5_e&K1}NH}Zz&-KXwCtiJK*^Mq`C-h zJpx0=ZK%5_RE$KICa7)^O?Q_*a&jS`OP5R#l0~?G60q$adhM>vHx1~#z#R;^fcs0b z%mmLhzno@2u+QTOv`}caJ8Z&|KTJu)6Wyn8N{Q*QT8%LVuFt8lKUCfQ$4Xpuwv1+4ReD;o()izp{E~nsLPB+IkU6-%yOO!;{C~!+6FSW3sR>F}YJcQ@ z^&Z(my-^~Dc!%>V-0$Qbkx9iE^1egu2hi}pD8y|NpyoR~3e&mb@#{xA%3Py378(7F zkYM*|>4P&(2y9c{Fz9yDhB$)9>0e;QgJQ)C#CyjaOSr$wBMgcQj$?2XZ}})DpbvAs zMOK_TcgPPP`dK2#lN;@Zq#PK5*si}8I{gI%5TVshiJ5ISX{#dzFuV!|6DTz4#%=L> z_Sx=s4*?`4l(yH6Q);7=wo5<3|1$0`Lj}+Y7&Fgq<)yo0`$rWvRNv3Vw|D4Ovc>!i zx-3J$T%i8^mEURWsmAa>0mSV60A#(>W6w(9Wum648bkE_E^WwBe1mT^7|N4V?hx1Q zNz{M}Oa0F(y&+Y*{<b?W%!HS5I1G8(Q6Z}agsaD;04OG8hcvZVmVG;nhF;@t;acfKwG(vK*tq z5#z=}4wP^>gmu2K6+Mox_Ps0=;^qPW2)-@^O1{UY&7%dLuZpm zSj;JLV6~hflQaHLN38;4+3D{p=NzWLYIC89As~(#icSLu)mG&^Y1)MeLvjUiiArDs zJGMx^DZt=gwtY4Re9QkQX8-9At_I6T;&EgnJ6Nx;lD5^&5@hLv?`=!wrC$}4z$N<9 zJeaiqCsFF0DnS)>>DG&v3&EE5&cH**3Jnqx65W2-ER@XJqA?6B{8e5eW(>sbfv%Yz zR;ylUYvhHt+V?<$Hp!whuUV+C(lR?^hY=Hp+jR%I(LS4f!I!kyTBRc6w$waFQnNx(wPW5mznMsB@A)R_RHD(oP0Bg!g+=}s zd=L!u?{oFZl99n^`R)%n$mD+!P){*f3@=)kkM>PCA(SNqBvjA>syQWNYH%o{`{2vsDT=3MYE`{C1`y#Zh6N!0|Mdv zMG(;W{Ev;Vf*^tR?nfG{ZN2pYTfM6m<4jRqdMuoP^45-e5ArU+$*Vg%*oQ~9825iz z?+{|64|SJ^wWZi9R3ei`Drt^`cW{QEk$3bILb-b)m2lnORA@14JCy*k{{li2#0~bW zE}!M>&0iv(XP85BKqY?j3B0kChJKRrq)OiNec?y(J2{-dga6~~cS2Mo{1CvKUFI&o zflkk*38l4p*3;2I^Wb`a52bUdCmk?bQy(axZy z3!#u(0TI!RdXCLv&_I{|G}A)W5%3>@lp>UiI#g^?%&KYE&d;jvv0!GapQjUn=2b*$ zC@F6(`YvS910so*u<9nBs4Q@n0s_4InsOO?H7Ho7nv-vB9#y)SJO=UzUanKR^mM zb=n#_HsrusA#2wQ<@5!pF@k958Myi9tjt5a;mhA7re7W+7BB`86+V65F>Ji~?eN)5 zQE>gJu`FiebCKYg{lSD2q!rHpI!_Rjdt3c$1r6_Y1+UwdQ5Dtiq5P}xma_{~1 z8qx&5cav7B3tPULtXh(L9)Gd&{}Y=uLKa$OF8|nvS7r?YrF7sbd)Be$9f!-q z@K;>KKd`|6Vq3^;2`Xb^8Msp7zXW*l%ync4eJOp@r7wwHxc)k9eZwG=AxR+6Kb?n8VM z!0TT=$*kZbh~r}A_zSHtK9*$oQ)tmNdt}*4zrDJZK1^|i*yV3Y0FP}Kusgg7+zHFpY0y?GVj&Nqu)gI#I1QaH+yRXUOlv3~V0i2a`o#~;>* zRbJ|vq(|2s5V@v^FH&eKlLEGSfx1iil2a9!01vB3Ft2d8@z=yJbVcl|2yu7jC5{fXsrJ3hmiQY-%wl!T-yJYHcM1^Rh32BBUC^0#kcjMSlEBinN$D1AdiQQ4%&e>{wPAD-e^mnWrE^b?O z5f_uJkrAQjn*yI#LV;a23J|lX6yz~CL~7L2uA@IZ_}=2A4Cwy?9l|$Ex2+sYZ;4pP ziOJp=PEFS`dLUW3$HDTM-Mg}dsoQZ6bg%dW9T0rU$q$R>^a9e)Iz~YgS85LmSK9IK z7|@w(nFMuuqQWjR7iC8MlfDs29lCqcw-AAA3W431dx)1jAQTiU7StH>n`sb?@Yqvp z(2um0KbS)^pK)!qZKMTSLg&X8Grp*2lympHk(`S{Tw%!l>0cwn4D|yCS`DtQR&SB> zfK^;Pp0|xkk@k3GAeiu;Ntt=w0lP*Lv8`|L=*7}LfSg|{k!XR>X~CygfU!R3o%3PF zUXgy<)!c7`ibZ&~?k@98nn)_y9l+Rwl0v!r1N^IN?Yqusu*r9@_lpnhfejEmcmANg zm6fV7ftS_w`niEhR>9Cs2VN2_o~|6;SujRChn!bxs3< zxxyab2P$sk-MH^6b#-GrP6e0^Rt zHg{qur8WmLU2VSYqG5B!Dt}Jp zEE|01rZ-zuAn8nM-vK)lO+EVCj#utB|E8c3e>U8FpB(ZaqG$vJ2``Q>MIl92??ua> zyvxCHUZ_uvwH9Zx^e|uBE3ZyIrf4H@5Q`c8^4uvUM^04ToCJHD!XsR2Ux6S=1gITXALr zN#HP?L*M|_uBJR2^a{ZHmrEPJn*dc{4Ran>MGC>YoRPcK+OQxBu2POlE;9oTy9C} z$@zb$nfx?(G6U#ObA~sr7l~I0*AU7@-%^pf7wihP{mX$VJZz1^Aa{htKLSgv@XE| zZdG82D+wvW^EC4I8Q4+*M4cxUER_-*bjzEQrz)dh0*iNd@kEk+KGO%k=?y4J#P}%6 zb!Sqs1O;H-8#J&T66jKba<8iLprvsmz zQs;-vdQi)gJBLXp=y~T)4S2TV?so?+n>)G<@r;G5VyPekIiv%M6z8_}R}@YwlM+;; z`-S(0NvQ|Aih~p;&yAhWH>&45hdRE0fc?@Y>J{)s_Qmeqj*)RhKsD3TSs#MM-6es^ z$A=5H)!oJiOfB}>NyKoeLI2Q*UR;`8d%2zl|7|9h)N(tKSOdGYwMmR^G4RC8A1n+f z*oJ%H`5cfJ%&j;FG`aFDzk0@O3teFF%bd;Tfl`Tjs%|}I8_nw8C9&j-C5}!rr<)Q25@?#BnSM)g| z-+Ksrw~6uCj&mir103Hvl%S2uf=fj^kDm`II^^pg>7M42yK2rb5FxL+B`YC)826@q>L~^IPh;}YUTv?{s5!ifFGDc}v zrTO4>!+TNiCI#36^f*7iO77fyd%B?t^1W1!Z91RNcR**`Th63ly&_m8Cw5f6tc{Hk z`xc_dx>}if@U<%SE#@PWgPpZ}UJ^eZzW~1Gcwgk5iSGyS^7+_ZcFk(r$LH~LWaH;^ zNb#DJ$J34vmp30riy*~?A(%eSH)($?^*-Iq27zwzA1wkl|H##xA2Z*b+w`}d{83(t zejc>>26>m=O7@trtH=LDawKYunv+Jq)>t=hzCtq)IyW~39-AG~}&0|s5(SehnGm!(mS8k;Lm z>8AS13$DQAEb>`2pWKGSjA&0rejsA|4{>^uhAAMcTFfcp+etE5h+K}a`B{1XDN zAJ8J+P~P4@NUV$5geDR8NCWyF%N)rzvhq#}N@oom{NUT73n|TXb>tQWPl`k$Uin-! z?Yd*Q>^>7oh?Ed~!pof+-QAeRQmbf-|M}s3b4fZNse@~^Kia(kpPkb#nf!-$;P+?X z$xGxT(3$plF8coYw%*_W))UmZ()J8FeCL4k>9IMj;`i&%G~FTcwCr+`5zKvgIRcu? zT(2uOY)&KF9lq@3<(=eleH#Vwh6vf2&4I0zOu_m90j}1sHoLK3xo+dh z1kJ1PR`szUf6S-uj&N5K%qqVyQM2hXM2=l%kky`1`vq5`BM$psN!igEDk!5BM*gTh z%E0N)qzi8Qqq7mm7{J_h2nMF8uQ{Hfdotln)Zmh=(g4o0P^W2$*yEFwA}DRp|KO%x=KV=!Cj+_+BQsM$^LDHU_-%N>uZ}R zr8KOPcZA4N9HqL5Fmp_1Iib|iu~JbRW2u1|p)P6}T1fGjv((X>YDhm>D?~5Xzw?p# zI!tDzcY#{4o}8aRs}L5eAQ`$6x--#7Duq!b2=6UK>_YjZi&$WZ?G6{BOD(yP;V$-| zt1FY#qf7Okr#}NTSB-ft2*{=$#03;#yEDSIiHLESsHu5A>sr1gV2Q%R>Cu3dv(}~M zR>n^6Oq7Bl@sT1yvk!8@1m;yr^`6+0kSbyAnyu*TK9ej5Aln8K&IF~&a9D|v$Q=*S znip3FQBM)01k+ntTF9*MKfMn4m{f@i3?DsUNGpQ}`OpEbVZC2!V@!gI2$ucGMLPYc z{kW)xlKcrq^fD-bY|;*uY9bO+6m=&1h(#Z4L=p>iC04x_Q#_VYJN^QTx|=e)Bz`5X zn;v8GP>axaiI|B*SUYxW#|#EsnLrP1mtm+C!cjb>;@S~Y)n;0zXudBfyi!$PMKY+g zmCUyUC{PBpLZy{(@MtpN`dm{2jk@0?V3XMe5z?h0k1$FsVhj5z3Aw~<)8*cR;dSjjRiqomZKZ(EVNPY4)b zD_C(!2gCav#KFo*7SRuM!JiSM)FRj?B&u<8)M~+I4>*~jwgVP1>_zYnGHT|CT;F&| z8;TX=5Cg6GS15OCa#iYmOsGF0zbkaaX2NnqN|VIJA@AqhVSgh*wVomu6zHeTVb7t2 zRb~ZgJ0AQynMbL^4svm*5|ZZ#jBkQw)&P=lfb#7wdB2*M6Riz`QVeuE>2pE&d&C;j zX1=*3)TZ&-)Kv46hYz~qOEDg5s0lTi0BcXrd?ChI6d;mCbAXE10b7?F2JmOa0YSbC zYryOcz$h>EtV@gdDD&DNUpX`P~t>f_Jt}HXAS|#D3QOKJEZW&WU3%Ne@QQAw0 z8545hc9zr%cA-o91RF{mczQVHx-{h+nVC!6W5RL3IQG*ZNe^HR+_tQV8e?s&!@=l8 z0HOWSEz-ye-_i<_WilAh!>|hE8LX1KD-FAF4H;!>=U{LY8n7k$qwvidM4n6pdF;PWbs<0c1tN3 z)hDK&S_6duyZxXRs+U7vjRKy=qart=bh*9(N$ACXlljJx6=6EYWQC;!^#cY+6jubz z!j@V(rGfapQ8bZfYbGx$H1m7};7}@)`+TZ#KxwbkgBNm-rWVoa;uIBS``%E9&pZlQ z9VSan03=NrtEQo7M-weM`;Sz>Me=U74`^n+qo_ta@A<1^dZgY&Q|TndUdP5B0d+)1 zB6XyJ>cnsdf4i2x*Dc7sZs`W#f$=zC5~AWLz{TiHR3B?Y8U?l*9Y~#keQ!_> zM}up(TRHYa8EO@m3!j4yC$6`Tog@N(gdg?|mVGx*i305~@j2*trmP##<;0K9;4D&$ zHDuw#Z8>w~(0#~a_!-IW8YxC$yF2RKV8%{@$s5mrH_Ce`3fWl_;J5Xes013=1n0?y zSwiT$*xJFFXmocP+VVFod}arUPn0B_L27;2=`IBCO}dFR6m+q1u)p>(l^2DEE-b25 zyFR}N?gf1*$2g<$B}HPi$iVI|P|Kl1Br00V&(I~MHz7Q2vbKj*2!SLHn!|FvHkXPd7 zMV^eTm6Fm`$L1iQCfPxd=!d6KHaBDE8#smw{qeGBwoqX5%Ne8!Q78RfXCd6_!}ZBS zKY+u{y#_*_9EsTNTSdM_B3#av9hS{ddtggsV*1PO^BDVkE;{vWApoibRe z=Gk(}SPVkehDY+3&ibjODls73=IVu_y!_*Hx)aMWB2u*Rk$CW{Hb$Y`2bqFS0q_G1+$ zacW>vb?=ofPV~Wb<0x-MK(rhVoI|u61-L7pi5jEr^Sr!&q?kNYu9QACk?dc&B2TKUdAH9? zcd9#2fcz%lzI`sLm-G8+DRTF)468w4!CRc%ke>c0tlOa8+y1C+i4eQ|A6svh213KB zyXDLzq^X78GGY1UK^D-@@r69&aiq;%Jv)jlL-yn!I{Z0A^lsSnXI+YK5TCC z0(nAg-{S%#z<5OhUB8@`@Ycb^*NDEK@%ItlmqEVQ7Mqdi88h#|iJY4$HJ*{>- zbc2Y0ZGhymuK|Z3K+p&8t|`PJtV#uCVgZ>B`nR5vq-CWUcf1cZ5kV4kjt((0C6owk zOHZH?i!SU3CwAWAoqP6_!l$0zX z7TWZyku@xG1)4Gp&E>t|9e1p!((DGvssV>UzyofMEw?GauKhWo%C(l2x+g07J?f4K zw$h#&3T{N`f^MRm1(Ac47((9|m6q;ZVRL~$8Heb+LQsp432l^lbZr{EojLb3v5N^K zvn1RBYhOX6kEJPgU&G92#!MJ8TcXC;*Xp6fqs}5Vp@5*}n>!O5fbX$$9tQ9pVmfn< zm_ar;W=f3xff%M}ohqk@z554eGSQ+aiHj853^9tj68lXVM+RjRu4SQ`96c_+!xYS6 ziDVpWZL*94O?XsKmPLPAd`Ywib{O`cJT>;-n^cXc47rLZ)Hv!BUG`a}ME%zbG6dXr zow&gH_KGXx)I!-Q+vf3F~Lkq5*K{#$CQbUqyk5zAQxa185+{TtR|VHb>LW zt}?gPhHw~@hO8fE2P)Vh*f5903f2qqH5qOPW==O+J03VJ5nImc#BvQ4zYbHHBy_E+ zU0)oMqGUA7dL>7pQA$zl{!EJP1X&C`-F(3{EfDt4nijRBb$KC%W{Fs zgH2IA=!YcVD@c68Mc_XViG}m!L;!WXub@XW={PfL|jf|zn zIFL3y*8pNhHG*S=qmTGp=pQ$zQF(NqNh|#sdnY0h8M7#9v22lWB*k$CveZWDKAF*G zG(w!87Xn!=127yQj-Cj_(fdr1E87VN7FBBX{1{)3ZALo4Fd6R90}1DXOT503l_f{I z*}t)cj+Q1x?iIT*|I&yu*6jC}LN3}~HC(b=vOlj!DS9$8#NdSU;|H5c{h%C;jwGZF z?dOdT6k;ka5TuGQUzB=u7D*ofwXI)6s_gB4-4r$MKH$qUc^-&?prnyA7Re^MKh!N} zqR*6+Gmy8JXg!ix+OtPJ(wyLetB|8kioQpqI?=ct*!5#n3jxefvtniEa)G$b1^N_f zXibXlusWe=)Gq(B5{aL=;a}vX*bP&3HE~;bYT<$G@$GX8z8CjvT%nJ-h$0WN+(RIo zm`vWm>c|w`ZnT%sU7j$(oCVtvu8AMtkU7t`lKK@F3>N3fe5VETKYMG`pi12k39A`3 zr^H;4(QUe0G?5I8#eQZ{SXL)bDxWmO;QD*QFfVk$Z9^p-@)^OOH34ui01~LDasWT& z{7-p=f4a|nI*o`Ib2lD2P%pKlx8P9VCVk24U*YG;swU!nrp=TcmVShFGLj-0mXx-r zK-8e#!Vmn!AstpoYo;MTAQxG@o+G18!oX@FiJe_0!2I^O7E{vG>k!mRm(bbN%O)3o|rhOl=Sv&gN z{H`9ZVmRKZ)32-(`U{cKv{bq{Si^|288E~exDjI?wG^q#Jk{$n z(VEdcNi|D~akChy)Z2`WYK?IH}7Z}Px`By0yhfPVn8cC9uIFgWE z=U0~rQBRbjw}!lq3aIDlfji50ngKhHf!g2Rsp^=*O!?xtbc=jLw=?&RY{bHcQlZ5{ z!IMqati}$13rS;4pr^eKj9)mW?$ef~A`C^P>A-#jJquTxiwq#*=I~NslqY`PBkV6o zJz;>=PF@HtiPIR;<+g~Ni@bkPE*28sGV~i+i!T-@MMXWa41Li- zJ?;TL93_2nFbm@;aY46OO)%4uMDSOVanGGlKyHAM=2OG~7*upF`YA^THmEX9zo2p! zh5?KHc`z$jJ_2h^2raHKC*-5-Tl@k#DfaS`NHLC3B*G7nW@fo_fTqZ6bU37N)5q5SuG-{G)@Tia$`y|=Jv@ev5ZEQrJhA9$PLXw(iLKfEn-Aw zg~f6nm8pH&SkU#*4s@SVq!jiRLRr>%(R*oOC2@PVhUqjYPec{VP)Qy|i`bp!UR+&V zaOVRnW9BLy9m*xFEj3P7;E)-$7B*KlNZXEt1Ti{INR z>&)Wd>sue|UlDR-{X*Cwzd zOtMSU0|tNJh-UYL*yo5LokY%nAw(k#sDPnyL_H=yYyL18pBkdL(nxj#ZyV~@&*#M< zn`9}yUCfeq8!{B=VSB=Fz{d<+jyHS$RbJbNYW_x)ZC>cb{5kl7^=#%oZSmEWk!+a? zZ)4b;V^tV>+i6AxR@ToFWhbeh@_~3sSj}Kc`!mqy6G3n9@VEU0SwW3h*@{iz;;x44 zKHunJ*BacEH2%l=SVgAS==bqy7I?agqkYzGh>+ivpP#cGhwFV~z)=9)G1!ze18nN% zgNqxC4b=gs$zhMc2EDf8wMU+@`RN=5%0tbIeqzAuaoN>-0z)PQ%3i=Nz9a(P-UTE6 z)g4wW` zx7)QCg9H(1A(*{|cM@coUd9*o2BNL4AeIiEZ4`vtPM<56&gFZ0O6l%DO}D8(K^_nL z%ucJo)8+?J-zUnCg|oy#+x~8wUk0Z(ojtt?Jyf9TPCkOqCaY9Mg?(HAFb#rE(YX}- zpa62^UYt^ZxN>;=5%TBnzD_fiESBSz*Cl86t-`O!x{nV?j9U&xmp6`(x*~nO)tW${)WA0N=ooIq^+?TCl9BZ@3tH#`kVvh;h|&AZea>bK)9COd^wt43=-oa$~-HCeCF zz<@zbVLE!%V z@{bdA0p||0P)n9MpBs@muCCr)FXpgoOR3wr`rrhF9{pD~v^b!}6zLHnAiR?BvDJDw$gT zT~BQ-M?dqF4BB&bvcVn#UkpiGH@dL(k@ z6|v5jm+d;5l^L)(8a8eMs<`NLLqW;MIJ1gZv7--YCB`~E#gy4OJAah&X1UzkH1=cU z{RK~H8?+u|Y^<6_Je``-QR6%_3Qm@Hc@@TYhztYf$S6GPM7&7VN1g>KR3l_;J5TPJ z{C_d)b^Up|K?OmUaN!dkC5?l^IwsV-Y}_ZAAxu_$*n&{vxr`z5!~J%1Zpq8KTytM$ zXT?b%*{=}vgNu;-OKaW9&|!nE2#I4eQ~FR(Rz|)i^)?vQh?N!EiKIXUIoL+_3q{86 z>-Oq{c=1VJd*Y9*`wX|8X^Pv@l?TYvU@s$4?^#Q3a#Cl|DPfN1lfOS)70WMn!iBXP zf`nIakS?&_l$HEGvkis>=H&ajf6n$peXlcrDZ?gXzhr>^b^5x`eED3#_1v5pp+ck5 zv+_W|DK73}-8j&YRs2E!t`TjN-|zdh&g)NYK0ltr&)AMP1n!7Bs6|D|i7zL61#7yd zE5qHn@c5L3W6FK@?Zb&4BNdI6eI>R%`Gem|;dOHaIy7CrXP*f&c+%ybY`xQRDj&;n z7!7zFd(K~422GJS_g~wD*r+~LpWmWezfuhkMm~lkZD$&Nf9La7I{upEOZXdpNkj-n_6SwJM>$WV&VVZ90`yVdH``z(ou_W!zv5%RvYP_1~l+=W5 zTzsM>`>Ltq&vBCmy%yU^$CdKqq^mcBszKQ6;W~+GPrUG5qrIDV&V|aEt6WVQ0!O5c zJFEvo={dGeOH!!Rgpl<-f3mH*QTzd9^qb#L*)+jy4C z-e4Aa$YXun(JwIHVMn4R;7XoS{lp9q)dj;UcgQ(3={k!QKOc_JDH{#D6TpfK)h|_! zzKe}3@IRTUc6U2=AdIwVTH`acwiL^MT_j=h)JIy{p}m`w>95TG@!f%8{qjE4Mm(uv z43a|tb7!(JdkqKV-R-eDy<^`@+^*HE;_mZLhrEV%i}AkT4xKxGGLm<3=^($bqn?CjUSeqik?fq)FAXOAC(_C5LB!0pqu9w;4rS;G1Pd* zFK{st9Kh(gOT2FFXfHDSmGnomWM&N$`3=eV5%p3E*Yu@F(~Y;vkN&ngh}s zyCLqi`Cv1+{M+f*=-vTwPSo~1o=t~zKfVWgY<|mYLsc8;C!se?4gFK_%^K;ps-AL6 zkPq_|{6)1McN>P1=h;fqm$`kNo7q})D%tC?J<~I!SGQl_3pUmJb*__ZVBcnR)NZ64 zD}H}4vTAF&l$Dl2N&Kwkfc(mfeIe-P?i4#bGF)T-)e#LDd;eT0E0S0a~@1X%%ogVgSyWZ_NV?(Y2B-Y zm3Aq{SD1N26i-#UD`fM;w!vkRolYYdb8&LVjtO&B3%8fAI<2SAm>x;;vO?b57JUiF zKgm$ZBsC`d;6$l}=1p;Hk*oTY{1E4F{>wA<$CD6*TZ*HSt2-A8x#UJI0MXQxw2e?H zeE*kWzc5ZwyO*$VD?3eoERPbyHM4qyaD{49Cu7r^JjrP-nTOcfryH-cb;082k44~( zdP_VBJP&(kHe#qxpT>M9Tvz5h-ouT2&+7SEnuZ!4dAdS`dQ8^h&I{*+(J&SkYH;w_M1hO zYnqBM6M~1uS`z;e@<|bsy@LsMi{v#Wo9%8qwjtl5utG?`4{{#r=db=h-M9(;v$36h zjfE+)iigtx87aUia|jpRw2@P{d;+O*+$m9%^@$I_b?sjs^K`QcM{se!DApf&VXt1 zGKMlxxn5AFW2R2zfvkw0d(a^YSl{+UI~Pss10f@2#{pQbD}A8OsdG_s@X-nZLjJOQ zjOgPX%(=L|xi5={6ja%-Z@j(r>XcBuvK!@-=wB}TcW|x#OfR5_?8vrWR($3{TtO2! z74hdAsvQ?17McJW>)70wi~sbS8Vhj3o8k*mJza6f+#+W&?;JHtLverjb9#dBIb)_xCW?H=RCyS~ ze(5)Cbnfrx^Qc2mz2RSU1#^Kmjd0l}NSqDkPn|NiKI@72`Su7S{2qV$fM<^AfIn9# zHS34HmMF$x#DK~GeLe;Y;)i#yZsLYJj2}fe&zMS~Mvg(TXF1Q~)IG$H0NOWTxAJc7 zJVbT8PP?Y?I)JzG4X?6ID|qo}Dh|ubQOl^%Yqw0uL9-*uW9&g!_O$$QKx=u?bE>sg zBllDml!)^-CQelK`Ccw}mHAvLY&wjk3QNtqnKqY$N6B4(VryVbu&j6V7-oWeD-qDS5f-TXwI@Lbo!8fh22kZrs?&T(k~braKlvgbmh*?+9+CZtZw&@lPSU+7V!(gLgITKy2d{rQdnchQT+kB1nXS#$IATUJeYH>6>+uHs>5VMh z?Pk3})2Zmw#oE|1n@Bq#n7{n|G}&EbfDzy}Z`JM7yk}f0$}gO5W4UvR#5Q_N?v0DK z`0cFfx!dr^m_EH}gFdV2410l3#iyTi?+Kwh_`jk^#6wF%Vs;ZeL)+Mo)bueov`Uznip6BmGO!FM2?wdfM4I+Q_JcTc*TsY@;Qi z6*J%r-Khk@lgr==%EQj2w~d>>3CA02$#O9Qjw8*D$j<5`^pHNWSNXSNRtq3idtKWa zCT|@WCfeq@p?Gb|%6qe#`V9~PJrV6yB%FQ>7^m3u818vye0t=% z{ZKrWm1vaHinwiU$-_%teB7xyMrMK;(tWDtdAst14PQX_f#JvfWi8|&&J+ZnC_y_?s)C#DNzoeQ`W?c0am!Xo~3P7i)<9422G ztPY+qM`&=jWoH%WcIsI2gKFuh)1T#Sl00u*45d9;{7Y;^4M|jG7Wk4~olpFkOC##6ZF4&*ZZ*@>&?G4c6-Xjl=yC_S&5YI0C&6i;z zbev_w|M*txz6mD<)J<#OoD}k8vCpS72Ki0A?47(k9*6iHC$&>Dv)ni6OU)Y-kJPk) z^p5nJ*V~7_RNhL>SAMtk?;J|CYUoccj_CB;uU6L8B3Gt2(Z%aaMw;sOzOwGVKKt#c zk^lJ}!B71biOr3~P z-s`7dq5`vBgCqgI3s5F7^1QkLD6cth<;OkMCxLh`#$~|2heS#4ZD;_N%k50Iaev>P z5iXOw`wJ^Q_i<~^2F;Gmfc{hyNr>rt=jF_53Vsj91^; zvDqavmUI{LId~HkrMN_EitiS+?)l}d3+uaDiQaodI^m~X!I5;ny}Eboz=~GMdwVPg zujl_S_!I~0#~K&+e8cB|!#V$dgn6_6^Tzo9m(Tp3%TH%Cm<*L!qIFAdI2BDVx-S2C zaV}VQM<+e;ViXvEcJLU6o_CpeS>s=K=@9p4$H@CIxTx#MQqK$5m%SkCYxx*-eNE-i z9@Dbp!Jt<`=BjViCyyR|ad7+7dv`zgL1B7E^bdRlXP6**z&FsM<73g+qXReX^EXp+ zdJjc0>E=q4_w8=xj{L(e(mp=-A>Du&5?~wA#v}M1nBiyJQWN_jZ zva)_SFFWxR-tI!8EYfGU9^AV{(%ta$Q8mp>k-nha=|F=A&pJgyh3pCr%!s_>X?4Dv1vSdE zfOuM$@xo+YlSLZkp*b0hy6&82d3Uwz);oJ{&Clue6OeS54Ob3DAIyVe0khxXc{;e` zD#}|7leQwJcIn!=-PC-e$`78)LCrOxoj18~Ks)bVHjuzk>zwZ?ajMKkXlp$W9YxOI zAki@-xB5uK>oa-XY|(Dk{!cZ-X!i%Jwf~p+|IL5L5hwHqLDbm)uaEy_(_qv5Cx}qi z@c+v2f0~DW9rJ%g7@grid{8t0-^6F`(1YW0$1OUtsgZH=!dTj_I>&!Vqp%tO*K_=5a&o}J19c>ZLXFMvpg3oY&ipjv z|7wo^a_E{B+y8ua{L>IO@&B&r_&+mFRWrV?R%PsvRD4}uYI?Ej5?{?$MEM}F|{{q)a%@q>TrAN;ky`Op1VKmMctmiQZ| ze`4|%e*f?PFTeTVtDFDQpZTx<_CId|X??1nH_+k%<|KLCR z`fvU_f9n7Itv~-qfA9DH?9IRXoACF4|Ihpm{=+~1m*SuQ$A9>{|H|+F^?&=n|MegK z#XtAYe)V78{P{ogZ~UX*Jo#0Ry!g#u`AdKG#sBxa|IdH;Z<4S6;5YyLU;bm_V|)MYAHMUmfB8@T`R=6m-krISb)WBvc4kd8~CFPq5CEh-UcegUi!L_Vcvq5cqqbB`x^0g>f$JuEu%XvFn&R^ZxZViufsdiV}!{fk5 zP=S`D-pv7ANrS4KE);-i-E|@`)BN)aLB(rvA=#^Zo;IXogOn{RX7X{+8QL?-$=+&Ww^M+6h^;p z&E%%42`v)uu+9mM>0BPGxw1p!rqk|3Izbq)j#NS_r0p&(ySc-e+hZ`8o|<5MWXj2* zWp}(8TD#}BT&%I6qk?Tc_arnbs-1+u<6MbD5~SN-A8oD^g2 zposIkteH#Fkx%+V17tHgu-#skL37ggJBbD5}aF3q8c>#=P^?#aW zakUEo%l*GG=>Kq5|C0ze`v2Z*Z;PHb`_p|MVOzcX#4Cl)l7RVPT zZq$yl^q}=w4_<#_v3!2Hm4Zpz#aVrwiHDZwX*!##-}Agp1^JG;aCv?6j5^mv5H6Cbdfk}t+GOlC zE9X4mc_vuEyhRZvN_NwRGn&7?6y{Ltb+HPHV=}?*JD;bQ=6MU(d%b!C>sm0pj=4U= z`A+qe(54bHEqebo%$apr4drt7^vu{?7(o`^|Kir|pWXV&-Q_d1`milm2$!~&c5Jy0 zJL}Q!kEvTDUA1;^BW%khrZJ>1B3KKp>Nj7^E@YEm35ffiS?+K0`oG@+-KhT`Mx4*> z|D&im|9b`3{};OaRU8E8Jfya#{!tE(wrhQ$w$odnNZh>xCzuCbFe|l|;@rC^#S*HV z&qCw&4`=pPePOqq_v4xf`@zX@0NtD}bC=$p`HPib40UX`Y8~u+o`st2%F@%m$YKvF zxY;ftP-V9|zc!`p?8TInH68S~GcA^9ew*f6J9o!%dxm#ujcG~W_^qR$U>pA1+J5q+zum6qe;PQu zQ`h5#A)nKX1v8lklCYJ^QszB3PndF4*J*Bui~yw#8=s1zjSZ=U=z9XD0>Ztt{O_pGl!A4)F<6Cd!%S*yq0k&7JrBcQ>H zU~+OeOhcoVGHEz+xQLFO+ra|whu~zAMMFG;_n!=ojpuOsqBIBIaH7W5QIJYOJI|~) z^;4aH{SSBFJ>71vL{`cnE?2<&*T}7m#M;HShkjQmUgArYVXoAfLpPXr`|^{elima- zOL;c5ncQ9_)lroDdLhdeM8dzI3ach}IX35N_#!9ftkA9<49*JUU;CUC!`kO&3DC|` zk}k+el;YIh88}r>kp;5aI)8&(=cmbxYn<15*Mk1F>f;spad9QP5vF9z84h5EW&~E1 zTewiYiN3l+WyYLd2dnZ$p7XLQOFdHJai?PkLuKIK(YM``P9EwRet&Ds3H);+#_Fi$ zGaAdm$h3;w#+%{0%Y|k7gUR7hAclvNV=%);K37YH6tx!V%v=fPTJuw-<>vHMaaJb> zP*tgkBh68t~#o|`{t7T4%?4ioqIvWnAtu{;ATA6+jA3fPnYsZr5efKy{O8xP{+sgO z{oNS=u2I->PZ1zIbr| zCl79Y=F$OWTQFInc4``m&aXSctpeTk@%}HbWI)`m?gSXSzTy!`ou#(qH!>=)-BD0LZ2MFrKrrJNDHMi%YA>Y+dp#B1Ma&w zWRw^W0(g@c4#f+osbr6h2iYUXZn_k>qwS(N1163wi>yPYsFmrCF){cCh8% z()JfUq1s#7y>{@{zN1L?a~Dje8G-~Zy*G5)r9v&r{qToS@ZHmPR-$-OQQ+-&eNFzp z8wY6@J{R4mruQNk`QGRCI;sKJL5-b&@#GD?{@__o+TI*-F@_a(EVWR<=gp#U;X&&Q@Hfrd%?|{ zMT*d(y^h93$*u0!1rPG-U4i0NS&5uYV&n#Ae%EDl%kBh0PK4lQ@c#S7)py}%Cc1cf z-He3tUwszRoKNXm?No5Ryc+!@k7Er3Y9RZ(v zgTs{X=`>+yD!W^0gZx-VFup6Y>X~P^zp1Xx*P2OP8U_ zdJq|v@zgDm_kb60dwe9)H~ANsUrloO0zmu`z*?4&a3=@R94ZgZ8Bn=|IO&joJ9uDV z)b_JCJFe|`Pal^RYuc~u!B#6He9^y|#?JJqL<0X%Eg2j!>pD5#v(Di-@A?Hh`3ra0 z*#U3C!it6sf|t3)P|>npi&a~Zs;F^o`tb2;HW2@Vg=F^pFDJB#|Fw}%=Gg<20nlRejx>IDR&%`f@q{QlBsr_Ypq{nB*fd2E4pk()N31Mj7Oe1r@C z&HZf`VE^&Zn2#RbX$P+1Hzv-zAn1&4R@GUlM(?fStK3Q>n`O#A3yHSKZ)sXOE9lx> zxt?{+{q)nrg&BD>->KA1Cr#0Ntcweu-~C1UhP38AS9LmX%7eCLCEngUZ5NY;&eLqB zx~t98-TtK4E6mI3d%)BUwr-rKn(w?7zCC(t_p5(>_v?4J-g;}>UGvFvCpR-w%UQX; z`CV@X`8PNNw_UPq)0cz97Kw_Fza5+7lQiO#qoKRL^QHT=Z{`MDuMg&tOKtBH6YstY z-|{MU^D^%3KsWcU!kj7!ZNVMijDBwI6=W?szPsnE--Cbi=k_v-J9{qsC)d^`g1Kem zu@OV(8lADzw_zBhllZ;gK80rIesfiZ7wa~-UApL8K+d&r1Lo{e*N$6LiF35~&zIL` z3TMFCr37a>wHH6^)@>F(>z5%GKI#@?_GiPS`FgSe>)1N73&M*`7dhMI=SpqxmQNbV zR7U6~94Bh#&e6|-_WHusnGc^SQN ztEeW8iMa0^s4ZM_DXX=8hkXI6l(n>0>9lk%@iW`>Lf!o zS9IUY&nQSapN+`?x2E&vv|6W*s`89vNgAA*>Z=bd;3!=q%Eo{ z^xZAjg7!@9ju`3YR7L|(rEg^;rO=tSH|c*HwA0DeUXVs$1jXjK>wTZ5&(=R#te=br zeu`GD!xze`c$rV!-frhp|Fk;K{!TG-&!PCo?dc@_G*edX(OxP>drz`|57VOug@EE| zxAQH*X&1hlPN#qyX4(Y*rhJx{>&cWTsf(MRi=~eS#f&UlV(<@Tv5JEHK!m^Pn(ay8 z#&@sOeVD3N-(B^{$Yd#{VRgH8L1)VJtYuHunNmO6D`=Dt*i>y2&PEey*Ah2x&|WdB zatfwvZF_Dhi_DX+^4hdTm7$&2TP%XSJtJg!0SDS%;BKY_7@6`dT$qa0kW^cFnfCO| z%Upws-QU`l<+V>2x~Fwk7A#U~)Nd>M zALz{g`7Yh!?%V@%eHqO>Z*fGo}9Vs4ZWY=eem$!{m;R~ z%d2cpjlVp0u-~o^U}Wc@QY9H-?{7U()TkTneF*` z?9^9$=?TTHm(}k0wY$v06JA>O?3_O2T2tS~^t{xzTeTehM!YdOZKj^o6lzrK>1k})=$4RJbYXG;?7iz+<4CqB*nhX4B2tjerI2j- zZmOs*5}cXrB7p;BRo4dE$dU{yY|CZYkQB-O&cE~b{GXX`o?zZ$o@774Ji@HC;-Zi& z1DTbTnZ4WY>co~JR@~M-R;(CJI=5D5688MUU;eC55kB>5mHxsf`*-@gQ!duae__?X ze1^{?9=juGeiTLHhsr(nK0CO7lFukvfBPaFUrsuOuVDQvmGXT3ztsBg938!FwU1kG z4t6(>TZJ#N{4WJr|zD>j=(p<2bw+1VK!14D5}u zu&}_6#=$UV;|TjQiu{Qeu<<2=x^%C@Xv7P(-VFn99Qf=ywwddVCvGoOVmG>o4dc6K zmcyDy6yNxCzHV#JpaNzcAcF+slIAFoR>qRjyJ;ZuG^P<5x7>sHB z;ed@t;jjn&alNZ?=v_hkJ6#=kJh`|C;&DvRx|3dy^&*%&H)c1Za14-eY%c4DyB1UdH$PGjc#Qr_PBlaS zPNh_y)Bk6d|Nr&>{BKErK%9X)o{Rz@t>1t%B+7uG2CW1TTPI+y?*n3^z*Y#ABl0y| z$`k#6nSZ_l{r@H!U3Ecai$9eo;3Mq6O1(I@|GxP8d*L5Z`<}}G9jESO?Y~;FHs}AJ z)FBOU3_sUNBLNM^9S0Y;{1+o-&gz1# zv<_c;aUdS|U9gni$wG`p!0k^aoylN4v3f3oTZ1xQ6pLSHRB|*K#1{5u@$OE5u%npW z-;1WfHsl~JHi=PyxLnyPc&LGbociIqB$`BfEor_RjJ-?C4~FoN6$J=B1v{X$xnQSt z+;J?*LpRnL5CsEka1elzM}q=_Kw?V4Kb#C``cl9THjiI#m^RfY zbi%>#K6`t(%V^B;q%Q%7UFtM;EVu?i+s3MF zV}mW}i@KzD!!C#h`{8H=n&>re#$4RmfAePNxP7>}_o`)z8lZ6|6RH>B%cVDM>n++H zFs<$Q(uH-j?YXS~C*c1a9saNkc#Qv-s->*`UoBPV{QvXu|2MSIBmsc5Q3P-j?~FiQ zzYG+&?V~en1V1E>w83T`y1-OZ8Fi z3cA6FOnopRa7F0N&>f*AjGj6L0l7&yQcembnmDemr{zaV()@|S^c!~Mhd+k@Tx&23RQ)ja@l*m||IzXvNATLB=Q z<;(@f=jZ>Ufc)WqQ~*5Y|EX5XQ~uxbT>t-!{Qr!FKN$4!bo#GV>QnTOAt7`6{|ui6wgtj-6m}+KuuHZgupQjN7{2%c?$W|bf8vcX znu6_5Mi?OBUx3xMGY~tSU=HGT5ESi3Xd9xv<_>Thb3maAH$e{!Iee;Zcdo%>=Ek(c zESip~bRVQRO7Z}H52-1%2m9_70sw1p9C{&`o4B1ELL<;cR*7K|?k&VXaS}JcaYau58(F@UefHEF`&-792h)~@dtB< z!@xyT8~ftYzdFB%~q>(G=^6&lGrd>@7zAjAPq>y#PFCB zHR%Bb*nqmi_nTcdjAGCLu7lJTcR28R6F*otj8*nF#)8R`;*jZmjJ101;9>%k2L)dQ z_!_1H19Z9*ng&1Yb~%3FM)@!bG0;U!nwXy$s=mSrz=#EZko01=}L7s%+AhJi6eYXnuH7_>HwdN^?$wCi0V zu!Bjb7kcz|6kelGA|V?2I=-X{#z~5oRJm|~`Z6Kl8jC01B@i^?(B*ARZ6Ja5VD$ly zLJzcN*Y}Y$)=2HfkO)}z9+DFF5ww0J8fbA}tOcl0OnFssIaU?VyMa%uZpl;ji4>AB4oga>o`9SjoC_yXkv7;}3 zfXjImQfYX?!-zQMNum*a8>#P5Q%V1Tzn7 z4_!ipaR<;FQq?nFNI_1DK5BR5sH%l##0D>Xj1KCioNMOcMolw+loF?aJbT1vt|)6uE*> z7;~oWrpm_={prKfyNLSHWWd)9F&AOuka1#=(FcCgJD214n4k@SlMyQfxb&4fFEQp+ zl|~NO)dtjekpmdr$%xk354s`Z5l%2C&k#ebZng4?2KY+0kadYD6k|sxC$}@%5- zghEq{G8|lkhzo(?iw9H+<_n|&@jsUE3_yJYPzn(r3J(GpXzU7+qw^r5LSU=m$eZ-V zjMyZ?WS_@@3$zm(5g;&cnp87B5Jpj=q@a*;BjSWfuadCE^o(et5$8RsU>h&hN&=`J zEd(kKu#g_8B5JKjfO$w}e7*@ap&M}kA{aW6a2^(;%y zFrJGj@(p0hFbZs~>ta#ChHgn-N+yKk3Pvj2(Z$K;5yc!62zd;lQ)Ccf36?)_L5zWn z9dhK919+1R0F{X&nEWHP#mv6@PTO$);Q~n(x1qoP9*Vvp7a9N$^i-849t+;hy9f8D}Tx z;2VMpbhd_D&NzR}u`6qadku{ei2<89!QJ-tLP6v5mM1{i(deQesur9=J=S_34cNC;0!IN-1mqm*?j{K9l_qB<=fL zW56>86pSr!+%Vpv`I3k)zKI#LbFrJrw=u2NbJ9(HKL^G<(Bq$m{&#n_T6;&WPv6EP z^j|7gvgf}lPH`Up{aHR+(eRergUj9uD;1rR1^<*Y`UdD#%1B26j|Y!{#xF)L>h^1l z+-txjK!q5g_e_|o-21?y4k|L7$Iw|PFjmOqi=*!N2JJ!8Mq@H5P;c-fP(qdRkB6XQ zwu}tOJQ6j`6>7u}&|(@G_)fl34hD2gjzW)nD7fK6?kn-S7lIkfTTn(Zdc=%LEY4)D zv3}%(wGV#-8rG1zL&zm4d}!$VK#LBhDImkQKn^?5#{mMm76j{*z2n9)be+5&V=+bK zi32sYpDK$p4OY$on&jHH9~p5(Epm;V>(yMR6>c&x#8C}hN98QQ!zbu4Q)>(=Fm#o7 z0T&=~y~tPbrOPc2VJVW)>XK1{!y$L%q=N>+n5;(7=t=F(3=?$OAwEyz>=gq?w z+c{zfhxD|`wSZtpmthE2<%PkaO*Yv z+|pcocxUVF?&cvoczbxTf7F8Jw*lv(5>4~IdD8T?#>Q63(v zsz2`>wbt0?;m#3G$jih1H){q?C)C&{AW(0w#i8I-v($<}5&Zr3sHFh1?bhZlz&gUp zI7C@^F2w&8(CGQsp@ljC)+)jedRt#gu|Wl6uJ);L09Q>4~vNO zcexMa{QNw=G#13(mWpA5KKEU3|HxQm^ji*3pDi$*$jQk&!n+OS`&WKAV%CtEi_82K z;?9a$;3Z-xk{l{{!l6!#%b5kMFx{V=aeqvUPzU7i%bmY(6ejVg(2H^{;=GKe1Nul*z?$SX)n+4m!djI|i$Z82ITdh z1)Hyug#7SwYx97|R=S{mb3N_jx}HGe9r{m>4}7}CP#)-dwlH574XPgjQKNsBVz7zy z`SEAa@Q1k1J|MrZh<27?)?y3Vz@5@Q-zdfn?WjMbvz!>PDwmhCqIJL>QXMGLN7T6Yu7GQQSXoTCz z8UWklN7!#bvFBFIbOeUEFub zLW4Qfe{hzJ>x2=Y$$59)9YZT>=S|-hC83y%T`yTp=Z9}!{L-d`6XIVyAa_314Nl{{dC4Bc<{0A1*k;Sy z98uR14a0r_WY!josv@+d|*T=^P?JY2i_m0n#ZtQbs?K$Fd$va+{N^GUldBe^Qjh{QMyhwL8;&rfYk-9&eA^m_yOK8>V190v+WQB`NBV4_OPL2c zv1rHz54t?unEuM%P50rWabxT4;cliEk9UKn<_~mYx*I>gY8`)YH~6xA%5KO5Hix_V zq6mg6jv(RDQB27o%Z>gNB;9(syZP$q zJhvO#Y@Ew-l6IHdh^A|8>}CXt(FjaZc5dyL&sXdZ>&Djp-pid=Zx35po{`rLyP%XC z)t65rW8ZB4*gAh`Q3Q&fqtUMn?PMO#FX+XJ{l~i@CZfQ9rDi2P8@wx@Y8s}xv9ot{ zyt%uZvo6!!NL&z~s5=^p&P0&Maf2<(sI+L%BNvTk4LxP8l5S`#^B{_*7Ud7OpWlt# zm3hLV{L${b7iP&OK%w~013dPOv7;|A=r8MyLIOG0*t9g)xa-QY=+N{zTRyjjz{0yd zmuy$;;;rE_dMnu=^>exK@A$U>{{RP`#D(M0q}%NU_;5vxf+8}dkxb2^B4LP*ig;F6 zgyozc9dGaKov$Z85Lb@OW#|j*1-u(Mju75G$8OqXYgj2Y*>|jfLZdK_NHp2JVj3o| zL~Wz)`ZTcLEu)ggtoUeG>IE0!*ben}R#FZ1F(i5@J0GC8&7(|;?;KlnA$(U7U*A94 z2j$vY;OXt+NuOuo2t8qo3S(YH*P@7qQmA|5DTp|h>Nh+uRcrVPRyOL%MsfdCbA@0m zpW#k`-?|j6-Mf|PIB0+E^=3(B{Gh`HU^?Vk8ypJ^(FRToOq*fIF>q|)q=5n9fUP3r zjvF6%>>opC#pbAlib@(-1K6l$vQyNet{VXI4SX0_He09)KUFzPq_KY>8sLctfT)fm z>=1yM4At=B)I^bf256n5ow-tvyW|mquuPkM_jee~Rxg_PFGmr^m>y%|vH|pZEOojN zTF{0Y12V;9-H(DX+M??k;RqFVUCwq}cF7bjubN#onJFEw^bn5$P&`>u#2#P#zVIEc z@b~7Fhm1lzxnVXQ5&Po$Dc{DGQ$U2hm}?0XIOKC_J6iEE6!Yq5vCWfOB9Nm^`1gHZ< zqrQ|IeDfbkmY>vElX)|Bj5hSOf24igki&)N0nlPQCdMp7Zfwl5LxXo1Hw{%}97xiv z%^iBulbG@gr|mL~8NtA2^e;hYjguE{9C$!|XUmehI^qc#j4P7A{1^m7iHriYa{9Pk z3`!1DyFx;yYx0{5^o)?FSa2cIug;0fThBsL;5tX(I-02Mq_B@&?y0v;TKPMz}$zazTZ5Bhip=A83jR1;t>jx;?%hL&I9 z5GZOK?KqG}J#B8r7}%3Is)U>E99hJ`;D-p*h^e6mcIIq`=pSFwX&xN~6%UYMhN)gk zpffyy`dKyU(53FNyzc2s%69`_34DJY^oE8Z_6RU-HF>vF9QZ0cJE4F121V4HC}$21 zF`_dc&^(E?9hIhbNo1+T;}C=R1_R(ZFGE;s@~9*~JR@J7@L%H*@WNnpc5-GLFEE2F z_c2N_s*+3d9%72=#8$_QY)~HiVlcUr`cM{G{1;2=Zu_TYokc7u@Z3O!tb+m}(xiPr z0$Zq(?7uv{-h#@oYpLp5s@}|;J`FBE(q#NA#D9Qc@#owD^AY#I)GG7)Kfc8J6aHI* zbAO)ocPjO%{GYXQZ65#odE$SbQFsTgJ<4p*p1`63o91W&GJABJ3=7glqmsp;<0tK2 zipOAhX8mBi{&j({po6!2@Xt@;S0A*^bv)fZ7>jKOu9HI7#}mFAGWMeh$1a6R$pA39 zfF84vAq~7Hg`aPvkZN^yp3xz1<)qPREGCuJSV#qTBysF6?YEE*C@-dg@YVHyoe)|8 z6m3v+FUynkpM?npv@9547BVX^PM9@drdXft){D2VOm>EGT=f1O1tt0Z^fp!DTr(W78-PN5(Th3;P5=kprtp_A z={aIn5;V3trL=yFq4tdBZ<=kGi+A~N?$;OZv=;A8!;c1m5xgVMZ+;!w@k!EggHC~B zq@$Q1VJs6T0n$E!aX2R1V5VhBI~tbZTb#ZDbUW}aBN48a{)K!hc|xox`I%xP$zvq@ z)=!Q7TT{P`!?s4<5!^22KkWFj^*T6wB&`$>f#a2wi zAhcXwVRwe$^42BTZ%K6B_XR(=F5rx!;?Jz#`IMcp_wS)+6i?}x#=W5j9tm)qbN@C8 zMzw=GIJj{XVMZ_Chkj1U=||cC#Qrc z@CbPDAjzUi05MQ)DKC zTvH>09msYBR&JQqwO)2eWr>r>k_uy?>@WqFuY)W%%~TSGBdV;XaMNLO-RNZyyB_Ds z1~SpRh0ViPZ}E^1$9_-=u?kIsUO%C-BcPP_-sYPYvae(ECZkK<9bM3YH6}Ara?f58 z%#j4h%bUV*&q~$`V@AiYFx`ak?n_+7q(+#iO5i1Ea+b`E01%|UL4HxWeS_hki0?Mn zN%%lgcM^r@K_-A{80c+RaBL%yQiuV`R25;Wq$ZG*5y+FO#Dlag-gk{DOIElt8%}Ee z7kK<^z|Of=*G})VlA4)3QzC@N%(@u+iRuJbGcG}A5Le4xVCsz##ZXgXDm=l6PDf%i zfNJF5lZs?C!X+bxR$lTXm0B5vYJ)hz6eJ)ITv4sfo8vvC?}m{cLrUym2`P1S04Ip7 zsRxL!XHXP>kt9n^!c3rAM+m0=dkWM*JUh^T1pTd9E{x|ByDtWPrKs00sh(Hm8vJxT~hoIH{AV9-%Kl z*Cu%hRG>&Ki4KcLDaoVPlH!*TWSuQ?;A(mJ2u#JDDJ}tz%pd~|2NU7=*9ZSMwtQRI zTVbX_HH3QIhEwBFb`4WM|=M2N9~ z1xgV`96%+^?KK?UD(!+)GElL(mJNtBWtgMD2*%LS-i>=3^H@|e@U;L{?L3f?OjfSe zkeD7*rcSa~vyoSMnnD;Uwx9?A58?wr9*`S=o%Iz^9QB&?ekg;Jw&?ju7drSHC@VRS zYZwW_-{rP?pOAphGK5b(cz8k*KpVN0#h^vVr&u~MN76<{GZ8~WtVHUkl5Vi&W704V zTP=l_BYAZK9d%Op#&u~O8)@k=r~`Q?Xg=^XrY6K0Fv1Io|8zqs?n`>^Bu=qdl#>xa zzfyS37&hM4%M( zKfT=y=o^hV!V*;rR}^~Mj*d5v-yYcp|GQDtLq!&me%PYWzS*Kut}|+u>Kab90Aw!y z%_Qs#<6+N5zgi!4A2j-KHu{)747JH_R>1|aLK~eJt6@tg1qW*4DTYEK*!74_*Xs06O=CX)bcS)G>ao^%qD7QfiIl zYBFmNH+kfKj=Z-cW&WtU*kxUHx|o!nHIWN40pLqv2Wk<8nF%px^O*=#M3dyx{Ir%9 z#3pxQlC3r6Kuq>dK9O5rx$Vgpmg*P0?SR=q8f-L zQ%5vsb{bMQ2a@oECZJNj(D*X!jtMH(SukN*f6H~)rMyru3Slkk>JONVCdzAzdkoY5 zLNFG|Q2Zc=j+)y~>(Y4~?4Rh=QH_5}x6Y^cs!Tg6(*BEQT%C{#?@T|1WEr6R=}jyV z`%u)K_$|0^fm_>#=Ee}<1WOa`{*9g7?wv8y$n{=id>2{I1)(Fh^3j$~qE$^#!<4m> z(I;{meyX}N&$0B+6#u1uey;dG$0=7z)olLPT6KQ^=NHxgq(Yat6{h2{zGvTY!%&aO znzi$pUm_Ecm5npn=2^Q18`Z;&W<(ZE1ql7I@Su+i4ypi@aClvjqc{xWsCUhM2UK|H z0A7j=`{F<%uUX?YYY)||<<`t5`N;&LWmjS<_AMv!Eq~uVKmO^#=qE$-ek#vjsaPr% zD^AJGY9w4;ZW*NCmcRRJi7ha?3}AGvog0Gr23;NVgLi#a2A!f8c7%SEig^&v7!y$r z8_RrqSnX!Y2V#G9bddx{_`y5A*Ff4nydlB&gA9_;JSTVXcD=an+;c59>#9hXa~>$C z`gsCsocy|ac8?kyRW99|$$f;0FN0sc3mx8Yv?n*0=$+-`kpLE{7<)^GsnWbti_6Qr-EW+g741DK2+EENjht~M+s>)&deJ0|NVX@c3y}AQ zp=RCT-V)1NeED{7OYH7x6R&i9RDe_wO*vE#*{OND=$xA0ntCJ$w0w{F#|-TPa^n(s>eDZwqhZt+dO#wr$xmZek zLt_;y?U7FnpOW`fLwsy$L%b78IQhsp=w*FK00K*!nulIYI}+awp7@}4pszF*&mD$i zy8TEJsBpYJk4?Th2#2|#zHeIpfi+?mdDTPZF=Wb&3n%}88c?xlHErvx&@Nnj%i==2 zy^3FX<53TIh62TPU{tCF0x008!O8Qu|2&4jebJ1$STYTcj)}LGKcgi#qPVSvawbj4 zweH28w&0>Hv9>kL(+gN}ID(PA1C)-XmzP|j5?XxIMh=?~Ng(R7EMyHw5njiz2P?J0 zrl0@BdG(5^?S+n5AsBmwD7IvubSe?jH&aA!oKu!EoOZSijg~o@Mda?s1K9-U&I<

jr)_a@TljwR_bID(VNF&>gg;j7jYjDf&qf?OhbFTZ_vR+A*-=(aL?Y za$(%=yPn#|F_U5|#G1F=(M>3M;3ybRMgubQPT1lCIUS0L>tZ>I-^qThm?RAIa558Ykx z1DK0}5alM)yyj{F8*YaL39I<;R>Hk2m<)^KV_ zDQv>Gg4sKX2*KvtbcYkt=ZyynBD5>ZnzJ@$^_{l_L|VGSQur}otX4q9A;MzQYYHi2 z*2Ng2bmxO!{qaH~}~yl2QYMH;H3KCuj1maDoO_vHId@TeJ@~aJ0Z~yfIDo z<&8Z6;4?<6q6m*BgZ-m4j0<2<(V)xr4i5M6()<0xqxSyZ?%rddR?}eam;}_Gg7p4< zO0nXR#+JwaA%f3<1Pb`I03$%^`xa0`->@^ahVJ0cLh;_rL`Ej86W*^|sB2QJaw@BV z6m#jPZBFAR7}FgJgmrkdu~z>g96wx_Hu*|Z_2TQn!}Xv*UcFSQ6spKKC|T2VpucGk zP!w+niJyKiD5z{or!?9iio`H8Lz^lulMxbJ)xRk(5HC zqz7CCOJe&eLj~F)mOtGRFn$LZzGealOECYV(t>&Vo&Yt;>hc@IiD)2$4V`8)s zr3zy~67MtKv&B`lm+&|!H8rGUQ-Ea~Gu)&`6ivqPLQ{%)ZXEX4T%pcO6HDgBK=Ub8 zYs~7bm>E4xQ}U?NbH>e?L}3=WcV;vty2s0qN-C0?S=T5%(qRu0R4y+k*O@FK|7JDP zWMpV1QyG)_7cm}KqO3q^PW{MW!9HV|(W=}+PnlX#@+s4r%ve1E$D_Az+DC5>4)za^fdOX0+-v$8g{?iyg8D{WrI`us5h^TEMz#tv)@7Ok@*KWL zvp>_WnKD?pCGxiwVT!5w$?FeSKX~>l_2R*)dPK{Wx9}=p8?yH(lG@AvIl4d0u}jGAsg&3fsPusKBk zFpCtW_GXl|5ffYM76yr2zz-^H&XBrER4p$i9`eB?)`4*I3k<-ht#uVJdrFzTPtVuj z8}{LpCty4kdB;!B^%Qj~*`EyRP}3&XzKyC}n^zSxAO>k!{^-^kO$P975LsxqQ=k&V z!*Vh$`aSn01A5`|B~YPXX`o7NLbNC$2K28mHjbI_%>FxlOuqVfeouCRPPbW@hxi8g zRlqxt>5nBf6jA;na%}@zkBa#XGxQXjY|Ye`rRg zYm3gqgjnbzijVSurMrM@E`Z=y0%FBOVDKZTs&ceH)Q>3;gX?rvYhUY?>;ktig$v|S z(=Po6Mw@mu@RWD>d`jKX6dKHCg`CX~M;dF^fXaYw?NQ-$A*14H`jB35VRb?61L?ig z%RGO+uqr*Oi8C-a31HSAfW?I}n$C@|`F8hM)FYv(j|Ydd%8$y}=}eld>@2&Tn#^H_ z*Cw61FDz!If(+a5Jv1II8RC?mLvQurnh8VW0c3nx0fV^j$9(sDcN$eRhs5GnD^ zCu73%&hMoRDv&E)ZaH;+4~Hf8AfLW*M|id8x+tp>c7BU7xiQh4mfz&`oQeSp7QHZ) z;1#p}&>-cr=P<~78~V=YFPW~zJNdovd*N5P-($!PhF}s0ZF%xZ(y2B{iJqQlZ|0QO zK-ANFxQtmR#mN+X##0+o+gego>Szkey=~h`Tp=GU2EFT&$fZQZk&?Ggq{cJqdq7r&sgF-&jUBywlgn1l>L6$^vQ*=pKh zOViiQJLp8upQ1XoWTRSs9!0}>Dp5WWdzBTzZsjrFF9C@5vgvt*~;hzy+ zcOcpTSZ1oZ%uq70RnTIx+PSk@$Q`WOMALN8QMi{abi`s(XmK?$c~YSOoO7owacy-4XI5z#gsw_A*0j-u(dLH}vKET;tqLbT zrhSl|QD%UdnjGBqlbd}x1`jFz_m~urKj-n5T4XiN`D)<1HXQo{Rum4ERmI zcqaLVvWjJFOYsm4&TO6n ziI)`2Ck;}^fgCvM^#e5@>PMzfZWs8KlrzRb@A7=WvJ6G{A@*c7O7!epM*RT8pW5Ph zO2E(7gRL|Qf=&z+c69-dgjarpq-nfqUGD`mLS-SHxXhUVpQbXil*c5>KRIFe^ zep_2Y!15S>X5q2^qEpOmWNX92{R176-jGCzbxXTp@m@uSZRo?&P2OoaimQx!g$ z16*5d+@DK7XESTuXN*)$4JTgB8I+l7GlN^$oO;Ca%H2=7Drd0Syc7kGZ+d+oW6CEe z{YJ)!E|M{7WympP`wXbn>OZ9X^X4*+804TRwq1U zf4RK1@Eun##dG1BmM`v8sP=HHDxP40y?`R1b@*&6>VwJ~cETPCc}gT9YN_00)^CA`-fq8GL|w*alr@g^x@)>he#~qNIypXV1ipgOi~>>O2NIP~pA7 zD0dRDqwTTR8($@4BF?~Wm=rX?*S^_ap0#$F#|2s|@ePuL$xu5jVPn;|Ig*<#LX zWvQq}7iEe`%VXM+Q5o93zr(i)2w zm8jak!b3%vl0#?71pq|34hmST;MfiNBG$()BqUdj89eYf!kOQGq}F826x>GY%=^R-FMtv;Q{}=@XZrO+ zWY^btHWGe69E8{lBSi-}EqX&{bq_fYF5oq@g;jMeUruo(o^H&jxeP0kX;;z(r$$2M z;OV0yaxZ$pb*_l;qTwxPBc7J zJgeyeQMW7_KmPL=1Q=;90GyXFD=w8YfCI$ric7paDi)(Lzu^JD$@8J{7`@UW2M9k# zwuIeULchuqG_aJT9E_u(`}^#f&7athoG)ri&QyB6=~deud6ywZXaa4?h`AYOALVK0 z714z#epjoQ;{J+oFnI@WPV__2eSQe~U8B~9g1|aaYv6TzSRNl@lDOnaxn$~*;{44Z zVuSGFa@@P+)1}>~n|1akk=awT{;Ni!xwAfd&c$5*s$-pZ*^hko%{%#9Y8X_g-E%?z zyrk3CJn0N5%^=rqV%jQ<4bEzK+4wT(fbAITXAaX))r^O|X2ALE=)OJ>7zL3sisIlnojxrbawKAems5X-XVTx?NDu63n2}-)%02=<+4K zjAkh>{%s~(%x8+(nMBP|fG!My?2;el({%qt17`k+ zlGlU;+$PWiLD4uHjDx{AF1(KVLADQEqeE1I8lsWymeKn7LC77u|kZ~lvl^Q{fBcdU$_S@n?E})qt+MaSG z5P;mn+bL%N+C3Z2)FnTUl+81q(mn=hwCO=hL0_1{{OvvWkVr;BW#C7qOzJi1AfiFO zizPH&z#lNLCh-zGmp}{WuxKzX=kz^AoV+JGUGC~nH4;oKKB9!C?J(IJ>@x2>-aCR- zv{Y9~T(2lCAIpRP3(u0;iNThn;<#o@|5$jolu>Lzd7B2Ql+er@l@Cqftr(4wcwm65 zcJzTJF)WD@{J=7&SB)%6EuG(AQ%Br|4>(l;S~XLWKkixR97bOm%)ozs&q{W2iJw3k z`H?5Sg?XUmZHVGxlJ>74*;8E?FEU44Y=2v`Ct`=Oa zC8{J|F0t>v`_5d{;hM=Ae)z^0IATjDm}%_n^qVF9wU*XJxY^Q;3NPKPo}g3bSO4nM zcZRY+*`}T$C*D}jbS^Jll%Qkuz-sf1Nnv=V9+5LERe-1O!Cc&#Gzs}&oCm<5{FN(j zW&q;NDoLoeo{*}=j|+)xNJO#g?B8*fzu#b>vI&6q3aQqBMUU~ij1e!UQq8;Zx`czL z-*T3NztjVk7x?u_$cj2*nN+i4c>I5R^DX0(RaDTP6#pg~-PXC zH|?@DbV^my=U}P@z4Z9?Zx0RLX2+2@Ai^O|HH7!z5dL1e;#LW{d|9}u)l5|73}$Ag zEf=kh_Zi-Dcl^4=4i5KU?6%&RdJ0&I!KBh`dii23Nxu2lFDF8f2i2anW<&7U7Ae{+?NXP;~=+R^0f8rj^!8;SHWNq zj4ww)IR3p5#qSUWEVV~hkY^jTnMlrc=PpLv97j~-0NrnyQ;|)TB%3e`PjR*sS!H&E zWOl(Eqbv!b;W9_}DCGs+i1KeXxAu?z-rjB> zBw5VwyK=A8{omO%#kwA$4`gcSbd5d!6YGy-p2C_>2)%_FLGvjI?adO=}9~Hso z!y*{zaizvhS%nKogSw4HlYyCR)U2E(n4tzN{^VSGuM!QdKaW$Bt0e)-SBf0-VFhRk zbyJoB&&oxWEGsv?tfo>Yttega!Iq%BIF6~Q@}$6%OwN@8)0D;`&{S#~VlVL{izJ@# zKvT4xM@f=zo11z2v2<8`)v|~+OzobFohH3Obq6bBWxK?ZEZ^y9bM7q8Y#md?fW<={ zs6l{W@!cm2!{h_YryVS(Oefsc!EcqllDB$Nt(|ENYm>s;)AVP2njOH3nNHWvvzjK= z^Rl%+HaHrMYF!65OVrBSeMA(dXn@bl59tnTweHe_?LkdHEz+e^Mu@MYcx2HkR9Nt4}*CQGgA;N2dqk?aQdx$9Sy_A;KyuYKfU}0$Zk6?*0I0#6J^=K1+uC?m-@>ke_Ry z9UY15t7_@K(`dhY*2lRkG|O2ule%mwB<_fdafjGbt;pF~pGk-bJ9Rye`0JGSmT{N* z(&I=h^;4RpN9n6a;mj5JZowTiY+3S6#)mCrLvMtF3d~Jf(>yFQ$wwX$Ajp6A@b}%; zW)$*u#7Wd!-AFIR$Y$6PoQmoYIt*VYvg>yDWh=i4Q9Wd1wOWc=Rh8!KN7u*^;nTLH z;9R^^qDi)odp<1nd1P=xkjmBbjPn(jXf^`|A#kZ%CM7M3{6X$0MyCGoc{*_rZIH@ zGMZ9-8-Y$vI z!@*!9v7xtFPv#@ijht#rZ$H5d{Z%V%Mu3o-?TLdjaSK&uTI{>wj~U|8#QRIV#$jC( zXB+ih4~KDhqHbt>tZc*#BCR(*eNCReW66f-x*B6zUGaQL*^DdpmUxZ+Tyu9aq2fo! zl-qR=C39)1;d2Uly-md;=En}}2MrI|@U3F1_wqPWVtek3J#d(+`5^X&ne{w>FYYST9x`JVtNk?1ab4&oqXx=Vm zWoy@o+w|63JiNDxMR`%aTC-Fi-{Q8^P%b8f2q18#O&FKEAK1o5Gb}5QH_uWH5Q>FT zGfVXLP^s(6KdlsqG=AxkyAc?NSL&4b&VsNB`!(CxoBIJIR9CzTUQ3w}wz5nuN+d0Q zN;(p+yC>ai3zCJedaL$`Vo{FLnKz5MCbGO*V>8r^Og_ebwfiQ#To>K7L^d;$sNjJk ze4nNJZ_{V9nkl_j&RH5coC*^+0}{f_t%SF?f8OPAdv|ZRo}}7(yMcOfSmeXB_NSM$ zZ1S~BlrQER=eq(>gB+d6>l7&VLE8+3w)nH4`rI1Z5kHez1dRaU3?~QOv zH{uaJg9^{OPkntvR~r${9iQ00&sq(;YpvyTYks;S#*?U1{a)ppoWxRdd8D)0I8Ms< zg!i0S3y>#mVEO)Gs$%LlKSxtakJ5QVY#z-}gO?|l)CFrDFO5e9yprHG_(od$l3xUg4 zBn4&W_MPGlVAf~0%d%F(JHt=2vemo)k!ZoMC#x>;k>EqsVFJyczQ}`*3&&2zzny8; z>~!tc2`sa4xlnf_!tD~jj133;dK_*^-FvH1({CK4NDG_CocAmFcLk%*AL%}Tyzrd3 zsg>=X=y1%ob=%7{nJ0_F)23W@d~g)8NT;Hn8CG`@pa(skrNtP@Z3R51*Lj{T=lsMZNn!$CI|Y$T)fi4#ec$ zv}>{%#3oMLWG}<`3ZE0-T1i$)3%N7Ht@fyqBgb)CccsA(<^8#-7M*k(iFr? z?`8(~ALi!fY)MVkFP%kNGr}v5xn_<0+dpsOxmY$V)8^IFcIMPxrH@kaHZFX=L~y?L z3i|ka73S-M+6d{TJeBS^0Lv96IG?DhZx@PTXmd-22vA_ni)hnHqV|92sS2 zI>5^#*uhmxP!W@OMwPZ=eWJ2%R^M%a9$*R$6b|0`te4e)C>7f>O;fiSM*T$ASZ=)$ zuaJPeZADoguOom2FX(w{hKt)h8tn&9-@Kt(reO%{>wx_=e9n8MR+tIRXzs3atX;}*7I^p%H`gwIS9 zZfnq6G~F($GTv0ANtBReR3JW6fLm~(Y`z`sHMy^b1^I85Cu<#&MYu0lf&JIf2hp4{ z0vm8i!jB|u%1kFPhr5&HQ{68!8>cc8f$mjPdSB zNKQt9M!O;Erxf>JRM?vU-_}5n+Jh*C_qz@bMcjnfKGzeROKr+mln~41%W=g}y3eEw z3(okffB&vzHvJN-t4yogSjrwVa|(g>yVxPkP0L2$J7(TFI7i-GU;jGbq$1zxyH{a` zZk(O6jPUwD0Z*Ecc}Ej3N9yuv4hHGWTWRp+OudHw{<0>$UDD8``L{KYE@y`0Mwi!V zHIFIoVi?`8gVe38w?W4uDyMYM@31^RL|RAtOsA3Skm52UtU)nbuw59pYS*Mjg%DrEC$-`m#xn6^HO_Bem}`4j(<4!;oRO zQH$2pd=RI;B=Z%aZ2m7l68}2qJ}q5*rYUtZi9p4^Zzm;%Qr~tU@K?gTtj;#oGaZIh z+@5iPBOI&3(URxyB=dstJ`&?a#ICI*suE>3efsiI#Y2hMGD%!E*1#?9mhmG&okw-i zsXX5jExXTJwxUw_JLsBqnm21ig>h`fZ;saXXVvxwKbFM}kLH%SK_oLHK(>k*5qamQ zrTx1xEO(d;?-$BYIw)KJqV2GJ3ZtDuqRsY_@zdn(o4CKM zLbx{`{^UN_IfXqF8m+khK$k$~a;hvx!2E|1w%o;4%#%5;HJ{dV>E9d?YFY8w;^*rb z-sh&c@{1MvJ>STX#pkE2wHz5pmB8qDRH$K@$?9*e)O^8;_`;Zv9!sn^lh=ow0 zz!zNR;iijz30=JT^!b$71-Fntq||dGgmHs^16@8z7ydZDHQniy@OAOSYr-4$t7vN* zuUxjdZ(f4T~moiEXDu>4xFwA^lghbv29t;_BDm|R?uB1=_R zF`DXz+S9$8zr)8qrcjQ*ly2~tF*SCgU()^BLZiK5))j{L_u}a*)~F<{K+UIYIhY+vuza@^L*&8&+?{`R&2N%OGN)+N=^c_4YBC*-3@?nU1)JbMd7NZcoYW(D3 z?Rf9U;8(6`^d!9N+nOCI?)qhjrE{&d;3ia&t=Rytz-boaXP4a6dCEV$Dc@TerUh1v zE)Q8e%3kt)rSLWw2K$AATVMw*hVs^F>aY|!Zp(8NXe7pEBFXY=d-$GMu#kawpt=57 zQhQe5-of6v)V~i-7kHngAJn19zMcnE)6j89pFhj~8(#N}N!`tIF!nj@v-dG2Z>am{ zphpJa*(Uv=^Nf!d9ryG1t+b*al>gY3+>p4-d{^cjKJ^4)5d+C=PZ24B$$U)23rG|` zl?&>ATC!@zl-TT#X20P9_bhPI4(6d4BqC!|b>jx7PTTdf5q*{ZTKdCkOvl0pzUNB6 zq+YG%3*4HKXbdj=6)7&q96ihyhB8NstnwdE(cFap!N~Sn&bwgzLmNv<5fr0+<5PO; z(i4Y|)M$L^A|D>O${_6dXA&J$g*M#a%Br{m(iWa%lnjS)tt~9p%`fdzPIO$$PhKi zO6VrE4^tjwuhkvJN;n3RZVa2(A5KRkcYgZ%NUbQsLcrkln{o#n+5T^0A35m7 zE&+~)IgdW3bnD?Thk0%38)HQbAD@Nd{C>y!VP0RgN}S4EzpA!V$I;k=~z0^1_P=1l&4p(JVd99F&a6$9%+ zo_@%eUqu>gOsc1VX@y4v2(Y;f{5|0DWg20$D)0Lh|N59;yD#oBnnz^>RGGn*UbaMk zXYm6e-zTg+AWpOcZq2&`| zt|>_Lu6`aqik!I>e5fprk}hCxTNSu{+lV0ntwYaIm5?uMZTfKpA(f|QyqQ}D!-}7j};x`v$C8jiZ^qzEddrNyo(rsAWt+_ngvMt1({vBF>xk+^Y-B?s$esg~6!P0{xeTG+@cpQ6g z1>yHOq-^o^1st1P6kFa1%>JGC_bkpGjl5}ZN_jk>9`MnYM2&drf!3+XwBcN*ws!sV zu)1b1DU;lgx9W2p?|gjBDu2I6GF`h#PMR}M+L$URj!XC4aj*4lQXt$`p}$#MmTAiK zdH8Fueb;ln!rOc6tr5#wmjttGEux8gy#9o)t-i1S*b%&o&dN`Ora2VBd5+{YP-3dg zthqfA?-Oy5k8meuB)Fa+uc+q3y4FOkjc*F#>i^;!HX}Q@rUCMqpPtp5Lk=~?iykwJt zT%~71N@SX$9%b82+ZCo=&7o<~XOgYbTefnFk~O`tH#^dZLxlO?6$%L~)vP@mF1XKh z=zdrw>_|M^f40D#lzHS4yZN9#&aqRMCXXhu_3PiVlQB*yHb2Sj5m$Z1ka-A`VK@1o zhcd6Dq9u9?D4OwEAS&WD5`&uef9HPp9#>FXp|5+(^g|)@3rkadaAFjBuC6aG%>a9Z z`UrAqN8$ed8~HmHOQQq=s%o6bWvzp;#IPZE|D60aojXNSwO4=0`vU79QDWW&wby-m?M7>8B0mSsd?Ld`FKCUD`_L!RBk%TSPXWXd#MiO|Io? zQ&f*P*&}Q>e(o)on9}nfk)Y@q8yueO?h>!v(YwwNb=vmV$g$iuMEKePoBd?eXT zMI`KV%dGmF@2mSuFS`y-o~Vo==d1ZJK~0Lzp;C zbBZ#%UhUFkadzHYwM(Ij-b6}f1Bjoc*D-8Onf=7w*!HY_NLHrZlTrs&knGg;`xE#b zAy)@rW-^8%|3E~`)DxT$Ebloq9hQD~@tF1Ed0*#p-0XX>oRxVYtvN4Z5$)G}+EpSKz2pBY`lr1jHc<%5sp;1VhEjQkci zd_1%fLGLxZY$yKZ8~trNI{jVR)l4(ROLBScF7NomPM3WahA$f54L&pX*DOP~niIpD zTUu)DBE=YS67sn6`#+SJbG+SglPo5hEHthZQ9pOnIqP%l7%L&R%v&Y0pq|XM&)XG? z=~4Mn<&(kMVKH6ez2IN5D*br8c0BY6zC=IW$q!0hMqJAo47Lf2z+DBfkk)egf#A5V6ILqg1&&24%Bb%kv7z=^y+XQrTMf%jn9R);VpQ9NBhf^+s*xd3+S?Z zsD!0&6h_T35jRi1H--0jo6(Zj$7cL7EHW?=oY3`ml+#zCutDU%D9M^(FT#`rT@1#w zXB8@lr|9E9D0nZEoE^s1nJJN0I8N0{d%q(TK@2w~YjxC+;*O-s-EzO9KRA9rrj&c4 zbRaD>Cs$-5!$s0wV9qScdJZQM}VvvK8c=iSSUYdyqAK~T+ zR2}1Dx{rBvU1j7sb^;?9-oSts^koRTh~473X=o*tzv3{{>aQ>FMH1!hsy(bZHk3lE zYSmX1X$5^Gn-WzXPVW->C)oacT3-2>_r+y}X<;61A#{S1L+`z9h5WBVf}z+y{leGv zxiYuN6c;z=zWkBNcK$W1`mgQ;Mg z!9)vr$Tdy*VbKwE7kgqRCm3ytf?4+MfuyhL!cAZU1)NaeUT79nfl`gc(&}5{z#Ffd zADgm8%i)Z9T8P%`v3UN;gOTC!*L!2Spx7#$Q`KMfxBaI_^Dkl}PIi}KktjEjzC)HcF zXz#K0`e;7 z@w}^|jTv%|QNzzcGQR>?mqbJD&L9Y1WEBUJIE=qd@!^)iPH>Us&eXjHt%VBlw$Sln z$BI%>3A~-vgvZN`V=bZ}IYS>B1m{jlBZL_*h z+hJWW%RAK{SE}!o-rzBwf$jfX1e~||p+acm+D+(ALAr1esEWaq6(q0$=V!VweJU;{ zmI+`s?UHh@!K}lQ)LFF3tin6o`Nx}>WVgxFHmwSRy&OHh*1;UpD#B#5aole1p%UOZ z4&A3gKw0v^$pk_^Z5u1H>>1>mW44O3mH%zW-QS+nnBa#vqRgV`&*l{^Y}20YdM#$o zNednoCO*=cDji0APa;}Zz4{hZbS}`yuLrO@=sbiGDsfw08)Rn#WcpTi_0nn@j-lb# zoYB|!+$#3k6zkSR+T2=3y%*Ar`NDK@q(XN?yDq;vH*JWwHmDRV8FoB`b!C z&Bhv9HRe^u;m*_e2uNjkH~e*`b&=_*3&rpukz&yc&vvsWBix>sS|B?Uqp{Ba4Gg0J zgdUB5JCFyhWT*@ptXn7_z_z?PJf^FNEqco)q%&j8ORvuT>$a1f6-mWO?gm$EBaWK4 zke0-;;ck;91G2b~FwDJ%VQr8+ixrR$={_Nsj=2}jKH|RQpNfs9B?-eER2N|nY}=?^ zui*v0d5%Ge!QFyf^YhGjb1#ja*4-poDjyu@xPR*-Ku=@WIF02Y$)iy8>Nc!$3x58! zlF7zE@C;{ihsx*|RS?L4bRSp;UokFm2@W`MkMN3DQ!^;kvkf>?oVA*8 zpBhvp-5u2HI0#*VaEB`{O>kEpinXmv(aq4WG)o2V*uhMxdvs<52HT02)T2 zr`W}nY{BMAL_?dUDVny3C-o-ZgsBwVZnm6$)0gZ~qR*SWq63X4K5@4YM&H)uci+?_aS+;CnpXaRQP+?V!?1_YX?YhlWS=l4} zi)JdsUEB(2t_I!eCMZzOHCxC@l_GuK>v-w^paP-*s)kmfonlDfi-wJktU&u3;>U|6 z*4;|s96^qHh`uX5HOh%mjXcr-UX$thSL?dJ#jTUM(r^G!XAsVy=qp$Y8hDS&TYc{xlQ%Ft zgHQzKBx(t7`DT`mziFGaFVZbd-i=dP62-4to+@3Sl;IL}4z4ph`Q}?>M5fLL+rFK# zfW;L{WEC__Ol}8tD1$lV&IJi%=x4dXA%z-PJK-_O<9K*0 zy#&RjD+G!S2Dtb+Mjqc*bQFzjjyac62lg;Um7zl4^`JVTC(abtx_vLdn8G?$ zpJIo8sgI2BBu-ooDNl~&sdJ8BxY6G)`hfl$;I9GlmjLQ|2Eq6eecS`n9bIK2(#&qV zqUu_C%Pqo zJaD^d&wSC2V{m*k`i1cL4Rc(+B@l*$F7ATtyC5(N8eENmv^MH)D)aQ8goSB2H)$d7%h!Y5^S2wL#t$;lhhurNS&0(}b-wBtc=7BI(X-`h8t zHLnb+oaLIlF`DZ9NQA7kXxx3`wqpkGhRi%pi8CErvelmrfIz?z&2!9}`2AEOduet`P4`xwi0`qLlx;zE>H*VN?EL)#fJj5?ueh z;tz2^3@f>RQScnnvfvC4G_-#G%>c(d<(9zsdUk6%og-=I%$)*qFHR<6Mhg6k8(nm$ zaYED~8feEsrG|kkp#YP#xBHfsa>nRU>}8PkIr)Y65XssZ(9jM@2oq8(B7Tzbu~Tv3 z0^nizw?W%9kQ2o8Z=+x*Ie@>3{J0;7ONmR`F(1Z4OLtT9?$B2H)|#~Mj3AB3cgVw8 zHHUAG@M~av1nt3qN&qIVHcwIT3!t&}M9DP#t3te=Jbt0*(qi9lsIjLBHxciel%NU~ z^?r1w0uf0D*xZCTp285Rrx*}UniIqqpM?o@YW2Eh-Z0wQ^=Y0eI{4JD+O7^$fAe?X zRzx9f^ZThmK!}2jf`CI1G4bNsb1Frw z+_@={Q7Dst`)?N=p*WyFf`0#}lIyiAc^If_LPOJO!d#wJC+OweeAaq7O0P;CYjf*; z{+;sKceFVXCQp?idE}q|q9EVF0q8*RZ|*|-e;^@vIl%(S_tCUJp4gNZd^q1CC08Pg zY*W)9HKFV0`J3u(U;9H7JE#lLT|)x^&|d{83_KhO|E_ED&1$s3Ca%zFUNSbpAHwHq zblF4x@O!GEzq;blS`O-#NZ$t5=Ig5`!`%UxVfLRO0UB_g7KHfnm4F=*M1a}7I;E2T zb~@~LoM_4!YC%piHSAZ3HspF>5Cxd(; zXW09-!2ZrhlqR)6NnL`T%X88Ox!Z%vcoS2$^P_+b1sMZ2*C6{2C>n>JrJ!wG?f$}7 z91mn0xOQKSiarlyJ0OHVCn{lz&u4X~+bP#{fOs3O-OT`GS5PMCH6JFPEP6y9w8-;AgM)FBFJe}Z-!`E?(ZN7+;i|zl z9=lihs{P;PF~@D^lV$G_t4+NL!0?m5XBj5gdj~EfbC8lXahmFI=d?XWpQb&#nnSIMV%G^D1p0{HL=-%QZQOdZicM=b z^Q>54c-ya*Q24AX!YIM*spmi%c@pf0OK7Wg{fu|=F&?7GuSbg=SFWL?;7QZ%MJv8Sv%9a;-5Z(O#^YDy$<`j z1{!%Jdn)MC!%cHPvRePTP-s;v)|?0wvQM>f@)-I#)N=8Ar0cO*8viKf6f5gF_$TY; zf3kiv*Jfv#lJKX#$6^G1{FLd(sms_y$u|a-->mBjA3RS6JFbQu#)gVYjsO~t>u~Ky;b5ihD=e&A87^vH$-O5MRU3mJc@CH9UdIZR%=S$I zwC^({oNoklfVOk+4%2jsgu3WKT8fHO3SyZ2<=?)=F>6Yxgn8zZl5|IUPpT{{%T6|G z@`({oUy;{!UD)h`svUVq4F>WS1Ev7`u6#BGY!dGR+`PIK1K#fBS-~voZ;d^<5jHw^ z-{ol{UW^#Mcgmc#y?A@Z&EWD14NsuY2P}S=)9Y!_gmFhhTQRBQ46G=l2Q(=+iZ(CDaKAQ+k2d&sc3C)c@*u+Xqr^}r`o*P=c^nUqZaEk0!sS?~imRWNF5iVC#iW#tWV}VYEyQpfEndf(YGYaRZdI^Mpm7?jM^&)BdI|N*#^mjx zvate;L#5_G1oH(nT4v$lro8w7Z1^^IM_up*iE8G_XPb$XbJX6T(EF0+ zbEtf9D#iw}bq+gm!+;B{8_1i2QzKay+>?>H8#wLX|BEA4aH`eP1>mQk@qZ=w7f9x4?MX%kyd=?F zhWhOW>2>clQ}L>AHjR^B6#IpqJLP8AHHy?`U#_;%@J7sGZ&4W_oFhbHk?{X6qM$uL3*>HSI?fp7^?OS%_6fquW!Tl;ml5X z1AazSNpl!vDhn#gc-Kzj>TntMVj1isSg;Uz4P9>smpQ;VGa@5W)MfH9&p1jwCZw?; zrp()Gx9rk{to&|$@uUkfc$dS%at_QTq^<&4B|z`jgn?E8H#D>s10M$wi~9ht;pO6o z`%fA2)$WJJp1-8^k+U?*6m-So&=Af{CN3pOkV>$(>NWe>h<|-7bOw{D!?*+JE_jCK zzuX3{lvWNOtd^g+pA9f@By2*<@A0TKCBcTu_;uJbg7~*0L}g6nNfXzjIs>uB1$;72 zrj{kH{~#?7tS1O#F5aB8jCJ^zgXiA6z*A=NW+4lPu__pKd_BQ%m5xCwq+&3aFev); zgM0pVFAD}ayP5&%1T3vAy=$?pQ%jZ`?@Duo>1h1OA2S(@dfSd!hV_=Yv$S9MF;qYi2mDmzQ}-H~1G^DBFpPKLzC3E1 z{hl{!b2spWN}lQTvHm)ISO;+j1w~=B3AYw7+HII?f8g%&y-uon{S|)MNp)zl`MqEF zlT-V5Ty>Dp+_><5-EQXHG*@**jVD!QneytHohXuPFp$0K6*x>qCa|)Yf@fIXv2YC? zKDmN+B3H|*Fh?u^kqwR}!Sy6SLLfZ=%WA8@$)r5?hJa3r?jkGdTb*@}?^AVX)(fx6 zJ>13w0~cqY&83Hd1Zrtnq<-Q+1Zvm(F(Ih&%_^eWQL3A@x!@1MZJf(XZ^7d57); zA~iM7`twEC{)z;10G?M^<^XAc&4H=kz@KST^so|q2d47_#cDyp(;V0L0o$2=F?f(F zh+*obY692pdjsW&`T`|h7d4ah3T(21mx11s0c@PlT*J%(j2x}qIkW?1Mj8PJ_slZt z@g4lpbh^3?o6jz@A-X5`NQ#mVBiRVt1A>h5#mpPj-ciNk52PQL{#0UQY;wx9*$ zNQk@BuIytCLzx?fFDZ5qif?TjBMWudHA8Rs?`@f73bk)$E3^x4?R5P4pYhOze~A+t zr6TC*@!kIr&p3am-MRN$(9Mo7q=U1?LLvH0X+_zaez8@rd4Gv@n-spAlKPjdfhgMD zBNT(BZxsOY9@8|=Dfb^>vNJy!k&Y9_Y^BMuTAujzqw5W%ytpoTqWSA z3yCSejts!Qc1(`{CpF9%eBt{I{zrqD3yJ-Dw77DSoX3Fg<&xt&4N_`ClWrq3x(~2p(*{5XjwGMkt9z& z7}M}XU8a6Ct(^SMMrlVCIhB_|zW{DgBIp0gzxnq6Yrs>w0tDVOb2Ssuri|yDaH+V> zlSGt*`*ul6lcZoJ#*Fx5;=t|xo9*J0%K>PI|7KtP=Ly)!dC=}fr%-Iht1cDoP$?6@ zEhZlyMQ{+EMsUjq?l9mRFg!^fV|<$J(s!poJ8jnK5R0jR4o%g}rnU+%vXVUIKwy~89;!bWZwX1_9_2(_-k5~qKbqxTI) z^VgpLGu=1f(Ygy|_TL3Mg}6y50{s`Oie%tE z#88<7sOEpH4b9T{PxA?z=RmCSZHNYK9C_v&b!oE)HiWp$1!Veb&vtBigJxL*Uj!y&M^D~}CH z3AFZ<);|VTMnGLZMV&Kwc0>`zDz7Db;uwj;TK8%`CBMIzfHl*zub!0 zxRz0j7L@sca-Z@!%f5+a1?So9ju_Yai@CWA(!7Rk^Q+sKj?q~Nn%5HAgxTM(LVH|c zK@p~Sl!<`1qhT&rfagWw@Sv&lDo1;_W{S5e%SkM77ovB>D*T)9vUQEp?OnGquTRnkK0e&TrSXFl$ONu5z zEQf8)#Dq#*?#TQbqi3U3)r+a33V&eFhsk0kl>>Za78M0;U)`%d2OUUl7FlpDi`4$V zFn4x+3S-%om;DVQZ`++noLrON%xG{_qf5nJVPQFXCQ7H$K)oFD`uL6$-VL#6`~Ni+ z%{ViN3yDh=`SHO9;yg%mh`V2Y^#k#%FSvC}kxwJuV5+mS3MpBqcI_?H3B;z8t_alA{ zGXo||o+_eJ^C;X3-ST>h0oAyX&;Q{q_Tz%p9eIO5Z4CSX1jJ!rJWj5g1q}=NboFEP zB1RoUL`=Oe3Sw^&o^zB`dB+(RDrIx0uZfd?W32Gyts@NT9z#lB(O1wP!FJ`vfX``m z(}5}GbfgI-4)H8sr;z>i^O+v2tf^^#;qIC4r{~z)Dt_#Ip6rRx<4G~Z+s>8*ng6z% z!=J%W5#q3ED*gU#-N58oe{PPl60Y>8bh2p)q9^{PyorzfOzl(nt6P=M+)yp2@T_c5 zI}H^BEFs`6w*KjIUb>o=YJ5sifW38AIdb_(^0AEw{kGl9FS)hdQWcWs_+H^tx66k! zK;JsvHEb2Tw_ZSPRs^JAca^-LnQJmRRL*6;hoonA;0kVKB;8u}HbJL%Xk{oiud31O zjGRnGHGDV|+7g1@6v7Yy2i5O~VW~IDk_$S|x{2BHI-C4bU?f%P;(KcIQ{DLV)~nKT zF5Pq$7dzXZI=RpT)GoHnhZ-IP#7mIjQ>aD-k7d1X(%F&Vt1ZE4b!5uPvAvqrm|9fzWgl_<)BlyrMoH^g9Ofze_Z!m$>c|~)F(dBR2%?AVq z=8WE=6ci4f9QtKNA_m=N^6nUUf6#=wmOlVSUei!_48(Uh8*<`pRLp!CIL_>GhJGhx zH2F~cN0W zZqvk1)7x`NhBZ-n)ZSrI&J|pUKLO3HoA4YiKXV(APmy%O3OE#cK{?m(;qwl3e*%2y z&=NGqbxncnGr)iZWbLa!_!R(m(NIz}IDQJCC{eb+nLM1}4DjIu8yR!p`W6aCgJ7Xz z`tEZoZx%87Qt#fo7yhPo+J>IBrgljwsVeh9>MVxo)2Ji*X37i+)#Z*`SmeVJe9ukj z9tw`-6Q42TK}e`M=@gO65TR~6!%N~(&e_~#J<-)*&*&k%?mT`Tk-p#k34bUYb9?_$ z8LD%Ti%R$}nLRiI&k!uIkC-R~OQV@TijuojxqbV2GJ7jE5ep5Zz}T`|pE`r%>@#jC zbB~j+NsMH_5gJRT#-S)2*y_YTc&IrCWFx?H7FbRBh~9hq+~;MUnlY4FL!Q-uFqbbo zOC=}Cu0lLb)&f0yf+y&2I+=Qi#!?qhiTR;A4K2QE22jKKUHJfTsO2P^Y989Oc0<3C zE7z$fekOY3ksxh^N;#fE^GLaYw`g)`N6(g=i-Q=$2l`;56{I<89O_Gn>2Jfpv0{K_$l#M z)OC_z5DzeZ!%#R1-YcKI0;bM`=q%n(y-1*}dMBh3gL7-zWP4ZXJ(18Ep(f`~VOyr$Q?zW?^G=U=YSRC1_x(8vEx#-Eb?? z7KhP}whY&vL8_e`bIygiM5PXbAk;1=#@!;D_#=x_R-p4Qgx#cWH8bLrv97O1Nav5l za3@bqj?g!O{AKo(w~wY_B$zov)FFZ@16*IZ7hS=;gC2*HDw$orv{=|UGvXbVsVY(T z$0Qo&d gabfzAOTRag5v!Mu)y*|_AjbXQz{8@e!=@DH57myMO5|I9Yzt)1EWf`h zP<6%CW3)#SP1q|tI2#pL>+S0}x8q>8C6TapC~(KVXMsgQ{ncIQkQ;9&DjH&xz8i!r zUOTV9zEn*z)4ZvCq{-E#V;yGH6;4KBC~ERSTA$vJ0VS^rsFr<@&^=651{g=nZ#@N6 z$OW`~XOL3w{v7n{clfE#noHHjr63HQdNrPqt#okaehNmfpn4dhJ&r2?N_;53KLKpiOgl6nmNmOM{If^+k%Evf#2jepS{HPPj%*G3GMxGEJo z$i5G0rJnU{BOG+!ptIK@upS^h0X;-!4}xCo?c3K>Dy8oXDn2&8-_^-b%z3CTQf#E1~J}J5DqD`XEL_ppyPOuseqZpxsZQEFdrjn4{el!}J0g zB&WWnM0RlA8{}x7=n-HdU}@0PpzHF&eND8i;3U`6fb~XxtfbffNt&vUg6}}1r`}LR zFoj51HGgR+u2>ogj29G$kHlH>A24v)CQABrcO)Up3Wq-o^zT4@(AYdHhxr#d=de+e zNVavOcRyc!5%hYTpFFHd&zo6KO?TIjICZEHm#le6GWCC_`ya(j|2N&e*JXSid4+%6 zt+{2aX=#hC>}G2grdyf%@k2}K982!}AFjSUoT~S0-%Kc^j3FtBkTD^LghEMW9u6Tg zBq1_w8B!6-Oqu6dh!Tfn$dGx6Op$p$hI5W{_Ve4P&*%Mp-|zchSJ(A;&VKe<>%P~$ z*0Z*vC&i0SZ#E*@5Y%D+MzN`zTTl_;8=c`wD8`B`)Obep71?>d`g+|*yh^#N<&MxR z-b>%49p8)?1>@}ofdzRX!g}_%ru4`Q<3t*Mb>`Q{a~Rv5E7{qpV3i2=U@**andnmFure9gL9WR$x-efN@baM0ux4q+12 zSme|2!&cc0n@3oRTo10_~)0mb+;_*K1mp-S&-15N@1@J-~yvq zfrkL7iI|SSJ`)RTRN#R*kCp0cxpzW&zZsK5%qNU2(TWxR5egqDSGgW8&C1My4+PA6 zgnuCs-2FayR(;Xa!Y=_ei` zrw2GmBq$DnDoy=?l&I@NP7YX`Imzm`H`NNiI(TX>Q|d0*xJNU2@~4iRdQY;O1Foq#slfPSpoSojR^{&hwgb5+kN-=BSZ9YeJPJ0@VAAi@&#A1oLa88)h)NA z0SQB3br*?D{=`nQ9invl@a?M?bp_I18Zj3c#O3WL8690>aZsclljX`8nfdIaVx)N6 zmwOL6nY4dT#)s@NEcqrcO*AcAc`URnBnFGBO%G-9r&8{J>EL+0LmP6*!yw{lNcnu{ z3xIgczt8xO318?*i2sAqhzeCPIzQodL5Hp4QAu<0TP}6V=*eQAn9@!`$!+8b5ksuR zA_jmM;$I8Cl5osh6$CTTYJ>}=2-7~J zE1c*-q0WFb%qKq2*);12srLsVPpXK)29Yb<`u)QrKRfk#ishXc)l7-Tx7F`2J>{c- zi&mhmj@JFHHQrzILyns%M06ZtK2t;_d@iu#!51u;>H!*f;7fuI{u(nLkc}A&^fj!T z9CSq8c?RYQMMC3E;U#L1FxaJCy9 z&=Ob{K-{yprOL%BoLwg0wZ1tB@>D;U%Sn2~^2W}l^=mw*VBpo}_g{BpQbAkK9k8Fe zi*OP|240^-;N#-@gpm)y>UeOmuYPI}Wj#xxR-WtPH?9nqOODg8`ZJjwLw2t*?{HSY z;5-&+KlOsAegGtldoU|z!S_gF!*a#h_%me= zXH4ml2#H}8YFeB)yd-*nS@~--(8He_AIIp$`>Vrt_EN6sp3mp*z8fg_{Kk^SZGPuJ zX4?UA!WlD@wqNy02_xXtDw#;R{LA|OuFSnPZ>nCs_-1@ycM+Bgs_mmPxTFYux_9i> zS*ucYQ%we@??%r!n^1_bYDvbQzr@WDbS^dZuo@ViAcbfHJpij#% zRy5+Nk4sz0O>+(;u>V1b6d5X2;6KLz%RG3n%S@@wK*v%Uvi95z^%Y5x4KT4a}?%Dg=7T%xza7VY;&Q@tI9oQrxwHuLBoG8n%m)B{_M^ze%$u z@?=$ip)lzm77b(Ymx~+ei!L_|auTUejU1`pwm8;crm&1kO zL}e4f+;ff-?*XyxVbI?&t7KpBC+^=N?$eVni|q?K<(Do~TJdSgt9o5O9{4=V9W8YM zf6@C6KB_mfCiIE(;k|@LjJYAeklo*FOH!`@B)C4*s{aFh+*xK~m1s#CQFFr)2F2vC z59MCp?J?T*7QMQiJJf73eY+sK7Q+ln7J|HP|wEzK}Joxcn3$OEfIq2q@&bog=0b6LyGI@A5Wi>WJ*EI z$};$i4k~a@1vJYauNy?`y-F}Cy3J#n>f&H>)m?V()rV6ZZ+1r*<+n4sy<_#KNAmmw z47U)Pf>I*)e+d8&B%#29VrG{8i?UkLzo)rX)HBNrPSp>N1}&({pXPczS(I{rp4?H$vMOP2qR7UPnSxmG#-n#EJdg#Rh(@T(+ zM_z`+HU+SI3?N1sc*o|-ZXqp$->IZ{KhaP2{_g$aK50)IUi)$6DRwjF;w3$aN-jVp zj|e@@{RfZ0^xsqj3o;8wRHCJXmnwF96n!oA9kN>%A~opFpBFEa3(e#!g#>M9K4dpU z>|*|d)#K-2fiBSer`|y=#m=rct*b}$^UiDb^5P-EzD}uC_t$aBjkY&}UYR)q=z=O`SLTH*Ox}-bN6La}Imfy2`_JMz zn=3sm1DDQc6aBurfsJ`^X&I_r#iykJ79(&+5BV!7zw34=y=lO`487R@EB(}fvq&XF zk!oWYR7n+ain|Xn1pbJ~wsP5YjFXX7ZR|62>Qn8NQ8tcqF1Euzc$9?d#2&qkp9|ESD2y9NfiGgCrY& zTY`KM^90XuNK+7+--l?Hx>>4rtw@%^zkVF zelmS7Z1d17N~_`or{%!l@&Qx_5blJeDL-NQBLBJf&lLIipwD52kz97iBg>a;@i|(- z8dQxo=Vt_^-k2&fY+l&|sdlhrUn)X!5sORHq42%{YIgW*%R@>NEx(xdYIjLl=Pmo4 zhKHn8wLG0YyI;QT3%YfN`3{ z=5$~NpIUx;rP8RB#QA2LIgPDTxP_vBT8a*E3rOZbfX+8RDpU07kz}HLyg|{nqo>Kp zv?~|%C0nNa(bmk~#dR+CPsLdjIND7~qpiOkMf+Q1PPz*g6&Jqty)+by)G32D z52xcv^`GT`FztSpP2SyMGj)lbfu0eNdt>#lz-MxBZNa1>;s;PS&=p?k{jGm$&SCG9 zk7V=wpgwoR_QHLK-m5wpidrS1$+Bt&A)HN69a;RSA#?R72qOhi4<=Xi$Lhw)1q~C5 z9CgC1q;ixfG>otmm--=weuH)=31gidJF#U1MbY2DI;g~BVn6_SB}=fW;@w9atC`1w zUYj!8nf5N&8b9rrWH3~u(>AxyXY)|_LK|@C0P-;bQSZq+hC}|^fQ5u4Io;r*kYTgs z%kw3q#27+yaHQIl%;&xPLOeo;%9J6eIa>RGm0b~5A8sOg5ZLq}nsC}W$T&-Y7T3X6 z0GyTq=m$!XpaMNQfHFawy4LgrED&Q?o^dKPT)pB{-)U`bm2K^Q$DzLLAAZT4oBgHt z^cArolc6eVQPW;ny`C;a#~CL=C*dU(cu7smYPU6XrMy)pc+h4Ib8G|AEQd_7!)=Q~ znd9c>b+T5i<%#-Mem{r__VducDbgPmSiqJ>GFc{5+toC4{!F0U5^F=e+rB}Bjhy-L zOSCu%xhJ)Nr&2Gmi zgTiH<4fE5pt5Mn%U&JYw%(r>yZxEUnlz>)R9%wtjAyVr+0?SLX;9?o3A-ml*4^U=K@tUvxw{*5>hnKAYJP3#2Rm6AjEALJ~2 zGIeFL5Dm($FUwFk1}$zBi4SRNv!O`@BD)zh4Sl`zrXzzGypjiBTNB-Qe>fGuy$HU!?NrmyK)b6 z1&7P9qk)7D$K0Q%lBWjpk0jB4FVXDU{)t65JYOgPY7@JNo5+axn^b5UHPY3>p z6h54pLf4!9;lkLqyiuP`25ZZ;bF*~OatCLBvhLL2q31-XpPaRVO(IGV05$?>2R%B6 zPKO$pn(o*zjH>>oZM~VVudQ2T9{;L{C5XFO>{8(|>wJ9=|FIPcL<>U{wFXy`>p$cM z$!AmuZP#$id^Wm zUFNxv%*ws_uKtLqfsd>hvOLIW>7{SCfuv?4h=Fogv+(g7We z8CBd6SNt4yBenRp_$#k8K}tTQ+??1avRw=3dbP*8A1%r>tG;uJG+loQ16ve)#u7C2 z0)Y+EQED*N4P?FnjeT<7bD4J+o z`^HY6BGroW7tZ+Rn7l7)ni2L(h8r<$n0mO=3ogSaO)XIq>45Q7er#FQ0)*;pUTecG zqhMFa-wt|J2IFQS!g8Gv*ntA}m&?E`iZoz^u2&yfi}c=|zz|oE=BAqc@t-xW2lERx z{#eC^DB=xN0JffVCV<#^5gUfV5MX*=?jMM)tE1$P!< z;I0{g1|Q#RsWT9%4B2UP1q1CbD@>p*JJXO^>_+%Kl!1z6!=g`@maxrvP!FfWR^ZHVJir8$DwL;V@_tZUhDJVI$CWJEc;% z4if_Yl$Fh5l!+_EnQrScA+-1I@yP&7q60jD-s{$btJ6{#@ni7zL=l8vZi93r*Y&`k z84Ew+Dn05FG@O!#RR3nr5x~@>-)nT|dyDjdP9T)iwuM&t2%~?4%eX95Z@fU~$llq5 zG}M<57=Y8X4)7VDL6Ow22N37G)leAe2H)KQmQOCJ43C>ji!Rzc46Vx5sr_biliFIk zN!}@?aPivGRY9wSpNcsNqe!FG)Y@*5>ulHt#s|wQ-__F!)ypsukAXTcTTL86&*>p_ z6Pu3SM7u5xzGp%PE8pUcv%GJ_wyt5?8WhBrE1w=HRnc$S@9QDiaXee9)&-WFOG`@w z?}3{f@Ousgd;{Yi%UQRNmK-YX=j|RYAFkRnG!(OP@@{^)>OfOcA=jI=bn2@zPm$I* z5&a#bj6w>6m}KZuGe-G0`k~9Q$onF8*-2^7Ejw@X@hv~QJZ;X<{N<>dYfglkWBQTz z<)y^?ee*yY-sqq{5Qmu>XLr%rEpbYo(mxyeleOOEcx?!v7UChZ}+yxrz~N6Es#I5e`WH&oih`9jfb=1c0jRu9UE;ao3)INhHYfzdW(#E;_!7-yLL z+wo}fZ_h=3d;DGho!b{;O5aP>zA?;7w0UG_X33k4Dt8Q%`z$ZasQfD=!={B1xuGdX ztXZf5b?}NKJkCuR7eX3Hb}`bbhWoV51d3P7&3ALN{aHR#B!6nS&b*mvoQsum5RY=C z7UOG)Ng;;gMwIFr--0N5f&?ts^%WHfz_5O~OyJY- zHaB^8s>GwT%CG7I@6hCqNqdTL+_Uy^p4Y+@ZzHn=*je5jT2i%5pZ=IYmlg&2$ip=x zV2jJE!{wo8!CGcuin`O%$(?gK_OYz}eU5ptwEK;$_QuVJqqLo!g*+*TMQLeLPT0gD ztq&={H@A_vM?m}M!FQgJ7IqOt27diJ3(q!grS;VFm53f2KHlF_7XPrJyr4+Pkmn3+>cH^){`$aM zpZ4CHp^?Rqs@{f$(~6?h{O@R+4%1L+wXC?((Tswanb8A~u+1Wn0K5pOz*QpX#G|Sy z1EahsHrF^P^fQFns(yW|eN!AuaEqn3X*hO7x|1h<5@mfZ=W}ae)|ix04&%c^wGoit zLwMx}sDB6Ck2EUrH=1!;4S#idx@IeW<$0)8hG|`P_ePAHW6aQ-c)q@d$31yBsyR*@ z+qhC%wxKR7Ay~fg7-{tcIEC%D8f(-g{vp_1VNji^zdV?#Oh2#A5q-=+M&;V2&GitA z&Sg1m&BOEOXj4EZPO=B-hys{*CIhcwwKh@ zT_Ri@dOq!cj3FX|-cyp&ybXoOM!o<%CRYcDiNK7B^=#^cl?48RKqj@Imp)s=-43r# z$Wgcpb_U-2buL-POp(FWlyVIR6yZNV@l!}|8CEh6m(WJUxKQ>hn$ag^85rL%W4V{b zucdRrOzM4IBv(kY;^V4khPO1EOh(>)z!FPmF)IIViYSaLHt^I(iVH;*@8n{)^&~v) z=2$xEuZ{WVv&p>=jG$B1PAqPvlvzrUZ!NC<2p~a#hQ8rhXgh4+2R#s;1_$`gQJ^t; zl#|_5`88Jqg^yNBZvQ?#!MM}n89lJ7d;CoDksWE0d8W@%Pz=bLOTJ538(lpjKRgIlz1(Y9;CH#zz4IExdOePE0{M1<65951Q^szp#keq?oZoG~`3(oPE4*K;XzT2k zF=Pu(pYUEKe&?}?;{)h62zm&6{#}b|fuJr3;>Byt3>9O!c1L%-j6HV`t>-Iy|MYMX zE~j&+exhr)Xj84xR(mZe1r*^hu8hP~fHm2ML`fTNb3lGoZ+cvszMy-4HLkz1?RFjK z3u125*h1zL0=v6yXSM2=pP zOE1T5hA0t|#Vts2lEZ4F7S^L82Dvuq$y3dN*KUj+eZ&WP>H)nHj7bIV2T+^ahGXM6 z2@~Sm#h84vf%A=;Og{zgl%<^axve+bb&bQx>$G7-FET$z9XapII(nRlf=E-P;1l9e zJD6s;gtn2fz&gK$qf?4CyI(pye?_(K@g!rv_YwEA89~KGYEdfT88v)V=4}8w0@es= zWIsO8+bE{^^#l&hqhy!mi@A~VIbM5+S3>OT7-)-VQ#D-a4wC1e~fSdLiyJ4vO%oA$VnLd1|}`<EIU-?EbH%7-LUOY5$$w;Lz^ceA&R;X6Pj@F7>+~ zXBt(wOG-nnnPemqJC|?5b#I}kmhe(Hk~xoTLxrS~*&$3#ICQx+M6-dQT{$^atw{is z7pi)w^fRM!(;b|uG+UzjrrJ(enPgU_Kb2Q}<;oRvRA2Vi9yJoyWYN z0dD(IPsWK0)g7#jjQ14GMARQR9_1MAlwR>%q6r<=H0ZzH%vpUC+xxN`gcA3WvqGG| z8$vaM*>wTe6sVT}T>XS^#*f;-V8)vg;ni1Ot7Y+YkNH%J4AlMbdo#}_NFhJA2Snk6 zkw-)<8(tFkgXnr*2}b&GAtD5k);;|WrdC~Z!H$^YCRTiN&?7L7#W$S+g~C2L`QloM zwAOW~@tGLDeDZAgu@8cZyf%Cv%0K>OPM=Ba3p158RBRg#S(pVYD9jP!H6oJ=Stx>n zh?q~b{4W~Gmt%3eX{)YV%ZKr<4VkWyl2a%4v4>?b2V0U;%0xDnRL~Noa{9MG|1F-I zVkIoM7JR-@AfL_)O9-sz5Ew9fZS#cTwF!sli36rZOSN!kuNj+7y`FXi=)h@w-T^)j zJ(I@2jjk^{xBANFuDlhCkXgS@WuY~-&66fZfb!iKK0Weg4!`sXMO$3Wq9i87JyWwe zS|OKY>l6LmkaNH>ZCqJd`ST~8qb?Mqmu1o{11OFrsaB-e&fK*N;?p=<+|ea!`%V#s zq!<%fWsBT0?aV`Gga+sBzr(;P ztirpW;)V6HaCznxsg%qMvFRtepB;}-H7zr=eNcQ2#@-x%eFbS)Q9g^{K1K_kiNS}Z zA;S6shBc+z&H2b4-Ta&HsFLB_`&R;$-^J_yUa!|O+Mnm{RIWwUmo?U~1@02m35 zQ=DMe?EuAY;6@{7{j@%Rc{7(as9o<{0m#SNd;Lzc*gZk2&0ySZ|$6qt)3s zPfWtKAqIsMU&A54695+oec2Sa`=$N#j@eal6|KW-yai$hCgo-x!sf;Euo|v|J6_^9?k}e$DD~2!ot)zI@4LUOH(h}wSk^y)a7#kX9c5H;WXb_pibFa z#ttwCdn|EagTF4Gl%N@Ec8z-O-YMqF;JPHYc{-P;DO$m3Zhl2YxzaD1xksw!p|55~ za2`Z#B^J@HlxEXVuOavlj8})hcdQy4=d@gP$PE}IjofD6BVtsSYzOfQM-yr6AMl0b z9E#q#d}MA3mw-G#8}Mqy`0;>kc4B83QDBmv?lB9E*vH{lXDqB0<<6_wNYqHxjgsDU>3J`UOL^2T(O$GPI88P*LXL?a11yP38|D zRduYn+DCy{cN`qk8WpF<%Y!#3u_m=DO0p3Y@BuY^Fa$$%1bpXB_D1E2JPy7p=`WI=NU}$f-m^n+x!Ou&BT@2o z!g;4XVI7M}eF=Flaxk#xlHB-njq-GJ;GYIr zkH{tvH^3kxY9hP;?5?OSRr{xIZzt`wOks1va z_JA4ig@{wHLD@J!Ndi43P=*AxG)lzSDe{r|SSnl;#=fpO)r=Caemo-1sw^|_W%PMV zMGl8!r|%miq}%$8Hknk%!YW+5`4qZNA0w$L-Z>BhwRDSnZwc)P_l<4smFp3fRs+Qx`*2NZ^u_=Pu z#9R-!jb!d5fTUxt#7-f6!rz@MX{!th@;cGAUmXMmy#%uO7D$_`m3e#)7ZmPLZnUks zuKx0Il`3}z$Z?S~*dFldB0MgHcST;*GUdaP!Iu#(>DS*duY`8neYkVzfpXr@EygHo z_HXIQ*V2D>CCt74fQOF2yU1}75ClLAe8;HFq07tyM@N0dxUu_%91+KP#OyQmDszPv zpLLbk^|Pounc2LKXL}~-jbu3x2Yld;#UR@%!3RS4jlbKL7QGSW)irM&ONip?Z7P?< z4#jscFzXC!UCKsHe`Oa;>-4iOMl|+K7P}R4Bn{JAhGsHg&e9!>&G9_irM2Vv1&5h; ze#UDF7})cJYgl5)cBxemAPrBEwLmvair(_pO7{+u9l_G1>Pz6bU28Z-0GM&Z)CK zfQtRDgolJ-Jf4J0Y~n@+VMCi(6Df1qApA1m@ptW5Sj(Vq0i2L!!d$~mz837BB|Kep zp=Z32?u~p8J@r6#pV-Dvc!>XRa&!P~L;$T0z+VVTzd-}ZMmABF+TFbYqsg+r7^PM7 zL_TNwu=Es9y>k*Np5}-dxPNkO9%KI-jY!}Vz}KFLx()B&B6*#GdAm){um?tlfA@1t zJKW@PUK>2r@A|G3y&T&zt02H7WVWXMuJ!s~Yq5#7t-Xp4YUq0|8o~Wn zlIaX`fBvi=h-j$Ynfd zAy$G$y#$145QWU`*&QBSkpk>rD5~-wpWwaK_M;Y+F4 zjzUCyL}HOavItyQ7_nIkMxXZoa-56pqwbahJ=Xv~h0?{@$>j@tNz8XGwFRle#HVkn zRy_)b(xM^10C*oS;MIx>I0|sl5HT8hmz%CaRmEoy&Lw;-48CI;a;72rxr{d5!JPN3Ik}^K>z983pJs zOP&2f2)xv!ByXI3+Z$mE1vrTK35|(`G7zx;OahgDwe^vlV0{V#@BMit8@x$+k`3^> z7r?J!-P>pi6Ny~7|5GDn*@6a}+dW$o zDGU8HAeKhI0MWMW-mUqUOxK}fb*b{1wXX_ zUG8b4c7*i~W+8Yh0j9pF^-1y#&Zjj2ig3mL0i=o72c?_)>k{~7!hu9(eZk9(&JwfMGs34*gv}av7E8uMaT{p;Ko2(M!vff0>A%Ul$<1qkAIp9K>!)X z+T&5*V1X^k4=Yel2SjK=9s|b-4+LQOmQcU=(DUpVRD;anuSMM}u5W->TZt99RUy}5Lg34!?q*9l^vi-{SXhRk;KjD`Tl_j1j(%-&p~j&IkoOzJB4)T zaS%5Mzy(R6B9U$#(7nx~*M&N%GDpS?aj?09!zlJumUm|bI!(M0T`_GLIoV_JM0B3RZ;6o)dR#+Z5GT! zAW&+6>ddcv^4?tRzC`c!aDxcT`QJ-&mB7(|Pw1K|rT)MV3+x-JP!AUvNk z-+g@nCR2fvnqRj5dYIg})Y$CiPK>8B&^$BFh-vX|c zpk@}BZAT$z!&0^n6r+ZRqL$3%ICfqZQf4tn&o}ogNAL8~O^*t<^fS=)&(v2jvmtx7 zfPsA=&<(Q?ATIzaw?QdbXhY+WySn=0J#>3D?VxB&QtKq{`~Egk3klq=09s?am<0sI zE`Ws;S9p7kiTGCFCI!LzYwLLYNgUiEP24SmNZVm&ry?nQNZSWS{Ahn1K_ED2)5Lt3 zCl(LR_iK07THWOd&Q%Ot<|;YKpBH%Cdg+dlq)y#jos*1Uc}k(yR9@l)|e=sUyj$~d%)zK`#xW1**IkQ(w)@F^;D!l zND=S^o@$0s5(t|Jf^c;>zd2RZyPVxU4Wl%og60Z|Sd95{K#BI>p`MBf36r?ytjb*E z-|msq%=RKepGDAm@+^D)p&>u(F{bTERSCWVIq{3aOEo;8`RqCj-s02N$ORdI(Sc{! zx58MK!uB_LcfVU0D&7!1QT5L0y|C<{;iFnfvjHJg^`zF_9~XQwZA18uG|Ln9+E9~0 z2y{bH#M!gkQ3Bgh8+d_hC-3*yvDzjp%fL0m*ovD59la4*ZRUq-J$JsO(9l)&IW$pW ztMQN`yo7`s67Zc%Q+Wdsq9LCiC`BW8y7+=`NSQ&M?R?iLcblz<pT6756&qd47?3B6$IXcDIq|7NyLT`vA*!qEfBVsWYuGLqQ(D0a@CU%>b9S0zgazB zjQ2^|_T_wMND8g(?gs4Jk~Pz0-w^`aFUd+mr!PDtTzf;zd1=M0&xWPGBKG5bH`;Y7 zg$vkVU4quF!xHru?q+aRPtSuToGY?+1#G+ldoPJKEO^%qd=%qVb?vU<@C-rIq9jtK zyq3J)MRXpE2!*=Rxl=|tmPhzzc5EC*$+$VfyQybJKCG3q+hqdVWgGakBbS3ow~>zt zyK*njo_C^R^4iw0Zv!qi>o&rorkXr?x9 zP4@tJRbgg-=dCIBZM16>d9@Idw&Ibehu-w@dOi4uzqs5ztuS8~AK<|_+un=9 zLgtaDbsWu@R;a{_GFNfP11yZ=kUWpH)q`Z)cy(mR_!cO%9ej14wcOFhENkFx^zEuE zCFXJUXE)xU^ITY2%gb{^gOrgpUp5q>i5@x78sYeso zpOs;(rA^(~-V$lp$gf>;^RA8XKo>wYdwv?zp+#4Ftp+A>zp1}#ly>ua(-A4OPtCC$n=x-w-9`ltguOv zP`6SZ87)7Yew#|-+MVf}eDy3_*Jv)(s^o5sEOT**RoPtb1*TPa>g*igAfe2FR|2u~ z?6xHGf|h_(Nq9;)-)xXr;I5|o5Vy^?vJcg(sMIFZL97Si7E@2N;*O1`@dGn}4IytF z_7Ps-$GfJrLkH172SgniaCm2_Vk>d?p1HK`p{Pq4;jbAIb?WE~p4aAKC4Yro&86r- z24KyCf&+-g>HyUJ0X4E92IXKyK$<7~CO)4IcI=LADW0xy|D-B|61+u4C|gaQ%ME4w+jivNvp-R_0BU3c*MB{I?0{3X-J7T4CsuVD!Ssi z|E7KXyg>!UYucr~2^v$QL<4qWzjEbqS6#z6(?NcDd(sJ98DlcI%m;{Dcyx3WGNx)C z_#uK}f}S)ridZF3(zH-ZzlBA-9`HqNBU;B4vH`gM6P(%K;6g4WuJ)jGl9oO`T6XqX zWY?g3_Mt?*P1#p+xxIPSejQ8pRd3s3iE|D{!7Sv!72l`Hg6dLCGi0CMB z6B#!Smyf5@y;gT0*|$)v6pnssbq*S4$`^CGBk`p?^RfGtnyD$pJGiIt3bOYWl2dxX zE0>7qF%C8sd{ghqwcHQV3=Adym*kF%#)bFgi@$F$E>(HFRq|2phGz21f;4KN2f?mS z(}CI~=`Zx5&Qa7VR`)8%fGh*IT(nW1_B6YZJ9pCIX%Ux4YAzAR#$U6$TjQmgu5?-j zK6IuGI0W=A19eCLbnt8fcrn4_uJ6GBbK}tBQOl6Itdkn*3Wj6e-rV&vaZR?)?%g|k z>Uq`Q4TUS(6H~=dnhBG=RK%n3iZ~7tE|9>#2^rGelDHJ8HIjA6M4Hv1)P0lrol2(1 z=|W-8=M+CwWJIkJ`|kR#QAO&U-dV?o@oq+u4GGW?n@xyl%>;+fM8Vr8_Lr=@UKCWF zs-pHmyHj+pw@9CkW^Ll@E;DMD_Jf$giAnv><$IT z2KS^M=kEL)CeIt;z3q-PK^n5DYYHE~r0~AEXGu5U=W}w52fI#o6$FitESeImorfha z2cDMc6No++_*=1%L|rTQpv3q-xc6=nlWwqm-HF5Us{S~GK*@(a-vtmu8yMA39!tdp zLo0-|$_^-DSs*0RfLrWnTsuR$)t~8?&&OJC@BT2azIE=f{XpEH*>xtXio(WPh{Wsh3g972h8V&vyS!P|x5-K1ZG1la1MX(Wq5;Bb-Lf<%H@lA0 z>34V-qYoC+T$?b+6f1Hd=n(}Lg^(!!?-yt4;X=($(Ls*UT*r}oyB%|JN90Rl6<3%T zlchsHc|~~wV&@ISSTWrIPfRm_>+XU=q3&mm$6kf{lv3BncOBFlnuU5=7YSYIeAPwz zl=mtBu}H{(;ju3eJpO+cZd-J2N*u@XqqAeMH-yrgrM~5=s-XOj?dO=n+S zOn$EY9td*?5kQe{@HBvE52V6_i;CyUBjTKS(gnXDJje16jm?L+X zD=IaOf_uw5wz<1N(0CUZgCX)eJo_3vLuxlQaVpT3)K4?1NY7iX#5k9aar~H_!oX*V zO%yeY5=+41TZWk#)A|&c(j?D1`ui5I112K^`tpzc$|0U_qF<7qh;kp4y(#4%`ec8r z*NHvfH4J9v{bYQO_GEBKEg%X!%mNetzK=KxbLl`!O_b?@W>Lei#|P=W{GYF8l4i?3 z`+Z!$V6L70lYip&zocRJLFY^JHQ^x(TgQ9XF+6?X0kApX}=vT%~1aOSP*;8TwXK77%1YCf^acva>U zT3@C4pK5yQw>0|#lUYJmss#7TK=Ak?GPmHbdz@W@X0(CXrUSmaT_xtgJo&+XPBW+3 z39Uemqb=!gD^y*Od3O#km@?#sn0eRJ0J8F5$0DzEBj0mb+ z>18|W#dbdUZkAH|S83U#tSJac{zBdec@{F_SI8UTB)P8W#+^QOhvHR`)&UFkbqzLRh#`#OK87Vsmz1vjN`I zKf9IoFBR-6)^%N3BHcK9-DWXKyqHc%g_qry%)c$zv(f zCs}2;P`RWd)-H#ad#hM=KCN_l1U`s=a+PLH=EeV67!G?C+)U~4fglU#(L7qtCB2Hs1a}CIFDbNjq%bTx5`TbjYlE4t@W% zVg^#x7`o}GVI;1IWfwGf?Cei<2noqGePEqD+`tdk>j%FzfY{p=#>$^AvBrl`Pl9Yj zZ%I5HHn55}#GYx?=~%pDzMz;(ATm*R=%v;9)yqlRNEOPZoUTXb!D)yPtet@ zwxxPbsxHq%jCHFnb}y#eJ`NNMhTgYDM^Cl}J_ZY*&*dLeKtgoP4#uMoJf9CpKSB9UY??(Z|{(pk%S3GX3HQ+b|X1e&c@!5qlR3%O@1|T78uI_CgOWN|-~~ zimGQXq&L5jTe390PnYFR>s+GBRzRs1xIYDS5F7d%EdSaNayp$42euODhAbk-fN?QN zp>f^YWBJ(7&xB{lCmhdlv+MTc+3F_sp{W0{gnwW*8{~+QHjGs%02m7Xb_ z`EV-6@!aL@tk?>_n>Uu_)~bL6|bF4tZ()c~{YIZ@rOPsYHKN zNBr)Jv8-FPrpHjnXc)(p@TSLr0R8tm!Vn(K-5y+)s9zPjXW*uP=nw10x|#<+rsBNOyNDAzjj?2uKN{Gziiu-7$2BbV^7If^;)$9f1e;L7tC)X%_SzlH3UJw1LPJ z&)E4|nu_~p2ieY1_t$45$~n*Jk`m{qN=S-Wz`{ z8Rw2%#-`dCEJySJM=^F#dKnS>I66(Fk>;A|>JsL3)J1qrbqi$wOCKOOGvbPEBXDcL zoI}ew5mdEM-!uFAR{D#!6ndzmW)~SFoU1EDiKn541#0)m--r|fK@xG;4q4p zCV#TXW%0IhPL7(=PA85)geUUZDxieW)fak6NOyo>|19-C${jJzQM8ZR0Z|8oxMLJ7W%>FE9q_(0-T~N!~t#om*%?r2B00-ZiQ+8qFyl3K36?WaAx>E zA3QJ@b!_Qx{$<@Z^D&zs+lF?b`ClmVKNJnA`2&(RA{3+VjSTPpodM}yqz%r@kxrM{ zvo9!Q z4r4R-IVv+ZhwNzIg^W4z`f2F~5j+j_fARV6Q2gFZ71l@Lnm1Z3+Ve@bPs^{(svXH2 zil^C4=&z6}TYs98P$KTg=s!4%VEF&sk@NXS7kbUd zTEj`Q>M7^a7IK4R`(PI!5||^x>GN-}+^)C-^M^V#;O-mH9(<(X_>nI9M(4+ICaut1 zr!w8BZOt(s+P7@Am+3b8gPi{>y;=BetA6Y=NI-E0^qSgeXfEpLZy*Rv1Gt znUVj0Mrw;BnLaC{$aN_}5Pfp~g6gpz-i**M-6_Lq*5zoAUtyWu!5nUF|JHtBgHuQV z6k%K-wSPczMGhQ47z0r$Xnq`s)Mk(C+WR_qIukr&>G0eeLt{5fKkTcF8sgfnO;MQF8ox*m=`S%^T^(`Wqwo-WixvVM3KYH+ECYVO z{?|6y))BO#+VB!Q_(om!{f=eHs77MKkzK>vQTvU9iRDTW!%124;x-x$V)Z9!NM=4PiGi zw_wCZ9}pJiKP1SpZ4dOcJEFmSUfQ4pE-4`o4JMCkH|H`D4Qf@y;!Xi9?SEz^U~yJn zKivGc>@~)~n;L4y-syy<&RfPM+BrNu3f>|ahGBoxQ%3a+jZ`Idd08REtuGyN$8hw2 z4F!nDG|<>mA~cQ*(ma{_R>o9MDeA)t>o4b}GS7Har&eu!Q(mO?h6HKz2GRZK|El++ zZ-CTJfX7!xSLe--sa7ROjLI8feo@G`)7Na%7!9$c;sns4(4csQ?*Gp=fha8Q0;r;B zc(Ucv(4(!%;P&|NE^%#4+lsIS=gra-w>xsoH%A$8iW?aK{9hV=1);^vazS)equ6tq zCoA#4k&KPFO=(L}n7=FtVeqYNoW|VLV;Xf_m3aYIfXDxZzQ0F{XzqsP6nk6YULaRd z5o`9CV0r^JKNYv$vK17tE)*TFfAW<>Nu?q`57B8z?SDxvF_IxE5;S8|r0kVv!J3Z( zfG4@FtS%+O_X0xyz3e}zB zSHspxg~3k9seEz~gH_PPOqrsc&5IFO9#HY$vm$g$mr|%kdAWD^o%EcTL*O`q$;w-H zgxZM=bIH!YdX;Yz!stv3{yzyc?wA1@W1$opmCsu;#!eIXk@TbD3*j6j*4gh#fVF2j zdvoUvckU6$RCufZm<|66@`#NZ%x5U3Pz4WafE&f5xL+mgBRZKh5SGd23K#IL%i1c2 zcMb5IQS|{L|JSarK+uco%R57bL1DX{hnVg*M66umruCB)a?53g`1pt9`}wYd}E4wdR5neh{@3Kop$-}(l9RO$^hWv zpM(9ksj7#PAA`dFeQ`uB$RY*W2ifElzswlL@Z8YK>a$g~rfVN3-i&eSS6iu_%!mKg z^i>E$^&b$b{&)!{E@}})9f%%(_*0p9=T9Bf-%U1yS#Nk_zkj-0zwu*aCW>;wvJH3y zlFvXnaL+-+BM%@_1xR5b+A;|KLej9}9ZVq@$pB$e_gYubKJAX4uvET#rWs?XKN&WE zfGWC^G${+L{56i?pof2%xBmDL}oUn^)SuRTe}MqYMP1)ePQ~nHymf<_hRr7nlWgLtl_B1P920HT z|Icm&J;(!gsdf}{m(bV7g7l5riO~(u4w}EA+F11?Yua4d9Hadi0(7j~fP3S=ApIY0 z)P!I{Bl9jw-|&{daiCf0BNbNJp*3!}zKm39_2(R4aYl;lN_s?5u0i-#rvJ-uJfc9b ze(baglo>7MAHDT7%5%?Syi6s?=iSL^`)jVglVWl|39XGD`OCdX{v`naVkEF{z!h?g zY-C7zncZ4D)nfWuGkr$@{91B-xxmAaimqO>;B`K=^>XlJJ|gG@q2>?&$My90R7>9J z8~A6=kId>CeXo2}j28Yl62smLyR^>Yq|u}k7b^@q+(fXb(*L5vh=In119Ro?>I0#yqj~X+uei~O`z`W zj}INLRVvEJ79Yym1qd~!@yA$VtuDItw?w(}38{qi@D6_;g7!y!Xb|~42w&n?zy}|o zxH5Jv$K;5ZN$>R$OJnA%pPL^lXHsR)n5>sJ-HA#0VCR-Sig|`;&&GNWTKoGffxu{N zqyrX|z$M$sONI(sDWEFVC|ZxfQ1AtNv4=w)GX49W>_oSoa?0;LM)|A$kH!d!x%=a9 znU+aF54lSVHSou`@QIo9Z(^6eF#CCkvwP z4X)=2p>qwM0@U2J-ofjJ{;>}Uz?m={k<9h?B~GUN5mXMp(J!E-@e#)1X$n$Agc|)p zVN{M1)i!#U1Ty{OubHAvm*BTSspxbA|NDG?{eK4P*g3`Cmz2GLB9S@kVtGSZDz=o% zYwMxSGOuznp1+i`1j;vm>Kh^46?ejjR~ke`95=W+2Vnda-ogCa&*+1{^4QBQZ7J+m zyxqa>X_=i|4CnH7S8EB=T>|0knt5=lQ{Efe+}Eg5>6U=Cas+D|?i| zvo1~rxNLbU4y+@@HGD{oV3c~` zHQP(Aug_EJcEr`7{dQ8F)9=|CnS|ga?gLr~WCAv}4*KB&c~snTdt`6*>eGubfo@hGWqb&yc7Ucq03+G$^8i5L>XlUfnR?V_ zi{VNX(cc(eJ!W!XxnFD$VP1i3D~+5gDDS8d{Il>v=+`5F3!GY%PYxr}`P$6j3E3Oh zj|?Z9itvtSqCcw5wvNxMLUX}rFN}LpPzDS$-~oimO=Ou-q^{!BE=7xkYma~=qLU#I zb?^lK=>}L80h}lvdo4hp5{I9iBylwanN5EoO8v$@X0uQq{%yQ5o~V7CO?&^aY(i-Y zat#2zjt|fi1nh6;9YH!X&eGY|fQrj5V6pZJJb8Y`f8hw)JsEoY6B6LQO5}Lv=d05W zKY+jyxRkeE{Wd_a3>o-+BV@hm$`mUT6J>AfK}N} zG3W*cew;n|*zQG0_;@6-$w7S!U35gWv-F}sZucEe0DvB73`6WtLiVvSjFQmr3a)4b zz6UQEtAcNLyyT33HND@9SbW^Ow#nQ*62u2h6h*tMeR6P}*^=&{J-YdxI-bwCp5JKc z7A{Rd^tmXmm200s=CQx!90cEmz#Oj+s*OROhT$j1h^AMU=PQ)eo7E?yxHqouJ1Zjh z$>|u1#_y$spx-!5v|glFFRQpFu8qf=_Oe`i!Y|{jh+_Ze|0aBzAHnkGhiHW zaX!BYknruxtLA_Vq#@BT2>PFTWX)33h)wDLZ2Cm-iL zWjH@(JBpmO`~rEABN}CZCkNrZ-sJcJL9mFJpyZhrAG@s|Wd?m2?o{8S)9dfZid4rb zoOUzbwM&FsGfbyR(A|%gHUaAX?$V8bPWs@1X?|Kj;_xEsE7L@+88qQ8^i09shTe}4 zKl4BPyG*0W<8Ua_tiT-~fc1a@s~SW>mXnJbz$-Vb*VqI&iU7T1vv^5&9aQEkbW-Oh1ddW62XJw-psb}4#vG*>rT%@wk zjDM2qjz31R0%_aYP&TIV2vN3=;rFDXN6QVU5eDqViw^d5z~0H20g%oe7&=B|oy8@# ziYmG_@?~p0zN(9!+}OozxkJjfoKGq{t{UMW*Zk@J5io1~mEZ`#NN0QEn-Tp3m-U?3 z?pvSj>zD^;EEDC@`uj|ZxY!#CXy0_O`#b5ln!mFW9PhII0!kyUL5QGL>1%MV)kc76 zMB73FUDp-9XGH8}ChKjPKm@~?^c&-d=7AY0UHy)R600uGE=@7gW$d@Uio(mTqJeB+ zNe17*ibFw4|5~zbvT&On*Ry@hpCbB-+a0&lo{7dqCu0@AOybuH<5jbMp0B}%+G$VLmU?k&HP|AoD>!vPIm!n1mycGo7$20g`(%l{GnIcCHgaG`zqEXNAaf{M zeVm|vnWrA`Rr)$lC*20?){U7{mquG~$eOGOnaVYGrh`rsB@&;TjB-um8y8VhF&A5qWVdxt{VU?n3qxy`lh#u^&&o=RFs9rvTtj0NeM0yXM$Ps8 ze8uT(23{j(K~^uNkD*fbQB!(CzpVz;K-7ssZ1KfaMU}ZdjazeAIa! zO|_0*UoyxP%L!QI#_99EL>em`wbk#_PqH_(N(}2Y;P&dI@LG#GFJ!yjtNn1}Li=Xg zn@;i9vJm#3g(Y8GnJ?2@m8MEOr3=_Gai)GlY8e{JtR#?c%v zSAi)SpVp7yk&{NYSZ}5@E)-43|4t`A9&dehgiIoJQszf?pJ6u;dKXk6R38dE&gOZxhPSW=cb=;bTPNdCd62&_)Rvb8*lhNy|ds#d`Dq7+n88pyVlS4t)sWd4ln(=g^)aF|0Z z5y1e#8%BHYICE4KdP1;1s(=9cm>AKGjH9K6mX)^7)oRW=cgxl0GuMfzlblFVXVaiA ztqsuDN&$tEZf zi~6gT+?jhrQ?S;dYh-)_7$|>d0YFo+OIR${ohf!iWa$Wc?@(uI{G!hMtY5b{pyy-B zUFsnB@X<%}#nQ(7Y99co0iAx(L&_;4JHqMXDdZ!`<`NES6*gdDvLei~DsYCr@WzQ5 z<#U##TP0zv5xKIuNo8H2rUF*OQxRNqYm70^9(K3F|CxFv|CTF4EcZ)aW3a|DK2e%g z>*qb6PE<{#0~}%{8|BMePv%)t;vr(OSHE8wK|ygq#Rk|_`PMiOkm9{Psl+p-Tg7pdnSQP@F(ponlGdPIkmvz&T<{+8!ceOTgw%{ zfiD~mAm+XrNpKWrb}4sbVG2@5OI)p|JwP90TKyIu!=(8spsSfT>Ur7Zv$LYU4y5e4 zTSOtRnp21v_ha=UFo}iOba$IiN1M+XMA&;vA>a*Km9O9`6tCQ(b_i7qsg)5ahEijS zL?G}k$U(wm>nEWTG3iT_^SBKlTnX{bd)(T)5`r~!S=l9ZO#krjWJ#;K8D^Yjgoa73 zzjE48s8W(OZk>Di&1s7Kr30{d3zB^FRL253d|*J%I*>))Ua{E5NdZu~N75y+WAX`S zlVI+*;mY0d?KqhVZiEY;vD^b*`Rql9&P1U?#7v)NJcT`PJ$sAFdO%%wL+GPuTk!Lt z1E(Ow)LkHj$1a>oqz^gVRQmUPS2g8s!lS}dM$?7ak}@KLhFP1Q1LVr z1Io?-uiKM6a`@sIXaWoVaEL4g)?fX83b|CXY2~?MKXcf5*X^H-+NqYoCpV$Gc^bKd zbCXwj|NLcftF2;WI<1*`pkPMo-maG9KnYEb!x%)p?nT^%%rY#$9yx{UU-}QK^#bd+H}I-hz-QeWu&wot6?&e((u_A`3zqbW%Lm-hJ-M&FZEf*@4m@EZDA(Oe{O^?&gb%D=n7?!-)^j0hBp+TYbAQDt_2QZ z5Z55YKlqP_Q_7zz4AHRZ5|(gz>#%zw(f3xMx{ZoOeA7;t8GS0NSOlnbMbGB?iW&ER zak){k*~{sh)VY;Sp}n&fGtA&A$iYl-S|kn_q9YRZc=O0;f_%AvEjQsutq>gExJ8

>$lsfA5eG@*To2=^@I!9~uU4Cm#@?KOrL=5Qy^#%U~UV7~M2%%q4i|n(fqlOZ2 z$21fzJ9yF^KJvU(+v>TRx)ZY$Q*U7AC(Kz|S)Y|xFv4$#YBU}C7myr8$Jr4W#uV=R6v>Ug$~{AyRA7?$nUF&?`=CQO zeLj(h*o71p`<^nDlO4$|_$4-izd^fkBe5qEv3p!>%w0t;qnu<3-WW8Om>|1PiE#W3 zW)#43m76v1VP&ap!)};;=nERbSdS1!wC~?wfgLCJRT%!~84fr< z@1=g8_f9pkxT=0eE1}BDXDK3}Dn7!oCE|6HTlw^vG>RHHoE$y_KEOb$%fRj*D7XRr zvTkSEF$hTDbTWcGCAVsHe6VCJVk@IT?^IM`=W7h2R9OG1|Zvw?8#7eW7u z_-n)mj|H|;7J|p_g*DEM0m}(&^S&Z*DsU3--hmj{2>V_h^A|*{uzT_TVnC3 z8BOv-YVoB7Ke`G~iRGBNW(QvU{MXj=<_=|Ez|&ba!=@9)3L(K)ARDEP(08Qwn64#^ zxkn_tMOC}Ep=iveA7A_JU>&0cJ1O?W1};^VE`VX|tN()6Y3b)AW1n~kLY>g8R#Q>` z_|3*!n`rW#`j2qaqji$hGPvJf>jM8Ttq6dVX8 zWprz{Ga#~JW#dUUl$9v}F(rOk^rUpBMVA}j%x9oD7@$p8FJl&Y6aAebuN3(NXcx>VP+&z za?z@BDZxvw1Pq?D)h~SL%S`7evWmfNm;ujdX>ebqXRPV}0mg5dBkw{p^4CM_rB+Ot z*u@u_JxDj-VfM&Tqoqg)xfK@))FL0kzTCfijWX);QgC?(ogWlZR3^?GG)p(-l6Ha( zc|ZN`lY%+Pad3~E%qK`~8SZlv@aR(puM;n#r)f|`2X?E4YXId@5!PC8OV9uVl%XIl zFLb`NCUZtt;}7V z=3P$0#)ddK9}y=U=pE0?P5FA&lY1kS-c=PB=>VHd^hNNRk`5BTC`Ay%tx&L7B3ale zHbL3ZXH|+El$YO8EPf#q=rQ_r%Mm+|mZK&SPcs$`fcaZqmO~}IM-4jE~ z4ySm>S#S5i@IKVfZ&N(J3pATO2&xzWbkKks7Ls|nk9g-vUu>q6q4uY89WDaneEEhR zzT^|=vwGRLbb?fu*}*^KZseiq6OGNhc71t|PJ<;5uLkBQJ#)gKpks*|wTMnj(W_e- zwMU&tD`>}35UncP*Dq>phfv`B*0K13;p~3U2e|nlP4V$$f))Dt7meHYdQFh3qYz;> zE@{MX|0RZD=fX33xIh*n=<`d+hP@-?4O%}^D8B%|E%hX_DGy^i^|^_VKYAp#<#(ab zSf7x!dJ$U6b2XRB^`wbIml1PQ0<^*9OBjhD3fiDn2)p(`AAqmp)e zRF!E%`BU7ypiy|}n*Ovb~3 zAHFx$tL-hmH`hlGm^#V(TtfJvX0Iz{5|vQ$;vSr_^Bes*?(9c;I%7v?PpPl&iN#-K z^;74X-HWuP6YzhnEAP=#eGk4N2=DQ_u*pL0=j4bqA}l8~aqApTCGG1`s2lFo&FJ=O z!nue#Hdz>au52j26`WIGs9bG8S;YSX`f!nj*Udw_)n}z0|g%G|qFF7TPG$eI{Fz0EtyoL|SW_VSao=h)3 z^HXE!YPxohj@O<~>d8+2dI{N6OUe{feMv&|#z3Z@zu=;Ye;{h5((C);#awrm!Ykzt z%4u75;-oUPNbPetq{m&{=TAw`cFN(t(zn98%=3yi8a~B@U zN`-xJO5avjq9q8gTv<_QlcJV$SNFu;`fP%Q-ctxq6B2$p>%uU|)9%-k7;l*p-XrvH&UG&47YjnEY#}(_Q z6&vaoQH#PM!ZmoxjpHWS=wIj7_}5;83kR|tJH_%K{Hj(f&P@)UJm4xIV>1)3`E@0- z-nO8`@%3G2*Rz zH6fPf?xJ5Sjj=K9vVJNqrFRCCROasVVl~?LS3UQ z=(Y=k`ewEgTS0Mwty@l0DsSDqp@5L^r*PBXoHWIX7r04zmn9EJ%?S?AY&$^}XKq}X z8i%>OJ&Q$O(Aw4L({BxYIHAr_Q8py+dD7PGUr?M8TB^7C7O;1iyu~(Lny~{zT7{f zK}>n^_fl)w!QbA`rI@np58Z&1RPN*}H?e2mR(#JhlFn9*!1z&37Xpp19?+Q@LA>+# z4mJDi26cBoW-zY&swB8~5f|D!7|VWQ)L{kTsM=M_RlBVR(|)MC>T~;jrs{m=#ffpK zS*cZdz|>TdQ~_O+#d zhZ1XBa+GKKkiH+Dna35=BBDsi(hOA|kqu`0CICh1YFG>qpv8GYAw#Zq884G+@Lh11 zx^A}J~mB0oqY>YO^owAx;gZ|-0 zR`-2ULiap39bK*e^FD@%bW1{7>00A!ZRh|)l^!iW-D?#G(d@>Te76+IOF`57$D{4W z3a?t8b>Gfe%fz{sbFYOOCAj?7Bpv!7-|e;18!?zVxRY}}RMKT@tedLO{q5jRlUdR- zudaO6*Rrg*K8oLuYfyclqg;~8jq5bLt2;hc zsj*{pl9+L5m2z1<%~FC@K&8Y}dBpnTwGZbCvtv>F)bWQ0IYY=1 z9(5L0f8Vj|e0>wX5A^hBqE8anXy^}4KFR%8j$IFeOc#$lQZsIQe?)ZL6o&nnIO^P{ z>0W6$ZS-s(x0i4J)^hw5HrSkJ)&F{z#Ot0NF_0%Ly1z5mED*1;OVisBxse-|b^qJLMu4ravw9@hoF>kA$ zAU|=A#tDF0D4<_@3oBjqN1V$(=>K3A9L~zGQkGb(Uv`jP#i|wh`ja&wDdjfIJI>pU zN-a#Fl_-;D^5R?i#7dYgy>P188jAne=o@(rSB%b}QCOm0@>nVIH*VjML2f>R;sUv>8~bi`P%d1yQ|b zHL5w!2V`Tn?TvDzX_Sg4KDKAT!x97TM!IH=6tWGos<}S-hHcCqxSc9hyvv%_dLc?a zs)%OQDZfPSh98^vUF2t}1(9*Fe0ihpGUJ$g@HJ_~YvC=hJ4Ia2>PAdz_~vd+^tE`< zcc|+R;yTOxcV1=VFR!=+F%uQhjOR(Tv0T1r={k*Qi_wJ8rz`(1FJw+ed-H`;t5;Tt z)+1l)z!y{QwJZ+|rgAAEdX2>W;Y;k>)UrQcx2&Phju}1_3zkAJF8UiMO}W3>#CNE# z?_K2Q zh%zfA@k)9D<;?pfzh8WD5$m;p66NU0xQ|&&jH6e~7IOs$5#HLN`AmUe)S7wL&TA|^ zRvJZmY1@xr1TFgQpqAk28TiaurQZPQ$$RLMlkfro3E54kT4VP7<)7|YKVdSy0#e@B z)0TR9jnasO^-sxetMM%=!@ZWHUN?BlkFD=OXL_|L1)Ab73}Vo`?B{avSB7dSHgzk; zYFs2Ff8%dyAI7?Hc2Cn5pMRZN!5Mi#36SqNd)@MB=!MGtS9-_n^vBR-7YjZR%bR-maV&<_0#^gzj&PHrs;o) zD0$w$wl0|*ol&aHY3lKq{ACn#0=r|#a$k#|(YZLG%S)(CNonPo1947ZAY6|r-}3DDE&nGgPKCl}*74~%` z`z~Z7KhD4*y8XT~u)AkN6u*TLTf%8yFW9g$Z00&@LUUR74Y4Z?aZKThu`qMpFAc9W zqp!W&E53hReY;HGgtjZxoL!uw_61$_U0uY7uG!93etCiIEhmytpL=COWv!9>4&Lp) zX78hrY#r%#E7?4jJp4f^F}-PbSt9-b|I(#Sn|1wJM78vrYDgOx=SQpiHuNy!H`{~# za%uuw>0!FrrTmK;yhM=$1ic zQ)X$7dk}Dvtd0jfOQ4|DhwC_rHU>yne;%Dn>@6c%jU>4^GtwNZE)8_4&m?ez)o$mBIsUaiLbug4Ey;wA7Kx1<0*R_%JDK29#ulK zqj+#=6>cWRFEZ?%cSD0;cSf0RzSn>JnV5)3HP;uh643FHKPVKPry=zYTOs!66JsL4 zzYbaRlBA`v4^)Y1UX>Uoc-Y2FMQe;2U9;&Ft)sxvTuruobmdI#B$hVn3?dBWEvYfy z;lqK(!uPg6>no61YMng|tDb9>#uuDSUoAd4>|KFKco0>@&6o`#8hvlgu9SPP?qt-`3Zr^6oZE=!I?8jaRmBu~hV>suSFA?8%Q5oFGkBY}zT}{_)BzZ&poJm&{g}Qc1k{o?6E>m?ZyAziM~e zr>0yqcAdo}4_|*aJ)~nFUSb(iI+|G&)7EP(a=7_e$ng}0#=z1m%9g(9LpokH|nZjNsb zr_8<-~q^dn@$uz5n6mC&`rkkN8Hv|c-9gvCAsiHCsCa*RY+!EsS3 zo@~A^MsNrJH`lY>Zpm%vqEr}=f>a)Y%U`my!SfR~MBy(=O zwht>FY&C#Og_E5ia>6NaX*kNc1foZCt!V@%Vqu<#-Glkn(#_6?;o<{P>GBotuU$W` zj(;u{^h|6%OFavvIg%a&h`Ua1)_JQwr#d#prs@xGfWNw)=h5z(U?NLQ+9td);msc1 zF{9=hPLpZ=wsUvHUpoFsj8)c*6Pb~$&MPBsPwfy@^@e4W>CfY)x%Zt&wiUt|b;o5YZ@lSD`uWc2@ zvR_|_2jpGwT6JJtmpxp>4oan+dTDUfuIYyYa8`fyV$ zjuxB+w}@P9ksVjELuu(r>rAVf@-V^h9Op6~*D_07{p&(!N6}-oyszX8soNDEQfvN9 zpTE1L@aJ*95p)lTWFd-9Dzt5(b#3Be2>L0;ybDtr9nzPk)zP5Csrc|GqJH20o0$48 zMN&-ZwoB{)U8%JwP2{(4BN!d%Yv1{Hys(9H?cNF(VI>vs(UIYF+m(Tj5*3pj({_b~ z7()GMK_OxT&|JS)n|Wrrel(fG6tBLb$J4&=C;@+xzEXqrp9lryQWAY090o;5W_o|J zoZlg-nOZ$rz47z;qOLBm!M|;IbzAq&rj+#k6IC8Iz5XJRn}OIX28Q}_y@{_NQbnD9 z37MeDW}}u=zGofZuP9r64r}P$4n8iJaURwmSTbRofH<^t@#SF~_Ac0_QE`Vip2^}K zS&STw#54v`alZ==s*B;v2i1k})`RL&`2B$+5{T}qs&LJHt}WhY@!g5|fstazVVS2< zDn#qD&yh?|7c-C%h~frC0L z61nenAsBp@DWiQC*gz{uM6-;z!dlyavyoz&&qovE#<=F{JF}^ImTfs-bMMmLPvF2Y zdC2#KV+gp;_i88Zu<3(FMyGj*5m`4CYb5q5Oa0z@AYPw2MXCQm0c+{GhB=hJ@G&WP zAfrK#Xe77V-s^@LpY0?Bq|iyyp=qlWwEZ70j#87|fl*arB&JrbgqX!k77< zjWGLrY#+yQemDuQR?zYn46Djt`Yaa`p}xEyMkrysv;3JL{Gc}OmhE2lYaeX*V=o>4 zyz-&G>T3&Q9ZZwbS)2L<85C-f+9k&`u@nlKWR^t5T=LyEXN|%wazgn-$&W+7>;yU# zytx#6l?Wznc06@_o7a{GU&zcIKKjweD}hn#_dfolndYKi~q4o)KPE#i(V|EglJ zq^9@eS9&xovP*YD$!GvZ3LtUoSSG(BQm7%@4?!pEMvYPEzdI5-0d4}zrK#khtyLcSH>GNfdDbO7>3 zb|)X_7<`VZ{SSAK+piI&#;bvA2H4;UY{=LY?0%bEXM8&koaY7HPL!s@w08Vl^Ak$oPBhwCCoq*09AAcx5mo`YYm(CsIw{7U4! z^2;ap?D1zd?a7pbow>V+>Bvj{)e094n)$LN6Zy^(stVEU)Y_b;Z9k5NS=(3w;_`vH zo!c%Aq7V5j%WX@6q;wy)oeGf5Ep(y~X(koeFT3rWnU-SwCa7oPamUkM2;OyBClo$C zf2O+lO#4H2+liT8`oSUa@f$n=&H4v25~5OCqXY#oS#bi0zP|^1G5aUU>@U!$MuelU zQ1*r;<{r%Mmkk{I-7GU{&wudJ@_%Aon#`dZmvT`Gb-&YiTS%JK=!PIo^Uz=c!i@L9U`sDxx77o z(jK?*|NPgYm5?5UnHWPQW~#9)i+hmod#Wvgi*tle4{{b|Bu!qz)JC4JK-L$h=n*oD z#qW*fC>?9NX`J6>&0KOF`D`$jKsG6isMn8g(3}la&yy(jM^G|k1Nd)}#){i(Kf$L3 zvSxYmG>uccV#p_(B&E!^VZlJmw?z+ZtY3+=h`STlBEL6dcvW-zsfwSWC3oB2whmvt z0LEqguWwmg?*hPb|8D~N-!AKa>X2IhpB?>w#O<2PkN?g;)$i>-xO;Oa-d>2sF1O3D z+O1(m_-urub`oC?T7B!m%fDDGnO|;cFll0()t7nk(DHklj;89@{NARNeEYp=LL^YH z<4J6mt^cywq)c7cE;P6l6C)c_huz$Tvy1PjS$Zq&R#wl_8)}RBj(0KbS>|+aVyHu( zXf@%{V10TM=#L`MixQTn2gvbc`s9`5y&CC@uP1)>2KjMWpJD;t>zmxDb6y1DI5$;q z8WUccjJ;&#oCG|N1q+zBD8fX}ZaU=~&0pRX=1}T+u?o^-GRDOY5fW}Q?+;hjBwIhDsokcH3hT)Fz~D<588K0~Vx+j53* zX=`c6mg}&iUj6!*x)st@Y4_H`wp?OrL;5&^wa}`5^~LO1Hu;%=xUZSz{wlBks~yl& z_5UNL=gsZ^n@)ZH_YAK8FLe1UI0(*pNVPKmD8!>yr4Lj~KLSO9&vsETca>lkO3lT& z$0)@i6ghtj4elS7_EuG9+|GNiBEr5g8V{kH*)n&o_Sj!6Uon)?YE(Mdse2YGwkvaQ zt1OE>sNi8Uhd_nh>Le|rY&lVrvZ90PajeCXo8Pj#)>iH~X_k1WOVl}4t!6d< zb>QrFRgV{jeAYJ>lx`jf?1q-5*n4iCF!`vi+1(H^0dgBQ>MFYYcFjDCucPuu)oHx( z28L3c8nkr^#M05Oj|%P@(@C|l(YU`ajcAC0QZdS4!fqoD0Bbz_OcmO~80qLTgE#+e zLy0MUja*|JjeAn6OQ_}rNUz>J{7jFVB70k%M&m}L%1?&Uv*AnyJVI;rpf|zDv2Otl zo*A>z-dKl5&E2Gdc82&eAsHPMON}5F4w^Om&mP{!~$d6L%$0Y&+(6R@gq z;ez*P;_MEUk~zHzRwau(tFkJ-dL+l=b~_r5xrBcwU-U-pB-Atf{zA$T{4-)xzTZ$c z8i&J)Y@~M^pAO&gE-X11&i3{VHr|^ZfEhMXceNBqQE8Eu=1MTvnx85yH>WejS)3d| zQMo2ghj_8@;Mu7)P+=x1Bj;+3o$L>v7^%A}9iDq!ns z)VhUgZS6X#AmvWLoj{b*w^tXY^p#e+idkO&!#1xq`1flkivLXst>ZtxjP+m5fBbuD z{C7;(DX;$$jQ?J*|GtFv-^o6%<-$x8*J1H?&>gce8V_Nvdw`3+rrN4$HtyWL{o&m! zALDgE@fJ*+si{pv*8Z|>TxtKgT|lQ#@fI9)z~tJEyD(EVzWU10KX#hk>A?t$$K8AP zAH2VN=jN4L>im)}{4h&x#yRdjsK@|`$@3exu3i6RK8H$9%ea2;!Oi;>#i;Zo*Y#W1 z=CeRz^8DKM_aA&XpF<@>hkB6_cl-J4xhIFv{kL&3Vvy}!rG&$UW#ip9N^dlxUZasr z{a?>Wau`!mEy9pSsWzZVn&B~?X4!h4dk`<*0|ySfThHSL9JX=Tw?W@P`x_UG8#otW z{oa=n?@iKs0{b$VI1Iov0bP2a4rFy2#Yz;tp&C+3*Cd7qCbakUVxMv?*4KZPpQ%RO z91ceY9t|@j167EQL&;*_sL!Awy@8NVp?px4eQDhI;NA{Q$Drx$vC14@mZ)=WUA(xZ zzUgbJ)!w7x+n2ezf#<4SZ@d9d;_UjS_W+5e#xRO-X&w~%>;RXdVv9m&(lg5)b*@{zGU@~Ov4)ru)1d)1vGJHa zgOYOg*mM}ba)8q%1CO?|^pN{>s5lD$fGmg^&|Vu7y3#n;PSe=JTAC_R5vsWrKWiGV z?;u6upItDSN(3?RdT;17UWJf#haMvX$RE^Z}XFQs|j)Ok`a>|De#ektk4$BGsDY^T0gGtHXy3OUNB zGuDq^N(<9X!ERo>X!Lf>w~gLAThA{fFMj&oqeDn~^G)N@rSyu>w7p2quuj&@kgim^{HWOSW zuTs3FaBPMvu=qTdkN71(0AMCqE?_?QJH~CioBK&`0(|Zd_cY)2G@+Bp?v`$l8p|e( z?}Dr<=E?ZS#RNiAVZW4Q(;Bk5^`p()i*5a))O#-KYc&dzM6T5zq=NCz9LhJUlt~Oq zX`3$?SMhc|V>VK~#leiHJ+ZqOvmu(t(j2V^vx5+CsEQPbO!9b&OXPjv1w5YaGhLIa zKz?tQz!w1GTL5eEg@m01L=&jolSe@165{9~f5EsbVbl)dnvrWA<>`aBVrBh`Uu-mD z!l(T!HMZ2J90}A*m1IC-R&{c|XYIXd()D9@^1FE08G$!tVL`(h#`DBtC}>%w#fq)a z>P(Ad@s+sZoq4Jm#-Wb9QWle#%<)z64KzpUuo$?P0QzhJ!;kQ zzfR>7d-lL&0JPY=BaND!RUGeqaQ9|>)9L)f+$E{M$^y{)4fU@87%DG_c_pXXssE zv?rH}>MU2H@>WqrZt2Kov9gatqAl`U%5ujUvCW0_xNG=RO%E5|$Q%1kX*V5xMel(~ z6K-AquC76syp2Wcc~cU!EzWUa`>>f#7TS;FnQB+a$KAoK-%riUtR66RjjfBT6!Vp` z!dsKqyPy8~?xV|FufN{HG{4uMp_Qwe-&0nQssRn$X3nzJm4n2l7Zo3TF_i}+ z9dQb2i0PeA@YB4M7;OCkm`8ZEy}FpVdl|kZMRb!qSUb=S>q^b3G}9J5QOy`6)?P~1 zwBy}vRs1&mo4mIjTio$`@jr>S&Jhfkji-{0(KR||r)tC4(3AM>A3cO-Cw_B9hNtT` zq?t=Z7m$?}Zor(~??ux_CUHo6^?rVBCUpiZFD0Pq)Li^BuG=hpS1m&r@qMb2jay<8iV<)b5+9Mw4#4zMP*WWJ{)0cZ>}aj5;9lZS(*o+`n3 zd3SkPu?ztt_13|fS(%N^oh5xQ4O>1DEXNfn)C6PG)N zi06^HC-ItFF>k&@+1`Fe1>K^eLho*23!0_Ukr;Y&Dy9Lb(%0jWlIqN;KO1~uH1*_a z+t3jhL9rosmG4vbZuOh#`pI;trf9`7RHnFy=gGwFLNl5A>*5sq+v&_bf#Ua?*(Cii zR#wf)wicu9hw;CA`shI_pd{;dvL%>x;nQq71>BHX6I4yfEHBZMnkd@EP0hvht42B_ zi%Y12AG^-3^#tfq@t;l4EsuYjc=h-{JLf+en7#{{b{58KEuOb*D(9gd-;L!7 z&0S^aedqe!dpB<10uwJOvY8owN$gxPG_^qH6Dm3wz? z-oAES*`;sCJ~FNOd2Hq@zVw9R*7IU_)Y@I_;0cxHJv+0Pur<|f)aRvIxN19Y|x<3om$$90!nWHbN==9tbOt<;C7eYzxDT8VGN7t`hONx9<0^e>E+TOeO z(Uspcws^$2mQMH@t4z< pfC?Jaw=~qB`cr@EPyMMs^{4*SpZZgO>d*Q4{C^8)S114o3;^b_>Gl8s diff --git a/pre_commit/staged_files_only.py b/pre_commit/staged_files_only.py index 83d8a03..172fb20 100644 --- a/pre_commit/staged_files_only.py +++ b/pre_commit/staged_files_only.py @@ -52,7 +52,7 @@ def _unstaged_changes_cleared(patch_dir: str) -> Generator[None, None, None]: retcode, diff_stdout_binary, _ = cmd_output_b( 'git', 'diff-index', '--ignore-submodules', '--binary', '--exit-code', '--no-color', '--no-ext-diff', tree, '--', - retcode=None, + check=False, ) if retcode and diff_stdout_binary.strip(): patch_filename = f'patch{int(time.time())}-{os.getpid()}' diff --git a/pre_commit/util.py b/pre_commit/util.py index 8c296f4..b850768 100644 --- a/pre_commit/util.py +++ b/pre_commit/util.py @@ -83,14 +83,12 @@ class CalledProcessError(RuntimeError): self, returncode: int, cmd: tuple[str, ...], - expected_returncode: int, stdout: bytes, stderr: bytes | None, ) -> None: - super().__init__(returncode, cmd, expected_returncode, stdout, stderr) + super().__init__(returncode, cmd, stdout, stderr) self.returncode = returncode self.cmd = cmd - self.expected_returncode = expected_returncode self.stdout = stdout self.stderr = stderr @@ -104,7 +102,6 @@ class CalledProcessError(RuntimeError): return b''.join(( f'command: {self.cmd!r}\n'.encode(), f'return code: {self.returncode}\n'.encode(), - f'expected return code: {self.expected_returncode}\n'.encode(), b'stdout:', _indent_or_none(self.stdout), b'\n', b'stderr:', _indent_or_none(self.stderr), )) @@ -124,7 +121,7 @@ def _oserror_to_output(e: OSError) -> tuple[int, bytes, None]: def cmd_output_b( *cmd: str, - retcode: int | None = 0, + check: bool = True, **kwargs: Any, ) -> tuple[int, bytes, bytes | None]: _setdefault_kwargs(kwargs) @@ -142,8 +139,8 @@ def cmd_output_b( stdout_b, stderr_b = proc.communicate() returncode = proc.returncode - if retcode is not None and retcode != returncode: - raise CalledProcessError(returncode, cmd, retcode, stdout_b, stderr_b) + if check and returncode: + raise CalledProcessError(returncode, cmd, stdout_b, stderr_b) return returncode, stdout_b, stderr_b @@ -196,10 +193,10 @@ if os.name != 'nt': # pragma: win32 no cover def cmd_output_p( *cmd: str, - retcode: int | None = 0, + check: bool = True, **kwargs: Any, ) -> tuple[int, bytes, bytes | None]: - assert retcode is None + assert check is False assert kwargs['stderr'] == subprocess.STDOUT, kwargs['stderr'] _setdefault_kwargs(kwargs) diff --git a/pre_commit/xargs.py b/pre_commit/xargs.py index f2b3421..e3af90e 100644 --- a/pre_commit/xargs.py +++ b/pre_commit/xargs.py @@ -154,7 +154,7 @@ def xargs( run_cmd: tuple[str, ...], ) -> tuple[int, bytes, bytes | None]: return cmd_fn( - *run_cmd, retcode=None, stderr=subprocess.STDOUT, **kwargs, + *run_cmd, check=False, stderr=subprocess.STDOUT, **kwargs, ) threads = min(len(partitions), target_concurrency) diff --git a/setup.cfg b/setup.cfg index ae214f6..a898892 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 2.20.0 +version = 2.21.0 description = A framework for managing and maintaining multi-language pre-commit hooks. long_description = file: README.md long_description_content_type = text/markdown @@ -13,10 +13,6 @@ classifiers = License :: OSI Approved :: MIT License Programming Language :: Python :: 3 Programming Language :: Python :: 3 :: Only - Programming Language :: Python :: 3.7 - Programming Language :: Python :: 3.8 - Programming Language :: Python :: 3.9 - Programming Language :: Python :: 3.10 Programming Language :: Python :: Implementation :: CPython Programming Language :: Python :: Implementation :: PyPy @@ -27,8 +23,7 @@ install_requires = identify>=1.0.0 nodeenv>=0.11.1 pyyaml>=5.1 - toml - virtualenv>=20.0.8 + virtualenv>=20.10.0 importlib-metadata;python_version<"3.8" python_requires = >=3.7 @@ -61,7 +56,6 @@ check_untyped_defs = true disallow_any_generics = true disallow_incomplete_defs = true disallow_untyped_defs = true -no_implicit_optional = true warn_redundant_casts = true warn_unused_ignores = true diff --git a/testing/get-swift.sh b/testing/get-swift.sh index b77e18c..3e78082 100755 --- a/testing/get-swift.sh +++ b/testing/get-swift.sh @@ -3,9 +3,9 @@ set -euo pipefail . /etc/lsb-release -if [ "$DISTRIB_CODENAME" = "focal" ]; then - SWIFT_URL='https://download.swift.org/swift-5.6.1-release/ubuntu2004/swift-5.6.1-RELEASE/swift-5.6.1-RELEASE-ubuntu20.04.tar.gz' - SWIFT_HASH='2b4f22d4a8b59fe8e050f0b7f020f8d8f12553cbda56709b2340a4a3bb90cfea' +if [ "$DISTRIB_CODENAME" = "jammy" ]; then + SWIFT_URL='https://download.swift.org/swift-5.7.1-release/ubuntu2204/swift-5.7.1-RELEASE/swift-5.7.1-RELEASE-ubuntu22.04.tar.gz' + SWIFT_HASH='7f60291f5088d3e77b0c2364beaabd29616ee7b37260b7b06bdbeb891a7fe161' else echo "unknown dist: ${DISTRIB_CODENAME}" 1>&2 exit 1 diff --git a/testing/make-archives b/testing/make-archives index 04b42dd..704101f 100755 --- a/testing/make-archives +++ b/testing/make-archives @@ -17,7 +17,7 @@ from typing import Sequence REPOS = ( ('rbenv', 'https://github.com/rbenv/rbenv', '38e1fbb'), - ('ruby-build', 'https://github.com/rbenv/ruby-build', '2004fd7'), + ('ruby-build', 'https://github.com/rbenv/ruby-build', '98c0337'), ( 'ruby-download', 'https://github.com/garnieretienne/rvm-download', diff --git a/testing/resources/dotnet_hooks_combo_repo/proj1/proj1.csproj b/testing/resources/dotnet_hooks_combo_repo/proj1/proj1.csproj index 4f714d3..861ced6 100644 --- a/testing/resources/dotnet_hooks_combo_repo/proj1/proj1.csproj +++ b/testing/resources/dotnet_hooks_combo_repo/proj1/proj1.csproj @@ -2,7 +2,7 @@ Exe - net5.0 + net6 true proj1 diff --git a/testing/resources/dotnet_hooks_combo_repo/proj2/proj2.csproj b/testing/resources/dotnet_hooks_combo_repo/proj2/proj2.csproj index da451f7..dfce2ca 100644 --- a/testing/resources/dotnet_hooks_combo_repo/proj2/proj2.csproj +++ b/testing/resources/dotnet_hooks_combo_repo/proj2/proj2.csproj @@ -2,7 +2,7 @@ Exe - net5.0 + net6 true proj2 diff --git a/testing/resources/dotnet_hooks_csproj_prefix_repo/.gitignore b/testing/resources/dotnet_hooks_csproj_prefix_repo/.gitignore new file mode 100644 index 0000000..edcd28f --- /dev/null +++ b/testing/resources/dotnet_hooks_csproj_prefix_repo/.gitignore @@ -0,0 +1,3 @@ +bin/ +obj/ +nupkg/ diff --git a/testing/resources/dotnet_hooks_csproj_prefix_repo/.pre-commit-hooks.yaml b/testing/resources/dotnet_hooks_csproj_prefix_repo/.pre-commit-hooks.yaml new file mode 100644 index 0000000..6626627 --- /dev/null +++ b/testing/resources/dotnet_hooks_csproj_prefix_repo/.pre-commit-hooks.yaml @@ -0,0 +1,5 @@ +- id: dotnet-example-hook + name: dotnet example hook + entry: testeroni.tool + language: dotnet + files: '' diff --git a/testing/resources/dotnet_hooks_csproj_prefix_repo/Program.cs b/testing/resources/dotnet_hooks_csproj_prefix_repo/Program.cs new file mode 100644 index 0000000..1456e8e --- /dev/null +++ b/testing/resources/dotnet_hooks_csproj_prefix_repo/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace dotnet_hooks_repo +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine("Hello from dotnet!"); + } + } +} diff --git a/testing/resources/dotnet_hooks_combo_repo/proj1/proj1.csproj b/testing/resources/dotnet_hooks_csproj_prefix_repo/dotnet_hooks_csproj_prefix_repo.csproj similarity index 66% copy from testing/resources/dotnet_hooks_combo_repo/proj1/proj1.csproj copy to testing/resources/dotnet_hooks_csproj_prefix_repo/dotnet_hooks_csproj_prefix_repo.csproj index 4f714d3..754b760 100644 --- a/testing/resources/dotnet_hooks_combo_repo/proj1/proj1.csproj +++ b/testing/resources/dotnet_hooks_csproj_prefix_repo/dotnet_hooks_csproj_prefix_repo.csproj @@ -1,12 +1,9 @@ - Exe - net5.0 - + net7.0 true - proj1 + testeroni.tool ./nupkg - diff --git a/testing/resources/dotnet_hooks_csproj_repo/dotnet_hooks_csproj_repo.csproj b/testing/resources/dotnet_hooks_csproj_repo/dotnet_hooks_csproj_repo.csproj index d2e556a..fa9879b 100644 --- a/testing/resources/dotnet_hooks_csproj_repo/dotnet_hooks_csproj_repo.csproj +++ b/testing/resources/dotnet_hooks_csproj_repo/dotnet_hooks_csproj_repo.csproj @@ -1,7 +1,7 @@ Exe - netcoreapp3.1 + net6 true testeroni ./nupkg diff --git a/testing/resources/dotnet_hooks_sln_repo/dotnet_hooks_sln_repo.csproj b/testing/resources/dotnet_hooks_sln_repo/dotnet_hooks_sln_repo.csproj index e372964..a4e2d00 100644 --- a/testing/resources/dotnet_hooks_sln_repo/dotnet_hooks_sln_repo.csproj +++ b/testing/resources/dotnet_hooks_sln_repo/dotnet_hooks_sln_repo.csproj @@ -1,7 +1,7 @@ Exe - netcoreapp3.1 + net6 true testeroni ./nupkg diff --git a/testing/resources/python3_hooks_repo/.pre-commit-hooks.yaml b/testing/resources/python3_hooks_repo/.pre-commit-hooks.yaml index 964cf83..2c23700 100644 --- a/testing/resources/python3_hooks_repo/.pre-commit-hooks.yaml +++ b/testing/resources/python3_hooks_repo/.pre-commit-hooks.yaml @@ -2,4 +2,5 @@ name: Python 3 Hook entry: python3-hook language: python + language_version: python3 files: \.py$ diff --git a/testing/resources/ruby_versioned_hooks_repo/.pre-commit-hooks.yaml b/testing/resources/ruby_versioned_hooks_repo/.pre-commit-hooks.yaml index 63e1dd4..364d47d 100644 --- a/testing/resources/ruby_versioned_hooks_repo/.pre-commit-hooks.yaml +++ b/testing/resources/ruby_versioned_hooks_repo/.pre-commit-hooks.yaml @@ -2,5 +2,5 @@ name: Ruby Hook entry: ruby_hook language: ruby - language_version: 2.5.1 + language_version: 3.1.0 files: \.rb$ diff --git a/tests/clientlib_test.py b/tests/clientlib_test.py index fb36bb5..b4c3c4e 100644 --- a/tests/clientlib_test.py +++ b/tests/clientlib_test.py @@ -15,6 +15,8 @@ from pre_commit.clientlib import DEFAULT_LANGUAGE_VERSION from pre_commit.clientlib import MANIFEST_SCHEMA from pre_commit.clientlib import META_HOOK_DICT from pre_commit.clientlib import MigrateShaToRev +from pre_commit.clientlib import OptionalSensibleRegexAtHook +from pre_commit.clientlib import OptionalSensibleRegexAtTop from pre_commit.clientlib import validate_config_main from pre_commit.clientlib import validate_manifest_main from testing.fixtures import sample_local_config @@ -261,6 +263,27 @@ def test_warn_mutable_rev_conditional(): cfgv.validate(config_obj, CONFIG_REPO_DICT) +@pytest.mark.parametrize( + 'validator_cls', + ( + OptionalSensibleRegexAtHook, + OptionalSensibleRegexAtTop, + ), +) +def test_sensible_regex_validators_dont_pass_none(validator_cls): + key = 'files' + with pytest.raises(cfgv.ValidationError) as excinfo: + validator = validator_cls(key, cfgv.check_string) + validator.check({key: None}) + + assert str(excinfo.value) == ( + '\n' + f'==> At key: {key}' + '\n' + '=====> Expected string got NoneType' + ) + + @pytest.mark.parametrize( ('regex', 'warning'), ( @@ -296,6 +319,22 @@ def test_validate_optional_sensible_regex_at_hook(caplog, regex, warning): assert caplog.record_tuples == [('pre_commit', logging.WARNING, warning)] +def test_validate_optional_sensible_regex_at_local_hook(caplog): + config_obj = sample_local_config() + config_obj['hooks'][0]['files'] = 'dir/*.py' + + cfgv.validate(config_obj, CONFIG_REPO_DICT) + + assert caplog.record_tuples == [ + ( + 'pre_commit', + logging.WARNING, + "The 'files' field in hook 'do_not_commit' is a regex, not a glob " + "-- matching '/*' probably isn't what you want here", + ), + ] + + @pytest.mark.parametrize( ('regex', 'warning'), ( diff --git a/tests/commands/init_templatedir_test.py b/tests/commands/init_templatedir_test.py index 64bfc8b..28f29b7 100644 --- a/tests/commands/init_templatedir_test.py +++ b/tests/commands/init_templatedir_test.py @@ -135,7 +135,7 @@ def test_init_templatedir_skip_on_missing_config( retcode, output = git_commit( fn=cmd_output_mocked_pre_commit_home, tempdir_factory=tempdir_factory, - retcode=None, + check=False, ) assert retcode == commit_retcode diff --git a/tests/commands/install_uninstall_test.py b/tests/commands/install_uninstall_test.py index ae668ac..379c03a 100644 --- a/tests/commands/install_uninstall_test.py +++ b/tests/commands/install_uninstall_test.py @@ -126,7 +126,7 @@ def _get_commit_output(tempdir_factory, touch_file='foo', **kwargs): cmd_output('git', 'add', touch_file) return git_commit( fn=cmd_output_mocked_pre_commit_home, - retcode=None, + check=False, tempdir_factory=tempdir_factory, **kwargs, ) @@ -286,7 +286,7 @@ def test_environment_not_sourced(tempdir_factory, store): 'GIT_AUTHOR_EMAIL': os.environ['GIT_AUTHOR_EMAIL'], 'GIT_COMMITTER_EMAIL': os.environ['GIT_COMMITTER_EMAIL'], }, - retcode=None, + check=False, ) assert ret == 1 assert out == ( @@ -551,7 +551,7 @@ def _get_push_output(tempdir_factory, remote='origin', opts=()): return cmd_output_mocked_pre_commit_home( 'git', 'push', remote, 'HEAD:new_branch', *opts, tempdir_factory=tempdir_factory, - retcode=None, + check=False, )[:2] diff --git a/tests/commands/run_test.py b/tests/commands/run_test.py index 2634c0c..03d741e 100644 --- a/tests/commands/run_test.py +++ b/tests/commands/run_test.py @@ -536,6 +536,13 @@ def test_merge_conflict(cap_out, store, in_merge_conflict): assert b'Unmerged files. Resolve before committing.' in printed +def test_files_during_merge_conflict(cap_out, store, in_merge_conflict): + opts = run_opts(files=['placeholder']) + ret, printed = _do_run(cap_out, store, in_merge_conflict, opts) + assert ret == 0 + assert b'Bash hook' in printed + + def test_merge_conflict_modified(cap_out, store, in_merge_conflict): # Touch another file so we have unstaged non-conflicting things assert os.path.exists('placeholder') @@ -635,6 +642,32 @@ def test_skip_bypasses_installation(cap_out, store, repo_with_passing_hook): assert ret == 0 +def test_skip_alias_bypasses_installation( + cap_out, store, repo_with_passing_hook, +): + config = { + 'repo': 'local', + 'hooks': [ + { + 'id': 'skipme', + 'name': 'skipme-1', + 'alias': 'skipme-1', + 'entry': 'skipme', + 'language': 'python', + 'additional_dependencies': ['/pre-commit-does-not-exist'], + }, + ], + } + add_config_to_repo(repo_with_passing_hook, config) + + ret, printed = _do_run( + cap_out, store, repo_with_passing_hook, + run_opts(all_files=True), + {'SKIP': 'skipme-1'}, + ) + assert ret == 0 + + def test_hook_id_not_in_non_verbose_output( cap_out, store, repo_with_passing_hook, ): @@ -685,7 +718,7 @@ def test_non_ascii_hook_id(repo_with_passing_hook, tempdir_factory): with cwd(repo_with_passing_hook): _, stdout, _ = cmd_output_mocked_pre_commit_home( sys.executable, '-m', 'pre_commit.main', 'run', '☃', - retcode=None, tempdir_factory=tempdir_factory, + check=False, tempdir_factory=tempdir_factory, ) assert 'UnicodeDecodeError' not in stdout # Doesn't actually happen, but a reasonable assertion @@ -704,7 +737,7 @@ def test_stdout_write_bug_py26(repo_with_failing_hook, store, tempdir_factory): _, out = git_commit( fn=cmd_output_mocked_pre_commit_home, tempdir_factory=tempdir_factory, - retcode=None, + check=False, ) assert 'UnicodeEncodeError' not in out # Doesn't actually happen, but a reasonable assertion diff --git a/tests/conftest.py b/tests/conftest.py index 40c0c05..3076171 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -68,7 +68,7 @@ def _make_conflict(): bar_only_file.write('bar') cmd_output('git', 'add', 'bar_only_file') git_commit(msg=_make_conflict.__name__) - cmd_output('git', 'merge', 'foo', retcode=None) + cmd_output('git', 'merge', 'foo', check=False) @pytest.fixture diff --git a/tests/error_handler_test.py b/tests/error_handler_test.py index 47e2afa..a79d9c1 100644 --- a/tests/error_handler_test.py +++ b/tests/error_handler_test.py @@ -162,7 +162,7 @@ def test_error_handler_non_ascii_exception(mock_store_dir): def test_error_handler_non_utf8_exception(mock_store_dir): with pytest.raises(SystemExit): with error_handler.error_handler(): - raise CalledProcessError(1, ('exe',), 0, b'error: \xa0\xe1', b'') + raise CalledProcessError(1, ('exe',), b'error: \xa0\xe1', b'') def test_error_handler_non_stringable_exception(mock_store_dir): @@ -183,10 +183,11 @@ def test_error_handler_no_tty(tempdir_factory): 'from pre_commit.error_handler import error_handler\n' 'with error_handler():\n' ' raise ValueError("\\u2603")\n', - retcode=3, + check=False, tempdir_factory=tempdir_factory, pre_commit_home=pre_commit_home, ) + assert ret == 3 log_file = os.path.join(pre_commit_home, 'pre-commit.log') out_lines = out.splitlines() assert out_lines[-2] == 'An unexpected error has occurred: ValueError: ☃' diff --git a/tests/git_test.py b/tests/git_test.py index b9f524a..93f5a1c 100644 --- a/tests/git_test.py +++ b/tests/git_test.py @@ -104,7 +104,7 @@ def test_is_in_merge_conflict_submodule(in_conflicting_submodule): def test_cherry_pick_conflict(in_merge_conflict): cmd_output('git', 'merge', '--abort') foo_ref = cmd_output('git', 'rev-parse', 'foo')[1].strip() - cmd_output('git', 'cherry-pick', foo_ref, retcode=None) + cmd_output('git', 'cherry-pick', foo_ref, check=False) assert git.is_in_merge_conflict() is False diff --git a/tests/languages/docker_test.py b/tests/languages/docker_test.py index 5838761..5f7c85e 100644 --- a/tests/languages/docker_test.py +++ b/tests/languages/docker_test.py @@ -178,6 +178,6 @@ def test_get_docker_path_in_docker_windows(in_docker): def test_get_docker_path_in_docker_docker_in_docker(in_docker): # won't be able to discover "self" container in true docker-in-docker - err = CalledProcessError(1, (), 0, b'', b'') + err = CalledProcessError(1, (), b'', b'') with mock.patch.object(docker, 'cmd_output_b', side_effect=err): assert docker._get_docker_path('/project') == '/project' diff --git a/tests/languages/r_test.py b/tests/languages/r_test.py index 5bc63b2..c52d5ac 100644 --- a/tests/languages/r_test.py +++ b/tests/languages/r_test.py @@ -6,6 +6,7 @@ import pytest from pre_commit import envcontext from pre_commit.languages import r +from pre_commit.util import win_exe from testing.fixtures import make_config_from_repo from testing.fixtures import make_repo from tests.repository_test import _get_hook_no_install @@ -133,7 +134,7 @@ def test_r_parsing_file_local(tempdir_factory, store): def test_rscript_exec_relative_to_r_home(): - expected = os.path.join('r_home_dir', 'bin', 'Rscript') + expected = os.path.join('r_home_dir', 'bin', win_exe('Rscript')) with envcontext.envcontext((('R_HOME', 'r_home_dir'),)): assert r._rscript_exec() == expected diff --git a/tests/languages/ruby_test.py b/tests/languages/ruby_test.py index dc55456..29f3c80 100644 --- a/tests/languages/ruby_test.py +++ b/tests/languages/ruby_test.py @@ -71,10 +71,10 @@ def test_install_ruby_default(fake_gem_prefix): @xfailif_windows # pragma: win32 no cover def test_install_ruby_with_version(fake_gem_prefix): - ruby.install_environment(fake_gem_prefix, '2.7.2', ()) + ruby.install_environment(fake_gem_prefix, '3.1.0', ()) # Should be able to activate and use rbenv install - with ruby.in_env(fake_gem_prefix, '2.7.2'): + with ruby.in_env(fake_gem_prefix, '3.1.0'): cmd_output('rbenv', 'install', '--help') diff --git a/tests/languages/rust_test.py b/tests/languages/rust_test.py new file mode 100644 index 0000000..f011e71 --- /dev/null +++ b/tests/languages/rust_test.py @@ -0,0 +1,90 @@ +from __future__ import annotations + +from unittest import mock + +import pytest + +import pre_commit.constants as C +from pre_commit import parse_shebang +from pre_commit.languages import rust +from pre_commit.prefix import Prefix +from pre_commit.util import cmd_output + +ACTUAL_GET_DEFAULT_VERSION = rust.get_default_version.__wrapped__ + + +@pytest.fixture +def cmd_output_b_mck(): + with mock.patch.object(rust, 'cmd_output_b') as mck: + yield mck + + +def test_sets_system_when_rust_is_available(cmd_output_b_mck): + cmd_output_b_mck.return_value = (0, b'', b'') + assert ACTUAL_GET_DEFAULT_VERSION() == 'system' + + +def test_uses_default_when_rust_is_not_available(cmd_output_b_mck): + cmd_output_b_mck.return_value = (127, b'', b'error: not found') + assert ACTUAL_GET_DEFAULT_VERSION() == C.DEFAULT + + +@pytest.mark.parametrize('language_version', (C.DEFAULT, '1.56.0')) +def test_installs_with_bootstrapped_rustup(tmpdir, language_version): + tmpdir.join('src', 'main.rs').ensure().write( + 'fn main() {\n' + ' println!("Hello, world!");\n' + '}\n', + ) + tmpdir.join('Cargo.toml').ensure().write( + '[package]\n' + 'name = "hello_world"\n' + 'version = "0.1.0"\n' + 'edition = "2021"\n', + ) + prefix = Prefix(str(tmpdir)) + + find_executable_exes = [] + + original_find_executable = parse_shebang.find_executable + + def mocked_find_executable(exe: str) -> str | None: + """ + Return `None` the first time `find_executable` is called to ensure + that the bootstrapping code is executed, then just let the function + work as normal. + + Also log the arguments to ensure that everything works as expected. + """ + find_executable_exes.append(exe) + if len(find_executable_exes) == 1: + return None + return original_find_executable(exe) + + with mock.patch.object(parse_shebang, 'find_executable') as find_exe_mck: + find_exe_mck.side_effect = mocked_find_executable + rust.install_environment(prefix, language_version, ()) + assert find_executable_exes == ['rustup', 'rustup', 'cargo'] + + with rust.in_env(prefix, language_version): + assert cmd_output('hello_world')[1] == 'Hello, world!\n' + + +def test_installs_with_existing_rustup(tmpdir): + tmpdir.join('src', 'main.rs').ensure().write( + 'fn main() {\n' + ' println!("Hello, world!");\n' + '}\n', + ) + tmpdir.join('Cargo.toml').ensure().write( + '[package]\n' + 'name = "hello_world"\n' + 'version = "0.1.0"\n' + 'edition = "2021"\n', + ) + prefix = Prefix(str(tmpdir)) + + assert parse_shebang.find_executable('rustup') is not None + rust.install_environment(prefix, '1.56.0', ()) + with rust.in_env(prefix, '1.56.0'): + assert cmd_output('hello_world')[1] == 'Hello, world!\n' diff --git a/tests/main_test.py b/tests/main_test.py index a7afd6d..5115926 100644 --- a/tests/main_test.py +++ b/tests/main_test.py @@ -17,6 +17,8 @@ from testing.util import cwd def _args(**kwargs): kwargs.setdefault('command', 'help') kwargs.setdefault('config', C.CONFIG_FILE) + if kwargs['command'] in {'run', 'try-repo'}: + kwargs.setdefault('commit_msg_filename', None) return argparse.Namespace(**kwargs) @@ -35,13 +37,24 @@ def test_adjust_args_and_chdir_noop(in_git_dir): def test_adjust_args_and_chdir_relative_things(in_git_dir): in_git_dir.join('foo/cfg.yaml').ensure() - in_git_dir.join('foo').chdir() + with in_git_dir.join('foo').as_cwd(): + args = _args(command='run', files=['f1', 'f2'], config='cfg.yaml') + main._adjust_args_and_chdir(args) + assert os.getcwd() == in_git_dir + assert args.config == os.path.join('foo', 'cfg.yaml') + assert args.files == [ + os.path.join('foo', 'f1'), + os.path.join('foo', 'f2'), + ] - args = _args(command='run', files=['f1', 'f2'], config='cfg.yaml') - main._adjust_args_and_chdir(args) - assert os.getcwd() == in_git_dir - assert args.config == os.path.join('foo', 'cfg.yaml') - assert args.files == [os.path.join('foo', 'f1'), os.path.join('foo', 'f2')] + +def test_adjust_args_and_chdir_relative_commit_msg(in_git_dir): + in_git_dir.join('foo/cfg.yaml').ensure() + with in_git_dir.join('foo').as_cwd(): + args = _args(command='run', files=[], commit_msg_filename='t.txt') + main._adjust_args_and_chdir(args) + assert os.getcwd() == in_git_dir + assert args.commit_msg_filename == os.path.join('foo', 't.txt') @pytest.mark.skipif(os.name != 'nt', reason='windows feature') @@ -56,24 +69,22 @@ def test_install_on_subst(in_git_dir, store): # pragma: posix no cover def test_adjust_args_and_chdir_non_relative_config(in_git_dir): - in_git_dir.join('foo').ensure_dir().chdir() - - args = _args() - main._adjust_args_and_chdir(args) - assert os.getcwd() == in_git_dir - assert args.config == C.CONFIG_FILE + with in_git_dir.join('foo').ensure_dir().as_cwd(): + args = _args() + main._adjust_args_and_chdir(args) + assert os.getcwd() == in_git_dir + assert args.config == C.CONFIG_FILE def test_adjust_args_try_repo_repo_relative(in_git_dir): - in_git_dir.join('foo').ensure_dir().chdir() - - args = _args(command='try-repo', repo='../foo', files=[]) - assert args.repo is not None - assert os.path.exists(args.repo) - main._adjust_args_and_chdir(args) - assert os.getcwd() == in_git_dir - assert os.path.exists(args.repo) - assert args.repo == 'foo' + with in_git_dir.join('foo').ensure_dir().as_cwd(): + args = _args(command='try-repo', repo='../foo', files=[]) + assert args.repo is not None + assert os.path.exists(args.repo) + main._adjust_args_and_chdir(args) + assert os.getcwd() == in_git_dir + assert os.path.exists(args.repo) + assert args.repo == 'foo' FNS = ( diff --git a/tests/repository_test.py b/tests/repository_test.py index 11d452c..c3936bf 100644 --- a/tests/repository_test.py +++ b/tests/repository_test.py @@ -173,30 +173,20 @@ def test_python_venv(tempdir_factory, store): ) -@xfailif_windows # pragma: win32 no cover # no python 2 in GHA -def test_switch_language_versions_doesnt_clobber(tempdir_factory, store): - # We're using the python3 repo because it prints the python version - path = make_repo(tempdir_factory, 'python3_hooks_repo') - - def run_on_version(version, expected_output): - config = make_config_from_repo(path) - config['hooks'][0]['language_version'] = version - hook = _get_hook(config, store, 'python3-hook') - ret, out = _hook_run(hook, [], color=False) - assert ret == 0 - assert _norm_out(out) == expected_output - - run_on_version('python2', b'2\n[]\nHello World\n') - run_on_version('python3', b'3\n[]\nHello World\n') - - -def test_versioned_python_hook(tempdir_factory, store): - _test_hook_repo( - tempdir_factory, store, 'python3_hooks_repo', - 'python3-hook', - [os.devnull], - f'3\n[{os.devnull!r}]\nHello World\n'.encode(), - ) +def test_language_versioned_python_hook(tempdir_factory, store): + # we patch this force virtualenv executing with `-p` since we can't + # reliably have multiple pythons available in CI + with mock.patch.object( + python, + '_sys_executable_matches', + return_value=False, + ): + _test_hook_repo( + tempdir_factory, store, 'python3_hooks_repo', + 'python3-hook', + [os.devnull], + f'3\n[{os.devnull!r}]\nHello World\n'.encode(), + ) @skipif_cant_run_coursier # pragma: win32 no cover @@ -345,7 +335,7 @@ def test_run_versioned_ruby_hook(tempdir_factory, store): tempdir_factory, store, 'ruby_versioned_hooks_repo', 'ruby_hook', [os.devnull], - b'2.5.1\nHello world from a ruby hook\n', + b'3.1.0\nHello world from a ruby hook\n', ) @@ -367,7 +357,7 @@ def test_run_ruby_hook_with_disable_shared_gems( tempdir_factory, store, 'ruby_versioned_hooks_repo', 'ruby_hook', [os.devnull], - b'2.5.1\nHello world from a ruby hook\n', + b'3.1.0\nHello world from a ruby hook\n', ) @@ -471,7 +461,7 @@ def test_additional_rust_cli_dependencies_installed( hook = _get_hook(config, store, 'rust-hook') binaries = os.listdir( hook.prefix.path( - helpers.environment_dir(rust.ENVIRONMENT_DIR, C.DEFAULT), 'bin', + helpers.environment_dir(rust.ENVIRONMENT_DIR, 'system'), 'bin', ), ) # normalize for windows @@ -485,12 +475,12 @@ def test_additional_rust_lib_dependencies_installed( path = make_repo(tempdir_factory, 'rust_hooks_repo') config = make_config_from_repo(path) # A small rust package with no dependencies. - deps = ['shellharden:3.1.0'] + deps = ['shellharden:3.1.0', 'git-version'] config['hooks'][0]['additional_dependencies'] = deps hook = _get_hook(config, store, 'rust-hook') binaries = os.listdir( hook.prefix.path( - helpers.environment_dir(rust.ENVIRONMENT_DIR, C.DEFAULT), 'bin', + helpers.environment_dir(rust.ENVIRONMENT_DIR, 'system'), 'bin', ), ) # normalize for windows @@ -883,7 +873,7 @@ def test_tags_on_repositories(in_tmpdir, tempdir_factory, store): @pytest.fixture def local_python_config(): # Make a "local" hooks repo that just installs our other hooks repo - repo_path = get_resource_path('python3_hooks_repo') + repo_path = get_resource_path('python_hooks_repo') manifest = load_manifest(os.path.join(repo_path, C.MANIFEST_FILE)) hooks = [ dict(hook, additional_dependencies=[repo_path]) for hook in manifest @@ -892,23 +882,12 @@ def local_python_config(): def test_local_python_repo(store, local_python_config): - hook = _get_hook(local_python_config, store, 'python3-hook') + hook = _get_hook(local_python_config, store, 'foo') # language_version should have been adjusted to the interpreter version assert hook.language_version != C.DEFAULT ret, out = _hook_run(hook, ('filename',), color=False) assert ret == 0 - assert _norm_out(out) == b"3\n['filename']\nHello World\n" - - -@xfailif_windows # pragma: win32 no cover # no python2 in GHA -def test_local_python_repo_python2(store, local_python_config): - local_python_config['hooks'][0]['language_version'] = 'python2' - hook = _get_hook(local_python_config, store, 'python3-hook') - # language_version should have been adjusted to the interpreter version - assert hook.language_version != C.DEFAULT - ret, out = _hook_run(hook, ('filename',), color=False) - assert ret == 0 - assert _norm_out(out) == b"2\n['filename']\nHello World\n" + assert _norm_out(out) == b"['filename']\nHello World\n" def test_default_language_version(store, local_python_config): @@ -1052,6 +1031,7 @@ def test_local_perl_additional_dependencies(store): 'dotnet_hooks_csproj_repo', 'dotnet_hooks_sln_repo', 'dotnet_hooks_combo_repo', + 'dotnet_hooks_csproj_prefix_repo', ), ) def test_dotnet_hook(tempdir_factory, store, repo): diff --git a/tests/store_test.py b/tests/store_test.py index ff671a8..8187766 100644 --- a/tests/store_test.py +++ b/tests/store_test.py @@ -127,7 +127,7 @@ def test_clone_shallow_failure_fallback_to_complete( # Force shallow clone failure def fake_shallow_clone(self, *args, **kwargs): - raise CalledProcessError(1, (), 0, b'', None) + raise CalledProcessError(1, (), b'', None) store._shallow_clone = fake_shallow_clone ret = store.clone(path, rev) diff --git a/tests/util_test.py b/tests/util_test.py index 6b00f9f..b3f18b4 100644 --- a/tests/util_test.py +++ b/tests/util_test.py @@ -18,11 +18,10 @@ from pre_commit.util import tmpdir def test_CalledProcessError_str(): - error = CalledProcessError(1, ('exe',), 0, b'output', b'errors') + error = CalledProcessError(1, ('exe',), b'output', b'errors') assert str(error) == ( "command: ('exe',)\n" 'return code: 1\n' - 'expected return code: 0\n' 'stdout:\n' ' output\n' 'stderr:\n' @@ -31,11 +30,10 @@ def test_CalledProcessError_str(): def test_CalledProcessError_str_nooutput(): - error = CalledProcessError(1, ('exe',), 0, b'', b'') + error = CalledProcessError(1, ('exe',), b'', b'') assert str(error) == ( "command: ('exe',)\n" 'return code: 1\n' - 'expected return code: 0\n' 'stdout: (none)\n' 'stderr: (none)' ) @@ -83,14 +81,14 @@ def test_tmpdir(): def test_cmd_output_exe_not_found(): - ret, out, _ = cmd_output('dne', retcode=None) + ret, out, _ = cmd_output('dne', check=False) assert ret == 1 assert out == 'Executable `dne` not found' @pytest.mark.parametrize('fn', (cmd_output_b, cmd_output_p)) def test_cmd_output_exe_not_found_bytes(fn): - ret, out, _ = fn('dne', retcode=None, stderr=subprocess.STDOUT) + ret, out, _ = fn('dne', check=False, stderr=subprocess.STDOUT) assert ret == 1 assert out == b'Executable `dne` not found' @@ -101,7 +99,7 @@ def test_cmd_output_no_shebang(tmpdir, fn): make_executable(f) # previously this raised `OSError` -- the output is platform specific - ret, out, _ = fn(str(f), retcode=None, stderr=subprocess.STDOUT) + ret, out, _ = fn(str(f), check=False, stderr=subprocess.STDOUT) assert ret == 1 assert isinstance(out, bytes) assert out.endswith(b'\n') diff --git a/tox.ini b/tox.ini index 7f43e41..e06be11 100644 --- a/tox.ini +++ b/tox.ini @@ -3,7 +3,7 @@ envlist = py37,py38,pypy3,pre-commit [testenv] deps = -rrequirements-dev.txt -passenv = APPDATA HOME LOCALAPPDATA PROGRAMFILES RUSTUP_HOME +passenv = * commands = coverage erase coverage run -m pytest {posargs:tests} @@ -23,5 +23,6 @@ env = GIT_COMMITTER_NAME=test GIT_AUTHOR_EMAIL=test@example.com GIT_COMMITTER_EMAIL=test@example.com + GIT_ALLOW_PROTOCOL=file VIRTUALENV_NO_DOWNLOAD=1 PRE_COMMIT_NO_CONCURRENCY=1